#ifndef AI_LWO_FILEDATA_INCLUDED
#define AI_LWO_FILEDATA_INCLUDED
#include <vector>
#include <list>
#include <assimp/mesh.h>
#include "IFF.h"
#include "LWOAnimation.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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#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')
#define AI_LWO_SHDR AI_IFF_FOURCC('S','H','D','R')
#define AI_LWO_DATA AI_IFF_FOURCC('D','A','T','A')
#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')
#define AI_LWO_MODO_NORM AI_IFF_FOURCC('N', 'O', 'R', 'M')
struct Face : public aiFace
{
Face()
: surfaceIndex (0)
, smoothGroup (0)
, type (AI_LWO_FACE)
{}
explicit Face(uint32_t _type)
: surfaceIndex (0)
, smoothGroup (0)
, type (_type)
{}
Face(const Face& f) : aiFace() {
*this = f;
}
unsigned int surfaceIndex;
unsigned int smoothGroup;
uint32_t type;
Face& operator=(const LWO::Face& f) {
aiFace::operator =(f);
surfaceIndex = f.surfaceIndex;
smoothGroup = f.smoothGroup;
type = f.type;
return *this;
}
};
struct VMapEntry
{
explicit VMapEntry(unsigned int _dims)
: dims(_dims)
{}
virtual ~VMapEntry() {}
virtual void Allocate(unsigned int num)
{
if (!rawData.empty())
return;
const unsigned int m = num*dims;
rawData.reserve(m + (m>>2u)); rawData.resize(m,0.f);
abAssigned.resize(num,false);
}
std::string name;
unsigned int dims;
std::vector<float> rawData;
std::vector<bool> abAssigned;
};
struct VColorChannel : public VMapEntry
{
VColorChannel()
: VMapEntry(4)
{}
virtual void Allocate(unsigned int num)
{
if (!rawData.empty())
return;
unsigned int m = num*dims;
rawData.reserve(m + (m>>2u)); rawData.resize(m);
for (aiColor4D* p = (aiColor4D*)&rawData[0]; p < (aiColor4D*)&rawData[m-1]; ++p)
p->a = 1.f;
abAssigned.resize(num,false);
}
};
struct UVChannel : public VMapEntry
{
UVChannel()
: VMapEntry(2)
{}
};
struct WeightChannel : public VMapEntry
{
WeightChannel()
: VMapEntry(1)
{}
};
struct NormalChannel : public VMapEntry
{
NormalChannel()
: VMapEntry(3)
{}
};
struct Texture
{
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")
{}
std::string mFileName;
unsigned int mClipIdx;
float mStrength;
uint32_t type;
std::string mUVChannelIndex;
unsigned int mRealUVIndex;
bool enabled;
BlendType blendType;
bool bCanUse;
MappingMode mapMode;
Axes majorAxis;
float wrapAmountH,wrapAmountW;
Wrap wrapModeWidth,wrapModeHeight;
std::string ordinal;
};
struct Clip
{
enum Type
{
STILL, SEQ, REF, UNSUPPORTED
} type;
Clip()
: type (UNSUPPORTED)
, clipRef()
, idx (0)
, negate (false)
{}
std::string path;
unsigned int clipRef;
unsigned int idx;
bool negate;
};
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;
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) , mVCMap ("")
, mVCMapType (AI_LWO_RGBA)
, mIOR (1.f) , mBumpIntensity (1.f)
, mWireframe (false)
, mAdditiveTransparency (0.f)
{}
std::string mName;
aiColor3D mColor;
bool bDoubleSided;
float mDiffuseValue,mSpecularValue,mTransparency,mGlossiness,mLuminosity,mColorHighlights;
float mMaximumSmoothAngle;
std::string mVCMap;
uint32_t mVCMapType;
ShaderList mShaders;
TextureList mColorTextures, mDiffuseTextures,
mSpecularTextures,
mOpacityTextures,
mBumpTextures,
mGlossinessTextures,
mReflectionTextures;
float mIOR;
float mBumpIntensity;
bool mWireframe;
float mAdditiveTransparency;
};
#define AI_LWO_VALIDATE_CHUNK_LENGTH(length,name,size) \
if (length < size) \
{ \
throw DeadlyImportError("LWO: "#name" chunk is too small"); \
} \
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;
struct Layer
{
Layer()
: mFaceIDXOfs (0)
, mPointIDXOfs (0)
, mParent (0x0)
, mIndex (0xffff)
, skip (false)
{}
PointList mTempPoints;
ReferrerList mPointReferrers;
WeightChannelList mWeightChannels;
WeightChannelList mSWeightChannels;
VColorChannelList mVColorChannels;
UVChannelList mUVChannels;
NormalChannel mNormals;
FaceList mFaces;
unsigned int mFaceIDXOfs;
unsigned int mPointIDXOfs;
uint16_t mParent;
uint16_t mIndex;
std::string mName;
aiVector3D mPivot;
bool skip;
};
typedef std::list<LWO::Layer> LayerList;
}}
#endif