#include #include #include #include "Camera.h" #include "Ray.h" #include "KdTree.h" #include "Mesh.h" #include "Exporter.h" bool Camera::SnapImage(string filename, KdTree *tree ) { int x; int y; bool exportRays = true; // QImage image(mWidth, mHeight, 32); changed by matt QImage image(mWidth, mHeight, QImage::Format_RGB32); vector rays; long t1 = GetTime(); Ray ray; for (y = 0; y < mHeight; y++) { cout<<"+"; for (x = 0; x < mWidth; x++) { SetupRay(ray, x, y); 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; image.setPixel(x, y, qRgb(color.r*255, color.g*255, color.b*255 )); } if (exportRays && (x==222) && (y==97)) rays.push_back(ray); } } long t2 = GetTime(); cout<<"#RAY_CAST_TIME\n"; cout<SetWireframe(); exporter->ExportKdTree(*tree); exporter->ExportRays(rays, 10000); exporter->SetFilled(); int k =0; for (int j=0; j < rays.size(); j++) if (rays[j].leaves.size()) { Ray *ray = &(rays[j]); int i; if (1) for (i= 0; i < ray->leaves.size(); i++) exporter->ExportBox(tree->GetBox(ray->leaves[i])); if (0) for (i= 0; i < ray->meshes.size(); i++) exporter->ExportIntersectable(ray->meshes[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.intersections.clear(); ray.leaves.clear(); ray.meshes.clear(); ray.Init(mPosition, target, Ray::LOCAL_RAY); }