bool CreateSmoothHierarchy(MultiGrid& mg, size_t numRefs) { PROFILE_FUNC_GROUP("grid"); IRefinementCallback* refCallback = NULL; // we're only checking for the main attachments here. //todo: improve this - add a domain-based hierarchy creator. if(mg.has_vertex_attachment(aPosition1)) refCallback = new SubdivisionLoopProjector<APosition1>(mg, aPosition1, aPosition1); else if(mg.has_vertex_attachment(aPosition2)) refCallback = new SubdivisionLoopProjector<APosition2>(mg, aPosition2, aPosition2); else if(mg.has_vertex_attachment(aPosition)) refCallback = new SubdivisionLoopProjector<APosition>(mg, aPosition, aPosition); if(!refCallback){ UG_LOG("No standard position attachment found. Aborting.\n"); return false; } GlobalMultiGridRefiner ref(mg, refCallback); for(size_t lvl = 0; lvl < numRefs; ++lvl){ ref.refine(); } if(mg.has_vertex_attachment(aPosition1)) ProjectToLimitPLoop(mg, aPosition1, aPosition1); else if(mg.has_vertex_attachment(aPosition2)) ProjectToLimitPLoop(mg, aPosition2, aPosition2); else if(mg.has_vertex_attachment(aPosition)) ProjectToLimitPLoop(mg, aPosition, aPosition); delete refCallback; return true; }
bool SaveGridHierarchyTransformed(MultiGrid& mg, ISubsetHandler& sh, const char* filename, number offset) { PROFILE_FUNC_GROUP("grid"); APosition aPos; // uses auto-attach Grid::AttachmentAccessor<Vertex, APosition> aaPos(mg, aPos, true); // copy the existing position to aPos. We take care of dimension differences. // Note: if the method was implemented for domains, this could be implemented // in a nicer way. if(mg.has_vertex_attachment(aPosition)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition, aPos); else if(mg.has_vertex_attachment(aPosition2)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition2, aPos); else if(mg.has_vertex_attachment(aPosition1)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition1, aPos); // iterate through all vertices and apply an offset depending on their level. for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ for(VertexIterator iter = mg.begin<Vertex>(lvl); iter != mg.end<Vertex>(lvl); ++iter) { aaPos[*iter].z() += (number)lvl * offset; } } // finally save the grid bool writeSuccess = SaveGridToFile(mg, sh, filename, aPos); // clean up mg.detach_from_vertices(aPos); return writeSuccess; }
bool CreateHierarchy(MultiGrid& mg, size_t numRefs) { PROFILE_FUNC_GROUP("grid"); GlobalMultiGridRefiner ref(mg); for(size_t lvl = 0; lvl < numRefs; ++lvl){ ref.refine(); } return true; }
bool SaveSurfaceViewTransformed(MultiGrid& mg, const SurfaceView& sv, const char* filename, number offset) { PROFILE_FUNC_GROUP("grid"); APosition aPos; // uses auto-attach Grid::AttachmentAccessor<Vertex, APosition> aaPos(mg, aPos, true); // copy the existing position to aPos. We take care of dimension differences. // Note: if the method was implemented for domains, this could be implemented // in a nicer way. if(mg.has_vertex_attachment(aPosition)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition, aPos); else if(mg.has_vertex_attachment(aPosition2)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition2, aPos); else if(mg.has_vertex_attachment(aPosition1)) ConvertMathVectorAttachmentValues<Vertex>(mg, aPosition1, aPos); // iterate through all vertices and apply an offset depending on their level. for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ for(VertexIterator iter = mg.begin<Vertex>(lvl); iter != mg.end<Vertex>(lvl); ++iter) { aaPos[*iter].z() += (number)lvl * offset; } } // create a subset handler which holds different subsets for the different interface types SubsetHandler sh(mg); AssignSubsetsBySurfaceViewState<Vertex>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Edge>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Face>(sh, sv, mg); AssignSubsetsBySurfaceViewState<Volume>(sh, sv, mg); AssignSubsetColors(sh); EraseEmptySubsets(sh); // finally save the grid bool writeSuccess = SaveGridToFile(mg, sh, filename, aPos); // clean up mg.detach_from_vertices(aPos); return writeSuccess; }
bool CreateSmoothVolumeHierarchy(MultiGrid& mg, MGSubsetHandler& sh, MGSubsetHandler& markSH, size_t numRefs, const char* linearBndManifoldSubsets) { PROFILE_FUNC_GROUP("grid"); GlobalMultiGridRefiner ref(mg); for(size_t lvl = 0; lvl < numRefs; ++lvl){ ref.refine(); ApplySmoothSubdivisionToTopLevel(mg, sh, markSH, linearBndManifoldSubsets); } //if(g_boundaryRefinementRule == SUBDIV_LOOP) //ProjectToLimitPLoop(mg, aPosition, aPosition); ProjectHierarchyToLimitSubdivisionVolume(mg); return true; }
void TestSubdivision(const char* fileIn, const char* fileOut, int numRefs) { PROFILE_FUNC_GROUP("grid"); //todo: Callbacks have to make sure that their attachment is accessible in the grid. // even if they were initialized before the attachment was attached to the grid. MultiGrid mg; SubsetHandler sh(mg); SubdivisionLoopProjector<APosition> refCallback(mg, aPosition, aPosition); GlobalMultiGridRefiner ref(mg, &refCallback); if(LoadGridFromFile(mg, sh, fileIn)){ for(int lvl = 0; lvl < numRefs; ++lvl){ ref.refine(); } ProjectToLimitPLoop(mg, aPosition, aPosition); SaveGridToFile(mg, mg.get_hierarchy_handler(), fileOut); } else{ UG_LOG("Load failed. aborting...\n"); } }
bool SaveGridHierarchy(MultiGrid& mg, const char* filename) { PROFILE_FUNC_GROUP("grid"); return SaveGridToFile(mg, mg.get_hierarchy_handler(), filename); }
bool SaveGrid(Grid& grid, const ISubsetHandler& sh, const char* filename) { PROFILE_FUNC_GROUP("grid"); return SaveGridToFile(grid, *const_cast<ISubsetHandler*>(&sh), filename); }
bool SaveGrid(Grid& grid, ISubsetHandler& sh, const char* filename) { PROFILE_FUNC_GROUP("grid"); return SaveGridToFile(grid, sh, filename); }
bool SaveGrid(Grid& grid, const char* filename) { PROFILE_FUNC_GROUP("grid"); return SaveGridToFile(grid, filename); }
bool LoadGrid(Grid& grid, const char* filename) { PROFILE_FUNC_GROUP("grid"); return LoadGridFromFile(grid, filename); }
bool LoadGrid(Grid& grid, ISubsetHandler& sh, const char* filename) { PROFILE_FUNC_GROUP("grid"); return LoadGridFromFile(grid, sh, filename); }