Oolite
Loading...
Searching...
No Matches
OOSkyDrawable Class Reference

#include <OOSkyDrawable.h>

+ Inheritance diagram for OOSkyDrawable:
+ Collaboration diagram for OOSkyDrawable:

Instance Methods

(id) - initWithColor1:Color2:Color3:Color4:starCount:nebulaCount:nebulaHueFix:clusterFactor:alpha:scale:
 
(void) - dealloc [implementation]
 
(void) - renderOpaqueParts [implementation]
 
(BOOL) - hasOpaqueParts [implementation]
 
(GLfloat) - maxDrawDistance [implementation]
 
(NSSet *) - allTextures [implementation]
 
(size_t) - totalSize [implementation]
 
(void) - setUpStarsWithColor1:color2: [implementation]
 
(void) - setUpNebulaeWithColor1:color2:clusterFactor:nebulaHueFix:alpha:scale: [implementation]
 
(void) - loadStarTextures [implementation]
 
(void) - loadNebulaTextures [implementation]
 
(void) - addQuads:count: [implementation]
 
(void) - ensureTexturesLoaded [implementation]
 
(void) - resetGraphicsState [implementation]
 
- Instance Methods inherited from OODrawable
(void) - renderTranslucentParts
 
(BOOL) - hasTranslucentParts
 
(GLfloat) - collisionRadius
 
(BoundingBox) - boundingBox
 
(void) - setBindingTarget:
 
(void) - dumpSelfState
 

Private Attributes

unsigned _starCount
 
unsigned _nebulaCount
 
NSMutableArray * _quadSets
 
GLint _displayListName
 

Detailed Description

Definition at line 36 of file OOSkyDrawable.h.

Method Documentation

◆ addQuads:count:

- (void) addQuads: (OOSkyQuadDesc *)  quads
count: (unsigned)  count 
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

441 :(OOSkyQuadDesc *)quads count:(unsigned)count
442{
443 if (_quadSets == nil) _quadSets = [[NSMutableArray alloc] init];
444
445 [OOSkyQuadSet addQuads:quads count:count toArray:_quadSets];
446}
unsigned count
return nil
void addQuads:count:toArray:(OOSkyQuadDesc *quads,[count] unsigned count,[toArray] NSMutableArray *ioArray)

◆ allTextures

- (NSSet *) allTextures
implementation

Reimplemented from OODrawable.

Definition at line 83 of file OOSkyDrawable.m.

256{
257 NSMutableSet *result = [NSMutableSet setWithCapacity:[_quadSets count]];
258
259 OOSkyQuadSet *quadSet = nil;
260 foreach (quadSet, _quadSets)
261 {
262 [result addObject:[quadSet texture]];
263 }
264
265 return result;
266}
NSMutableArray * _quadSets
OOTexture * texture()

◆ dealloc

- (void) dealloc
implementation

Definition at line 83 of file OOSkyDrawable.m.

183{
185
186 [_quadSets release];
188 if (_displayListName != 0) glDeleteLists(_displayListName, 1);
189
190 [super dealloc];
191}
#define OO_ENTER_OPENGL()
void unregisterClient:(id< OOGraphicsResetClient > client)
OOGraphicsResetManager * sharedManager()
GLint _displayListName

◆ ensureTexturesLoaded

- (void) ensureTexturesLoaded
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

490{
491 [sStarTextures ensureTexturesLoaded];
492 [sNebulaTextures ensureTexturesLoaded];
493}

◆ hasOpaqueParts

- (BOOL) hasOpaqueParts
implementation

Reimplemented from OODrawable.

Definition at line 83 of file OOSkyDrawable.m.

244{
245 return YES;
246}

◆ initWithColor1:Color2:Color3:Color4:starCount:nebulaCount:nebulaHueFix:clusterFactor:alpha:scale:

- (id) initWithColor1: (OOColor *)  color1
Color2: (OOColor *)  color2
Color3: (OOColor *)  color3
Color4: (OOColor *)  color4
starCount: (unsigned)  starCount
nebulaCount: (unsigned)  nebulaCount
nebulaHueFix: (BOOL)  nebulaHueFix
clusterFactor: (float)  nebulaClusterFactor
alpha: (float)  nebulaAlpha
scale: (float)  nebulaScale 

Definition at line 83 of file OOSkyDrawable.m.

133 :(OOColor *)color1
134 Color2:(OOColor *)color2
135 Color3:(OOColor *)color3
136 Color4:(OOColor *)color4
137 starCount:(unsigned)starCount
138 nebulaCount:(unsigned)nebulaCount
139 nebulaHueFix:(BOOL)nebulaHueFix
140 clusterFactor:(float)nebulaClusterFactor
141 alpha:(float)nebulaAlpha
142 scale:(float)nebulaScale
143{
144 NSAutoreleasePool *pool = nil;
145
146 if (!sInited)
147 {
148 sInited = YES;
149 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"sky-render-inset-coords"])
150 {
151 sMinTexCoord += 1.0f/128.0f;
152 sMaxTexCoord -= 1.0f/128.0f;
153 }
154 }
155
156 self = [super init];
157 if (self == nil) return nil;
158
159 _starCount = starCount;
160 _nebulaCount = nebulaCount;
161
162 pool = [[NSAutoreleasePool alloc] init];
163 [self setUpStarsWithColor1:color1 color2:color2];
164
165 if (![UNIVERSE reducedDetail])
166 {
167 [self setUpNebulaeWithColor1:color3
168 color2:color4
169 clusterFactor:nebulaClusterFactor
170 nebulaHueFix:nebulaHueFix
171 alpha:nebulaAlpha
172 scale:nebulaScale];
173 }
174 [pool release];
175
177
178 return self;
179}
static BOOL sInited
static float sMaxTexCoord
static float sMinTexCoord
#define UNIVERSE
Definition Universe.h:842
void registerClient:(id< OOGraphicsResetClient > client)
unsigned _nebulaCount
unsigned _starCount

◆ loadNebulaTextures

- (void) loadNebulaTextures
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

470{
471 if (sNebulaTextures == nil)
472 {
474 initWithPListName:@"nebulatextures.plist"
475 options:kOOTextureDefaultOptions | kOOTextureAlphaMask
476 anisotropy:0.0f
477 lodBias:0.0f];
478 if (sNebulaTextures == nil)
479 {
480 [NSException raise:OOLITE_EXCEPTION_DATA_NOT_FOUND format:@"No nebula textures could be loaded."];
481 }
482 }
483
484 [sNebulaTextures setSeed:RANROTGetFullSeed()];
485
486}
static OOProbabilisticTextureManager * sNebulaTextures

◆ loadStarTextures

- (void) loadStarTextures
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

450{
451 if (sStarTextures == nil)
452 {
454 initWithPListName:@"startextures.plist"
455 options:kOOTextureMinFilterMipMap | kOOTextureMagFilterLinear | kOOTextureAlphaMask
456 anisotropy:0.0f
457 lodBias:-0.0f];
458 if (sStarTextures == nil)
459 {
460 [NSException raise:OOLITE_EXCEPTION_DATA_NOT_FOUND format:@"No star textures could be loaded."];
461 }
462 }
463
464 [sStarTextures setSeed:RANROTGetFullSeed()];
465
466}
static OOProbabilisticTextureManager * sStarTextures

◆ maxDrawDistance

- (GLfloat) maxDrawDistance
implementation

Reimplemented from OODrawable.

Definition at line 83 of file OOSkyDrawable.m.

250{
251 return INFINITY;
252}

◆ renderOpaqueParts

- (void) renderOpaqueParts
implementation

Reimplemented from OODrawable.

Definition at line 83 of file OOSkyDrawable.m.

195{
196 // While technically translucent, the sky doesn't need to be depth-sorted
197 // since it'll be behind everything else anyway.
198
201
202 OOGL(glDisable(GL_DEPTH_TEST)); // don't read the depth buffer
203 OOGL(glEnable(GL_TEXTURE_2D));
204
205 // Make stars dim in atmosphere. Note: works OK on night side because sky is dark blue, not black.
206 GLfloat fogColor[4] = {0.02, 0.02, 0.02, 1.0};
207 OOGL(glFogfv(GL_FOG_COLOR, fogColor));
208
209 if (_displayListName != 0)
210 {
211 OOGL(glCallList(_displayListName));
212 }
213 else
214 {
215 // Set up display list
216 [self ensureTexturesLoaded];
217 _displayListName = glGenLists(1);
218
219 OOGL(glNewList(_displayListName, GL_COMPILE));
220
221 OOGL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
222 OOGL(glEnableClientState(GL_COLOR_ARRAY));
223
224 [_quadSets makeObjectsPerformSelector:@selector(render)];
225
226 OOGL(glDisableClientState(GL_TEXTURE_COORD_ARRAY));
227 OOGL(glDisableClientState(GL_COLOR_ARRAY));
228
229 OOGL(glEndList());
230 }
231
232 // Restore state
233 OOGL(glEnable(GL_DEPTH_TEST));
234 OOGL(glDisable(GL_TEXTURE_2D));
235
236 // Resetting fog is draw loop's responsibility.
237
239 OOCheckOpenGLErrors(@"OOSkyDrawable after rendering");
240}
@ OPENGL_STATE_ADDITIVE_BLENDING
Definition OOOpenGL.h:125
#define OOVerifyOpenGLState()
Definition OOOpenGL.h:136
BOOL OOCheckOpenGLErrors(NSString *format,...)
Definition OOOpenGL.m:39
#define OOSetOpenGLState(STATE)
Definition OOOpenGL.h:135
#define OOGL(statement)
Definition OOOpenGL.h:251

◆ resetGraphicsState

- (void) resetGraphicsState
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

497{
499
500 if (_displayListName != 0)
501 {
502 glDeleteLists(_displayListName, 1);
503 _displayListName = 0;
504 }
505}

◆ setUpNebulaeWithColor1:color2:clusterFactor:nebulaHueFix:alpha:scale:

- (void) setUpNebulaeWithColor1: (OOColor *)  color1
color2: (OOColor *)  color2
clusterFactor: (float)  nebulaClusterFactor
nebulaHueFix: (BOOL)  nebulaHueFix
alpha: (float)  nebulaAlpha
scale: (float)  nebulaScale 
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

349 :(OOColor *)color1
350 color2:(OOColor *)color2
351 clusterFactor:(float)nebulaClusterFactor
352 nebulaHueFix:(BOOL)nebulaHueFix
353 alpha:(float)nebulaAlpha
354 scale:(float)nebulaScale
355{
356 OOSkyQuadDesc *quads = NULL, *currQuad = NULL;
357 unsigned i, actualCount = 0;
358 OOColor *color;
359 Quaternion q;
360 Vector vi, vj, vk;
361 double size, r2;
362 Vector middle, offset;
363 int r1;
364
365 [self loadNebulaTextures];
366
367 quads = malloc(sizeof *quads * _nebulaCount);
368 if (quads == NULL) return;
369
370 currQuad = quads;
371 for (i = 0; i < _nebulaCount; ++i)
372 {
373 color = SaturatedColorInRange(color1, color2, nebulaHueFix);
374
375 // Select a direction and rotation.
376 q = OORandomQuaternion();
377
378 // Create a cluster of nebula quads.
379 while ((i < _nebulaCount) && (randf() < nebulaClusterFactor))
380 {
381 // Select size.
382 r1 = 1 + (ranrot_rand() & 15);
383 size = nebulaScale * r1 * SKY_ELEMENT_SCALE_FACTOR;
384
385 // Calculate centre position and offset to first corner.
386 basis_vectors_from_quaternion(q, &vi, &vj, &vk);
387
388 // Select colour and texture. Smaller nebula quads are dimmer.
389#if DEBUG_COLORS
390 currQuad->color = DebugColor(vk);
391#else
392 currQuad->color = [color colorWithBrightnessFactor:nebulaAlpha * (0.5f + (float)r1 / 32.0f)];
393#endif
394 currQuad->texture = [sNebulaTextures selectTexture]; // Not retained, since sStarTextures is never released.
395
396 middle = vector_multiply_scalar(vk, BILLBOARD_DEPTH);
397 offset = vector_multiply_scalar(vector_add(vi, vj), 0.5f * size);
398
399 // Rotate vi and vj by a random angle
400 r2 = randf() * M_PI * 2.0;
404
405 // Scale the "side" vectors.
406 vj = vector_multiply_scalar(vj, size);
407 vi = vector_multiply_scalar(vi, size);
408
409 // Set up corners.
410 currQuad->corners[0] = vector_subtract(middle, offset);
411 currQuad->corners[1] = vector_add(currQuad->corners[0], vj);
412 currQuad->corners[2] = vector_add(currQuad->corners[1], vi);
413 currQuad->corners[3] = vector_add(currQuad->corners[0], vi);
414
415 // Shuffle direction quat around a bit to spread the cluster out.
417 q.x += size * (randf() - 0.5);
418 q.y += size * (randf() - 0.5);
419 q.z += size * (randf() - 0.5);
420 q.w += size * (randf() - 0.5);
421 quaternion_normalize(&q);
422
423 ++i;
424 ++currQuad;
425 ++actualCount;
426 }
427 }
428
429 /* The above code generates less than _nebulaCount quads, because i is
430 incremented once in the outer loop as well as in the inner loop. To
431 keep skies looking the same, we leave the bug in and fill in the
432 actual generated count here.
433 */
434 _nebulaCount = actualCount;
435
436 [self addQuads:quads count:_nebulaCount];
437 free(quads);
438}
#define M_PI
Definition OOMaths.h:73
Vector vector_up_from_quaternion(Quaternion quat)
Vector vector_right_from_quaternion(Quaternion quat)
void basis_vectors_from_quaternion(Quaternion quat, Vector *outRight, Vector *outUp, Vector *outForward)
void quaternion_rotate_about_axis(Quaternion *quat, Vector axis, OOScalar angle)
#define SKY_ELEMENT_SCALE_FACTOR
#define NEBULA_SHUFFLE_FACTOR
static OOColor * SaturatedColorInRange(OOColor *color1, OOColor *color2, BOOL hueFix)
#define BILLBOARD_DEPTH
Definition Universe.h:163
OOColor * colorWithBrightnessFactor:(float factor)
Definition OOColor.m:502
voidpf void uLong size
Definition ioapi.h:134
voidpf uLong offset
Definition ioapi.h:140
float randf(void)
#define ranrot_rand()

◆ setUpStarsWithColor1:color2:

- (void) setUpStarsWithColor1: (OOColor *)  color1
color2: (OOColor *)  color2 
implementation

Provided by category OOSkyDrawable(OOPrivate).

Definition at line 83 of file OOSkyDrawable.m.

297 :(OOColor *)color1 color2:(OOColor *)color2
298{
299 OOSkyQuadDesc *quads = NULL, *currQuad = NULL;
300 unsigned i;
301 Quaternion q;
302 Vector vi, vj, vk;
303 float size;
304 Vector middle, offset;
305
306 [self loadStarTextures];
307
308 quads = malloc(sizeof *quads * _starCount);
309 if (quads == NULL) return;
310
311 currQuad = quads;
312 for (i = 0; i != _starCount; ++i)
313 {
314 // Select a direction and rotation.
315 q = OORandomQuaternion();
316 basis_vectors_from_quaternion(q, &vi, &vj, &vk);
317
318 // Select colour and texture.
319#if DEBUG_COLORS
320 currQuad->color = DebugColor(vk);
321#else
322 currQuad->color = [color1 blendedColorWithFraction:randf() ofColor:color2];
323#endif
324 currQuad->texture = [sStarTextures selectTexture]; // Not retained, since sStarTextures is never released.
325
326 // Select scale; calculate centre position and offset to first corner.
327 size = (1 + (ranrot_rand() % 6)) * SKY_ELEMENT_SCALE_FACTOR;
328 middle = vector_multiply_scalar(vk, BILLBOARD_DEPTH);
329 offset = vector_multiply_scalar(vector_add(vi, vj), 0.5f * size);
330
331 // Scale the "side" vectors.
332 Vector vj2 = vector_multiply_scalar(vj, size);
333 Vector vi2 = vector_multiply_scalar(vi, size);
334
335 // Set up corners.
336 currQuad->corners[0] = vector_subtract(middle, offset);
337 currQuad->corners[1] = vector_add(currQuad->corners[0], vj2);
338 currQuad->corners[2] = vector_add(currQuad->corners[1], vi2);
339 currQuad->corners[3] = vector_add(currQuad->corners[0], vi2);
340
341 ++currQuad;
342 }
343
344 [self addQuads:quads count:_starCount];
345 free(quads);
346}
OOColor * blendedColorWithFraction:ofColor:(float fraction,[ofColor] OOColor *color)
Definition OOColor.m:328

◆ totalSize

- (size_t) totalSize
implementation

Reimplemented from OODrawable.

Definition at line 83 of file OOSkyDrawable.m.

270{
271 size_t result = [super totalSize];
272
273 OOSkyQuadSet *quadSet = nil;
274 foreach (quadSet, _quadSets)
275 {
276 result += [quadSet totalSize];
277 }
278
279 return result;
280}

Member Data Documentation

◆ _displayListName

- (GLint) _displayListName
private

Definition at line 44 of file OOSkyDrawable.h.

◆ _nebulaCount

- (unsigned) _nebulaCount
private

Definition at line 40 of file OOSkyDrawable.h.

◆ _quadSets

- (NSMutableArray*) _quadSets
private

Definition at line 42 of file OOSkyDrawable.h.

◆ _starCount

- (unsigned) _starCount
private

Definition at line 39 of file OOSkyDrawable.h.


The documentation for this class was generated from the following files: