main.cpp 2.2 KB

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