quake4-sdk/source/idlib/geometry/DrawVert.h
2007-06-15 00:00:00 +00:00

153 lines
4.7 KiB
C++

#ifndef __DRAWVERT_H__
#define __DRAWVERT_H__
/*
===============================================================================
Draw Vertex.
===============================================================================
*/
class idDrawVert {
public:
idVec3 xyz;
byte color[4];
idVec3 normal;
byte color2[4];
idVec3 tangents[2];
idVec2 st;
float operator[]( const int index ) const;
float & operator[]( const int index );
void Clear( void );
const idVec3 & GetNormal( void ) const;
void SetNormal( float x, float y, float z );
void SetNormal( const idVec3 &n );
const idVec3 & GetTangent( void ) const;
void SetTangent( float x, float y, float z );
void SetTangent( const idVec3 &t );
const idVec3 & GetBiTangent( void ) const; // derived from normal, tangent, and tangent flag
void SetBiTangent( float x, float y, float z );
void SetBiTangent( const idVec3 &t );
void SetBiTangentSign( float sign ); // either 1.0f or -1.0f
void Lerp( const idDrawVert &a, const idDrawVert &b, const float f );
void LerpAll( const idDrawVert &a, const idDrawVert &b, const float f );
void Normalize( void );
void SetColor( dword color );
dword GetColor( void ) const;
};
// offsets for SIMD code
#define DRAWVERT_SIZE 64 // sizeof( idDrawVert )
#define DRAWVERT_SIZE_SHIFT 6 // log2( sizeof( idDrawVert ) )
#define DRAWVERT_XYZ_OFFSET (0*4) // offsetof( idDrawVert, xyz )
#define DRAWVERT_COLOR_OFFSET (3*4) // offsetof( idDrawVert, color )
#define DRAWVERT_NORMAL_OFFSET (4*4) // offsetof( idDrawVert, normal )
#define DRAWVERT_COLOR2_OFFSET (7*4) // offsetof( idDrawVert, color2 )
#define DRAWVERT_TANGENT0_OFFSET (8*4) // offsetof( idDrawVert, tangents[0] )
#define DRAWVERT_TANGENT1_OFFSET (11*4) // offsetof( idDrawVert, tangents[1] )
#define DRAWVERT_ST_OFFSET (14*4) // offsetof( idDrawVert, st )
assert_sizeof( idDrawVert, DRAWVERT_SIZE );
assert_sizeof( idDrawVert, (1<<DRAWVERT_SIZE_SHIFT) );
assert_offsetof( idDrawVert, xyz, DRAWVERT_XYZ_OFFSET );
assert_offsetof( idDrawVert, color, DRAWVERT_COLOR_OFFSET );
assert_offsetof( idDrawVert, normal, DRAWVERT_NORMAL_OFFSET );
assert_offsetof( idDrawVert, color2, DRAWVERT_COLOR2_OFFSET );
//assert_offsetof( idDrawVert, tangents[0], DRAWVERT_TANGENT0_OFFSET );
//assert_offsetof( idDrawVert, tangents[1], DRAWVERT_TANGENT1_OFFSET );
assert_offsetof( idDrawVert, st, DRAWVERT_ST_OFFSET );
ID_INLINE float idDrawVert::operator[]( const int index ) const {
assert( index >= 0 && index < 5 );
return ((float *)(&xyz))[index];
}
ID_INLINE float &idDrawVert::operator[]( const int index ) {
assert( index >= 0 && index < 5 );
return ((float *)(&xyz))[index];
}
ID_INLINE void idDrawVert::Clear( void ) {
xyz.Zero();
st.Zero();
normal.Zero();
tangents[0].Zero();
tangents[1].Zero();
color[0] = color[1] = color[2] = color[3] = 0;
}
ID_INLINE const idVec3 &idDrawVert::GetNormal( void ) const {
return normal;
}
ID_INLINE void idDrawVert::SetNormal( const idVec3 &n ) {
normal = n;
}
ID_INLINE void idDrawVert::SetNormal( float x, float y, float z ) {
normal.Set( x, y, z );
}
ID_INLINE const idVec3 &idDrawVert::GetTangent( void ) const {
return tangents[0];
}
ID_INLINE void idDrawVert::SetTangent( float x, float y, float z ) {
tangents[0].Set( x, y, z );
}
ID_INLINE void idDrawVert::SetTangent( const idVec3 &t ) {
tangents[0] = t;
}
ID_INLINE const idVec3 &idDrawVert::GetBiTangent( void ) const {
return tangents[1];
}
ID_INLINE void idDrawVert::SetBiTangent( float x, float y, float z ) {
tangents[1].Set( x, y, z );
}
ID_INLINE void idDrawVert::SetBiTangent( const idVec3 &t ) {
tangents[1] = t;
}
ID_INLINE void idDrawVert::SetBiTangentSign( float sign ) {
// tangents[0][3] = sign;
}
ID_INLINE void idDrawVert::Lerp( const idDrawVert &a, const idDrawVert &b, const float f ) {
xyz = a.xyz + f * ( b.xyz - a.xyz );
st = a.st + f * ( b.st - a.st );
}
ID_INLINE void idDrawVert::LerpAll( const idDrawVert &a, const idDrawVert &b, const float f ) {
xyz = a.xyz + f * ( b.xyz - a.xyz );
st = a.st + f * ( b.st - a.st );
normal = a.normal + f * ( b.normal - a.normal );
tangents[0] = a.tangents[0] + f * ( b.tangents[0] - a.tangents[0] );
tangents[1] = a.tangents[1] + f * ( b.tangents[1] - a.tangents[1] );
color[0] = (byte)( a.color[0] + f * ( b.color[0] - a.color[0] ) );
color[1] = (byte)( a.color[1] + f * ( b.color[1] - a.color[1] ) );
color[2] = (byte)( a.color[2] + f * ( b.color[2] - a.color[2] ) );
color[3] = (byte)( a.color[3] + f * ( b.color[3] - a.color[3] ) );
}
ID_INLINE void idDrawVert::SetColor( dword color ) {
*reinterpret_cast<dword *>(this->color) = color;
}
ID_INLINE dword idDrawVert::GetColor( void ) const {
return *reinterpret_cast<const dword *>(this->color);
}
#endif /* !__DRAWVERT_H__ */