Coverage Report

Created: 2025-06-22 07:30

/src/assimp/code/AssetLib/Ogre/OgreStructs.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
Open Asset Import Library (assimp)
3
----------------------------------------------------------------------
4
5
Copyright (c) 2006-2025, assimp team
6
7
All rights reserved.
8
9
Redistribution and use of this software in source and binary forms,
10
with or without modification, are permitted provided that the
11
following conditions are met:
12
13
* Redistributions of source code must retain the above
14
  copyright notice, this list of conditions and the
15
  following disclaimer.
16
17
* Redistributions in binary form must reproduce the above
18
  copyright notice, this list of conditions and the
19
  following disclaimer in the documentation and/or other
20
  materials provided with the distribution.
21
22
* Neither the name of the assimp team, nor the names of its
23
  contributors may be used to endorse or promote products
24
  derived from this software without specific prior
25
  written permission of the assimp team.
26
27
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
39
----------------------------------------------------------------------
40
*/
41
42
#ifndef AI_OGRESTRUCTS_H_INC
43
#define AI_OGRESTRUCTS_H_INC
44
45
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
46
47
#include <assimp/MemoryIOWrapper.h>
48
#include <memory>
49
#include <assimp/mesh.h>
50
#include <map>
51
#include <vector>
52
#include <set>
53
54
struct aiNodeAnim;
55
struct aiAnimation;
56
struct aiNode;
57
struct aiMaterial;
58
struct aiScene;
59
60
/** @note Parts of this implementation, for example enums, deserialization constants and logic
61
    has been copied directly with minor modifications from the MIT licensed Ogre3D code base.
62
    See more from https://bitbucket.org/sinbad/ogre. */
63
64
namespace Assimp
65
{
66
namespace Ogre
67
{
68
69
// Forward decl
70
class Mesh;
71
class MeshXml;
72
class SubMesh;
73
class SubMeshXml;
74
class Skeleton;
75
76
0
#define OGRE_SAFE_DELETE(p) delete p; p=0;
77
78
// Typedefs
79
typedef Assimp::MemoryIOStream MemoryStream;
80
typedef std::shared_ptr<MemoryStream> MemoryStreamPtr;
81
typedef std::map<uint16_t, MemoryStreamPtr> VertexBufferBindings;
82
83
// Ogre Vertex Element
84
class VertexElement
85
{
86
public:
87
    /// Vertex element semantics, used to identify the meaning of vertex buffer contents
88
    enum Semantic {
89
        /// Position, 3 reals per vertex
90
        VES_POSITION = 1,
91
        /// Blending weights
92
        VES_BLEND_WEIGHTS = 2,
93
        /// Blending indices
94
        VES_BLEND_INDICES = 3,
95
        /// Normal, 3 reals per vertex
96
        VES_NORMAL = 4,
97
        /// Diffuse colours
98
        VES_DIFFUSE = 5,
99
        /// Specular colours
100
        VES_SPECULAR = 6,
101
        /// Texture coordinates
102
        VES_TEXTURE_COORDINATES = 7,
103
        /// Binormal (Y axis if normal is Z)
104
        VES_BINORMAL = 8,
105
        /// Tangent (X axis if normal is Z)
106
        VES_TANGENT = 9,
107
        /// The  number of VertexElementSemantic elements (note - the first value VES_POSITION is 1)
108
        VES_COUNT = 9
109
    };
110
111
    /// Vertex element type, used to identify the base types of the vertex contents
112
    enum Type
113
    {
114
        VET_FLOAT1 = 0,
115
        VET_FLOAT2 = 1,
116
        VET_FLOAT3 = 2,
117
        VET_FLOAT4 = 3,
118
        /// alias to more specific colour type - use the current rendersystem's colour packing
119
        VET_COLOUR = 4,
120
        VET_SHORT1 = 5,
121
        VET_SHORT2 = 6,
122
        VET_SHORT3 = 7,
123
        VET_SHORT4 = 8,
124
        VET_UBYTE4 = 9,
125
        /// D3D style compact colour
126
        VET_COLOUR_ARGB = 10,
127
        /// GL style compact colour
128
        VET_COLOUR_ABGR = 11,
129
        VET_DOUBLE1 = 12,
130
        VET_DOUBLE2 = 13,
131
        VET_DOUBLE3 = 14,
132
        VET_DOUBLE4 = 15,
133
        VET_USHORT1 = 16,
134
        VET_USHORT2 = 17,
135
        VET_USHORT3 = 18,
136
        VET_USHORT4 = 19,
137
        VET_INT1 = 20,
138
        VET_INT2 = 21,
139
        VET_INT3 = 22,
140
        VET_INT4 = 23,
141
        VET_UINT1 = 24,
142
        VET_UINT2 = 25,
143
        VET_UINT3 = 26,
144
        VET_UINT4 = 27
145
    };
146
147
    VertexElement();
148
149
    /// Size of the vertex element in bytes.
150
    size_t Size() const;
151
152
    /// Count of components in this element, eg. VET_FLOAT3 return 3.
153
    size_t ComponentCount() const;
154
155
    /// Type as string.
156
    std::string TypeToString();
157
158
    /// Semantic as string.
159
    std::string SemanticToString();
160
161
    static size_t TypeSize(Type type);
162
    static size_t ComponentCount(Type type);
163
    static std::string TypeToString(Type type);
164
    static std::string SemanticToString(Semantic semantic);
165
166
    uint16_t index;
167
    uint16_t source;
168
    uint16_t offset;
169
    Type type;
170
    Semantic semantic;
171
};
172
typedef std::vector<VertexElement> VertexElementList;
173
174
/// Ogre Vertex Bone Assignment
175
struct VertexBoneAssignment
176
{
177
    uint32_t vertexIndex;
178
    uint16_t boneIndex;
179
    float weight;
180
};
181
typedef std::vector<VertexBoneAssignment> VertexBoneAssignmentList;
182
typedef std::map<uint32_t, VertexBoneAssignmentList > VertexBoneAssignmentsMap;
183
typedef std::map<uint16_t, std::vector<aiVertexWeight> > AssimpVertexBoneWeightList;
184
185
// Ogre Vertex Data interface, inherited by the binary and XML implementations.
186
class IVertexData
187
{
188
public:
189
    IVertexData();
190
191
    /// Returns if bone assignments are available.
192
    bool HasBoneAssignments() const;
193
194
    /// Add vertex mapping from old to new index.
195
    void AddVertexMapping(uint32_t oldIndex, uint32_t newIndex);
196
197
    /// Returns re-mapped bone assignments.
198
    /** @note Uses mappings added via AddVertexMapping. */
199
    AssimpVertexBoneWeightList AssimpBoneWeights(size_t vertices);
200
201
    /// Returns a set of bone indexes that are referenced by bone assignments (weights).
202
    std::set<uint16_t> ReferencedBonesByWeights() const;
203
204
    /// Vertex count.
205
    uint32_t count;
206
207
    /// Bone assignments.
208
    VertexBoneAssignmentList boneAssignments;
209
210
private:
211
    void BoneAssignmentsForVertex(uint32_t currentIndex, uint32_t newIndex, VertexBoneAssignmentList &dest) const;
212
213
    std::map<uint32_t, std::vector<uint32_t> > vertexIndexMapping;
214
    VertexBoneAssignmentsMap boneAssignmentsMap;
215
};
216
217
// Ogre Vertex Data
218
class VertexData : public IVertexData
219
{
220
public:
221
    VertexData();
222
    ~VertexData();
223
224
    /// Releases all memory that this data structure owns.
225
    void Reset();
226
227
    /// Get vertex size for @c source.
228
    uint32_t VertexSize(uint16_t source) const;
229
230
    /// Get vertex buffer for @c source.
231
    MemoryStream *VertexBuffer(uint16_t source);
232
233
    /// Get vertex element for @c semantic for @c index.
234
    VertexElement *GetVertexElement(VertexElement::Semantic semantic, uint16_t index = 0);
235
236
    /// Vertex elements.
237
    VertexElementList vertexElements;
238
239
    /// Vertex buffers mapped to bind index.
240
    VertexBufferBindings vertexBindings;
241
};
242
243
// Ogre Index Data
244
class IndexData
245
{
246
public:
247
    IndexData();
248
    ~IndexData();
249
250
    /// Releases all memory that this data structure owns.
251
    void Reset();
252
253
    /// Index size in bytes.
254
    size_t IndexSize() const;
255
256
    /// Face size in bytes.
257
    size_t FaceSize() const;
258
259
    /// Index count.
260
    uint32_t count;
261
262
    /// Face count.
263
    uint32_t faceCount;
264
265
    /// If has 32-bit indexes.
266
    bool is32bit;
267
268
    /// Index buffer.
269
    MemoryStreamPtr buffer;
270
};
271
272
/// Ogre Pose
273
class Pose
274
{
275
public:
276
    struct Vertex
277
    {
278
        uint32_t index;
279
        aiVector3D offset;
280
        aiVector3D normal;
281
    };
282
    typedef std::map<uint32_t, Vertex> PoseVertexMap;
283
284
0
    Pose() : target(0), hasNormals(false) {}
285
286
    /// Name.
287
    std::string name;
288
289
    /// Target.
290
    uint16_t target;
291
292
    /// Does vertices map have normals.
293
    bool hasNormals;
294
295
    /// Vertex offset and normals.
296
    PoseVertexMap vertices;
297
};
298
typedef std::vector<Pose*> PoseList;
299
300
/// Ogre Pose Key Frame Ref
301
struct PoseRef
302
{
303
    uint16_t index;
304
    float influence;
305
};
306
typedef std::vector<PoseRef> PoseRefList;
307
308
/// Ogre Pose Key Frame
309
struct PoseKeyFrame
310
{
311
    /// Time position in the animation.
312
    float timePos;
313
314
    PoseRefList references;
315
};
316
typedef std::vector<PoseKeyFrame> PoseKeyFrameList;
317
318
/// Ogre Morph Key Frame
319
struct MorphKeyFrame
320
{
321
    /// Time position in the animation.
322
    float timePos;
323
324
    MemoryStreamPtr buffer;
325
};
326
typedef std::vector<MorphKeyFrame> MorphKeyFrameList;
327
328
/// Ogre animation key frame
329
struct TransformKeyFrame
330
{
331
    TransformKeyFrame();
332
333
    aiMatrix4x4 Transform();
334
335
    float timePos;
336
337
    aiQuaternion rotation;
338
    aiVector3D position;
339
    aiVector3D scale;
340
};
341
typedef std::vector<TransformKeyFrame> TransformKeyFrameList;
342
343
/// Ogre Animation Track
344
struct VertexAnimationTrack
345
{
346
    enum Type
347
    {
348
        /// No animation
349
        VAT_NONE = 0,
350
        /// Morph animation is made up of many interpolated snapshot keyframes
351
        VAT_MORPH = 1,
352
        /// Pose animation is made up of a single delta pose keyframe
353
        VAT_POSE = 2,
354
        /// Keyframe that has its on pos, rot and scale for a time position
355
        VAT_TRANSFORM = 3
356
    };
357
358
    VertexAnimationTrack();
359
360
    /// Convert to Assimp node animation.
361
    aiNodeAnim *ConvertToAssimpAnimationNode(Skeleton *skeleton);
362
363
    // Animation type.
364
    Type type;
365
366
    /// Vertex data target.
367
    /**  0 == shared geometry
368
        >0 == submesh index + 1 */
369
    uint16_t target;
370
371
    /// Only valid for VAT_TRANSFORM.
372
    std::string boneName;
373
374
    /// Only one of these will contain key frames, depending on the type enum.
375
    PoseKeyFrameList poseKeyFrames;
376
    MorphKeyFrameList morphKeyFrames;
377
    TransformKeyFrameList transformKeyFrames;
378
};
379
typedef std::vector<VertexAnimationTrack> VertexAnimationTrackList;
380
381
/// Ogre Animation
382
class Animation
383
{
384
public:
385
    explicit Animation(Skeleton *parent);
386
    explicit Animation(Mesh *parent);
387
388
    /// Returns the associated vertex data for a track in this animation.
389
    /** @note Only valid to call when parent Mesh is set. */
390
    VertexData *AssociatedVertexData(VertexAnimationTrack *track) const;
391
392
    /// Convert to Assimp animation.
393
    aiAnimation *ConvertToAssimpAnimation();
394
395
    /// Parent mesh.
396
    /** @note Set only when animation is read from a mesh. */
397
    Mesh *parentMesh;
398
399
    /// Parent skeleton.
400
    /** @note Set only when animation is read from a skeleton. */
401
    Skeleton *parentSkeleton;
402
403
    /// Animation name.
404
    std::string name;
405
406
    /// Base animation name.
407
    std::string baseName;
408
409
    /// Length in seconds.
410
    float length;
411
412
    /// Base animation key time.
413
    float baseTime;
414
415
    /// Animation tracks.
416
    VertexAnimationTrackList tracks;
417
};
418
typedef std::vector<Animation*> AnimationList;
419
420
/// Ogre Bone
421
class Bone
422
{
423
public:
424
    Bone();
425
426
    /// Returns if this bone is parented.
427
    bool IsParented() const;
428
429
    /// Parent index as uint16_t. Internally int32_t as -1 means unparented.
430
    uint16_t ParentId() const;
431
432
    /// Add child bone.
433
    void AddChild(Bone *bone);
434
435
    /// Calculates the world matrix for bone and its children.
436
    void CalculateWorldMatrixAndDefaultPose(Skeleton *skeleton);
437
438
    /// Convert to Assimp node (animation nodes).
439
    aiNode *ConvertToAssimpNode(Skeleton *parent, aiNode *parentNode = nullptr);
440
441
    /// Convert to Assimp bone (mesh bones).
442
    aiBone *ConvertToAssimpBone(Skeleton *parent, const std::vector<aiVertexWeight> &boneWeights);
443
444
    uint16_t id;
445
    std::string name;
446
447
    Bone *parent;
448
    int32_t parentId;
449
    std::vector<uint16_t> children;
450
451
    aiVector3D position;
452
    aiQuaternion rotation;
453
    aiVector3D scale;
454
455
    aiMatrix4x4 worldMatrix;
456
    aiMatrix4x4 defaultPose;
457
};
458
typedef std::vector<Bone*> BoneList;
459
460
/// Ogre Skeleton
461
class Skeleton
462
{
463
public:
464
    enum BlendMode
465
    {
466
        /// Animations are applied by calculating a weighted average of all animations
467
        ANIMBLEND_AVERAGE = 0,
468
        /// Animations are applied by calculating a weighted cumulative total
469
        ANIMBLEND_CUMULATIVE = 1
470
    };
471
472
    Skeleton();
473
    ~Skeleton();
474
475
    /// Releases all memory that this data structure owns.
476
    void Reset();
477
478
    /// Returns unparented root bones.
479
    BoneList RootBones() const;
480
481
    /// Returns number of unparented root bones.
482
    size_t NumRootBones() const;
483
484
    /// Get bone by name.
485
    Bone *BoneByName(const std::string &name) const;
486
487
    /// Get bone by id.
488
    Bone *BoneById(uint16_t id) const;
489
490
    BoneList bones;
491
    AnimationList animations;
492
493
    /// @todo Take blend mode into account, but where?
494
    BlendMode blendMode;
495
};
496
497
/// Ogre Sub Mesh interface, inherited by the binary and XML implementations.
498
class ISubMesh
499
{
500
public:
501
    /// @note Full list of Ogre types, not all of them are supported and exposed to Assimp.
502
    enum OperationType
503
    {
504
        /// A list of points, 1 vertex per point
505
        OT_POINT_LIST = 1,
506
        /// A list of lines, 2 vertices per line
507
        OT_LINE_LIST = 2,
508
        /// A strip of connected lines, 1 vertex per line plus 1 start vertex
509
        OT_LINE_STRIP = 3,
510
        /// A list of triangles, 3 vertices per triangle
511
        OT_TRIANGLE_LIST = 4,
512
        /// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
513
        OT_TRIANGLE_STRIP = 5,
514
        /// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
515
        OT_TRIANGLE_FAN = 6
516
    };
517
518
    ISubMesh();
519
520
    /// SubMesh index.
521
    unsigned int index;
522
523
    /// SubMesh name.
524
    std::string name;
525
526
    /// Material used by this submesh.
527
    std::string materialRef;
528
529
    /// Texture alias information.
530
    std::string textureAliasName;
531
    std::string textureAliasRef;
532
533
    /// Assimp scene material index used by this submesh.
534
    /** -1 if no material or material could not be imported. */
535
    int materialIndex;
536
537
    /// If submesh uses shared geometry from parent mesh.
538
    bool usesSharedVertexData;
539
540
    /// Operation type.
541
    OperationType operationType;
542
};
543
544
/// Ogre SubMesh
545
class SubMesh : public ISubMesh
546
{
547
public:
548
    SubMesh();
549
    ~SubMesh();
550
551
    /// Releases all memory that this data structure owns.
552
    /** @note Vertex and index data contains shared ptrs
553
        that are freed automatically. In practice the ref count
554
        should be 0 after this reset. */
555
    void Reset();
556
557
    /// Convert to Assimp mesh.
558
    aiMesh *ConvertToAssimpMesh(Mesh *parent);
559
560
    /// Vertex data.
561
    VertexData *vertexData;
562
563
    /// Index data.
564
    IndexData *indexData;
565
};
566
typedef std::vector<SubMesh*> SubMeshList;
567
568
/// Ogre Mesh
569
class Mesh
570
{
571
public:
572
    /// Constructor.
573
    Mesh();
574
575
    /// Destructor.
576
    ~Mesh();
577
578
    /// Releases all memory that this data structure owns.
579
    void Reset();
580
581
    /// Returns number of subMeshes.
582
    size_t NumSubMeshes() const;
583
584
    /// Returns submesh for @c index.
585
    SubMesh *GetSubMesh( size_t index) const;
586
587
    /// Convert mesh to Assimp scene.
588
    void ConvertToAssimpScene(aiScene* dest);
589
590
    /// Mesh has skeletal animations.
591
    bool hasSkeletalAnimations;
592
593
    /// Skeleton reference.
594
    std::string skeletonRef;
595
596
    /// Skeleton.
597
    Skeleton *skeleton;
598
599
    /// Vertex data
600
    VertexData *sharedVertexData;
601
602
    /// Sub meshes.
603
    SubMeshList subMeshes;
604
605
    /// Animations
606
    AnimationList animations;
607
608
    /// Poses
609
    PoseList poses;
610
};
611
612
/// Ogre XML Vertex Data
613
class VertexDataXml : public IVertexData
614
{
615
public:
616
    VertexDataXml();
617
618
    bool HasPositions() const;
619
    bool HasNormals() const;
620
    bool HasTangents() const;
621
    bool HasUvs() const;
622
    size_t NumUvs() const;
623
624
    std::vector<aiVector3D> positions;
625
    std::vector<aiVector3D> normals;
626
    std::vector<aiVector3D> tangents;
627
    std::vector<std::vector<aiVector3D> > uvs;
628
};
629
630
/// Ogre XML Index Data
631
class IndexDataXml
632
{
633
public:
634
0
    IndexDataXml() : faceCount(0) {}
635
636
    /// Face count.
637
    uint32_t faceCount;
638
639
    std::vector<aiFace> faces;
640
};
641
642
/// Ogre XML SubMesh
643
class SubMeshXml : public ISubMesh
644
{
645
public:
646
    SubMeshXml();
647
    ~SubMeshXml();
648
649
    /// Releases all memory that this data structure owns.
650
    void Reset();
651
652
    aiMesh *ConvertToAssimpMesh(MeshXml *parent);
653
654
    IndexDataXml *indexData;
655
    VertexDataXml *vertexData;
656
};
657
typedef std::vector<SubMeshXml*> SubMeshXmlList;
658
659
/// Ogre XML Mesh
660
class MeshXml
661
{
662
public:
663
    MeshXml();
664
    ~MeshXml();
665
666
    /// Releases all memory that this data structure owns.
667
    void Reset();
668
669
    /// Returns number of subMeshes.
670
    size_t NumSubMeshes() const;
671
672
    /// Returns submesh for @c index.
673
    SubMeshXml *GetSubMesh(uint16_t index) const;
674
675
    /// Convert mesh to Assimp scene.
676
    void ConvertToAssimpScene(aiScene* dest);
677
678
    /// Skeleton reference.
679
    std::string skeletonRef;
680
681
    /// Skeleton.
682
    Skeleton *skeleton;
683
684
    /// Vertex data
685
    VertexDataXml *sharedVertexData;
686
687
    /// Sub meshes.
688
    SubMeshXmlList subMeshes;
689
};
690
691
} // Ogre
692
} // Assimp
693
694
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
695
#endif // AI_OGRESTRUCTS_H_INC