nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Product: OpenCTM nuclear@14: // File: internal.h nuclear@14: // Description: Internal (private) declarations, types and function prototypes. nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Copyright (c) 2009-2010 Marcus Geelnard nuclear@14: // nuclear@14: // This software is provided 'as-is', without any express or implied nuclear@14: // warranty. In no event will the authors be held liable for any damages nuclear@14: // arising from the use of this software. nuclear@14: // nuclear@14: // Permission is granted to anyone to use this software for any purpose, nuclear@14: // including commercial applications, and to alter it and redistribute it nuclear@14: // freely, subject to the following restrictions: nuclear@14: // nuclear@14: // 1. The origin of this software must not be misrepresented; you must not nuclear@14: // claim that you wrote the original software. If you use this software nuclear@14: // in a product, an acknowledgment in the product documentation would be nuclear@14: // appreciated but is not required. nuclear@14: // nuclear@14: // 2. Altered source versions must be plainly marked as such, and must not nuclear@14: // be misrepresented as being the original software. nuclear@14: // nuclear@14: // 3. This notice may not be removed or altered from any source nuclear@14: // distribution. nuclear@14: //----------------------------------------------------------------------------- nuclear@14: nuclear@14: #ifndef __OPENCTM_INTERNAL_H_ nuclear@14: #define __OPENCTM_INTERNAL_H_ nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Constants nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // OpenCTM file format version (v5). nuclear@14: #define _CTM_FORMAT_VERSION 0x00000005 nuclear@14: nuclear@14: // Flags for the Mesh flags field of the file header nuclear@14: #define _CTM_HAS_NORMALS_BIT 0x00000001 nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // _CTMfloatmap - Internal representation of a floating point based vertex map nuclear@14: // (used for UV maps and attribute maps). nuclear@14: //----------------------------------------------------------------------------- nuclear@14: typedef struct _CTMfloatmap_struct _CTMfloatmap; nuclear@14: struct _CTMfloatmap_struct { nuclear@14: char * mName; // Unique name nuclear@14: char * mFileName; // File name reference (used only for UV maps) nuclear@14: CTMfloat mPrecision; // Precision for this map nuclear@14: CTMfloat * mValues; // Attribute/UV coordinate values (per vertex) nuclear@14: _CTMfloatmap * mNext; // Pointer to the next map in the list (linked list) nuclear@14: }; nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // _CTMcontext - Internal CTM context structure. nuclear@14: //----------------------------------------------------------------------------- nuclear@14: typedef struct { nuclear@14: // Context mode (import or export) nuclear@14: CTMenum mMode; nuclear@14: nuclear@14: // Vertices nuclear@14: CTMfloat * mVertices; nuclear@14: CTMuint mVertexCount; nuclear@14: nuclear@14: // Indices nuclear@14: CTMuint * mIndices; nuclear@14: CTMuint mTriangleCount; nuclear@14: nuclear@14: // Normals (optional) nuclear@14: CTMfloat * mNormals; nuclear@14: nuclear@14: // Multiple sets of UV coordinate maps (optional) nuclear@14: CTMuint mUVMapCount; nuclear@14: _CTMfloatmap * mUVMaps; nuclear@14: nuclear@14: // Multiple sets of custom vertex attribute maps (optional) nuclear@14: CTMuint mAttribMapCount; nuclear@14: _CTMfloatmap * mAttribMaps; nuclear@14: nuclear@14: // Last error code nuclear@14: CTMenum mError; nuclear@14: nuclear@14: // The selected compression method nuclear@14: CTMenum mMethod; nuclear@14: nuclear@14: // The selected compression level nuclear@14: CTMuint mCompressionLevel; nuclear@14: nuclear@14: // Vertex coordinate precision nuclear@14: CTMfloat mVertexPrecision; nuclear@14: nuclear@14: // Normal precision (angular + magnitude) nuclear@14: CTMfloat mNormalPrecision; nuclear@14: nuclear@14: // File comment nuclear@14: char * mFileComment; nuclear@14: nuclear@14: // Read() function pointer nuclear@14: CTMreadfn mReadFn; nuclear@14: nuclear@14: // Write() function pointer nuclear@14: CTMwritefn mWriteFn; nuclear@14: nuclear@14: // User data (for stream read/write - usually the stream handle) nuclear@14: void * mUserData; nuclear@14: } _CTMcontext; nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Macros nuclear@14: //----------------------------------------------------------------------------- nuclear@14: #define FOURCC(str) (((CTMuint) str[0]) | (((CTMuint) str[1]) << 8) | \ nuclear@14: (((CTMuint) str[2]) << 16) | (((CTMuint) str[3]) << 24)) nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Funcion prototypes for stream.c nuclear@14: //----------------------------------------------------------------------------- nuclear@14: CTMuint _ctmStreamRead(_CTMcontext * self, void * aBuf, CTMuint aCount); nuclear@14: CTMuint _ctmStreamWrite(_CTMcontext * self, void * aBuf, CTMuint aCount); nuclear@14: CTMuint _ctmStreamReadUINT(_CTMcontext * self); nuclear@14: void _ctmStreamWriteUINT(_CTMcontext * self, CTMuint aValue); nuclear@14: CTMfloat _ctmStreamReadFLOAT(_CTMcontext * self); nuclear@14: void _ctmStreamWriteFLOAT(_CTMcontext * self, CTMfloat aValue); nuclear@14: void _ctmStreamReadSTRING(_CTMcontext * self, char ** aValue); nuclear@14: void _ctmStreamWriteSTRING(_CTMcontext * self, const char * aValue); nuclear@14: int _ctmStreamReadPackedInts(_CTMcontext * self, CTMint * aData, CTMuint aCount, CTMuint aSize, CTMint aSignedInts); nuclear@14: int _ctmStreamWritePackedInts(_CTMcontext * self, CTMint * aData, CTMuint aCount, CTMuint aSize, CTMint aSignedInts); nuclear@14: int _ctmStreamReadPackedFloats(_CTMcontext * self, CTMfloat * aData, CTMuint aCount, CTMuint aSize); nuclear@14: int _ctmStreamWritePackedFloats(_CTMcontext * self, CTMfloat * aData, CTMuint aCount, CTMuint aSize); nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Funcion prototypes for compressRAW.c nuclear@14: //----------------------------------------------------------------------------- nuclear@14: int _ctmCompressMesh_RAW(_CTMcontext * self); nuclear@14: int _ctmUncompressMesh_RAW(_CTMcontext * self); nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Funcion prototypes for compressMG1.c nuclear@14: //----------------------------------------------------------------------------- nuclear@14: int _ctmCompressMesh_MG1(_CTMcontext * self); nuclear@14: int _ctmUncompressMesh_MG1(_CTMcontext * self); nuclear@14: nuclear@14: //----------------------------------------------------------------------------- nuclear@14: // Funcion prototypes for compressMG2.c nuclear@14: //----------------------------------------------------------------------------- nuclear@14: int _ctmCompressMesh_MG2(_CTMcontext * self); nuclear@14: int _ctmUncompressMesh_MG2(_CTMcontext * self); nuclear@14: nuclear@14: #endif // __OPENCTM_INTERNAL_H_