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