diff options
Diffstat (limited to 'libs/assimp/code/AssetLib/LWO/LWOFileData.h')
-rw-r--r-- | libs/assimp/code/AssetLib/LWO/LWOFileData.h | 638 |
1 files changed, 638 insertions, 0 deletions
diff --git a/libs/assimp/code/AssetLib/LWO/LWOFileData.h b/libs/assimp/code/AssetLib/LWO/LWOFileData.h new file mode 100644 index 0000000..f477f58 --- /dev/null +++ b/libs/assimp/code/AssetLib/LWO/LWOFileData.h @@ -0,0 +1,638 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2022, assimp team + +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 3DS/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 + , + mVCMap(), + 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 |