main.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. scene.add_object(ajax_mesh, trf, false);
  40. trf << 40,0,0,0,
  41. 0,1,0,-1.5,
  42. 0,0,4,0,
  43. 0,0,0,1;
  44. scene.add_object(quad_mesh, trf, false);
  45. //scene.add_sphere(Vector3f(-1.5,0,0),0.5, true);
  46. scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,0), Eigen::Vector3f(1,1,0)});
  47. scene.build();
  48. camera cam(Vector3f(0, 0.6, 2.4),Vector3f(0,0,0), Vector3f(0,1,0));
  49. sampler simp;
  50. size_t n = 2000;
  51. auto t1 = nanoTime();
  52. auto x = cam.get_image(scene, n, simp);
  53. auto t2 = nanoTime();
  54. std::cout << (t2 - t1) / 1000 / 1000.0 << " miliseconds\n";
  55. std::vector<unsigned char> lodepng_image(x.size() * 4);
  56. for(size_t i = 0;i < x.size();i++){
  57. lodepng_image[i * 4] = (unsigned char)(std::min(x[x.size() - i - 1].x() * 256,255.f));
  58. lodepng_image[i * 4 + 1] = (unsigned char)(std::min(x[x.size() - i - 1].y() * 256,255.f));
  59. lodepng_image[i * 4 + 2] = (unsigned char)(std::min(x[x.size() - i - 1].z() * 256,255.f));
  60. lodepng_image[i * 4 + 3] = 255;
  61. }
  62. lodepng::encode("bild.png", lodepng_image, n, n);
  63. //drawbmp("bild.bmp", x, n, n);
  64. //std::cout << (rayhit.ray.tfar) << "\n";
  65. //std::cout << (rayhit.hit.Ng_x) << "\n";
  66. return 0;
  67. }