2020-05-02 13:14:38 +00:00
/*
Open Asset Import Library ( assimp )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2022-01-10 20:13:43 +00:00
Copyright ( c ) 2006 - 2022 , assimp team
2020-05-02 13:14:38 +00:00
All rights reserved .
Redistribution and use of this software in source and binary forms ,
with or without modification , are permitted provided that the
following conditions are met :
* Redistributions of source code must retain the above
copyright notice , this list of conditions and the
following disclaimer .
* Redistributions in binary form must reproduce the above
copyright notice , this list of conditions and the
following disclaimer in the documentation and / or other
materials provided with the distribution .
* Neither the name of the assimp team , nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of the assimp team .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
" AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/** @file LWOFileData.h
* @ brief Defines chunk constants used by the LWO file format
The chunks are taken from the official LightWave SDK headers .
*/
# ifndef AI_LWO_FILEDATA_INCLUDED
# define AI_LWO_FILEDATA_INCLUDED
// STL headers
# include <list>
# include <vector>
// public ASSIMP headers
# include <assimp/mesh.h>
// internal headers
# include "AssetLib/LWO/LWOAnimation.h"
# include "Common/IFF.h"
namespace Assimp {
namespace LWO {
# define AI_LWO_FOURCC_LWOB AI_IFF_FOURCC('L', 'W', 'O', 'B')
# define AI_LWO_FOURCC_LWO2 AI_IFF_FOURCC('L', 'W', 'O', '2')
# define AI_LWO_FOURCC_LXOB AI_IFF_FOURCC('L', 'X', 'O', 'B')
// chunks specific to the LWOB format
# define AI_LWO_SRFS AI_IFF_FOURCC('S', 'R', 'F', 'S')
# define AI_LWO_FLAG AI_IFF_FOURCC('F', 'L', 'A', 'G')
# define AI_LWO_VLUM AI_IFF_FOURCC('V', 'L', 'U', 'M')
# define AI_LWO_VDIF AI_IFF_FOURCC('V', 'D', 'I', 'F')
# define AI_LWO_VSPC AI_IFF_FOURCC('V', 'S', 'P', 'C')
# define AI_LWO_RFLT AI_IFF_FOURCC('R', 'F', 'L', 'T')
# define AI_LWO_BTEX AI_IFF_FOURCC('B', 'T', 'E', 'X')
# define AI_LWO_CTEX AI_IFF_FOURCC('C', 'T', 'E', 'X')
# define AI_LWO_DTEX AI_IFF_FOURCC('D', 'T', 'E', 'X')
# define AI_LWO_LTEX AI_IFF_FOURCC('L', 'T', 'E', 'X')
# define AI_LWO_RTEX AI_IFF_FOURCC('R', 'T', 'E', 'X')
# define AI_LWO_STEX AI_IFF_FOURCC('S', 'T', 'E', 'X')
# define AI_LWO_TTEX AI_IFF_FOURCC('T', 'T', 'E', 'X')
# define AI_LWO_TFLG AI_IFF_FOURCC('T', 'F', 'L', 'G')
# define AI_LWO_TSIZ AI_IFF_FOURCC('T', 'S', 'I', 'Z')
# define AI_LWO_TCTR AI_IFF_FOURCC('T', 'C', 'T', 'R')
# define AI_LWO_TFAL AI_IFF_FOURCC('T', 'F', 'A', 'L')
# define AI_LWO_TVEL AI_IFF_FOURCC('T', 'V', 'E', 'L')
# define AI_LWO_TCLR AI_IFF_FOURCC('T', 'C', 'L', 'R')
# define AI_LWO_TVAL AI_IFF_FOURCC('T', 'V', 'A', 'L')
# define AI_LWO_TAMP AI_IFF_FOURCC('T', 'A', 'M', 'P')
# define AI_LWO_TIMG AI_IFF_FOURCC('T', 'I', 'M', 'G')
# define AI_LWO_TAAS AI_IFF_FOURCC('T', 'A', 'A', 'S')
# define AI_LWO_TREF AI_IFF_FOURCC('T', 'R', 'E', 'F')
# define AI_LWO_TOPC AI_IFF_FOURCC('T', 'O', 'P', 'C')
# define AI_LWO_SDAT AI_IFF_FOURCC('S', 'D', 'A', 'T')
# define AI_LWO_TFP0 AI_IFF_FOURCC('T', 'F', 'P', '0')
# define AI_LWO_TFP1 AI_IFF_FOURCC('T', 'F', 'P', '1')
/* top-level chunks */
# define AI_LWO_LAYR AI_IFF_FOURCC('L', 'A', 'Y', 'R')
# define AI_LWO_TAGS AI_IFF_FOURCC('T', 'A', 'G', 'S')
# define AI_LWO_PNTS AI_IFF_FOURCC('P', 'N', 'T', 'S')
# define AI_LWO_BBOX AI_IFF_FOURCC('B', 'B', 'O', 'X')
# define AI_LWO_VMAP AI_IFF_FOURCC('V', 'M', 'A', 'P')
# define AI_LWO_VMAD AI_IFF_FOURCC('V', 'M', 'A', 'D')
# define AI_LWO_POLS AI_IFF_FOURCC('P', 'O', 'L', 'S')
# define AI_LWO_PTAG AI_IFF_FOURCC('P', 'T', 'A', 'G')
# define AI_LWO_ENVL AI_IFF_FOURCC('E', 'N', 'V', 'L')
# define AI_LWO_CLIP AI_IFF_FOURCC('C', 'L', 'I', 'P')
# define AI_LWO_SURF AI_IFF_FOURCC('S', 'U', 'R', 'F')
# define AI_LWO_DESC AI_IFF_FOURCC('D', 'E', 'S', 'C')
# define AI_LWO_TEXT AI_IFF_FOURCC('T', 'E', 'X', 'T')
# define AI_LWO_ICON AI_IFF_FOURCC('I', 'C', 'O', 'N')
/* polygon types */
# define AI_LWO_FACE AI_IFF_FOURCC('F', 'A', 'C', 'E')
# define AI_LWO_CURV AI_IFF_FOURCC('C', 'U', 'R', 'V')
# define AI_LWO_PTCH AI_IFF_FOURCC('P', 'T', 'C', 'H')
# define AI_LWO_MBAL AI_IFF_FOURCC('M', 'B', 'A', 'L')
# define AI_LWO_BONE AI_IFF_FOURCC('B', 'O', 'N', 'E')
# define AI_LWO_SUBD AI_IFF_FOURCC('S', 'U', 'B', 'D')
/* polygon tags */
# define AI_LWO_SURF AI_IFF_FOURCC('S', 'U', 'R', 'F')
# define AI_LWO_PART AI_IFF_FOURCC('P', 'A', 'R', 'T')
# define AI_LWO_SMGP AI_IFF_FOURCC('S', 'M', 'G', 'P')
/* envelopes */
# define AI_LWO_PRE AI_IFF_FOURCC('P', 'R', 'E', ' ')
# define AI_LWO_POST AI_IFF_FOURCC('P', 'O', 'S', 'T')
# define AI_LWO_KEY AI_IFF_FOURCC('K', 'E', 'Y', ' ')
# define AI_LWO_SPAN AI_IFF_FOURCC('S', 'P', 'A', 'N')
# define AI_LWO_TCB AI_IFF_FOURCC('T', 'C', 'B', ' ')
# define AI_LWO_HERM AI_IFF_FOURCC('H', 'E', 'R', 'M')
# define AI_LWO_BEZI AI_IFF_FOURCC('B', 'E', 'Z', 'I')
# define AI_LWO_BEZ2 AI_IFF_FOURCC('B', 'E', 'Z', '2')
# define AI_LWO_LINE AI_IFF_FOURCC('L', 'I', 'N', 'E')
# define AI_LWO_STEP AI_IFF_FOURCC('S', 'T', 'E', 'P')
/* clips */
# define AI_LWO_STIL AI_IFF_FOURCC('S', 'T', 'I', 'L')
# define AI_LWO_ISEQ AI_IFF_FOURCC('I', 'S', 'E', 'Q')
# define AI_LWO_ANIM AI_IFF_FOURCC('A', 'N', 'I', 'M')
# define AI_LWO_XREF AI_IFF_FOURCC('X', 'R', 'E', 'F')
# define AI_LWO_STCC AI_IFF_FOURCC('S', 'T', 'C', 'C')
# define AI_LWO_TIME AI_IFF_FOURCC('T', 'I', 'M', 'E')
# define AI_LWO_CONT AI_IFF_FOURCC('C', 'O', 'N', 'T')
# define AI_LWO_BRIT AI_IFF_FOURCC('B', 'R', 'I', 'T')
# define AI_LWO_SATR AI_IFF_FOURCC('S', 'A', 'T', 'R')
# define AI_LWO_HUE AI_IFF_FOURCC('H', 'U', 'E', ' ')
# define AI_LWO_GAMM AI_IFF_FOURCC('G', 'A', 'M', 'M')
# define AI_LWO_NEGA AI_IFF_FOURCC('N', 'E', 'G', 'A')
# define AI_LWO_IFLT AI_IFF_FOURCC('I', 'F', 'L', 'T')
# define AI_LWO_PFLT AI_IFF_FOURCC('P', 'F', 'L', 'T')
/* surfaces */
# define AI_LWO_COLR AI_IFF_FOURCC('C', 'O', 'L', 'R')
# define AI_LWO_LUMI AI_IFF_FOURCC('L', 'U', 'M', 'I')
# define AI_LWO_DIFF AI_IFF_FOURCC('D', 'I', 'F', 'F')
# define AI_LWO_SPEC AI_IFF_FOURCC('S', 'P', 'E', 'C')
# define AI_LWO_GLOS AI_IFF_FOURCC('G', 'L', 'O', 'S')
# define AI_LWO_REFL AI_IFF_FOURCC('R', 'E', 'F', 'L')
# define AI_LWO_RFOP AI_IFF_FOURCC('R', 'F', 'O', 'P')
# define AI_LWO_RIMG AI_IFF_FOURCC('R', 'I', 'M', 'G')
# define AI_LWO_RSAN AI_IFF_FOURCC('R', 'S', 'A', 'N')
# define AI_LWO_TRAN AI_IFF_FOURCC('T', 'R', 'A', 'N')
# define AI_LWO_TROP AI_IFF_FOURCC('T', 'R', 'O', 'P')
# define AI_LWO_TIMG AI_IFF_FOURCC('T', 'I', 'M', 'G')
# define AI_LWO_RIND AI_IFF_FOURCC('R', 'I', 'N', 'D')
# define AI_LWO_TRNL AI_IFF_FOURCC('T', 'R', 'N', 'L')
# define AI_LWO_BUMP AI_IFF_FOURCC('B', 'U', 'M', 'P')
# define AI_LWO_SMAN AI_IFF_FOURCC('S', 'M', 'A', 'N')
# define AI_LWO_SIDE AI_IFF_FOURCC('S', 'I', 'D', 'E')
# define AI_LWO_CLRH AI_IFF_FOURCC('C', 'L', 'R', 'H')
# define AI_LWO_CLRF AI_IFF_FOURCC('C', 'L', 'R', 'F')
# define AI_LWO_ADTR AI_IFF_FOURCC('A', 'D', 'T', 'R')
# define AI_LWO_SHRP AI_IFF_FOURCC('S', 'H', 'R', 'P')
# define AI_LWO_LINE AI_IFF_FOURCC('L', 'I', 'N', 'E')
# define AI_LWO_LSIZ AI_IFF_FOURCC('L', 'S', 'I', 'Z')
# define AI_LWO_ALPH AI_IFF_FOURCC('A', 'L', 'P', 'H')
# define AI_LWO_AVAL AI_IFF_FOURCC('A', 'V', 'A', 'L')
# define AI_LWO_GVAL AI_IFF_FOURCC('G', 'V', 'A', 'L')
# define AI_LWO_BLOK AI_IFF_FOURCC('B', 'L', 'O', 'K')
# define AI_LWO_VCOL AI_IFF_FOURCC('V', 'C', 'O', 'L')
/* texture layer */
# define AI_LWO_TYPE AI_IFF_FOURCC('T', 'Y', 'P', 'E')
# define AI_LWO_CHAN AI_IFF_FOURCC('C', 'H', 'A', 'N')
# define AI_LWO_NAME AI_IFF_FOURCC('N', 'A', 'M', 'E')
# define AI_LWO_ENAB AI_IFF_FOURCC('E', 'N', 'A', 'B')
# define AI_LWO_OPAC AI_IFF_FOURCC('O', 'P', 'A', 'C')
# define AI_LWO_FLAG AI_IFF_FOURCC('F', 'L', 'A', 'G')
# define AI_LWO_PROJ AI_IFF_FOURCC('P', 'R', 'O', 'J')
# define AI_LWO_STCK AI_IFF_FOURCC('S', 'T', 'C', 'K')
# define AI_LWO_TAMP AI_IFF_FOURCC('T', 'A', 'M', 'P')
/* texture coordinates */
# define AI_LWO_TMAP AI_IFF_FOURCC('T', 'M', 'A', 'P')
# define AI_LWO_AXIS AI_IFF_FOURCC('A', 'X', 'I', 'S')
# define AI_LWO_CNTR AI_IFF_FOURCC('C', 'N', 'T', 'R')
# define AI_LWO_SIZE AI_IFF_FOURCC('S', 'I', 'Z', 'E')
# define AI_LWO_ROTA AI_IFF_FOURCC('R', 'O', 'T', 'A')
# define AI_LWO_OREF AI_IFF_FOURCC('O', 'R', 'E', 'F')
# define AI_LWO_FALL AI_IFF_FOURCC('F', 'A', 'L', 'L')
# define AI_LWO_CSYS AI_IFF_FOURCC('C', 'S', 'Y', 'S')
/* image map */
# define AI_LWO_IMAP AI_IFF_FOURCC('I', 'M', 'A', 'P')
# define AI_LWO_IMAG AI_IFF_FOURCC('I', 'M', 'A', 'G')
# define AI_LWO_WRAP AI_IFF_FOURCC('W', 'R', 'A', 'P')
# define AI_LWO_WRPW AI_IFF_FOURCC('W', 'R', 'P', 'W')
# define AI_LWO_WRPH AI_IFF_FOURCC('W', 'R', 'P', 'H')
# define AI_LWO_VMAP AI_IFF_FOURCC('V', 'M', 'A', 'P')
# define AI_LWO_AAST AI_IFF_FOURCC('A', 'A', 'S', 'T')
# define AI_LWO_PIXB AI_IFF_FOURCC('P', 'I', 'X', 'B')
/* procedural */
# define AI_LWO_PROC AI_IFF_FOURCC('P', 'R', 'O', 'C')
# define AI_LWO_COLR AI_IFF_FOURCC('C', 'O', 'L', 'R')
# define AI_LWO_VALU AI_IFF_FOURCC('V', 'A', 'L', 'U')
# define AI_LWO_FUNC AI_IFF_FOURCC('F', 'U', 'N', 'C')
# define AI_LWO_FTPS AI_IFF_FOURCC('F', 'T', 'P', 'S')
# define AI_LWO_ITPS AI_IFF_FOURCC('I', 'T', 'P', 'S')
# define AI_LWO_ETPS AI_IFF_FOURCC('E', 'T', 'P', 'S')
/* gradient */
# define AI_LWO_GRAD AI_IFF_FOURCC('G', 'R', 'A', 'D')
# define AI_LWO_GRST AI_IFF_FOURCC('G', 'R', 'S', 'T')
# define AI_LWO_GREN AI_IFF_FOURCC('G', 'R', 'E', 'N')
# define AI_LWO_PNAM AI_IFF_FOURCC('P', 'N', 'A', 'M')
# define AI_LWO_INAM AI_IFF_FOURCC('I', 'N', 'A', 'M')
# define AI_LWO_GRPT AI_IFF_FOURCC('G', 'R', 'P', 'T')
# define AI_LWO_FKEY AI_IFF_FOURCC('F', 'K', 'E', 'Y')
# define AI_LWO_IKEY AI_IFF_FOURCC('I', 'K', 'E', 'Y')
/* shader */
# define AI_LWO_SHDR AI_IFF_FOURCC('S', 'H', 'D', 'R')
# define AI_LWO_DATA AI_IFF_FOURCC('D', 'A', 'T', 'A')
/* VMAP types */
# define AI_LWO_TXUV AI_IFF_FOURCC('T', 'X', 'U', 'V')
# define AI_LWO_RGB AI_IFF_FOURCC('R', 'G', 'B', ' ')
# define AI_LWO_RGBA AI_IFF_FOURCC('R', 'G', 'B', 'A')
# define AI_LWO_WGHT AI_IFF_FOURCC('W', 'G', 'H', 'T')
# define AI_LWO_MNVW AI_IFF_FOURCC('M', 'N', 'V', 'W')
# define AI_LWO_MORF AI_IFF_FOURCC('M', 'O', 'R', 'F')
# define AI_LWO_SPOT AI_IFF_FOURCC('S', 'P', 'O', 'T')
# define AI_LWO_PICK AI_IFF_FOURCC('P', 'I', 'C', 'K')
// MODO extension - per-vertex normal vectors
# define AI_LWO_MODO_NORM AI_IFF_FOURCC('N', 'O', 'R', 'M')
// ---------------------------------------------------------------------------
/** \brief Data structure for a face in a LWO file
*
* \ note We can ' t use the code in SmoothingGroups . inl here - the mesh
* structures of 3 DS / ASE and LWO are too different .
*/
struct Face : public aiFace {
//! Default construction
Face ( ) AI_NO_EXCEPT
: surfaceIndex ( 0 ) ,
smoothGroup ( 0 ) ,
type ( AI_LWO_FACE ) {
// empty
}
//! Construction from given type
explicit Face ( uint32_t _type ) :
surfaceIndex ( 0 ) , smoothGroup ( 0 ) , type ( _type ) { }
//! Copy construction
Face ( const Face & f ) :
aiFace ( ) {
* this = f ;
}
//! Zero-based index into tags chunk
unsigned int surfaceIndex ;
//! Smooth group this face is assigned to
unsigned int smoothGroup ;
//! Type of face
uint32_t type ;
//! Assignment operator
Face & operator = ( const LWO : : Face & f ) {
aiFace : : operator = ( f ) ;
surfaceIndex = f . surfaceIndex ;
smoothGroup = f . smoothGroup ;
type = f . type ;
return * this ;
}
} ;
// ---------------------------------------------------------------------------
/** \brief Base structure for all vertex map representations
*/
struct VMapEntry {
explicit VMapEntry ( unsigned int _dims ) :
dims ( _dims ) { }
virtual ~ VMapEntry ( ) { }
//! allocates memory for the vertex map
virtual void Allocate ( unsigned int num ) {
if ( ! rawData . empty ( ) )
return ; // return if already allocated
const unsigned int m = num * dims ;
rawData . reserve ( m + ( m > > 2u ) ) ; // 25% as extra storage for VMADs
rawData . resize ( m , 0.f ) ;
abAssigned . resize ( num , false ) ;
}
std : : string name ;
unsigned int dims ;
std : : vector < float > rawData ;
std : : vector < bool > abAssigned ;
} ;
// ---------------------------------------------------------------------------
/** \brief Represents an extra vertex color channel
*/
struct VColorChannel : public VMapEntry {
VColorChannel ( ) :
VMapEntry ( 4 ) { }
//! need to overwrite this function - the alpha channel must
//! be initialized to 1.0 by default
virtual void Allocate ( unsigned int num ) {
if ( ! rawData . empty ( ) )
return ; // return if already allocated
unsigned int m = num * dims ;
rawData . reserve ( m + ( m > > 2u ) ) ; // 25% as extra storage for VMADs
rawData . resize ( m ) ;
for ( aiColor4D * p = ( aiColor4D * ) & rawData [ 0 ] ; p < ( aiColor4D * ) & rawData [ m - 1 ] ; + + p )
p - > a = 1.f ;
abAssigned . resize ( num , false ) ;
}
} ;
// ---------------------------------------------------------------------------
/** \brief Represents an extra vertex UV channel
*/
struct UVChannel : public VMapEntry {
UVChannel ( ) :
VMapEntry ( 2 ) { }
} ;
// ---------------------------------------------------------------------------
/** \brief Represents a weight map
*/
struct WeightChannel : public VMapEntry {
WeightChannel ( ) :
VMapEntry ( 1 ) { }
} ;
// ---------------------------------------------------------------------------
/** \brief Represents a vertex-normals channel (MODO extension)
*/
struct NormalChannel : public VMapEntry {
NormalChannel ( ) :
VMapEntry ( 3 ) { }
} ;
// ---------------------------------------------------------------------------
/** \brief Data structure for a LWO file texture
*/
struct Texture {
// we write the enum values out here to make debugging easier ...
enum BlendType {
Normal = 0 ,
Subtractive = 1 ,
Difference = 2 ,
Multiply = 3 ,
Divide = 4 ,
Alpha = 5 ,
TextureDispl = 6 ,
Additive = 7
} ;
enum MappingMode {
Planar = 0 ,
Cylindrical = 1 ,
Spherical = 2 ,
Cubic = 3 ,
FrontProjection = 4 ,
UV = 5
} ;
enum Axes {
AXIS_X = 0 ,
AXIS_Y = 1 ,
AXIS_Z = 2
} ;
enum Wrap {
RESET = 0 ,
REPEAT = 1 ,
MIRROR = 2 ,
EDGE = 3
} ;
Texture ( ) :
mClipIdx ( UINT_MAX ) , mStrength ( 1.0f ) , type ( ) , mUVChannelIndex ( " unknown " ) , mRealUVIndex ( UINT_MAX ) , enabled ( true ) , blendType ( Additive ) , bCanUse ( true ) , mapMode ( UV ) , majorAxis ( AXIS_X ) , wrapAmountH ( 1.0f ) , wrapAmountW ( 1.0f ) , wrapModeWidth ( REPEAT ) , wrapModeHeight ( REPEAT ) , ordinal ( " \x00 " ) { }
//! File name of the texture
std : : string mFileName ;
//! Clip index
unsigned int mClipIdx ;
//! Strength of the texture - blend factor
float mStrength ;
uint32_t type ; // type of the texture
//! Name of the corresponding UV channel
std : : string mUVChannelIndex ;
unsigned int mRealUVIndex ;
//! is the texture enabled?
bool enabled ;
//! blend type
BlendType blendType ;
//! are we able to use the texture?
bool bCanUse ;
//! mapping mode
MappingMode mapMode ;
//! major axis for planar, cylindrical, spherical projections
Axes majorAxis ;
//! wrap amount for cylindrical and spherical projections
float wrapAmountH , wrapAmountW ;
//! wrapping mode for the texture
Wrap wrapModeWidth , wrapModeHeight ;
//! ordinal string of the texture
std : : string ordinal ;
} ;
// ---------------------------------------------------------------------------
/** \brief Data structure for a LWO file clip
*/
struct Clip {
enum Type {
STILL ,
SEQ ,
REF ,
UNSUPPORTED
} type ;
Clip ( ) :
type ( UNSUPPORTED ) , clipRef ( ) , idx ( 0 ) , negate ( false ) { }
//! path to the base texture -
std : : string path ;
//! reference to another CLIP
unsigned int clipRef ;
//! index of the clip
unsigned int idx ;
//! Negate the clip?
bool negate ;
} ;
// ---------------------------------------------------------------------------
/** \brief Data structure for a LWO file shader
*
* Later
*/
struct Shader {
Shader ( ) :
ordinal ( " \x00 " ) , functionName ( " unknown " ) , enabled ( true ) { }
std : : string ordinal ;
std : : string functionName ;
bool enabled ;
} ;
typedef std : : list < Texture > TextureList ;
typedef std : : list < Shader > ShaderList ;
// ---------------------------------------------------------------------------
/** \brief Data structure for a LWO file surface (= material)
*/
struct Surface {
Surface ( ) :
mColor ( 0.78431f , 0.78431f , 0.78431f ) , bDoubleSided ( false ) , mDiffuseValue ( 1.f ) , mSpecularValue ( 0.f ) , mTransparency ( 0.f ) , mGlossiness ( 0.4f ) , mLuminosity ( 0.f ) , mColorHighlights ( 0.f ) , mMaximumSmoothAngle ( 0.f ) // 0 == not specified, no smoothing
,
2021-04-16 21:43:56 +00:00
mVCMap ( ) ,
2020-05-02 13:14:38 +00:00
mVCMapType ( AI_LWO_RGBA ) ,
mIOR ( 1.f ) // vakuum
,
mBumpIntensity ( 1.f ) ,
mWireframe ( false ) ,
mAdditiveTransparency ( 0.f ) { }
//! Name of the surface
std : : string mName ;
//! Color of the surface
aiColor3D mColor ;
//! true for two-sided materials
bool bDoubleSided ;
//! Various material parameters
float mDiffuseValue , mSpecularValue , mTransparency , mGlossiness , mLuminosity , mColorHighlights ;
//! Maximum angle between two adjacent triangles
//! that they can be smoothed - in degrees
float mMaximumSmoothAngle ;
//! Vertex color map to be used to color the surface
std : : string mVCMap ;
uint32_t mVCMapType ;
//! Names of the special shaders to be applied to the surface
ShaderList mShaders ;
//! Textures - the first entry in the list is evaluated first
TextureList mColorTextures , // color textures are added to both diffuse and specular texture stacks
mDiffuseTextures ,
mSpecularTextures ,
mOpacityTextures ,
mBumpTextures ,
mGlossinessTextures ,
mReflectionTextures ;
//! Index of refraction
float mIOR ;
//! Bump intensity scaling
float mBumpIntensity ;
//! Wireframe flag
bool mWireframe ;
//! Intensity of additive blending
float mAdditiveTransparency ;
} ;
// ---------------------------------------------------------------------------
# define AI_LWO_VALIDATE_CHUNK_LENGTH(length, name, size) \
if ( length < size ) { \
throw DeadlyImportError ( " LWO: " # name " chunk is too small " ) ; \
}
// some typedefs ... to make life with loader monsters like this easier
typedef std : : vector < aiVector3D > PointList ;
typedef std : : vector < LWO : : Face > FaceList ;
typedef std : : vector < LWO : : Surface > SurfaceList ;
typedef std : : vector < std : : string > TagList ;
typedef std : : vector < unsigned int > TagMappingTable ;
typedef std : : vector < unsigned int > ReferrerList ;
typedef std : : vector < WeightChannel > WeightChannelList ;
typedef std : : vector < VColorChannel > VColorChannelList ;
typedef std : : vector < UVChannel > UVChannelList ;
typedef std : : vector < Clip > ClipList ;
typedef std : : vector < Envelope > EnvelopeList ;
typedef std : : vector < unsigned int > SortedRep ;
// ---------------------------------------------------------------------------
/** \brief Represents a layer in the file
*/
struct Layer {
Layer ( ) :
mFaceIDXOfs ( 0 ) , mPointIDXOfs ( 0 ) , mParent ( 0x0 ) , mIndex ( 0xffff ) , skip ( false ) { }
/** Temporary point list from the file */
PointList mTempPoints ;
/** Lists for every point the index of another point
that has been copied from * this * point or UINT_MAX if
no copy of the point has been made */
ReferrerList mPointReferrers ;
/** Weight channel list from the file */
WeightChannelList mWeightChannels ;
/** Subdivision weight channel list from the file */
WeightChannelList mSWeightChannels ;
/** Vertex color list from the file */
VColorChannelList mVColorChannels ;
/** UV channel list from the file */
UVChannelList mUVChannels ;
/** Normal vector channel from the file */
NormalChannel mNormals ;
/** Temporary face list from the file*/
FaceList mFaces ;
/** Current face indexing offset from the beginning of the buffers*/
unsigned int mFaceIDXOfs ;
/** Current point indexing offset from the beginning of the buffers*/
unsigned int mPointIDXOfs ;
/** Parent index */
uint16_t mParent ;
/** Index of the layer */
uint16_t mIndex ;
/** Name of the layer */
std : : string mName ;
/** Pivot point of the layer */
aiVector3D mPivot ;
/** Skip this layer? */
bool skip ;
} ;
typedef std : : list < LWO : : Layer > LayerList ;
} // namespace LWO
} // namespace Assimp
# endif // !! AI_LWO_FILEDATA_INCLUDED