[8] | 1 | #ifndef NO_PRAGMA_ONCE |
---|
| 2 | #pragma once |
---|
| 3 | #endif |
---|
| 4 | |
---|
| 5 | #ifndef GEOMETRY_H |
---|
| 6 | #define GEOMETRY_H |
---|
| 7 | |
---|
| 8 | extern "C" |
---|
| 9 | { |
---|
| 10 | #include "MathStuff.h" |
---|
| 11 | } |
---|
| 12 | |
---|
| 13 | /** Represents a drawable geometry. It can draw simple objects (teapot, |
---|
| 14 | torus, shere. It also contains the object transformation and |
---|
| 15 | the material .An AAB is used as bouning volume. |
---|
| 16 | */ |
---|
| 17 | class Geometry |
---|
| 18 | { |
---|
| 19 | public: |
---|
| 20 | Geometry(); |
---|
| 21 | Geometry(Vector3 translation, float xRot, float yRot, float zRot, float scale, int objectType); |
---|
| 22 | //! renders this geometry |
---|
| 23 | void Render(); |
---|
| 24 | |
---|
| 25 | //! sets rotations in degree : executed in the order x, y, and z rotation |
---|
| 26 | void SetRotations(float xRot, float yRot, float zRot); |
---|
| 27 | //! sets the rotation matrix |
---|
| 28 | void SetTranslation(Vector3 translation); |
---|
| 29 | //! a uniform scale |
---|
| 30 | void SetScale(float scale); |
---|
| 31 | //! returns current scale |
---|
| 32 | float GetScale(); |
---|
| 33 | |
---|
| 34 | //! returns translation |
---|
| 35 | void GetTranslation(Vector3 translation); |
---|
| 36 | //! returns rotation |
---|
| 37 | void GetRotations(float &xRot, float &yRot, float &zRot); |
---|
| 38 | |
---|
| 39 | // --- material settings |
---|
| 40 | void SetAmbientColor(float ambientR, float ambientG, float ambientB); |
---|
| 41 | void SetDiffuseColor(float diffuseR, float diffuseG, float diffuseB); |
---|
| 42 | void SetSpecularColor(float specularR, float specularG, float specularB); |
---|
| 43 | |
---|
| 44 | const AABox& GetBoundingVolume(); |
---|
| 45 | |
---|
| 46 | //! last visited flag, important for rendering each geometry only once |
---|
| 47 | void SetLastVisited(int lastVisited); |
---|
| 48 | //! returns lastvisited flag |
---|
| 49 | int GetLastVisited(); |
---|
| 50 | |
---|
| 51 | // --- sets the object type to one of teapot, torus, sphere |
---|
| 52 | void SetObjectType(int type); |
---|
| 53 | |
---|
| 54 | enum{TEAPOT, TORUS, SPHERE, NUM_OBJECTS}; |
---|
| 55 | |
---|
| 56 | static int sDisplayList[NUM_OBJECTS]; |
---|
| 57 | |
---|
| 58 | //! cleans static members |
---|
| 59 | static void CleanUp(); |
---|
| 60 | //! returns the triangle count of the specified object type |
---|
| 61 | static int CountTriangles(int objectType); |
---|
| 62 | //! initialises display lists |
---|
| 63 | static void ResetLists(); |
---|
| 64 | |
---|
| 65 | protected: |
---|
| 66 | //! generates the display list this a object |
---|
| 67 | void GenerateList(); |
---|
| 68 | |
---|
| 69 | //! calculates accumulated transformation matrix |
---|
| 70 | void CalcTransform(); |
---|
| 71 | //! applies tranformations |
---|
| 72 | void Transform(); |
---|
| 73 | |
---|
| 74 | // --- statistics |
---|
| 75 | static int CountTorusTriangles(); |
---|
| 76 | static int CountSphereTriangles(); |
---|
| 77 | static int CountTeapotTriangles(); |
---|
| 78 | |
---|
| 79 | //! |
---|
| 80 | static void CreateTorus(float innerRadius, float outerRadius, int precision); |
---|
| 81 | |
---|
| 82 | //! calculates the bounding volume of this geometry |
---|
| 83 | void CalcBoundingVolume(); |
---|
| 84 | // the size of the bounging box is calculated using the radius of the sphere |
---|
| 85 | void CalcSphereBoundingVolume(); |
---|
| 86 | // the standard bounding volume calculation having an array of vertices |
---|
| 87 | void CalcBoundingVolume(float *vertices, const int num_vertices); |
---|
| 88 | |
---|
| 89 | // initialises static members |
---|
| 90 | static bool Init(); |
---|
| 91 | |
---|
| 92 | // --- drawing routines |
---|
| 93 | static void RenderTeapot(); |
---|
| 94 | static void RenderSphere(); |
---|
| 95 | static void RenderTorus(); |
---|
| 96 | |
---|
| 97 | // --- transformations |
---|
| 98 | float mXRotation; |
---|
| 99 | float mYRotation; |
---|
| 100 | float mZRotation; |
---|
| 101 | |
---|
| 102 | float mScale; |
---|
| 103 | |
---|
| 104 | Vector3 mTranslation; |
---|
| 105 | |
---|
| 106 | //! accumulated transform matrix |
---|
| 107 | Matrix4x4 mTransform; |
---|
| 108 | |
---|
| 109 | // --- material |
---|
| 110 | float mAmbientColor[3]; |
---|
| 111 | float mDiffuseColor[3]; |
---|
| 112 | float mSpecularColor[3]; |
---|
| 113 | |
---|
| 114 | AABox mBoundingBox; |
---|
| 115 | //! type of the rendered object (teapot, sphere ...) |
---|
| 116 | int mObjectType; |
---|
| 117 | |
---|
| 118 | int mLastVisited; |
---|
| 119 | |
---|
| 120 | // --- static members |
---|
| 121 | |
---|
| 122 | static bool sIsInitialised; |
---|
| 123 | |
---|
| 124 | static float const sphere_radius; |
---|
| 125 |
|
---|
| 126 | static int num_torus_indices;
|
---|
| 127 | static int num_torus_vertices;
|
---|
| 128 | static int num_torus_normals;
|
---|
| 129 | |
---|
| 130 | static float *torus_vertices; |
---|
| 131 | static float *torus_normals; |
---|
| 132 | static int *torus_indices; |
---|
| 133 | |
---|
| 134 | static const int torus_precision; |
---|
| 135 | static const int sphere_precision; |
---|
| 136 | static const float torus_inner_radius; |
---|
| 137 | static const float torus_outer_radius; |
---|
| 138 | }; |
---|
| 139 | |
---|
| 140 | |
---|
| 141 | #endif // GEOMETRY_H |
---|