summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2012-12-28 13:23:49 +0100
committerPiotr Dziwinski <piotrdz@gmail.com>2012-12-28 13:23:49 +0100
commit2ebe1fbcb68957bf1d374ffc5dc818dd706c72a7 (patch)
treeaa1fa659b3c452e81411ef68463b2099f8e50436 /src
parent3582f107a5e77bc12fc61e4fd99c572a5985254b (diff)
downloadcolobot-2ebe1fbcb68957bf1d374ffc5dc818dd706c72a7.tar.gz
colobot-2ebe1fbcb68957bf1d374ffc5dc818dd706c72a7.tar.bz2
colobot-2ebe1fbcb68957bf1d374ffc5dc818dd706c72a7.zip
Fixed spider and worm model loading
Diffstat (limited to 'src')
-rw-r--r--src/graphics/engine/engine.cpp44
-rw-r--r--src/graphics/engine/engine.h6
-rw-r--r--src/object/motion/motionspider.cpp2
-rw-r--r--src/object/motion/motionworm.cpp2
4 files changed, 48 insertions, 6 deletions
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<int>( m_objects.size() ));
+ assert(objRank == -1 || (objRank >= 0 && objRank < static_cast<int>( 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<int>( m_objects.size() ));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>(m_baseObjects.size()));
min = m_baseObjects[baseObjRank].bboxMin;
@@ -782,6 +785,9 @@ int CEngine::GetObjectTotalTriangles(int objRank)
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return 0;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( 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<int>( m_objects.size() ));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return nullptr;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( 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<int>( m_objects.size() ));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return 0;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( 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<int>( m_objects.size() ));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>( 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<int>( 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<int>(m_objects.size()));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return false;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>(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<int>(m_baseObjects.size()));
EngineBaseObject& p1 = m_baseObjects[baseObjRank];
@@ -1777,6 +1801,9 @@ bool CEngine::IsVisible(int objRank)
assert(objRank >= 0 && objRank < static_cast<int>(m_objects.size()));
int baseObjRank = m_objects[objRank].baseObjRank;
+ if (baseObjRank == -1)
+ return false;
+
assert(baseObjRank >= 0 && baseObjRank < static_cast<int>(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<int>( 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<int>( 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<int>( 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<int>( 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<int>( 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);