scene.cpp 8.8 KB

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