Added compression and debugged.

This commit is contained in:
Federico Ponchio 2004-10-10 17:19:42 +00:00
parent b3f9365d70
commit d1a97fec8d
11 changed files with 222 additions and 83 deletions

View File

@ -11,7 +11,7 @@ Nexus::~Nexus() {
Close(); Close();
} }
bool Nexus::Create(const string &file, Signature sig) { bool Nexus::Create(const string &file, Signature sig, unsigned int c_size) {
index_file = fopen((file + ".nxs").c_str(), "wb+"); index_file = fopen((file + ".nxs").c_str(), "wb+");
if(!index_file) { if(!index_file) {
cerr << "Could not create file: " << file << ".nxs\n"; cerr << "Could not create file: " << file << ".nxs\n";
@ -25,7 +25,7 @@ bool Nexus::Create(const string &file, Signature sig) {
index.clear(); index.clear();
chunk_size = 1024; chunk_size = c_size;
if(!patches.Create(file + ".nxp", signature, chunk_size)) { if(!patches.Create(file + ".nxp", signature, chunk_size)) {
cerr << "Could not create file: " << file << ".nxp" << endl; cerr << "Could not create file: " << file << ".nxp" << endl;
@ -96,6 +96,9 @@ bool Nexus::Load(const string &file, bool readonly) {
} }
void Nexus::Close() { void Nexus::Close() {
patches.Close();
borders.Close();
if(!index_file) return; if(!index_file) return;
rewind(index_file); rewind(index_file);
@ -131,9 +134,6 @@ void Nexus::Close() {
fclose(index_file); fclose(index_file);
index_file = NULL; index_file = NULL;
patches.Close();
borders.Close();
} }
Patch &Nexus::GetPatch(unsigned int patch, bool flush) { Patch &Nexus::GetPatch(unsigned int patch, bool flush) {

View File

@ -50,7 +50,8 @@ class Nexus {
Nexus(); Nexus();
virtual ~Nexus(); virtual ~Nexus();
bool Create(const std::string &filename, Signature signature); bool Create(const std::string &filename, Signature signature,
unsigned int chunk_size = 1024);
virtual bool Load(const std::string &filename, bool readonly = false); virtual bool Load(const std::string &filename, bool readonly = false);
virtual void Close(); virtual void Close();
@ -77,6 +78,7 @@ class Nexus {
/* Nexus data */ /* Nexus data */
//BE CAREFUL: this 2 members get replicated into patchserver //BE CAREFUL: this 2 members get replicated into patchserver
//TODO fix this nasty thing it is dangerous as it is.
Signature signature; Signature signature;
unsigned int chunk_size; unsigned int chunk_size;

View File

@ -41,8 +41,8 @@ NexusMt::NexusMt(): vbo(VBO_AUTO), vbo_size(0),
NexusMt::~NexusMt() {} NexusMt::~NexusMt() {}
bool NexusMt::Load(const string &filename) { bool NexusMt::Load(const string &filename, bool readonly) {
if(!Nexus::Load(filename)) return false; if(!Nexus::Load(filename, readonly)) return false;
LoadHistory(); LoadHistory();
use_colors = false; use_colors = false;

View File

@ -83,7 +83,7 @@ class NexusMt: public Nexus {
NexusMt(); NexusMt();
~NexusMt(); ~NexusMt();
bool Load(const std::string &filename); bool Load(const std::string &filename, bool readonly = true);
bool InitGL(); bool InitGL();
void Render(); void Render();

View File

@ -30,6 +30,8 @@ int main(int argc, char *argv[]) {
string output; string output;
string plysource; string plysource;
bool info = false; bool info = false;
unsigned int ram_size = 128000000;
unsigned int chunk_size = 0;
unsigned int add = 0; unsigned int add = 0;
bool add_strip = false; bool add_strip = false;
@ -53,7 +55,7 @@ int main(int argc, char *argv[]) {
float qtexture = 0; float qtexture = 0;
int option; int option;
while((option = getopt(argc, argv, "io:a:r:zxv:n:c:t:")) != EOF) { while((option = getopt(argc, argv, "io:a:r:zxv:n:k:t:b:c:")) != EOF) {
switch(option) { switch(option) {
case 'i': info = true; break; case 'i': info = true; break;
case 'o': output = optarg; break; case 'o': output = optarg; break;
@ -135,7 +137,7 @@ int main(int argc, char *argv[]) {
return -1; return -1;
} }
break; break;
case 'c': qcolor = atof(optarg); case 'k': qcolor = atof(optarg);
if(qcolor == 0) { if(qcolor == 0) {
cerr << "Invalid value for quantization: " << optarg << endl; cerr << "Invalid value for quantization: " << optarg << endl;
return -1; return -1;
@ -147,7 +149,18 @@ int main(int argc, char *argv[]) {
return -1; return -1;
} }
break; break;
case 'b': ram_size = atoi(optarg);
if(ram_size == 0) {
cerr << "Invalid ram_size: " << 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; default: cerr << "Unknown option: " << (char)option << endl;
return -1; return -1;
} }
@ -177,11 +190,13 @@ int main(int argc, char *argv[]) {
Nexus nexus; Nexus nexus;
if(!nexus.Load(input)) { nexus.patches.SetRamBufferSize(ram_size);
if(!nexus.Load(input, true)) {
cerr << "Could not open nexus file: " << input << ".mt\n"; cerr << "Could not open nexus file: " << input << ".mt\n";
return -1; return -1;
} }
//Sanity tests //Sanity tests
if(remove_strip && !(nexus.signature & NXS_STRIP)) { if(remove_strip && !(nexus.signature & NXS_STRIP)) {
cerr << "Nexus file does not have strips\n"; cerr << "Nexus file does not have strips\n";
@ -226,7 +241,9 @@ int main(int argc, char *argv[]) {
<< "\n\tData : " << (int)((nexus.signature&NXS_DATA32) !=0) << "\n\tData : " << (int)((nexus.signature&NXS_DATA32) !=0)
<< "\n\n\tVertices: " << nexus.totvert << "\n\n\tVertices: " << nexus.totvert
<< "\tFaces: " << nexus.totface << "\tFaces: " << nexus.totface
<< "\tPatches: " << nexus.index.size() << "\n\n"; << "\tPatches: " << nexus.index.size()
<< "\nChunk size " << nexus.chunk_size << endl;
} }
//determine if we must proceed: //determine if we must proceed:
@ -239,15 +256,24 @@ int main(int argc, char *argv[]) {
unsigned int signature = nexus.signature; unsigned int signature = nexus.signature;
signature |= add; signature |= add;
signature &= ~remove; signature &= ~remove;
if(compress) signature |= NXS_COMPRESSED;
if(uncompress) signature &= ~NXS_COMPRESSED;
if(!output.size()) output = input + getSuffix(signature); if(!output.size()) output = input + getSuffix(signature);
cerr << "Writing to nexus: " << output << endl;
Nexus out; Nexus out;
if(!out.Create(output, (Signature)signature)) { out.patches.SetRamBufferSize(ram_size);
if(!chunk_size)
chunk_size = nexus.patches.chunk_size;
if(!out.Create(output, (Signature)signature, chunk_size)) {
cerr << "Could not open output: " << output << endl; cerr << "Could not open output: " << output << endl;
return -1; return -1;
} }
for(unsigned int patch = 0; patch < nexus.index.size(); patch++) { for(unsigned int patch = 0; patch < nexus.index.size(); patch++) {
Nexus::PatchInfo &src_entry = nexus.index[patch]; Nexus::PatchInfo &src_entry = nexus.index[patch];
Patch src_patch = nexus.GetPatch(patch); Patch src_patch = nexus.GetPatch(patch);

View File

@ -1,7 +1,11 @@
#include "patch.h" #include "patch.h"
#include <lzo1x.h>
#include <iostream>
using namespace std;
using namespace nxs; using namespace nxs;
static double wrkmem[LZO1X_999_MEM_COMPRESS/sizeof(double) +1];
void pad(unsigned int &size) { void pad(unsigned int &size) {
while(size&0x3) size++; while(size&0x3) size++;
} }
@ -46,27 +50,6 @@ void Patch::Init(Signature signature,
dstart = tstart + nv; dstart = tstart + nv;
else else
dstart = tstart; dstart = tstart;
/* cstart = nv * sizeof(float) * 3;
if(signature & NXS_COLORS)
nstart = cstart + nv * sizeof(unsigned int);
else
nstart = cstart;
if(signature & NXS_NORMALS_SHORT)
tstart = nstart + nv * sizeof(short) * 4;
else if(signature & NXS_NORMALS_FLOAT)
tstart = nstart + nv * sizeof(float) * 3;
else
tstart = nstart;
if(signature & NXS_TEXTURES_SHORT)
dstart = tstart + nv * sizeof(short) * 2;
else if(signature & NXS_TEXTURES_FLOAT)
dstart = tstart + nv * sizeof(float) * 2;
else
dstart = tstart;*/
} }
unsigned int Patch::ChunkSize(Signature signature, unsigned int Patch::ChunkSize(Signature signature,
@ -126,3 +109,47 @@ unsigned int Patch::ByteSize(Signature signature,
return size; return size;
} }
char *Patch::Compress(unsigned int ram_size, unsigned int &size) {
//TODO use OVERLAP and test speed
//TODO fill chunk padding with zeroes?
//TODO compress only used memory!
size = ram_size + ram_size/64 + 23;
char *buffer = new char[size];
lzo1x_1_compress(((unsigned char *)start), ram_size,
(unsigned char *)buffer + sizeof(int), &size,
(char *)wrkmem);
*(int *)buffer = size;
size += sizeof(int);
// memcpy(buffer, start, ram_size);
// size = ram_size;
//TODO optimize!
// lzo1x_optimize((unsigned char *)entry.patch->start,
// entry.ram_size * chunk_size,
// compressed, &compressed_size, NULL);
return buffer;
}
void Patch::Decompress(unsigned int ram_size, void *src, unsigned int src_sz) {
unsigned int size = *(int *)src;
assert(size < src_sz + sizeof(int));
unsigned int dst_size = ram_size;
// memcpy(start, src, ram_size);
int ret = lzo1x_decompress_safe(((unsigned char *)src) + sizeof(int), size,
(unsigned char *)start, &dst_size, 0);
if(ret != 0) {
cerr << "Ret from decompress: " << ret << endl;
exit(-1);
}
assert(dst_size == ram_size);
//TODO add 3 to start... so we can use asm_fast decompressor
}

View File

@ -50,12 +50,14 @@ class Patch {
unsigned short nvert, unsigned short nvert,
unsigned short nface); unsigned short nface);
char *Compress(unsigned int ram_size, unsigned int &size);
void Decompress(unsigned int ram_size, void *src, unsigned int src_sz);
char *start;
unsigned short nv; unsigned short nv;
unsigned short nf; unsigned short nf;
char *start;
float *vstart; float *vstart;
//these offset are from vstart! //these offset are from vstart!
unsigned short cstart; unsigned short cstart;

View File

@ -1,5 +1,4 @@
#include "patchserver.h" #include "patchserver.h"
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
@ -8,6 +7,12 @@ using namespace nxs;
//TODO support compression! //TODO support compression!
void outbuffer(unsigned char *b, unsigned int s) {
for(unsigned int i = 0; i < s; i++)
cerr << (unsigned int)b[i];
cerr << endl;
}
bool PatchServer::Create(const std::string &filename, bool PatchServer::Create(const std::string &filename,
Signature sig, Signature sig,
@ -47,8 +52,8 @@ bool PatchServer::ReadEntries(FILE *fp) {
for(unsigned int i = 0; i < n; i++) { for(unsigned int i = 0; i < n; i++) {
patches[i].patch = NULL; patches[i].patch = NULL;
fread(&(patches[i].patch_start), 1, sizeof(unsigned int), fp); fread(&(patches[i].patch_start), 1, sizeof(unsigned int), fp);
fread(&(patches[i].patch_size), 1, sizeof(unsigned short), fp); fread(&(patches[i].ram_size), 1, sizeof(unsigned short), fp);
fread(&(patches[i].ram_used), 1, sizeof(unsigned short), fp); fread(&(patches[i].disk_size), 1, sizeof(unsigned short), fp);
patches[i].lru_pos = 0xffffffff; patches[i].lru_pos = 0xffffffff;
} }
return true; return true;
@ -59,8 +64,8 @@ bool PatchServer::WriteEntries(FILE *fp) {
fwrite(&n, 1, sizeof(int), fp); fwrite(&n, 1, sizeof(int), fp);
for(unsigned int i = 0; i < patches.size(); i++) { for(unsigned int i = 0; i < patches.size(); i++) {
fwrite(&(patches[i].patch_start), 1, sizeof(unsigned int), fp); fwrite(&(patches[i].patch_start), 1, sizeof(unsigned int), fp);
fwrite(&(patches[i].patch_size), 1, sizeof(unsigned short), fp); fwrite(&(patches[i].ram_size), 1, sizeof(unsigned short), fp);
fwrite(&(patches[i].ram_used), 1, sizeof(unsigned short), fp); fwrite(&(patches[i].disk_size), 1, sizeof(unsigned short), fp);
} }
return true; return true;
} }
@ -68,37 +73,64 @@ bool PatchServer::WriteEntries(FILE *fp) {
void PatchServer::AddPatch(unsigned short nvert, unsigned short nface) { void PatchServer::AddPatch(unsigned short nvert, unsigned short nface) {
PatchEntry entry; PatchEntry entry;
entry.patch = NULL; entry.patch = NULL;
entry.patch_start = Length()/chunk_size; entry.ram_size = Patch::ChunkSize(signature, nvert, nface, chunk_size);
entry.patch_size = Patch::ChunkSize(signature, nvert, nface, chunk_size);
entry.ram_used = entry.patch_size; //if compressed we do not allocate space now (how much anyway?)
// if((signature & NXS_COMPRESSED) != 0) {
entry.disk_size = 0xffff;
entry.patch_start = 0xffffffff;
/* } else {
entry.disk_size = entry.ram_size;
entry.patch_start = Length()/chunk_size;
Redim(Length() + entry.disk_size * chunk_size);
}*/
entry.lru_pos = 0xffffffff; entry.lru_pos = 0xffffffff;
patches.push_back(entry); patches.push_back(entry);
Redim(Length() + entry.patch_size * chunk_size);
} }
Patch &PatchServer::GetPatch(unsigned int idx, Patch &PatchServer::GetPatch(unsigned int idx,
unsigned short nvert, unsigned short nface, unsigned short nvert, unsigned short nface,
bool flush) { bool flush) {
assert(idx < patches.size()); assert(idx < patches.size());
PatchEntry &entry = patches[idx]; PatchEntry &entry = patches[idx];
if(entry.patch) { if(entry.patch) { //already on buffer
assert(entry.lru_pos < lru.size()); assert(entry.lru_pos < lru.size());
assert(lru[entry.lru_pos].patch == idx); assert(lru[entry.lru_pos].patch == idx);
lru[entry.lru_pos].frame = frame++; lru[entry.lru_pos].frame = frame++;
} else { } else {
SetPosition(entry.patch_start * chunk_size);
assert(entry.patch_size != 0); assert(entry.lru_pos == 0xffffffff);
char *start = new char[entry.patch_size * chunk_size]; if(flush) Flush();
ReadBuffer(start, entry.patch_size * chunk_size);
char *ram = new char[entry.ram_size * chunk_size];
entry.patch = new Patch(signature, ram, nvert, nface);
if(entry.patch_start != 0xffffffff) { //was allocated.
assert(entry.disk_size != 0xffff);
SetPosition(entry.patch_start * chunk_size);
if((signature & NXS_COMPRESSED) == 0) { //not compressed
ReadBuffer(ram, entry.disk_size * chunk_size);
} else {
unsigned char *disk = new unsigned char[entry.disk_size * chunk_size];
ReadBuffer(disk, entry.disk_size * chunk_size);
entry.patch->Decompress(entry.ram_size * chunk_size,
disk, entry.disk_size * chunk_size);
delete []disk;
}
}
entry.patch = new Patch(signature, start, nvert, nface);
entry.lru_pos = lru.size(); entry.lru_pos = lru.size();
lru.push_back(PTime(idx, frame++)); lru.push_back(PTime(idx, frame++));
ram_used += entry.ram_used; ram_used += entry.ram_size;
} }
//avoid frame overflow! //avoid frame overflow!
@ -112,27 +144,23 @@ Patch &PatchServer::GetPatch(unsigned int idx,
for(unsigned int i = 0; i < lru.size(); i++) for(unsigned int i = 0; i < lru.size(); i++)
patches[lru[i].patch].lru_pos = i; patches[lru[i].patch].lru_pos = i;
} }
if(flush && ram_used > ram_size * 1.1)
Flush();
return *(entry.patch); return *(entry.patch);
} }
void PatchServer::Flush() { void PatchServer::Flush() {
cerr << "FLUSHING\n\n\n n";
cerr << "ram_size: " << ram_size << endl; if(ram_used < ram_size * 1.5) return;
cerr << "ram_used: " << ram_used << endl;
make_heap(lru.begin(), lru.end()); make_heap(lru.begin(), lru.end());
for(unsigned int i = 0; i < lru.size(); i++)
patches[lru[i].patch].lru_pos = i;
while(ram_used > ram_size) { while(ram_used > ram_size) {
pop_heap(lru.begin(), lru.end()); pop_heap(lru.begin(), lru.end());
PTime &ptime = lru.back(); PTime &ptime = lru.back();
Flush(ptime.patch); Flush(ptime.patch);
lru.pop_back(); lru.pop_back();
} }
make_heap(lru.begin(), lru.end());
for(unsigned int i = 0; i < lru.size(); i++) for(unsigned int i = 0; i < lru.size(); i++)
patches[lru[i].patch].lru_pos = i; patches[lru[i].patch].lru_pos = i;
} }
@ -146,19 +174,53 @@ void PatchServer::FlushAll() {
lru.clear(); lru.clear();
} }
void PatchServer::Flush(unsigned int patch) { void PatchServer::Flush(unsigned int patch) {
PatchEntry &entry = patches[patch]; PatchEntry &entry = patches[patch];
assert(entry.patch); assert(entry.patch);
if(!readonly) { //write back patch if(!readonly) { //write back patch
SetPosition(entry.patch_start * chunk_size);
WriteBuffer(entry.patch->start, entry.patch_size * chunk_size);
if((signature & NXS_COMPRESSED)) {
unsigned int compressed_size;
char *compressed = entry.patch->Compress(entry.ram_size * chunk_size,
compressed_size);
if(entry.disk_size == 0xffff) {//allocate space
assert(entry.patch_start == 0xffffffff);
entry.disk_size = (unsigned int)((compressed_size-1)/chunk_size) + 1;
entry.patch_start = Length()/chunk_size;
Redim(Length() + entry.disk_size * chunk_size);
} else {
cerr << "OOOOPSPPPS not supported!" << endl;
exit(-1);
}
cerr << "Ram size: " << entry.ram_size << endl;
cerr << "Disk size: " << entry.disk_size << endl;
SetPosition(entry.patch_start * chunk_size);
WriteBuffer(compressed, entry.disk_size * chunk_size);
delete []compressed;
} else {
if(entry.disk_size == 0xffff) {
entry.disk_size = entry.ram_size;
entry.patch_start = Length()/chunk_size;
Redim(Length() + entry.disk_size * chunk_size);
}
SetPosition(entry.patch_start * chunk_size);
WriteBuffer(entry.patch->start, entry.disk_size * chunk_size);
}
/* FILE *fo = fopen("tmp", "wb+");
fwrite(entry.patch->start, 1, entry.disk_size * chunk_size, fo);
fclose(fo);
exit(0);*/
} }
delete [](entry.patch->start); delete [](entry.patch->start);
delete entry.patch; delete entry.patch;
entry.patch = NULL; entry.patch = NULL;
entry.lru_pos = 0xffffffff; entry.lru_pos = 0xffffffff;
ram_used -= entry.ram_used; ram_used -= entry.ram_size;
}
void PatchServer::SetRamBufferSize(unsigned int r_buffer) {
ram_size = (unsigned int)(r_buffer/chunk_size) + 1;
} }

View File

@ -11,8 +11,8 @@ namespace nxs {
struct PatchEntry { struct PatchEntry {
Patch *patch; Patch *patch;
unsigned int patch_start; //granularita' Chunk unsigned int patch_start; //granularita' Chunk
unsigned short patch_size; //in chunks unsigned short ram_size; //in chunks
unsigned short ram_used; // in chunks (used when compressed) unsigned short disk_size; // in chunks (used when compressed)
unsigned int lru_pos; unsigned int lru_pos;
}; };
@ -25,7 +25,7 @@ class PatchServer: public File {
PTime(unsigned int p = 0xffffffff, unsigned int f = 0xffffffff): PTime(unsigned int p = 0xffffffff, unsigned int f = 0xffffffff):
patch(p), frame(f) {} patch(p), frame(f) {}
bool operator<(const PTime &p) const { return frame < p.frame; } bool operator<(const PTime &p) const { return frame > p.frame; }
}; };
@ -54,6 +54,7 @@ class PatchServer: public File {
void Flush(); void Flush();
void FlushAll(); void FlushAll();
void Flush(unsigned int patch); void Flush(unsigned int patch);
void SetRamBufferSize(unsigned int ram_buffer);
std::vector<PatchEntry> patches; std::vector<PatchEntry> patches;
std::vector<PTime> lru; std::vector<PTime> lru;

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.10 2004/10/09 14:46:47 ponchio
Windows porting small changes.
Revision 1.9 2004/10/08 15:12:04 ponchio Revision 1.9 2004/10/08 15:12:04 ponchio
Working version (maybe) Working version (maybe)
@ -132,7 +135,7 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
if(fcount[i] > min_size) if(fcount[i] > min_size)
seeds.push_back(fine[i]); seeds.push_back(fine[i]);
} }
swap((std::vector<Seed>)fine, seeds); swap(fine, seeds);
if(fine.size() == 0) fine.push_back(Point3f(0,0,0)); if(fine.size() == 0) fine.push_back(Point3f(0,0,0));
fine.Init(); fine.Init();
@ -170,7 +173,7 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
if(ccount[i] > (int)min_size) if(ccount[i] > (int)min_size)
seeds.push_back(coarse[i]); seeds.push_back(coarse[i]);
} }
swap((std::vector<Seed>)coarse, seeds); swap(coarse, seeds);
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0)); if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
coarse.Init(); coarse.Init();
@ -404,7 +407,7 @@ void VoronoiChain::BuildLevel(Nexus &nexus, unsigned int offset,
if(ccount[i] > (int)min_size) if(ccount[i] > (int)min_size)
seeds.push_back(coarse[i]); seeds.push_back(coarse[i]);
} }
swap((vector<Seed>)coarse, seeds); swap(coarse, seeds);
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0)); if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
coarse.Init(); coarse.Init();

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.13 2004/10/09 17:32:25 ponchio
Ram buffer option added (last)
Revision 1.12 2004/10/09 17:29:04 ponchio Revision 1.12 2004/10/09 17:29:04 ponchio
Ram buffer option added (again) Ram buffer option added (again)
@ -131,9 +134,10 @@ int main(int argc, char *argv[]) {
unsigned int max_level = 0xffffffff; unsigned int max_level = 0xffffffff;
float scaling = 0.5; float scaling = 0.5;
unsigned int ram_buffer = 128000000; unsigned int ram_buffer = 128000000;
unsigned int chunk_size = 1024;
int option; int option;
while((option = getopt(argc, argv, "f:t:l:s:d:ro:b:")) != EOF) { while((option = getopt(argc, argv, "f:t:l:s:d:ro:b:c:")) != EOF) {
switch(option) { switch(option) {
case 'f': patch_size = atoi(optarg); case 'f': patch_size = atoi(optarg);
if(patch_size == 0 || patch_size > 32000) { if(patch_size == 0 || patch_size > 32000) {
@ -171,7 +175,18 @@ int main(int argc, char *argv[]) {
break; break;
case 'r': stop_after_remap = true; break; case 'r': stop_after_remap = true; break;
case 'o': optimization_steps = atoi(optarg); break; case 'o': optimization_steps = atoi(optarg); break;
case 'b': ram_buffer = 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; default: cerr << "Unknown option: " << (char)option << endl;
return -1; return -1;
} }
@ -206,11 +221,12 @@ int main(int argc, char *argv[]) {
string output = argv[optind+1]; string output = argv[optind+1];
Nexus nexus; Nexus nexus;
if(!nexus.Create(output, NXS_FACES)) { nexus.patches.SetRamBufferSize(ram_buffer);
if(!nexus.Create(output, NXS_FACES, chunk_size)) {
cerr << "Could not create nexus output: " << output << endl; cerr << "Could not create nexus output: " << output << endl;
return -1; return -1;
} }
nexus.patches.ram_size = ram_buffer;
if(patch_threshold == 0xffffffff) if(patch_threshold == 0xffffffff)
patch_threshold = patch_size/4; patch_threshold = patch_size/4;