vcglib/apps/nexus/patch.h

69 lines
1.6 KiB
C
Raw Normal View History

2004-07-02 15:00:02 +02:00
#ifndef NXS_PATCH_H
#define NXS_PATCH_H
#include <vcg/space/point3.h>
2004-07-02 19:42:43 +02:00
#include <iostream>
2004-07-02 15:00:02 +02:00
namespace nxs {
struct Chunk {
unsigned char p[4096];
};
class Patch {
public:
Patch(Chunk *s = NULL, unsigned short nv = 0, unsigned short nf = 0):
start(s) {
Resize(nv, nf);
}
2004-07-02 15:00:02 +02:00
void Resize(unsigned short nv, unsigned short nf) {
nvert = nv;
nface = nf;
fstart = (unsigned short *)(((char *)start) +
VertSize() * sizeof(vcg::Point3f));
}
unsigned short VertSize() { return nvert; }
2004-07-02 15:00:02 +02:00
vcg::Point3f *VertBegin() { return (vcg::Point3f *)(start); }
2004-07-02 15:00:02 +02:00
unsigned short FaceSize() { return nface; }
2004-07-02 15:00:02 +02:00
unsigned short *FaceBegin() { return fstart; }
2004-07-02 15:00:02 +02:00
vcg::Point3f &Vert(unsigned int v) { return VertBegin()[v]; }
2004-07-02 19:42:43 +02:00
unsigned short *Face(unsigned int f) { return FaceBegin() + f * 3; }
2004-07-02 19:42:43 +02:00
unsigned int ChunkSize() { return ChunkSize(VertSize(), FaceSize()); }
2004-07-02 19:42:43 +02:00
unsigned int ByteSize() { return ByteSize(VertSize(), FaceSize()); }
2004-07-02 15:00:02 +02:00
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);
return size;
}
2004-07-02 19:42:43 +02:00
// private:
2004-07-02 15:00:02 +02:00
Chunk *start;
unsigned short *fstart;
unsigned short nvert;
unsigned short nface;
2004-07-02 15:00:02 +02:00
};
};
#endif