Skip to content

Commit b5f28dc

Browse files
committed
Possible approach for tile map rendering
1 parent 56721f9 commit b5f28dc

File tree

6 files changed

+114
-50
lines changed

6 files changed

+114
-50
lines changed

Source/Render/tilemap/TileMap.cpp

+33-12
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ cTileMap::cTileMap(cScene* pScene,TerraInterface* terra_) : cUnkObj(KIND_TILEMAP
179179
TexturePoolSize = 512;
180180

181181
tilesize.set(0,0,0);
182-
pTileMapRender=NULL;
183182

184183
ShadowDrawNode=pScene->CreateCamera();
185184
LightDrawNode=new cCameraPlanarLight(pScene);
@@ -199,7 +198,11 @@ cTileMap::~cTileMap()
199198
gb_RenderDevice->DeleteTilemap(this);
200199
if(Tile) { delete [] Tile; Tile=nullptr; }
201200
MTDONE(lock_update_rect);
202-
xassert(pTileMapRender == nullptr);
201+
202+
for (auto& p : pTileMapRender)
203+
{
204+
xassert(p == nullptr);
205+
}
203206
}
204207

205208
int cTileMap::CheckLightMapType()
@@ -313,18 +316,27 @@ void cTileMap::PreDraw(cCamera *DrawNode)
313316

314317
DrawNode->Attach(SCENENODE_OBJECT_TILEMAP,this);
315318

316-
cTileMapRender* render = GetTilemapRender();
317-
if (render) {
318-
render->PreDraw(DrawNode);
319-
}
319+
for (auto& render : pTileMapRender)
320+
{
321+
if (render) {
322+
render->PreDraw(DrawNode);
323+
}
324+
}
325+
326+
for (int y=0; y < GetTileNumber().y; y++) {
327+
for (int x = 0; x < GetTileNumber().x; x++) {
328+
auto& Tile = GetTile(x, y);
329+
Tile.ClearAttribute(ATTRTILE_UPDATELOD);
330+
}
331+
}
320332
}
321333

322334
void cTileMap::Draw(cCamera *DrawNode)
323335
{
324336
if(!Option_ShowType[SHOW_TILEMAP])
325337
return;
326338

327-
cTileMapRender* render = GetTilemapRender();
339+
cTileMapRender* render = GetTilemapRender(RenderType::DIRECT);
328340
if (!render) return;
329341

330342
if(DrawNode->GetAttribute(ATTRCAMERA_SHADOW))
@@ -334,14 +346,23 @@ void cTileMap::Draw(cCamera *DrawNode)
334346
else if(DrawNode->GetAttribute(ATTRCAMERA_SHADOWMAP))
335347
{
336348
if(Option_ShadowType==SHADOW_MAP_SELF) {
337-
render->DrawBump(DrawNode, ALPHA_TEST, TILEMAP_ALL, true);
349+
cTileMapRender* shadowRender = GetTilemapRender(RenderType::SHADOW);
350+
if (shadowRender)
351+
{
352+
shadowRender->DrawBump(DrawNode, ALPHA_TEST, TILEMAP_ALL, true);
353+
}
338354
}
339355
}
340356
else if(DrawNode->GetAttribute(ATTRCAMERA_REFLECTION))
341-
{ // рисовать отражение
342-
gb_RenderDevice->SetRenderState(RS_ALPHA_TEST_MODE, ALPHATEST_GT_254/*GetRefSurface()*/);
343-
render->DrawBump(DrawNode, ALPHA_TEST, TILEMAP_NOZEROPLAST, false);
344-
gb_RenderDevice->SetRenderState(RS_ALPHA_TEST_MODE, ALPHATEST_GT_0);
357+
{
358+
// рисовать отражение
359+
cTileMapRender* reflectionRender = GetTilemapRender(RenderType::REFLECTION);
360+
if (reflectionRender)
361+
{
362+
gb_RenderDevice->SetRenderState(RS_ALPHA_TEST_MODE, ALPHATEST_GT_254/*GetRefSurface()*/);
363+
reflectionRender->DrawBump(DrawNode, ALPHA_TEST, TILEMAP_NOZEROPLAST, false);
364+
gb_RenderDevice->SetRenderState(RS_ALPHA_TEST_MODE, ALPHATEST_GT_0);
365+
}
345366
}else
346367
{
347368
if(GetAttribute(ATTRUNKOBJ_REFLECTION)) {

Source/Render/tilemap/TileMap.h

+27-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef PERIMETER_TILEMAP_H
22
#define PERIMETER_TILEMAP_H
33

4+
#include <array>
5+
46
class cScene;
57

68
typedef std::vector<Vect2s> Vect2sVect;
@@ -30,12 +32,7 @@ struct sTile : public sAttribute
3032
zmin=255;zmax=0;
3133
}
3234

33-
inline int GetDraw() { return GetAttribute(ATTRTILE_DRAWLOD); }
3435
inline int GetUpdate() { return GetAttribute(ATTRTILE_UPDATELOD); }
35-
inline void SetDraw() { SetAttribute(ATTRTILE_DRAWLOD); }
36-
37-
inline void ClearDraw() { ClearAttribute(ATTRTILE_DRAWLOD); }
38-
inline void ClearUpdate() { ClearAttribute(ATTRTILE_UPDATELOD); }
3936
};
4037

4138
typedef std::vector<std::vector<Vect2s>* > CurrentRegion;
@@ -45,6 +42,18 @@ class cTileMapRender;
4542
class Column;
4643
class cTileMap : public cUnkObj
4744
{
45+
public:
46+
enum class RenderType
47+
{
48+
REFLECTION, SHADOW, DIRECT
49+
};
50+
static inline const std::array<RenderType, 3> RenderTypes{
51+
RenderType::REFLECTION,
52+
RenderType::SHADOW,
53+
RenderType::DIRECT
54+
};
55+
56+
private:
4857
friend class cScene;
4958

5059
sTile* Tile;
@@ -54,7 +63,7 @@ class cTileMap : public cUnkObj
5463

5564
Vect3d tilesize;
5665

57-
cTileMapRender* pTileMapRender = nullptr;
66+
std::array<cTileMapRender*, RenderTypes.size()> pTileMapRender{};
5867

5968
cCamera* ShadowDrawNode;
6069
cCamera* LightDrawNode;
@@ -119,11 +128,19 @@ class cTileMap : public cUnkObj
119128
zeroplast_color[player]=color;
120129
}
121130

122-
void SetTilemapRender(cTileMapRender* p) {
123-
VISASSERT(p == nullptr || pTileMapRender == nullptr);
124-
pTileMapRender=p;
131+
void SetTilemapRender(RenderType type, cTileMapRender* p)
132+
{
133+
const auto index = static_cast<size_t>(type);
134+
VISASSERT(index < pTileMapRender.size());
135+
VISASSERT(p == nullptr || pTileMapRender[index] == nullptr);
136+
pTileMapRender[index] = p;
125137
};
126-
cTileMapRender* GetTilemapRender(){return pTileMapRender;}
138+
cTileMapRender* GetTilemapRender(RenderType type)
139+
{
140+
const auto index = static_cast<size_t>(type);
141+
VISASSERT(index < pTileMapRender.size());
142+
return pTileMapRender[index];
143+
}
127144

128145
TerraInterface* GetTerra(){return terra;}
129146

Source/Render/tilemap/TileMapBumpTile.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ float sBumpTile::SetVertexZ(TerraInterface* terra,int x,int y)
1717
return zi;
1818
}
1919

20-
sBumpTile::sBumpTile(cTileMap* tilemap, cTilemapTexturePool* pool, int lod, int xpos, int ypos)
20+
sBumpTile::sBumpTile(cTileMap* tilemap, cTileMapRender* render, cTilemapTexturePool* pool, int lod, int xpos, int ypos)
2121
{
2222
this->tilemap = tilemap;
23-
cTileMapRender* render = tilemap->GetTilemapRender();
23+
this->render = render;
24+
2425
tile_pos.set(xpos,ypos);
2526
texPool = pool;
2627
texPage = texPool->allocPage();
@@ -45,7 +46,7 @@ sBumpTile::sBumpTile(cTileMap* tilemap, cTilemapTexturePool* pool, int lod, int
4546

4647
sBumpTile::~sBumpTile()
4748
{
48-
tilemap->GetTilemapRender()->GetVertexPool()->DeletePage(vtx);
49+
render->GetVertexPool()->DeletePage(vtx);
4950
texPool->freePage(texPage);
5051

5152
DeleteIndex();
@@ -55,7 +56,7 @@ void sBumpTile::DeleteIndex()
5556
{
5657
for (auto& i : index) {
5758
if (i.index.page >= 0) {
58-
tilemap->GetTilemapRender()->GetIndexPool()->DeletePage(i.index);
59+
render->GetIndexPool()->DeletePage(i.index);
5960
}
6061
}
6162
index.clear();
@@ -68,7 +69,7 @@ uint8_t* sBumpTile::LockTex(int& Pitch)
6869

6970
uint8_t *sBumpTile::LockVB()
7071
{
71-
return static_cast<uint8_t*>(tilemap->GetTilemapRender()->GetVertexPool()->LockPage(vtx));
72+
return static_cast<uint8_t*>(render->GetVertexPool()->LockPage(vtx));
7273
}
7374

7475
void sBumpTile::UnlockTex()
@@ -78,7 +79,7 @@ void sBumpTile::UnlockTex()
7879

7980
void sBumpTile::UnlockVB()
8081
{
81-
tilemap->GetTilemapRender()->GetVertexPool()->UnlockPage(vtx);
82+
render->GetVertexPool()->UnlockPage(vtx);
8283
}
8384

8485
inline int IUCLAMP(int val,int clamp)
@@ -127,7 +128,6 @@ void sBumpTile::CalcPoint()
127128
Column** columns = tilemap->GetColumn();
128129
Vect2i pos=tile_pos;
129130

130-
cTileMapRender* render = tilemap->GetTilemapRender();
131131
render->IncUpdate(this);
132132

133133
int tilenumber = tilemap->GetZeroplastNumber();

Source/Render/tilemap/TileMapBumpTile.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct sBumpTile
5151
int age, LOD;
5252

5353
class cTileMap *tilemap;
54+
cTileMapRender* render;
5455
class cTilemapTexturePool* texPool;
5556
int texPage = 0;
5657

@@ -70,7 +71,7 @@ struct sBumpTile
7071
protected:
7172
float vStart, vStep, uStart, uStep;
7273
public:
73-
sBumpTile(cTileMap* TileMap, cTilemapTexturePool* pool, int lod, int xpos, int ypos);
74+
sBumpTile(cTileMap* TileMap, cTileMapRender* render, cTilemapTexturePool* pool, int lod, int xpos, int ypos);
7475
~sBumpTile();
7576
uint8_t* LockTex(int& Pitch);
7677
uint8_t* LockVB();

Source/Render/tilemap/TileMapRender.cpp

+31-20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <array>
12
#include "StdAfxRD.h"
23
#include "PoolManager.h"
34
#include "TileMap.h"
@@ -12,20 +13,27 @@
1213

1314
int cInterfaceRenderDevice::CreateTilemap(cTileMap *TileMap)
1415
{
15-
cTileMapRender* p = new cTileMapRender(TileMap);
16-
TileMap->SetTilemapRender(p);
17-
p->RestoreTilemapPool();
16+
for (auto type : cTileMap::RenderTypes)
17+
{
18+
cTileMapRender* p = new cTileMapRender(TileMap);
19+
TileMap->SetTilemapRender(type, p);
20+
p->RestoreTilemapPool();
21+
}
22+
1823
return 0;
1924
}
2025

2126
int cInterfaceRenderDevice::DeleteTilemap(cTileMap *TileMap)
2227
{
23-
cTileMapRender* p = TileMap->GetTilemapRender();
28+
for (auto type : cTileMap::RenderTypes)
29+
{
30+
cTileMapRender* p = TileMap->GetTilemapRender(type);
2431

25-
if (p) {
26-
p->ClearTilemapPool();
27-
TileMap->SetTilemapRender(nullptr);
28-
delete p;
32+
if (p) {
33+
p->ClearTilemapPool();
34+
TileMap->SetTilemapRender(type, nullptr);
35+
delete p;
36+
}
2937
}
3038

3139
return true;
@@ -41,6 +49,8 @@ cTileMapRender::cTileMapRender(cTileMap *pTileMap)
4149
for(int i=0;i<dxy;i++)
4250
vis_lod[i]=-1;
4351

52+
renderTiles.resize(dxy);
53+
4454
update_stat=NULL;
4555
// update_stat=new char[dxy*TILEMAP_LOD];
4656
update_in_frame=false;
@@ -64,9 +74,8 @@ void cTileMapRender::ClearTilemapPool()
6474
{
6575
for (int y=0; y < tilemap->GetTileNumber().y; y++) {
6676
for (int x = 0; x < tilemap->GetTileNumber().x; x++) {
67-
sTile& Tile = tilemap->GetTile(x, y);
68-
int& bumpTileID = Tile.bumpTileID;
69-
bumpTileID = -1;
77+
auto& Tile = GetRenderTile(x, y);
78+
Tile.bumpTileID = -1;
7079
}
7180
}
7281

@@ -153,7 +162,7 @@ void cTileMapRender::PreDraw(cCamera* DrawNode)
153162
for(int y=0; y < tilemap->GetTileNumber().y; y++)
154163
for(int x=0; x < tilemap->GetTileNumber().x; x++)
155164
{
156-
sTile &Tile = tilemap->GetTile(x, y);
165+
sRenderTile &Tile = GetRenderTile(x, y);
157166
int &bumpTileID = Tile.bumpTileID;
158167
if(!Tile.GetAttribute(ATTRTILE_DRAWLOD))
159168
{
@@ -162,6 +171,10 @@ void cTileMapRender::PreDraw(cCamera* DrawNode)
162171
}
163172

164173
Tile.ClearAttribute(ATTRTILE_DRAWLOD);
174+
175+
if (tilemap->GetTile(x, y).GetAttribute(ATTRTILE_UPDATELOD)) {
176+
Tile.SetAttribute(ATTRTILE_UPDATELOD);
177+
}
165178
}
166179

167180
if(update_stat)
@@ -218,7 +231,7 @@ int cTileMapRender::bumpTileAlloc(int lod,int xpos,int ypos)
218231
int w = tilemap->GetTileSize().x >> bumpTexScale[lod];
219232
int h = tilemap->GetTileSize().y >> bumpTexScale[lod];
220233
cTilemapTexturePool* pool = FindFreeTexturePool(w, h);
221-
sBumpTile* tile = new sBumpTile(tilemap, pool, lod, xpos, ypos);
234+
sBumpTile* tile = new sBumpTile(tilemap, this, pool, lod, xpos, ypos);
222235
int i;
223236
for (i = 0; i < bumpTiles.size(); i++) {
224237
if (!bumpTiles[i]) {
@@ -310,7 +323,6 @@ void cTileMapRender::DrawBump(cCamera* DrawNode,eBlendMode MatMode,TILEMAP_DRAW
310323
cCamera* pShadowMapCamera=DrawNode->FindCildCamera(ATTRCAMERA_SHADOWMAP);
311324
int reflection = DrawNode->GetAttribute(ATTRCAMERA_REFLECTION);
312325
cCamera* pNormalCamera=DrawNode->GetRoot();
313-
cTileMapRender* render=tilemap->GetTilemapRender();
314326
bool use_shadow_map=false;
315327

316328
//TODO remove this once D3D9 specifics are removed
@@ -464,7 +476,7 @@ void cTileMapRender::DrawBump(cCamera* DrawNode,eBlendMode MatMode,TILEMAP_DRAW
464476
/**/
465477
{
466478
// process visible tile
467-
sTile &Tile = tilemap->GetTile(k, n);
479+
sRenderTile &Tile = GetRenderTile(k, n);
468480
int &bumpTileID = Tile.bumpTileID;
469481

470482
// calc LOD считается всегда по отгошению к прямой камере для
@@ -477,8 +489,7 @@ void cTileMapRender::DrawBump(cCamera* DrawNode,eBlendMode MatMode,TILEMAP_DRAW
477489
vis_lod[k+n*dk]=iLod;
478490

479491
// create/update render tile
480-
if (render->bumpTileValid(bumpTileID)
481-
&& render->bumpTiles[bumpTileID]->LOD != iLod && !shadow)
492+
if (bumpTileValid(bumpTileID) && bumpTiles[bumpTileID]->LOD != iLod && !shadow)
482493
{
483494
// LOD changed, free old tile and allocate new
484495
bumpTileFree(bumpTileID);
@@ -520,7 +531,7 @@ void cTileMapRender::DrawBump(cCamera* DrawNode,eBlendMode MatMode,TILEMAP_DRAW
520531
for (n = 0; n < dn; n++)
521532
for (k = 0; k < dk; k++)
522533
{
523-
sTile &Tile = tilemap->GetTile(k, n);
534+
sRenderTile &Tile = GetRenderTile(k, n);
524535
int bumpTileID = Tile.bumpTileID;
525536
if(bumpTileID<0)continue;
526537
sBumpTile *bumpTile = bumpTiles[bumpTileID];
@@ -607,8 +618,8 @@ void cTileMapRender::DrawBump(cCamera* DrawNode,eBlendMode MatMode,TILEMAP_DRAW
607618
int nTiles = 0;
608619
VertexBuffer* lastVB = nullptr;
609620
#endif
610-
VertexPoolManager* vtxPoolMan = render->GetVertexPool();
611-
IndexPoolManager* idxPoolMan = render->GetIndexPool();
621+
VertexPoolManager* vtxPoolMan = GetVertexPool();
622+
IndexPoolManager* idxPoolMan = GetIndexPool();
612623
for (cTilemapTexturePool* curpool : bumpTexPools) {
613624
if (curpool->tileRenderList.empty()) {
614625
continue;

Source/Render/tilemap/TileMapRender.h

+14
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,26 @@ class cTileMapRender
2424
char* update_stat;
2525
bool update_in_frame;
2626

27+
struct sRenderTile final : public sAttribute
28+
{
29+
int bumpTileID = -1;
30+
31+
inline int GetDraw() { return GetAttribute(ATTRTILE_DRAWLOD); }
32+
inline int GetUpdate() { return GetAttribute(ATTRTILE_UPDATELOD); }
33+
inline void SetDraw() { SetAttribute(ATTRTILE_DRAWLOD); }
34+
35+
inline void ClearDraw() { ClearAttribute(ATTRTILE_DRAWLOD); }
36+
inline void ClearUpdate() { ClearAttribute(ATTRTILE_UPDATELOD); }
37+
};
38+
std::vector<sRenderTile> renderTiles;
39+
2740
void SaveUpdateStat();
2841

2942
VectDelta* delta_buffer;
3043
std::vector<std::vector<sPolygon>> index_buffer;
3144

3245
cTilemapTexturePool* FindFreeTexturePool(int tex_width, int tex_height);
46+
sRenderTile& GetRenderTile(int i, int j) { return renderTiles[i + j*tilemap->GetTileNumber().x]; }
3347
public:
3448
void IncUpdate(sBumpTile* pbump);
3549

0 commit comments

Comments
 (0)