#include "X3dExporter.h" #include "VrmlExporter.h" #include "OspTree.h" #include "KdTree.h" #include "KdIntersectable.h" #include "BvHierarchy.h" namespace GtpVisibilityPreprocessor { Exporter * Exporter::GetExporter(const string filename) { Exporter *exporter = NULL; if (strstr(filename.c_str(), ".x3d")) { exporter = new X3dExporter(filename); } else if (strstr(filename.c_str(), ".wrl")) { exporter = new VrmlExporter(filename); } else { cerr<<"Error: Currently unsuported export format, filename " << filename << endl; } return exporter; } bool Exporter::ExportOspTree(const OspTree &ospTree, const int maxPvs) { vector leaves; ospTree.CollectLeaves(leaves); mUseForcedMaterial = true; vector::const_iterator it, it_end = leaves.end(); Material white; white.mDiffuseColor.r = 1; white.mDiffuseColor.g = 1; white.mDiffuseColor.b = 1; for (it = leaves.begin(); it != it_end; ++ it) { KdLeaf *leaf = *it; SetWireframe(); SetForcedMaterial(white); ExportBox(ospTree.GetBoundingBox(leaf)); SetFilled(); if (maxPvs) // color code pvs { mForcedMaterial.mDiffuseColor.b = 1.0f; const float importance = (float)leaf->mObjects.size() / (float)maxPvs; mForcedMaterial.mDiffuseColor.r = importance; mForcedMaterial.mDiffuseColor.g = 1.0f - mForcedMaterial.mDiffuseColor.r; } else { SetForcedMaterial(RandomMaterial()); } if (0) ExportGeometry(leaf->mObjects); } return true; } void Exporter::ExportKdIntersectable(const KdIntersectable &kdObj) { KdNode *node = kdObj.GetItem(); Intersectable::NewMail(); // todo: traverse to leaves if (node->IsLeaf()) { // eyport leaf pvs KdLeaf *leaf = dynamic_cast(node); ObjectContainer::const_iterator oit, oit_end = leaf->mObjects.end(); for (oit = leaf->mObjects.begin(); oit != oit_end; ++ oit) { Intersectable *obj = *oit; if (!obj->Mailed()) { ExportIntersectable(obj); obj->Mail(); } } } } bool Exporter::ExportBvHierarchy(const BvHierarchy &bvHierarchy, const int maxPvs) { vector leaves; bvHierarchy.CollectLeaves(leaves); mUseForcedMaterial = true; vector::const_iterator it, it_end = leaves.end(); Material white; white.mDiffuseColor.r = 1; white.mDiffuseColor.g = 1; white.mDiffuseColor.b = 1; int objSize = 0; for (it = leaves.begin(); it != it_end; ++ it) { BvhLeaf *leaf = *it; SetWireframe(); SetForcedMaterial(white); ExportBox(leaf->GetBoundingBox()); SetFilled(); if (maxPvs) // color code pvs { mForcedMaterial.mDiffuseColor.b = 1.0f; const float importance = (float)leaf->mObjects.size() / (float)maxPvs; mForcedMaterial.mDiffuseColor.r = importance; mForcedMaterial.mDiffuseColor.g = 1.0f - mForcedMaterial.mDiffuseColor.r; } else { SetForcedMaterial(RandomMaterial()); } if (1) { SetFilled(); ExportGeometry(leaf->mObjects); objSize += leaf->mObjects.size(); } } return true; } }