From c251bbc496979769ef99dfa8143139fda1078638 Mon Sep 17 00:00:00 2001 From: ponchio Date: Fri, 2 Jul 2004 13:03:01 +0000 Subject: [PATCH] Created --- apps/nexus/crude2nexus/crude2nexus.cpp | 168 +++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 apps/nexus/crude2nexus/crude2nexus.cpp diff --git a/apps/nexus/crude2nexus/crude2nexus.cpp b/apps/nexus/crude2nexus/crude2nexus.cpp new file mode 100644 index 00000000..d67846f8 --- /dev/null +++ b/apps/nexus/crude2nexus/crude2nexus.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ + +****************************************************************************/ +#include +#include + +#include "../nexus.h" +#include "../crude.h" +#include "../vert_remap.h" +#include "../vfile.h" + +using namespace std; +using namespace vcg; +using namespace nxs; + + +struct RemapLink { + unsigned int rel_vert; + unsigned int patch; + unsigned int abs_vert; +}; + +int main(int argc, char *argv[]) { + if(argc <= 2) { + cerr << "Usage: " << argv[0] << " \n"; + return -1; + } + Crude crude; + if(!crude.Load(argv[1])) { + cerr << "Could not load crude:" << argv[1] << endl; + return -1; + } + + VertRemap vert_remap; + if(!vert_remap.Load(argv[1])) { + cerr << "Could not load vert_remap files: " << argv[1] << "\n"; + return -1; + } + + VFile face_remap; + if(!face_remap.Load(argv[1] + string(".rmf"))) { + cerr << "Could not load face_remap file: " << argv[1] << ".frm\n"; + return -1; + } + + + + Nexus nexus; + if(!nexus.Create(argv[2])) { + return -1; + } + + + + //lets count faces, + vector patch_faces; + + for(unsigned int i = 0; i < face_remap.Size(); i++) { + unsigned int patch = face_remap[i]; + assert(patch != 0xffffffff); + if(patch >= patch_faces.size()) + patch_faces.resize(patch+1, 0); + patch_faces[patch]++; + nexus.totface++; + } + + cerr << "Vertremap size: " << vert_remap.Size() << endl; + + + //lets count vertices + vector patch_verts; + patch_verts.resize(patch_faces.size(), 0); + + unsigned int unreferenced = 0; + // counting vertices using border_size for number of vertices + for(unsigned int i = 0; i < vert_remap.all.Size(); i++) { + unsigned int patch = vert_remap.all[i]; + if(patch == 0xffffffff) { + unreferenced++; + continue; + } + assert(patch < patch_verts.size()); + patch_verts[patch]++; + nexus.totvert++; + } + + unsigned int totbord = 0; + VFile &border = vert_remap.borders.buffer; + for(unsigned int i = 0; i < border.Size(); i++) { + MFHash::Bucket &bucket = border[i]; + if(bucket.key == 0xffffffff) continue; + unsigned int patch = bucket.value; + assert(patch < patch_verts.size()); + patch_verts[patch]++; + totbord++; + // nexus.totvert++; (?) + } + + if(unreferenced) + cerr << "Warning: found " << unreferenced << " vertices.\n"; + + cerr << "Triangles found: " << nexus.totface << endl; + cerr << "Vertex found: " << nexus.totvert << endl; + cerr << "Borders found: " << totbord << endl; + + + nexus.index.resize(patch_verts.size()); + //now that we know various sizes, lets allocate space + for(unsigned int i = 0; i < nexus.index.size(); i++) { + Nexus::Entry &entry = nexus.index[i]; + + if(patch_faces[i] == 0 || patch_verts[i] == 0) + cerr << "Warning! Empty patch.\n"; + + entry.patch_offset = nexus.totchunks; + entry.patch_size = Patch::ChunkSize(patch_verts[i], patch_faces[i]); + + nexus.totchunks += entry.patch_size; + entry.border_offset = 0; + } + + nexus.patches.Resize(nexus.totchunks); + + //now we sort the faces into the patches (but still using absolute indexing + //instead of relative indexing + for(unsigned int i = 0; i < crude.face.Size(); i++) { + Crude::Face &face = crude.face[i]; + unsigned int n = face_remap[i]; + Nexus::Entry &entry = nexus.index[n]; + Patch patch = nexus.GetPatch(n); + if(entry.border_offset == 0) { //first time we find patch + entry.border_offset = 0xffffffff; + patch.VertSize() = 0; + patch.FaceSize() = 0; + } + Crude::Face *faces = (Crude::Face *)patch.VertBegin(); + faces[patch.FaceSize()] = face; + patch.FaceSize()++; + } + + //finally for every patch we collect the vertices + return 0; +}