1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ 2 3 #ifndef WORLDOBJECT_MODEL_RENDERER_HDR 4 #define WORLDOBJECT_MODEL_RENDERER_HDR 5 6 #define MDL_TYPE(o) (o->model->type) 7 #define TEX_TYPE(o) (o->model->textureType) 8 9 #include <map> 10 #include <set> 11 12 #include "Rendering/Models/3DModel.h" 13 14 class CUnit; 15 class CFeature; 16 class CProjectile; 17 18 class IWorldObjectModelRenderer { 19 public: 20 static IWorldObjectModelRenderer* GetInstance(int); 21 IWorldObjectModelRenderer(int mdlType)22 IWorldObjectModelRenderer(int mdlType): modelType(mdlType) { 23 numUnits = 0; 24 numFeatures = 0; 25 numFeaturesSave = 0; 26 numProjectiles = 0; 27 } 28 virtual ~IWorldObjectModelRenderer(); 29 30 virtual void Draw(); PushRenderState()31 virtual void PushRenderState() {} PopRenderState()32 virtual void PopRenderState() {} 33 34 virtual void AddUnit(const CUnit*); 35 virtual void DelUnit(const CUnit*); 36 virtual void AddFeature(const CFeature*, float alpha = 0.99f); 37 virtual void DelFeature(const CFeature*); 38 virtual void SwapFeatures(); 39 virtual void AddProjectile(const CProjectile*); 40 virtual void DelProjectile(const CProjectile*); 41 GetNumUnits()42 int GetNumUnits() const { return numUnits; } GetNumFeatures()43 int GetNumFeatures() const { return numFeatures; } GetNumProjectiles()44 int GetNumProjectiles() const { return numProjectiles; } 45 46 protected: 47 typedef std::set<CUnit*> UnitSet; 48 typedef std::set<CUnit*>::const_iterator UnitSetIt; 49 typedef std::map<CFeature*, float> FeatureSet; 50 typedef std::map<CFeature*, float>::const_iterator FeatureSetIt; 51 typedef std::set<CProjectile*> ProjectileSet; 52 typedef std::set<CProjectile*>::const_iterator ProjectileSetIt; 53 54 // textureType ==> modelSet 55 typedef std::map<int, UnitSet> UnitRenderBin; 56 typedef std::map<int, UnitSet>::const_iterator UnitRenderBinIt; 57 typedef std::map<int, FeatureSet> FeatureRenderBin; 58 typedef std::map<int, FeatureSet>::const_iterator FeatureRenderBinIt; 59 typedef std::map<int, ProjectileSet> ProjectileRenderBin; 60 typedef std::map<int, ProjectileSet>::const_iterator ProjectileRenderBinIt; 61 62 virtual void DrawModels(const UnitSet&); 63 virtual void DrawModels(const FeatureSet&); 64 virtual void DrawModels(const ProjectileSet&); DrawModel(const CUnit *)65 virtual void DrawModel(const CUnit*) {} DrawModel(const CFeature *)66 virtual void DrawModel(const CFeature*) {} DrawModel(const CProjectile *)67 virtual void DrawModel(const CProjectile*) {} 68 69 UnitRenderBin units; // all opaque or all cloaked 70 FeatureRenderBin features; // opaque only, culled via GridVisibility() 71 FeatureRenderBin featuresSave; // opaque only, culled via GridVisibility() 72 ProjectileRenderBin projectiles; // opaque only, (synced && (piece || weapon)) only 73 74 int modelType; 75 76 int numUnits; 77 int numFeatures; 78 int numFeaturesSave; 79 int numProjectiles; 80 81 public: GetUnitSet(int texType)82 const UnitSet& GetUnitSet(int texType) { return units[texType]; } GetFeatureSet(int texType)83 const FeatureSet& GetFeatureSet(int texType) { return features[texType]; } GetProjectileSet(int texType)84 const ProjectileSet& GetProjectileSet(int texType) { return projectiles[texType]; } 85 GetUnitBin()86 const UnitRenderBin& GetUnitBin() const { return units; } GetFeatureBin()87 const FeatureRenderBin& GetFeatureBin() const { return features; } GetProjectileBin()88 const ProjectileRenderBin& GetProjectileBin() const { return projectiles; } 89 GetUnitBinMutable()90 UnitRenderBin& GetUnitBinMutable() { return units; } GetFeatureBinMutable()91 FeatureRenderBin& GetFeatureBinMutable() { return features; } GetProjectileBinMutable()92 ProjectileRenderBin& GetProjectileBinMutable() { return projectiles; } 93 }; 94 95 class WorldObjectModelRenderer3DO: public IWorldObjectModelRenderer { 96 public: WorldObjectModelRenderer3DO()97 WorldObjectModelRenderer3DO(): IWorldObjectModelRenderer(MODELTYPE_3DO) {} 98 void PushRenderState(); 99 void PopRenderState(); 100 }; 101 102 class WorldObjectModelRendererS3O: public IWorldObjectModelRenderer { 103 public: WorldObjectModelRendererS3O()104 WorldObjectModelRendererS3O(): IWorldObjectModelRenderer(MODELTYPE_S3O) {} 105 void PushRenderState(); 106 void PopRenderState(); 107 108 void DrawModel(const CUnit*); 109 void DrawModel(const CFeature*); 110 void DrawModel(const CProjectile*); 111 }; 112 113 class WorldObjectModelRendererOBJ: public IWorldObjectModelRenderer { 114 public: WorldObjectModelRendererOBJ()115 WorldObjectModelRendererOBJ(): IWorldObjectModelRenderer(MODELTYPE_OBJ) {} 116 void PushRenderState(); 117 void PopRenderState(); 118 }; 119 120 class WorldObjectModelRendererASS: public IWorldObjectModelRenderer { 121 public: WorldObjectModelRendererASS()122 WorldObjectModelRendererASS(): IWorldObjectModelRenderer(MODELTYPE_ASS) {} 123 void PushRenderState(); 124 void PopRenderState(); 125 }; 126 127 #endif 128