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