// loading/unloading // ---------------------------------------------------------------------------------------------- // Loads a file and turns it into a runtime resource bool ResourceManager::LoadResource(Resource * res, const WCHAR* filename) { bool ok = false; // try to create resource if (!FileUtils::Exists(filename)) { Logger::Log(OutputMessageType::Error, L"Failed to load file, '%ls' -- does not exist\n", filename); return false; } PerfTimer timer; timer.Start(); // get factory associated with 'filename' ResourceFactory * factory = GetFactory(filename); if (!factory) { return false; } ok = factory->LoadResource(res, filename); if (ok) { res->SetReady(); timer.Stop(); Logger::Log(OutputMessageType::Debug, L"%d ms Loaded %ls\n", timer.ElapsedMilliseconds(), FileUtils::Name(filename)); } else { timer.Stop(); Logger::Log(OutputMessageType::Error, L"%d ms failed to load %ls\n", timer.ElapsedMilliseconds(), filename); } return ok; }
Pmwx::Halfedge_handle InsertOneSegment( const RawCoordPair& p1, const RawCoordPair& p2, VertexIndex& index, Pmwx& ioMap) { string key1 = RawCoordToKey(p1); Point_2 pt1 = RawCoordToCoord(p1); string key2 = RawCoordToKey(p2); Point_2 pt2 = RawCoordToCoord(p2); VertexIndex::iterator i1 = index.find(key1); VertexIndex::iterator i2 = index.find(key2); Pmwx::Halfedge_handle he = Pmwx::Halfedge_handle(); #if 0 Pmwx::Locate_type loc1, loc2; ioMap.locate(pt1, loc1); ioMap.locate(pt2, loc2); CGAL_precondition_msg(loc1 != Pmwx::EDGE, "Pt1 on an edge, will cause CHAOS"); CGAL_precondition_msg(loc2 != Pmwx::EDGE, "Pt2 on an edge, will cause CHAOS"); if (i1 == index.end()) CGAL_precondition_msg(loc1 != Pmwx::VERTEX, "Pt1 on an unindexed vertex, will cause CHAOS"); if (i2 == index.end()) CGAL_precondition_msg(loc2 != Pmwx::VERTEX, "Pt2 on an unindexed vertex, will cause CHAOS"); #endif if (i1 == index.end()) { if (i2 == index.end()) { // Totally unknown segment. Pmwx::Locate_type lt; zeroV.Start(); he = ioMap.locate(pt1, lt); CGAL_precondition_msg(lt == Pmwx::FACE || lt == Pmwx::UNBOUNDED_FACE, "Inserting a segment in unknown territory but it's NOT on a face!!"); Pmwx::Face_handle fe = (lt == Pmwx::UNBOUNDED_FACE) ? ioMap.unbounded_face() : he->face(); // he = ioMap.non_intersecting_insert(PM_Curve_2(pt1, pt2)); he = ioMap.insert_in_face_interior(PM_Curve_2(pt1, pt2), fe); zeroV.Stop(); if (he != Pmwx::Halfedge_handle()) { index[key1] = he->source(); index[key2] = he->target(); } } else { // We know pt 2 but pt 1 is floating. Make a vector // using the vertex handle from 2 and 1's raw value. oneV.Start(); he = ioMap.Planar_map_2::insert_from_vertex( PM_Curve_2(i2->second->point(), pt1), i2->second); oneV.Stop(); // Now pt 1 gets stored...it is the target of the new halfedge. if (he != Pmwx::Halfedge_handle()) { index[key1] = he->target(); he = he->twin(); // This halfedge goes from 2 to 1, turn it around! } } } else { if (i2 == index.end()) { oneV.Start(); // We know pt 1 but not pt 2 he = ioMap.Planar_map_2::insert_from_vertex( PM_Curve_2(i1->second->point(), pt2), i1->second); oneV.Stop(); // Now pt 1 gets stored...it is the target of the new halfedge. if (he != Pmwx::Halfedge_handle()) index[key2] = he->target(); } else { twoV.Start(); // Both pts are known he = ioMap.Planar_map_2::insert_at_vertices( PM_Curve_2(i1->second->point(), i2->second->point()), i1->second, i2->second); twoV.Stop(); } } if (he == Pmwx::Halfedge_handle()) { return ioMap.halfedges_end(); } // Whenever we create a half edge we have to pick dominance...this works. he->mDominant = true; return he; }