Torque3D/Engine/lib/assimp/code/AssetLib/Irr/IRRShared.h

117 lines
3.8 KiB
C
Raw Normal View History

2019-11-10 14:40:50 +00:00
/** @file IRRShared.h
2024-12-09 20:22:47 +00:00
* @brief Shared utilities for the IRR and IRRMESH loaders
*/
2019-11-10 14:40:50 +00:00
#ifndef INCLUDED_AI_IRRSHARED_H
#define INCLUDED_AI_IRRSHARED_H
#include <assimp/BaseImporter.h>
2022-04-26 11:56:24 -05:00
#include <assimp/XmlParser.h>
#include <cstdint>
2019-11-10 14:40:50 +00:00
struct aiMaterial;
2022-04-26 11:56:24 -05:00
namespace Assimp {
2019-11-10 14:40:50 +00:00
/** @brief Matrix to convert from Assimp to IRR and backwards
*/
extern const aiMatrix4x4 AI_TO_IRR_MATRIX;
// Default: 0 = solid, one texture
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_MAT_solid_2layer 0x10000
2019-11-10 14:40:50 +00:00
// Transparency flags
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_MAT_trans_vertex_alpha 0x1
#define AI_IRRMESH_MAT_trans_add 0x2
2019-11-10 14:40:50 +00:00
// Lightmapping flags
2022-04-26 11:56:24 -05:00
#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)
2019-11-10 14:40:50 +00:00
// Standard NormalMap (or Parallax map, they're treated equally)
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_MAT_normalmap_solid (0x100)
2019-11-10 14:40:50 +00:00
// Normal map combined with vertex alpha
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_MAT_normalmap_tva \
2019-11-10 14:40:50 +00:00
(AI_IRRMESH_MAT_normalmap_solid | AI_IRRMESH_MAT_trans_vertex_alpha)
// Normal map combined with additive transparency
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_MAT_normalmap_ta \
2019-11-10 14:40:50 +00:00
(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
2022-04-26 11:56:24 -05:00
#define AI_IRRMESH_EXTRA_2ND_TEXTURE 0x100000
2019-11-10 14:40:50 +00:00
// ---------------------------------------------------------------------------
/** 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.
*/
2022-04-26 11:56:24 -05:00
class IrrlichtBase {
2019-11-10 14:40:50 +00:00
protected:
2024-12-09 20:22:47 +00:00
IrrlichtBase() {
2022-04-26 11:56:24 -05:00
// empty
}
2024-12-09 20:22:47 +00:00
~IrrlichtBase() = default;
2019-11-10 14:40:50 +00:00
/** @brief Data structure for a simple name-value property
*/
template <class T>
2022-04-26 11:56:24 -05:00
struct Property {
2019-11-10 14:40:50 +00:00
std::string name;
T value;
};
2022-04-26 11:56:24 -05:00
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;
2019-11-10 14:40:50 +00:00
2022-04-26 11:56:24 -05:00
/// XML reader instance
XmlParser mParser;
2019-11-10 14:40:50 +00:00
// -------------------------------------------------------------------
/** Parse a material description from the XML
* @return The created material
* @param matFlags Receives AI_IRRMESH_MAT_XX flags
*/
2024-12-09 20:22:47 +00:00
aiMaterial *ParseMaterial(pugi::xml_node &materialNode, unsigned int &matFlags);
2019-11-10 14:40:50 +00:00
// -------------------------------------------------------------------
/** Read a property of the specified type from the current XML element.
* @param out Receives output data
2024-12-09 20:22:47 +00:00
* @param node XML attribute element containing data
2019-11-10 14:40:50 +00:00
*/
2024-12-09 20:22:47 +00:00
void ReadHexProperty(HexProperty &out, pugi::xml_node& hexnode);
void ReadStringProperty(StringProperty &out, pugi::xml_node& stringnode);
void ReadBoolProperty(BoolProperty &out, pugi::xml_node& boolnode);
void ReadFloatProperty(FloatProperty &out, pugi::xml_node& floatnode);
void ReadVectorProperty(VectorProperty &out, pugi::xml_node& vectornode);
void ReadIntProperty(IntProperty &out, pugi::xml_node& intnode);
2019-11-10 14:40:50 +00:00
};
// ------------------------------------------------------------------------------------------------
// Unpack a hex color, e.g. 0xdcdedfff
2022-04-26 11:56:24 -05:00
inline void ColorFromARGBPacked(uint32_t in, aiColor4D &clr) {
2019-11-10 14:40:50 +00:00
clr.a = ((in >> 24) & 0xff) / 255.f;
clr.r = ((in >> 16) & 0xff) / 255.f;
2022-04-26 11:56:24 -05:00
clr.g = ((in >> 8) & 0xff) / 255.f;
clr.b = ((in)&0xff) / 255.f;
2019-11-10 14:40:50 +00:00
}
} // end namespace Assimp
#endif // !! INCLUDED_AI_IRRSHARED_H