summaryrefslogtreecommitdiffstats
path: root/src/graphics/engine/modelfile.cpp
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2013-03-30 15:01:00 +0100
committerPiotr Dziwinski <piotrdz@gmail.com>2013-03-30 15:23:05 +0100
commite218dcfdf2c58f8841e7ebd220527d08e870a6d5 (patch)
treea567db04a8a51e2db87f80e259faf222a7d4becd /src/graphics/engine/modelfile.cpp
parentbfc701e286259d9a7aa2ff8240704eab2ba3a237 (diff)
parente607fed265070be8c518d4302d8b76f738421fb3 (diff)
downloadcolobot-e218dcfdf2c58f8841e7ebd220527d08e870a6d5.tar.gz
colobot-e218dcfdf2c58f8841e7ebd220527d08e870a6d5.tar.bz2
colobot-e218dcfdf2c58f8841e7ebd220527d08e870a6d5.zip
Merge branch 'dev'
Merging content from dev
Diffstat (limited to 'src/graphics/engine/modelfile.cpp')
-rw-r--r--src/graphics/engine/modelfile.cpp284
1 files changed, 95 insertions, 189 deletions
diff --git a/src/graphics/engine/modelfile.cpp b/src/graphics/engine/modelfile.cpp
index c0d04a0..f6d7a7b 100644
--- a/src/graphics/engine/modelfile.cpp
+++ b/src/graphics/engine/modelfile.cpp
@@ -18,7 +18,6 @@
#include "graphics/engine/modelfile.h"
-#include "common/iman.h"
#include "common/ioutils.h"
#include "common/logger.h"
#include "common/stringutils.h"
@@ -34,22 +33,10 @@
#include <sstream>
-/*
- * NOTE: #ifndef checking for MODELFILE_NO_ENGINE
- * is provided in this module to conditionally
- * disable dependence on CEngine.
- */
-
-
// Graphics module namespace
namespace Gfx {
-//! How big the triangle vector is by default
-const int TRIANGLE_PREALLOCATE_COUNT = 2000;
-
-
-
bool ReadBinaryVertex(std::istream& stream, Vertex& vertex)
{
vertex.coord.x = IOUtils::ReadBinaryFloat(stream);
@@ -322,15 +309,8 @@ bool ReadLineString(std::istream& stream, const std::string& prefix, std::string
}
-CModelFile::CModelFile(CInstanceManager* iMan)
+CModelFile::CModelFile()
{
- m_iMan = iMan;
-
-#ifndef MODELFILE_NO_ENGINE
- m_engine = static_cast<CEngine*>(m_iMan->SearchInstance(CLASS_ENGINE));
-#endif
-
- m_triangles.reserve(TRIANGLE_PREALLOCATE_COUNT);
}
CModelFile::~CModelFile()
@@ -514,8 +494,7 @@ bool CModelFile::ReadModel(std::istream& stream)
triangle.material = t.material;
triangle.tex1Name = std::string(t.texName);
- triangle.min = t.min;
- triangle.max = t.max;
+ triangle.lodLevel = MinMaxToLodLevel(t.min, t.max);
m_triangles.push_back(triangle);
}
@@ -558,8 +537,7 @@ bool CModelFile::ReadModel(std::istream& stream)
triangle.material = t.material;
triangle.tex1Name = std::string(t.texName);
- triangle.min = t.min;
- triangle.max = t.max;
+ triangle.lodLevel = MinMaxToLodLevel(t.min, t.max);
triangle.state = t.state;
m_triangles.push_back(triangle);
@@ -603,14 +581,10 @@ bool CModelFile::ReadModel(std::istream& stream)
triangle.material = t.material;
triangle.tex1Name = std::string(t.texName);
- triangle.min = t.min;
- triangle.max = t.max;
+ triangle.lodLevel = MinMaxToLodLevel(t.min, t.max);
triangle.state = t.state;
triangle.variableTex2 = t.texNum2 == 1;
- if (triangle.tex1Name == "plant.png")
- triangle.state |= ENG_RSTATE_ALPHA;
-
if (!triangle.variableTex2 && t.texNum2 != 0)
{
if (t.texNum2 >= 1 && t.texNum2 <= 10)
@@ -637,6 +611,10 @@ bool CModelFile::ReadModel(std::istream& stream)
m_triangles[i].tex2Name = StrUtils::Replace(m_triangles[i].tex2Name, "bmp", "png");
m_triangles[i].tex2Name = StrUtils::Replace(m_triangles[i].tex2Name, "tga", "png");
+ // TODO: fix this in model files
+ if (m_triangles[i].tex1Name == "plant.png")
+ m_triangles[i].state |= ENG_RSTATE_ALPHA;
+
GetLogger()->Trace("ModelTriangle %d\n", i+1);
std::string s1 = m_triangles[i].p1.ToString();
GetLogger()->Trace(" p1: %s\n", s1.c_str());
@@ -652,7 +630,7 @@ bool CModelFile::ReadModel(std::istream& stream)
GetLogger()->Trace(" tex1: %s tex2: %s\n", m_triangles[i].tex1Name.c_str(),
m_triangles[i].variableTex2 ? "(variable)" : m_triangles[i].tex2Name.c_str());
- GetLogger()->Trace(" min: %.2f max: %.2f\n", m_triangles[i].min, m_triangles[i].max);
+ GetLogger()->Trace(" lod level: %d\n", m_triangles[i].lodLevel);
GetLogger()->Trace(" state: %ld\n", m_triangles[i].state);
}
@@ -703,8 +681,7 @@ bool CModelFile::WriteModel(std::ostream& stream)
t.material = m_triangles[i].material;
strncpy(t.texName, m_triangles[i].tex1Name.c_str(), 20);
- t.min = m_triangles[i].min;
- t.max = m_triangles[i].max;
+ LODLevelToMinMax(m_triangles[i].lodLevel, t.min, t.max);
t.state = m_triangles[i].state;
int no = 0;
@@ -740,6 +717,46 @@ bool CModelFile::WriteModel(std::ostream& stream)
return true;
}
+LODLevel CModelFile::MinMaxToLodLevel(float min, float max)
+{
+ if (min == 0.0f && max == 100.0f)
+ return LOD_High;
+ else if (min == 100.0f && max == 200.0f)
+ return LOD_Medium;
+ else if (min == 200.0f && max == 1000000.0f)
+ return LOD_Low;
+ else if (min == 0.0f && max == 1000000.0f)
+ return LOD_Constant;
+
+ return LOD_Constant;
+}
+
+void CModelFile::LODLevelToMinMax(LODLevel lodLevel, float& min, float& max)
+{
+ switch (lodLevel)
+ {
+ case LOD_High:
+ min = 0.0f;
+ max = 100.0f;
+ break;
+
+ case LOD_Medium:
+ min = 100.0f;
+ max = 200.0f;
+ break;
+
+ case LOD_Low:
+ min = 200.0f;
+ max = 1000000.0f;
+ break;
+
+ case LOD_Constant:
+ min = 0.0f;
+ max = 1000000.0f;
+ break;
+ }
+}
+
/*******************************************************
New formats
@@ -786,17 +803,15 @@ struct NewModelTriangle1
std::string tex2Name;
//! If true, 2nd texture will be taken from current engine setting
bool variableTex2;
- //! Min LOD threshold
- float min;
- //! Max LOD threshold
- float max;
+ //! LOD level
+ int lodLevel;
//! Rendering state to be set
int state;
NewModelTriangle1()
{
variableTex2 = true;
- min = max = 0.0f;
+ lodLevel = 0;
state = 0;
}
};
@@ -852,8 +867,7 @@ bool CModelFile::ReadTextModel(std::istream& stream)
ReadLineValue<std::string>(stream, "tex1", t.tex1Name) &&
ReadLineValue<std::string>(stream, "tex2", t.tex2Name) &&
ReadLineValue<char>(stream, "var_tex2", varTex2Ch) &&
- ReadLineValue<float>(stream, "min", t.min) &&
- ReadLineValue<float>(stream, "max", t.max) &&
+ ReadLineValue<int>(stream, "lod_level", t.lodLevel) &&
ReadLineValue<int>(stream, "state", t.state);
if (!triOk || stream.fail())
@@ -873,10 +887,17 @@ bool CModelFile::ReadTextModel(std::istream& stream)
triangle.tex1Name = t.tex1Name;
triangle.tex2Name = t.tex2Name;
triangle.variableTex2 = t.variableTex2;
- triangle.min = t.min;
- triangle.max = t.max;
triangle.state = t.state;
+ switch (t.lodLevel)
+ {
+ case 0: triangle.lodLevel = LOD_Constant; break;
+ case 1: triangle.lodLevel = LOD_Low; break;
+ case 2: triangle.lodLevel = LOD_Medium; break;
+ case 3: triangle.lodLevel = LOD_High; break;
+ default: break;
+ }
+
m_triangles.push_back(triangle);
continue;
@@ -904,7 +925,7 @@ bool CModelFile::ReadTextModel(std::istream& stream)
GetLogger()->Trace(" mat: d: %s a: %s s: %s\n", d.c_str(), a.c_str(), s.c_str());
GetLogger()->Trace(" tex1: %s tex2: %s\n", m_triangles[i].tex1Name.c_str(), m_triangles[i].tex2Name.c_str());
- GetLogger()->Trace(" min: %.2f max: %.2f\n", m_triangles[i].min, m_triangles[i].max);
+ GetLogger()->Trace(" lod level: %d\n", m_triangles[i].lodLevel);
GetLogger()->Trace(" state: %ld\n", m_triangles[i].state);
}
@@ -956,10 +977,16 @@ bool CModelFile::WriteTextModel(std::ostream& stream)
t.tex1Name = m_triangles[i].tex1Name;
t.tex2Name = m_triangles[i].tex2Name;
t.variableTex2 = m_triangles[i].variableTex2;
- t.min = m_triangles[i].min;
- t.max = m_triangles[i].max;
t.state = m_triangles[i].state;
+ switch (m_triangles[i].lodLevel)
+ {
+ case LOD_Constant: t.lodLevel = 0; break;
+ case LOD_Low: t.lodLevel = 1; break;
+ case LOD_Medium: t.lodLevel = 2; break;
+ case LOD_High: t.lodLevel = 3; break;
+ }
+
stream << "p1 ";
WriteTextVertexTex2(t.p1, stream);
stream << "p2 ";
@@ -972,8 +999,7 @@ bool CModelFile::WriteTextModel(std::ostream& stream)
stream << "tex1 " << t.tex1Name << std::endl;
stream << "tex2 " << t.tex2Name << std::endl;
stream << "var_tex2 " << (t.variableTex2 ? 'Y' : 'N') << std::endl;
- stream << "min " << t.min << std::endl;
- stream << "max " << t.max << std::endl;
+ stream << "lod_level " << t.lodLevel << std::endl;
stream << "state " << t.state << std::endl;
stream << std::endl;
@@ -1030,9 +1056,8 @@ bool CModelFile::ReadBinaryModel(std::istream& stream)
t.tex1Name = IOUtils::ReadBinaryString<1>(stream);
t.tex2Name = IOUtils::ReadBinaryString<1>(stream);
t.variableTex2 = IOUtils::ReadBinaryBool(stream);
- t.min = IOUtils::ReadBinaryFloat(stream);
- t.max = IOUtils::ReadBinaryFloat(stream);
- t.state = IOUtils::ReadBinary<4, unsigned int>(stream);
+ t.lodLevel = IOUtils::ReadBinary<4, int>(stream);
+ t.state = IOUtils::ReadBinary<4, int>(stream);
if (stream.fail())
{
@@ -1048,10 +1073,17 @@ bool CModelFile::ReadBinaryModel(std::istream& stream)
triangle.tex1Name = t.tex1Name;
triangle.tex2Name = t.tex2Name;
triangle.variableTex2 = t.variableTex2;
- triangle.min = t.min;
- triangle.max = t.max;
triangle.state = t.state;
+ switch (t.lodLevel)
+ {
+ case 0: triangle.lodLevel = LOD_Constant; break;
+ case 1: triangle.lodLevel = LOD_Low; break;
+ case 2: triangle.lodLevel = LOD_Medium; break;
+ case 3: triangle.lodLevel = LOD_High; break;
+ default: break;
+ }
+
m_triangles.push_back(triangle);
}
}
@@ -1077,7 +1109,7 @@ bool CModelFile::ReadBinaryModel(std::istream& stream)
GetLogger()->Trace(" mat: d: %s a: %s s: %s\n", d.c_str(), a.c_str(), s.c_str());
GetLogger()->Trace(" tex1: %s tex2: %s\n", m_triangles[i].tex1Name.c_str(), m_triangles[i].tex2Name.c_str());
- GetLogger()->Trace(" min: %.2f max: %.2f\n", m_triangles[i].min, m_triangles[i].max);
+ GetLogger()->Trace(" lod level: %d\n", m_triangles[i].lodLevel);
GetLogger()->Trace(" state: %ld\n", m_triangles[i].state);
}
@@ -1124,10 +1156,16 @@ bool CModelFile::WriteBinaryModel(std::ostream& stream)
t.tex1Name = m_triangles[i].tex1Name;
t.tex2Name = m_triangles[i].tex2Name;
t.variableTex2 = m_triangles[i].variableTex2;
- t.min = m_triangles[i].min;
- t.max = m_triangles[i].max;
t.state = m_triangles[i].state;
+ switch (m_triangles[i].lodLevel)
+ {
+ case LOD_Constant: t.lodLevel = 0; break;
+ case LOD_Low: t.lodLevel = 1; break;
+ case LOD_Medium: t.lodLevel = 2; break;
+ case LOD_High: t.lodLevel = 3; break;
+ }
+
WriteBinaryVertexTex2(t.p1, stream);
WriteBinaryVertexTex2(t.p2, stream);
WriteBinaryVertexTex2(t.p3, stream);
@@ -1135,9 +1173,8 @@ bool CModelFile::WriteBinaryModel(std::ostream& stream)
IOUtils::WriteBinaryString<1>(t.tex1Name, stream);
IOUtils::WriteBinaryString<1>(t.tex2Name, stream);
IOUtils::WriteBinaryBool(t.variableTex2, stream);
- IOUtils::WriteBinaryFloat(t.min, stream);
- IOUtils::WriteBinaryFloat(t.max, stream);
- IOUtils::WriteBinary<4, unsigned int>(t.state, stream);
+ IOUtils::WriteBinary<4, int>(t.lodLevel, stream);
+ IOUtils::WriteBinary<4, int>(t.state, stream);
if (stream.fail())
{
@@ -1150,97 +1187,6 @@ bool CModelFile::WriteBinaryModel(std::ostream& stream)
}
-/*******************************************************
- Other stuff
- *******************************************************/
-
-#ifndef MODELFILE_NO_ENGINE
-
-bool CModelFile::CreateEngineObject(int objRank)
-{
- std::vector<VertexTex2> vs(3, VertexTex2());
-
- float limit[2];
- limit[0] = m_engine->GetLimitLOD(0); // frontier AB as config
- limit[1] = m_engine->GetLimitLOD(1); // frontier BC as config
-
- for (int i = 0; i < static_cast<int>( m_triangles.size() ); i++)
- {
- // TODO move this to CEngine
-
- float min = m_triangles[i].min;
- float max = m_triangles[i].max;
-
- // Standard frontiers -> config
- if (min == 0.0f && max == 100.0f) // resolution A ?
- {
- max = limit[0];
- }
- else if (min == 100.0f && max == 200.0f) // resolution B ?
- {
- min = limit[0];
- max = limit[1];
- }
- else if (min == 200.0f && max == 1000000.0f) // resolution C ?
- {
- min = limit[1];
- }
-
- int state = m_triangles[i].state;
- std::string tex2Name = m_triangles[i].tex2Name;
-
- if (m_triangles[i].variableTex2)
- {
- int texNum = m_engine->GetSecondTexture();
-
- if (texNum >= 1 && texNum <= 10)
- state |= ENG_RSTATE_DUAL_BLACK;
-
- if (texNum >= 11 && texNum <= 20)
- state |= ENG_RSTATE_DUAL_WHITE;
-
- char name[20] = { 0 };
- sprintf(name, "dirty%.2d.png", texNum);
- tex2Name = name;
- }
-
- vs[0] = m_triangles[i].p1;
- vs[1] = m_triangles[i].p2;
- vs[2] = m_triangles[i].p3;
-
- bool ok = m_engine->AddTriangles(objRank, vs,
- m_triangles[i].material,
- state,
- m_triangles[i].tex1Name,
- tex2Name,
- min, max, false);
- if (!ok)
- return false;
- }
-
- return true;
-}
-
-#endif
-
-void CModelFile::Mirror()
-{
- for (int i = 0; i < static_cast<int>( m_triangles.size() ); i++)
- {
- VertexTex2 t = m_triangles[i].p1;
- m_triangles[i].p1 = m_triangles[i].p2;
- m_triangles[i].p2 = t;
-
- m_triangles[i].p1.coord.z = -m_triangles[i].p1.coord.z;
- m_triangles[i].p2.coord.z = -m_triangles[i].p2.coord.z;
- m_triangles[i].p3.coord.z = -m_triangles[i].p3.coord.z;
-
- m_triangles[i].p1.normal.z = -m_triangles[i].p1.normal.z;
- m_triangles[i].p2.normal.z = -m_triangles[i].p2.normal.z;
- m_triangles[i].p3.normal.z = -m_triangles[i].p3.normal.z;
- }
-}
-
const std::vector<ModelTriangle>& CModelFile::GetTriangles()
{
return m_triangles;
@@ -1251,45 +1197,5 @@ int CModelFile::GetTriangleCount()
return m_triangles.size();
}
-float CModelFile::GetHeight(Math::Vector pos)
-{
- float limit = 5.0f;
-
- for (int i = 0; i < static_cast<int>( m_triangles.size() ); i++)
- {
- if ( fabs(pos.x - m_triangles[i].p1.coord.x) < limit &&
- fabs(pos.z - m_triangles[i].p1.coord.z) < limit )
- return m_triangles[i].p1.coord.y;
-
- if ( fabs(pos.x - m_triangles[i].p2.coord.x) < limit &&
- fabs(pos.z - m_triangles[i].p2.coord.z) < limit )
- return m_triangles[i].p2.coord.y;
-
- if ( fabs(pos.x - m_triangles[i].p3.coord.x) < limit &&
- fabs(pos.z - m_triangles[i].p3.coord.z) < limit )
- return m_triangles[i].p3.coord.y;
- }
-
- return 0.0f;
-}
-
-void CModelFile::CreateTriangle(Math::Vector p1, Math::Vector p2, Math::Vector p3, float min, float max)
-{
- ModelTriangle triangle;
-
- Math::Vector n = Math::NormalToPlane(p3, p2, p1);
- triangle.p1 = VertexTex2(p1, n);
- triangle.p2 = VertexTex2(p2, n);
- triangle.p3 = VertexTex2(p3, n);
-
- triangle.material.diffuse = Color(1.0f, 1.0f, 1.0f, 0.0f);
- triangle.material.ambient = Color(0.5f, 0.5f, 0.5f, 0.0f);
-
- triangle.min = min;
- triangle.max = max;
-
- m_triangles.push_back(triangle);
-}
-
} // namespace Gfx