scene.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "default.h"
  5. #include "device.h"
  6. #include "builder.h"
  7. #include "scene_triangle_mesh.h"
  8. #include "scene_quad_mesh.h"
  9. #include "scene_user_geometry.h"
  10. #include "scene_instance.h"
  11. #include "scene_instance_array.h"
  12. #include "scene_curves.h"
  13. #include "scene_line_segments.h"
  14. #include "scene_subdiv_mesh.h"
  15. #include "scene_grid_mesh.h"
  16. #include "scene_points.h"
  17. #include "../subdiv/tessellation_cache.h"
  18. #include "acceln.h"
  19. #include "geometry.h"
  20. #if defined(EMBREE_SYCL_SUPPORT)
  21. #include "../sycl/rthwif_embree_builder.h"
  22. #endif
  23. namespace embree
  24. {
  25. struct TaskGroup;
  26. /*! Base class all scenes are derived from */
  27. class Scene : public AccelN
  28. {
  29. ALIGNED_CLASS_USM_(std::alignment_of<Scene>::value);
  30. public:
  31. template<typename Ty, bool mblur = false>
  32. class Iterator
  33. {
  34. public:
  35. Iterator () {}
  36. Iterator (Scene* scene, bool all = false)
  37. : scene(scene), all(all) {}
  38. __forceinline Ty* at(const size_t i)
  39. {
  40. Geometry* geom = scene->geometries[i].ptr;
  41. if (geom == nullptr) return nullptr;
  42. if (!all && !geom->isEnabled()) return nullptr;
  43. const size_t mask = geom->getTypeMask() & Ty::geom_type;
  44. if (!(mask)) return nullptr;
  45. if ((geom->numTimeSteps != 1) != mblur) return nullptr;
  46. return (Ty*) geom;
  47. }
  48. __forceinline Ty* operator[] (const size_t i) {
  49. return at(i);
  50. }
  51. __forceinline size_t size() const {
  52. return scene->size();
  53. }
  54. __forceinline size_t numPrimitives() const {
  55. return scene->getNumPrimitives(Ty::geom_type,mblur);
  56. }
  57. __forceinline size_t maxPrimitivesPerGeometry()
  58. {
  59. size_t ret = 0;
  60. for (size_t i=0; i<scene->size(); i++) {
  61. Ty* mesh = at(i);
  62. if (mesh == nullptr) continue;
  63. ret = max(ret,mesh->size());
  64. }
  65. return ret;
  66. }
  67. __forceinline unsigned int maxGeomID()
  68. {
  69. unsigned int ret = 0;
  70. for (size_t i=0; i<scene->size(); i++) {
  71. Ty* mesh = at(i);
  72. if (mesh == nullptr) continue;
  73. ret = max(ret,(unsigned int)i);
  74. }
  75. return ret;
  76. }
  77. __forceinline unsigned maxTimeStepsPerGeometry()
  78. {
  79. unsigned ret = 0;
  80. for (size_t i=0; i<scene->size(); i++) {
  81. Ty* mesh = at(i);
  82. if (mesh == nullptr) continue;
  83. ret = max(ret,mesh->numTimeSteps);
  84. }
  85. return ret;
  86. }
  87. private:
  88. Scene* scene;
  89. bool all;
  90. };
  91. class Iterator2
  92. {
  93. public:
  94. Iterator2 () {}
  95. Iterator2 (Scene* scene, Geometry::GTypeMask typemask, bool mblur)
  96. : scene(scene), typemask(typemask), mblur(mblur) {}
  97. __forceinline Geometry* at(const size_t i)
  98. {
  99. Geometry* geom = scene->geometries[i].ptr;
  100. if (geom == nullptr) return nullptr;
  101. if (!geom->isEnabled()) return nullptr;
  102. if (!(geom->getTypeMask() & typemask)) return nullptr;
  103. if ((geom->numTimeSteps != 1) != mblur) return nullptr;
  104. return geom;
  105. }
  106. __forceinline Geometry* operator[] (const size_t i) {
  107. return at(i);
  108. }
  109. __forceinline size_t size() const {
  110. return scene->size();
  111. }
  112. private:
  113. Scene* scene;
  114. Geometry::GTypeMask typemask;
  115. bool mblur;
  116. };
  117. public:
  118. /*! Scene construction */
  119. Scene (Device* device);
  120. /*! Scene destruction */
  121. ~Scene () noexcept;
  122. private:
  123. /*! class is non-copyable */
  124. Scene (const Scene& other) DELETED; // do not implement
  125. Scene& operator= (const Scene& other) DELETED; // do not implement
  126. public:
  127. void createTriangleAccel();
  128. void createTriangleMBAccel();
  129. void createQuadAccel();
  130. void createQuadMBAccel();
  131. void createHairAccel();
  132. void createHairMBAccel();
  133. void createSubdivAccel();
  134. void createSubdivMBAccel();
  135. void createUserGeometryAccel();
  136. void createUserGeometryMBAccel();
  137. void createInstanceAccel();
  138. void createInstanceMBAccel();
  139. void createInstanceExpensiveAccel();
  140. void createInstanceExpensiveMBAccel();
  141. void createInstanceArrayAccel();
  142. void createInstanceArrayMBAccel();
  143. void createGridAccel();
  144. void createGridMBAccel();
  145. /*! prints statistics about the scene */
  146. void printStatistics();
  147. /*! clears the scene */
  148. void clear();
  149. /*! detaches some geometry */
  150. void detachGeometry(size_t geomID);
  151. void setBuildQuality(RTCBuildQuality quality_flags);
  152. RTCBuildQuality getBuildQuality() const;
  153. void setSceneFlags(RTCSceneFlags scene_flags);
  154. RTCSceneFlags getSceneFlags() const;
  155. void build_cpu_accels();
  156. void build_gpu_accels();
  157. void commit (bool join);
  158. void commit_task ();
  159. void build () {}
  160. /* return number of geometries */
  161. __forceinline size_t size() const { return geometries.size(); }
  162. /* bind geometry to the scene */
  163. unsigned int bind (unsigned geomID, Ref<Geometry> geometry);
  164. /* determines if scene is modified */
  165. __forceinline bool isModified() const { return modified; }
  166. /* sets modified flag */
  167. __forceinline void setModified(bool f = true) {
  168. modified = f;
  169. }
  170. __forceinline bool isGeometryModified(size_t geomID)
  171. {
  172. Ref<Geometry>& g = geometries[geomID];
  173. if (!g) return false;
  174. return g->getModCounter() > geometryModCounters_[geomID];
  175. }
  176. protected:
  177. void checkIfModifiedAndSet ();
  178. public:
  179. /* get mesh by ID */
  180. __forceinline Geometry* get(size_t i) { assert(i < geometries.size()); return geometries[i].ptr; }
  181. __forceinline const Geometry* get(size_t i) const { assert(i < geometries.size()); return geometries[i].ptr; }
  182. template<typename Mesh>
  183. __forceinline Mesh* get(size_t i) {
  184. assert(i < geometries.size());
  185. assert(geometries[i]->getTypeMask() & Mesh::geom_type);
  186. return (Mesh*)geometries[i].ptr;
  187. }
  188. template<typename Mesh>
  189. __forceinline const Mesh* get(size_t i) const {
  190. assert(i < geometries.size());
  191. assert(geometries[i]->getTypeMask() & Mesh::geom_type);
  192. return (Mesh*)geometries[i].ptr;
  193. }
  194. template<typename Mesh>
  195. __forceinline Mesh* getSafe(size_t i) {
  196. assert(i < geometries.size());
  197. if (geometries[i] == null) return nullptr;
  198. if (!(geometries[i]->getTypeMask() & Mesh::geom_type)) return nullptr;
  199. else return (Mesh*) geometries[i].ptr;
  200. }
  201. __forceinline Ref<Geometry> get_locked(size_t i) {
  202. Lock<MutexSys> lock(geometriesMutex);
  203. assert(i < geometries.size());
  204. return geometries[i];
  205. }
  206. /* flag decoding */
  207. __forceinline bool isFastAccel() const { return !isCompactAccel() && !isRobustAccel(); }
  208. __forceinline bool isCompactAccel() const { return scene_flags & RTC_SCENE_FLAG_COMPACT; }
  209. __forceinline bool isRobustAccel() const { return scene_flags & RTC_SCENE_FLAG_ROBUST; }
  210. __forceinline bool isStaticAccel() const { return !(scene_flags & RTC_SCENE_FLAG_DYNAMIC); }
  211. __forceinline bool isDynamicAccel() const { return scene_flags & RTC_SCENE_FLAG_DYNAMIC; }
  212. __forceinline bool hasArgumentFilterFunction() const {
  213. return scene_flags & RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS;
  214. }
  215. __forceinline bool hasGeometryFilterFunction() {
  216. return world.numFilterFunctions != 0;
  217. }
  218. __forceinline bool hasFilterFunction() {
  219. return hasArgumentFilterFunction() || hasGeometryFilterFunction();
  220. }
  221. void* createQBVH6Accel();
  222. public:
  223. Device* device;
  224. public:
  225. IDPool<unsigned,0xFFFFFFFE> id_pool;
  226. Device::vector<Ref<Geometry>> geometries = device; //!< list of all user geometries
  227. avector<unsigned int> geometryModCounters_;
  228. Device::vector<float*> vertices = device;
  229. public:
  230. /* these are to detect if we need to recreate the acceleration structures */
  231. bool flags_modified;
  232. unsigned int enabled_geometry_types;
  233. RTCSceneFlags scene_flags;
  234. RTCBuildQuality quality_flags;
  235. MutexSys buildMutex;
  236. MutexSys geometriesMutex;
  237. #if defined(EMBREE_SYCL_SUPPORT)
  238. public:
  239. BBox3f hwaccel_bounds = empty;
  240. AccelBuffer hwaccel;
  241. #endif
  242. private:
  243. bool modified; //!< true if scene got modified
  244. public:
  245. std::unique_ptr<TaskGroup> taskGroup;
  246. public:
  247. struct BuildProgressMonitorInterface : public BuildProgressMonitor {
  248. BuildProgressMonitorInterface(Scene* scene)
  249. : scene(scene) {}
  250. void operator() (size_t dn) const { scene->progressMonitor(double(dn)); }
  251. private:
  252. Scene* scene;
  253. };
  254. BuildProgressMonitorInterface progressInterface;
  255. RTCProgressMonitorFunction progress_monitor_function;
  256. void* progress_monitor_ptr;
  257. std::atomic<size_t> progress_monitor_counter;
  258. void progressMonitor(double nprims);
  259. void setProgressMonitorFunction(RTCProgressMonitorFunction func, void* ptr);
  260. private:
  261. GeometryCounts world; //!< counts for geometry
  262. public:
  263. __forceinline size_t numPrimitives() const {
  264. return world.size();
  265. }
  266. __forceinline size_t getNumPrimitives(Geometry::GTypeMask mask, bool mblur) const
  267. {
  268. size_t count = 0;
  269. if (mask & Geometry::MTY_TRIANGLE_MESH)
  270. count += mblur ? world.numMBTriangles : world.numTriangles;
  271. if (mask & Geometry::MTY_QUAD_MESH)
  272. count += mblur ? world.numMBQuads : world.numQuads;
  273. if (mask & Geometry::MTY_CURVE2)
  274. count += mblur ? world.numMBLineSegments : world.numLineSegments;
  275. if (mask & Geometry::MTY_CURVE4)
  276. count += mblur ? world.numMBBezierCurves : world.numBezierCurves;
  277. if (mask & Geometry::MTY_POINTS)
  278. count += mblur ? world.numMBPoints : world.numPoints;
  279. if (mask & Geometry::MTY_SUBDIV_MESH)
  280. count += mblur ? world.numMBSubdivPatches : world.numSubdivPatches;
  281. if (mask & Geometry::MTY_USER_GEOMETRY)
  282. count += mblur ? world.numMBUserGeometries : world.numUserGeometries;
  283. if (mask & Geometry::MTY_INSTANCE_CHEAP)
  284. count += mblur ? world.numMBInstancesCheap : world.numInstancesCheap;
  285. if (mask & Geometry::MTY_INSTANCE_EXPENSIVE)
  286. count += mblur ? world.numMBInstancesExpensive : world.numInstancesExpensive;
  287. if (mask & Geometry::MTY_INSTANCE_ARRAY)
  288. count += mblur ? world.numMBInstanceArrays : world.numInstanceArrays;
  289. if (mask & Geometry::MTY_GRID_MESH)
  290. count += mblur ? world.numMBGrids : world.numGrids;
  291. return count;
  292. }
  293. __forceinline size_t getNumSubPrimitives(Geometry::GTypeMask mask, bool mblur) const
  294. {
  295. size_t count = 0;
  296. if (mask & Geometry::MTY_GRID_MESH)
  297. count += mblur ? world.numMBSubGrids : world.numSubGrids;
  298. Geometry::GTypeMask new_mask = (Geometry::GTypeMask)(mask & ~Geometry::MTY_GRID_MESH);
  299. count += getNumPrimitives(new_mask, mblur);
  300. return count;
  301. }
  302. template<typename Mesh, bool mblur>
  303. __forceinline unsigned getNumTimeSteps()
  304. {
  305. if (!mblur)
  306. return 1;
  307. Scene::Iterator<Mesh,mblur> iter(this);
  308. return iter.maxTimeStepsPerGeometry();
  309. }
  310. template<typename Mesh, bool mblur>
  311. __forceinline unsigned int getMaxGeomID()
  312. {
  313. Scene::Iterator<Mesh,mblur> iter(this);
  314. return iter.maxGeomID();
  315. }
  316. };
  317. }