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