#include // the devil library #include #include #include #include #include "Camera.h" #include "Ray.h" #include "SimpleRay.h" #include "KdTree.h" #include "Mesh.h" #include "Exporter.h" #include "SceneGraph.h" #include "Preprocessor.h" #include "RayCaster.h" #ifdef USE_HAVRAN_RAYCASTER //#include "timer.h" #include "raypack.h" #endif using namespace std; namespace GtpVisibilityPreprocessor { 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 = false; 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, mWidth - (x + 1), mHeight - (y + 1)); bool debug = true; // (y == mHeight/2) && (x== mWidth/3); // MeshDebug = debug; if (debug) ray.mFlags = (Ray::STORE_TESTED_OBJECTS | Ray::STORE_KDLEAVES); else ray.mFlags &= ~(Ray::STORE_TESTED_OBJECTS|Ray::STORE_KDLEAVES); if (tree->CastRay(ray)) { // cout<<"I1"; 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()) { if (debug) { Ray *nray = new Ray(ray); rays.push_back(nray); } } // pbuffer-=2*components*mWidth; } long t2 = GetTime(); cout<<"#RAY_CAST_TIME\n"; cout<SetFilled(); exporter->SetWireframe(); if (sceneGraph) exporter->ExportScene(sceneGraph->GetRoot()); //exporter->ExportKdTree(*tree); //exporter->ExportBspTree(*bsptree); exporter->ExportRays(rays, 2000); int k =0; for (int j=0; j < rays.size(); j++) if (rays[j]->kdLeaves.size()) { Ray *ray = rays[j]; int i; exporter->SetWireframe(); if (1) for (i= 0; i < ray->kdLeaves.size(); i++) exporter->ExportBox(tree->GetBox(ray->kdLeaves[i])); exporter->SetFilled(); if (1) 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); ray.mFlags &= ~Ray::CULL_BACKFACES; } void Camera::SetupRay(SimpleRay &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; Vector3 dir = target - mPosition; dir.Normalize(); ray.Set(mPosition, dir, 0, 1.0f, ~(SimpleRay::F_BIDIRECTIONAL)); } bool Camera::SnapImage(string filename, RayCaster *raycaster, AxisAlignedBox3 &bbox, SceneGraph *sceneGraph ) { int x; int y; bool exportRays = false; InitDevIl(); int components = 4; float *buffer = new float[components*mWidth*mHeight]; assert(buffer); float *pbuffer = buffer; // - components*mWidth; vector rays; long t1 = GetTime(); SimpleRay ray; VssRayContainer vssRays; //CTimer timer; //timer.Start(); for (y = 0; y < mHeight; y++) { cout<<"+"; for (x = 0; x < mWidth; x++) { SetupRay(ray, mWidth - (x + 1), mHeight - (y + 1)); bool debug = true; // (y == mHeight/2) && (x== mWidth/3); // MeshDebug = debug; int res = raycaster->CastRay(ray, vssRays, bbox, false, // castDoubleRay, false); // pruneInvalidRays if (res) { Vector3 normal = raycaster->intersect.mNormal; float v = ray.mDirection.x * normal.x + ray.mDirection.y * normal.y + ray.mDirection.z * normal.z; v *= 1.0f; pbuffer[0] = v; pbuffer[1] = v; pbuffer[2] = v; pbuffer[3] = 1.0f; } else { pbuffer[0] = 0.0; pbuffer[1] = 0.0; pbuffer[2] = 0.0; pbuffer[3] = 1.0f; } pbuffer+=components; if (debug) { Ray *nray = new Ray(ray.mOrigin, ray.mDirection, Ray::LOCAL_RAY); rays.push_back(nray); } } // pbuffer-=2*components*mWidth; } // for y //timer.Stop(); long t2 = GetTime(); cout<<"\n#RAY_CAST_TIME = "; cout << TimeDiff(t1, t2)<<" [mikrosec]\n"; cout<<"Saving image"< rays; long t1 = GetTime(); SimpleRay ray; VssRayContainer vssRays; //CTimer timer; //timer.Start(); RayPacket2x2 rp; for (y = 0; y < mHeight-1; y+=2) { float *pppbuffer = pbuffer; cout<<"+"; for (x = 0; x < mWidth-1; x+=2) { int i = 0; for (int yi = 0; yi < 2; yi++) { for (int xi = 0; xi < 2; xi++) { SetupRay(ray, mWidth - (x+xi + 1), mHeight - (y+yi + 1)); rp.SetLoc(i, ray.mOrigin); rp.SetDir(i, ray.mDirection); i++; } // for xi } // for yi raycaster->CastRaysPacket2x2(rp, false, false); i = 0; float *ppbuffer = pbuffer; for (int yi = 0; yi < 2; yi++) { for (int xi = 0; xi < 2; xi++) { Intersectable* res = rp.GetObject(i); if (res) { pbuffer[0] = 1.0f; pbuffer[1] = 1.0f; pbuffer[2] = 1.0f; pbuffer[3] = 1.0f; } else { pbuffer[0] = 0.0; pbuffer[1] = 0.0; pbuffer[2] = 0.0; pbuffer[3] = 1.0f; } i++; ppbuffer += components; } // xi ppbuffer += components * (mWidth-2); } // yi pbuffer = ppbuffer + 2 * components; } // for x pbuffer = pppbuffer + mWidth * 2 * components; pppbuffer = pbuffer; // for the next time; } // for y //timer.Stop(); long t2 = GetTime(); cout<<"\n#RAY_CAST_TIME = "; cout << TimeDiff(t1, t2)<<" [mikrosec]\n"; cout<<"Saving image"<