/* =========================================================================== Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code"). Doom 3 Source Code 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 3 of the License, or (at your option) any later version. Doom 3 Source Code 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 for more details. You should have received a copy of the GNU General Public License along with Doom 3 Source Code. If not, see . In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __DRAWVERT_H__ #define __DRAWVERT_H__ /* =============================================================================== Draw Vertex. =============================================================================== */ class idDrawVert { public: idVec3 xyz; idVec2 st; idVec3 normal; idVec3 tangents[2]; byte color[4]; #if 0 // was MACOS_X see comments concerning DRAWVERT_PADDED in Simd_Altivec.h float padding; #endif float operator[]( const int index ) const; float & operator[]( const int index ); void Clear( void ); 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; }; 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 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(this->color) = color; } ID_INLINE dword idDrawVert::GetColor( void ) const { return *reinterpret_cast(this->color); } #endif /* !__DRAWVERT_H__ */