summaryrefslogtreecommitdiffstats
path: root/src/graphics/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/engine')
-rw-r--r--src/graphics/engine/engine.cpp28
-rw-r--r--src/graphics/engine/lightman.cpp10
-rw-r--r--src/graphics/engine/lightman.h18
-rw-r--r--src/graphics/engine/pyro.cpp31
-rw-r--r--src/graphics/engine/pyro.h5
-rw-r--r--src/graphics/engine/terrain.cpp19
-rw-r--r--src/graphics/engine/terrain.h2
-rw-r--r--src/graphics/engine/text.cpp23
8 files changed, 95 insertions, 41 deletions
diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index 669ea42..5cf7b23 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -276,7 +276,7 @@ bool CEngine::Create()
Math::LoadOrthoProjectionMatrix(m_matProjInterface, 0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
TextureCreateParams params;
- params.format = TEX_IMG_RGB;
+ params.format = TEX_IMG_AUTO;
params.minFilter = TEX_MIN_FILTER_NEAREST;
params.magFilter = TEX_MAG_FILTER_NEAREST;
params.mipmap = false;
@@ -600,6 +600,31 @@ void CEngine::DeleteBaseObject(int baseObjRank)
void CEngine::DeleteAllBaseObjects()
{
+ for (int baseObjRank = 0; baseObjRank < static_cast<int>( m_baseObjects.size() ); baseObjRank++)
+ {
+ EngineBaseObject& p1 = m_baseObjects[baseObjRank];
+ if (! p1.used)
+ continue;
+
+ for (int l2 = 0; l2 < static_cast<int>( p1.next.size() ); l2++)
+ {
+ EngineBaseObjTexTier& p2 = p1.next[l2];
+
+ for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
+ {
+ EngineBaseObjLODTier& p3 = p2.next[l3];
+
+ for (int l4 = 0; l4 < static_cast<int>( p3.next.size() ); l4++)
+ {
+ EngineBaseObjDataTier& p4 = p3.next[l4];
+
+ m_device->DestroyStaticBuffer(p4.staticBufferId);
+ p4.staticBufferId = 0;
+ }
+ }
+ }
+ }
+
m_baseObjects.clear();
}
@@ -817,6 +842,7 @@ int CEngine::CreateObject()
m_objects[objRank].drawWorld = true;
m_objects[objRank].distance = 0.0f;
+ m_objects[objRank].baseObjRank = -1;
m_objects[objRank].shadowRank = -1;
return objRank;
diff --git a/src/graphics/engine/lightman.cpp b/src/graphics/engine/lightman.cpp
index 8694c7a..564cced 100644
--- a/src/graphics/engine/lightman.cpp
+++ b/src/graphics/engine/lightman.cpp
@@ -69,16 +69,6 @@ void LightProgression::SetTarget(float value)
}
-DynamicLight::DynamicLight()
-{
- rank = 0;
- used = enabled = false;
- priority = LIGHT_PRI_LOW;
- includeType = excludeType = ENG_OBJTYPE_NULL;
-}
-
-
-
CLightManager::CLightManager(CEngine* engine)
{
m_device = nullptr;
diff --git a/src/graphics/engine/lightman.h b/src/graphics/engine/lightman.h
index a2f6044..5df466d 100644
--- a/src/graphics/engine/lightman.h
+++ b/src/graphics/engine/lightman.h
@@ -51,9 +51,12 @@ struct LightProgression
float speed;
LightProgression()
- {
- starting = ending = current = progress = speed = 0.0f;
- }
+ : starting(0.0f)
+ , ending(0.0f)
+ , current(0.0f)
+ , progress(0.0f)
+ , speed(0.0f)
+ {}
//! Initializes the progression
void Init(float value);
@@ -113,7 +116,14 @@ struct DynamicLight
//! Type of objects excluded from lighting with this light; if ENG_OBJTYPE_NULL is used, it is ignored
EngineObjectType excludeType;
- DynamicLight();
+ DynamicLight()
+ : rank(0)
+ , used(false)
+ , enabled(false)
+ , priority(LIGHT_PRI_LOW)
+ , includeType(ENG_OBJTYPE_NULL)
+ , excludeType(ENG_OBJTYPE_NULL)
+ {}
};
/**
diff --git a/src/graphics/engine/pyro.cpp b/src/graphics/engine/pyro.cpp
index 7c51829..d3e0405 100644
--- a/src/graphics/engine/pyro.cpp
+++ b/src/graphics/engine/pyro.cpp
@@ -32,8 +32,6 @@
#include "object/robotmain.h"
#include "object/motion/motionhuman.h"
-#include "ui/displaytext.h"
-
// Graphics module namespace
namespace Gfx {
@@ -49,7 +47,6 @@ CPyro::CPyro()
m_camera = m_main->GetCamera();
m_particle = m_engine->GetParticle();
m_lightMan = m_engine->GetLightManager();
- m_displayText = m_main->GetDisplayText();
m_sound = CApplication::GetInstancePointer()->GetSound();
m_object = nullptr;
@@ -1301,13 +1298,13 @@ void CPyro::DisplayError(PyroType type, CObject* obj)
oType == OBJECT_END )
{
err = ERR_DELETEBUILDING;
- m_displayText->DisplayError(err, obj->GetPosition(0), 5.0f);
+ m_main->DisplayError(err, obj->GetPosition(0), 5.0f);
return;
}
if ( err != ERR_OK )
{
- m_displayText->DisplayError(err, obj);
+ m_main->DisplayError(err, obj);
}
}
}
@@ -1556,15 +1553,18 @@ void CPyro::ExploStart()
for (int i = 0; i < OBJECTMAXPART; i++)
{
int objRank = m_object->GetObjectRank(i);
- if (objRank == -1) continue;
+ if (objRank == -1) continue;
// TODO: refactor later to material change
int oldBaseObjRank = m_engine->GetObjectBaseRank(objRank);
- int newBaseObjRank = m_engine->CreateBaseObject();
- m_engine->CopyBaseObject(oldBaseObjRank, newBaseObjRank);
- m_engine->SetObjectBaseRank(objRank, newBaseObjRank);
+ if (oldBaseObjRank != -1)
+ {
+ int newBaseObjRank = m_engine->CreateBaseObject();
+ m_engine->CopyBaseObject(oldBaseObjRank, newBaseObjRank);
+ m_engine->SetObjectBaseRank(objRank, newBaseObjRank);
- m_engine->ChangeSecondTexture(objRank, "dirty04.png");
+ m_engine->ChangeSecondTexture(objRank, "dirty04.png");
+ }
Math::Vector pos = m_object->GetPosition(i);
@@ -1628,11 +1628,14 @@ void CPyro::BurnStart()
// TODO: refactor later to material change
int oldBaseObjRank = m_engine->GetObjectBaseRank(objRank);
- int newBaseObjRank = m_engine->CreateBaseObject();
- m_engine->CopyBaseObject(oldBaseObjRank, newBaseObjRank);
- m_engine->SetObjectBaseRank(objRank, newBaseObjRank);
+ if (oldBaseObjRank != -1)
+ {
+ int newBaseObjRank = m_engine->CreateBaseObject();
+ m_engine->CopyBaseObject(oldBaseObjRank, newBaseObjRank);
+ m_engine->SetObjectBaseRank(objRank, newBaseObjRank);
- m_engine->ChangeSecondTexture(objRank, "dirty04.png");
+ m_engine->ChangeSecondTexture(objRank, "dirty04.png");
+ }
}
m_engine->LoadTexture("dirty04.png");
diff --git a/src/graphics/engine/pyro.h b/src/graphics/engine/pyro.h
index 98b9a1b..60724b4 100644
--- a/src/graphics/engine/pyro.h
+++ b/src/graphics/engine/pyro.h
@@ -35,10 +35,6 @@ class CObject;
class CRobotMain;
class CSoundInterface;
-namespace Ui {
-class CDisplayText;
-}
-
// Graphics module namespace
namespace Gfx {
@@ -179,7 +175,6 @@ protected:
CParticle* m_particle;
CLightManager* m_lightMan;
CObject* m_object;
- Ui::CDisplayText* m_displayText;
CRobotMain* m_main;
CSoundInterface* m_sound;
diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp
index 4fe3057..4b5384e 100644
--- a/src/graphics/engine/terrain.cpp
+++ b/src/graphics/engine/terrain.cpp
@@ -90,7 +90,7 @@ bool CTerrain::Generate(int mosaicCount, int brickCountPow2, float brickSize,
std::vector<int>(dim).swap(m_textures);
dim = m_mosaicCount*m_mosaicCount;
- std::vector<int>(dim).swap(m_objRanks);
+ std::vector<int>(dim, -1).swap(m_objRanks);
return true;
}
@@ -258,6 +258,23 @@ TerrainRes CTerrain::GetResource(const Math::Vector &p)
void CTerrain::FlushRelief()
{
m_relief.clear();
+ m_resources.clear();
+ m_textures.clear();
+
+ for (int objRank : m_objRanks)
+ {
+ if (objRank == -1)
+ continue;
+
+ int baseObjRank = m_engine->GetObjectBaseRank(objRank);
+
+ if (baseObjRank != -1)
+ m_engine->DeleteBaseObject(baseObjRank);
+
+ m_engine->DeleteObject(objRank);
+ }
+
+ m_objRanks.clear();
}
/**
diff --git a/src/graphics/engine/terrain.h b/src/graphics/engine/terrain.h
index e2317c4..e618691 100644
--- a/src/graphics/engine/terrain.h
+++ b/src/graphics/engine/terrain.h
@@ -239,7 +239,7 @@ public:
//! Generates a level in the terrain
bool GenerateMaterials(int *id, float min, float max, float slope, float freq, Math::Vector center, float radius);
- //! Clears the relief data to zero
+ //! Clears the relief, resources and all other associated data
void FlushRelief();
//! Load relief from image
bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder);
diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp
index 610bfcf..ffd2eb2 100644
--- a/src/graphics/engine/text.cpp
+++ b/src/graphics/engine/text.cpp
@@ -140,6 +140,12 @@ void CText::FlushCache()
for (auto jt = mf->fonts.begin(); jt != mf->fonts.end(); ++jt)
{
CachedFont *f = (*jt).second;
+ for (auto ct = f->cache.begin(); ct != f->cache.end(); ++ct)
+ {
+ Texture tex;
+ tex.id = (*ct).second.id;
+ m_device->DestroyTexture(tex);
+ }
f->cache.clear();
}
}
@@ -358,14 +364,22 @@ float CText::GetCharWidth(UTF8Char ch, FontType font, float size, float offset)
CachedFont* cf = GetOrOpenFont(font, size);
assert(cf != nullptr);
- CharTexture tex;
+ Math::Point charSize;
auto it = cf->cache.find(ch);
if (it != cf->cache.end())
- tex = (*it).second;
+ {
+ charSize = (*it).second.charSize;
+ }
else
- tex = CreateCharTexture(ch, cf);
+ {
+ Math::IntPoint wndSize;
+ std::string text;
+ text.append({ch.c1, ch.c2, ch.c3});
+ TTF_SizeUTF8(cf->font, text.c_str(), &wndSize.x, &wndSize.y);
+ charSize = m_engine->WindowToInterfaceSize(wndSize);
+ }
- return tex.charSize.x * width;
+ return charSize.x * width;
}
@@ -896,7 +910,6 @@ CharTexture CText::CreateCharTexture(UTF8Char ch, CachedFont* font)
if (! tex.Valid())
{
m_error = "Texture create error";
- return texture;
}
else
{