diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-11-10 22:42:11 +0200 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-11-10 22:42:11 +0200 |
commit | c3c7e6ebc29cce466d954f72f340a257d76b5ec2 (patch) | |
tree | dc72395a1792572e9ddea04b1cfe2d8ce5503c78 /src/3rdparty/assimp/code/IRRShared.cpp | |
parent | fa7cb071928c9603bb0c5a0f1958dd4a7c045340 (diff) | |
parent | a96a379a6aeac867413330026a78ff71c19d34dc (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.8' into tqtc/lts-5.15-opensourcev5.15.8-lts-lgpl
Change-Id: I503a36099765acfde0a14df04c8215b055121fa5
Diffstat (limited to 'src/3rdparty/assimp/code/IRRShared.cpp')
-rw-r--r-- | src/3rdparty/assimp/code/IRRShared.cpp | 505 |
1 files changed, 0 insertions, 505 deletions
diff --git a/src/3rdparty/assimp/code/IRRShared.cpp b/src/3rdparty/assimp/code/IRRShared.cpp deleted file mode 100644 index bfe408629..000000000 --- a/src/3rdparty/assimp/code/IRRShared.cpp +++ /dev/null @@ -1,505 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2017, 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 following -conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its - 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 -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -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 -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 -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -/** @file IRRShared.cpp - * @brief Shared utilities for the IRR and IRRMESH loaders - */ - - - -//This section should be excluded only if both the Irrlicht AND the Irrlicht Mesh importers were omitted. -#if !(defined(ASSIMP_BUILD_NO_IRR_IMPORTER) && defined(ASSIMP_BUILD_NO_IRRMESH_IMPORTER)) - -#include "IRRShared.h" -#include "ParsingUtils.h" -#include "fast_atof.h" -#include <assimp/DefaultLogger.hpp> -#include <assimp/material.h> - - -using namespace Assimp; -using namespace irr; -using namespace irr::io; - -// Transformation matrix to convert from Assimp to IRR space -const aiMatrix4x4 Assimp::AI_TO_IRR_MATRIX = aiMatrix4x4 ( - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); - -// ------------------------------------------------------------------------------------------------ -// read a property in hexadecimal format (i.e. ffffffff) -void IrrlichtBase::ReadHexProperty (HexProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // parse the hexadecimal value - out.value = strtoul16(reader->getAttributeValue(i)); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// read a decimal property -void IrrlichtBase::ReadIntProperty (IntProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // parse the ecimal value - out.value = strtol10(reader->getAttributeValue(i)); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// read a string property -void IrrlichtBase::ReadStringProperty (StringProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // simple copy the string - out.value = std::string (reader->getAttributeValue(i)); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// read a boolean property -void IrrlichtBase::ReadBoolProperty (BoolProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // true or false, case insensitive - out.value = (ASSIMP_stricmp( reader->getAttributeValue(i), - "true") ? false : true); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// read a float property -void IrrlichtBase::ReadFloatProperty (FloatProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // just parse the float - out.value = fast_atof( reader->getAttributeValue(i) ); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// read a vector property -void IrrlichtBase::ReadVectorProperty (VectorProperty& out) -{ - for (int i = 0; i < reader->getAttributeCount();++i) - { - if (!ASSIMP_stricmp(reader->getAttributeName(i),"name")) - { - out.name = std::string( reader->getAttributeValue(i) ); - } - else if (!ASSIMP_stricmp(reader->getAttributeName(i),"value")) - { - // three floats, separated with commas - const char* ptr = reader->getAttributeValue(i); - - SkipSpaces(&ptr); - ptr = fast_atoreal_move<float>( ptr,(float&)out.value.x ); - SkipSpaces(&ptr); - if (',' != *ptr) - { - DefaultLogger::get()->error("IRR(MESH): Expected comma in vector definition"); - } - else SkipSpaces(ptr+1,&ptr); - ptr = fast_atoreal_move<float>( ptr,(float&)out.value.y ); - SkipSpaces(&ptr); - if (',' != *ptr) - { - DefaultLogger::get()->error("IRR(MESH): Expected comma in vector definition"); - } - else SkipSpaces(ptr+1,&ptr); - ptr = fast_atoreal_move<float>( ptr,(float&)out.value.z ); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// Convert a string to a proper aiMappingMode -int ConvertMappingMode(const std::string& mode) -{ - if (mode == "texture_clamp_repeat") - { - return aiTextureMapMode_Wrap; - } - else if (mode == "texture_clamp_mirror") - return aiTextureMapMode_Mirror; - - return aiTextureMapMode_Clamp; -} - -// ------------------------------------------------------------------------------------------------ -// Parse a material from the XML file -aiMaterial* IrrlichtBase::ParseMaterial(unsigned int& matFlags) -{ - aiMaterial* mat = new aiMaterial(); - aiColor4D clr; - aiString s; - - matFlags = 0; // zero output flags - int cnt = 0; // number of used texture channels - unsigned int nd = 0; - - // Continue reading from the file - while (reader->read()) - { - switch (reader->getNodeType()) - { - case EXN_ELEMENT: - - // Hex properties - if (!ASSIMP_stricmp(reader->getNodeName(),"color")) - { - HexProperty prop; - ReadHexProperty(prop); - if (prop.name == "Diffuse") - { - ColorFromARGBPacked(prop.value,clr); - mat->AddProperty(&clr,1,AI_MATKEY_COLOR_DIFFUSE); - } - else if (prop.name == "Ambient") - { - ColorFromARGBPacked(prop.value,clr); - mat->AddProperty(&clr,1,AI_MATKEY_COLOR_AMBIENT); - } - else if (prop.name == "Specular") - { - ColorFromARGBPacked(prop.value,clr); - mat->AddProperty(&clr,1,AI_MATKEY_COLOR_SPECULAR); - } - - // NOTE: The 'emissive' property causes problems. It is - // often != 0, even if there is obviously no light - // emitted by the described surface. In fact I think - // IRRLICHT ignores this property, too. -#if 0 - else if (prop.name == "Emissive") - { - ColorFromARGBPacked(prop.value,clr); - mat->AddProperty(&clr,1,AI_MATKEY_COLOR_EMISSIVE); - } -#endif - } - // Float properties - else if (!ASSIMP_stricmp(reader->getNodeName(),"float")) - { - FloatProperty prop; - ReadFloatProperty(prop); - if (prop.name == "Shininess") - { - mat->AddProperty(&prop.value,1,AI_MATKEY_SHININESS); - } - } - // Bool properties - else if (!ASSIMP_stricmp(reader->getNodeName(),"bool")) - { - BoolProperty prop; - ReadBoolProperty(prop); - if (prop.name == "Wireframe") - { - int val = (prop.value ? true : false); - mat->AddProperty(&val,1,AI_MATKEY_ENABLE_WIREFRAME); - } - else if (prop.name == "GouraudShading") - { - int val = (prop.value ? aiShadingMode_Gouraud - : aiShadingMode_NoShading); - mat->AddProperty(&val,1,AI_MATKEY_SHADING_MODEL); - } - else if (prop.name == "BackfaceCulling") - { - int val = (!prop.value); - mat->AddProperty(&val,1,AI_MATKEY_TWOSIDED); - } - } - // String properties - textures and texture related properties - else if (!ASSIMP_stricmp(reader->getNodeName(),"texture") || - !ASSIMP_stricmp(reader->getNodeName(),"enum")) - { - StringProperty prop; - ReadStringProperty(prop); - if (prop.value.length()) - { - // material type (shader) - if (prop.name == "Type") - { - if (prop.value == "solid") - { - // default material ... - } - else if (prop.value == "trans_vertex_alpha") - { - matFlags = AI_IRRMESH_MAT_trans_vertex_alpha; - } - else if (prop.value == "lightmap") - { - matFlags = AI_IRRMESH_MAT_lightmap; - } - else if (prop.value == "solid_2layer") - { - matFlags = AI_IRRMESH_MAT_solid_2layer; - } - else if (prop.value == "lightmap_m2") - { - matFlags = AI_IRRMESH_MAT_lightmap_m2; - } - else if (prop.value == "lightmap_m4") - { - matFlags = AI_IRRMESH_MAT_lightmap_m4; - } - else if (prop.value == "lightmap_light") - { - matFlags = AI_IRRMESH_MAT_lightmap_light; - } - else if (prop.value == "lightmap_light_m2") - { - matFlags = AI_IRRMESH_MAT_lightmap_light_m2; - } - else if (prop.value == "lightmap_light_m4") - { - matFlags = AI_IRRMESH_MAT_lightmap_light_m4; - } - else if (prop.value == "lightmap_add") - { - matFlags = AI_IRRMESH_MAT_lightmap_add; - } - // Normal and parallax maps are treated equally - else if (prop.value == "normalmap_solid" || - prop.value == "parallaxmap_solid") - { - matFlags = AI_IRRMESH_MAT_normalmap_solid; - } - else if (prop.value == "normalmap_trans_vertex_alpha" || - prop.value == "parallaxmap_trans_vertex_alpha") - { - matFlags = AI_IRRMESH_MAT_normalmap_tva; - } - else if (prop.value == "normalmap_trans_add" || - prop.value == "parallaxmap_trans_add") - { - matFlags = AI_IRRMESH_MAT_normalmap_ta; - } - else { - DefaultLogger::get()->warn("IRRMat: Unrecognized material type: " + prop.value); - } - } - - // Up to 4 texture channels are supported - if (prop.name == "Texture1") - { - // Always accept the primary texture channel - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(0)); - } - else if (prop.name == "Texture2" && cnt == 1) - { - // 2-layer material lightmapped? - if (matFlags & AI_IRRMESH_MAT_lightmap) { - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_LIGHTMAP(0)); - - // set the corresponding material flag - matFlags |= AI_IRRMESH_EXTRA_2ND_TEXTURE; - } - // alternatively: normal or parallax mapping - else if (matFlags & AI_IRRMESH_MAT_normalmap_solid) { - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_NORMALS(0)); - - // set the corresponding material flag - matFlags |= AI_IRRMESH_EXTRA_2ND_TEXTURE; - } - // or just as second diffuse texture - else if (matFlags & AI_IRRMESH_MAT_solid_2layer) { - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(1)); - ++nd; - - // set the corresponding material flag - matFlags |= AI_IRRMESH_EXTRA_2ND_TEXTURE; - } - else DefaultLogger::get()->warn("IRRmat: Skipping second texture"); - } - - else if (prop.name == "Texture3" && cnt == 2) - { - // Irrlicht does not seem to use these channels. - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(nd+1)); - } - else if (prop.name == "Texture4" && cnt == 3) - { - // Irrlicht does not seem to use these channels. - ++cnt; - s.Set(prop.value); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(nd+2)); - } - - // Texture mapping options - if (prop.name == "TextureWrap1" && cnt >= 1) - { - int map = ConvertMappingMode(prop.value); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_DIFFUSE(0)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_DIFFUSE(0)); - } - else if (prop.name == "TextureWrap2" && cnt >= 2) - { - int map = ConvertMappingMode(prop.value); - if (matFlags & AI_IRRMESH_MAT_lightmap) { - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_LIGHTMAP(0)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_LIGHTMAP(0)); - } - else if (matFlags & (AI_IRRMESH_MAT_normalmap_solid)) { - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_NORMALS(0)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_NORMALS(0)); - } - else if (matFlags & AI_IRRMESH_MAT_solid_2layer) { - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_DIFFUSE(1)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_DIFFUSE(1)); - } - } - else if (prop.name == "TextureWrap3" && cnt >= 3) - { - int map = ConvertMappingMode(prop.value); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_DIFFUSE(nd+1)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_DIFFUSE(nd+1)); - } - else if (prop.name == "TextureWrap4" && cnt >= 4) - { - int map = ConvertMappingMode(prop.value); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_U_DIFFUSE(nd+2)); - mat->AddProperty(&map,1,AI_MATKEY_MAPPINGMODE_V_DIFFUSE(nd+2)); - } - } - } - break; - case EXN_ELEMENT_END: - - /* Assume there are no further nested nodes in <material> elements - */ - if (/* IRRMESH */ !ASSIMP_stricmp(reader->getNodeName(),"material") || - /* IRR */ !ASSIMP_stricmp(reader->getNodeName(),"attributes")) - { - // Now process lightmapping flags - // We should have at least one textur to do that .. - if (cnt && matFlags & AI_IRRMESH_MAT_lightmap) - { - float f = 1.f; - unsigned int unmasked = matFlags&~AI_IRRMESH_MAT_lightmap; - - // Additive lightmap? - int op = (unmasked & AI_IRRMESH_MAT_lightmap_add - ? aiTextureOp_Add : aiTextureOp_Multiply); - - // Handle Irrlicht's lightmapping scaling factor - if (unmasked & AI_IRRMESH_MAT_lightmap_m2 || - unmasked & AI_IRRMESH_MAT_lightmap_light_m2) - { - f = 2.f; - } - else if (unmasked & AI_IRRMESH_MAT_lightmap_m4 || - unmasked & AI_IRRMESH_MAT_lightmap_light_m4) - { - f = 4.f; - } - mat->AddProperty( &f, 1, AI_MATKEY_TEXBLEND_LIGHTMAP(0)); - mat->AddProperty( &op,1, AI_MATKEY_TEXOP_LIGHTMAP(0)); - } - - return mat; - } - default: - - // GCC complains here ... - break; - } - } - DefaultLogger::get()->error("IRRMESH: Unexpected end of file. Material is not complete"); - return mat; -} - -#endif // !(defined(ASSIMP_BUILD_NO_IRR_IMPORTER) && defined(ASSIMP_BUILD_NO_IRRMESH_IMPORTER)) |