#include // the devil library #include #include #include #include "Camera.h" #include "Ray.h" #include "KdTree.h" #include "Mesh.h" #include "Exporter.h" #include "SceneGraph.h" void InitDevIl() { ilInit(); ILuint ImageName; ilGenImages(1, &ImageName); ilBindImage(ImageName); ilEnable(IL_FILE_OVERWRITE); // ilRegisterFormat(IL_RGBA); // ilRegisterType(IL_FLOAT); // ilEnable(IL_ORIGIN_SET); // ilOriginFunc(IL_ORIGIN_UPPER_LEFT); } bool Camera::SnapImage(string filename, KdTree *tree, SceneGraph *sceneGraph ) { int x; int y; bool exportRays = true; InitDevIl(); int components = 4; float *buffer = new float[components*mWidth*mHeight]; float *pbuffer = buffer; // - components*mWidth; vector rays; long t1 = GetTime(); Ray ray; for (y = 0; y < mHeight; y++) { cout<<"+"; for (x = 0; x < mWidth; x++) { SetupRay(ray, x, mHeight - (y + 1)); if (tree->CastRay(ray)) if (ray.intersections.size()) { sort(ray.intersections.begin(), ray.intersections.end()); MeshInstance *mesh = (MeshInstance*)ray.intersections[0].mObject; RgbColor color(1,1,1); if (mesh->GetMesh()->mMaterial) color = mesh->GetMesh()->mMaterial->mDiffuseColor; pbuffer[0] = color.r; pbuffer[1] = color.g; pbuffer[2] = color.b; pbuffer[3] = 1.0f; } pbuffer+=components; // if (exportRays && ( 1||(x==222) && (y==97))) { // if (exportRays && ((x%4==0) && (y%4==0))) { if (exportRays && ray.intersections.empty()) { Ray *nray = new Ray(ray); rays.push_back(nray); } } // pbuffer-=2*components*mWidth; } long t2 = GetTime(); cout<<"#RAY_CAST_TIME\n"; cout<SetFilled(); if (sceneGraph) exporter->ExportScene(sceneGraph->mRoot); //exporter->ExportKdTree(*tree); //exporter->ExportBspTree(*bsptree); exporter->ExportRays(rays, 2000); exporter->SetFilled(); int k =0; for (int j=0; j < rays.size(); j++) if (rays[j]->kdLeaves.size()) { Ray *ray = rays[j]; int i; if (0) for (i= 0; i < ray->kdLeaves.size(); i++) exporter->ExportBox(tree->GetBox(ray->kdLeaves[i])); if (0) for (i= 0; i < ray->testedObjects.size(); i++) exporter->ExportIntersectable(ray->testedObjects[i]); } delete exporter; } return true; } void Camera::SetupRay(Ray &ray, const int x, const int y) { Vector3 xv = mRight*((x - mWidth/2)/(float)mWidth); Vector3 yv = mUp*((y - mHeight/2)/(float)mHeight); Vector3 target = xv + yv + mDirection; ray.Clear(); ray.Init(mPosition, target, Ray::LOCAL_RAY); }