Created.
This commit is contained in:
parent
79c524f436
commit
79d61a5c62
|
|
@ -0,0 +1,55 @@
|
||||||
|
/****************************************************************************
|
||||||
|
* 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 $
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef NXS_BORDER_H
|
||||||
|
#define NXS_BORDER_H
|
||||||
|
|
||||||
|
namespace nxs {
|
||||||
|
|
||||||
|
struct Link {
|
||||||
|
Link(): start_vertex(0xffff), end_vertex(0xffff), end_patch(0xffffffff) {}
|
||||||
|
|
||||||
|
unsigned short start_vertex;
|
||||||
|
unsigned short end_vertex;
|
||||||
|
unsigned int end_patch;
|
||||||
|
bool IsNull() { return start_vertex == 0xffff; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class Border {
|
||||||
|
public:
|
||||||
|
unsigned int Size() { return size; }
|
||||||
|
Link &operator[](unsigned int i) { return start[i]; }
|
||||||
|
private:
|
||||||
|
unsigned short size;
|
||||||
|
Link *start;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "nexus.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace vcg;
|
||||||
|
using namespace nxs;
|
||||||
|
|
||||||
|
Nexus::Nexus(): index_file(NULL) {}
|
||||||
|
Nexus::~Nexus() {
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Nexus::Create(const string &file) {
|
||||||
|
index_file = fopen((file + ".nxs").c_str(), "wb+");
|
||||||
|
if(!index_file) {
|
||||||
|
cerr << "Could not create file: " << file << ".nxs\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
totvert = 0;
|
||||||
|
totface = 0;
|
||||||
|
totchunks = 0;
|
||||||
|
totlinks = 0;
|
||||||
|
sphere = Sphere3f();
|
||||||
|
|
||||||
|
//Important: chunk_size must be 1 so that i can use Region in VFile.
|
||||||
|
if(!patches.Create(file + ".nxp", 1)) {
|
||||||
|
cerr << "Could not create file: " << file << ".nxp" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!borders.Create(file + ".nxb")) {
|
||||||
|
cerr << "Could not create file: " << file << ".nxp" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Nexus::Load(const string &file) {
|
||||||
|
index_file = fopen((file + ".nxs").c_str(), "rb+");
|
||||||
|
if(!index_file) return false;
|
||||||
|
|
||||||
|
unsigned int readed;
|
||||||
|
readed = fread(&totvert, sizeof(unsigned int), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
readed = fread(&totface, sizeof(unsigned int), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
readed = fread(&totchunks, sizeof(unsigned int), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
readed = fread(&totlinks, sizeof(unsigned int), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
readed = fread(&sphere, sizeof(Sphere3f), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
|
||||||
|
unsigned int size; //size of index
|
||||||
|
readed = fread(&size, sizeof(unsigned int), 1, index_file);
|
||||||
|
if(!readed) return false;
|
||||||
|
|
||||||
|
index.resize(size);
|
||||||
|
readed = fread(&index[0], sizeof(Entry), size, index_file);
|
||||||
|
if(readed != size) return false;
|
||||||
|
|
||||||
|
if(!patches.Load(file + ".nxp")) return false;
|
||||||
|
if(!borders.Load(file + ".nxb")) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Nexus::Close() {
|
||||||
|
if(!index_file) return;
|
||||||
|
rewind(index_file);
|
||||||
|
|
||||||
|
fwrite(&totvert, sizeof(unsigned int), 1, index_file);
|
||||||
|
fwrite(&totface, sizeof(unsigned int), 1, index_file);
|
||||||
|
fwrite(&totchunks, sizeof(unsigned int), 1, index_file);
|
||||||
|
fwrite(&totlinks, sizeof(unsigned int), 1, index_file);
|
||||||
|
fwrite(&sphere, sizeof(Sphere3f), 1, index_file);
|
||||||
|
|
||||||
|
unsigned int size = index.size(); //size of index
|
||||||
|
fwrite(&size, sizeof(unsigned int), 1, index_file);
|
||||||
|
fwrite(&index[0], sizeof(Entry), size, index_file);
|
||||||
|
fclose(index_file);
|
||||||
|
patches.Close();
|
||||||
|
borders.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
Patch Nexus::GetPatch(unsigned int patch) {
|
||||||
|
Entry &entry = index[patch];
|
||||||
|
Chunk *start = patches.GetRegion(entry.patch_offset, entry.patch_size);
|
||||||
|
return Patch(start);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef NXS_NEXUS_H
|
||||||
|
#define NXS_NEXUS_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <vcg/space/sphere3.h>
|
||||||
|
#include "vfile.h"
|
||||||
|
#include "patch.h"
|
||||||
|
#include "border.h"
|
||||||
|
|
||||||
|
namespace nxs {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Nexus {
|
||||||
|
public:
|
||||||
|
|
||||||
|
class Entry {
|
||||||
|
public:
|
||||||
|
Entry(): patch_offset(0xffffffff), border_offset(0xffffffff),
|
||||||
|
patch_size(0), border_size(0), sphere(vcg::Sphere3f()) {}
|
||||||
|
unsigned int patch_offset; //granularita' Chunk
|
||||||
|
unsigned int border_offset; //granuralita' Link
|
||||||
|
unsigned short patch_size; //in cuhnks
|
||||||
|
unsigned short border_size; //in Links
|
||||||
|
vcg::Sphere3f sphere;
|
||||||
|
};
|
||||||
|
|
||||||
|
Nexus();
|
||||||
|
~Nexus();
|
||||||
|
bool Create(const std::string &filename);
|
||||||
|
bool Load(const std::string &filename);
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
Patch GetPatch(unsigned int patch);
|
||||||
|
void GetBorder(unsigned int border, Border &border);
|
||||||
|
|
||||||
|
// unsigned int addPatch(Patch *builder);
|
||||||
|
void AddBorder(unsigned int patch, std::vector<Link> &links);
|
||||||
|
|
||||||
|
unsigned int totvert;
|
||||||
|
unsigned int totface;
|
||||||
|
unsigned int totchunks; //number of chunks.
|
||||||
|
unsigned int totlinks;
|
||||||
|
vcg::Sphere3f sphere;
|
||||||
|
|
||||||
|
std::vector<Entry> index;
|
||||||
|
|
||||||
|
FILE *index_file;
|
||||||
|
VFile<Chunk> patches;
|
||||||
|
VFile<Link> borders;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
#ifndef NXS_PATCH_H
|
||||||
|
#define NXS_PATCH_H
|
||||||
|
|
||||||
|
#include <vcg/space/point3.h>
|
||||||
|
|
||||||
|
namespace nxs {
|
||||||
|
|
||||||
|
struct Chunk {
|
||||||
|
unsigned char p[4096];
|
||||||
|
};
|
||||||
|
|
||||||
|
class Patch {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Patch(Chunk *s = NULL): start(s) {}
|
||||||
|
|
||||||
|
unsigned short &VertSize() { return *(unsigned short *)start; }
|
||||||
|
|
||||||
|
vcg::Point3f *VertBegin() {
|
||||||
|
return (vcg::Point3f *)(start + 2*sizeof(short)); }
|
||||||
|
|
||||||
|
unsigned short &FaceSize() { return *(((unsigned short *)start) + 1); }
|
||||||
|
|
||||||
|
unsigned short *FaceBegin() {
|
||||||
|
return (unsigned short *)(start + 2*sizeof(short) +
|
||||||
|
VertSize() * sizeof(vcg::Point3f)); }
|
||||||
|
|
||||||
|
unsigned int ChunkSize() {
|
||||||
|
return ChunkSize(VertSize(), FaceSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ByteSize() {
|
||||||
|
return ByteSize(VertSize(), FaceSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int ChunkSize(unsigned short nvert, unsigned short nface) {
|
||||||
|
unsigned int size = ByteSize(nvert, nface);
|
||||||
|
size = (size/sizeof(Chunk) + 1);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int ByteSize(unsigned short nvert, unsigned short nface) {
|
||||||
|
unsigned int size = nvert * sizeof(vcg::Point3f);
|
||||||
|
size += nface * 3 * sizeof(unsigned short);
|
||||||
|
|
||||||
|
//this condition should really rarely happen but helps save space
|
||||||
|
//during construction
|
||||||
|
if(size < nface * 3 * sizeof(unsigned int))
|
||||||
|
size = nface * 3 * sizeof(unsigned int);
|
||||||
|
|
||||||
|
size = 2 * sizeof(unsigned short);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Chunk *start;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue