bool BccInterface::loadPatchGeometry(BccWorld * world, const std::string & filename) { const std::string oldFilename = FileName; FileName = filename; GeometryArray * trigeo = new GeometryArray; bool res = ReadTriangleData(trigeo); if(res) { const unsigned n = trigeo->numGeometries(); std::cout<<"\n bcc interface loading "<<n<<" triangle mesh geometries as patch "; m_patchMesh = (ATriangleMesh *)trigeo->geometry(0); unsigned i=0; for(;i<n;i++) { std::vector<AOrientedBox> patchBoxes; if(separate((ATriangleMesh *)trigeo->geometry(i), patchBoxes)) { world->addPatchBoxes(patchBoxes); patchBoxes.clear(); } } } else { std::cout<<"\n hes file contains no triangle mesh geometry. "; } FileName = oldFilename; return res; }
void KdCluster::leafWriteGroup(KdTreeNode *node, const BoundingBox & box) { const unsigned num = node->getNumPrims(); if(num < 1) return; m_groupGeometries[m_currentGroup] = new GeometryArray; GeometryArray * curGrp = m_groupGeometries[m_currentGroup]; curGrp->create(num); unsigned start = node->getPrimStart(); sdb::VectorArray<Primitive> &indir = indirection(); //sdb::VectorArray<Primitive> &prims = primitives(); int igeom, icomponent; unsigned igroup = 0; for(unsigned i = 0; i < num; i++) { //unsigned *iprim = indir[start + i]; //Primitive * prim = prims.get(*iprim); Primitive * prim = indir[start + i]; prim->getGeometryComponent(igeom, icomponent); Geometry * geo = m_stream.geometry(igeom); if(geo->type() == TGeometryArray) { GeometryArray * ga = (GeometryArray *)geo; Geometry * comp = ga->geometry(icomponent); BoundingBox comb = ga->calculateBBox(icomponent); // do not add straddling geo if(comb.getMax(0) <= box.getMax(0) && comb.getMax(1) <= box.getMax(1) && comb.getMax(2) <= box.getMax(2)) { curGrp->setGeometry(comp, igroup); igroup++; } } else { std::cout<<" grouping only works with geometry arry."; } //indir.next(); } curGrp->setNumGeometries(igroup); m_nodeGroupInd[node] = m_currentGroup; m_currentGroup++; }
bool BccInterface::loadCurveGeometry(BccWorld * world, const std::string & filename) { const std::string oldFilename = FileName; FileName = filename; GeometryArray curvegeo; bool res = ReadCurveData(&curvegeo); if(res) { const unsigned n = curvegeo.numGeometries(); std::cout<<"\n bcc interface loading "<<n<<" curve geometries. "; unsigned i=0; for(;i<n;i++) world->addCurveGroup((CurveGroup *)curvegeo.geometry(i)); } else { std::cout<<"\n hes file contains no curve geometry. "; } FileName = oldFilename; return res; }
bool AdeniumInterface::readTriangleMeshFromFile(AdeniumWorld * world) { if(BaseFile::InvalidFilename(FileName)) return false; if(!BaseFile::FileExists(FileName)) { FileName = "unknown"; return false; } HesperisFile hes; hes.setReadComponent(HesperisFile::RTri); if(!hes.open(FileName)) return false; hes.close(); GeometryArray triangleMeshes; hes.extractTriangleMeshes(&triangleMeshes); if(triangleMeshes.numGeometries() < 1) return false; std::cout<<" n tri mesh "<<triangleMeshes.numGeometries(); world->addTriangleSystem(new BvhTriangleSystem((ATriangleMesh *)triangleMeshes.geometry(0))); return true; }
bool BccInterface::saveWorld(BccWorld * world) { if(world->numTetrahedronMeshes() < 1) { std::cout<<" no tetrahedron mesh to save"; return false; } HesperisFile hes; if(!hes.open(FileName)) { GeometryArray * gmgeo = world->triangleGeometries(); if(!gmgeo) { std::cout<<" no triangle mesh to save"; return false; } hes.create(FileName); hes.setWriteComponent(HesperisFile::WTri); hes.addTriangleMesh("growmesh", (ATriangleMeshGroup *)gmgeo->geometry(0)); hes.setDirty(); hes.save(); } hes.setWriteComponent(HesperisFile::WTetra); unsigned ntet, nvert, nstripe, nanchor; world->computeTetrahedronMeshStatistics(ntet, nvert, nstripe, nanchor); ATetrahedronMeshGroup * cm = new ATetrahedronMeshGroup; cm->create(nvert, ntet, nstripe); const unsigned n = world->numTetrahedronMeshes(); ntet = 0; nvert = 0; nstripe = 0; unsigned i = 0; for(; i < n; i++) { ATetrahedronMeshGroup * imesh = world->tetrahedronMesh(i); cm->copyPointDrift(imesh->pointDrifts(), imesh->numStripes(), nstripe, nvert); cm->copyIndexDrift(imesh->indexDrifts(), imesh->numStripes(), nstripe, ntet*4); cm->copyStripe(imesh, nvert, ntet * 4); ntet += imesh->numTetrahedrons(); nvert += imesh->numPoints(); nstripe += imesh->numStripes(); } float vlm = cm->calculateVolume(); cm->setVolume(vlm); std::cout<<"\n combined all for save out "; cm->verbose(); hes.addTetrahedron("tetra_c", cm); hes.setDirty(); hes.save(); hes.close(); delete cm; return true; }