29#import "MyOpenGLView.h"
44#define FAR_PLANE (DUST_SCALE * 0.50f)
45#define NEAR_PLANE (DUST_SCALE * 0.25f)
49@interface DustEntity (Private) <OOGraphicsResetClient>
87 vertices[vi + DUST_N_PARTICLES] = vertices[vi];
88 warpinessAttr[vi] = 0.0f;
89 warpinessAttr[vi + DUST_N_PARTICLES] = 1.0f;
94 shaderMode = kShaderModeUnknown;
97 drawDust = ![[[NSProcessInfo processInfo] arguments] containsObject:@"-nodust"];
100 [
self setStatus:STATUS_ACTIVE];
108 options:kOOTextureMinFilterMipMap | kOOTextureMagFilterLinear | kOOTextureAlphaMask
136- (void) setDustColor:(
OOColor *) color
138 if (dust_color) [dust_color release];
139 dust_color = [color retain];
140 [dust_color getRed:&color_fv[0] green:&color_fv[1] blue:&color_fv[2] alpha:&color_fv[3]];
156- (void) updateCameraRelativePosition
158 HPVector c_pos = [PLAYER viewpointPosition];
169 if (
EXPECT_NOT(shaderMode == kShaderModeUnknown)) [
self checkShaderMode];
172 if (shaderMode == kShaderModeOn)
return;
175 Vector
offset = vector_flip(cameraRelativePosition);
180 while (vertices[vi].
x -
offset.x < -half_scale)
182 while (vertices[vi].
x -
offset.x > half_scale)
185 while (vertices[vi].
y -
offset.y < -half_scale)
187 while (vertices[vi].
y -
offset.y > half_scale)
190 while (vertices[vi].z -
offset.z < -half_scale)
192 while (vertices[vi].z -
offset.z > half_scale)
199- (OOShaderProgram *) shader
203 NSString *prefix = [NSString stringWithFormat:
204 @"#define OODUST_SCALE_MAX (float(%g))\n"
205 "#define OODUST_SCALE_FACTOR (float(%g))\n"
206 "#define OODUST_SIZE (float(%g))\n",
207 FAR_PLANE / NEAR_PLANE,
208 1.0f / (FAR_PLANE - NEAR_PLANE),
212 NSDictionary *attributes = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kTangentAttributeIndex]
213 forKey:@"aWarpiness"];
215 shader = [[OOShaderProgram shaderProgramWithVertexShaderName:@"oolite-dust.vertex"
216 fragmentShaderName:@"oolite-dust.fragment"
218 attributeBindings:attributes] retain];
221 OOShaderUniform *uWarp = [[OOShaderUniform alloc] initWithName:@"uWarp"
224 property:@selector(warpVector)
226 OOShaderUniform *uOffsetPlayerPosition = [[OOShaderUniform alloc] initWithName:@"uOffsetPlayerPosition"
229 property:@selector(offsetPlayerPosition)
232 uniforms = [[NSArray alloc] initWithObjects:uWarp, uOffsetPlayerPosition, nil];
234 [uOffsetPlayerPosition release];
240- (Vector) offsetPlayerPosition
243 HPVector c_pos = [PLAYER viewpointPosition];
251 shaderMode = kShaderModeOff;
256 shaderMode = kShaderModeOn;
269- (void) drawImmediate:(
bool)immediate translucent:(
bool)translucent
271 if (!drawDust || [
UNIVERSE breakPatternHide] || !translucent)
return;
274 assert(player !=
nil);
281 if (
EXPECT_NOT(shaderMode == kShaderModeUnknown)) [
self checkShaderMode];
282 BOOL useShader = (shaderMode == kShaderModeOn);
286 GLfloat *fogcolor = [UNIVERSE skyClearColor];
287 float idealDustSize = [[UNIVERSE gameView] viewSize].width / 800.0f;
294 OOGL(glDisableClientState(GL_NORMAL_ARRAY));
299 float dustPointSize = ceil(idealDustSize);
300 if (dustPointSize < 1.0f) dustPointSize = 1.0f;
302 dustIntensity = OOClamp_0_1_f(idealDustSize / dustPointSize);
307 float idealLineSize = idealDustSize * 0.5f;
308 float dustLineSize = ceil(idealLineSize);
309 if (dustLineSize < 1.0f) dustLineSize = 1.0f;
311 dustIntensity = OOClamp_0_1_f(idealLineSize / dustLineSize);
313 if (fogcolor[3] > 0.0)
316 dustIntensity = OOClamp_0_1_f(dustIntensity-(fogcolor[3]*3.0));
320 if (dustIntensity > 0.0)
324 if (player->
isSunlit) color = color_fv;
325 else color =
UNIVERSE->stars_ambient;
326 OOGL(glColor4f(color[0], color[1], color[2], dustIntensity));
331 [[
self shader] apply];
332 [uniforms makeObjectsPerformSelector:@selector(apply)];
337 OOGL(glEnable(GL_FOG));
338 OOGL(glFogi(GL_FOG_MODE, GL_LINEAR));
339 OOGL(glFogfv(GL_FOG_COLOR, fogcolor));
340 OOGL(glHint(GL_FOG_HINT, GL_NICEST));
345 OOGL(glEnable(GL_BLEND));
346 OOGL(glDepthMask(GL_FALSE));
350 OOGL(glDisable(GL_TEXTURE_2D));
354 OOGL(glEnableVertexAttribArrayARB(kTangentAttributeIndex));
355 OOGL(glVertexAttribPointerARB(kTangentAttributeIndex, 1, GL_FLOAT, GL_FALSE, 0, warpinessAttr));
360 Vector warpVector = [
self warpVector];
364 vertices[vi + DUST_N_PARTICLES] = vector_subtract(vertices[vi], warpVector);
368 OOGL(glVertexPointer(3, GL_FLOAT, 0, vertices));
374 OOGL(glDisableVertexAttribArrayARB(kTangentAttributeIndex));
377 OOGL(glEnable(GL_TEXTURE_2D));
388 OOGL(glBlendFunc(GL_SRC_ALPHA, GL_ONE));
390 OOGL(glEnable(GL_POINT_SPRITE_ARB));
392 OOGL(glVertexPointer(3, GL_FLOAT, 0, vertices));
394 OOGL(glDisable(GL_POINT_SPRITE_ARB));
398 OOGL(glDisable(GL_TEXTURE_2D));
399 OOGL(glVertexPointer(3, GL_FLOAT, 0, vertices));
401 OOGL(glEnable(GL_TEXTURE_2D));
409 [OOShaderProgram applyNone];
414 OOGL(glDisable(GL_FOG));
415 OOGL(glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA));
418 OOGL(glDisable(GL_BLEND));
419 OOGL(glDepthMask(GL_TRUE));
422 OOGL(glEnableClientState(GL_NORMAL_ARRAY));
435 shaderMode = kShaderModeUnknown;
446- (NSString *) descriptionForObjDump
449 return [
self descriptionForObjDumpBasic];
#define OO_ENTER_OPENGL()
#define OOVerifyOpenGLState()
BOOL OOCheckOpenGLErrors(NSString *format,...)
void GLScaledLineWidth(GLfloat width)
#define OOSetOpenGLState(STATE)
void GLScaledPointSize(GLfloat size)
#define HYPERSPEED_FACTOR
OOColor * colorWithRed:green:blue:alpha:(float red,[green] float green,[blue] float blue,[alpha] float alpha)
void registerClient:(id< OOGraphicsResetClient > client)
void unregisterClient:(id< OOGraphicsResetClient > client)
OOGraphicsResetManager * sharedManager()
OOOpenGLExtensionManager * sharedManager()
BOOL haveExtension:(NSString *extension)
id textureWithName:inFolder:options:anisotropy:lodBias:(NSString *name,[inFolder] NSString *directory,[options] OOTextureFlags options,[anisotropy] GLfloat anisotropy,[lodBias] GLfloat lodBias)
void resetGraphicsState()