170 lines
5.2 KiB
C++
170 lines
5.2 KiB
C++
/****************************************************************************
|
|
* 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.13 2005/02/19 12:06:55 ponchio
|
|
Debug...
|
|
|
|
Revision 1.12 2005/02/19 10:45:05 ponchio
|
|
Patch generalized and small fixes.
|
|
|
|
Revision 1.11 2005/02/08 12:43:03 ponchio
|
|
Added copyright
|
|
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef NXS_PATCH_H
|
|
#define NXS_PATCH_H
|
|
|
|
#include <vcg/space/point3.h>
|
|
#include <vcg/space/sphere3.h>
|
|
|
|
namespace nxs {
|
|
|
|
struct Signature {
|
|
|
|
enum Face { TRIANGLES = 1, STRIPS = 2, TETRAS = 3, SLICE = 4 };
|
|
|
|
enum Vert { POINT2F = 1, POINT2D = 2,
|
|
POINT3F = 2, POINT3D = 3,
|
|
POINT4F = 4, POINT4D = 5 };
|
|
|
|
enum Compr { LZO = 1 };
|
|
|
|
unsigned char face;
|
|
unsigned char vert;
|
|
unsigned char compr;
|
|
unsigned char future; //who knows...
|
|
|
|
unsigned char fcolor;
|
|
unsigned char fnorm;
|
|
unsigned char ftext;
|
|
unsigned char fdata;
|
|
|
|
unsigned char vcolor;
|
|
unsigned char vnorm;
|
|
unsigned char vtext;
|
|
unsigned char vdata;
|
|
|
|
Signature(): face(1), vert(2), compr(0), future(0),
|
|
fcolor(0), fnorm(0), ftext(0), fdata(0),
|
|
vcolor(0), vnorm(0), vtext(0), vdata(0) {}
|
|
};
|
|
|
|
|
|
struct Encoding {
|
|
|
|
unsigned char bytes; //size per element
|
|
unsigned char comps; //number of components
|
|
void (*pack)(char *start, unsigned int nelem);
|
|
void (*unpack)(char *start, unsigned int nelem);
|
|
|
|
unsigned int size(unsigned short n) {
|
|
unsigned int s = (int)n * (int)bytes * (int)comps;
|
|
//padding a 8 bytes
|
|
if((s & 0x0000007) != 0) {
|
|
s>>=3; s++; s<<=3;
|
|
}
|
|
return s;
|
|
}
|
|
};
|
|
|
|
struct Encodings {
|
|
enum Name { EMPTY = 0,
|
|
BYTE1 = 1, SHORT1 = 2, FLOAT1 = 3, DOUBLE1 = 4,
|
|
BYTE2 = 5, SHORT2 = 6, FLOAT2 = 7, DOUBLE2 = 8,
|
|
BYTE3 = 9, SHORT3 = 10, FLOAT3 = 11, DOUBLE3 = 12,
|
|
BYTE4 = 13, SHORT4 = 14, FLOAT4 = 15, DOUBLE4 = 16 };
|
|
Encodings();
|
|
Encoding &operator[](int n) { return e[n]; }
|
|
protected:
|
|
Encoding e[17];
|
|
|
|
|
|
};
|
|
|
|
class Patch {
|
|
public:
|
|
|
|
static Encodings encodings;
|
|
|
|
Patch(Signature &signature, char *s,
|
|
unsigned short nv, unsigned short nf);
|
|
|
|
void Init(Signature &signature, unsigned short nv, unsigned short nf);
|
|
|
|
vcg::Point3f *Vert3fBegin() { return (vcg::Point3f *)vstart; }
|
|
vcg::Point3f &Vert3f(int n) { return Vert3fBegin()[n]; }
|
|
unsigned short *FaceBegin() { return (unsigned short *)fstart; }
|
|
unsigned short *Face(int n) { return FaceBegin() + 3 * n; }
|
|
|
|
//vcg::Point3f &Vert(unsigned short v) { return VertBegin()[v]; }
|
|
// unsigned short *Face(unsigned short f) { return FaceBegin() + f * 3; }
|
|
|
|
char *VColorBegin() { return vstartc; }
|
|
char *VNormBegin() { return vstartn; }
|
|
char *VTextBegin() { return vstartt; }
|
|
char *VDataBegin() { return vstartd; }
|
|
|
|
char *FColorBegin() { return fstartc; }
|
|
char *FNormBegin() { return fstartn; }
|
|
char *FTextBegin() { return fstartt; }
|
|
char *FDataBegin() { return fstartd; }
|
|
|
|
static unsigned int ChunkSize(Signature &signature,
|
|
unsigned short nvert,
|
|
unsigned short nface,
|
|
unsigned int chunk_size);
|
|
|
|
static unsigned int ByteSize(Signature &signature,
|
|
unsigned short nvert,
|
|
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 *fstart;
|
|
char *vstart;
|
|
|
|
unsigned short nf;
|
|
unsigned short nv;
|
|
|
|
char *fstartc;
|
|
char *fstartn;
|
|
char *fstartt;
|
|
char *fstartd;
|
|
|
|
char *vstartc;
|
|
char *vstartn;
|
|
char *vstartt;
|
|
char *vstartd;
|
|
};
|
|
|
|
} //namespace
|
|
|
|
#endif
|