#include "Simplify.h"
#include <stdio.h>
#include <time.h>
void showHelp(const char * argv[]) {
const char *cstr = (argv[0]);
printf("Usage: %s <input> <output> <ratio> <agressiveness)\n", cstr);
printf(" Input: name of existing OBJ format mesh\n");
printf(" Output: name for decimated OBJ format mesh\n");
printf(" Ratio: (default = 0.5) for example 0.2 will decimate 80%% of triangles\n");
printf(" Agressiveness: (default = 7.0) faster or better decimation\n");
printf("Examples :\n");
#if defined(_WIN64) || defined(_WIN32)
printf(" %s c:\\dir\\in.obj c:\\dir\\out.obj 0.2\n", cstr);
#else
printf(" %s ~/dir/in.obj ~/dir/out.obj 0.2\n", cstr);
#endif
} //showHelp()
#include "tinydir.h"
std::vector<tinydir_file>GetObjs(const std::string &dirpath)
{
std::vector<tinydir_file> files;
tinydir_dir dir;
memset(&dir, 0, sizeof(tinydir_dir));
tinydir_open(&dir, dirpath.c_str());
tinydir_file file;
memset(&file, 0, sizeof(tinydir_file));
while (dir.has_next)
{
tinydir_readfile(&dir, &file);
if(!file.is_dir&& _stricmp(file.extension, "obj") == 0)
files.push_back(file);
if (tinydir_next(&dir) == -1)
break;
}
tinydir_close(&dir);
return files;
}
int mutilmain(int argc, const char * argv[])
{
if (argc < 3) {
showHelp(argv);
return EXIT_SUCCESS;
}
std::vector<tinydir_file> files = GetObjs("D:\\tmp\\data\\OBJ-16-2");
for (size_t i = 0; i < files.size(); i++)
{
std::string filepaaa = files[i].path;
Simplify::load_obj(filepaaa.c_str(), true);
if ((Simplify::triangles.size() < 3) || (Simplify::vertices.size() < 3))
return EXIT_FAILURE;
int target_count = Simplify::triangles.size() >> 1;
argv[3] = "0.05";
if (argc > 3) {
float reduceFraction = atof(argv[3]);
if (reduceFraction > 1.0) reduceFraction = 1.0; //lossless only
if (reduceFraction <= 0.0) {
printf("Ratio must be BETWEEN zero and one.\n");
return EXIT_FAILURE;
}
target_count = round((float)Simplify::triangles.size() * atof(argv[3]));
}
if (target_count < 4) {
printf("Object will not survive such extreme decimation\n");
return EXIT_FAILURE;
}
double agressiveness = 7.0;
if (argc > 4) {
agressiveness = atof(argv[4]);
}
clock_t start = clock();
printf("Input: %zu vertices, %zu triangles (target %d)\n", Simplify::vertices.size(), Simplify::triangles.size(), target_count);
int startSize = Simplify::triangles.size();
Simplify::simplify_mesh(target_count, 32, true);
//Simplify::simplify_mesh_lossless( true);
if (Simplify::triangles.size() >= startSize) {
printf("Unable to reduce mesh.\n");
return EXIT_FAILURE;
}
std::string outfilepath = "D:\\tmp\\data\\OBJ-16-2QMS20\\";//
outfilepath = outfilepath.append(files[i].name);
Simplify::write_obj(outfilepath.c_str());
printf("Output: %zu vertices, %zu triangles (%f reduction; %.4f sec)\n", Simplify::vertices.size(), Simplify::triangles.size()
, (float)Simplify::triangles.size() / (float)startSize, ((float)(clock() - start)) / CLOCKS_PER_SEC);
}
return EXIT_SUCCESS;
}
int main(int argc, const char * argv[]) {
return mutilmain(argc, argv);
if (argc < 3) {
showHelp(argv);
return EXIT_SUCCESS;
}
/*argv[1] = "D:\\tmp\\data\\OBJ-16-2\\Tile_+029_+031.obj";
argv[2] = "D:\\tmp\\data\\OBJ-16-2\\Tile_+029_+031_0.1.obj";
argv[3] = "0.1";*/
Simplify::load_obj(argv[1],true);
if ((Simplify::triangles.size() < 3) || (Simplify::vertices.size() < 3))
return EXIT_FAILURE;
int target_count = Simplify::triangles.size() >> 1;
if (argc > 3) {
float reduceFraction = atof(argv[3]);
if (reduceFraction > 1.0) reduceFraction = 1.0; //lossless only
if (reduceFraction <= 0.0) {
printf("Ratio must be BETWEEN zero and one.\n");
return EXIT_FAILURE;
}
target_count = round((float)Simplify::triangles.size() * atof(argv[3]));
}
if (target_count < 4) {
printf("Object will not survive such extreme decimation\n");
return EXIT_FAILURE;
}
double agressiveness = 7.0;
if (argc > 4) {
agressiveness = atof(argv[4]);
}
clock_t start = clock();
printf("Input: %zu vertices, %zu triangles (target %d)\n", Simplify::vertices.size(), Simplify::triangles.size(), target_count);
int startSize = Simplify::triangles.size();
Simplify::simplify_mesh(target_count, 7, true);
//Simplify::simplify_mesh_lossless( true);
if ( Simplify::triangles.size() >= startSize) {
printf("Unable to reduce mesh.\n");
return EXIT_FAILURE;
}
Simplify::write_obj(argv[2]);
printf("Output: %zu vertices, %zu triangles (%f reduction; %.4f sec)\n",Simplify::vertices.size(), Simplify::triangles.size()
, (float)Simplify::triangles.size()/ (float) startSize , ((float)(clock()-start))/CLOCKS_PER_SEC );
return EXIT_SUCCESS;
}
评论0