5
// Created by döme on 26.07.2009.
6
// Copyright __MyCompanyName__ 2009. All rights reserved.
11
#import <QuartzCore/QuartzCore.h>
12
#import <OpenGLES/EAGLDrawable.h>
13
#import <CoreGraphics/CoreGraphics.h>
20
#import "VertexArray.h"
21
#import "MarineCompassAppDelegate.h"
26
kProjectionModePerspective,
49
@implementation EAGLView
53
- (void) setupGraphicsForApi: (EAGLRenderingAPI) glApi
56
glEnable(GL_DEPTH_TEST);
57
//glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
58
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
60
[self loadTextureFromBitmapNamed: @"scale1.1024.png" texName: &scale1tex repeat: NO mipmap: NO filter: YES];
61
[self loadTextureFromBitmapNamed: @"scale2.1024.png" texName: &scale2tex repeat: NO mipmap: NO filter: YES];
62
[self loadTextureFromBitmapNamed: @"lines.1024.png" texName: &linesTex repeat: NO mipmap: NO filter: YES];
63
[self loadTextureFromBitmapNamed: @"disk1.png" texName: &disk1tex repeat: NO mipmap: NO filter: YES];
64
[self loadTextureFromBitmapNamed: @"disk2.png" texName: &disk2tex repeat: NO mipmap: NO filter: YES];
65
[self loadTextureFromBitmapNamed: @"white.png" texName: &whiteTex repeat: NO mipmap: NO filter: NO];
66
[self loadTextureFromBitmapNamed: @"gray.png" texName: &grayTex repeat: NO mipmap: NO filter: NO];
68
outerConeVar = [[VertexArray coneWithFraction: (0.3)] retain];
69
sphereVar = [[VertexArray sharedSphere] retain];
71
simpleShader = [[[ESShader shader] initWithVertexShaderFile: @"simple.vs" fragmentShaderFile: @"simple.fs"] retain];
72
fresnelShader = [[[ESShader shader] initWithVertexShaderFile: @"fresnel.vs" fragmentShaderFile: @"fresnel.fs"] retain];
78
[self setupViewDrawing];
80
m16 mv = [(id)[[UIApplication sharedApplication] delegate] baseCompassTransform];
82
const GLfloat axisVertices[] = {
90
const GLubyte axisColors[] = {
100
[simpleShader bindShader];
102
m16 pm = midentity();
103
CGRect frame = [self frame];
104
float ar = frame.size.width/frame.size.height;
106
switch (viewpointMode)
108
case kViewpointNormal:
109
switch (projectionMode)
111
case kProjectionModePerspective:
113
pm = mperspective(50.0*(M_PI/180.0), ar, 1.5, 4.5);
116
case kProjectionModeOrtho:
117
pm = mortho(-1.1,1.1, -1.1/ar, 1.1/ar, 1.5, 4.5);
121
case kViewpointOnDisc:
122
switch (projectionMode)
124
case kProjectionModePerspective:
126
pm = mperspective(50.0*(M_PI/180.0), ar, 0.01, 2.0);
129
case kProjectionModeOrtho:
130
pm = mortho(-0.55,0.55, -0.55/ar, 0.55/ar, -1.5, 1.5);
136
[simpleShader setProjectionMatrix: &pm];
137
// glMatrixMode(GL_PROJECTION);
139
// glFrustumf(-0.5, 0.5, -0.75, 0.75, 1.0, 4.0);
141
// glMatrixMode(GL_MODELVIEW);
144
// GLfloat lightpos[] = {0.0,0.0,0.0,1.0};
145
// glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
146
// glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
151
switch (viewpointMode)
153
case kViewpointNormal:
154
baseFrame = mmul(mtranslate(vcreate(-0.2*mv.m[2][0], -0.3*mv.m[2][1], -0.5*(1.5+4.5))), mv);
155
//baseFrame = mmul(mtranslate(vcreate(0.0, 0.0, -0.5*(1.5+4.5))), mv);
157
case kViewpointOnDisc:
158
baseFrame = mmul(mtranslate(vcreate(-0.2*mv.m[2][0], -0.2*mv.m[2][1], -0.2*mv.m[2][2])), mv);
164
glVertexPointer(3, GL_FLOAT, 0, axisVertices);
165
glEnableClientState(GL_VERTEX_ARRAY);
166
glColorPointer(4, GL_UNSIGNED_BYTE, 0, axisColors);
167
glEnableClientState(GL_COLOR_ARRAY);
169
glDrawArrays(GL_LINES, 0, 6);
173
float compassVertices[12] = {0.0f,0.0f,0.15f, cvflat.v.x, cvflat.v.y, 0.15f,
174
0.0f,0.0f,0.0f, cvn.v.x, cvn.v.y, cvn.v.z};
176
glDisableClientState(GL_COLOR_ARRAY);
178
glVertexPointer(3, GL_FLOAT, 0, compassVertices);
179
glEnableClientState(GL_VERTEX_ARRAY);
181
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
182
glDrawArrays(GL_LINES, 0, 2);
183
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
184
glDrawArrays(GL_LINES, 2, 2);
188
float textureOffset = 17.5/1024.0;
189
float textureScale = 900.0/1024.0;
194
glMatrixMode(GL_TEXTURE);
196
glTranslatef(textureOffset+1.0/1024.0, 0.0,0.0);
197
glScalef(textureScale,1.0,1.0);
200
m16 mvc = [(id)[[UIApplication sharedApplication] delegate] compassDiskTransform];
202
m16 compassFrame = mmul(baseFrame, mvc);
204
[simpleShader setModelviewMatrix: &compassFrame];
206
// glEnable(GL_COLOR_MATERIAL);
207
// glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
209
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
210
// glEnable(GL_LIGHTING);
211
// glEnable(GL_LIGHT0);
212
// glDisableClientState(GL_COLOR_ARRAY);
213
glEnable(GL_TEXTURE_2D);
214
glBindTexture(GL_TEXTURE_2D, scale1tex);
216
m16 cylTM = mmul(mtranslate(vcreate(textureOffset+0.0/1024.0, 0.0,0.0)), mscale(vcreate(textureScale,1.0,1.0)));
217
[simpleShader setTextureMatrix: &cylTM];
219
m16 cylinderFrame = mmul(compassFrame, mscale(vcreate(1.0,1.0,0.2)));
220
[simpleShader setModelviewMatrix: &cylinderFrame];
222
glEnable(GL_CULL_FACE);
223
glCullFace(GL_FRONT);
225
[[VertexArray sharedCylinder] draw];
228
[[VertexArray sharedCylinder] draw];
230
glDisable(GL_CULL_FACE);
232
m16 diskFrame = mmul(compassFrame, mmul(mtranslate(vcreate(0.0,0.0,0.05)), mscale(vcreate(0.7,0.7,1.0))));
233
[simpleShader setModelviewMatrix: &diskFrame];
235
glBindTexture(GL_TEXTURE_2D, disk1tex);
238
[simpleShader setTextureMatrix: &I];
240
[[VertexArray sharedDisk] draw];
242
glBindTexture(GL_TEXTURE_2D, disk2tex);
243
m16 diskFrame2 = mmul(compassFrame, mmul(mtranslate(vcreate(0.0,0.0,-0.2)), mscale(vcreate(1.0,1.0,1.0))));
244
[simpleShader setModelviewMatrix: &diskFrame2];
245
[[VertexArray sharedDisk] draw];
248
glBindTexture(GL_TEXTURE_2D, scale2tex);
251
glMatrixMode(GL_TEXTURE);
253
glTranslatef(textureOffset, 0.0,0.0);
254
glScalef(textureScale,1.0,1.0);
256
m16 coneTM = mmul(mtranslate(vcreate(textureOffset, 0.0,0.0)), mscale(vcreate(textureScale,1.0,1.0)));
257
[simpleShader setTextureMatrix: &coneTM];
259
m16 coneFrame = mmul(compassFrame, mmul(mtranslate(vcreate(0.0,0.0,0.2)), mscale(vcreate(1.0, 1.0, -0.5))));
261
coneFrame = mmul(coneFrame, mcreatefrombases(vcreate(-1.0,0.0,0.0), vcreate(0.0,-1.0,0.0), vcreate(0.0,0.0,1.0)));
263
[simpleShader setModelviewMatrix: &coneFrame];
267
//glRotatef(180.0, 0.0, 0.0, 1.0);
277
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
278
glEnable(GL_CULL_FACE);
280
[fresnelShader bindShader];
282
m16 sphereFrame = mmul(baseFrame, mscale(vcreate(1.1,1.1,1.1)));
285
[fresnelShader setProjectionMatrix: &pm];
286
[fresnelShader setModelviewMatrix: &sphereFrame];
287
[fresnelShader setTextureMatrix: &I];
289
glBindTexture(GL_TEXTURE_2D, whiteTex);
297
m16 mt = mtranspose(mv);
299
v3 Z = vcreate(0.0,0.0,1.0);
300
v3 camZ = mtransformdir3(mt, Z);
303
camZ = vnormalize(camZ);
305
v3 camY = vnormalize(vcross(Z, camZ));
307
m16 mc = mcreatefrombases(camZ, camY, Z);
309
m16 gaugeFrame = mmul(mmul(baseFrame, mc), mscale(vcreate(1.03,1.03,1.03)));
311
[simpleShader setModelviewMatrix: &gaugeFrame];
313
m16 tm = mmul( mtranslate(vcreate(0.0,-1.0,0.0)), mscale(vcreate(1.0,3.0,1.0)));
314
tm = mmul(tm, mmul(mtranslate(vcreate(textureOffset, 0.0,0.0)), mscale(vcreate(textureScale,1.0,1.0))));
317
glBindTexture(GL_TEXTURE_2D, linesTex);
319
glDepthMask(GL_FALSE);
321
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
322
glEnable(GL_CULL_FACE);
325
m16 tm1 = mmul(tm, mtranslate(vcreate(0.5, 0.0, 0.0)));
326
m16 mv1 = mmul(gaugeFrame, mcreatefrombases(vcreate(-1.0,0.0,0.0), vcreate(0.0,-1.0,0.0), vcreate(0.0,0.0,1.0)));
327
[simpleShader setModelviewMatrix: &mv1];
328
[simpleShader setTextureMatrix: &tm1];
329
glCullFace(GL_FRONT);
330
[[VertexArray sharedXSemiSphere] draw];
332
[[VertexArray sharedXSemiSphere] draw];
336
m16 tm1 = mmul(tm, mtranslate(vcreate(1.0, 0.0, 0.0)));
337
[simpleShader setModelviewMatrix: &gaugeFrame];
339
glCullFace(GL_FRONT);
340
[simpleShader setTextureMatrix: &tm];
341
[[VertexArray sharedXSemiSphere] draw];
342
[simpleShader setTextureMatrix: &tm1];
343
[[VertexArray sharedXSemiSphere] draw];
345
[simpleShader setTextureMatrix: &tm];
346
[[VertexArray sharedXSemiSphere] draw];
347
[simpleShader setTextureMatrix: &tm1];
348
[[VertexArray sharedXSemiSphere] draw];
351
glDepthMask(GL_TRUE);
355
[self finishViewDrawing];
360
- (void) animationCallback: (id) info
362
//NSLog(@"animatin");
369
if ([EAGLContext currentContext] == context) {
370
[EAGLContext setCurrentContext:nil];
377
- (IBAction) toggleProjectionMode: (id) sender
379
projectionMode = (projectionMode+1) % kProjectionModeLast;
381
switch(projectionMode)
383
case kProjectionModeOrtho:
384
[sender setImage: [UIImage imageNamed: @"perspective.png"]];
386
case kProjectionModePerspective:
387
[sender setImage: [UIImage imageNamed: @"ortho.png"]];
392
- (IBAction) toggleLinesMode: (id) sender
394
linesMode = (linesMode+1) % kLinesModeLast;
396
[sender setImage: [UIImage imageNamed: [NSString stringWithFormat: @"lines%d.png", (linesMode+1) % kLinesModeLast]]];
399
- (IBAction) toggleViewpointMode: (id) sender
401
viewpointMode = (viewpointMode+1) % kViewpointLast;
403
switch(viewpointMode)
405
case kViewpointNormal:
406
[sender setStyle: UIBarButtonItemStyleBordered];
407
//[sender setImage: [UIImage imageNamed: @"sliceIcon.png"]];
409
case kViewpointOnDisc:
410
[sender setStyle: UIBarButtonItemStyleDone];
411
//[sender setImage: [UIImage imageNamed: @"circleIcon.png"]];