summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/assimp/code/IRRShared.h
blob: b5cd5d5bafdfbd36ae338ec5551b4ddfbf5fa03b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118


/** @file  IRRShared.h
  * @brief Shared utilities for the IRR and IRRMESH loaders
  */

#ifndef INCLUDED_AI_IRRSHARED_H
#define INCLUDED_AI_IRRSHARED_H

#include "irrXMLWrapper.h"
#include "BaseImporter.h"
#include <stdint.h>

struct aiMaterial;

namespace Assimp    {


/** @brief Matrix to convert from Assimp to IRR and backwards
 */
extern const aiMatrix4x4 AI_TO_IRR_MATRIX;


// Default: 0 = solid, one texture
#define AI_IRRMESH_MAT_solid_2layer         0x10000

// Transparency flags
#define AI_IRRMESH_MAT_trans_vertex_alpha   0x1
#define AI_IRRMESH_MAT_trans_add            0x2

// Lightmapping flags
#define AI_IRRMESH_MAT_lightmap             0x2
#define AI_IRRMESH_MAT_lightmap_m2          (AI_IRRMESH_MAT_lightmap|0x4)
#define AI_IRRMESH_MAT_lightmap_m4          (AI_IRRMESH_MAT_lightmap|0x8)
#define AI_IRRMESH_MAT_lightmap_light       (AI_IRRMESH_MAT_lightmap|0x10)
#define AI_IRRMESH_MAT_lightmap_light_m2    (AI_IRRMESH_MAT_lightmap|0x20)
#define AI_IRRMESH_MAT_lightmap_light_m4    (AI_IRRMESH_MAT_lightmap|0x40)
#define AI_IRRMESH_MAT_lightmap_add         (AI_IRRMESH_MAT_lightmap|0x80)

// Standard NormalMap (or Parallax map, they're treated equally)
#define AI_IRRMESH_MAT_normalmap_solid      (0x100)

// Normal map combined with vertex alpha
#define AI_IRRMESH_MAT_normalmap_tva    \
    (AI_IRRMESH_MAT_normalmap_solid | AI_IRRMESH_MAT_trans_vertex_alpha)

// Normal map combined with additive transparency
#define AI_IRRMESH_MAT_normalmap_ta     \
    (AI_IRRMESH_MAT_normalmap_solid | AI_IRRMESH_MAT_trans_add)

// Special flag. It indicates a second texture has been found
// Its type depends ... either a normal textue or a normal map
#define AI_IRRMESH_EXTRA_2ND_TEXTURE        0x100000

// ---------------------------------------------------------------------------
/** Base class for the Irr and IrrMesh importers.
 *
 *  Declares some irrlight-related xml parsing utilities and provides tools
 *  to load materials from IRR and IRRMESH files.
 */
class IrrlichtBase
{
protected:

    /** @brief Data structure for a simple name-value property
     */
    template <class T>
    struct Property
    {
        std::string name;
        T value;
    };

    typedef Property<uint32_t>      HexProperty;
    typedef Property<std::string>   StringProperty;
    typedef Property<bool>          BoolProperty;
    typedef Property<float>         FloatProperty;
    typedef Property<aiVector3D>    VectorProperty;
    typedef Property<int>           IntProperty;

    /** XML reader instance
     */
  irr::io::IrrXMLReader* reader;

    // -------------------------------------------------------------------
    /** Parse a material description from the XML
     *  @return The created material
     *  @param matFlags Receives AI_IRRMESH_MAT_XX flags
     */
    aiMaterial* ParseMaterial(unsigned int& matFlags);

    // -------------------------------------------------------------------
    /** Read a property of the specified type from the current XML element.
     *  @param out Recives output data
     */
    void ReadHexProperty    (HexProperty&    out);
    void ReadStringProperty (StringProperty& out);
    void ReadBoolProperty   (BoolProperty&   out);
    void ReadFloatProperty  (FloatProperty&  out);
    void ReadVectorProperty (VectorProperty&  out);
    void ReadIntProperty    (IntProperty&    out);
};


// ------------------------------------------------------------------------------------------------
// Unpack a hex color, e.g. 0xdcdedfff
inline void ColorFromARGBPacked(uint32_t in, aiColor4D& clr)
{
    clr.a = ((in >> 24) & 0xff) / 255.f;
    clr.r = ((in >> 16) & 0xff) / 255.f;
    clr.g = ((in >>  8) & 0xff) / 255.f;
    clr.b = ((in      ) & 0xff) / 255.f;
}


} // end namespace Assimp

#endif // !! INCLUDED_AI_IRRSHARED_H