Small cleanup
parent
6447304531
commit
3168bf4350
|
@ -4685,29 +4685,17 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
|
||||||
vertices[1] = triangle.p2;
|
vertices[1] = triangle.p2;
|
||||||
vertices[2] = triangle.p3;
|
vertices[2] = triangle.p3;
|
||||||
|
|
||||||
Material material;
|
Material material = triangle.material;
|
||||||
|
material.albedoTexture = "objects/" + material.albedoTexture;
|
||||||
|
|
||||||
std::string tex1Name;
|
if (material.variableDetail)
|
||||||
if (!triangle.tex1Name.empty())
|
|
||||||
material.albedoTexture = "objects/" + triangle.tex1Name;
|
|
||||||
|
|
||||||
std::string tex2Name;
|
|
||||||
if (triangle.variableTex2)
|
|
||||||
material.detailTexture = GetSecondTexture();
|
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);
|
EngineBaseObjDataTier& data = AddLevel(p1, EngineTriangleType::TRIANGLES, material);
|
||||||
|
|
||||||
data.vertices.insert(data.vertices.end(), vertices.begin(), vertices.end());
|
data.vertices.insert(data.vertices.end(), vertices.begin(), vertices.end());
|
||||||
|
|
||||||
data.updateStaticBuffer = true;
|
data.updateStaticBuffer = true;
|
||||||
m_updateStaticBuffers = true;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < vertices.size(); i++)
|
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;
|
p1.totalTriangles += vertices.size() / 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_updateStaticBuffers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEngine::UpdateObjectShadowSpotNormal(int objRank)
|
void CEngine::UpdateObjectShadowSpotNormal(int objRank)
|
||||||
|
|
|
@ -86,9 +86,6 @@ bool COldModelManager::LoadModel(const std::string& fileName, bool mirrored, int
|
||||||
if (mirrored)
|
if (mirrored)
|
||||||
Mirror(modelInfo.triangles);
|
Mirror(modelInfo.triangles);
|
||||||
|
|
||||||
//if (variant != 0)
|
|
||||||
// ChangeVariant(modelInfo.triangles, variant);
|
|
||||||
|
|
||||||
FileInfo fileInfo(fileName, mirrored, variant);
|
FileInfo fileInfo(fileName, mirrored, variant);
|
||||||
m_models[fileInfo] = modelInfo;
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,8 +83,6 @@ public:
|
||||||
protected:
|
protected:
|
||||||
//! Mirrors the model along the Z axis
|
//! Mirrors the model along the Z axis
|
||||||
void Mirror(std::vector<ModelTriangle>& triangles);
|
void Mirror(std::vector<ModelTriangle>& triangles);
|
||||||
//! Changes variant
|
|
||||||
void ChangeVariant(std::vector<ModelTriangle>& triangles, int variant);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ModelInfo
|
struct ModelInfo
|
||||||
|
|
|
@ -203,9 +203,9 @@ void ModelInput::ReadBinaryModelV1AndV2(CModel &model, std::istream &stream)
|
||||||
triangle.p1 = t.p1;
|
triangle.p1 = t.p1;
|
||||||
triangle.p2 = t.p2;
|
triangle.p2 = t.p2;
|
||||||
triangle.p3 = t.p3;
|
triangle.p3 = t.p3;
|
||||||
triangle.tex1Name = t.tex1Name;
|
triangle.material.albedoTexture = t.tex1Name;
|
||||||
triangle.tex2Name = t.tex2Name;
|
triangle.material.detailTexture = t.tex2Name;
|
||||||
triangle.variableTex2 = t.variableTex2;
|
triangle.material.variableDetail = t.variableTex2;
|
||||||
ConvertFromOldRenderState(triangle, t.state);
|
ConvertFromOldRenderState(triangle, t.state);
|
||||||
|
|
||||||
mesh.AddTriangle(triangle);
|
mesh.AddTriangle(triangle);
|
||||||
|
@ -300,9 +300,9 @@ void ModelInput::ReadTextModelV1AndV2(CModel &model, std::istream &stream)
|
||||||
triangle.p1 = t.p1;
|
triangle.p1 = t.p1;
|
||||||
triangle.p2 = t.p2;
|
triangle.p2 = t.p2;
|
||||||
triangle.p3 = t.p3;
|
triangle.p3 = t.p3;
|
||||||
triangle.tex1Name = t.tex1Name;
|
triangle.material.albedoTexture = t.tex1Name;
|
||||||
triangle.tex2Name = t.tex2Name;
|
triangle.material.detailTexture = t.tex2Name;
|
||||||
triangle.variableTex2 = t.variableTex2;
|
triangle.material.variableDetail = t.variableTex2;
|
||||||
ConvertFromOldRenderState(triangle, t.state);
|
ConvertFromOldRenderState(triangle, t.state);
|
||||||
|
|
||||||
mesh.AddTriangle(triangle);
|
mesh.AddTriangle(triangle);
|
||||||
|
@ -393,16 +393,17 @@ CModelMesh ModelInput::ReadTextMesh(std::istream& stream)
|
||||||
t.p2.color = color;
|
t.p2.color = color;
|
||||||
t.p3.color = color;
|
t.p3.color = color;
|
||||||
|
|
||||||
t.tex1Name = ReadLineString(stream, "tex1");
|
t.material.albedoTexture = ReadLineString(stream, "tex1");
|
||||||
t.tex2Name = ReadLineString(stream, "tex2");
|
t.material.detailTexture = ReadLineString(stream, "tex2");
|
||||||
t.variableTex2 = ReadLineString(stream, "var_tex2") == std::string("Y");
|
t.material.variableDetail = ReadLineString(stream, "var_tex2") == std::string("Y");
|
||||||
|
|
||||||
t.alphaMode = ParseTransparentMode(ReadLineString(stream, "trans_mode"));
|
t.material.alphaMode = ParseTransparentMode(ReadLineString(stream, "trans_mode"));
|
||||||
t.tag = ParseSpecialMark(ReadLineString(stream, "mark"));
|
t.material.tag = ParseSpecialMark(ReadLineString(stream, "mark"));
|
||||||
t.doubleSided = ReadLineString(stream, "dbl_side") == std::string("Y");
|
bool doubleSided = ReadLineString(stream, "dbl_side") == std::string("Y");
|
||||||
|
t.material.cullFace = doubleSided ? CullFace::NONE : CullFace::BACK;
|
||||||
|
|
||||||
if (t.alphaMode != AlphaMode::OPAQUE)
|
if (t.material.alphaMode != AlphaMode::OPAQUE)
|
||||||
t.alphaThreshold = 0.5f;
|
t.material.alphaThreshold = 0.5f;
|
||||||
|
|
||||||
mesh.AddTriangle(t);
|
mesh.AddTriangle(t);
|
||||||
}
|
}
|
||||||
|
@ -602,13 +603,13 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV3(std::istream &stream, int
|
||||||
ConvertOldTex1Name(triangle, t.texName);
|
ConvertOldTex1Name(triangle, t.texName);
|
||||||
|
|
||||||
ConvertFromOldRenderState(triangle, t.state);
|
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 };
|
char tex2Name[20] = { 0 };
|
||||||
std::sprintf(tex2Name, "dirty%.2d.png", t.texNum2);
|
std::sprintf(tex2Name, "dirty%.2d.png", t.texNum2);
|
||||||
triangle.tex2Name = tex2Name;
|
triangle.material.detailTexture = tex2Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
triangles.push_back(triangle);
|
triangles.push_back(triangle);
|
||||||
|
@ -633,31 +634,32 @@ ModelLODLevel ModelInput::MinMaxToLodLevel(float min, float max)
|
||||||
|
|
||||||
void ModelInput::ConvertOldTex1Name(ModelTriangle& triangle, const char* tex1Name)
|
void ModelInput::ConvertOldTex1Name(ModelTriangle& triangle, const char* tex1Name)
|
||||||
{
|
{
|
||||||
triangle.tex1Name = tex1Name;
|
triangle.material.albedoTexture = tex1Name;
|
||||||
boost::replace_all(triangle.tex1Name, "bmp", "png");
|
boost::replace_all(triangle.material.albedoTexture, "bmp", "png");
|
||||||
boost::replace_all(triangle.tex1Name, "tga", "png");
|
boost::replace_all(triangle.material.albedoTexture, "tga", "png");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelInput::ConvertFromOldRenderState(ModelTriangle& triangle, int state)
|
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.material.alphaMode = AlphaMode::MASK;
|
||||||
triangle.alphaThreshold = 0.5f;
|
triangle.material.alphaThreshold = 0.5f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
triangle.alphaMode = AlphaMode::OPAQUE;
|
triangle.material.alphaMode = AlphaMode::OPAQUE;
|
||||||
|
|
||||||
if ((state & static_cast<int>(ModelRenderState::Part1)) != 0)
|
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)
|
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)
|
else if ((state & static_cast<int>(ModelRenderState::Part3)) != 0)
|
||||||
triangle.tag = "energy";
|
triangle.material.tag = "energy";
|
||||||
else
|
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)
|
Vertex3D ModelInput::ReadBinaryVertex(std::istream& stream)
|
||||||
|
|
|
@ -19,15 +19,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "graphics/core/color.h"
|
#include "graphics/core/material.h"
|
||||||
#include "graphics/core/transparency.h"
|
|
||||||
#include "graphics/core/vertex.h"
|
#include "graphics/core/vertex.h"
|
||||||
|
|
||||||
namespace Gfx
|
namespace Gfx
|
||||||
{
|
{
|
||||||
|
|
||||||
enum class AlphaMode : unsigned char;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \struct ModelTriangle
|
* \struct ModelTriangle
|
||||||
* \brief A single triangle in mesh as saved in model file
|
* \brief A single triangle in mesh as saved in model file
|
||||||
|
@ -40,19 +37,8 @@ struct ModelTriangle
|
||||||
Vertex3D p2;
|
Vertex3D p2;
|
||||||
//! 3rd vertex
|
//! 3rd vertex
|
||||||
Vertex3D p3;
|
Vertex3D p3;
|
||||||
//! Name of 1st texture
|
//! Material
|
||||||
std::string tex1Name;
|
Material material;
|
||||||
//! 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 = "";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Gfx
|
} // namespace Gfx
|
||||||
|
|
|
@ -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.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);
|
bboxMax.z = Math::Max(t.p1.position.z, t.p2.position.z, t.p3.position.z, bboxMax.z);
|
||||||
|
|
||||||
texs1[t.tex1Name] += 1;
|
texs1[t.material.albedoTexture] += 1;
|
||||||
if (! t.tex2Name.empty())
|
if (! t.material.detailTexture.empty())
|
||||||
texs2[t.tex2Name] += 1;
|
texs2[t.material.detailTexture] += 1;
|
||||||
if (t.variableTex2)
|
if (t.material.variableDetail)
|
||||||
variableTexs2 += 1;
|
variableTexs2 += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue