main.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <embree3/rtcore.h>
  2. #include <cstdio>
  3. #include <limits>
  4. #include <iostream>
  5. #include <OBJ_Loader.h>
  6. #include <bmp.hpp>
  7. #include "scene.hpp"
  8. #include "camera.hpp"
  9. #include <time.hpp>
  10. #include <lodepng.h>
  11. #include <algorithm>
  12. #include <Eigen/Geometry>
  13. using std::printf;
  14. void errorFunction(void* userPtr, enum RTCError error, const char* str){
  15. printf("error %d: %s\n", error, str);
  16. }
  17. RTCDevice initializeDevice(){
  18. RTCDevice device = rtcNewDevice("threads=24,user_threads=24");
  19. if (!device)
  20. printf("error %d: cannot create device\n", rtcGetDeviceError(NULL));
  21. rtcSetDeviceErrorFunction(device, errorFunction, NULL);
  22. return device;
  23. }
  24. int main(){
  25. using namespace Eigen;
  26. RTCDevice dev = initializeDevice();
  27. scene scene(dev);
  28. objl::Loader ajax;
  29. objl::Loader quad;
  30. ajax.LoadFile("ajax.obj");
  31. quad.LoadFile("quad.obj");
  32. objl::Mesh ajax_mesh = ajax.LoadedMeshes[0];
  33. objl::Mesh quad_mesh = quad.LoadedMeshes[0];
  34. Matrix4f trf;
  35. trf << 1,0,0,0,
  36. 0,1.5,0,0,
  37. 0,0,1,0,
  38. 0,0,0,1;
  39. unsigned aji = scene.add_object(ajax_mesh, trf, false);
  40. scene.added_objects[scene.geom_id_to_object_index_map.find(aji)->second]->mat.m_bsdf = std::make_unique<microfacet_bsdf>(0.1);
  41. trf << 40,0,0,0,
  42. 0,1,0,-1.5,
  43. 0,0,4,0,
  44. 0,0,0,1;
  45. scene.add_object(quad_mesh, trf, false);
  46. //scene.add_sphere(Vector3f(-1.5,0,0),0.5, true);
  47. scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,0), Eigen::Vector3f(1,1,0)});
  48. scene.build();
  49. camera cam(Vector3f(0, 0.6, 2.4),Vector3f(0,0,0), Vector3f(0,1,0));
  50. sampler simp;
  51. size_t n = 500;
  52. auto t1 = nanoTime();
  53. auto x = cam.get_image(scene, n, simp);
  54. auto t2 = nanoTime();
  55. std::cout << (t2 - t1) / 1000 / 1000.0 << " miliseconds\n";
  56. std::vector<unsigned char> lodepng_image(x.size() * 4);
  57. for(size_t i = 0;i < x.size();i++){
  58. lodepng_image[i * 4] = (unsigned char)(std::min(x[x.size() - i - 1].x() * 256,255.f));
  59. lodepng_image[i * 4 + 1] = (unsigned char)(std::min(x[x.size() - i - 1].y() * 256,255.f));
  60. lodepng_image[i * 4 + 2] = (unsigned char)(std::min(x[x.size() - i - 1].z() * 256,255.f));
  61. lodepng_image[i * 4 + 3] = 255;
  62. }
  63. lodepng::encode("bild.png", lodepng_image, n, n);
  64. //drawbmp("bild.bmp", x, n, n);
  65. //std::cout << (rayhit.ray.tfar) << "\n";
  66. //std::cout << (rayhit.hit.Ng_x) << "\n";
  67. return 0;
  68. }