Index: ps/trunk/source/graphics/ModelAbstract.h =================================================================== --- ps/trunk/source/graphics/ModelAbstract.h +++ ps/trunk/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 @@ 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 Index: ps/trunk/source/graphics/ModelDummy.h =================================================================== --- ps/trunk/source/graphics/ModelDummy.h +++ ps/trunk/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 Index: ps/trunk/source/graphics/ObjectEntry.cpp =================================================================== --- ps/trunk/source/graphics/ObjectEntry.cpp +++ ps/trunk/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 @@ 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); Index: ps/trunk/source/renderer/Scene.cpp =================================================================== --- ps/trunk/source/renderer/Scene.cpp +++ ps/trunk/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 @@ { Submit(model->ToCModelParticleEmitter()->m_Emitter.get()); } + else if (model->ToCModelDummy()) + { + } else debug_warn(L"unknown model type"); }