scene.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "scene.hpp"
  2. #include <utility>
  3. #include <algorithm>
  4. using namespace Eigen;
  5. scene::scene(RTCDevice dev){
  6. m_scene = rtcNewScene(dev);
  7. m_dev = dev;
  8. }
  9. unsigned int scene::add_object(const objl::Mesh& mesh, const Eigen::Matrix4f& transform, bool emitter){
  10. added_meshes.push_back(mesh);
  11. return add_object(added_meshes.size() - 1, transform, emitter);
  12. }
  13. unsigned int scene::add_object(size_t mesh_index, const Eigen::Matrix4f& transform, bool emitter){
  14. using namespace objl;
  15. const objl::Mesh& mesh = this->added_meshes[mesh_index];
  16. std::pair<float, float> xex = {mesh.Vertices[0].Position.X, mesh.Vertices[0].Position.X};
  17. std::pair<float, float> yex = {mesh.Vertices[0].Position.Y, mesh.Vertices[0].Position.Y};
  18. std::pair<float, float> zex = {mesh.Vertices[0].Position.Z, mesh.Vertices[0].Position.Z};
  19. for(size_t i = 1;i < mesh.Vertices.size();i++){
  20. xex.first = std::min(mesh.Vertices[i].Position.X, xex.first);
  21. yex.first = std::min(mesh.Vertices[i].Position.Y, yex.first);
  22. zex.first = std::min(mesh.Vertices[i].Position.Z, zex.first);
  23. xex.second = std::max(mesh.Vertices[i].Position.X, xex.second);
  24. yex.second = std::max(mesh.Vertices[i].Position.Y, yex.second);
  25. zex.second = std::max(mesh.Vertices[i].Position.Z, zex.second);
  26. }
  27. if(xex.second - xex.first < 0.0001f){
  28. xex.second = 1e30;
  29. xex.first = -1e30;
  30. }
  31. if(yex.second - yex.first < 0.0001f){
  32. yex.second = 1e30;
  33. yex.first = -1e30;
  34. }
  35. if(zex.second - zex.first < 0.0001f){
  36. zex.second = 1e30;
  37. zex.first = -1e30;
  38. }
  39. std::vector<objl::Vertex> rectified_vertices(mesh.Vertices.size());
  40. for(size_t i = 0;i < mesh.Vertices.size();i++){
  41. Vector4f rec_pos;
  42. rec_pos.x() = (mesh.Vertices[i].Position.X - xex.first) * (2.0f / (xex.second - xex.first)) - 1.0f;
  43. rec_pos.y() = (mesh.Vertices[i].Position.Y - yex.first) * (2.0f / (yex.second - yex.first)) - 1.0f;
  44. rec_pos.z() = (mesh.Vertices[i].Position.Z - zex.first) * (2.0f / (zex.second - zex.first)) - 1.0f;
  45. rec_pos.w() = 1;
  46. rec_pos = transform * rec_pos;
  47. rectified_vertices[i].Position.X = rec_pos.x();
  48. rectified_vertices[i].Position.Y = rec_pos.y();
  49. rectified_vertices[i].Position.Z = rec_pos.z();
  50. }
  51. RTCGeometry m_geom = rtcNewGeometry(m_dev, RTC_GEOMETRY_TYPE_TRIANGLE);
  52. float* vertices = (float*) rtcSetNewGeometryBuffer(m_geom,
  53. RTC_BUFFER_TYPE_VERTEX,
  54. 0,
  55. RTC_FORMAT_FLOAT3,
  56. 3 * sizeof(float),
  57. rectified_vertices.size());
  58. unsigned* indices = (unsigned*) rtcSetNewGeometryBuffer(m_geom,
  59. RTC_BUFFER_TYPE_INDEX,
  60. 0,
  61. RTC_FORMAT_UINT3,
  62. 3 * sizeof(unsigned),
  63. mesh.Indices.size() / 3);
  64. if (vertices && indices){
  65. for(size_t i = 0;i < mesh.Indices.size();i++){
  66. indices[i] = mesh.Indices[i];
  67. }
  68. for(size_t i = 0;i < rectified_vertices.size();i++){
  69. vertices[3 * i] = rectified_vertices[i].Position.X;
  70. vertices[3 * i + 1] = rectified_vertices[i].Position.Y;
  71. vertices[3 * i + 2] = rectified_vertices[i].Position.Z;
  72. }
  73. }
  74. rtcUpdateGeometryBuffer(m_geom, RTC_BUFFER_TYPE_VERTEX, 0);
  75. rtcUpdateGeometryBuffer(m_geom, RTC_BUFFER_TYPE_INDEX, 0);
  76. rtcCommitGeometry(m_geom);
  77. unsigned int geomID = rtcAttachGeometry(m_scene, m_geom);
  78. if(emitter){
  79. emitters.emplace(geomID);
  80. }
  81. this->added_objects.push_back(std::make_unique<mesh_object>(mesh_index, material()));
  82. this->geom_id_to_object_index_map[geomID] = this->added_objects.size() - 1;
  83. return geomID;
  84. }
  85. unsigned int scene::add_sphere(const Eigen::Vector3f& pos, float rad, bool emitter){
  86. RTCGeometry m_geom = rtcNewGeometry(m_dev, RTC_GEOMETRY_TYPE_SPHERE_POINT);
  87. float* vertices = (float*) rtcSetNewGeometryBuffer(m_geom,
  88. RTC_BUFFER_TYPE_VERTEX,
  89. 0,
  90. RTC_FORMAT_FLOAT4,
  91. 4 * sizeof(float),
  92. 1);
  93. vertices[0] = pos.x();
  94. vertices[1] = pos.y();
  95. vertices[2] = pos.z();
  96. vertices[3] = rad;
  97. rtcUpdateGeometryBuffer(m_geom, RTC_BUFFER_TYPE_VERTEX, 0);
  98. rtcCommitGeometry(m_geom);
  99. unsigned int geomID = rtcAttachGeometry(m_scene, m_geom);
  100. if(emitter){
  101. emitters.emplace(geomID);
  102. }
  103. this->added_objects.push_back(std::make_unique<sphere_object>(material()));
  104. this->geom_id_to_object_index_map[geomID] = this->added_objects.size() - 1;
  105. return geomID;
  106. }
  107. void scene::build(){
  108. rtcSetSceneBuildQuality(m_scene, RTC_BUILD_QUALITY_HIGH);
  109. rtcCommitScene(m_scene);
  110. }
  111. /*scene get_scene(RTCDevice dev){
  112. RTCScene rtcsc = rtcNewScene(dev);
  113. objl::Loader loader;
  114. loader.LoadFile("ajax.obj");
  115. objl::Mesh& ajaxmesh = loader.LoadedMeshes.at(0);
  116. //std::cout << ajaxmesh.Vertices.size() << "\n";
  117. if(ajaxmesh.Indices.size() % 3 != 0){
  118. std::terminate();
  119. }
  120. RTCGeometry m_geom = rtcNewGeometry(dev, RTC_GEOMETRY_TYPE_TRIANGLE);
  121. float* vertices = (float*) rtcSetNewGeometryBuffer(m_geom,
  122. RTC_BUFFER_TYPE_VERTEX,
  123. 0,
  124. RTC_FORMAT_FLOAT3,
  125. 3 * sizeof(float),
  126. ajaxmesh.Vertices.size());
  127. unsigned* indices = (unsigned*) rtcSetNewGeometryBuffer(m_geom,
  128. RTC_BUFFER_TYPE_INDEX,
  129. 0,
  130. RTC_FORMAT_UINT3,
  131. 3 * sizeof(unsigned),
  132. ajaxmesh.Indices.size() / 3);
  133. if (vertices && indices){
  134. for(size_t i = 0;i < ajaxmesh.Indices.size();i++){
  135. indices[i] = ajaxmesh.Indices[i];
  136. }
  137. for(size_t i = 0;i < ajaxmesh.Vertices.size();i++){
  138. vertices[3 * i] = ajaxmesh.Vertices[i].Position.X;
  139. vertices[3 * i + 1] = ajaxmesh.Vertices[i].Position.Y;
  140. vertices[3 * i + 2] = ajaxmesh.Vertices[i].Position.Z;
  141. }
  142. }
  143. rtcUpdateGeometryBuffer(m_geom, RTC_BUFFER_TYPE_VERTEX, 0);
  144. rtcUpdateGeometryBuffer(m_geom, RTC_BUFFER_TYPE_INDEX, 0);
  145. rtcCommitGeometry(m_geom);
  146. unsigned int geomID = rtcAttachGeometry(rtcsc, m_geom);
  147. RTCGeometry m_geom2 = rtcNewGeometry(dev, RTC_GEOMETRY_TYPE_TRIANGLE);
  148. vertices = (float*) rtcSetNewGeometryBuffer(m_geom2,
  149. RTC_BUFFER_TYPE_VERTEX,
  150. 0,
  151. RTC_FORMAT_FLOAT3,
  152. 3 * sizeof(float),
  153. 3);
  154. indices = (unsigned*) rtcSetNewGeometryBuffer(m_geom2,
  155. RTC_BUFFER_TYPE_INDEX,
  156. 0,
  157. RTC_FORMAT_UINT3,
  158. 3 * sizeof(unsigned),
  159. 1);
  160. vertices[0] = -11; vertices[1] = 10; vertices[2] = 5;
  161. vertices[3] = -11; vertices[4] = 15; vertices[5] = 5;
  162. vertices[6] = -20; vertices[7] = 15; vertices[8] = -5;
  163. indices[0] = 0;
  164. indices[1] = 1;
  165. indices[2] = 2;
  166. rtcUpdateGeometryBuffer(m_geom2, RTC_BUFFER_TYPE_VERTEX, 0);
  167. rtcUpdateGeometryBuffer(m_geom2, RTC_BUFFER_TYPE_INDEX, 0);
  168. rtcCommitGeometry(m_geom2);
  169. unsigned int geid2 = rtcAttachGeometry(rtcsc, m_geom2);
  170. rtcSetSceneBuildQuality(rtcsc, RTC_BUILD_QUALITY_HIGH);
  171. rtcCommitScene(rtcsc);
  172. scene sc(rtcsc);
  173. //sc.emitting.insert({geomID, true});
  174. sc.emitting.insert({geid2, true});
  175. return sc;
  176. }*/