00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <cstdlib>
00023 #include <cassert>
00024 #include <deque>
00025 #include <sstream>
00026
00027 #include "luxrays/core/dataset.h"
00028 #include "luxrays/core/context.h"
00029 #include "luxrays/core/trianglemesh.h"
00030 #include "luxrays/accelerators/bvhaccel.h"
00031 #include "luxrays/accelerators/qbvhaccel.h"
00032 #include "luxrays/accelerators/mqbvhaccel.h"
00033 #include "luxrays/core/geometry/bsphere.h"
00034
00035 using namespace luxrays;
00036
00037 DataSet::DataSet(const Context *luxRaysContext) {
00038 context = luxRaysContext;
00039
00040 totalVertexCount = 0;
00041 totalTriangleCount = 0;
00042 preprocessed = false;
00043
00044 accelType = ACCEL_QBVH;
00045 accel = NULL;
00046 }
00047
00048 DataSet::~DataSet() {
00049 delete accel;
00050 }
00051
00052 TriangleMeshID DataSet::Add(Mesh *mesh) {
00053 assert (!preprocessed);
00054
00055 const TriangleMeshID id = meshes.size();
00056 meshes.push_back(mesh);
00057
00058 totalVertexCount += mesh->GetTotalVertexCount();
00059 totalTriangleCount += mesh->GetTotalTriangleCount();
00060
00061 bbox = Union(bbox, mesh->GetBBox());
00062 bsphere = bbox.BoundingSphere();
00063
00064 return id;
00065 }
00066
00067 void DataSet::Preprocess() {
00068 assert (!preprocessed);
00069
00070 LR_LOG(context, "Preprocessing DataSet");
00071 LR_LOG(context, "Total vertex count: " << totalVertexCount);
00072 LR_LOG(context, "Total triangle count: " << totalTriangleCount);
00073
00074
00075 switch (accelType) {
00076 case ACCEL_BVH: {
00077 const int treeType = 4;
00078 const int costSamples = 0;
00079 const int isectCost = 80;
00080 const int travCost = 10;
00081 const float emptyBonus = 0.5f;
00082
00083 accel = new BVHAccel(context, treeType, costSamples, isectCost, travCost, emptyBonus);
00084 break;
00085 }
00086 case ACCEL_QBVH: {
00087 const int maxPrimsPerLeaf = 4;
00088 const int fullSweepThreshold = 4 * maxPrimsPerLeaf;
00089 const int skipFactor = 1;
00090
00091 accel = new QBVHAccel(context,
00092 maxPrimsPerLeaf, fullSweepThreshold, skipFactor);
00093 break;
00094 }
00095 case ACCEL_MQBVH: {
00096 const int fullSweepThreshold = 4;
00097 const int skipFactor = 1;
00098
00099 accel = new MQBVHAccel(context, fullSweepThreshold, skipFactor);
00100 break;
00101 }
00102 default:
00103 assert (false);
00104 }
00105
00106 accel->Init(meshes, totalVertexCount, totalTriangleCount);
00107
00108
00109 meshes.clear();
00110
00111 preprocessed = true;
00112 }
00113
00114 void DataSet::UpdateMeshes() {
00115 assert (preprocessed);
00116 assert (accelType == ACCEL_MQBVH);
00117
00118 MQBVHAccel *mqbvh = (MQBVHAccel *)accel;
00119 mqbvh->Update();
00120 }
00121
00122 bool DataSet::Intersect(const Ray *ray, RayHit *hit) const {
00123 return accel->Intersect(ray, hit);
00124 }