From d78f277a46c2cf6e7b0a548999d85c7d017beca0 Mon Sep 17 00:00:00 2001 From: ponchio Date: Wed, 1 Dec 2004 01:15:03 +0000 Subject: [PATCH] Level 0. --- apps/nexus/nxsbuilder.cpp | 220 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 apps/nexus/nxsbuilder.cpp diff --git a/apps/nexus/nxsbuilder.cpp b/apps/nexus/nxsbuilder.cpp new file mode 100644 index 00000000..25377fa9 --- /dev/null +++ b/apps/nexus/nxsbuilder.cpp @@ -0,0 +1,220 @@ +/**************************************************************************** +* 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 $ +Revision 1.26 2004/11/30 22:49:39 ponchio +Level 0. + + +****************************************************************************/ + +#ifdef WIN32 +#include +#else +#include +#endif + +#include + +#include "nxstypes.h" +#include "crude.h" +#include "remapping.h" +#include "decimate.h" + + +using namespace std; +using namespace vcg; +using namespace nxs; + +/*struct PIndex { + int64 offset; + unsigned int lenght; +}; + +class FaceIndex: public std::vector {};*/ + + +void usage() { + cerr << "Usage: voronoinxs [options]\n" + " Options:\n" + " -f N: use N faces per patch (default 1000, max 32000)\n" + " -t N: mini faces per patch (default 200)\n" + " -l N: number of levels\n" + " -s F: scaling factor (0 < F < 1, default 0.5)\n" + " -o N: number of optimization steps\n" + " -d : decimation method: quadric, cluster. (default quadric)\n" + " -b N: ram buffer size (in bytes)\n" + " -p N: which fase perform:\n" + " 0) Remap faces\n" + " 1) Sort faces\n" + " 2) Build patches\n" + " 3) Build borders\n" + " 4) Build levels\n\n" + " If you use the step option, all other parameters MUST stay the same\n\n"; + +} + +void FirstStep(const string &crudefile, const string &output, + unsigned int patch_size, unsigned int patch_threshold, + float scaling, unsigned int optimization_steps) { + Crude crude; + + if(!crude.Load(crudefile, true)) { + cerr << "Could not open crude input: " << crudefile << endl; + exit(0); + } + + if(patch_size > crude.vert.Size()/2) { + cerr << "Patch size too big: " << patch_size << " * 2 > " + << crude.vert.Size() << endl; + exit(0); + } + + if(patch_threshold == 0xffffffff) + patch_threshold = patch_size/4; + + + VChain vchain; + + VFile face_remap; + if(!face_remap.Create(output + ".rmf")) { + cerr << "Could not create remap files: " << output << ".rmf\n"; + exit(0); + } + face_remap.Resize(crude.Faces()); + + VFile baricenters; + if(!baricenters.Create(output + string(".bvr"))) { + cerr << "Could not create temporary baricenters file\n"; + exit(0); + } + baricenters.Resize(crude.Faces()); + for(unsigned int i = 0; i < crude.Faces(); i++) { + baricenters[i] = crude.GetBari(i); + } + + BlockIndex face_index; + + Remap(vchain, baricenters, face_remap, face_index, + patch_size, patch_threshold, 65000, scaling, + optimization_steps); + + if(!vchain.Save(output + ".vchain")) { + cerr << "Could not save file: " << output << ".vchain\n"; + exit(0); + } + if(!face_index.Save(output + ".rmi")) { + cerr << "Could not save file: " << output << ".rmi\n"; + exit(0); + } + + baricenters.Delete(); +} + +int main(int argc, char *argv[]) { + + /* Parameters: */ + unsigned int patch_size = 1000; //step 0 + unsigned int patch_threshold = 0xffffffff; //Step 0 + float scaling = 0.5; //step 0, 4 + unsigned int optimization_steps = 5; //step 0, 4 + + Decimation decimation = CLUSTER; //step 4 + unsigned int max_level = 0xffffffff; //step 4 + + unsigned int ram_buffer = 128000000; //step 2, 3, 4 + unsigned int chunk_size = 1024; //step 2, 3, 4 + int step = -1; //means all of them. + + int option; + while((option = getopt(argc, argv, "f:t:l:s:d:o:b:c:p:")) != EOF) { + switch(option) { + case 'f': patch_size = atoi(optarg); + if(patch_size == 0 || patch_size > 32000) { + cerr << "Invalid number of faces per patch: " << optarg << endl; + return -1; + } + break; + case 't': patch_threshold = atoi(optarg); + if(patch_threshold == 0 || patch_threshold > patch_size) { + cerr << "Invalid patch threshold: " << optarg << endl; + return -1; + } + break; + case 'l': max_level = atoi(optarg); + if(max_level == 0) { + cerr << "Invalid number of levels: " << optarg << endl; + return -1; + } + break; + case 's': scaling = (float)atof(optarg); + if(scaling <= 0 || scaling >= 1) { + cerr << "Invalid scaling: " << optarg << endl; + cerr << "Must be 0 < scaling < 1" << endl; + } + break; + case 'd': + if(!strcmp("quadric", optarg)) + decimation = QUADRIC; + else if(!strcmp("cluster", optarg)) + decimation = CLUSTER; + else { + cerr << "Unknown decimation method: " << optarg << endl; + return -1; + } + break; + case 'o': optimization_steps = atoi(optarg); break; + case 'p': step = atoi(optarg); break; + case 'b': ram_buffer = atoi(optarg); + if(ram_buffer == 0) { + cerr << "Invalid ram buffer: " << optarg << endl; + return -1; + } + break; + case 'c': chunk_size = atoi(optarg); + if(chunk_size == 0) { + cerr << "Invalid chunk size: " << optarg << endl; + return -1; + } + break; + default: cerr << "Unknown option: " << (char)option << endl; + return -1; + } + } + + if(optind != argc -2) { + usage(); + return -1; + } + string crudefile = argv[optind]; + string output = argv[optind+1]; + + if(step < 0 || step == 0) + FirstStep(crudefile, output, patch_size, patch_threshold, + scaling, optimization_steps); + + return 0; +} +