diff options
Diffstat (limited to 'src/3rdparty/assimp/code/ColladaHelper.h')
-rw-r--r-- | src/3rdparty/assimp/code/ColladaHelper.h | 722 |
1 files changed, 391 insertions, 331 deletions
diff --git a/src/3rdparty/assimp/code/ColladaHelper.h b/src/3rdparty/assimp/code/ColladaHelper.h index 2f05d46a7..130363186 100644 --- a/src/3rdparty/assimp/code/ColladaHelper.h +++ b/src/3rdparty/assimp/code/ColladaHelper.h @@ -4,11 +4,11 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2012, assimp team +Copyright (c) 2006-2016, 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 +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 @@ -25,16 +25,16 @@ 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 +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 +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 +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 +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. ---------------------------------------------------------------------- @@ -43,40 +43,50 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_COLLADAHELPER_H_INC #define AI_COLLADAHELPER_H_INC -namespace Assimp { -namespace Collada { +#include <string> +#include <map> +#include <vector> +#include <stdint.h> +#include <assimp/light.h> +#include <assimp/mesh.h> +#include <assimp/material.h> + +struct aiMaterial; + +namespace Assimp { +namespace Collada { /** Collada file versions which evolved during the years ... */ enum FormatVersion { - FV_1_5_n, - FV_1_4_n, - FV_1_3_n + FV_1_5_n, + FV_1_4_n, + FV_1_3_n }; /** Transformation types that can be applied to a node */ enum TransformType { - TF_LOOKAT, - TF_ROTATE, - TF_TRANSLATE, - TF_SCALE, - TF_SKEW, - TF_MATRIX + TF_LOOKAT, + TF_ROTATE, + TF_TRANSLATE, + TF_SCALE, + TF_SKEW, + TF_MATRIX }; /** Different types of input data to a vertex or face */ enum InputType { - IT_Invalid, - IT_Vertex, // special type for per-index data referring to the <vertices> element carrying the per-vertex data. - IT_Position, - IT_Normal, - IT_Texcoord, - IT_Color, - IT_Tangent, - IT_Bitangent + IT_Invalid, + IT_Vertex, // special type for per-index data referring to the <vertices> element carrying the per-vertex data. + IT_Position, + IT_Normal, + IT_Texcoord, + IT_Color, + IT_Tangent, + IT_Bitangent }; /** Supported controller types */ @@ -96,110 +106,111 @@ enum MorphMethod /** Contains all data for one of the different transformation types */ struct Transform { - std::string mID; ///< SID of the transform step, by which anim channels address their target node - TransformType mType; - float f[16]; ///< Interpretation of data depends on the type of the transformation + std::string mID; ///< SID of the transform step, by which anim channels address their target node + TransformType mType; + float f[16]; ///< Interpretation of data depends on the type of the transformation }; /** A collada camera. */ struct Camera { - Camera() - : mOrtho (false) - , mHorFov (10e10f) - , mVerFov (10e10f) - , mAspect (10e10f) - , mZNear (0.1f) - , mZFar (1000.f) - {} + Camera() + : mOrtho (false) + , mHorFov (10e10f) + , mVerFov (10e10f) + , mAspect (10e10f) + , mZNear (0.1f) + , mZFar (1000.f) + {} - // Name of camera - std::string mName; + // Name of camera + std::string mName; - // True if it is an orthografic camera - bool mOrtho; + // True if it is an orthografic camera + bool mOrtho; - //! Horizontal field of view in degrees - float mHorFov; + //! Horizontal field of view in degrees + float mHorFov; - //! Vertical field of view in degrees - float mVerFov; + //! Vertical field of view in degrees + float mVerFov; - //! Screen aspect - float mAspect; + //! Screen aspect + float mAspect; - //! Near& far z - float mZNear, mZFar; + //! Near& far z + float mZNear, mZFar; }; -#define aiLightSource_AMBIENT 0xdeaddead #define ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET 1e9f /** A collada light source. */ struct Light -{ - Light() - : mAttConstant (1.f) - , mAttLinear (0.f) - , mAttQuadratic (0.f) - , mFalloffAngle (180.f) - , mFalloffExponent (0.f) - , mPenumbraAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET) - , mOuterAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET) - , mIntensity (1.f) - {} +{ + Light() + : mType (aiLightSource_UNDEFINED) + , mAttConstant (1.f) + , mAttLinear (0.f) + , mAttQuadratic (0.f) + , mFalloffAngle (180.f) + , mFalloffExponent (0.f) + , mPenumbraAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET) + , mOuterAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET) + , mIntensity (1.f) + {} - //! Type of the light source aiLightSourceType + ambient - unsigned int mType; + //! Type of the light source aiLightSourceType + ambient + unsigned int mType; - //! Color of the light - aiColor3D mColor; + //! Color of the light + aiColor3D mColor; - //! Light attenuation - float mAttConstant,mAttLinear,mAttQuadratic; + //! Light attenuation + float mAttConstant,mAttLinear,mAttQuadratic; - //! Spot light falloff - float mFalloffAngle; - float mFalloffExponent; + //! Spot light falloff + float mFalloffAngle; + float mFalloffExponent; - // ----------------------------------------------------- - // FCOLLADA extension from here + // ----------------------------------------------------- + // FCOLLADA extension from here - //! ... related stuff from maja and max extensions - float mPenumbraAngle; - float mOuterAngle; + //! ... related stuff from maja and max extensions + float mPenumbraAngle; + float mOuterAngle; - //! Common light intensity - float mIntensity; + //! Common light intensity + float mIntensity; }; /** Short vertex index description */ struct InputSemanticMapEntry { - InputSemanticMapEntry() - : mSet (0) - {} + InputSemanticMapEntry() + : mSet(0) + , mType(IT_Invalid) + {} - //! Index of set, optional - unsigned int mSet; + //! Index of set, optional + unsigned int mSet; - //! Name of referenced vertex input - InputType mType; + //! Type of referenced vertex input + InputType mType; }; /** Table to map from effect to vertex input semantics */ struct SemanticMappingTable { - //! Name of material - std::string mMatName; + //! Name of material + std::string mMatName; - //! List of semantic map commands, grouped by effect semantic name - std::map<std::string, InputSemanticMapEntry> mMap; + //! List of semantic map commands, grouped by effect semantic name + std::map<std::string, InputSemanticMapEntry> mMap; - //! For std::find - bool operator == (const std::string& s) const { - return s == mMatName; - } + //! For std::find + bool operator == (const std::string& s) const { + return s == mMatName; + } }; /** A reference to a mesh inside a node, including materials assigned to the various subgroups. @@ -207,177 +218,177 @@ struct SemanticMappingTable */ struct MeshInstance { - ///< ID of the mesh or controller to be instanced - std::string mMeshOrController; + ///< ID of the mesh or controller to be instanced + std::string mMeshOrController; - ///< Map of materials by the subgroup ID they're applied to - std::map<std::string, SemanticMappingTable> mMaterials; + ///< Map of materials by the subgroup ID they're applied to + std::map<std::string, SemanticMappingTable> mMaterials; }; /** A reference to a camera inside a node*/ struct CameraInstance { - ///< ID of the camera - std::string mCamera; + ///< ID of the camera + std::string mCamera; }; /** A reference to a light inside a node*/ struct LightInstance { - ///< ID of the camera - std::string mLight; + ///< ID of the camera + std::string mLight; }; /** A reference to a node inside a node*/ struct NodeInstance { - ///< ID of the node - std::string mNode; + ///< ID of the node + std::string mNode; }; /** A node in a scene hierarchy */ struct Node { - std::string mName; - std::string mID; - std::string mSID; - Node* mParent; - std::vector<Node*> mChildren; + std::string mName; + std::string mID; + std::string mSID; + Node* mParent; + std::vector<Node*> mChildren; - /** Operations in order to calculate the resulting transformation to parent. */ - std::vector<Transform> mTransforms; + /** Operations in order to calculate the resulting transformation to parent. */ + std::vector<Transform> mTransforms; - /** Meshes at this node */ - std::vector<MeshInstance> mMeshes; + /** Meshes at this node */ + std::vector<MeshInstance> mMeshes; - /** Lights at this node */ - std::vector<LightInstance> mLights; + /** Lights at this node */ + std::vector<LightInstance> mLights; - /** Cameras at this node */ - std::vector<CameraInstance> mCameras; + /** Cameras at this node */ + std::vector<CameraInstance> mCameras; - /** Node instances at this node */ - std::vector<NodeInstance> mNodeInstances; + /** Node instances at this node */ + std::vector<NodeInstance> mNodeInstances; - /** Rootnodes: Name of primary camera, if any */ - std::string mPrimaryCamera; + /** Rootnodes: Name of primary camera, if any */ + std::string mPrimaryCamera; - //! Constructor. Begin with a zero parent - Node() { - mParent = NULL; - } + //! Constructor. Begin with a zero parent + Node() { + mParent = NULL; + } - //! Destructor: delete all children subsequently - ~Node() { - for( std::vector<Node*>::iterator it = mChildren.begin(); it != mChildren.end(); ++it) - delete *it; - } + //! Destructor: delete all children subsequently + ~Node() { + for( std::vector<Node*>::iterator it = mChildren.begin(); it != mChildren.end(); ++it) + delete *it; + } }; /** Data source array: either floats or strings */ struct Data { - bool mIsStringArray; - std::vector<float> mValues; - std::vector<std::string> mStrings; + bool mIsStringArray; + std::vector<float> mValues; + std::vector<std::string> mStrings; }; /** Accessor to a data array */ struct Accessor { - size_t mCount; // in number of objects - size_t mSize; // size of an object, in elements (floats or strings, mostly 1) - size_t mOffset; // in number of values - size_t mStride; // Stride in number of values - std::vector<std::string> mParams; // names of the data streams in the accessors. Empty string tells to ignore. - size_t mSubOffset[4]; // Suboffset inside the object for the common 4 elements. For a vector, thats XYZ, for a color RGBA and so on. - // For example, SubOffset[0] denotes which of the values inside the object is the vector X component. - std::string mSource; // URL of the source array - mutable const Data* mData; // Pointer to the source array, if resolved. NULL else - - Accessor() - { - mCount = 0; mSize = 0; mOffset = 0; mStride = 0; mData = NULL; - mSubOffset[0] = mSubOffset[1] = mSubOffset[2] = mSubOffset[3] = 0; - } + size_t mCount; // in number of objects + size_t mSize; // size of an object, in elements (floats or strings, mostly 1) + size_t mOffset; // in number of values + size_t mStride; // Stride in number of values + std::vector<std::string> mParams; // names of the data streams in the accessors. Empty string tells to ignore. + size_t mSubOffset[4]; // Suboffset inside the object for the common 4 elements. For a vector, thats XYZ, for a color RGBA and so on. + // For example, SubOffset[0] denotes which of the values inside the object is the vector X component. + std::string mSource; // URL of the source array + mutable const Data* mData; // Pointer to the source array, if resolved. NULL else + + Accessor() + { + mCount = 0; mSize = 0; mOffset = 0; mStride = 0; mData = NULL; + mSubOffset[0] = mSubOffset[1] = mSubOffset[2] = mSubOffset[3] = 0; + } }; /** A single face in a mesh */ struct Face { - std::vector<size_t> mIndices; + std::vector<size_t> mIndices; }; /** An input channel for mesh data, referring to a single accessor */ struct InputChannel { - InputType mType; // Type of the data - size_t mIndex; // Optional index, if multiple sets of the same data type are given - size_t mOffset; // Index offset in the indices array of per-face indices. Don't ask, can't explain that any better. - std::string mAccessor; // ID of the accessor where to read the actual values from. - mutable const Accessor* mResolved; // Pointer to the accessor, if resolved. NULL else + InputType mType; // Type of the data + size_t mIndex; // Optional index, if multiple sets of the same data type are given + size_t mOffset; // Index offset in the indices array of per-face indices. Don't ask, can't explain that any better. + std::string mAccessor; // ID of the accessor where to read the actual values from. + mutable const Accessor* mResolved; // Pointer to the accessor, if resolved. NULL else - InputChannel() { mType = IT_Invalid; mIndex = 0; mOffset = 0; mResolved = NULL; } + InputChannel() { mType = IT_Invalid; mIndex = 0; mOffset = 0; mResolved = NULL; } }; /** Subset of a mesh with a certain material */ struct SubMesh { - std::string mMaterial; ///< subgroup identifier - size_t mNumFaces; ///< number of faces in this submesh + std::string mMaterial; ///< subgroup identifier + size_t mNumFaces; ///< number of faces in this submesh }; /** Contains data for a single mesh */ struct Mesh { - Mesh() - { - for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS;++i) - mNumUVComponents[i] = 2; - } - + Mesh() + { + for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS;++i) + mNumUVComponents[i] = 2; + } + std::string mName; - // just to check if there's some sophisticated addressing involved... - // which we don't support, and therefore should warn about. - std::string mVertexID; + // just to check if there's some sophisticated addressing involved... + // which we don't support, and therefore should warn about. + std::string mVertexID; + + // Vertex data addressed by vertex indices + std::vector<InputChannel> mPerVertexData; - // Vertex data addressed by vertex indices - std::vector<InputChannel> mPerVertexData; + // actual mesh data, assembled on encounter of a <p> element. Verbose format, not indexed + std::vector<aiVector3D> mPositions; + std::vector<aiVector3D> mNormals; + std::vector<aiVector3D> mTangents; + std::vector<aiVector3D> mBitangents; + std::vector<aiVector3D> mTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; + std::vector<aiColor4D> mColors[AI_MAX_NUMBER_OF_COLOR_SETS]; - // actual mesh data, assembled on encounter of a <p> element. Verbose format, not indexed - std::vector<aiVector3D> mPositions; - std::vector<aiVector3D> mNormals; - std::vector<aiVector3D> mTangents; - std::vector<aiVector3D> mBitangents; - std::vector<aiVector3D> mTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; - std::vector<aiColor4D> mColors[AI_MAX_NUMBER_OF_COLOR_SETS]; + unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS]; - unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS]; + // Faces. Stored are only the number of vertices for each face. + // 1 == point, 2 == line, 3 == triangle, 4+ == poly + std::vector<size_t> mFaceSize; - // Faces. Stored are only the number of vertices for each face. - // 1 == point, 2 == line, 3 == triangle, 4+ == poly - std::vector<size_t> mFaceSize; - - // Position indices for all faces in the sequence given in mFaceSize - - // necessary for bone weight assignment - std::vector<size_t> mFacePosIndices; + // Position indices for all faces in the sequence given in mFaceSize - + // necessary for bone weight assignment + std::vector<size_t> mFacePosIndices; - // Submeshes in this mesh, each with a given material - std::vector<SubMesh> mSubMeshes; + // Submeshes in this mesh, each with a given material + std::vector<SubMesh> mSubMeshes; }; /** Which type of primitives the ReadPrimitives() function is going to read */ enum PrimitiveType { - Prim_Invalid, - Prim_Lines, - Prim_LineStrip, - Prim_Triangles, - Prim_TriStrips, - Prim_TriFans, - Prim_Polylist, - Prim_Polygon + Prim_Invalid, + Prim_Lines, + Prim_LineStrip, + Prim_Triangles, + Prim_TriStrips, + Prim_TriFans, + Prim_Polylist, + Prim_Polygon }; /** A skeleton or morph controller to deform a mesh with the use of joints or morph targets */ @@ -390,24 +401,24 @@ struct Controller MorphMethod mMethod; // the URL of the mesh deformed by the controller. - std::string mMeshId; + std::string mMeshId; - // accessor URL of the joint names - std::string mJointNameSource; + // accessor URL of the joint names + std::string mJointNameSource; ///< The bind shape matrix, as array of floats. I'm not sure what this matrix actually describes, but it can't be ignored in all cases float mBindShapeMatrix[16]; - // accessor URL of the joint inverse bind matrices - std::string mJointOffsetMatrixSource; + // accessor URL of the joint inverse bind matrices + std::string mJointOffsetMatrixSource; - // input channel: joint names. - InputChannel mWeightInputJoints; - // input channel: joint weights - InputChannel mWeightInputWeights; + // input channel: joint names. + InputChannel mWeightInputJoints; + // input channel: joint weights + InputChannel mWeightInputWeights; - // Number of weights per vertex. - std::vector<size_t> mWeightCounts; + // Number of weights per vertex. + std::vector<size_t> mWeightCounts; // JointIndex-WeightIndex pairs for all vertices std::vector< std::pair<size_t, size_t> > mWeights; @@ -419,162 +430,169 @@ struct Controller /** A collada material. Pretty much the only member is a reference to an effect. */ struct Material { - std::string mEffect; + std::string mName; + std::string mEffect; }; /** Type of the effect param */ enum ParamType { - Param_Sampler, - Param_Surface + Param_Sampler, + Param_Surface }; /** A param for an effect. Might be of several types, but they all just refer to each other, so I summarize them */ struct EffectParam { - ParamType mType; - std::string mReference; // to which other thing the param is referring to. + ParamType mType; + std::string mReference; // to which other thing the param is referring to. }; /** Shading type supported by the standard effect spec of Collada */ enum ShadeType { - Shade_Invalid, - Shade_Constant, - Shade_Lambert, - Shade_Phong, - Shade_Blinn + Shade_Invalid, + Shade_Constant, + Shade_Lambert, + Shade_Phong, + Shade_Blinn }; /** Represents a texture sampler in collada */ struct Sampler { - Sampler() - : mWrapU (true) - , mWrapV (true) - , mMirrorU () - , mMirrorV () - , mOp (aiTextureOp_Multiply) - , mUVId (UINT_MAX) - , mWeighting (1.f) - , mMixWithPrevious (1.f) - {} - - /** Name of image reference - */ - std::string mName; + Sampler() + : mWrapU (true) + , mWrapV (true) + , mMirrorU () + , mMirrorV () + , mOp (aiTextureOp_Multiply) + , mUVId (UINT_MAX) + , mWeighting (1.f) + , mMixWithPrevious (1.f) + {} + + /** Name of image reference + */ + std::string mName; - /** Wrap U? - */ - bool mWrapU; + /** Wrap U? + */ + bool mWrapU; - /** Wrap V? - */ - bool mWrapV; + /** Wrap V? + */ + bool mWrapV; - /** Mirror U? - */ - bool mMirrorU; + /** Mirror U? + */ + bool mMirrorU; - /** Mirror V? - */ - bool mMirrorV; + /** Mirror V? + */ + bool mMirrorV; - /** Blend mode - */ - aiTextureOp mOp; + /** Blend mode + */ + aiTextureOp mOp; - /** UV transformation - */ - aiUVTransform mTransform; + /** UV transformation + */ + aiUVTransform mTransform; - /** Name of source UV channel - */ - std::string mUVChannel; + /** Name of source UV channel + */ + std::string mUVChannel; - /** Resolved UV channel index or UINT_MAX if not known - */ - unsigned int mUVId; + /** Resolved UV channel index or UINT_MAX if not known + */ + unsigned int mUVId; - // OKINO/MAX3D extensions from here - // ------------------------------------------------------- + // OKINO/MAX3D extensions from here + // ------------------------------------------------------- - /** Weighting factor - */ - float mWeighting; + /** Weighting factor + */ + float mWeighting; - /** Mixing factor from OKINO - */ - float mMixWithPrevious; + /** Mixing factor from OKINO + */ + float mMixWithPrevious; }; /** A collada effect. Can contain about anything according to the Collada spec, but we limit our version to a reasonable subset. */ struct Effect { - // Shading mode - ShadeType mShadeType; - - // Colors - aiColor4D mEmissive, mAmbient, mDiffuse, mSpecular, - mTransparent, mReflective; - - // Textures - Sampler mTexEmissive, mTexAmbient, mTexDiffuse, mTexSpecular, - mTexTransparent, mTexBump, mTexReflective; - - // Scalar factory - float mShininess, mRefractIndex, mReflectivity; - float mTransparency; - - // local params referring to each other by their SID - typedef std::map<std::string, Collada::EffectParam> ParamLibrary; - ParamLibrary mParams; - - // MAX3D extensions - // --------------------------------------------------------- - // Double-sided? - bool mDoubleSided, mWireframe, mFaceted; - - Effect() - : mShadeType (Shade_Phong) - , mEmissive ( 0, 0, 0, 1) - , mAmbient ( 0.1f, 0.1f, 0.1f, 1) - , mDiffuse ( 0.6f, 0.6f, 0.6f, 1) - , mSpecular ( 0.4f, 0.4f, 0.4f, 1) - , mTransparent ( 0, 0, 0, 1) - , mShininess (10.0f) - , mRefractIndex (1.f) - , mReflectivity (1.f) - , mTransparency (0.f) - , mDoubleSided (false) - , mWireframe (false) - , mFaceted (false) - { - } + // Shading mode + ShadeType mShadeType; + + // Colors + aiColor4D mEmissive, mAmbient, mDiffuse, mSpecular, + mTransparent, mReflective; + + // Textures + Sampler mTexEmissive, mTexAmbient, mTexDiffuse, mTexSpecular, + mTexTransparent, mTexBump, mTexReflective; + + // Scalar factory + float mShininess, mRefractIndex, mReflectivity; + float mTransparency; + bool mHasTransparency; + bool mRGBTransparency; + bool mInvertTransparency; + + // local params referring to each other by their SID + typedef std::map<std::string, Collada::EffectParam> ParamLibrary; + ParamLibrary mParams; + + // MAX3D extensions + // --------------------------------------------------------- + // Double-sided? + bool mDoubleSided, mWireframe, mFaceted; + + Effect() + : mShadeType (Shade_Phong) + , mEmissive ( 0, 0, 0, 1) + , mAmbient ( 0.1f, 0.1f, 0.1f, 1) + , mDiffuse ( 0.6f, 0.6f, 0.6f, 1) + , mSpecular ( 0.4f, 0.4f, 0.4f, 1) + , mTransparent ( 0, 0, 0, 1) + , mShininess (10.0f) + , mRefractIndex (1.f) + , mReflectivity (0.f) + , mTransparency (1.f) + , mHasTransparency (false) + , mRGBTransparency(false) + , mInvertTransparency(false) + , mDoubleSided (false) + , mWireframe (false) + , mFaceted (false) + { + } }; /** An image, meaning texture */ struct Image { - std::string mFileName; + std::string mFileName; - /** If image file name is zero, embedded image data - */ - std::vector<uint8_t> mImageData; + /** If image file name is zero, embedded image data + */ + std::vector<uint8_t> mImageData; - /** If image file name is zero, file format of - * embedded image data. - */ - std::string mEmbeddedFormat; + /** If image file name is zero, file format of + * embedded image data. + */ + std::string mEmbeddedFormat; }; /** An animation channel. */ struct AnimationChannel { - /** URL of the data to animate. Could be about anything, but we support only the - * "NodeID/TransformID.SubElement" notation + /** URL of the data to animate. Could be about anything, but we support only the + * "NodeID/TransformID.SubElement" notation */ std::string mTarget; @@ -582,42 +600,84 @@ struct AnimationChannel std::string mSourceTimes; /** Source URL of the value values. Collada calls them "output". */ std::string mSourceValues; - /** Source URL of the IN_TANGENT semantic values. */ - std::string mInTanValues; - /** Source URL of the OUT_TANGENT semantic values. */ - std::string mOutTanValues; - /** Source URL of the INTERPOLATION semantic values. */ - std::string mInterpolationValues; + /** Source URL of the IN_TANGENT semantic values. */ + std::string mInTanValues; + /** Source URL of the OUT_TANGENT semantic values. */ + std::string mOutTanValues; + /** Source URL of the INTERPOLATION semantic values. */ + std::string mInterpolationValues; }; /** An animation. Container for 0-x animation channels or 0-x animations */ struct Animation { - /** Anim name */ - std::string mName; + /** Anim name */ + std::string mName; + + /** the animation channels, if any */ + std::vector<AnimationChannel> mChannels; + + /** the sub-animations, if any */ + std::vector<Animation*> mSubAnims; - /** the animation channels, if any */ - std::vector<AnimationChannel> mChannels; + /** Destructor */ + ~Animation() + { + for( std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it) + delete *it; + } - /** the sub-animations, if any */ - std::vector<Animation*> mSubAnims; + /** Collect all channels in the animation hierarchy into a single channel list. */ + void CollectChannelsRecursively(std::vector<AnimationChannel> &channels) + { + channels.insert(channels.end(), mChannels.begin(), mChannels.end()); + + for (std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it) + { + Animation *pAnim = (*it); + + pAnim->CollectChannelsRecursively(channels); + } + } - /** Destructor */ - ~Animation() + /** Combine all single-channel animations' channel into the same (parent) animation channel list. */ + void CombineSingleChannelAnimations() { - for( std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it) - delete *it; + CombineSingleChannelAnimationsRecursively(this); + } + + void CombineSingleChannelAnimationsRecursively(Animation *pParent) + { + for (std::vector<Animation*>::iterator it = pParent->mSubAnims.begin(); it != pParent->mSubAnims.end();) + { + Animation *anim = *it; + + CombineSingleChannelAnimationsRecursively(anim); + + if (anim->mChannels.size() == 1) + { + pParent->mChannels.push_back(anim->mChannels[0]); + + it = pParent->mSubAnims.erase(it); + + delete anim; + } + else + { + ++it; + } + } } }; /** Description of a collada animation channel which has been determined to affect the current node */ struct ChannelEntry { - const Collada::AnimationChannel* mChannel; ///> the source channel + const Collada::AnimationChannel* mChannel; ///> the source channel std::string mTargetId; - std::string mTransformId; // the ID of the transformation step of the node which is influenced - size_t mTransformIndex; // Index into the node's transform chain to apply the channel to - size_t mSubElement; // starting index inside the transform data + std::string mTransformId; // the ID of the transformation step of the node which is influenced + size_t mTransformIndex; // Index into the node's transform chain to apply the channel to + size_t mSubElement; // starting index inside the transform data // resolved data references const Collada::Accessor* mTimeAccessor; ///> Collada accessor to the time values |