HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CE_BVH.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: CE_BVH.h ( CE Library, C++)
7  *
8  * COMMENTS: BVH class that runs on the GPU.
9  */
10 
11  #ifndef __CE_BVH__
12  #define __CE_BVH__
13 
14 #include "CE_Context.h"
15 #include "CE_Array.h"
16 #include "CE_BufferDevice.h"
17 
18 #include <UT/UT_ValArray.h>
19 
20 namespace tinybvh
21 {
22  class BVH_GPU;
23 }
24 
26 {
27 public:
28  CE_BVH();
29  ~CE_BVH();
30 
31  enum class PrimType
32  {
33  TRI,
34  QUAD,
35  TET
36  };
37 
38  void build(const CE_Int32Array &trisingrp,
39  const cl::Buffer &primptsidx,
40  const cl::Buffer &primpts,
41  const cl::Buffer &P,
42  PrimType primtype = PrimType::TRI,
43  bool refitTets = true);
44 
45  void refit(const CE_Int32Array &trisingrp,
46  const cl::Buffer &primptsidx,
47  const cl::Buffer &primpts,
48  const cl::Buffer &P);
49 
50  void clear();
51 
52  bool isBuilt() const;
53 
54  const cl::Buffer &nodeBuffer() const
55  { return myBVHNodes.buffer(); }
56 
57  const cl::Buffer &verticesBuffer() const
58  { return myVertices.buffer(); }
59 
60  const cl::Buffer &primIdxBuffer() const
61  { return myPrimIdx.buffer(); }
62 
63 protected:
64 
65  void updateVertices(const CE_Int32Array &tris,
66  const cl::Buffer &primptsidx,
67  const cl::Buffer &primpts,
68  const cl::Buffer &P);
69 
70  void buildDepthIndex(bool reverse = true);
71 
72  // These are copies of the tinybvh structs
73  // that we need to know the size of, but we
74  // don't want to include tinybvh.h in our
75  // include files.
76 #ifdef _MSC_VER
77  struct __declspec (align(16)) cebvhvec4
78 #else
79  struct __attribute__((aligned(16))) cebvhvec4
80 #endif
81  {
82  union { struct { float x, y, z, w; }; float cell[4]; };
83  };
84 
85  struct cebvhvec3
86  {
87  union { struct { float x, y, z; }; float cell[3]; };
88  };
89 
90  struct ceBVHNode
91  {
92  cebvhvec3 lmin; uint32_t left;
93  cebvhvec3 lmax; uint32_t right;
94  cebvhvec3 rmin; uint32_t triCount;
95  cebvhvec3 rmax; uint32_t firstTri; // total: 64 bytes
96  };
97 
98  tinybvh::BVH_GPU *myBVH;
108 };
109 
110 #endif
#define CE_API
Definition: CE_API.h:13
GLint left
Definition: glcorearb.h:2005
const cl::Buffer & nodeBuffer() const
Definition: CE_BVH.h:54
GLdouble GLdouble GLdouble z
Definition: glcorearb.h:848
CE_Int32Array mySingleDepthCounts
Definition: CE_BVH.h:103
PUGI__FN void reverse(I begin, I end)
Definition: pugixml.cpp:7458
PrimType myPrimType
Definition: CE_BVH.h:107
GLint y
Definition: glcorearb.h:103
cl::NDRange myRefitRange
Definition: CE_BVH.h:106
CE_BufferDevice< ceBVHNode > myBVHNodes
Definition: CE_BVH.h:99
PrimType
Definition: CE_BVH.h:31
cebvhvec3 lmin
Definition: CE_BVH.h:92
CE_BufferDevice< cebvhvec4 > myVertices
Definition: CE_BVH.h:100
CE_Int32Array myDepthIndex
Definition: CE_BVH.h:105
CE_Int32Array mySingleDepthOffsets
Definition: CE_BVH.h:104
GLint GLenum GLint x
Definition: glcorearb.h:409
const cl::Buffer & primIdxBuffer() const
Definition: CE_BVH.h:60
cebvhvec3 rmax
Definition: CE_BVH.h:95
Definition: CE_BVH.h:25
CE_UInt32Array myPrimIdx
Definition: CE_BVH.h:101
Memory buffer interface.
Definition: cl.hpp:1867
NDRange interface.
Definition: cl.hpp:2466
tinybvh::BVH_GPU * myBVH
Definition: CE_BVH.h:98
uint32_t triCount
Definition: CE_BVH.h:94
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:857
UT_IntArray myDepthCounts
Definition: CE_BVH.h:102
uint32_t right
Definition: CE_BVH.h:93
const cl::Buffer & verticesBuffer() const
Definition: CE_BVH.h:57