diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 37f57da2..f9dd5bf7 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -4685,29 +4685,17 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector& triangles) } } -void COldModelManager::ChangeVariant(std::vector& triangles, int variant) -{ - for (int i = 0; i < static_cast( triangles.size() ); i++) - { - if (triangles[i].tex1Name == "base1.png" || - triangles[i].tex1Name == "convert.png" || - triangles[i].tex1Name == "derrick.png" || - triangles[i].tex1Name == "factory.png" || - triangles[i].tex1Name == "lemt.png" || - triangles[i].tex1Name == "roller.png" || - triangles[i].tex1Name == "rollert.png" || - triangles[i].tex1Name == "search.png" || - triangles[i].tex1Name == "drawer.png" || - triangles[i].tex1Name == "subm.png" ) - { - //triangles[i].tex1Name += StrUtils::ToString(variant); - } - } -} - } diff --git a/src/graphics/engine/oldmodelmanager.h b/src/graphics/engine/oldmodelmanager.h index feb7424c..2be58414 100644 --- a/src/graphics/engine/oldmodelmanager.h +++ b/src/graphics/engine/oldmodelmanager.h @@ -83,8 +83,6 @@ public: protected: //! Mirrors the model along the Z axis void Mirror(std::vector& triangles); - //! Changes variant - void ChangeVariant(std::vector& triangles, int variant); private: struct ModelInfo diff --git a/src/graphics/model/model_input.cpp b/src/graphics/model/model_input.cpp index e98213b4..6bb0fcd1 100644 --- a/src/graphics/model/model_input.cpp +++ b/src/graphics/model/model_input.cpp @@ -203,9 +203,9 @@ void ModelInput::ReadBinaryModelV1AndV2(CModel &model, std::istream &stream) triangle.p1 = t.p1; triangle.p2 = t.p2; triangle.p3 = t.p3; - triangle.tex1Name = t.tex1Name; - triangle.tex2Name = t.tex2Name; - triangle.variableTex2 = t.variableTex2; + triangle.material.albedoTexture = t.tex1Name; + triangle.material.detailTexture = t.tex2Name; + triangle.material.variableDetail = t.variableTex2; ConvertFromOldRenderState(triangle, t.state); mesh.AddTriangle(triangle); @@ -300,9 +300,9 @@ void ModelInput::ReadTextModelV1AndV2(CModel &model, std::istream &stream) triangle.p1 = t.p1; triangle.p2 = t.p2; triangle.p3 = t.p3; - triangle.tex1Name = t.tex1Name; - triangle.tex2Name = t.tex2Name; - triangle.variableTex2 = t.variableTex2; + triangle.material.albedoTexture = t.tex1Name; + triangle.material.detailTexture = t.tex2Name; + triangle.material.variableDetail = t.variableTex2; ConvertFromOldRenderState(triangle, t.state); mesh.AddTriangle(triangle); @@ -393,16 +393,17 @@ CModelMesh ModelInput::ReadTextMesh(std::istream& stream) t.p2.color = color; t.p3.color = color; - t.tex1Name = ReadLineString(stream, "tex1"); - t.tex2Name = ReadLineString(stream, "tex2"); - t.variableTex2 = ReadLineString(stream, "var_tex2") == std::string("Y"); + t.material.albedoTexture = ReadLineString(stream, "tex1"); + t.material.detailTexture = ReadLineString(stream, "tex2"); + t.material.variableDetail = ReadLineString(stream, "var_tex2") == std::string("Y"); - t.alphaMode = ParseTransparentMode(ReadLineString(stream, "trans_mode")); - t.tag = ParseSpecialMark(ReadLineString(stream, "mark")); - t.doubleSided = ReadLineString(stream, "dbl_side") == std::string("Y"); + t.material.alphaMode = ParseTransparentMode(ReadLineString(stream, "trans_mode")); + t.material.tag = ParseSpecialMark(ReadLineString(stream, "mark")); + bool doubleSided = ReadLineString(stream, "dbl_side") == std::string("Y"); + t.material.cullFace = doubleSided ? CullFace::NONE : CullFace::BACK; - if (t.alphaMode != AlphaMode::OPAQUE) - t.alphaThreshold = 0.5f; + if (t.material.alphaMode != AlphaMode::OPAQUE) + t.material.alphaThreshold = 0.5f; mesh.AddTriangle(t); } @@ -602,13 +603,13 @@ std::vector ModelInput::ReadOldModelV3(std::istream &stream, int ConvertOldTex1Name(triangle, t.texName); ConvertFromOldRenderState(triangle, t.state); - triangle.variableTex2 = t.texNum2 == 1; + triangle.material.variableDetail = t.texNum2 == 1; - if (!triangle.variableTex2 && t.texNum2 != 0) + if (!triangle.material.variableDetail && t.texNum2 != 0) { char tex2Name[20] = { 0 }; std::sprintf(tex2Name, "dirty%.2d.png", t.texNum2); - triangle.tex2Name = tex2Name; + triangle.material.detailTexture = tex2Name; } triangles.push_back(triangle); @@ -633,31 +634,32 @@ ModelLODLevel ModelInput::MinMaxToLodLevel(float min, float max) void ModelInput::ConvertOldTex1Name(ModelTriangle& triangle, const char* tex1Name) { - triangle.tex1Name = tex1Name; - boost::replace_all(triangle.tex1Name, "bmp", "png"); - boost::replace_all(triangle.tex1Name, "tga", "png"); + triangle.material.albedoTexture = tex1Name; + boost::replace_all(triangle.material.albedoTexture, "bmp", "png"); + boost::replace_all(triangle.material.albedoTexture, "tga", "png"); } void ModelInput::ConvertFromOldRenderState(ModelTriangle& triangle, int state) { - if (triangle.tex1Name == "plant.png" || (state & static_cast(ModelRenderState::Alpha)) != 0) + if (triangle.material.albedoTexture == "plant.png" || (state & static_cast(ModelRenderState::Alpha)) != 0) { - triangle.alphaMode = AlphaMode::MASK; - triangle.alphaThreshold = 0.5f; + triangle.material.alphaMode = AlphaMode::MASK; + triangle.material.alphaThreshold = 0.5f; } else - triangle.alphaMode = AlphaMode::OPAQUE; + triangle.material.alphaMode = AlphaMode::OPAQUE; if ((state & static_cast(ModelRenderState::Part1)) != 0) - triangle.tag = "tracker_right"; + triangle.material.tag = "tracker_right"; else if ((state & static_cast(ModelRenderState::Part2)) != 0) - triangle.tag = "tracker_left"; + triangle.material.tag = "tracker_left"; else if ((state & static_cast(ModelRenderState::Part3)) != 0) - triangle.tag = "energy"; + triangle.material.tag = "energy"; else - triangle.tag = ""; + triangle.material.tag = ""; - triangle.doubleSided = (state & static_cast(ModelRenderState::TwoFace)) != 0; + bool doubleSided = (state & static_cast(ModelRenderState::TwoFace)) != 0; + triangle.material.cullFace = doubleSided ? CullFace::NONE : CullFace::BACK; } Vertex3D ModelInput::ReadBinaryVertex(std::istream& stream) diff --git a/src/graphics/model/model_triangle.h b/src/graphics/model/model_triangle.h index 0f0bffea..498dcf4a 100644 --- a/src/graphics/model/model_triangle.h +++ b/src/graphics/model/model_triangle.h @@ -19,15 +19,12 @@ #pragma once -#include "graphics/core/color.h" -#include "graphics/core/transparency.h" +#include "graphics/core/material.h" #include "graphics/core/vertex.h" namespace Gfx { -enum class AlphaMode : unsigned char; - /** * \struct ModelTriangle * \brief A single triangle in mesh as saved in model file @@ -40,19 +37,8 @@ struct ModelTriangle Vertex3D p2; //! 3rd vertex Vertex3D p3; - //! Name of 1st texture - std::string tex1Name; - //! Name of 2nd texture - std::string tex2Name; - //! If true, 2nd texture will be taken from current engine setting - bool variableTex2 = false; - //! Whether to render as double-sided surface - bool doubleSided = false; - //! How to deal with texture transparency - AlphaMode alphaMode = {}; - float alphaThreshold = 0.5f; - //! Special marking - std::string tag = ""; + //! Material + Material material; }; } // namespace Gfx diff --git a/src/tools/convert_model.cpp b/src/tools/convert_model.cpp index dd1fddd0..21c193d0 100644 --- a/src/tools/convert_model.cpp +++ b/src/tools/convert_model.cpp @@ -188,10 +188,10 @@ void DumpInfo(const CModel& model) bboxMax.y = Math::Max(t.p1.position.y, t.p2.position.y, t.p3.position.y, bboxMax.y); bboxMax.z = Math::Max(t.p1.position.z, t.p2.position.z, t.p3.position.z, bboxMax.z); - texs1[t.tex1Name] += 1; - if (! t.tex2Name.empty()) - texs2[t.tex2Name] += 1; - if (t.variableTex2) + texs1[t.material.albedoTexture] += 1; + if (! t.material.detailTexture.empty()) + texs2[t.material.detailTexture] += 1; + if (t.material.variableDetail) variableTexs2 += 1; }