diff options
Diffstat (limited to 'src/graphics')
-rw-r--r-- | src/graphics/engine/engine.cpp | 28 | ||||
-rw-r--r-- | src/graphics/engine/lightman.cpp | 10 | ||||
-rw-r--r-- | src/graphics/engine/lightman.h | 18 | ||||
-rw-r--r-- | src/graphics/engine/pyro.cpp | 31 | ||||
-rw-r--r-- | src/graphics/engine/pyro.h | 5 | ||||
-rw-r--r-- | src/graphics/engine/terrain.cpp | 19 | ||||
-rw-r--r-- | src/graphics/engine/terrain.h | 2 | ||||
-rw-r--r-- | src/graphics/engine/text.cpp | 23 | ||||
-rw-r--r-- | src/graphics/opengl/gldevice.cpp | 8 |
9 files changed, 101 insertions, 43 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 { diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index bbabdd6..9f64fab 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -606,7 +606,7 @@ Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &par } else if (params.format == TEX_IMG_AUTO) { - if (data->surface->format->Amask != 0) + if (data->surface->format->BytesPerPixel == 4) { if ((data->surface->format->Amask == 0xFF000000) && (data->surface->format->Rmask == 0x00FF0000) && @@ -630,7 +630,7 @@ Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &par convert = true; } } - else + else if (data->surface->format->BytesPerPixel == 3) { if ((data->surface->format->Rmask == 0xFF0000) && (data->surface->format->Gmask == 0x00FF00) && @@ -652,6 +652,10 @@ Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &par convert = true; } } + else { + GetLogger()->Error("Unknown data surface format"); + assert(false); + } } else assert(false); |