1 /* Copyright Jukka Jyl�nki
2
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7        http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License. */
14
15 /** @file TriangleMesh.h
16         @author Jukka Jyl�nki
17         @brief The TriangleMesh geometry object. */
18 #pragma once
19
20 #include "../MathGeoLibFwd.h"
21 #include "../Math/float3.h"
22 #include "Triangle.h"
23
24 MATH_BEGIN_NAMESPACE
25
26 /// Represents an unindiced triangle mesh.
27 /** This class stores a triangle mesh as flat array, optimized for ray intersections. */
28 class TriangleMesh
29 {
30 public:
31         TriangleMesh();
32         ~TriangleMesh();
33
34         TriangleMesh(const TriangleMesh &rhs);
35         TriangleMesh &operator =(const TriangleMesh &rhs);
36
37         /// Specifies the vertex data of this triangle mesh. Replaces any old
38         /// specified geometry.
39         /// @param vertexSizeBytes The size (stride) of a single vertex in memory.
40         void Set(const float *triangleMesh, int numTriangles, int vertexSizeBytes);
41         void Set(const float3 *triangleMesh, int numTriangles) { Set(reinterpret_cast<const float *>(triangleMesh), numTriangles, sizeof(float3)); }
42         void Set(const Triangle *triangleMesh, int numTriangles) { Set(reinterpret_cast<const float *>(triangleMesh), numTriangles, sizeof(Triangle)/3); }
43
44         void Set(const Polyhedron &polyhedron);
45
46         float IntersectRay(const Ray &ray) const;
47         float IntersectRay_TriangleIndex(const Ray &ray, int &outTriangleIndex) const;
48         float IntersectRay_TriangleIndex_UV(const Ray &ray, int &outTriangleIndex, float &outU, float &outV) const;
49
50         void SetAoS(const float *vertexData, int numTriangles, int vertexSizeBytes);
51         void SetSoA4(const float *vertexData, int numTriangles, int vertexSizeBytes);
52         void SetSoA8(const float *vertexData, int numTriangles, int vertexSizeBytes);
53
54         float IntersectRay_TriangleIndex_UV_CPP(const Ray &ray, int &outTriangleIndex, float &outU, float &outV) const;
55
56 #ifdef MATH_SSE2
57         float IntersectRay_SSE2(const Ray &ray) const;
58         float IntersectRay_TriangleIndex_SSE2(const Ray &ray, int &outTriangleIndex) const;
59         float IntersectRay_TriangleIndex_UV_SSE2(const Ray &ray, int &outTriangleIndex, float &outU, float &outV) const;
60 #endif
61
62 #ifdef MATH_SSE41
63         float IntersectRay_SSE41(const Ray &ray) const;
64         float IntersectRay_TriangleIndex_SSE41(const Ray &ray, int &outTriangleIndex) const;
65         float IntersectRay_TriangleIndex_UV_SSE41(const Ray &ray, int &outTriangleIndex, float &outU, float &outV) const;
66 #endif
67
68 #ifdef MATH_AVX
69         float IntersectRay_AVX(const Ray &ray) const;
70         float IntersectRay_TriangleIndex_AVX(const Ray &ray, int &outTriangleIndex) const;
71         float IntersectRay_TriangleIndex_UV_AVX(const Ray &ray, int &outTriangleIndex, float &outU, float &outV) const;
72 #endif
73
74 private:
75         float *data; // This is always allocated to tightly-packed numTriangles*3*vertexSizeBytes bytes.
76         int numTriangles;
77         int vertexSizeBytes;
78 #ifdef _DEBUG
79         int vertexDataLayout; // 0 - AoS, 1 - SoA4, 2 - SoA8
80 #endif
81         void ReallocVertexBuffer(int numTriangles, int vertexSizeBytes);
82 };
83
84 MATH_END_NAMESPACE

Go back to previous page