vrshoot

annotate libs/assimp/ColladaHelper.h @ 1:e7ca128b8713

looks nice :)
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 02 Feb 2014 00:35:22 +0200
parents
children
rev   line source
nuclear@0 1 /** Helper structures for the Collada loader */
nuclear@0 2
nuclear@0 3 /*
nuclear@0 4 Open Asset Import Library (assimp)
nuclear@0 5 ----------------------------------------------------------------------
nuclear@0 6
nuclear@0 7 Copyright (c) 2006-2012, assimp team
nuclear@0 8 All rights reserved.
nuclear@0 9
nuclear@0 10 Redistribution and use of this software in source and binary forms,
nuclear@0 11 with or without modification, are permitted provided that the
nuclear@0 12 following conditions are met:
nuclear@0 13
nuclear@0 14 * Redistributions of source code must retain the above
nuclear@0 15 copyright notice, this list of conditions and the
nuclear@0 16 following disclaimer.
nuclear@0 17
nuclear@0 18 * Redistributions in binary form must reproduce the above
nuclear@0 19 copyright notice, this list of conditions and the
nuclear@0 20 following disclaimer in the documentation and/or other
nuclear@0 21 materials provided with the distribution.
nuclear@0 22
nuclear@0 23 * Neither the name of the assimp team, nor the names of its
nuclear@0 24 contributors may be used to endorse or promote products
nuclear@0 25 derived from this software without specific prior
nuclear@0 26 written permission of the assimp team.
nuclear@0 27
nuclear@0 28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
nuclear@0 29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
nuclear@0 30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
nuclear@0 31 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
nuclear@0 32 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
nuclear@0 33 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
nuclear@0 34 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
nuclear@0 35 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
nuclear@0 36 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
nuclear@0 37 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nuclear@0 38 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nuclear@0 39
nuclear@0 40 ----------------------------------------------------------------------
nuclear@0 41 */
nuclear@0 42
nuclear@0 43 #ifndef AI_COLLADAHELPER_H_INC
nuclear@0 44 #define AI_COLLADAHELPER_H_INC
nuclear@0 45
nuclear@0 46 namespace Assimp {
nuclear@0 47 namespace Collada {
nuclear@0 48
nuclear@0 49 /** Collada file versions which evolved during the years ... */
nuclear@0 50 enum FormatVersion
nuclear@0 51 {
nuclear@0 52 FV_1_5_n,
nuclear@0 53 FV_1_4_n,
nuclear@0 54 FV_1_3_n
nuclear@0 55 };
nuclear@0 56
nuclear@0 57
nuclear@0 58 /** Transformation types that can be applied to a node */
nuclear@0 59 enum TransformType
nuclear@0 60 {
nuclear@0 61 TF_LOOKAT,
nuclear@0 62 TF_ROTATE,
nuclear@0 63 TF_TRANSLATE,
nuclear@0 64 TF_SCALE,
nuclear@0 65 TF_SKEW,
nuclear@0 66 TF_MATRIX
nuclear@0 67 };
nuclear@0 68
nuclear@0 69 /** Different types of input data to a vertex or face */
nuclear@0 70 enum InputType
nuclear@0 71 {
nuclear@0 72 IT_Invalid,
nuclear@0 73 IT_Vertex, // special type for per-index data referring to the <vertices> element carrying the per-vertex data.
nuclear@0 74 IT_Position,
nuclear@0 75 IT_Normal,
nuclear@0 76 IT_Texcoord,
nuclear@0 77 IT_Color,
nuclear@0 78 IT_Tangent,
nuclear@0 79 IT_Bitangent
nuclear@0 80 };
nuclear@0 81
nuclear@0 82 /** Contains all data for one of the different transformation types */
nuclear@0 83 struct Transform
nuclear@0 84 {
nuclear@0 85 std::string mID; ///< SID of the transform step, by which anim channels address their target node
nuclear@0 86 TransformType mType;
nuclear@0 87 float f[16]; ///< Interpretation of data depends on the type of the transformation
nuclear@0 88 };
nuclear@0 89
nuclear@0 90 /** A collada camera. */
nuclear@0 91 struct Camera
nuclear@0 92 {
nuclear@0 93 Camera()
nuclear@0 94 : mOrtho (false)
nuclear@0 95 , mHorFov (10e10f)
nuclear@0 96 , mVerFov (10e10f)
nuclear@0 97 , mAspect (10e10f)
nuclear@0 98 , mZNear (0.1f)
nuclear@0 99 , mZFar (1000.f)
nuclear@0 100 {}
nuclear@0 101
nuclear@0 102 // Name of camera
nuclear@0 103 std::string mName;
nuclear@0 104
nuclear@0 105 // True if it is an orthografic camera
nuclear@0 106 bool mOrtho;
nuclear@0 107
nuclear@0 108 //! Horizontal field of view in degrees
nuclear@0 109 float mHorFov;
nuclear@0 110
nuclear@0 111 //! Vertical field of view in degrees
nuclear@0 112 float mVerFov;
nuclear@0 113
nuclear@0 114 //! Screen aspect
nuclear@0 115 float mAspect;
nuclear@0 116
nuclear@0 117 //! Near& far z
nuclear@0 118 float mZNear, mZFar;
nuclear@0 119 };
nuclear@0 120
nuclear@0 121 #define aiLightSource_AMBIENT 0xdeaddead
nuclear@0 122 #define ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET 1e9f
nuclear@0 123
nuclear@0 124 /** A collada light source. */
nuclear@0 125 struct Light
nuclear@0 126 {
nuclear@0 127 Light()
nuclear@0 128 : mAttConstant (1.f)
nuclear@0 129 , mAttLinear (0.f)
nuclear@0 130 , mAttQuadratic (0.f)
nuclear@0 131 , mFalloffAngle (180.f)
nuclear@0 132 , mFalloffExponent (0.f)
nuclear@0 133 , mPenumbraAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET)
nuclear@0 134 , mOuterAngle (ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET)
nuclear@0 135 , mIntensity (1.f)
nuclear@0 136 {}
nuclear@0 137
nuclear@0 138 //! Type of the light source aiLightSourceType + ambient
nuclear@0 139 unsigned int mType;
nuclear@0 140
nuclear@0 141 //! Color of the light
nuclear@0 142 aiColor3D mColor;
nuclear@0 143
nuclear@0 144 //! Light attenuation
nuclear@0 145 float mAttConstant,mAttLinear,mAttQuadratic;
nuclear@0 146
nuclear@0 147 //! Spot light falloff
nuclear@0 148 float mFalloffAngle;
nuclear@0 149 float mFalloffExponent;
nuclear@0 150
nuclear@0 151 // -----------------------------------------------------
nuclear@0 152 // FCOLLADA extension from here
nuclear@0 153
nuclear@0 154 //! ... related stuff from maja and max extensions
nuclear@0 155 float mPenumbraAngle;
nuclear@0 156 float mOuterAngle;
nuclear@0 157
nuclear@0 158 //! Common light intensity
nuclear@0 159 float mIntensity;
nuclear@0 160 };
nuclear@0 161
nuclear@0 162 /** Short vertex index description */
nuclear@0 163 struct InputSemanticMapEntry
nuclear@0 164 {
nuclear@0 165 InputSemanticMapEntry()
nuclear@0 166 : mSet (0)
nuclear@0 167 {}
nuclear@0 168
nuclear@0 169 //! Index of set, optional
nuclear@0 170 unsigned int mSet;
nuclear@0 171
nuclear@0 172 //! Name of referenced vertex input
nuclear@0 173 InputType mType;
nuclear@0 174 };
nuclear@0 175
nuclear@0 176 /** Table to map from effect to vertex input semantics */
nuclear@0 177 struct SemanticMappingTable
nuclear@0 178 {
nuclear@0 179 //! Name of material
nuclear@0 180 std::string mMatName;
nuclear@0 181
nuclear@0 182 //! List of semantic map commands, grouped by effect semantic name
nuclear@0 183 std::map<std::string, InputSemanticMapEntry> mMap;
nuclear@0 184
nuclear@0 185 //! For std::find
nuclear@0 186 bool operator == (const std::string& s) const {
nuclear@0 187 return s == mMatName;
nuclear@0 188 }
nuclear@0 189 };
nuclear@0 190
nuclear@0 191 /** A reference to a mesh inside a node, including materials assigned to the various subgroups.
nuclear@0 192 * The ID refers to either a mesh or a controller which specifies the mesh
nuclear@0 193 */
nuclear@0 194 struct MeshInstance
nuclear@0 195 {
nuclear@0 196 ///< ID of the mesh or controller to be instanced
nuclear@0 197 std::string mMeshOrController;
nuclear@0 198
nuclear@0 199 ///< Map of materials by the subgroup ID they're applied to
nuclear@0 200 std::map<std::string, SemanticMappingTable> mMaterials;
nuclear@0 201 };
nuclear@0 202
nuclear@0 203 /** A reference to a camera inside a node*/
nuclear@0 204 struct CameraInstance
nuclear@0 205 {
nuclear@0 206 ///< ID of the camera
nuclear@0 207 std::string mCamera;
nuclear@0 208 };
nuclear@0 209
nuclear@0 210 /** A reference to a light inside a node*/
nuclear@0 211 struct LightInstance
nuclear@0 212 {
nuclear@0 213 ///< ID of the camera
nuclear@0 214 std::string mLight;
nuclear@0 215 };
nuclear@0 216
nuclear@0 217 /** A reference to a node inside a node*/
nuclear@0 218 struct NodeInstance
nuclear@0 219 {
nuclear@0 220 ///< ID of the node
nuclear@0 221 std::string mNode;
nuclear@0 222 };
nuclear@0 223
nuclear@0 224 /** A node in a scene hierarchy */
nuclear@0 225 struct Node
nuclear@0 226 {
nuclear@0 227 std::string mName;
nuclear@0 228 std::string mID;
nuclear@0 229 std::string mSID;
nuclear@0 230 Node* mParent;
nuclear@0 231 std::vector<Node*> mChildren;
nuclear@0 232
nuclear@0 233 /** Operations in order to calculate the resulting transformation to parent. */
nuclear@0 234 std::vector<Transform> mTransforms;
nuclear@0 235
nuclear@0 236 /** Meshes at this node */
nuclear@0 237 std::vector<MeshInstance> mMeshes;
nuclear@0 238
nuclear@0 239 /** Lights at this node */
nuclear@0 240 std::vector<LightInstance> mLights;
nuclear@0 241
nuclear@0 242 /** Cameras at this node */
nuclear@0 243 std::vector<CameraInstance> mCameras;
nuclear@0 244
nuclear@0 245 /** Node instances at this node */
nuclear@0 246 std::vector<NodeInstance> mNodeInstances;
nuclear@0 247
nuclear@0 248 /** Rootnodes: Name of primary camera, if any */
nuclear@0 249 std::string mPrimaryCamera;
nuclear@0 250
nuclear@0 251 //! Constructor. Begin with a zero parent
nuclear@0 252 Node() {
nuclear@0 253 mParent = NULL;
nuclear@0 254 }
nuclear@0 255
nuclear@0 256 //! Destructor: delete all children subsequently
nuclear@0 257 ~Node() {
nuclear@0 258 for( std::vector<Node*>::iterator it = mChildren.begin(); it != mChildren.end(); ++it)
nuclear@0 259 delete *it;
nuclear@0 260 }
nuclear@0 261 };
nuclear@0 262
nuclear@0 263 /** Data source array: either floats or strings */
nuclear@0 264 struct Data
nuclear@0 265 {
nuclear@0 266 bool mIsStringArray;
nuclear@0 267 std::vector<float> mValues;
nuclear@0 268 std::vector<std::string> mStrings;
nuclear@0 269 };
nuclear@0 270
nuclear@0 271 /** Accessor to a data array */
nuclear@0 272 struct Accessor
nuclear@0 273 {
nuclear@0 274 size_t mCount; // in number of objects
nuclear@0 275 size_t mSize; // size of an object, in elements (floats or strings, mostly 1)
nuclear@0 276 size_t mOffset; // in number of values
nuclear@0 277 size_t mStride; // Stride in number of values
nuclear@0 278 std::vector<std::string> mParams; // names of the data streams in the accessors. Empty string tells to ignore.
nuclear@0 279 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.
nuclear@0 280 // For example, SubOffset[0] denotes which of the values inside the object is the vector X component.
nuclear@0 281 std::string mSource; // URL of the source array
nuclear@0 282 mutable const Data* mData; // Pointer to the source array, if resolved. NULL else
nuclear@0 283
nuclear@0 284 Accessor()
nuclear@0 285 {
nuclear@0 286 mCount = 0; mSize = 0; mOffset = 0; mStride = 0; mData = NULL;
nuclear@0 287 mSubOffset[0] = mSubOffset[1] = mSubOffset[2] = mSubOffset[3] = 0;
nuclear@0 288 }
nuclear@0 289 };
nuclear@0 290
nuclear@0 291 /** A single face in a mesh */
nuclear@0 292 struct Face
nuclear@0 293 {
nuclear@0 294 std::vector<size_t> mIndices;
nuclear@0 295 };
nuclear@0 296
nuclear@0 297 /** An input channel for mesh data, referring to a single accessor */
nuclear@0 298 struct InputChannel
nuclear@0 299 {
nuclear@0 300 InputType mType; // Type of the data
nuclear@0 301 size_t mIndex; // Optional index, if multiple sets of the same data type are given
nuclear@0 302 size_t mOffset; // Index offset in the indices array of per-face indices. Don't ask, can't explain that any better.
nuclear@0 303 std::string mAccessor; // ID of the accessor where to read the actual values from.
nuclear@0 304 mutable const Accessor* mResolved; // Pointer to the accessor, if resolved. NULL else
nuclear@0 305
nuclear@0 306 InputChannel() { mType = IT_Invalid; mIndex = 0; mOffset = 0; mResolved = NULL; }
nuclear@0 307 };
nuclear@0 308
nuclear@0 309 /** Subset of a mesh with a certain material */
nuclear@0 310 struct SubMesh
nuclear@0 311 {
nuclear@0 312 std::string mMaterial; ///< subgroup identifier
nuclear@0 313 size_t mNumFaces; ///< number of faces in this submesh
nuclear@0 314 };
nuclear@0 315
nuclear@0 316 /** Contains data for a single mesh */
nuclear@0 317 struct Mesh
nuclear@0 318 {
nuclear@0 319 Mesh()
nuclear@0 320 {
nuclear@0 321 for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS;++i)
nuclear@0 322 mNumUVComponents[i] = 2;
nuclear@0 323 }
nuclear@0 324
nuclear@0 325 // just to check if there's some sophisticated addressing involved...
nuclear@0 326 // which we don't support, and therefore should warn about.
nuclear@0 327 std::string mVertexID;
nuclear@0 328
nuclear@0 329 // Vertex data addressed by vertex indices
nuclear@0 330 std::vector<InputChannel> mPerVertexData;
nuclear@0 331
nuclear@0 332 // actual mesh data, assembled on encounter of a <p> element. Verbose format, not indexed
nuclear@0 333 std::vector<aiVector3D> mPositions;
nuclear@0 334 std::vector<aiVector3D> mNormals;
nuclear@0 335 std::vector<aiVector3D> mTangents;
nuclear@0 336 std::vector<aiVector3D> mBitangents;
nuclear@0 337 std::vector<aiVector3D> mTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
nuclear@0 338 std::vector<aiColor4D> mColors[AI_MAX_NUMBER_OF_COLOR_SETS];
nuclear@0 339
nuclear@0 340 unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS];
nuclear@0 341
nuclear@0 342 // Faces. Stored are only the number of vertices for each face.
nuclear@0 343 // 1 == point, 2 == line, 3 == triangle, 4+ == poly
nuclear@0 344 std::vector<size_t> mFaceSize;
nuclear@0 345
nuclear@0 346 // Position indices for all faces in the sequence given in mFaceSize -
nuclear@0 347 // necessary for bone weight assignment
nuclear@0 348 std::vector<size_t> mFacePosIndices;
nuclear@0 349
nuclear@0 350 // Submeshes in this mesh, each with a given material
nuclear@0 351 std::vector<SubMesh> mSubMeshes;
nuclear@0 352 };
nuclear@0 353
nuclear@0 354 /** Which type of primitives the ReadPrimitives() function is going to read */
nuclear@0 355 enum PrimitiveType
nuclear@0 356 {
nuclear@0 357 Prim_Invalid,
nuclear@0 358 Prim_Lines,
nuclear@0 359 Prim_LineStrip,
nuclear@0 360 Prim_Triangles,
nuclear@0 361 Prim_TriStrips,
nuclear@0 362 Prim_TriFans,
nuclear@0 363 Prim_Polylist,
nuclear@0 364 Prim_Polygon
nuclear@0 365 };
nuclear@0 366
nuclear@0 367 /** A skeleton controller to deform a mesh with the use of joints */
nuclear@0 368 struct Controller
nuclear@0 369 {
nuclear@0 370 // the URL of the mesh deformed by the controller.
nuclear@0 371 std::string mMeshId;
nuclear@0 372
nuclear@0 373 // accessor URL of the joint names
nuclear@0 374 std::string mJointNameSource;
nuclear@0 375
nuclear@0 376 ///< 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
nuclear@0 377 float mBindShapeMatrix[16];
nuclear@0 378
nuclear@0 379 // accessor URL of the joint inverse bind matrices
nuclear@0 380 std::string mJointOffsetMatrixSource;
nuclear@0 381
nuclear@0 382 // input channel: joint names.
nuclear@0 383 InputChannel mWeightInputJoints;
nuclear@0 384 // input channel: joint weights
nuclear@0 385 InputChannel mWeightInputWeights;
nuclear@0 386
nuclear@0 387 // Number of weights per vertex.
nuclear@0 388 std::vector<size_t> mWeightCounts;
nuclear@0 389
nuclear@0 390 // JointIndex-WeightIndex pairs for all vertices
nuclear@0 391 std::vector< std::pair<size_t, size_t> > mWeights;
nuclear@0 392 };
nuclear@0 393
nuclear@0 394 /** A collada material. Pretty much the only member is a reference to an effect. */
nuclear@0 395 struct Material
nuclear@0 396 {
nuclear@0 397 std::string mEffect;
nuclear@0 398 };
nuclear@0 399
nuclear@0 400 /** Type of the effect param */
nuclear@0 401 enum ParamType
nuclear@0 402 {
nuclear@0 403 Param_Sampler,
nuclear@0 404 Param_Surface
nuclear@0 405 };
nuclear@0 406
nuclear@0 407 /** A param for an effect. Might be of several types, but they all just refer to each other, so I summarize them */
nuclear@0 408 struct EffectParam
nuclear@0 409 {
nuclear@0 410 ParamType mType;
nuclear@0 411 std::string mReference; // to which other thing the param is referring to.
nuclear@0 412 };
nuclear@0 413
nuclear@0 414 /** Shading type supported by the standard effect spec of Collada */
nuclear@0 415 enum ShadeType
nuclear@0 416 {
nuclear@0 417 Shade_Invalid,
nuclear@0 418 Shade_Constant,
nuclear@0 419 Shade_Lambert,
nuclear@0 420 Shade_Phong,
nuclear@0 421 Shade_Blinn
nuclear@0 422 };
nuclear@0 423
nuclear@0 424 /** Represents a texture sampler in collada */
nuclear@0 425 struct Sampler
nuclear@0 426 {
nuclear@0 427 Sampler()
nuclear@0 428 : mWrapU (true)
nuclear@0 429 , mWrapV (true)
nuclear@0 430 , mMirrorU ()
nuclear@0 431 , mMirrorV ()
nuclear@0 432 , mOp (aiTextureOp_Multiply)
nuclear@0 433 , mUVId (UINT_MAX)
nuclear@0 434 , mWeighting (1.f)
nuclear@0 435 , mMixWithPrevious (1.f)
nuclear@0 436 {}
nuclear@0 437
nuclear@0 438 /** Name of image reference
nuclear@0 439 */
nuclear@0 440 std::string mName;
nuclear@0 441
nuclear@0 442 /** Wrap U?
nuclear@0 443 */
nuclear@0 444 bool mWrapU;
nuclear@0 445
nuclear@0 446 /** Wrap V?
nuclear@0 447 */
nuclear@0 448 bool mWrapV;
nuclear@0 449
nuclear@0 450 /** Mirror U?
nuclear@0 451 */
nuclear@0 452 bool mMirrorU;
nuclear@0 453
nuclear@0 454 /** Mirror V?
nuclear@0 455 */
nuclear@0 456 bool mMirrorV;
nuclear@0 457
nuclear@0 458 /** Blend mode
nuclear@0 459 */
nuclear@0 460 aiTextureOp mOp;
nuclear@0 461
nuclear@0 462 /** UV transformation
nuclear@0 463 */
nuclear@0 464 aiUVTransform mTransform;
nuclear@0 465
nuclear@0 466 /** Name of source UV channel
nuclear@0 467 */
nuclear@0 468 std::string mUVChannel;
nuclear@0 469
nuclear@0 470 /** Resolved UV channel index or UINT_MAX if not known
nuclear@0 471 */
nuclear@0 472 unsigned int mUVId;
nuclear@0 473
nuclear@0 474 // OKINO/MAX3D extensions from here
nuclear@0 475 // -------------------------------------------------------
nuclear@0 476
nuclear@0 477 /** Weighting factor
nuclear@0 478 */
nuclear@0 479 float mWeighting;
nuclear@0 480
nuclear@0 481 /** Mixing factor from OKINO
nuclear@0 482 */
nuclear@0 483 float mMixWithPrevious;
nuclear@0 484 };
nuclear@0 485
nuclear@0 486 /** A collada effect. Can contain about anything according to the Collada spec,
nuclear@0 487 but we limit our version to a reasonable subset. */
nuclear@0 488 struct Effect
nuclear@0 489 {
nuclear@0 490 // Shading mode
nuclear@0 491 ShadeType mShadeType;
nuclear@0 492
nuclear@0 493 // Colors
nuclear@0 494 aiColor4D mEmissive, mAmbient, mDiffuse, mSpecular,
nuclear@0 495 mTransparent, mReflective;
nuclear@0 496
nuclear@0 497 // Textures
nuclear@0 498 Sampler mTexEmissive, mTexAmbient, mTexDiffuse, mTexSpecular,
nuclear@0 499 mTexTransparent, mTexBump, mTexReflective;
nuclear@0 500
nuclear@0 501 // Scalar factory
nuclear@0 502 float mShininess, mRefractIndex, mReflectivity;
nuclear@0 503 float mTransparency;
nuclear@0 504
nuclear@0 505 // local params referring to each other by their SID
nuclear@0 506 typedef std::map<std::string, Collada::EffectParam> ParamLibrary;
nuclear@0 507 ParamLibrary mParams;
nuclear@0 508
nuclear@0 509 // MAX3D extensions
nuclear@0 510 // ---------------------------------------------------------
nuclear@0 511 // Double-sided?
nuclear@0 512 bool mDoubleSided, mWireframe, mFaceted;
nuclear@0 513
nuclear@0 514 Effect()
nuclear@0 515 : mShadeType (Shade_Phong)
nuclear@0 516 , mEmissive ( 0, 0, 0, 1)
nuclear@0 517 , mAmbient ( 0.1f, 0.1f, 0.1f, 1)
nuclear@0 518 , mDiffuse ( 0.6f, 0.6f, 0.6f, 1)
nuclear@0 519 , mSpecular ( 0.4f, 0.4f, 0.4f, 1)
nuclear@0 520 , mTransparent ( 0, 0, 0, 1)
nuclear@0 521 , mShininess (10.0f)
nuclear@0 522 , mRefractIndex (1.f)
nuclear@0 523 , mReflectivity (1.f)
nuclear@0 524 , mTransparency (0.f)
nuclear@0 525 , mDoubleSided (false)
nuclear@0 526 , mWireframe (false)
nuclear@0 527 , mFaceted (false)
nuclear@0 528 {
nuclear@0 529 }
nuclear@0 530 };
nuclear@0 531
nuclear@0 532 /** An image, meaning texture */
nuclear@0 533 struct Image
nuclear@0 534 {
nuclear@0 535 std::string mFileName;
nuclear@0 536
nuclear@0 537 /** If image file name is zero, embedded image data
nuclear@0 538 */
nuclear@0 539 std::vector<uint8_t> mImageData;
nuclear@0 540
nuclear@0 541 /** If image file name is zero, file format of
nuclear@0 542 * embedded image data.
nuclear@0 543 */
nuclear@0 544 std::string mEmbeddedFormat;
nuclear@0 545
nuclear@0 546 };
nuclear@0 547
nuclear@0 548 /** An animation channel. */
nuclear@0 549 struct AnimationChannel
nuclear@0 550 {
nuclear@0 551 /** URL of the data to animate. Could be about anything, but we support only the
nuclear@0 552 * "NodeID/TransformID.SubElement" notation
nuclear@0 553 */
nuclear@0 554 std::string mTarget;
nuclear@0 555
nuclear@0 556 /** Source URL of the time values. Collada calls them "input". Meh. */
nuclear@0 557 std::string mSourceTimes;
nuclear@0 558 /** Source URL of the value values. Collada calls them "output". */
nuclear@0 559 std::string mSourceValues;
nuclear@0 560 };
nuclear@0 561
nuclear@0 562 /** An animation. Container for 0-x animation channels or 0-x animations */
nuclear@0 563 struct Animation
nuclear@0 564 {
nuclear@0 565 /** Anim name */
nuclear@0 566 std::string mName;
nuclear@0 567
nuclear@0 568 /** the animation channels, if any */
nuclear@0 569 std::vector<AnimationChannel> mChannels;
nuclear@0 570
nuclear@0 571 /** the sub-animations, if any */
nuclear@0 572 std::vector<Animation*> mSubAnims;
nuclear@0 573
nuclear@0 574 /** Destructor */
nuclear@0 575 ~Animation()
nuclear@0 576 {
nuclear@0 577 for( std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it)
nuclear@0 578 delete *it;
nuclear@0 579 }
nuclear@0 580 };
nuclear@0 581
nuclear@0 582 /** Description of a collada animation channel which has been determined to affect the current node */
nuclear@0 583 struct ChannelEntry
nuclear@0 584 {
nuclear@0 585 const Collada::AnimationChannel* mChannel; ///> the source channel
nuclear@0 586 std::string mTransformId; // the ID of the transformation step of the node which is influenced
nuclear@0 587 size_t mTransformIndex; // Index into the node's transform chain to apply the channel to
nuclear@0 588 size_t mSubElement; // starting index inside the transform data
nuclear@0 589
nuclear@0 590 // resolved data references
nuclear@0 591 const Collada::Accessor* mTimeAccessor; ///> Collada accessor to the time values
nuclear@0 592 const Collada::Data* mTimeData; ///> Source data array for the time values
nuclear@0 593 const Collada::Accessor* mValueAccessor; ///> Collada accessor to the key value values
nuclear@0 594 const Collada::Data* mValueData; ///> Source datat array for the key value values
nuclear@0 595
nuclear@0 596 ChannelEntry() { mChannel = NULL; mSubElement = 0; }
nuclear@0 597 };
nuclear@0 598
nuclear@0 599 } // end of namespace Collada
nuclear@0 600 } // end of namespace Assimp
nuclear@0 601
nuclear@0 602 #endif // AI_COLLADAHELPER_H_INC