58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
#ifndef N_PKNORM_H
|
|
#define N_PKNORM_H
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
a normal packed into 16 bits.
|
|
@author
|
|
- RadonLabs GmbH
|
|
@since
|
|
- 2005.7.06
|
|
@remarks
|
|
- Áö¿Ï Ãß°¡
|
|
*/
|
|
|
|
#include "vector.h"
|
|
|
|
//-------------------------------------------------------------------
|
|
class pknorm3 {
|
|
ushort n;
|
|
|
|
public:
|
|
//--- pack each component into 5 bits ---------------------------
|
|
void pack(vector3& v) {
|
|
const float r = 31.999f;
|
|
unsigned int ix = (unsigned int) (r * (v.x+1.0f)*0.5f);
|
|
unsigned int iy = (unsigned int)(r * (v.y+1.0f)*0.5f);
|
|
unsigned int iz = (unsigned int) (r * (v.z+1.0f)*0.5f);
|
|
n = ((ix&31)<<10) | ((iy&31)<<5) | (iz&31);
|
|
};
|
|
|
|
//--- unpack into vector3 ---------------------------------------
|
|
vector3 unpack(void) {
|
|
const float r = 31.999f;
|
|
float ix = float((n>>10) & 31);
|
|
float iy = float((n>>5) & 31);
|
|
float iz = float(n & 31);
|
|
vector3 v((((ix/r)*2.0f)-1.0f),
|
|
(((iy/r)*2.0f)-1.0f),
|
|
(((iz/r)*2.0f)-1.0f));
|
|
return v;
|
|
};
|
|
|
|
//-- constructors -----------------------------------------------
|
|
pknorm3() : n(0) {};
|
|
pknorm3(vector3& v) {
|
|
pack(v);
|
|
};
|
|
|
|
//-- get/set packed representation ------------------------------
|
|
ushort getpacked(void) {
|
|
return n;
|
|
};
|
|
void setpacked(ushort _n) {
|
|
n = _n;
|
|
};
|
|
};
|
|
//-------------------------------------------------------------------
|
|
#endif
|