From 2ebe1fbcb68957bf1d374ffc5dc818dd706c72a7 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Fri, 28 Dec 2012 13:23:49 +0100 Subject: Fixed spider and worm model loading --- src/graphics/engine/engine.cpp | 44 +++++++++++++++++++++++++++++++++++++- src/graphics/engine/engine.h | 6 +++--- src/object/motion/motionspider.cpp | 2 +- src/object/motion/motionworm.cpp | 2 +- 4 files changed, 48 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index ea0c093..f7e300e 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -703,7 +703,7 @@ void CEngine::DeleteObject(int objRank) void CEngine::SetObjectBaseRank(int objRank, int baseObjRank) { - assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); + assert(objRank == -1 || (objRank >= 0 && objRank < static_cast( m_objects.size() ))); m_objects[objRank].baseObjRank = baseObjRank; } @@ -770,6 +770,9 @@ void CEngine::GetObjectBBox(int objRank, Math::Vector& min, Math::Vector& max) assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return; + assert(baseObjRank >= 0 && baseObjRank < static_cast(m_baseObjects.size())); min = m_baseObjects[baseObjRank].bboxMin; @@ -782,6 +785,9 @@ int CEngine::GetObjectTotalTriangles(int objRank) assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return 0; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); return m_baseObjects[baseObjRank].totalTriangles; @@ -794,6 +800,9 @@ EngineBaseObjDataTier* CEngine::FindTriangles(int objRank, const Material& mater assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return nullptr; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -834,6 +843,9 @@ int CEngine::GetPartialTriangles(int objRank, float min, float max, float percen assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return 0; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -981,6 +993,9 @@ void CEngine::ChangeSecondTexture(int objRank, const std::string& tex2Name) assert(objRank >= 0 && objRank < static_cast( m_objects.size() )); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -1344,6 +1359,9 @@ bool CEngine::GetBBox2D(int objRank, Math::Point &min, Math::Point &max) max.y = -1000000.0f; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return false; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -1613,6 +1631,9 @@ bool CEngine::DetectBBox(int objRank, Math::Point mouse) assert(objRank >= 0 && objRank < static_cast(m_objects.size())); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return false; + assert(baseObjRank >= 0 && baseObjRank < static_cast(m_baseObjects.size())); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -1667,6 +1688,9 @@ int CEngine::DetectObject(Math::Point mouse) continue; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast(m_baseObjects.size())); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -1777,6 +1801,9 @@ bool CEngine::IsVisible(int objRank) assert(objRank >= 0 && objRank < static_cast(m_objects.size())); int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + return false; + assert(baseObjRank >= 0 && baseObjRank < static_cast(m_baseObjects.size())); float radius = m_baseObjects[baseObjRank].radius; @@ -2172,6 +2199,9 @@ bool CEngine::LoadAllTextures() terrain = true; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -2988,6 +3018,9 @@ void CEngine::Draw3DScene() continue; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -3051,6 +3084,9 @@ void CEngine::Draw3DScene() continue; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -3117,6 +3153,9 @@ void CEngine::Draw3DScene() continue; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; @@ -3267,6 +3306,9 @@ void CEngine::DrawInterface() continue; int baseObjRank = m_objects[objRank].baseObjRank; + if (baseObjRank == -1) + continue; + assert(baseObjRank >= 0 && baseObjRank < static_cast( m_baseObjects.size() )); EngineBaseObject& p1 = m_baseObjects[baseObjRank]; diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 899abc0..c9391db 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -621,9 +621,9 @@ struct EngineMouse * object equals to allocating space for EngineObject structure which holds object parameters. * * Object's geometric data is stored as a separate object -- base engine object. Each object - * must reference a valid base engine object. This many-to-one association allows to share - * same geometric data (e.g. from same model) across objects. Base engine objects are identified - * by unique rank obtained upon their creation. + * must reference a valid base engine object or an empty base engine object (with rank = -1). + * This many-to-one association allows to share same geometric data (e.g. from same model) + * across objects. * * Base engine object data is stored in a 4-tier tree which splits the data describing triangles. * diff --git a/src/object/motion/motionspider.cpp b/src/object/motion/motionspider.cpp index 66d89fb..3ede492 100644 --- a/src/object/motion/motionspider.cpp +++ b/src/object/motion/motionspider.cpp @@ -104,7 +104,7 @@ bool CMotionSpider::Create(Math::Vector pos, float angle, ObjectType type, rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object m_object->SetObjectRank(0, rank); - modelManager->AddModelReference("spider0.mod", false, rank); + // This is an "empty" object, without triangles m_object->SetPosition(0, pos); m_object->SetAngleY(0, angle); diff --git a/src/object/motion/motionworm.cpp b/src/object/motion/motionworm.cpp index b53b865..f32765d 100644 --- a/src/object/motion/motionworm.cpp +++ b/src/object/motion/motionworm.cpp @@ -92,7 +92,7 @@ bool CMotionWorm::Create(Math::Vector pos, float angle, ObjectType type, rank = m_engine->CreateObject(); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object m_object->SetObjectRank(0, rank); - modelManager->AddModelReference("worm0.mod", false, rank); // there is no purpose! + // This is an "empty" object, without triangles m_object->SetPosition(0, pos); m_object->SetAngleY(0, angle); -- cgit v1.2.3-1-g7c22