diff --git a/source/graphics/ModelAbstract.h b/source/graphics/ModelAbstract.h
index 75519d9f1d..a1d4a5cdd0 100644
--- a/source/graphics/ModelAbstract.h
+++ b/source/graphics/ModelAbstract.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2019 Wildfire Games.
+/* Copyright (C) 2021 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -23,6 +23,7 @@
#include "maths/BoundingBoxOriented.h"
#include "simulation2/helpers/Player.h"
+class CModelDummy;
class CModel;
class CModelDecal;
class CModelParticleEmitter;
@@ -73,13 +74,16 @@ public:
virtual CModelAbstract* Clone() const = 0;
/// Dynamic cast
- virtual CModel* ToCModel() { return NULL; }
+ virtual CModelDummy* ToCModelDummy() { return nullptr; }
/// Dynamic cast
- virtual CModelDecal* ToCModelDecal() { return NULL; }
+ virtual CModel* ToCModel() { return nullptr; }
/// Dynamic cast
- virtual CModelParticleEmitter* ToCModelParticleEmitter() { return NULL; }
+ virtual CModelDecal* ToCModelDecal() { return nullptr; }
+
+ /// Dynamic cast
+ virtual CModelParticleEmitter* ToCModelParticleEmitter() { return nullptr; }
// (This dynamic casting is a bit ugly, but we won't have many subclasses
// and this seems the easiest way to integrate with other code that wants
diff --git a/source/graphics/ModelDummy.h b/source/graphics/ModelDummy.h
new file mode 100644
index 0000000000..e39cce468a
--- /dev/null
+++ b/source/graphics/ModelDummy.h
@@ -0,0 +1,45 @@
+/* Copyright (C) 2021 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+#ifndef INCLUDED_MODELDUMMY
+#define INCLUDED_MODELDUMMY
+
+#include "graphics/ModelAbstract.h"
+
+/**
+ * Empty placeholder ModelAbstract implementation, to render nothing.
+ */
+class CModelDummy final : public CModelAbstract
+{
+ NONCOPYABLE(CModelDummy);
+
+public:
+
+ CModelDummy() = default;
+ virtual ~CModelDummy() = default;
+
+ virtual CModelAbstract* Clone() const { return new CModelDummy(); }
+ virtual CModelDummy* ToCModelDummy() { return this; }
+
+ virtual void CalcBounds() {};
+ virtual void SetDirtyRec(int) {};
+ virtual void SetTerrainDirty(ssize_t, ssize_t, ssize_t, ssize_t) {}
+ virtual void ValidatePosition() {};
+ virtual void InvalidatePosition() {};
+};
+
+#endif // INCLUDED_MODELDUMMY
diff --git a/source/graphics/ObjectEntry.cpp b/source/graphics/ObjectEntry.cpp
index c241e08299..dc5efa2425 100644
--- a/source/graphics/ObjectEntry.cpp
+++ b/source/graphics/ObjectEntry.cpp
@@ -25,6 +25,7 @@
#include "graphics/MeshManager.h"
#include "graphics/Model.h"
#include "graphics/ModelDef.h"
+#include "graphics/ModelDummy.h"
#include "graphics/ObjectBase.h"
#include "graphics/ObjectManager.h"
#include "graphics/ParticleManager.h"
@@ -77,6 +78,12 @@ bool CObjectEntry::BuildVariation(const std::vector*>& comp
m_Color = CColor(r/255.0f, g/255.0f, b/255.0f, 1.0f);
}
+ if (variation.model.empty())
+ {
+ m_Model = new CModelDummy();
+ return true;
+ }
+
if (variation.decal.m_SizeX && variation.decal.m_SizeZ)
{
CMaterial material = g_Renderer.GetMaterialManager().LoadMaterial(m_Base->m_Material);
diff --git a/source/renderer/Scene.cpp b/source/renderer/Scene.cpp
index a499b03f1d..34a0230b81 100644
--- a/source/renderer/Scene.cpp
+++ b/source/renderer/Scene.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011 Wildfire Games.
+/* Copyright (C) 2021 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -55,6 +55,9 @@ void SceneCollector::SubmitRecursive(CModelAbstract* model)
{
Submit(model->ToCModelParticleEmitter()->m_Emitter.get());
}
+ else if (model->ToCModelDummy())
+ {
+ }
else
debug_warn(L"unknown model type");
}