Small cleanup

dev
Tomasz Kapuściński 2022-02-25 20:59:31 +01:00
parent 6447304531
commit 3168bf4350
6 changed files with 43 additions and 90 deletions

View File

@ -4685,29 +4685,17 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
vertices[1] = triangle.p2;
vertices[2] = triangle.p3;
Material material;
Material material = triangle.material;
material.albedoTexture = "objects/" + material.albedoTexture;
std::string tex1Name;
if (!triangle.tex1Name.empty())
material.albedoTexture = "objects/" + triangle.tex1Name;
std::string tex2Name;
if (triangle.variableTex2)
if (material.variableDetail)
material.detailTexture = GetSecondTexture();
else
material.detailTexture = triangle.tex2Name;
material.alphaMode = triangle.alphaMode;
material.alphaThreshold = triangle.alphaThreshold;
material.cullFace = triangle.doubleSided ? CullFace::NONE : CullFace::BACK;
material.tag = triangle.tag;
EngineBaseObjDataTier& data = AddLevel(p1, EngineTriangleType::TRIANGLES, material);
data.vertices.insert(data.vertices.end(), vertices.begin(), vertices.end());
data.updateStaticBuffer = true;
m_updateStaticBuffers = true;
for (size_t i = 0; i < vertices.size(); i++)
{
@ -4723,6 +4711,8 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
p1.totalTriangles += vertices.size() / 3;
}
m_updateStaticBuffers = true;
}
void CEngine::UpdateObjectShadowSpotNormal(int objRank)

View File

@ -86,9 +86,6 @@ bool COldModelManager::LoadModel(const std::string& fileName, bool mirrored, int
if (mirrored)
Mirror(modelInfo.triangles);
//if (variant != 0)
// ChangeVariant(modelInfo.triangles, variant);
FileInfo fileInfo(fileName, mirrored, variant);
m_models[fileInfo] = modelInfo;
@ -194,24 +191,4 @@ void COldModelManager::Mirror(std::vector<ModelTriangle>& triangles)
}
}
void COldModelManager::ChangeVariant(std::vector<ModelTriangle>& triangles, int variant)
{
for (int i = 0; i < static_cast<int>( 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<int>(variant);
}
}
}
}

View File

@ -83,8 +83,6 @@ public:
protected:
//! Mirrors the model along the Z axis
void Mirror(std::vector<ModelTriangle>& triangles);
//! Changes variant
void ChangeVariant(std::vector<ModelTriangle>& triangles, int variant);
private:
struct ModelInfo

View File

@ -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<ModelTriangle> 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<int>(ModelRenderState::Alpha)) != 0)
if (triangle.material.albedoTexture == "plant.png" || (state & static_cast<int>(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<int>(ModelRenderState::Part1)) != 0)
triangle.tag = "tracker_right";
triangle.material.tag = "tracker_right";
else if ((state & static_cast<int>(ModelRenderState::Part2)) != 0)
triangle.tag = "tracker_left";
triangle.material.tag = "tracker_left";
else if ((state & static_cast<int>(ModelRenderState::Part3)) != 0)
triangle.tag = "energy";
triangle.material.tag = "energy";
else
triangle.tag = "";
triangle.material.tag = "";
triangle.doubleSided = (state & static_cast<int>(ModelRenderState::TwoFace)) != 0;
bool doubleSided = (state & static_cast<int>(ModelRenderState::TwoFace)) != 0;
triangle.material.cullFace = doubleSided ? CullFace::NONE : CullFace::BACK;
}
Vertex3D ModelInput::ReadBinaryVertex(std::istream& stream)

View File

@ -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

View File

@ -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;
}