Partial refactor of model I/O
* Mostly removed legacy Gfx::Material usage * Bake legacy diffuse color to vertex color * Removed code that writes to old model formatsdev
parent
a54a59146d
commit
5dacb82b22
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
|
||||||
// Graphics module namespace
|
// Graphics module namespace
|
||||||
|
@ -45,6 +46,14 @@ struct Color
|
||||||
explicit Color(float aR = 0.0f, float aG = 0.0f, float aB = 0.0f, float aA = 0.0f)
|
explicit Color(float aR = 0.0f, float aG = 0.0f, float aB = 0.0f, float aA = 0.0f)
|
||||||
: r(aR), g(aG), b(aB), a(aA) {}
|
: r(aR), g(aG), b(aB), a(aA) {}
|
||||||
|
|
||||||
|
Color(const glm::vec4& color)
|
||||||
|
: r(color.r), g(color.g), b(color.b), a(color.a) {}
|
||||||
|
|
||||||
|
operator glm::vec4() const
|
||||||
|
{
|
||||||
|
return { r, g, b, a };
|
||||||
|
}
|
||||||
|
|
||||||
inline Color Inverse() const
|
inline Color Inverse() const
|
||||||
{
|
{
|
||||||
return Color(1.0f - r, 1.0f - g, 1.0f - b, 1.0f - a);
|
return Color(1.0f - r, 1.0f - g, 1.0f - b, 1.0f - a);
|
||||||
|
@ -111,6 +120,14 @@ struct IntColor
|
||||||
//! Constructor; default values are (0,0,0,0) = black
|
//! Constructor; default values are (0,0,0,0) = black
|
||||||
explicit IntColor(unsigned char aR = 0, unsigned char aG = 0, unsigned char aB = 0, unsigned char aA = 0)
|
explicit IntColor(unsigned char aR = 0, unsigned char aG = 0, unsigned char aB = 0, unsigned char aA = 0)
|
||||||
: r(aR), g(aG), b(aB), a(aA) {}
|
: r(aR), g(aG), b(aB), a(aA) {}
|
||||||
|
|
||||||
|
IntColor(const glm::u8vec4& color)
|
||||||
|
: r(color.r), g(color.g), b(color.b), a(color.a) {}
|
||||||
|
|
||||||
|
operator glm::u8vec4() const
|
||||||
|
{
|
||||||
|
return { r, g, b, a };
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Color IntColorToColor(IntColor color)
|
inline Color IntColorToColor(IntColor color)
|
||||||
|
|
|
@ -632,16 +632,15 @@ EngineBaseObjTexTier& CEngine::AddLevel2(EngineBaseObject& p1, const std::string
|
||||||
return p1.next.back();
|
return p1.next.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
EngineBaseObjDataTier& CEngine::AddLevel3(EngineBaseObjTexTier& p3, EngineTriangleType type,
|
EngineBaseObjDataTier& CEngine::AddLevel3(EngineBaseObjTexTier& p3, EngineTriangleType type, int state)
|
||||||
const Material& material, int state)
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < static_cast<int>( p3.next.size() ); i++)
|
for (int i = 0; i < static_cast<int>( p3.next.size() ); i++)
|
||||||
{
|
{
|
||||||
if ( (p3.next[i].type == type) && (p3.next[i].material == material) && (p3.next[i].state == state) )
|
if ( (p3.next[i].type == type) && (p3.next[i].state == state) )
|
||||||
return p3.next[i];
|
return p3.next[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
p3.next.push_back(EngineBaseObjDataTier(type, material, state));
|
p3.next.push_back(EngineBaseObjDataTier(type, state));
|
||||||
return p3.next.back();
|
return p3.next.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,15 +741,14 @@ void CEngine::CopyBaseObject(int sourceBaseObjRank, int destBaseObjRank)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<VertexTex2>& vertices,
|
void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Vertex3D>& vertices,
|
||||||
const Material& material, int state,
|
int state, std::string tex1Name, std::string tex2Name)
|
||||||
std::string tex1Name, std::string tex2Name)
|
|
||||||
{
|
{
|
||||||
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( m_baseObjects.size() ));
|
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( m_baseObjects.size() ));
|
||||||
|
|
||||||
EngineBaseObject& p1 = m_baseObjects[baseObjRank];
|
EngineBaseObject& p1 = m_baseObjects[baseObjRank];
|
||||||
EngineBaseObjTexTier& p2 = AddLevel2(p1, tex1Name, tex2Name);
|
EngineBaseObjTexTier& p2 = AddLevel2(p1, tex1Name, tex2Name);
|
||||||
EngineBaseObjDataTier& p3 = AddLevel3(p2, EngineTriangleType::TRIANGLES, material, state);
|
EngineBaseObjDataTier& p3 = AddLevel3(p2, EngineTriangleType::TRIANGLES, state);
|
||||||
|
|
||||||
p3.vertices.insert(p3.vertices.end(), vertices.begin(), vertices.end());
|
p3.vertices.insert(p3.vertices.end(), vertices.begin(), vertices.end());
|
||||||
|
|
||||||
|
@ -759,12 +757,12 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<VertexTex2>
|
||||||
|
|
||||||
for (int i = 0; i < static_cast<int>( vertices.size() ); i++)
|
for (int i = 0; i < static_cast<int>( vertices.size() ); i++)
|
||||||
{
|
{
|
||||||
p1.bboxMin.x = Math::Min(vertices[i].coord.x, p1.bboxMin.x);
|
p1.bboxMin.x = Math::Min(vertices[i].position.x, p1.bboxMin.x);
|
||||||
p1.bboxMin.y = Math::Min(vertices[i].coord.y, p1.bboxMin.y);
|
p1.bboxMin.y = Math::Min(vertices[i].position.y, p1.bboxMin.y);
|
||||||
p1.bboxMin.z = Math::Min(vertices[i].coord.z, p1.bboxMin.z);
|
p1.bboxMin.z = Math::Min(vertices[i].position.z, p1.bboxMin.z);
|
||||||
p1.bboxMax.x = Math::Max(vertices[i].coord.x, p1.bboxMax.x);
|
p1.bboxMax.x = Math::Max(vertices[i].position.x, p1.bboxMax.x);
|
||||||
p1.bboxMax.y = Math::Max(vertices[i].coord.y, p1.bboxMax.y);
|
p1.bboxMax.y = Math::Max(vertices[i].position.y, p1.bboxMax.y);
|
||||||
p1.bboxMax.z = Math::Max(vertices[i].coord.z, p1.bboxMax.z);
|
p1.bboxMax.z = Math::Max(vertices[i].position.z, p1.bboxMax.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
p1.boundingSphere = Math::BoundingSphereForBox(p1.bboxMin, p1.bboxMax);
|
p1.boundingSphere = Math::BoundingSphereForBox(p1.bboxMin, p1.bboxMax);
|
||||||
|
@ -1021,8 +1019,7 @@ int CEngine::GetObjectTotalTriangles(int objRank)
|
||||||
return m_baseObjects[baseObjRank].totalTriangles;
|
return m_baseObjects[baseObjRank].totalTriangles;
|
||||||
}
|
}
|
||||||
|
|
||||||
EngineBaseObjDataTier* CEngine::FindTriangles(int objRank, const Material& material,
|
EngineBaseObjDataTier* CEngine::FindTriangles(int objRank, int state, std::string tex1Name,
|
||||||
int state, std::string tex1Name,
|
|
||||||
std::string tex2Name)
|
std::string tex2Name)
|
||||||
{
|
{
|
||||||
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
||||||
|
@ -1046,8 +1043,7 @@ EngineBaseObjDataTier* CEngine::FindTriangles(int objRank, const Material& mater
|
||||||
{
|
{
|
||||||
EngineBaseObjDataTier& p3 = p2.next[l3];
|
EngineBaseObjDataTier& p3 = p2.next[l3];
|
||||||
|
|
||||||
if ( (p3.state & (~(ENG_RSTATE_DUAL_BLACK|ENG_RSTATE_DUAL_WHITE))) != state ||
|
if ( (p3.state & (~(ENG_RSTATE_DUAL_BLACK|ENG_RSTATE_DUAL_WHITE))) != state)
|
||||||
p3.material != material )
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return &p3;
|
return &p3;
|
||||||
|
@ -1098,7 +1094,6 @@ int CEngine::GetPartialTriangles(int objRank, float percent, int maxCount,
|
||||||
t.triangle[0] = p3.vertices[i];
|
t.triangle[0] = p3.vertices[i];
|
||||||
t.triangle[1] = p3.vertices[i+1];
|
t.triangle[1] = p3.vertices[i+1];
|
||||||
t.triangle[2] = p3.vertices[i+2];
|
t.triangle[2] = p3.vertices[i+2];
|
||||||
t.material = p3.material;
|
|
||||||
t.state = p3.state;
|
t.state = p3.state;
|
||||||
t.tex1Name = p2.tex1Name;
|
t.tex1Name = p2.tex1Name;
|
||||||
t.tex2Name = p2.tex2Name;
|
t.tex2Name = p2.tex2Name;
|
||||||
|
@ -1122,7 +1117,6 @@ int CEngine::GetPartialTriangles(int objRank, float percent, int maxCount,
|
||||||
t.triangle[0] = p3.vertices[i];
|
t.triangle[0] = p3.vertices[i];
|
||||||
t.triangle[1] = p3.vertices[i+1];
|
t.triangle[1] = p3.vertices[i+1];
|
||||||
t.triangle[2] = p3.vertices[i+2];
|
t.triangle[2] = p3.vertices[i+2];
|
||||||
t.material = p3.material;
|
|
||||||
t.state = p3.state;
|
t.state = p3.state;
|
||||||
t.tex1Name = p2.tex1Name;
|
t.tex1Name = p2.tex1Name;
|
||||||
t.tex2Name = p2.tex2Name;
|
t.tex2Name = p2.tex2Name;
|
||||||
|
@ -1168,14 +1162,14 @@ void CEngine::ChangeSecondTexture(int objRank, const std::string& tex2Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEngine::ChangeTextureMapping(int objRank, const Material& mat, int state,
|
void CEngine::ChangeTextureMapping(int objRank, int state,
|
||||||
const std::string& tex1Name, const std::string& tex2Name,
|
const std::string& tex1Name, const std::string& tex2Name,
|
||||||
EngineTextureMapping mode,
|
EngineTextureMapping mode,
|
||||||
float au, float bu, float av, float bv)
|
float au, float bu, float av, float bv)
|
||||||
{
|
{
|
||||||
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
||||||
|
|
||||||
EngineBaseObjDataTier* p4 = FindTriangles(objRank, mat, state, tex1Name, tex2Name);
|
EngineBaseObjDataTier* p4 = FindTriangles(objRank, state, tex1Name, tex2Name);
|
||||||
if (p4 == nullptr)
|
if (p4 == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1230,14 +1224,14 @@ void CEngine::ChangeTextureMapping(int objRank, const Material& mat, int state,
|
||||||
UpdateStaticBuffer(*p4);
|
UpdateStaticBuffer(*p4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEngine::TrackTextureMapping(int objRank, const Material& mat, int state,
|
void CEngine::TrackTextureMapping(int objRank, int state,
|
||||||
const std::string& tex1Name, const std::string& tex2Name,
|
const std::string& tex1Name, const std::string& tex2Name,
|
||||||
EngineTextureMapping mode,
|
EngineTextureMapping mode,
|
||||||
float pos, float factor, float tl, float ts, float tt)
|
float pos, float factor, float tl, float ts, float tt)
|
||||||
{
|
{
|
||||||
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
|
||||||
|
|
||||||
EngineBaseObjDataTier* p4 = FindTriangles(objRank, mat, state, tex1Name, tex2Name);
|
EngineBaseObjDataTier* p4 = FindTriangles(objRank, state, tex1Name, tex2Name);
|
||||||
if (p4 == nullptr)
|
if (p4 == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -3567,8 +3561,7 @@ void CEngine::Draw3DScene()
|
||||||
|
|
||||||
float dirty = ((p3.state & ENG_RSTATE_DUAL_BLACK) && m_dirty) ? 1.0 : 0.0;
|
float dirty = ((p3.state & ENG_RSTATE_DUAL_BLACK) && m_dirty) ? 1.0 : 0.0;
|
||||||
objectRenderer->SetDirty(dirty);
|
objectRenderer->SetDirty(dirty);
|
||||||
auto color = p3.material.diffuse;
|
objectRenderer->SetColor({ 1.0f, 1.0f, 1.0f, 1.0f });
|
||||||
objectRenderer->SetColor({ color.r, color.g, color.b, 1.0 });
|
|
||||||
objectRenderer->SetCullMode((p3.state& ENG_RSTATE_2FACE) == 0);
|
objectRenderer->SetCullMode((p3.state& ENG_RSTATE_2FACE) == 0);
|
||||||
objectRenderer->DrawObject(p3.buffer);
|
objectRenderer->DrawObject(p3.buffer);
|
||||||
}
|
}
|
||||||
|
@ -3589,7 +3582,7 @@ void CEngine::Draw3DScene()
|
||||||
|
|
||||||
if (transparent)
|
if (transparent)
|
||||||
{
|
{
|
||||||
Color tColor = Color(68.0f / 255.0f, 68.0f / 255.0f, 68.0f / 255.0f, 68.0f / 255.0f);
|
Color tColor = Color(68.0f / 255.0f, 68.0f / 255.0f, 68.0f / 255.0f, 255.0f);
|
||||||
|
|
||||||
for (int objRank = 0; objRank < static_cast<int>(m_objects.size()); objRank++)
|
for (int objRank = 0; objRank < static_cast<int>(m_objects.size()); objRank++)
|
||||||
{
|
{
|
||||||
|
@ -3635,8 +3628,7 @@ void CEngine::Draw3DScene()
|
||||||
|
|
||||||
float dirty = (p3.state & ENG_RSTATE_DUAL_BLACK) && m_dirty ? 1.0 : 0.0;
|
float dirty = (p3.state & ENG_RSTATE_DUAL_BLACK) && m_dirty ? 1.0 : 0.0;
|
||||||
objectRenderer->SetDirty(dirty);
|
objectRenderer->SetDirty(dirty);
|
||||||
auto color = p3.material.diffuse * tColor;
|
objectRenderer->SetColor(tColor);
|
||||||
objectRenderer->SetColor({ color.r, color.g, color.b, 1.0f });
|
|
||||||
objectRenderer->DrawObject(p3.buffer);
|
objectRenderer->DrawObject(p3.buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4369,7 +4361,7 @@ void CEngine::DrawInterface()
|
||||||
{
|
{
|
||||||
EngineBaseObjDataTier& p3 = p2.next[l3];
|
EngineBaseObjDataTier& p3 = p2.next[l3];
|
||||||
|
|
||||||
SetMaterial(p3.material);
|
//SetMaterial(p3.material);
|
||||||
SetState(p3.state);
|
SetState(p3.state);
|
||||||
|
|
||||||
DrawObject(p3);
|
DrawObject(p3);
|
||||||
|
@ -5412,7 +5404,7 @@ void CEngine::DrawTimer()
|
||||||
|
|
||||||
void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelTriangle>& triangles)
|
void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelTriangle>& triangles)
|
||||||
{
|
{
|
||||||
std::vector<VertexTex2> vs(3, VertexTex2());
|
std::vector<Vertex3D> vs(3, Vertex3D{});
|
||||||
|
|
||||||
for (const auto& triangle : triangles)
|
for (const auto& triangle : triangles)
|
||||||
{
|
{
|
||||||
|
@ -5420,11 +5412,6 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
|
||||||
vs[1] = triangle.p2;
|
vs[1] = triangle.p2;
|
||||||
vs[2] = triangle.p3;
|
vs[2] = triangle.p3;
|
||||||
|
|
||||||
Material material;
|
|
||||||
material.ambient = triangle.ambient;
|
|
||||||
material.diffuse = triangle.diffuse;
|
|
||||||
material.specular = triangle.specular;
|
|
||||||
|
|
||||||
int state = GetEngineState(triangle);
|
int state = GetEngineState(triangle);
|
||||||
|
|
||||||
std::string tex1Name;
|
std::string tex1Name;
|
||||||
|
@ -5437,7 +5424,7 @@ void CEngine::AddBaseObjTriangles(int baseObjRank, const std::vector<Gfx::ModelT
|
||||||
else
|
else
|
||||||
tex2Name = triangle.tex2Name;
|
tex2Name = triangle.tex2Name;
|
||||||
|
|
||||||
AddBaseObjTriangles(baseObjRank, vs, material, state, tex1Name, tex2Name);
|
AddBaseObjTriangles(baseObjRank, vs, state, tex1Name, tex2Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -153,8 +153,6 @@ struct EngineTriangle
|
||||||
{
|
{
|
||||||
//! Triangle vertices
|
//! Triangle vertices
|
||||||
Vertex3D triangle[3];
|
Vertex3D triangle[3];
|
||||||
//! Material
|
|
||||||
Material material;
|
|
||||||
//! Render state
|
//! Render state
|
||||||
int state = ENG_RSTATE_NORMAL;
|
int state = ENG_RSTATE_NORMAL;
|
||||||
//! 1st texture
|
//! 1st texture
|
||||||
|
@ -192,17 +190,14 @@ enum EngineObjectType
|
||||||
struct EngineBaseObjDataTier
|
struct EngineBaseObjDataTier
|
||||||
{
|
{
|
||||||
EngineTriangleType type;
|
EngineTriangleType type;
|
||||||
Material material;
|
|
||||||
int state;
|
int state;
|
||||||
std::vector<Vertex3D> vertices;
|
std::vector<Vertex3D> vertices;
|
||||||
CVertexBuffer* buffer;
|
CVertexBuffer* buffer;
|
||||||
bool updateStaticBuffer;
|
bool updateStaticBuffer;
|
||||||
|
|
||||||
inline EngineBaseObjDataTier(EngineTriangleType type = EngineTriangleType::TRIANGLES,
|
inline EngineBaseObjDataTier(EngineTriangleType type = EngineTriangleType::TRIANGLES,
|
||||||
const Material& material = Material(),
|
|
||||||
int state = ENG_RSTATE_NORMAL)
|
int state = ENG_RSTATE_NORMAL)
|
||||||
: type(type)
|
: type(type)
|
||||||
, material(material)
|
|
||||||
, state(state)
|
, state(state)
|
||||||
, buffer(nullptr)
|
, buffer(nullptr)
|
||||||
, updateStaticBuffer(false)
|
, updateStaticBuffer(false)
|
||||||
|
@ -781,8 +776,7 @@ public:
|
||||||
int GetObjectTotalTriangles(int objRank);
|
int GetObjectTotalTriangles(int objRank);
|
||||||
|
|
||||||
//! Returns the first found tier 4 engine object for the given params or nullptr if not found
|
//! Returns the first found tier 4 engine object for the given params or nullptr if not found
|
||||||
EngineBaseObjDataTier* FindTriangles(int objRank, const Material& material,
|
EngineBaseObjDataTier* FindTriangles(int objRank, int state, std::string tex1Name, std::string tex2Name);
|
||||||
int state, std::string tex1Name, std::string tex2Name);
|
|
||||||
|
|
||||||
//! Returns a partial list of triangles for given object
|
//! Returns a partial list of triangles for given object
|
||||||
int GetPartialTriangles(int objRank, float percent, int maxCount,
|
int GetPartialTriangles(int objRank, float percent, int maxCount,
|
||||||
|
@ -792,13 +786,13 @@ public:
|
||||||
void ChangeSecondTexture(int objRank, const std::string& tex2Name);
|
void ChangeSecondTexture(int objRank, const std::string& tex2Name);
|
||||||
|
|
||||||
//! Changes (recalculates) texture mapping for given object
|
//! Changes (recalculates) texture mapping for given object
|
||||||
void ChangeTextureMapping(int objRank, const Material& mat, int state,
|
void ChangeTextureMapping(int objRank, int state,
|
||||||
const std::string& tex1Name, const std::string& tex2Name,
|
const std::string& tex1Name, const std::string& tex2Name,
|
||||||
EngineTextureMapping mode,
|
EngineTextureMapping mode,
|
||||||
float au, float bu, float av, float bv);
|
float au, float bu, float av, float bv);
|
||||||
|
|
||||||
//! Changes texture mapping for robot tracks
|
//! Changes texture mapping for robot tracks
|
||||||
void TrackTextureMapping(int objRank, const Material& mat, int state,
|
void TrackTextureMapping(int objRank, int state,
|
||||||
const std::string& tex1Name, const std::string& tex2Name,
|
const std::string& tex1Name, const std::string& tex2Name,
|
||||||
EngineTextureMapping mode,
|
EngineTextureMapping mode,
|
||||||
float pos, float factor, float tl, float ts, float tt);
|
float pos, float factor, float tl, float ts, float tt);
|
||||||
|
@ -1252,8 +1246,7 @@ protected:
|
||||||
//! Creates a new tier 2 object (texture)
|
//! Creates a new tier 2 object (texture)
|
||||||
EngineBaseObjTexTier& AddLevel2(EngineBaseObject& p1, const std::string& tex1Name, const std::string& tex2Name);
|
EngineBaseObjTexTier& AddLevel2(EngineBaseObject& p1, const std::string& tex1Name, const std::string& tex2Name);
|
||||||
//! Creates a new tier 3 object (data)
|
//! Creates a new tier 3 object (data)
|
||||||
EngineBaseObjDataTier& AddLevel3(EngineBaseObjTexTier &p3, EngineTriangleType type,
|
EngineBaseObjDataTier& AddLevel3(EngineBaseObjTexTier &p3, EngineTriangleType type, int state);
|
||||||
const Material& material, int state);
|
|
||||||
|
|
||||||
//! Create texture and add it to cache
|
//! Create texture and add it to cache
|
||||||
Texture CreateTexture(const std::string &texName, const TextureCreateParams ¶ms, CImage* image = nullptr);
|
Texture CreateTexture(const std::string &texName, const TextureCreateParams ¶ms, CImage* image = nullptr);
|
||||||
|
@ -1290,9 +1283,8 @@ protected:
|
||||||
//! Updates static buffers of changed objects
|
//! Updates static buffers of changed objects
|
||||||
void UpdateStaticBuffers();
|
void UpdateStaticBuffers();
|
||||||
|
|
||||||
void AddBaseObjTriangles(int baseObjRank, const std::vector<VertexTex2>& vertices,
|
void AddBaseObjTriangles(int baseObjRank, const std::vector<Vertex3D>& vertices,
|
||||||
const Material& material, int state,
|
int state, std::string tex1Name, std::string tex2Name);
|
||||||
std::string tex1Name, std::string tex2Name);
|
|
||||||
|
|
||||||
int GetEngineState(const ModelTriangle& triangle);
|
int GetEngineState(const ModelTriangle& triangle);
|
||||||
|
|
||||||
|
|
|
@ -3368,6 +3368,15 @@ void CParticle::DrawParticleWheel(int i)
|
||||||
|
|
||||||
void CParticle::DrawParticle(int sheet)
|
void CParticle::DrawParticle(int sheet)
|
||||||
{
|
{
|
||||||
|
Material mat;
|
||||||
|
mat.diffuse.r = 1.0f;
|
||||||
|
mat.diffuse.g = 1.0f;
|
||||||
|
mat.diffuse.b = 1.0f; // white
|
||||||
|
mat.ambient.r = 0.5f;
|
||||||
|
mat.ambient.g = 0.5f;
|
||||||
|
mat.ambient.b = 0.5f;
|
||||||
|
m_engine->SetMaterial(mat);
|
||||||
|
|
||||||
// Draw the basic particles of triangles.
|
// Draw the basic particles of triangles.
|
||||||
if (m_totalInterface[0][sheet] > 0)
|
if (m_totalInterface[0][sheet] > 0)
|
||||||
{
|
{
|
||||||
|
@ -3378,21 +3387,11 @@ void CParticle::DrawParticle(int sheet)
|
||||||
if (m_particle[i].type == PARTIPART) continue;
|
if (m_particle[i].type == PARTIPART) continue;
|
||||||
|
|
||||||
m_engine->SetTexture(!m_triangle[i].tex1Name.empty() ? "textures/"+m_triangle[i].tex1Name : "");
|
m_engine->SetTexture(!m_triangle[i].tex1Name.empty() ? "textures/"+m_triangle[i].tex1Name : "");
|
||||||
m_engine->SetMaterial(m_triangle[i].material);
|
|
||||||
m_engine->SetState(m_triangle[i].state);
|
m_engine->SetState(m_triangle[i].state);
|
||||||
DrawParticleTriangle(i);
|
DrawParticleTriangle(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Material mat;
|
|
||||||
mat.diffuse.r = 1.0f;
|
|
||||||
mat.diffuse.g = 1.0f;
|
|
||||||
mat.diffuse.b = 1.0f; // white
|
|
||||||
mat.ambient.r = 0.5f;
|
|
||||||
mat.ambient.g = 0.5f;
|
|
||||||
mat.ambient.b = 0.5f;
|
|
||||||
m_engine->SetMaterial(mat);
|
|
||||||
|
|
||||||
// Draw tire marks.
|
// Draw tire marks.
|
||||||
if (m_wheelTraceTotal > 0 && sheet == SH_WORLD)
|
if (m_wheelTraceTotal > 0 && sheet == SH_WORLD)
|
||||||
{
|
{
|
||||||
|
|
|
@ -572,8 +572,7 @@ VertexTex2 CTerrain::GetVertex(int x, int y, int step)
|
||||||
|
|
|
|
||||||
+-------------------> x
|
+-------------------> x
|
||||||
\endverbatim */
|
\endverbatim */
|
||||||
bool CTerrain::CreateMosaic(int ox, int oy, int step, int objRank,
|
bool CTerrain::CreateMosaic(int ox, int oy, int step, int objRank)
|
||||||
const Material &mat)
|
|
||||||
{
|
{
|
||||||
int baseObjRank = m_engine->GetObjectBaseRank(objRank);
|
int baseObjRank = m_engine->GetObjectBaseRank(objRank);
|
||||||
if (baseObjRank == -1)
|
if (baseObjRank == -1)
|
||||||
|
@ -635,7 +634,6 @@ bool CTerrain::CreateMosaic(int ox, int oy, int step, int objRank,
|
||||||
buffer.vertices.reserve(total);
|
buffer.vertices.reserve(total);
|
||||||
|
|
||||||
buffer.type = EngineTriangleType::SURFACE;
|
buffer.type = EngineTriangleType::SURFACE;
|
||||||
buffer.material = mat;
|
|
||||||
|
|
||||||
buffer.state = ENG_RSTATE_WRAP;
|
buffer.state = ENG_RSTATE_WRAP;
|
||||||
|
|
||||||
|
@ -1249,10 +1247,6 @@ void CTerrain::FlushMaterialPoints()
|
||||||
|
|
||||||
bool CTerrain::CreateSquare(int x, int y)
|
bool CTerrain::CreateSquare(int x, int y)
|
||||||
{
|
{
|
||||||
Material mat;
|
|
||||||
mat.diffuse = Color(1.0f, 1.0f, 1.0f);
|
|
||||||
mat.ambient = Color(0.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
int objRank = m_engine->CreateObject();
|
int objRank = m_engine->CreateObject();
|
||||||
m_engine->SetObjectType(objRank, ENG_OBJTYPE_TERRAIN);
|
m_engine->SetObjectType(objRank, ENG_OBJTYPE_TERRAIN);
|
||||||
|
|
||||||
|
@ -1260,7 +1254,7 @@ bool CTerrain::CreateSquare(int x, int y)
|
||||||
|
|
||||||
for (int step = 0; step < m_depth; step++)
|
for (int step = 0; step < m_depth; step++)
|
||||||
{
|
{
|
||||||
CreateMosaic(x, y, 1 << step, objRank, mat);
|
CreateMosaic(x, y, 1 << step, objRank);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -256,7 +256,7 @@ protected:
|
||||||
//! Calculates a vertex of the terrain
|
//! Calculates a vertex of the terrain
|
||||||
VertexTex2 GetVertex(int x, int y, int step);
|
VertexTex2 GetVertex(int x, int y, int step);
|
||||||
//! Creates all objects of a mosaic
|
//! Creates all objects of a mosaic
|
||||||
bool CreateMosaic(int ox, int oy, int step, int objRank, const Material& mat);
|
bool CreateMosaic(int ox, int oy, int step, int objRank);
|
||||||
//! Creates all objects in a mesh square ground
|
//! Creates all objects in a mesh square ground
|
||||||
bool CreateSquare(int x, int y);
|
bool CreateSquare(int x, int y);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "graphics/model/model_input.h"
|
#include "graphics/model/model_input.h"
|
||||||
|
#include "graphics/core/material.h"
|
||||||
|
|
||||||
#include "common/ioutils.h"
|
#include "common/ioutils.h"
|
||||||
#include "common/logger.h"
|
#include "common/logger.h"
|
||||||
|
@ -157,11 +158,18 @@ void ModelInput::ReadBinaryModelV1AndV2(CModel &model, std::istream &stream)
|
||||||
t.p1 = ReadBinaryVertexTex2(stream);
|
t.p1 = ReadBinaryVertexTex2(stream);
|
||||||
t.p2 = ReadBinaryVertexTex2(stream);
|
t.p2 = ReadBinaryVertexTex2(stream);
|
||||||
t.p3 = ReadBinaryVertexTex2(stream);
|
t.p3 = ReadBinaryVertexTex2(stream);
|
||||||
t.material = ReadBinaryMaterial(stream);
|
auto material = ReadBinaryMaterial(stream);
|
||||||
t.tex1Name = ReadBinaryString<1>(stream);
|
t.tex1Name = ReadBinaryString<1>(stream);
|
||||||
t.tex2Name = ReadBinaryString<1>(stream);
|
t.tex2Name = ReadBinaryString<1>(stream);
|
||||||
t.variableTex2 = ReadBinaryBool(stream);
|
t.variableTex2 = ReadBinaryBool(stream);
|
||||||
|
|
||||||
|
auto diffuse = Gfx::ColorToIntColor(material.diffuse);
|
||||||
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
|
|
||||||
|
t.p1.color = color;
|
||||||
|
t.p2.color = color;
|
||||||
|
t.p3.color = color;
|
||||||
|
|
||||||
if (header.version == 1)
|
if (header.version == 1)
|
||||||
t.lodLevel = static_cast<ModelLODLevel>( ReadBinary<4, int>(stream) );
|
t.lodLevel = static_cast<ModelLODLevel>( ReadBinary<4, int>(stream) );
|
||||||
|
|
||||||
|
@ -175,9 +183,6 @@ 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.diffuse = t.material.diffuse;
|
|
||||||
triangle.specular = t.material.specular;
|
|
||||||
triangle.ambient = t.material.ambient;
|
|
||||||
triangle.tex1Name = t.tex1Name;
|
triangle.tex1Name = t.tex1Name;
|
||||||
triangle.tex2Name = t.tex2Name;
|
triangle.tex2Name = t.tex2Name;
|
||||||
triangle.variableTex2 = t.variableTex2;
|
triangle.variableTex2 = t.variableTex2;
|
||||||
|
@ -248,7 +253,14 @@ void ModelInput::ReadTextModelV1AndV2(CModel &model, std::istream &stream)
|
||||||
t.p3 = ParseVertexTex2(p3Text);
|
t.p3 = ParseVertexTex2(p3Text);
|
||||||
|
|
||||||
std::string matText = ReadLineString(stream, "mat");
|
std::string matText = ReadLineString(stream, "mat");
|
||||||
t.material = ParseMaterial(matText);
|
auto material = ParseMaterial(matText);
|
||||||
|
|
||||||
|
auto diffuse = Gfx::ColorToIntColor(material.diffuse);
|
||||||
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
|
|
||||||
|
t.p1.color = color;
|
||||||
|
t.p2.color = color;
|
||||||
|
t.p3.color = color;
|
||||||
|
|
||||||
t.tex1Name = ReadLineString(stream, "tex1");
|
t.tex1Name = ReadLineString(stream, "tex1");
|
||||||
t.tex2Name = ReadLineString(stream, "tex2");
|
t.tex2Name = ReadLineString(stream, "tex2");
|
||||||
|
@ -268,9 +280,6 @@ 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.ambient = t.material.ambient;
|
|
||||||
triangle.diffuse = t.material.diffuse;
|
|
||||||
triangle.specular = t.material.specular;
|
|
||||||
triangle.tex1Name = t.tex1Name;
|
triangle.tex1Name = t.tex1Name;
|
||||||
triangle.tex2Name = t.tex2Name;
|
triangle.tex2Name = t.tex2Name;
|
||||||
triangle.variableTex2 = t.variableTex2;
|
triangle.variableTex2 = t.variableTex2;
|
||||||
|
@ -356,9 +365,13 @@ CModelMesh ModelInput::ReadTextMesh(std::istream& stream)
|
||||||
|
|
||||||
std::string matText = ReadLineString(stream, "mat");
|
std::string matText = ReadLineString(stream, "mat");
|
||||||
Material mat = ParseMaterial(matText);
|
Material mat = ParseMaterial(matText);
|
||||||
t.ambient = mat.ambient;
|
|
||||||
t.diffuse = mat.diffuse;
|
auto diffuse = Gfx::ColorToIntColor(mat.diffuse);
|
||||||
t.specular = mat.specular;
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
|
|
||||||
|
t.p1.color = color;
|
||||||
|
t.p2.color = color;
|
||||||
|
t.p3.color = color;
|
||||||
|
|
||||||
t.tex1Name = ReadLineString(stream, "tex1");
|
t.tex1Name = ReadLineString(stream, "tex1");
|
||||||
t.tex2Name = ReadLineString(stream, "tex2");
|
t.tex2Name = ReadLineString(stream, "tex2");
|
||||||
|
@ -435,7 +448,7 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV1(std::istream &stream, int
|
||||||
t.p2 = ReadBinaryVertex(stream);
|
t.p2 = ReadBinaryVertex(stream);
|
||||||
t.p3 = ReadBinaryVertex(stream);
|
t.p3 = ReadBinaryVertex(stream);
|
||||||
|
|
||||||
t.material = ReadBinaryMaterial(stream);
|
auto material = ReadBinaryMaterial(stream);
|
||||||
stream.read(t.texName, 20);
|
stream.read(t.texName, 20);
|
||||||
t.min = ReadBinaryFloat(stream);
|
t.min = ReadBinaryFloat(stream);
|
||||||
t.max = ReadBinaryFloat(stream);
|
t.max = ReadBinaryFloat(stream);
|
||||||
|
@ -450,9 +463,13 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV1(std::istream &stream, int
|
||||||
triangle.p2 = t.p2;
|
triangle.p2 = t.p2;
|
||||||
triangle.p3 = t.p3;
|
triangle.p3 = t.p3;
|
||||||
|
|
||||||
triangle.ambient = t.material.ambient;
|
auto diffuse = Gfx::ColorToIntColor(material.diffuse);
|
||||||
triangle.diffuse = t.material.diffuse;
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
triangle.specular = t.material.specular;
|
|
||||||
|
triangle.p1.color = color;
|
||||||
|
triangle.p2.color = color;
|
||||||
|
triangle.p3.color = color;
|
||||||
|
|
||||||
ConvertOldTex1Name(triangle, t.texName);
|
ConvertOldTex1Name(triangle, t.texName);
|
||||||
|
|
||||||
triangles.push_back(triangle);
|
triangles.push_back(triangle);
|
||||||
|
@ -477,7 +494,7 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV2(std::istream &stream, int
|
||||||
t.p2 = ReadBinaryVertex(stream);
|
t.p2 = ReadBinaryVertex(stream);
|
||||||
t.p3 = ReadBinaryVertex(stream);
|
t.p3 = ReadBinaryVertex(stream);
|
||||||
|
|
||||||
t.material = ReadBinaryMaterial(stream);
|
auto material = ReadBinaryMaterial(stream);
|
||||||
stream.read(t.texName, 20);
|
stream.read(t.texName, 20);
|
||||||
t.min = ReadBinaryFloat(stream);
|
t.min = ReadBinaryFloat(stream);
|
||||||
t.max = ReadBinaryFloat(stream);
|
t.max = ReadBinaryFloat(stream);
|
||||||
|
@ -498,9 +515,13 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV2(std::istream &stream, int
|
||||||
triangle.p2 = t.p2;
|
triangle.p2 = t.p2;
|
||||||
triangle.p3 = t.p3;
|
triangle.p3 = t.p3;
|
||||||
|
|
||||||
triangle.ambient = t.material.ambient;
|
auto diffuse = Gfx::ColorToIntColor(material.diffuse);
|
||||||
triangle.diffuse = t.material.diffuse;
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
triangle.specular = t.material.specular;
|
|
||||||
|
triangle.p1.color = color;
|
||||||
|
triangle.p2.color = color;
|
||||||
|
triangle.p3.color = color;
|
||||||
|
|
||||||
ConvertOldTex1Name(triangle, t.texName);
|
ConvertOldTex1Name(triangle, t.texName);
|
||||||
|
|
||||||
ConvertFromOldRenderState(triangle, t.state);
|
ConvertFromOldRenderState(triangle, t.state);
|
||||||
|
@ -527,7 +548,7 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV3(std::istream &stream, int
|
||||||
t.p2 = ReadBinaryVertexTex2(stream);
|
t.p2 = ReadBinaryVertexTex2(stream);
|
||||||
t.p3 = ReadBinaryVertexTex2(stream);
|
t.p3 = ReadBinaryVertexTex2(stream);
|
||||||
|
|
||||||
t.material = ReadBinaryMaterial(stream);
|
auto material = ReadBinaryMaterial(stream);
|
||||||
stream.read(t.texName, 20);
|
stream.read(t.texName, 20);
|
||||||
t.min = ReadBinaryFloat(stream);
|
t.min = ReadBinaryFloat(stream);
|
||||||
t.max = ReadBinaryFloat(stream);
|
t.max = ReadBinaryFloat(stream);
|
||||||
|
@ -548,9 +569,13 @@ std::vector<ModelTriangle> ModelInput::ReadOldModelV3(std::istream &stream, int
|
||||||
triangle.p2 = t.p2;
|
triangle.p2 = t.p2;
|
||||||
triangle.p3 = t.p3;
|
triangle.p3 = t.p3;
|
||||||
|
|
||||||
triangle.ambient = t.material.ambient;
|
auto diffuse = Gfx::ColorToIntColor(material.diffuse);
|
||||||
triangle.diffuse = t.material.diffuse;
|
glm::u8vec4 color = { diffuse.r, diffuse.g, diffuse.b, 255 };
|
||||||
triangle.specular = t.material.specular;
|
|
||||||
|
triangle.p1.color = color;
|
||||||
|
triangle.p2.color = color;
|
||||||
|
triangle.p3.color = color;
|
||||||
|
|
||||||
ConvertOldTex1Name(triangle, t.texName);
|
ConvertOldTex1Name(triangle, t.texName);
|
||||||
|
|
||||||
ConvertFromOldRenderState(triangle, t.state);
|
ConvertFromOldRenderState(triangle, t.state);
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "graphics/core/material.h"
|
|
||||||
|
|
||||||
#include "graphics/model/model_triangle.h"
|
#include "graphics/model/model_triangle.h"
|
||||||
|
|
||||||
namespace Gfx
|
namespace Gfx
|
||||||
|
@ -84,13 +82,11 @@ struct ModelHeaderV1AndV2
|
||||||
struct ModelTriangleV1AndV2
|
struct ModelTriangleV1AndV2
|
||||||
{
|
{
|
||||||
//! 1st vertex
|
//! 1st vertex
|
||||||
VertexTex2 p1;
|
Vertex3D p1;
|
||||||
//! 2nd vertex
|
//! 2nd vertex
|
||||||
VertexTex2 p2;
|
Vertex3D p2;
|
||||||
//! 3rd vertex
|
//! 3rd vertex
|
||||||
VertexTex2 p3;
|
Vertex3D p3;
|
||||||
//! Material
|
|
||||||
Material material;
|
|
||||||
//! Name of 1st texture
|
//! Name of 1st texture
|
||||||
std::string tex1Name;
|
std::string tex1Name;
|
||||||
//! Name of 2nd texture
|
//! Name of 2nd texture
|
||||||
|
@ -187,7 +183,6 @@ struct OldModelTriangleV1
|
||||||
Vertex p1;
|
Vertex p1;
|
||||||
Vertex p2;
|
Vertex p2;
|
||||||
Vertex p3;
|
Vertex p3;
|
||||||
Material material;
|
|
||||||
char texName[21] = {'\0'};
|
char texName[21] = {'\0'};
|
||||||
float min = 0;
|
float min = 0;
|
||||||
float max = 0;
|
float max = 0;
|
||||||
|
@ -206,7 +201,6 @@ struct OldModelTriangleV2
|
||||||
Vertex p1;
|
Vertex p1;
|
||||||
Vertex p2;
|
Vertex p2;
|
||||||
Vertex p3;
|
Vertex p3;
|
||||||
Material material;
|
|
||||||
char texName[21] = {'\0'};
|
char texName[21] = {'\0'};
|
||||||
float min = 0.0f;
|
float min = 0.0f;
|
||||||
float max = 0.0f;
|
float max = 0.0f;
|
||||||
|
@ -230,7 +224,6 @@ struct OldModelTriangleV3
|
||||||
Vertex3D p1;
|
Vertex3D p1;
|
||||||
Vertex3D p2;
|
Vertex3D p2;
|
||||||
Vertex3D p3;
|
Vertex3D p3;
|
||||||
Material material;
|
|
||||||
char texName[21] = {'\0'};
|
char texName[21] = {'\0'};
|
||||||
float min = 0.0f;
|
float min = 0.0f;
|
||||||
float max = 0.0f;
|
float max = 0.0f;
|
||||||
|
|
|
@ -25,461 +25,15 @@
|
||||||
#include "graphics/model/model_io_exception.h"
|
#include "graphics/model/model_io_exception.h"
|
||||||
#include "graphics/model/model_io_structs.h"
|
#include "graphics/model/model_io_structs.h"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
namespace Gfx
|
namespace Gfx
|
||||||
{
|
{
|
||||||
|
|
||||||
// Private functions
|
|
||||||
namespace ModelOutput
|
|
||||||
{
|
|
||||||
void WriteTextModel(const CModel& model, std::ostream &stream);
|
|
||||||
void WriteTextHeader(const ModelHeaderV3& header, std::ostream &stream);
|
|
||||||
void WriteCrashSphere(const ModelCrashSphere& crashSphere, std::ostream &stream);
|
|
||||||
void WriteShadowSpot(const ModelShadowSpot& shadowSpot, std::ostream &stream);
|
|
||||||
void WriteCameraCollisionSphere(const Math::Sphere& sphere, std::ostream &stream);
|
|
||||||
void WriteTextMesh(const CModelMesh* mesh, const std::string& meshName, std::ostream &stream);
|
|
||||||
std::string VectorToString(const glm::vec3& vector);
|
|
||||||
std::string TransparentModeToString(ModelTransparentMode mode);
|
|
||||||
std::string SpecialMarkToString(ModelSpecialMark specialMark);
|
|
||||||
|
|
||||||
void WriteBinaryModel(const CModel& model, std::ostream &stream);
|
|
||||||
|
|
||||||
void WriteOldModel(const CModel& model, std::ostream &stream);
|
|
||||||
|
|
||||||
int ConvertToOldState(const ModelTriangle& triangle);
|
|
||||||
|
|
||||||
void WriteBinaryVertex3D(const Vertex3D& vertex, std::ostream &stream);
|
|
||||||
void WriteBinaryMaterial(const Material& material, std::ostream &stream);
|
|
||||||
|
|
||||||
void WriteTextVertex3D(const Vertex3D& vertex, std::ostream &stream);
|
|
||||||
void WriteTextMaterial(const Material& material, std::ostream &stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace IOUtils;
|
|
||||||
|
|
||||||
void ModelOutput::Write(const CModel& model, std::ostream &stream, ModelFormat format)
|
void ModelOutput::Write(const CModel& model, std::ostream &stream, ModelFormat format)
|
||||||
{
|
{
|
||||||
stream.exceptions(std::ios_base::failbit | std::ios_base::badbit);
|
throw std::logic_error("Not implemented");
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case ModelFormat::Text:
|
|
||||||
WriteTextModel(model, stream);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelFormat::Binary:
|
|
||||||
WriteBinaryModel(model, stream);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelFormat::Old:
|
|
||||||
WriteOldModel(model, stream);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (const CModelIOException& e)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (const std::exception& e)
|
|
||||||
{
|
|
||||||
throw CModelIOException(std::string("Error saving model data: ") + e.what());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteTextModel(const CModel& model, std::ostream &stream)
|
|
||||||
{
|
|
||||||
ModelHeaderV3 header;
|
|
||||||
header.version = 3;
|
|
||||||
header.totalCrashSpheres = model.GetCrashSphereCount();
|
|
||||||
header.hasShadowSpot = model.HasShadowSpot();
|
|
||||||
header.hasCameraCollisionSphere = model.HasCameraCollisionSphere();
|
|
||||||
header.totalMeshes = model.GetMeshCount();
|
|
||||||
WriteTextHeader(header, stream);
|
|
||||||
|
|
||||||
stream << "# MODEL PROPERTIES" << std::endl;
|
|
||||||
|
|
||||||
for (const auto& crashSphere : model.GetCrashSpheres())
|
|
||||||
WriteCrashSphere(crashSphere, stream);
|
|
||||||
|
|
||||||
if (model.HasShadowSpot())
|
|
||||||
WriteShadowSpot(model.GetShadowSpot(), stream);
|
|
||||||
|
|
||||||
if (model.HasCameraCollisionSphere())
|
|
||||||
WriteCameraCollisionSphere(model.GetCameraCollisionSphere(), stream);
|
|
||||||
|
|
||||||
stream << std::endl;
|
|
||||||
|
|
||||||
for (const std::string& meshName : model.GetMeshNames())
|
|
||||||
{
|
|
||||||
const CModelMesh* mesh = model.GetMesh(meshName);
|
|
||||||
assert(mesh != nullptr);
|
|
||||||
WriteTextMesh(mesh, meshName, stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteTextHeader(const ModelHeaderV3& header, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "# Colobot text model" << std::endl;
|
|
||||||
stream << std::endl;
|
|
||||||
stream << "### HEAD" << std::endl;
|
|
||||||
stream << "version " << header.version << std::endl;
|
|
||||||
stream << "total_crash_spheres " << header.totalCrashSpheres << std::endl;
|
|
||||||
stream << "has_shadow_spot " << (header.hasShadowSpot ? "Y" : "N") << std::endl;
|
|
||||||
stream << "has_camera_collision_sphere " << (header.hasCameraCollisionSphere ? "Y" : "N") << std::endl;
|
|
||||||
stream << "total_meshes " << header.totalMeshes << std::endl;
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteCrashSphere(const ModelCrashSphere& crashSphere, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "crash_sphere";
|
|
||||||
stream << " pos"
|
|
||||||
<< " " << crashSphere.position.x
|
|
||||||
<< " " << crashSphere.position.y
|
|
||||||
<< " " << crashSphere.position.z;
|
|
||||||
stream << " rad " << crashSphere.radius;
|
|
||||||
stream << " sound " << crashSphere.sound;
|
|
||||||
stream << " hard " << crashSphere.hardness;
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteShadowSpot(const ModelShadowSpot& shadowSpot, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "shadow_spot";
|
|
||||||
stream << " rad " << shadowSpot.radius;
|
|
||||||
stream << " int " << shadowSpot.intensity;
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteCameraCollisionSphere(const Math::Sphere& sphere, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "camera_collision_sphere ";
|
|
||||||
stream << " pos "
|
|
||||||
<< sphere.pos.x
|
|
||||||
<< sphere.pos.y
|
|
||||||
<< sphere.pos.z;
|
|
||||||
stream << " rad " << sphere.radius;
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteTextMesh(const CModelMesh* mesh, const std::string& meshName, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "### MESH" << std::endl;
|
|
||||||
stream << "mesh " << meshName << std::endl;
|
|
||||||
stream << "position " << VectorToString(mesh->GetPosition()) << std::endl;
|
|
||||||
stream << "rotation " << VectorToString(mesh->GetRotation()) << std::endl;
|
|
||||||
stream << "scale " << VectorToString(mesh->GetScale()) << std::endl;
|
|
||||||
stream << "parent " << mesh->GetParent() << std::endl;
|
|
||||||
stream << "total_triangles " << mesh->GetTriangleCount() << std::endl;
|
|
||||||
stream << std::endl;
|
|
||||||
|
|
||||||
stream << "### MESH TRIANGLES" << std::endl;
|
|
||||||
for (const ModelTriangle& t : mesh->GetTriangles())
|
|
||||||
{
|
|
||||||
stream << "p1 ";
|
|
||||||
WriteTextVertex3D(t.p1, stream);
|
|
||||||
stream << "p2 ";
|
|
||||||
WriteTextVertex3D(t.p2, stream);
|
|
||||||
stream << "p3 ";
|
|
||||||
WriteTextVertex3D(t.p3, stream);
|
|
||||||
stream << "mat ";
|
|
||||||
Material material;
|
|
||||||
material.ambient = t.ambient;
|
|
||||||
material.diffuse = t.diffuse;
|
|
||||||
material.specular = t.specular;
|
|
||||||
WriteTextMaterial(material, stream);
|
|
||||||
|
|
||||||
stream << "tex1 " << t.tex1Name << std::endl;
|
|
||||||
stream << "tex2 " << t.tex2Name << std::endl;
|
|
||||||
stream << "var_tex2 " << (t.variableTex2 ? 'Y' : 'N') << std::endl;
|
|
||||||
stream << "trans_mode " << TransparentModeToString(t.transparentMode) << std::endl;
|
|
||||||
stream << "mark " << SpecialMarkToString(t.specialMark) << std::endl;
|
|
||||||
stream << "dbl_side " << (t.doubleSided ? 'Y' : 'N') << std::endl;
|
|
||||||
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ModelOutput::VectorToString(const glm::vec3& vector)
|
|
||||||
{
|
|
||||||
std::ostringstream str;
|
|
||||||
str << vector.x << " " << vector.y << " " << vector.z;
|
|
||||||
return str.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ModelOutput::TransparentModeToString(ModelTransparentMode mode)
|
|
||||||
{
|
|
||||||
std::string str;
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case ModelTransparentMode::None:
|
|
||||||
str = "none";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::AlphaChannel:
|
|
||||||
str = "alpha";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::MapBlackToAlpha:
|
|
||||||
str = "map_black";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::MapWhiteToAlpha:
|
|
||||||
str = "map_white";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ModelOutput::SpecialMarkToString(ModelSpecialMark specialMark)
|
|
||||||
{
|
|
||||||
std::string str;
|
|
||||||
switch (specialMark)
|
|
||||||
{
|
|
||||||
case ModelSpecialMark::None:
|
|
||||||
str = "none";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part1:
|
|
||||||
str = "part1";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part2:
|
|
||||||
str = "part2";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part3:
|
|
||||||
str = "part3";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteBinaryModel(const CModel& model, std::ostream &stream)
|
|
||||||
{
|
|
||||||
const CModelMesh* mesh = model.GetMesh("main");
|
|
||||||
if (mesh == nullptr)
|
|
||||||
throw CModelIOException("No main mesh found in model");
|
|
||||||
|
|
||||||
ModelHeaderV1AndV2 header;
|
|
||||||
|
|
||||||
header.version = 2;
|
|
||||||
header.totalTriangles = mesh->GetTriangleCount();
|
|
||||||
|
|
||||||
WriteBinary<4, int>(header.version, stream);
|
|
||||||
WriteBinary<4, int>(header.totalTriangles, stream);
|
|
||||||
|
|
||||||
for (const ModelTriangle& triangle : mesh->GetTriangles())
|
|
||||||
{
|
|
||||||
ModelTriangleV1AndV2 t;
|
|
||||||
|
|
||||||
t.p1 = triangle.p1;
|
|
||||||
t.p2 = triangle.p2;
|
|
||||||
t.p3 = triangle.p3;
|
|
||||||
t.material.ambient = triangle.ambient;
|
|
||||||
t.material.diffuse = triangle.diffuse;
|
|
||||||
t.material.specular = triangle.specular;
|
|
||||||
t.tex1Name = triangle.tex1Name;
|
|
||||||
t.tex2Name = triangle.tex2Name;
|
|
||||||
t.variableTex2 = triangle.variableTex2;
|
|
||||||
t.state = ConvertToOldState(triangle);
|
|
||||||
|
|
||||||
WriteBinaryVertex3D(t.p1, stream);
|
|
||||||
WriteBinaryVertex3D(t.p2, stream);
|
|
||||||
WriteBinaryVertex3D(t.p3, stream);
|
|
||||||
WriteBinaryMaterial(t.material, stream);
|
|
||||||
WriteBinaryString<1>(t.tex1Name, stream);
|
|
||||||
WriteBinaryString<1>(t.tex2Name, stream);
|
|
||||||
WriteBinaryBool(t.variableTex2, stream);
|
|
||||||
WriteBinary<4, int>(t.state, stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteOldModel(const CModel& model, std::ostream &stream)
|
|
||||||
{
|
|
||||||
const CModelMesh* mesh = model.GetMesh("main");
|
|
||||||
if (mesh == nullptr)
|
|
||||||
throw CModelIOException("No main mesh found in model");
|
|
||||||
|
|
||||||
OldModelHeader header;
|
|
||||||
header.revision = 1;
|
|
||||||
header.version = 2;
|
|
||||||
header.totalTriangles = mesh->GetTriangleCount();
|
|
||||||
|
|
||||||
WriteBinary<4, int>(header.revision, stream);
|
|
||||||
WriteBinary<4, int>(header.version, stream);
|
|
||||||
WriteBinary<4, int>(header.totalTriangles, stream);
|
|
||||||
for (int i = 0; i < 10; ++i)
|
|
||||||
WriteBinary<4, int>(header.reserved[i], stream);
|
|
||||||
|
|
||||||
for (const ModelTriangle& triangle : mesh->GetTriangles())
|
|
||||||
{
|
|
||||||
OldModelTriangleV3 t;
|
|
||||||
|
|
||||||
t.used = true;
|
|
||||||
|
|
||||||
t.p1 = triangle.p1;
|
|
||||||
t.p2 = triangle.p2;
|
|
||||||
t.p3 = triangle.p3;
|
|
||||||
|
|
||||||
t.material.ambient = triangle.ambient;
|
|
||||||
t.material.diffuse = triangle.diffuse;
|
|
||||||
t.material.specular = triangle.specular;
|
|
||||||
|
|
||||||
strncpy(t.texName, triangle.tex1Name.c_str(), sizeof(t.texName)-1);
|
|
||||||
t.texName[sizeof(t.texName)-1] = '\0';
|
|
||||||
|
|
||||||
t.min = 0.0f;
|
|
||||||
t.max = 1000000.0f;
|
|
||||||
t.state = ConvertToOldState(triangle);
|
|
||||||
|
|
||||||
int no = 0;
|
|
||||||
if (triangle.variableTex2)
|
|
||||||
no = 1;
|
|
||||||
else
|
|
||||||
std::sscanf(triangle.tex2Name.c_str(), "dirty%d.png", &no);
|
|
||||||
|
|
||||||
t.texNum2 = no;
|
|
||||||
|
|
||||||
|
|
||||||
WriteBinary<1, char>(t.used, stream);
|
|
||||||
WriteBinary<1, char>(t.selected, stream);
|
|
||||||
|
|
||||||
/* padding */ WriteBinary<2, unsigned int>(0, stream);
|
|
||||||
|
|
||||||
WriteBinaryVertex3D(t.p1, stream);
|
|
||||||
WriteBinaryVertex3D(t.p2, stream);
|
|
||||||
WriteBinaryVertex3D(t.p3, stream);
|
|
||||||
|
|
||||||
WriteBinaryMaterial(t.material, stream);
|
|
||||||
stream.write(t.texName, 20);
|
|
||||||
WriteBinaryFloat(t.min, stream);
|
|
||||||
WriteBinaryFloat(t.max, stream);
|
|
||||||
WriteBinary<4, long>(t.state, stream);
|
|
||||||
WriteBinary<2, short>(t.texNum2, stream);
|
|
||||||
|
|
||||||
WriteBinary<2, short>(t.reserved2, stream);
|
|
||||||
WriteBinary<2, short>(t.reserved3, stream);
|
|
||||||
WriteBinary<2, short>(t.reserved4, stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ModelOutput::ConvertToOldState(const ModelTriangle& triangle)
|
|
||||||
{
|
|
||||||
int state = 0;
|
|
||||||
|
|
||||||
switch (triangle.transparentMode)
|
|
||||||
{
|
|
||||||
case ModelTransparentMode::None:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::AlphaChannel:
|
|
||||||
state |= static_cast<int>(ModelRenderState::Alpha);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::MapBlackToAlpha:
|
|
||||||
state |= static_cast<int>(ModelRenderState::TTextureBlack);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelTransparentMode::MapWhiteToAlpha:
|
|
||||||
state |= static_cast<int>(ModelRenderState::TTextureWhite);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (triangle.specialMark)
|
|
||||||
{
|
|
||||||
case ModelSpecialMark::None:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part1:
|
|
||||||
state |= static_cast<int>(ModelRenderState::Part1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part2:
|
|
||||||
state |= static_cast<int>(ModelRenderState::Part2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ModelSpecialMark::Part3:
|
|
||||||
state |= static_cast<int>(ModelRenderState::Part3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triangle.doubleSided)
|
|
||||||
state |= static_cast<int>(ModelRenderState::TwoFace);
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteBinaryVertex3D(const Vertex3D& vertex, std::ostream &stream)
|
|
||||||
{
|
|
||||||
WriteBinaryFloat(vertex.position.x, stream);
|
|
||||||
WriteBinaryFloat(vertex.position.y, stream);
|
|
||||||
WriteBinaryFloat(vertex.position.z, stream);
|
|
||||||
WriteBinaryFloat(vertex.normal.x, stream);
|
|
||||||
WriteBinaryFloat(vertex.normal.y, stream);
|
|
||||||
WriteBinaryFloat(vertex.normal.z, stream);
|
|
||||||
WriteBinaryFloat(vertex.uv.x, stream);
|
|
||||||
WriteBinaryFloat(vertex.uv.y, stream);
|
|
||||||
WriteBinaryFloat(vertex.uv2.x, stream);
|
|
||||||
WriteBinaryFloat(vertex.uv2.y, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteBinaryMaterial(const Material& material, std::ostream &stream)
|
|
||||||
{
|
|
||||||
WriteBinaryFloat(material.diffuse.r, stream);
|
|
||||||
WriteBinaryFloat(material.diffuse.g, stream);
|
|
||||||
WriteBinaryFloat(material.diffuse.b, stream);
|
|
||||||
WriteBinaryFloat(material.diffuse.a, stream);
|
|
||||||
|
|
||||||
WriteBinaryFloat(material.ambient.r, stream);
|
|
||||||
WriteBinaryFloat(material.ambient.g, stream);
|
|
||||||
WriteBinaryFloat(material.ambient.b, stream);
|
|
||||||
WriteBinaryFloat(material.ambient.a, stream);
|
|
||||||
|
|
||||||
WriteBinaryFloat(material.specular.r, stream);
|
|
||||||
WriteBinaryFloat(material.specular.g, stream);
|
|
||||||
WriteBinaryFloat(material.specular.b, stream);
|
|
||||||
WriteBinaryFloat(material.specular.a, stream);
|
|
||||||
|
|
||||||
/* emissive.r */ WriteBinaryFloat(0.0f, stream);
|
|
||||||
/* emissive.g */ WriteBinaryFloat(0.0f, stream);
|
|
||||||
/* emissive.b */ WriteBinaryFloat(0.0f, stream);
|
|
||||||
/* emissive.a */ WriteBinaryFloat(0.0f, stream);
|
|
||||||
|
|
||||||
/* power */ WriteBinaryFloat(0.0f, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteTextVertex3D(const Vertex3D& vertex, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "c " << vertex.position.x << " " << vertex.position.y << " " << vertex.position.z;
|
|
||||||
stream << " n " << vertex.normal.x << " " << vertex.normal.y << " " << vertex.normal.z;
|
|
||||||
stream << " t1 " << vertex.uv.x << " " << vertex.uv.y;
|
|
||||||
stream << " t2 " << vertex.uv2.x << " " << vertex.uv2.y;
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelOutput::WriteTextMaterial(const Material& material, std::ostream &stream)
|
|
||||||
{
|
|
||||||
stream << "dif " << material.diffuse.r
|
|
||||||
<< " " << material.diffuse.g
|
|
||||||
<< " " << material.diffuse.b
|
|
||||||
<< " " << material.diffuse.a;
|
|
||||||
|
|
||||||
stream << " amb " << material.ambient.r
|
|
||||||
<< " " << material.ambient.g
|
|
||||||
<< " " << material.ambient.b
|
|
||||||
<< " " << material.ambient.a;
|
|
||||||
|
|
||||||
stream << " spc " << material.specular.r
|
|
||||||
<< " " << material.specular.g << " "
|
|
||||||
<< material.specular.b << " "
|
|
||||||
<< material.specular.a;
|
|
||||||
|
|
||||||
stream << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace Gfx
|
} // namespace Gfx
|
||||||
|
|
|
@ -65,12 +65,6 @@ struct ModelTriangle
|
||||||
Vertex3D p2;
|
Vertex3D p2;
|
||||||
//! 3rd vertex
|
//! 3rd vertex
|
||||||
Vertex3D p3;
|
Vertex3D p3;
|
||||||
//! Diffuse color
|
|
||||||
Color diffuse;
|
|
||||||
//! Ambient color
|
|
||||||
Color ambient;
|
|
||||||
//! Specular color
|
|
||||||
Color specular;
|
|
||||||
//! Name of 1st texture
|
//! Name of 1st texture
|
||||||
std::string tex1Name;
|
std::string tex1Name;
|
||||||
//! Name of 2nd texture
|
//! Name of 2nd texture
|
||||||
|
|
|
@ -393,24 +393,16 @@ Error CAutoPortico::GetError()
|
||||||
|
|
||||||
void CAutoPortico::UpdateTrackMapping(float left, float right)
|
void CAutoPortico::UpdateTrackMapping(float left, float right)
|
||||||
{
|
{
|
||||||
Gfx::Material mat;
|
|
||||||
mat.diffuse.r = 1.0f;
|
|
||||||
mat.diffuse.g = 1.0f;
|
|
||||||
mat.diffuse.b = 1.0f; // blank
|
|
||||||
mat.ambient.r = 0.5f;
|
|
||||||
mat.ambient.g = 0.5f;
|
|
||||||
mat.ambient.b = 0.5f;
|
|
||||||
|
|
||||||
int rank = m_object->GetObjectRank(0);
|
int rank = m_object->GetObjectRank(0);
|
||||||
|
|
||||||
std::string teamStr = StrUtils::ToString<int>(m_object->GetTeam());
|
std::string teamStr = StrUtils::ToString<int>(m_object->GetTeam());
|
||||||
if(m_object->GetTeam() == 0) teamStr = "";
|
if(m_object->GetTeam() == 0) teamStr = "";
|
||||||
|
|
||||||
m_engine->TrackTextureMapping(rank, mat, Gfx::ENG_RSTATE_PART1, "objects/lemt.png"+teamStr, "",
|
m_engine->TrackTextureMapping(rank, Gfx::ENG_RSTATE_PART1, "objects/lemt.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
right, 8.0f, 8.0f, 192.0f, 256.0f);
|
right, 8.0f, 8.0f, 192.0f, 256.0f);
|
||||||
|
|
||||||
m_engine->TrackTextureMapping(rank, mat, Gfx::ENG_RSTATE_PART2, "objects/lemt.png"+teamStr, "",
|
m_engine->TrackTextureMapping(rank, Gfx::ENG_RSTATE_PART2, "objects/lemt.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
left, 8.0f, 8.0f, 192.0f, 256.0f);
|
left, 8.0f, 8.0f, 192.0f, 256.0f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1978,10 +1978,6 @@ bool CMotionVehicle::EventFrameCanoni(const Event &event)
|
||||||
|
|
||||||
void CMotionVehicle::UpdateTrackMapping(float left, float right, ObjectType type)
|
void CMotionVehicle::UpdateTrackMapping(float left, float right, ObjectType type)
|
||||||
{
|
{
|
||||||
Gfx::Material mat;
|
|
||||||
mat.diffuse = Gfx::Color(1.0f, 1.0f, 1.0f); // white
|
|
||||||
mat.ambient = Gfx::Color(0.5f, 0.5f, 0.5f);
|
|
||||||
|
|
||||||
int rRank = m_object->GetObjectRank(6);
|
int rRank = m_object->GetObjectRank(6);
|
||||||
int lRank = m_object->GetObjectRank(7);
|
int lRank = m_object->GetObjectRank(7);
|
||||||
|
|
||||||
|
@ -1990,21 +1986,21 @@ void CMotionVehicle::UpdateTrackMapping(float left, float right, ObjectType type
|
||||||
|
|
||||||
if (type == OBJECT_MOBILEdr)
|
if (type == OBJECT_MOBILEdr)
|
||||||
{
|
{
|
||||||
m_engine->TrackTextureMapping(rRank, mat, Gfx::ENG_RSTATE_PART1, "objects/drawer.png"+teamStr, "",
|
m_engine->TrackTextureMapping(rRank, Gfx::ENG_RSTATE_PART1, "objects/drawer.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
right, 1.0f, 8.0f, 192.0f, 256.0f);
|
right, 1.0f, 8.0f, 192.0f, 256.0f);
|
||||||
|
|
||||||
m_engine->TrackTextureMapping(lRank, mat, Gfx::ENG_RSTATE_PART2, "objects/drawer.png"+teamStr, "",
|
m_engine->TrackTextureMapping(lRank, Gfx::ENG_RSTATE_PART2, "objects/drawer.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
left, 1.0f, 8.0f, 192.0f, 256.0f);
|
left, 1.0f, 8.0f, 192.0f, 256.0f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_engine->TrackTextureMapping(rRank, mat, Gfx::ENG_RSTATE_PART1, "objects/lemt.png"+teamStr, "",
|
m_engine->TrackTextureMapping(rRank, Gfx::ENG_RSTATE_PART1, "objects/lemt.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
right, 1.0f, 8.0f, 192.0f, 256.0f);
|
right, 1.0f, 8.0f, 192.0f, 256.0f);
|
||||||
|
|
||||||
m_engine->TrackTextureMapping(lRank, mat, Gfx::ENG_RSTATE_PART2, "objects/lemt.png"+teamStr, "",
|
m_engine->TrackTextureMapping(lRank, Gfx::ENG_RSTATE_PART2, "objects/lemt.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::X,
|
Gfx::EngineTextureMapping::X,
|
||||||
left, 1.0f, 8.0f, 192.0f, 256.0f);
|
left, 1.0f, 8.0f, 192.0f, 256.0f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2011,10 +2011,6 @@ void COldObject::UpdateEnergyMapping()
|
||||||
|
|
||||||
m_lastEnergy = GetEnergyLevel();
|
m_lastEnergy = GetEnergyLevel();
|
||||||
|
|
||||||
Gfx::Material mat;
|
|
||||||
mat.diffuse = Gfx::Color(1.0f, 1.0f, 1.0f); // white
|
|
||||||
mat.ambient = Gfx::Color(0.5f, 0.5f, 0.5f);
|
|
||||||
|
|
||||||
float a = 0.0f, b = 0.0f;
|
float a = 0.0f, b = 0.0f;
|
||||||
|
|
||||||
if ( m_type == OBJECT_POWER ||
|
if ( m_type == OBJECT_POWER ||
|
||||||
|
@ -2043,7 +2039,7 @@ void COldObject::UpdateEnergyMapping()
|
||||||
std::string teamStr = StrUtils::ToString<int>(GetTeam());
|
std::string teamStr = StrUtils::ToString<int>(GetTeam());
|
||||||
if(GetTeam() == 0) teamStr = "";
|
if(GetTeam() == 0) teamStr = "";
|
||||||
m_engine->ChangeTextureMapping(m_objectPart[0].object,
|
m_engine->ChangeTextureMapping(m_objectPart[0].object,
|
||||||
mat, Gfx::ENG_RSTATE_PART3, "objects/lemt.png"+teamStr, "",
|
Gfx::ENG_RSTATE_PART3, "objects/lemt.png"+teamStr, "",
|
||||||
Gfx::EngineTextureMapping::ONE_Y,
|
Gfx::EngineTextureMapping::ONE_Y,
|
||||||
au, bu, 1.0f, 0.0f);
|
au, bu, 1.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue