00001 #ifndef PHX_GRAPHICS_ENGINE_H
00002 #define PHX_GRAPHICS_ENGINE_H
00003
00004 #include <Phx/PhxConfig.h>
00005 #include <Phx/PhxTypes.h>
00006 #include <Phx/Core/PhxCore.h>
00007 #include <Phx/Core/PhxNamedInterface.h>
00008 #include <Phx/Util/PhxMatrix.h>
00009 #include <Phx/Util/PhxQuaternion.h>
00010 #include <Phx/Util/PhxColor.h>
00011 #include <Phx/Graphics/PhxWindowInformation.h>
00012
00018 namespace Phx {
00019
00020
00054 class GraphicsEngine : public NamedInterface {
00055 public:
00056 static const NamedInterface::Type INTERFACE_TYPE;
00057 static const String INTERFACE_TYPE_NAME;
00058
00059 static const NamedInterface::Identifier GRAPHICS_ENGINE_IDENTIFIER;
00060 static const String GRAPHICS_ENGINE_NAME;
00061
00062 class Node;
00063
00064
00065 class Light;
00066 class PointLight;
00067 class DirectionalLight;
00068 class SpotLight;
00069 class Geometry;
00070 class BillboardGroup;
00071 class Billboard;
00072 class Camera;
00073 class SkyBox;
00074 class TerrainGeometry;
00075
00076
00077 class GraphicsEngineDescription;
00078 class GeometryDescription;
00079 class BillboardGroupDescription;
00080 class BillboardDescription;
00081 class MeshDescription;
00082 class MaterialDescription;
00083 class LightDescription;
00084 class PointLightDescription;
00085 class DirectionalLightDescription;
00086 class SpotLightDescription;
00087 class TerrainGeometryDescription;
00088
00101 virtual Ptr<Node> newNode(const String& name = "") = 0;
00102
00107 virtual Ptr<Node> skyBoxNode() = 0;
00108
00124 virtual Ptr<WindowInformation> windowInformation(void) const = 0;
00125
00126
00127
00128
00129 virtual String currentCamera(void) const = 0;
00130 virtual void currentCamera(const String& cameraName) = 0;
00131
00132
00133
00137 virtual void setAmbrientLight(RgbaColor color) = 0;
00138
00139
00143 virtual void setFog(void) = 0;
00144
00148 virtual void setFog(RgbaColor color, double start, double end) = 0;
00149
00153 virtual void setFog(RgbaColor color, double density) = 0;
00154 };
00155
00168 class GraphicsEngine::Node : public LockedPtrInterface<Node> {
00169 public:
00170
00187 virtual Ptr<Node> newNode(const String& name = "") = 0;
00188
00189
00190
00191 virtual Ptr<PointLight> newPointLight(const String& name = "") = 0;
00192 virtual Ptr<DirectionalLight> newDirectionalLight(const String& name = "") = 0;
00193 virtual Ptr<SpotLight> newSpotLight(const String& name = "") = 0;
00194
00195 virtual Ptr<PointLight> newPointLight(const Ptr<const PointLightDescription>& description,
00196 const String& name = "") = 0;
00197 virtual Ptr<DirectionalLight> newDirectionalLight(const Ptr<const DirectionalLightDescription>& description,
00198 const String& name = "") = 0;
00199 virtual Ptr<SpotLight> newSpotLight(const Ptr<const SpotLightDescription>& description,
00200 const String& name = "") = 0;
00201
00202 virtual Ptr<SkyBox> newSkyBox(const Ptr<const GeometryDescription>& description,
00203 const String& name = "") = 0;
00204
00205 virtual Ptr<BillboardGroup> newBillboardGroup(const Ptr<const BillboardGroupDescription>& description,
00206 const String& name = "") = 0;
00222 virtual Ptr<Geometry> newGeometry(const String& name = "") = 0;
00223
00240 virtual Ptr<Geometry> newGeometry(const Ptr<const GeometryDescription>& description,
00241 const String& name = "") = 0;
00242
00262 virtual Ptr<Camera> newCamera(const String& cameraName) = 0;
00263
00272 virtual Ptr<TerrainGeometry> newTerrainGeometry(const Ptr<const TerrainGeometryDescription>& description,
00273 const String& terrainName) = 0;
00274
00281 virtual void position(const Vector3& position) = 0;
00282
00289 virtual void orientation(const Quaternion& orientation) = 0;
00290
00295 const Vector3& position(void) const { return mPosition; }
00296
00301 const Quaternion& orientation(void) const { return mOrientation; }
00302
00307 const String& name(void) const { return mName; }
00308
00309 protected:
00310 void setName(const String& name) { mName = name; }
00311 void setPosition(const Vector3& position) { mPosition = position; }
00312 void setOrientation(const Quaternion& orientation) { mOrientation = orientation; }
00313
00314 private:
00315 String mName;
00316 Vector3 mPosition;
00317 Quaternion mOrientation;
00318 };
00319
00320
00325 class GraphicsEngine::Geometry : public LockedPtrInterface<Geometry> {
00326 public:
00327
00335 virtual void mesh(const Ptr<const MeshDescription>& mesh) = 0;
00336
00341 virtual Ptr<const MeshDescription> mesh(void) const = 0;
00342
00371 virtual void material(uint32_t index,
00372 const Ptr<const MaterialDescription>& material) = 0;
00373
00384 virtual Ptr<const MaterialDescription> material(uint32_t index) const = 0;
00385
00390 const String& name(void) const { return mName; }
00391
00392 protected:
00393 void setName(const String& name) { mName = name; }
00394 private:
00395 String mName;
00396 };
00397
00401 class GraphicsEngine::Camera : public LockedPtrInterface<Camera> {
00402 public:
00403 virtual double aspectRatio(void) const = 0;
00404
00405 virtual void horizontalFieldOfView(double fovRadians) = 0;
00406 virtual double horizontalFieldOfView(void) const = 0;
00407
00408
00409
00410
00411
00412
00413
00414 const String& name(void) const { return mName; }
00415
00416 protected:
00417 void setName(const String& name) { mName = name; }
00418 private:
00419 String mName;
00420 };
00421
00422
00428 class GraphicsEngine::Light : public LockedPtrInterface<Camera> {
00429 public:
00439 virtual void specular(const RgbaColor& specular) = 0;
00440
00445 virtual RgbaColor specular(void) const = 0;
00446
00456 virtual void diffuse(const RgbaColor& diffuse) = 0;
00457
00463 virtual RgbaColor diffuse(void) const = 0;
00464
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475 const String& name(void) const { return mName; }
00476
00477 protected:
00478 void setName(const String& name) { mName = name; }
00479 private:
00480 String mName;
00481 };
00482
00486 class GraphicsEngine::PointLight : public GraphicsEngine::Light {
00487 public:
00488 };
00489
00493 class GraphicsEngine::DirectionalLight : public GraphicsEngine::Light {
00494 public:
00495 virtual void direction(const Vector3& direction) = 0;
00496 virtual Vector3 direction(void) const = 0;
00497 };
00498
00502 class GraphicsEngine::SpotLight : public GraphicsEngine::Light {
00503 public:
00504 virtual void direction(const Vector3& direction) = 0;
00505 virtual Vector3 direction(void) const = 0;
00506
00507 virtual void innerAngle(double innerAngle) = 0;
00508 virtual double innerAngle(void) const = 0;
00509
00510 virtual void outerAngle(double outerAngle) = 0;
00511 virtual double outerAngle(void) const = 0;
00512 };
00513
00517 class GraphicsEngine::SkyBox : public LockedPtrInterface<Geometry>{
00518 public:
00526 virtual void mesh(const Ptr<const MeshDescription>& mesh) = 0;
00527
00532 virtual Ptr<const MeshDescription> mesh(void) const = 0;
00533
00562 virtual void material(uint32_t index,
00563 const Ptr<const MaterialDescription>& material) = 0;
00564
00575 virtual Ptr<const MaterialDescription> material(uint32_t index) const = 0;
00576
00581 const String& name(void) const { return mName; }
00582
00588 virtual void setCustomParameter(int subEntity, int index, Vector4 parameters) = 0;
00589
00590 protected:
00591 void setName(const String& name) { mName = name; }
00592 private:
00593 String mName;
00594 };
00595
00599 class GraphicsEngine::BillboardGroup : public LockedPtrInterface<BillboardGroup>{
00600 public:
00623 virtual void material(const Ptr<const MaterialDescription>& material) = 0;
00624
00631 virtual Ptr<const MaterialDescription> material() const = 0;
00632
00633 virtual void billboard(int index, const Ptr<const BillboardDescription>& billboard) = 0;
00634 virtual Ptr<const BillboardDescription> billboard(int index) const = 0;
00635
00640 const String& name(void) const { return mName; }
00641
00646 virtual void setCustomParameter(int index, Vector4 parameters) = 0;
00647
00648 protected:
00649 void setName(const String& name) { mName = name; }
00650 private:
00651 String mName;
00652 };
00653
00654 class GraphicsEngine::Billboard : public LockedPtrInterface<BillboardGroup>{
00655 public:
00656 virtual void offset(Vector3 offset) = 0;
00657 virtual void offset(double x, double y, double z) = 0;
00658 virtual Vector3 offset(void) = 0;
00659
00660 virtual void dimentions(Vector2 dim) = 0;
00661 virtual void dimentions(double width, double height) = 0;
00662 virtual Vector2 dimentions(void) = 0;
00663 };
00664
00665
00666
00671 class GraphicsEngine::GraphicsEngineDescription : public Description {
00672 public:
00673 static const Description::Type DESCRIPTION_TYPE;
00674 static const String DESCRIPTION_TYPE_NAME;
00675
00683 virtual void dataPath(const String& path) = 0;
00684
00688 virtual String dataPath(void) const = 0;
00689 };
00690
00691
00700 class GraphicsEngine::LightDescription : public Description {
00701 public:
00711 virtual void specular(const RgbaColor& specular) = 0;
00712
00717 const RgbaColor& specular(void) const { return mSpecular; }
00718
00728 virtual void diffuse(const RgbaColor& diffuse) = 0;
00729
00735 const RgbaColor& diffuse(void) const { return mDiffuse; }
00736
00737 private:
00738 RgbaColor mSpecular;
00739 RgbaColor mDiffuse;
00740
00741 protected:
00742 void setDiffuse(const RgbaColor& c) { mDiffuse = c; }
00743 void setSpecular(const RgbaColor& c) { mSpecular = c; }
00744 };
00745
00746
00750 class GraphicsEngine::PointLightDescription :
00751 public GraphicsEngine::LightDescription {
00752 public:
00753 static const Description::Type DESCRIPTION_TYPE;
00754 static const String DESCRIPTION_TYPE_NAME;
00755 };
00756
00760 class GraphicsEngine::DirectionalLightDescription :
00761 public GraphicsEngine::LightDescription {
00762 public:
00763 static const Description::Type DESCRIPTION_TYPE;
00764 static const String DESCRIPTION_TYPE_NAME;
00765
00766 virtual void direction(const Vector3& direction) = 0;
00767 virtual Vector3 direction(void) const = 0;
00768 };
00769
00773 class GraphicsEngine::SpotLightDescription :
00774 public GraphicsEngine::LightDescription {
00775 public:
00776 static const Description::Type DESCRIPTION_TYPE;
00777 static const String DESCRIPTION_TYPE_NAME;
00778
00779 virtual void direction(const Vector3& direction) = 0;
00780 virtual Vector3 direction(void) const = 0;
00781
00782 virtual void innerAngle(double innerAngle) = 0;
00783 virtual double innerAngle(void) const = 0;
00784
00785 virtual void outerAngle(double outerAngle) = 0;
00786 virtual double outerAngle(void) const = 0;
00787 };
00788
00797 class GraphicsEngine::GeometryDescription : public Description {
00798 public:
00799 static const Description::Type DESCRIPTION_TYPE;
00800 static const String DESCRIPTION_TYPE_NAME;
00801
00804 typedef std::set<uint32_t> IndexSetType;
00805
00809 virtual void mesh(const Ptr<const MeshDescription>& mesh) = 0;
00810
00814 virtual Ptr<const MeshDescription> mesh(void) const = 0;
00815
00820 virtual IndexSetType materialIndices(void) const = 0;
00821
00826 virtual void material(uint32_t index, const Ptr<const MaterialDescription>& material) = 0;
00827
00832 virtual Ptr<const MaterialDescription> material(uint32_t index) const = 0;
00833 };
00834
00843 class GraphicsEngine::BillboardGroupDescription : public Description {
00844 public:
00845 static const Description::Type DESCRIPTION_TYPE;
00846 static const String DESCRIPTION_TYPE_NAME;
00847
00850 typedef std::set<uint32_t> IndexSetType;
00851
00856 virtual void material(const Ptr<const MaterialDescription>& material) = 0;
00857
00861 virtual Ptr<const MaterialDescription> material() const = 0;
00862
00863 virtual IndexSetType billboardIndices(void) const = 0;
00864
00865 virtual void billboard(uint32_t index, const Ptr<const BillboardDescription>& billbard) = 0;
00866 virtual Ptr<const BillboardDescription> billboard(uint32_t index) const = 0;
00867 };
00868
00869 class GraphicsEngine::BillboardDescription : public Description {
00870 public:
00871 static const Description::Type DESCRIPTION_TYPE;
00872 static const String DESCRIPTION_TYPE_NAME;
00873
00874 virtual void position(Real x, Real y, Real z) = 0;
00875 virtual void position(const Vector3& pos) = 0;
00876 const Vector3& position(void) const { return m_Pos; }
00877
00878 protected:
00879 void setPosition(Real x, Real y, Real z) { setPosition(Vector3(x,y,z)); }
00880 void setPosition(const Vector3& pos) { m_Pos = pos; }
00881
00882 private:
00883 Vector3 m_Pos;
00884 };
00885
00895 class GraphicsEngine::MeshDescription : public Description {
00896 public:
00897 static const Description::Type DESCRIPTION_TYPE;
00898 static const String DESCRIPTION_TYPE_NAME;
00899
00915 virtual void resourceName(const String& resourceName) = 0;
00916 const String& resourceName(void) const { return mResourceName; }
00917
00918 protected:
00919 void setResourceName(const String& name) { mResourceName = name; }
00920 private:
00921 String mResourceName;
00922 };
00923
00924
00928 class GraphicsEngine::MaterialDescription : public Description {
00929 public:
00930 static const Description::Type DESCRIPTION_TYPE;
00931 static const String DESCRIPTION_TYPE_NAME;
00932
00933 virtual void resourceName(const String& resourceName) = 0;
00934 const String& resourceName(void) const { return mResourceName; }
00935 protected:
00936 void setResourceName(const String& name) { mResourceName = name; }
00937 private:
00938 String mResourceName;
00939 };
00940
00941
00942
00943 };
00944
00945
00946 #endif