1 #include "renderer.h"
2
3 #include <cassert>
4
5 #include "opengl.h"
6
7 #include "vec.h"
8
9 using namespace Shared::Graphics;
10 using namespace Shared::Graphics::Gl;
11
12 namespace Glest{ namespace MapEditor{
13
14 // ===============================================
15 // class Renderer
16 // ===============================================
17
init(int clientW,int clientH)18 void Renderer::init(int clientW, int clientH){
19 assertGl();
20
21 glFrontFace(GL_CW);
22 glEnable(GL_CULL_FACE);
23 glPolygonMode(GL_FRONT, GL_FILL);
24 glClearColor(0.5, 0.5, 0.5, 1.0);
25
26 assertGl();
27 }
28
renderMap(Map * map,int x,int y,int clientW,int clientH,int cellSize)29 void Renderer::renderMap(Map *map, int x, int y, int clientW, int clientH, int cellSize){
30 float alt;
31
32 assertGl();
33
34 glMatrixMode(GL_PROJECTION);
35 glLoadIdentity();
36 glOrtho(0, clientW,0, clientH,1,-1);
37 glViewport(0, 0, clientW, clientH);
38 glMatrixMode(GL_MODELVIEW);
39 glPushMatrix();
40 glPushAttrib(GL_CURRENT_BIT);
41
42 glTranslatef(static_cast<float>(x), static_cast<float>(y), 0.0f);
43 glLineWidth(1);
44 glClear(GL_COLOR_BUFFER_BIT);
45 glColor3f(0, 0, 0);
46
47 for (int j=0; j<map->getH(); j++){
48 for (int i=0; i<map->getW(); i++){
49 if (i*cellSize+x>-cellSize && i*cellSize+x<clientW && clientH-cellSize-j*cellSize+y>-cellSize && clientH-cellSize-j*cellSize+y<clientH){
50
51 //surface
52 alt= map->getHeight(i, j)/20.f;
53 Vec3f surfColor;
54 switch (map->getSurface(i, j)){
55 case 1: surfColor= Vec3f(0.0, 0.8f*alt, 0.f); break;
56 case 2: surfColor= Vec3f(0.4f*alt, 0.6f*alt, 0.f); break;
57 case 3: surfColor= Vec3f(0.6f*alt, 0.3f*alt, 0.f); break;
58 case 4: surfColor= Vec3f(0.7f*alt, 0.7f*alt, 0.7f*alt); break;
59 case 5: surfColor= Vec3f(1.0f*alt, 0.f, 0.f); break;
60 }
61
62 glColor3fv(surfColor.ptr());
63
64 glBegin(GL_TRIANGLE_STRIP);
65 glVertex2i(i*cellSize, clientH-j*cellSize-cellSize);
66 glVertex2i(i*cellSize, clientH-j*cellSize);
67 glVertex2i(i*cellSize+cellSize, clientH-j*cellSize-cellSize);
68 glVertex2i(i*cellSize+cellSize, clientH-j*cellSize);
69 glEnd();
70
71 //objects
72 switch(map->getObject(i,j)){
73 case 0: glColor3f(0.f, 0.f, 0.f); break;
74 case 1: glColor3f(1.f, 0.f, 0.f); break;
75 case 2: glColor3f(1.f, 1.f, 1.f); break;
76 case 3: glColor3f(0.5f, 0.5f, 1.f); break;
77 case 4: glColor3f(0.f, 0.f, 1.f); break;
78 case 5: glColor3f(0.5f, 0.5f, 0.5f); break;
79 case 6: glColor3f(1.f, 0.8f, 0.5f); break;
80 case 7: glColor3f(0.f, 1.f, 1.f); break;
81 case 8: glColor3f(0.7f, 0.1f, 0.3f); break;
82 case 9: glColor3f(0.5f, 1.f, 0.1f); break;
83 case 10:glColor3f(1.f, 0.2f, 0.8f); break;
84 }
85
86 if(map->getObject(i, j)!=0){
87 glPointSize(cellSize/2.f);
88 glBegin(GL_POINTS);
89 glVertex2i(i*cellSize+cellSize/2, clientH-j*cellSize-cellSize/2);
90 glEnd();
91 }
92
93 bool found= false;
94
95 //height lines
96 if(!found){
97 glColor3fv((surfColor*0.5f).ptr());
98 //left
99 if(i>0 && map->getHeight(i-1, j)>map->getHeight(i, j)){
100 glBegin(GL_LINES);
101 glVertex2i(i*cellSize, clientH-(j+1)*cellSize);
102 glVertex2i(i*cellSize, clientH-j*cellSize);
103 glEnd();
104 }
105 //down
106 if(j>0 && map->getHeight(i, j-1)>map->getHeight(i, j)){
107 glBegin(GL_LINES);
108 glVertex2i(i*cellSize, clientH-j*cellSize);
109 glVertex2i((i+1)*cellSize, clientH-j*cellSize);
110 glEnd();
111 }
112
113 glColor3fv((surfColor*2.f).ptr());
114 //left
115 if(i>0 && map->getHeight(i-1, j)<map->getHeight(i, j)){
116 glBegin(GL_LINES);
117 glVertex2i(i*cellSize, clientH-(j+1)*cellSize);
118 glVertex2i(i*cellSize, clientH-j*cellSize);
119 glEnd();
120 }
121 if(j>0 && map->getHeight(i, j-1)<map->getHeight(i, j)){
122 glBegin(GL_LINES);
123 glVertex2i(i*cellSize, clientH-j*cellSize);
124 glVertex2i((i+1)*cellSize, clientH-j*cellSize);
125 glEnd();
126 }
127 }
128
129 //resources
130 switch(map->getResource(i,j)){
131 case 1: glColor3f(1.f, 1.f, 0.f); break;
132 case 2: glColor3f(0.5f, 0.5f, 0.5f); break;
133 case 3: glColor3f(1.f, 0.f, 0.f); break;
134 case 4: glColor3f(0.f, 0.f, 1.f); break;
135 case 5: glColor3f(0.5f, 0.5f, 1.f); break;
136 }
137
138 if (map->getResource(i,j)!=0){
139 glBegin(GL_LINES);
140 glVertex2i(i*cellSize, clientH-j*cellSize-cellSize);
141 glVertex2i(i*cellSize+cellSize, clientH-j*cellSize);
142 glVertex2i(i*cellSize, clientH-j*cellSize);
143 glVertex2i(i*cellSize+cellSize, clientH-j*cellSize-cellSize);
144 glEnd();
145 }
146 }
147 }
148 }
149
150 //start locations
151 glLineWidth(3);
152 for (int i=0; i<map->getMaxPlayers(); i++){
153 switch(i){
154 case 0: glColor3f(1.f, 1.f, 0.f); break;
155 case 1: glColor3f(0.5f, 0.5f, 0.5f); break;
156 case 2: glColor3f(1.f, 0.f, 0.f); break;
157 case 3: glColor3f(0.f, 0.f, 1.f); break;
158 }
159 glBegin(GL_LINES);
160 glVertex2i((map->getStartLocationX(i)-1)*cellSize, clientH- (map->getStartLocationY(i)-1)*cellSize);
161 glVertex2i((map->getStartLocationX(i)+1)*cellSize+cellSize, clientH- (map->getStartLocationY(i)+1)*cellSize-cellSize);
162 glVertex2i((map->getStartLocationX(i)-1)*cellSize, clientH- (map->getStartLocationY(i)+1)*cellSize-cellSize);
163 glVertex2i((map->getStartLocationX(i)+1)*cellSize+cellSize, clientH- (map->getStartLocationY(i)-1)*cellSize);
164 glEnd();
165 }
166
167 glPopMatrix();
168 glPopAttrib();
169
170 assertGl();
171 }
172
173 }}// end namespace
174