2 #ifndef WORLDSIM_WORLD_VIEWER_HPP 3 #define WORLDSIM_WORLD_VIEWER_HPP 36 #include <Device/Display/DisplayInterface.hpp> 37 #include <Device/Mouse/MouseInterface.hpp> 38 #include <Graphics/Render/Renderer.hpp> 39 #include <Game/WorldGenerator/Biome.hpp> 47 class WorldViewer:
public DisplayInterface,
public MouseInterface
53 int mainViewX1, mainViewX2, mainViewY1, mainViewY2;
54 int mainViewNX, mainViewNY;
56 double localTileMantissa;
60 ArrayS2 <Vector <Texture* > > aScene;
123 centerTileX=0; centerTileY=0;
125 mainViewX1=0; mainViewX2=0;
126 mainViewY1=0; mainViewY2=0;
127 mainViewNX=0; mainViewNY=0;
145 showHoveredTile=
false;
157 territoryView =
false;
160 subterraneanMode =
false;
165 rainManager.
init(0,0,0,0,0);
174 centerTileX = world->
nX/2;
175 centerTileY = world->
nY/2;
186 if(_keyboard->isPressed(Keyboard::EQUALS) || _keyboard->isPressed(Keyboard::PLUS))
188 if (_keyboard->keyWasPressed)
194 if(_keyboard->isPressed(Keyboard::MINUS))
196 if (_keyboard->keyWasPressed)
207 if ( tilesToSkip > 0 )
213 { tileSize=2000000; }
236 worldLocal=_worldLocal;
243 if ( centerTileX < 0 )
247 if ( centerTileY < 0 )
251 if ( centerTileX > world->
nX )
253 centerTileX = world->
nX;
255 if ( centerTileY > world->
nY )
257 centerTileY = world->
nY;
263 if ( world==0 ) {
return false; }
272 centerTileX+=(panX-mouse->x)/((
float)tileSize/(tilesToSkip+1));
273 centerTileY+=(panY-mouse->y)/((
float)tileSize/(tilesToSkip+1));
278 if(mouse->isMiddleClick==
false)
282 if ( mouse->isMiddleClick)
290 if(mouse->isWheelDown)
293 mouse->isWheelDown=
false;
298 mouse->isWheelUp=
false;
303 if ( mouse->isLeftClick ==
true )
305 world->
queryTile(hoveredXTile,hoveredYTile);
309 if (mouse->isRightClick)
318 void setPanel(
const int _x1,
const int _y1,
const int _x2,
const int _y2)
326 mainViewNX = mainViewX2-mainViewX1;
327 mainViewNY = mainViewY2-mainViewY1;
331 rainManager.
init(_x1,_y1,_x2,_y2,world);
334 inline void setCenterTile (
const double _centerTileX,
const double _centerTileY,
337 centerTileX = _centerTileX;
338 centerTileY = _centerTileY;
340 centerTileX += (_subTileX * localTileMantissa)+localTileMantissa/2;
341 centerTileY += (_subTileY * localTileMantissa)+localTileMantissa/2;
345 void toScreenCoords(
const int _tileX,
const int _tileY,
int * _pixelX,
int * _pixelY)
347 float centerTileXDecimal = centerTileX - (int)centerTileX;
348 float centerTileYDecimal = centerTileY - (int)centerTileY;
350 float centerTileXPixels = centerTileXDecimal*
tileSize;
351 float centerTileYPixels = centerTileYDecimal*
tileSize;
360 const int tilesToDrawX = (mainViewNX/
tileSize) + 1;
361 const int tilesToDrawY = (mainViewNY/
tileSize) + 1;
364 int pixelTileX = mainViewX1+(mainViewNX/2) - centerTileXPixels;
365 while(pixelTileX>=mainViewX1)
371 const int revertTileX = tileX;
374 int pixelTileY = mainViewY1 + (mainViewNY/2) - centerTileYPixels;
383 int nExtraXTiles = _tileX - tileX;
384 int nExtraYTiles = _tileY - tileY;
386 if ( nExtraXTiles>=0 && nExtraYTiles>=0 )
388 *_pixelX = pixelTileX + (tileSize * nExtraXTiles);
389 *_pixelY = pixelTileY + (tileSize * nExtraYTiles);
400 void toTileCoords(
int pixelX,
int pixelY,
unsigned long int * absX,
unsigned long int * absY)
402 if (absX==0 || absY==0) {
return;}
404 if (pixelX<0 || pixelY<0 || pixelsPerLocalTile == 0)
413 if ( pixelDistanceX < 0 || pixelDistanceY < 0 )
420 *absX = firstTileAbsX + ((double)pixelDistanceX/pixelsPerLocalTile);
421 *absY = firstTileAbsY + ((double)pixelDistanceY/pixelsPerLocalTile);
432 std::cout<<
"ABORT: No world to render.\n";
437 Renderer::saveViewPort();
438 Renderer::resizeViewPort(mainViewX1,mainViewY1,mainViewX2,mainViewY2);
443 float centerTileXDecimal = centerTileX - (int)centerTileX;
444 float centerTileYDecimal = centerTileY - (int)centerTileY;
446 float pixelOffsetX = tileSize*centerTileXDecimal;
447 float pixelOffsetY = tileSize*centerTileYDecimal;
451 const int tilesToDrawX = (mainViewNX/
tileSize) + 1;
452 const int tilesToDrawY = (mainViewNY/
tileSize) + 1;
455 int pixelTile = mainViewNX/2;
463 const int revertTileX = tileX;
466 pixelTile = mainViewNY/2;
473 Renderer::setTextureMode();
483 if ( tileSize > 4 && world->
isSafe(tileX,tileY) )
496 if ( wog == 0 ) {
continue; }
504 if ( wogPixelX != -1000 && wogPixelY != -1000 )
506 Renderer::placeTexture4(wogPixelX,wogPixelY,wogPixelX+tileSize,wogPixelY+tileSize
507 ,wog->currentTexture(),
false);
511 Renderer::restoreViewPort();
525 if (active ==
false || world==0)
530 if ( centerTileX < 10 && demoScroll < 0 )
532 demoScroll = demoScroll * -1;
534 else if ( centerTileX > world->
nX - 10 && demoScroll > 0 )
536 demoScroll = demoScroll * -1;
547 Renderer::saveViewPort();
548 Renderer::resizeViewPort(mainViewX1,mainViewY1,mainViewX2,mainViewY2);
555 float centerTileXDecimal = centerTileX - (int)centerTileX;
556 float centerTileYDecimal = centerTileY - (int)centerTileY;
557 float centerTileXPixels = centerTileXDecimal*
tileSize;
558 float centerTileYPixels = centerTileYDecimal*
tileSize;
562 const int tilesToDrawX = (mainViewNX/
tileSize) + 1;
563 const int tilesToDrawY = (mainViewNY/
tileSize) + 1;
566 int pixelTileX = mainViewX1+(mainViewNX/2) - centerTileXPixels;
567 while(pixelTileX>=mainViewX1)
573 const int revertTileX = tileX;
576 int pixelTileY = mainViewY1 + (mainViewNY/2) - centerTileYPixels;
586 if (world->
isSafe(tileX,tileY))
596 firstPixelX=pixelTileX;
597 firstPixelY=pixelTileY;
601 if (lastMouseX >= mainViewX1 && lastMouseX <= mainViewX2
602 && lastMouseY >= mainViewY1 && lastMouseY <= mainViewY2 )
604 const int startingPX = pixelTileX;
605 const int startingPY = pixelTileY;
607 int diffX = (lastMouseX - startingPX)/tileSize;
608 int diffY = (lastMouseY - startingPY)/tileSize;
611 hoveredXTile = tileX + diffX;
612 hoveredYTile = tileY + diffY;
620 if ( tilesetMode ==
false )
628 if(subterraneanMode==
false)
633 Renderer::restoreViewPort();
643 float currentSubY = currentY;
647 if (subTileSize < 1) { subTileSize = 1; }
649 const enumBiome localBaseBiome = localMap->
baseBiome;
655 if ( nextSubY>=mainViewY1 && currentSubY <= mainViewY2 && floor(currentSubY) != floor(nextSubY) )
657 float currentPixel = currentX;
661 if ( nextPixel>=mainViewX1 && currentPixel <= mainViewX2 && floor(currentPixel) != floor(nextPixel) )
673 glColor4ub(255,255,255,255);
690 for (
int i=0;i<vText->size();++i)
692 Renderer::placeTexture4(currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
704 for (
int i=0;i<vText->size();++i)
706 Renderer::placeTexture4(currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
710 for(
int i=0;i<localMap->
dataSubterranean->aSubterranean(localXTile,localYTile).vObject.size();++i)
712 Renderer::placeTexture4(currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
714 (localXTile,localYTile).vObject(i)->currentTexture(),
false);
733 LocalTile* localTile = &localMap->
data->aLocalTile(localXTile,localYTile);
735 unsigned char lightValue = 80;
736 glColor3ub(lightValue,lightValue,lightValue);
742 for (
int i=0;i<vText->size();++i)
744 Renderer::placeTexture4(currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
750 glColor3ub(255,255,255);
755 LocalTile* localTile = &localMap->
data->aLocalTile(localXTile,localYTile);
767 unsigned char lightValue = localTile->
height+127;
768 if ( lightValue < 127 ) { lightValue += 127; }
772 int sunsetCounter = currentSecond-50;
778 glColor3ub(lightValue,lightValue,lightValue);
780 if (currentHour < 6 || currentHour > 19)
785 else if (currentHour == 6)
789 else if (currentHour == 19)
809 for (
int i=0;i<vText->size();++i)
811 Renderer::placeTexture4
812 (currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY), (*vText)(i),
false);
817 glColor3ub(255,255,255);
822 if (localTile->
bWall != 0 )
824 if ( (localTile->
bWall & 0b10001000) == 0b10001000)
826 Renderer::placeTexture4RotatedDegrees
827 (currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
830 if ( (localTile->
bWall & 0b00010001) == 0b00010001)
832 Renderer::placeTexture4RotatedDegrees
833 (currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
836 if ( (localTile->
bWall & 0b01000100) == 0b01000100)
838 Renderer::placeTexture4RotatedDegrees
839 (currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
842 if ( (localTile->
bWall & 0b00100010) == 0b00100010)
844 Renderer::placeTexture4
845 (currentPixel, currentSubY, ceil(nextPixel), ceil(nextSubY),
875 if ( lastMouseX > currentPixel && lastMouseX < ceil(nextPixel) && lastMouseY > currentSubY && lastMouseY < ceil(nextSubY) )
877 hoveredXTileLocal = localXTile;
878 hoveredAbsoluteX = hoveredXTile * LOCAL_MAP_SIZE + localXTile;
879 hoveredYTileLocal = localYTile;
880 hoveredAbsoluteY = hoveredYTile * LOCAL_MAP_SIZE + localYTile;
882 if ( showHoveredTile )
885 Renderer::placeBorder4(255,0,0,currentPixel, currentSubY, ceil(nextPixel)-1, ceil(nextSubY)-1);
886 Renderer::setTextureMode();
890 currentPixel=nextPixel;
894 currentSubY=nextSubY;
902 Renderer::setTextureMode();
903 const int revertTileX = tileX;
905 for (
int currentY = pixelTileY; currentY<mainViewNY; currentY+=
tileSize)
908 glColor3ub(255,255,255);
910 for (
int currentX = pixelTileX; currentX<mainViewNX+
tileSize; currentX+=
tileSize)
912 if (world->
isSafe(tileX,tileY))
917 if ( tileSize >= 12 )
938 if(world->
isLand(tileX,tileY)==
false)
940 Renderer::placeTexture4(currentX, currentY, currentX+tileSize, currentY+tileSize,
943 else if(world->
isLand(tileX,tileY)==
true)
945 Renderer::placeTexture4(currentX, currentY, currentX+tileSize, currentY+tileSize,
965 Renderer::placeTexture4(currentX, currentY, currentX+tileSize, currentY+tileSize,
973 if(world->
isLand(tileX,tileY) && world->
aWorldTile(tileX,tileY).baseBiome == FOREST)
975 Renderer::placeTexture4
976 (currentX, currentY, currentX+tileSize, currentY+tileSize,
979 else if(world->
isLand(tileX,tileY) &&world->
aWorldTile(tileX,tileY).baseBiome == JUNGLE)
981 Renderer::placeTexture4
984 if(world->
isLand(tileX,tileY) && world->
aWorldTile(tileX,tileY).baseBiome == MOUNTAIN &&
987 Renderer::placeTexture4
988 (currentX, currentY, currentX+tileSize, currentY+tileSize,
991 if(world->
isLand(tileX,tileY) && world->
aWorldTile(tileX,tileY).baseBiome == HILLY)
993 Renderer::placeTexture4
996 if(world->
isLand(tileX,tileY) && world->
aRiverID(tileX,tileY) != -1)
998 Renderer::placeTexture4
1007 const Tribe* dominantTribe = world->
aWorldTile(tileX,tileY).getDominantInfluence();
1008 if (dominantTribe!=0)
1011 dominantTribe->
colourBlue, 150, currentX, currentY, currentX+tileSize, currentY+tileSize);
1030 Renderer::setColourMode();
1032 const int revertTileX = tileX;
1034 for (
int currentY = pixelTileY; currentY<mainViewNY; currentY+=
tileSize)
1036 glBegin(GL_QUAD_STRIP);
1041 for (
int currentX = pixelTileX; currentX<mainViewNX+
tileSize; currentX+=
tileSize)
1043 if(world->
isSafe(tileX,tileY)==
true)
1045 glVertex2s(currentX,currentY);
1046 glVertex2s(currentX,currentY+tileSize);
1051 const Tribe* dominantTribe = world->
aWorldTile(tileX,tileY).getDominantInfluence();
1052 if (dominantTribe!=0)
1065 if(world->
isLand(tileX,tileY)==
false)
1070 else if(world->
isLand(tileX,tileY)==
true)
1082 if(world->
isSafe(tileX,tileY)==
true && world->
isLand(tileX,tileY)==
false)
1087 else if(world->
isSafe(tileX,tileY)==
true && world->
isLand(tileX,tileY)==
true)
1091 Texture * tex = world->
aWorldTile(tileX,tileY).currentTexture();
1094 glColor3ub(tex->averageRed,tex->averageGreen,tex->averageBlue);
1106 else if(world->
isSafe(tileX-1,tileY)==
true)
1108 glVertex2s(currentX,currentY);
1109 glVertex2s(currentX,currentY+tileSize);
Texture TEX_WORLD_TERRAIN_JUNGLE
Definition: Driver_TextureList.hpp:123
Definition: World_Viewer_Rain_Manager.hpp:28
World_Local * worldLocal
Definition: World_Viewer.hpp:91
unsigned char colourRed
Definition: Tribe.hpp:39
char hasSeen(World_Local *, int, int, bool isSubterranean=false)
Definition: Character.cpp:1106
virtual Vector< Texture * > * currentTextures()
Definition: LocalTile.cpp:247
int DEBUG_Y
Definition: Driver_Settings.cpp:268
Definition: World_Viewer.hpp:47
int firstPixelY
Definition: World_Viewer.hpp:80
int centerLocalX
Definition: World_Viewer.hpp:83
World * world
Definition: World_Viewer.hpp:90
short int lastMouseX
Definition: World_Viewer.hpp:88
unsigned long int firstTileAbsX
Definition: World_Viewer.hpp:79
const int LOCAL_MAP_SIZE
Definition: Driver_Settings.cpp:156
bool alternateTile
Definition: World_Viewer.hpp:96
WorldViewer()
Definition: World_Viewer.hpp:116
void toScreenCoords(const int _tileX, const int _tileY, int *_pixelX, int *_pixelY)
Definition: World_Viewer.hpp:345
unsigned long int hoveredAbsoluteX
Definition: World_Viewer.hpp:101
unsigned long int firstTileAbsY
Definition: World_Viewer.hpp:79
unsigned char bWall
Definition: LocalTile.hpp:55
int tileSize
Definition: World_Viewer.hpp:68
bool FOG_OF_WAR
Definition: Driver_Settings.cpp:116
double centerTileX
Definition: World_Viewer.hpp:74
void toTileCoords(int pixelX, int pixelY, unsigned long int *absX, unsigned long int *absY)
Definition: World_Viewer.hpp:400
Vector< WorldObjectGlobal * > vWorldObjectGlobal
Definition: World.hpp:110
int centerLocalY
Definition: World_Viewer.hpp:83
void setCenterTile(const double _centerTileX, const double _centerTileY, const int _subTileX=LOCAL_MAP_SIZE/2, const int _subTileY=LOCAL_MAP_SIZE/2)
Definition: World_Viewer.hpp:334
bool tilesetMode
Definition: World_Viewer.hpp:107
void render()
Definition: World_Viewer.hpp:523
Texture TEX_WORLD_TERRAIN_MOUNTAIN_00
Definition: Driver_TextureList.hpp:148
Definition: WorldObjectGlobal.hpp:17
void switchTarget(World_Local *_worldLocal)
Definition: World_Viewer.hpp:234
void setTileSize(const int _tileSize)
Definition: World_Viewer.hpp:227
ArrayS2< World_Local > aWorldTile
Definition: World.hpp:113
int hoveredXTile
Definition: World_Viewer.hpp:99
void queryTileLocal(int hoveredXTile, int hoveredYTile)
Definition: World.cpp:2127
int nY
Definition: World.hpp:75
ArrayS3< unsigned char > aTopoMap
Definition: World.hpp:107
int hoveredXTileLocal
Definition: World_Viewer.hpp:100
int DEBUG_X
Definition: Driver_Settings.cpp:267
RainManager rainManager
Definition: World_Viewer.hpp:64
int firstTileX
Definition: World_Viewer.hpp:78
int worldY
Definition: WorldObjectGlobal.hpp:22
Definition: World_Local.hpp:58
unsigned long int hoveredAbsoluteY
Definition: World_Viewer.hpp:101
void renderColourMode(int tileX, int tileY, float pixelTileX, float pixelTileY)
Definition: World_Viewer.hpp:1027
Texture TEX_WORLD_TERRAIN_GRASS_00
Definition: Driver_TextureList.hpp:74
Texture TEX_WORLD_TERRAIN_HILL
Definition: Driver_TextureList.hpp:151
void renderWorldIcons()
Definition: World_Viewer.hpp:426
int tilesToSkip
Definition: World_Viewer.hpp:104
Character * playerCharacter
Definition: Driver_Settings.cpp:107
unsigned char colourGreen
Definition: Tribe.hpp:40
int worldX
Definition: WorldObjectGlobal.hpp:22
#define ABSOLUTE_COORDINATE_NULL
Definition: Driver_Settings.cpp:247
double demoScroll
Definition: World_Viewer.hpp:114
short int lastMouseY
Definition: World_Viewer.hpp:88
int firstTileY
Definition: World_Viewer.hpp:78
bool panning
Definition: World_Viewer.hpp:93
bool landMode
Definition: World_Viewer.hpp:109
Calendar globalCalendar
Definition: Driver_GlobalObjects.hpp:28
bool showHoveredTile
Definition: World_Viewer.hpp:102
void renderLocalMap(World_Local *localMap, int currentX, int currentY)
Definition: World_Viewer.hpp:641
unsigned char colourBlue
Definition: Tribe.hpp:41
enumMenu activeMenu
Definition: Driver_Settings_Enums.hpp:29
void setPanel(const int _x1, const int _y1, const int _x2, const int _y2)
Definition: World_Viewer.hpp:318
float panY
Definition: World_Viewer.hpp:94
short int height
Definition: LocalTile.hpp:62
bool territoryView
Definition: World_Viewer.hpp:106
int nX
Definition: World.hpp:75
int firstPixelX
Definition: World_Viewer.hpp:80
double getTilesNX()
Definition: World_Viewer.hpp:1123
double pixelsPerLocalTile
Definition: World_Viewer.hpp:84
bool isSafe(int _x, int _y)
Definition: World.cpp:504
double getTilesNY()
Definition: World_Viewer.hpp:1128
bool mouseEvent(Mouse *mouse)
Definition: World_Viewer.hpp:261
Definition: LocalTile.hpp:34
Data_Subterranean * dataSubterranean
Definition: World_Local.hpp:155
enumBiome baseBiome
Definition: World_Local.hpp:247
void updateScene()
Definition: World_Viewer.hpp:519
ArrayS2< int > aRiverID
Definition: World.hpp:119
std::atomic< bool > initialized
Definition: World_Local.hpp:176
Data * data
Definition: World_Local.hpp:154
void zoomOut()
Definition: World_Viewer.hpp:218
bool active
Definition: World_Viewer.hpp:66
float panX
Definition: World_Viewer.hpp:94
void render()
Definition: World_Viewer_Rain_Manager.cpp:66
bool isLand(int _x, int _y)
Definition: World.cpp:1296
Texture TEX_WALL_GREYBRICK_SOUTH
Definition: Driver_TextureList.hpp:224
int hoveredYTile
Definition: World_Viewer.hpp:99
Texture TEX_WORLD_TERRAIN_OCEAN_00
Definition: Driver_TextureList.hpp:103
Definition: Driver_Settings_Enums.hpp:25
bool keyboardEvent(Keyboard *_keyboard)
Definition: World_Viewer.hpp:181
int hoveredYTileLocal
Definition: World_Viewer.hpp:100
void normaliseCoordinates()
Definition: World_Viewer.hpp:241
void init(int _x1, int _y1, int _x2, int _y2, World *_world, int _maxRain=10000, double _rainPercentOfX=0.005)
Definition: World_Viewer_Rain_Manager.cpp:26
Texture TEX_WORLD_TERRAIN_RIVER_FULL
Definition: Driver_TextureList.hpp:92
bool subterraneanMode
Definition: World_Viewer.hpp:108
void renderTextureMode(int tileX, int tileY, float pixelTileX, float pixelTileY)
Definition: World_Viewer.hpp:900
virtual Texture * currentTexture()
Definition: World_Local.cpp:3159
Vector< World_Local * > vWorldLocal
Definition: World.hpp:115
double centerTileY
Definition: World_Viewer.hpp:74
Texture TEX_WORLD_TERRAIN_FOREST_TREES
Definition: Driver_TextureList.hpp:120
void queryTile(int hoveredXTile, int hoveredYTile)
Definition: World.cpp:2118
bool demoMode
Definition: World_Viewer.hpp:113
void centerView()
Definition: World_Viewer.hpp:169
void generateLocal(const int, const int)
Definition: World.cpp:1756
void zoomIn()
Definition: World_Viewer.hpp:205