Files
Sun1602/Utility/pknorm.h
T
2022-10-26 12:25:11 +08:00

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