31 |
|
|
32 |
#include "Common/Camera.h" |
#include "Common/Camera.h" |
33 |
#include "Map/MapDisplay.h" |
#include "Map/MapDisplay.h" |
34 |
|
#include "MapController.h" |
35 |
|
|
36 |
#include "MapView.h" |
#include "MapView.h" |
37 |
|
|
38 |
@implementation MapView |
@implementation MapView |
39 |
|
|
40 |
static int _nbRay = 70; |
int _nbRay = 70; |
41 |
static double _lastStep = 4.0; |
double _lastStep = 4.0; |
42 |
static int _mode = 1; |
int _mode = 1; |
43 |
static int _view = 0; |
int _viewTop = 1; |
44 |
|
double _camZFar = 255.0; |
45 |
static const GLfloat lightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.0f }; |
|
46 |
static const GLfloat lightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f }; |
const GLfloat lightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.0f }; |
47 |
static const GLfloat lightPosition[] = { 10.0f, 350.0f, 10.0f}; |
const GLfloat lightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f }; |
48 |
|
const GLfloat lightPosition[] = { 10.0f, 350.0f, 10.0f}; |
49 |
|
|
50 |
|
|
51 |
- (id) initWithFrame: (NSRect)frameRect |
- (id) initWithFrame: (NSRect)frameRect |
56 |
if (self != nil) |
if (self != nil) |
57 |
{ |
{ |
58 |
_init = NO; |
_init = NO; |
59 |
_camera = [[Camera alloc] initWithFovy: 50.0 |
_display = NO; |
60 |
aspect: 1.0 |
} |
|
zNear: 5.0 |
|
|
zFar: 250.0 |
|
|
eye: MakeCoord (0.0, 150.0, 0.0) |
|
|
center: MakeCoord (0.0, 150.0, 30.0) |
|
|
up: MakeCoord (0.0, 1.0, 0.0)]; |
|
|
|
|
|
_map = [[MapDisplay alloc] initWithImageName: @"carte.tiff" |
|
|
colorsImageName: @"land.tiff" |
|
|
mapShadow: nil |
|
|
textureLoader: nil]; |
|
|
} |
|
|
|
|
61 |
return self; |
return self; |
62 |
} |
} |
63 |
|
|
|
-(void) setCamera: (Camera *)camera |
|
|
{ |
|
|
_camera = camera; |
|
|
} |
|
|
|
|
64 |
- (void) dealloc |
- (void) dealloc |
65 |
{ |
{ |
66 |
RELEASE(_camera); |
RELEASE(_camera); |
90 |
|
|
91 |
glShadeModel (GL_SMOOTH); |
glShadeModel (GL_SMOOTH); |
92 |
|
|
93 |
|
glFogi(GL_FOG_MODE, GL_LINEAR); |
94 |
|
glFogf(GL_FOG_START, _camZFar - 10.0); |
95 |
|
glFogf(GL_FOG_END, _camZFar + 1.0); |
96 |
|
GLfloat fog_c[] = {0.5f, 0.5f, 0.5f, 1.0f}; |
97 |
|
glFogfv(GL_FOG_COLOR, fog_c); |
98 |
|
if (!_viewTop) |
99 |
|
glEnable(GL_FOG); |
100 |
|
|
101 |
|
//glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST); |
102 |
|
glHint (GL_POLYGON_SMOOTH_HINT, GL_FASTEST); |
103 |
|
//glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); |
104 |
|
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); |
105 |
|
|
106 |
[NSTimer scheduledTimerWithTimeInterval: 0.001 |
[NSTimer scheduledTimerWithTimeInterval: 0.001 |
107 |
target: self |
target: self |
108 |
selector: @selector(display) |
selector: @selector(display) |
147 |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
148 |
glLoadIdentity(); |
glLoadIdentity(); |
149 |
|
|
150 |
glLightfv( GL_LIGHT0, GL_POSITION, lightPosition ); |
if (_display) |
151 |
|
{ |
152 |
|
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); |
153 |
|
|
154 |
|
gluLookAt ((GLdouble)[_camera eye].x, |
155 |
|
(GLdouble)[_camera eye].y, |
156 |
|
(GLdouble)[_camera eye].z, |
157 |
|
(GLdouble)[_camera center].x, |
158 |
|
(GLdouble)[_camera center].y, |
159 |
|
(GLdouble)[_camera center].z, |
160 |
|
(GLdouble)[_camera up].x, |
161 |
|
(GLdouble)[_camera up].y, |
162 |
|
(GLdouble)[_camera up].z); |
163 |
|
|
164 |
|
if (_viewTop) |
165 |
|
[_map displayWithCamera: _camera |
166 |
|
numberOfRay: _nbRay]; |
167 |
|
else |
168 |
|
[_map displayWithCamera: _camera |
169 |
|
numberOfRay: _nbRay |
170 |
|
lastStep: _lastStep]; |
171 |
|
|
172 |
gluLookAt ((GLdouble)[_camera eye].x, |
} |
|
(GLdouble)[_camera eye].y, |
|
|
(GLdouble)[_camera eye].z, |
|
|
(GLdouble)[_camera center].x, |
|
|
(GLdouble)[_camera center].y, |
|
|
(GLdouble)[_camera center].z, |
|
|
(GLdouble)[_camera up].x, |
|
|
(GLdouble)[_camera up].y, |
|
|
(GLdouble)[_camera up].z); |
|
|
|
|
|
if (_view) |
|
|
[_map displayWithCamera: _camera |
|
|
numberOfRay: _nbRay]; |
|
|
else |
|
|
[_map displayWithCamera: _camera |
|
|
numberOfRay: _nbRay |
|
|
lastStep: _lastStep]; |
|
173 |
|
|
174 |
[self update]; |
[self update]; |
175 |
[[self openGLContext] flushBuffer]; |
[[self openGLContext] flushBuffer]; |
176 |
} |
} |
177 |
|
|
178 |
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent |
- (void) setCamera: (Camera *)camera |
179 |
|
{ |
180 |
|
if (_camera) |
181 |
|
RELEASE (_camera); |
182 |
|
|
183 |
|
_camera = RETAIN (camera); |
184 |
|
} |
185 |
|
|
186 |
|
- (void) setTerrain: (MapDisplay *)map |
187 |
|
{ |
188 |
|
if (_map) |
189 |
|
RELEASE (_map); |
190 |
|
|
191 |
|
_map = RETAIN (map); |
192 |
|
} |
193 |
|
|
194 |
|
- (void) displayTerrain: (BOOL)display |
195 |
|
{ |
196 |
|
_display = display; |
197 |
|
} |
198 |
|
|
199 |
|
- (BOOL) performKeyEquivalent: (NSEvent *)theEvent |
200 |
{ |
{ |
201 |
NSString *keyString; |
NSString *keyString; |
202 |
unichar keyChar; |
unichar keyChar; |
203 |
double f = 3.0; |
double f = 3.0; |
204 |
double h = 0.01; |
double h = 1.0; |
205 |
double p = 0.1; |
double p = 1.0; |
206 |
double l = 0.2; |
double l = 0.2; |
207 |
|
|
208 |
keyString = [theEvent charactersIgnoringModifiers]; |
if (_display) |
|
keyChar = [keyString characterAtIndex:0]; |
|
|
|
|
|
switch(keyChar) |
|
209 |
{ |
{ |
210 |
case NSUpArrowFunctionKey: |
keyString = [theEvent charactersIgnoringModifiers]; |
211 |
case 'z': |
keyChar = [keyString characterAtIndex:0]; |
|
[_camera forward: f]; |
|
|
break; |
|
|
|
|
|
case NSDownArrowFunctionKey: |
|
|
case 's': |
|
|
[_camera backward: f]; |
|
|
break; |
|
|
|
|
|
case NSLeftArrowFunctionKey: |
|
|
case 'q': |
|
|
[_camera strafLeft: f]; |
|
|
break; |
|
|
|
|
|
case NSRightArrowFunctionKey: |
|
|
case 'd': |
|
|
[_camera strafRight: f]; |
|
|
break; |
|
|
|
|
|
case NSPageUpFunctionKey: |
|
|
case 'a': |
|
|
[_camera moveUp: f]; |
|
|
break; |
|
|
|
|
|
case NSPageDownFunctionKey: |
|
|
case 'e': |
|
|
[_camera moveDown: f]; |
|
|
break; |
|
|
|
|
|
case '4': |
|
|
[_camera rotatePitch: p]; |
|
|
break; |
|
|
case '6': |
|
|
[_camera rotatePitch: -p]; |
|
|
break; |
|
|
case '8': |
|
|
[_camera rotateHeading: h]; |
|
|
break; |
|
|
case '2': |
|
|
[_camera rotateHeading: -h]; |
|
|
break; |
|
|
|
|
|
case 'f': |
|
|
_mode = 1 - _mode; |
|
|
if (_mode) |
|
|
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); |
|
|
else |
|
|
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); |
|
|
break; |
|
|
|
|
|
case '+': |
|
|
_nbRay++; |
|
|
printf("nbRay: %d\n", _nbRay); |
|
|
break; |
|
|
case '-': |
|
|
_nbRay--; |
|
|
if (_nbRay == 2) |
|
|
_nbRay = 3; |
|
|
printf("nbRay: %d\n", _nbRay); |
|
|
break; |
|
|
|
|
|
case 'P': |
|
|
_lastStep += l; |
|
|
printf("step: %lf\n", _lastStep); |
|
|
break; |
|
|
case 'p': |
|
|
_lastStep -= l; |
|
|
if (_lastStep < 1.0) |
|
|
_lastStep = 1.0; |
|
|
printf("lastStep: %lf\n", _lastStep); |
|
|
break; |
|
|
|
|
|
case 'v': |
|
|
_view = 1 - _view; |
|
|
coord_t eye = [_camera eye]; |
|
|
if (_view) |
|
|
[_camera initWithFovy: 45.0 |
|
|
aspect: 1.0 |
|
|
zNear: 5.0 |
|
|
zFar: 855.0 |
|
|
eye: eye |
|
|
center: MakeCoord (eye.x, eye.y - 10.0, eye.z) |
|
|
up: MakeCoord (0.0, 0.0, 1.0)]; |
|
|
else |
|
|
[_camera initWithFovy: 45.0 |
|
|
aspect: 1.0 |
|
|
zNear: 5.0 |
|
|
zFar: 255.0 |
|
|
eye: eye |
|
|
center: MakeCoord (eye.x, eye.y, eye.z + 30.0) |
|
|
up: MakeCoord (0.0, 1.0, 0.0)]; |
|
|
[self reshape]; |
|
|
break; |
|
212 |
|
|
213 |
default: |
switch(keyChar) |
214 |
break; |
{ |
215 |
|
case NSUpArrowFunctionKey: |
216 |
|
case 'z': |
217 |
|
[_camera forward: f]; |
218 |
|
break; |
219 |
|
|
220 |
|
case NSDownArrowFunctionKey: |
221 |
|
case 's': |
222 |
|
[_camera backward: f]; |
223 |
|
break; |
224 |
|
|
225 |
|
case NSLeftArrowFunctionKey: |
226 |
|
case 'q': |
227 |
|
[_camera strafLeft: f]; |
228 |
|
break; |
229 |
|
|
230 |
|
case NSRightArrowFunctionKey: |
231 |
|
case 'd': |
232 |
|
[_camera strafRight: f]; |
233 |
|
break; |
234 |
|
|
235 |
|
case NSPageUpFunctionKey: |
236 |
|
case 'a': |
237 |
|
[_camera moveUp: f]; |
238 |
|
break; |
239 |
|
|
240 |
|
case NSPageDownFunctionKey: |
241 |
|
case 'e': |
242 |
|
[_camera moveDown: f]; |
243 |
|
break; |
244 |
|
|
245 |
|
case '4': |
246 |
|
[_camera rotateHeading: h]; |
247 |
|
break; |
248 |
|
case '6': |
249 |
|
[_camera rotateHeading: -h]; |
250 |
|
break; |
251 |
|
case '8': |
252 |
|
[_camera rotatePitch: p]; |
253 |
|
break; |
254 |
|
case '2': |
255 |
|
[_camera rotatePitch: -p]; |
256 |
|
break; |
257 |
|
|
258 |
|
case 'f': |
259 |
|
_mode = 1 - _mode; |
260 |
|
if (_mode) |
261 |
|
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); |
262 |
|
else |
263 |
|
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); |
264 |
|
break; |
265 |
|
|
266 |
|
case '+': |
267 |
|
_nbRay++; |
268 |
|
printf("nbRay: %d\n", _nbRay); |
269 |
|
break; |
270 |
|
case '-': |
271 |
|
_nbRay--; |
272 |
|
if (_nbRay == 2) |
273 |
|
_nbRay = 3; |
274 |
|
printf("nbRay: %d\n", _nbRay); |
275 |
|
break; |
276 |
|
|
277 |
|
case 'P': |
278 |
|
_lastStep += l; |
279 |
|
printf("step: %lf\n", _lastStep); |
280 |
|
break; |
281 |
|
case 'p': |
282 |
|
_lastStep -= l; |
283 |
|
if (_lastStep < 1.0) |
284 |
|
_lastStep = 1.0; |
285 |
|
printf("lastStep: %lf\n", _lastStep); |
286 |
|
break; |
287 |
|
|
288 |
|
case 'v': |
289 |
|
_viewTop = 1 - _viewTop; |
290 |
|
coord_t eye = [_camera eye]; |
291 |
|
|
292 |
|
if (_viewTop) |
293 |
|
glDisable (GL_FOG); |
294 |
|
else |
295 |
|
glEnable (GL_FOG); |
296 |
|
|
297 |
|
if (_viewTop) |
298 |
|
[_camera initWithFovy: 45.0 |
299 |
|
aspect: 1.0 |
300 |
|
zNear: 5.0 |
301 |
|
zFar: 855.0 |
302 |
|
eye: eye |
303 |
|
center: MakeCoord (eye.x, eye.y - 10.0, eye.z) |
304 |
|
up: MakeCoord (0.0, 0.0, 1.0)]; |
305 |
|
else |
306 |
|
[_camera initWithFovy: 45.0 |
307 |
|
aspect: 1.0 |
308 |
|
zNear: 5.0 |
309 |
|
zFar: 255.0 |
310 |
|
eye: eye |
311 |
|
center: MakeCoord (eye.x, eye.y, eye.z + 30.0) |
312 |
|
up: MakeCoord (0.0, 1.0, 0.0)]; |
313 |
|
[self reshape]; |
314 |
|
break; |
315 |
|
|
316 |
|
default: |
317 |
|
[_mapController keyStroke: keyChar]; |
318 |
|
break; |
319 |
|
} |
320 |
} |
} |
321 |
return YES; |
return YES; |
322 |
} |
} |