source: GTP/trunk/App/Demos/Illum/pathmap/TriangleMesh.h @ 2197

Revision 2197, 3.0 KB checked in by szirmay, 18 years ago (diff)
Line 
1#pragma once
2#include "Intersectable.hpp"
3#include "KDTree.hpp"
4#include <iostream>
5
6class Radion;
7
8#include "FlexVertex.h"
9
10/*#ifndef D3DVERTEX__DEFINED
11struct D3DVERTEXPRM{
12        D3DXVECTOR3 pos;
13        D3DXVECTOR3 normal;
14        D3DXVECTOR2 tex0;
15        D3DXVECTOR2 tex1;
16        D3DXVECTOR3 tangent;
17        D3DXVECTOR3 binormal;
18};
19#define D3DVERTEX__DEFINED
20#endif*/
21
22/*!
23\brief ray-tracable representaion of a mesh
24TriangleMesh encapsulates a kd-tree containing triangles. It can be constructed using the vertex and index
25buffers of a mesh. Ray-intersection and random surface sampling are supported.
26*/
27class TriangleMesh :
28        public Intersectable
29{
30//      const Material*         material;
31        KDTree* meshTree;
32
33        Vector* meshVertices;
34        Vector* normals;
35        Vector* texCoords;
36        unsigned int nMeshVertices;
37
38        /*!
39        \brief A triangle with ray-intersection.
40        */
41        class Patch : public Intersectable{
42                public:
43                static Vector*  meshVertices;   //!< a temporary reference to the owner TriangleMesh's vertex array
44                static Vector*  meshNormals;    //!< a temporary reference to the owner TriangleMesh's normal array
45                static Vector*  meshTexCoords;  //!< a temporary reference to the owner TriangleMesh's texcoord array
46                Vector                  flatNormal;                                     //!< triangle normal
47                float                   hyperPlaneShiftOffset;          //!< triangle plane offset
48                Vector                  inverseVertexMatrix[3];         //!< Descartes to barycentric matrix
49                unsigned short vertexIndices[3];                        //!< triangle vertex indices
50                bool intersect(const Ray& ray, float& depth, float rayMin, float rayMax);
51                bool intersectBackSide(const Ray& ray, float& depth, float rayMin, float rayMax);
52                void sampleSurface(Radion& radion); //power = brdf
53        } *meshPatches; //!< mesh triangles array
54
55        unsigned int nMeshPatches;                      //!< number of mesh triangles
56        unsigned int nAreaTreeNodes;            //!< number of nodes in area tree (for selection ~ area)
57        double getPatchArea(unsigned int index);
58
59        double surfaceArea;                                     //!< total surface
60        double* areaTree;                                       //!< area tree nodes array
61        void buildAreaTree();                           //!< build area tree from root
62        double buildAreaTree(unsigned int u);   //!< build area tree from given node (recursively)
63public:
64        float getSurfaceArea();                                 //!< return total surface area
65        void sampleSurface(Radion& radion);             //!< return random surface radion
66private:
67        void sampleSurface(unsigned int u, double rnd, Radion& radion); //!< return random surface radion from area subtree under node u (recursive)
68public:
69        TriangleMesh(std::istream& isc, Material** materialTable, int nMaterials);
70        void getTransformedBoundingBox(const Transformation& tf, BoundingBox& bb);
71        bool intersectBackSide(const Ray& ray, float& depth, float rayMin, float rayMax);
72        bool intersect(const Ray& ray, float& depth, float rayMin, float rayMax);
73        ~TriangleMesh(void);
74
75        //! constructor to build a TriangleMesh from mesh buffers. Vertex format has to be per struct D3DVERTEX.
76        TriangleMesh(Material* material, unsigned short* indexBuffer, unsigned int nFaces,
77                                                   FlexVertexArray& vertexBuffer, unsigned int nVertices);
78
79};
Note: See TracBrowser for help on using the repository browser.