41#define SKY_ELEMENT_SCALE_FACTOR (BILLBOARD_DEPTH / 500.0f)
42#define NEBULA_SHUFFLE_FACTOR 0.005f
86+ (void)addQuads:(
OOSkyQuadDesc *)quads count:(
unsigned)count toArray:(NSMutableArray *)ioArray;
88- (id)initWithQuadsWithTexture:(
OOTexture *)texture inArray:(
OOSkyQuadDesc *)array count:(
unsigned)totalCount;
110@interface OOSkyDrawable (OOPrivate) <OOGraphicsResetClient>
112- (void)setUpStarsWithColor1:(
OOColor *)color1 color2:(
OOColor *)color2;
113- (void)setUpNebulaeWithColor1:(
OOColor *)color1
115 clusterFactor:(
float)nebulaClusterFactor
116 nebulaHueFix:(BOOL)nebulaHueFix
117 alpha:(
float)nebulaAlpha
118 scale:(
float)nebulaScale;
124- (void)addQuads:(
OOSkyQuadDesc *)quads count:(
unsigned)count;
137 starCount:(
unsigned)starCount
138 nebulaCount:(
unsigned)nebulaCount
139 nebulaHueFix:(BOOL)nebulaHueFix
140 clusterFactor:(
float)nebulaClusterFactor
141 alpha:(
float)nebulaAlpha
142 scale:(
float)nebulaScale
144 NSAutoreleasePool *pool =
nil;
149 if ([[NSUserDefaults standardUserDefaults] boolForKey:
@"sky-render-inset-coords"])
157 if (
self ==
nil)
return nil;
202 OOGL(glDisable(GL_DEPTH_TEST));
203 OOGL(glEnable(GL_TEXTURE_2D));
206 GLfloat fogColor[4] = {0.02, 0.02, 0.02, 1.0};
207 OOGL(glFogfv(GL_FOG_COLOR, fogColor));
221 OOGL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
222 OOGL(glEnableClientState(GL_COLOR_ARRAY));
224 [_quadSets makeObjectsPerformSelector:@selector(render)];
226 OOGL(glDisableClientState(GL_TEXTURE_COORD_ARRAY));
227 OOGL(glDisableClientState(GL_COLOR_ARRAY));
233 OOGL(glEnable(GL_DEPTH_TEST));
234 OOGL(glDisable(GL_TEXTURE_2D));
257 NSMutableSet *result = [
NSMutableSet setWithCapacity:[_quadSets count]];
259 NSEnumerator *quadSetEnum =
nil;
274 NSEnumerator *quadSetEnum =
nil;
289static OOColor *DebugColor(Vector orientation)
291 Vector color = vector_add(make_vector(0.55, 0.55, 0.55), vector_multiply_scalar(vector_normal(orientation), 0.45));
292 return [
OOColor colorWithCalibratedRed:color.x green:color.y blue:color.z alpha:1.0];
297@implementation OOSkyDrawable (OOPrivate)
310 quads = malloc(
sizeof *quads * _starCount);
311 if (quads == NULL)
return;
314 for (i = 0; i != _starCount; ++i)
317 q = OORandomQuaternion();
322 currQuad->color = DebugColor(vk);
331 offset = vector_multiply_scalar(vector_add(vi, vj), 0.5f *
size);
334 Vector vj2 = vector_multiply_scalar(vj,
size);
335 Vector vi2 = vector_multiply_scalar(vi,
size);
338 currQuad->corners[0] = vector_subtract(middle,
offset);
339 currQuad->corners[1] = vector_add(currQuad->corners[0], vj2);
340 currQuad->corners[2] = vector_add(currQuad->corners[1], vi2);
341 currQuad->corners[3] = vector_add(currQuad->corners[0], vi2);
351- (void)setUpNebulaeWithColor1:(
OOColor *)color1
353 clusterFactor:(
float)nebulaClusterFactor
354 nebulaHueFix:(BOOL)nebulaHueFix
355 alpha:(
float)nebulaAlpha
356 scale:(
float)nebulaScale
359 unsigned i, actualCount = 0, clusters = 0;
369 quads = malloc(
sizeof *quads * _nebulaCount);
370 if (quads == NULL)
return;
373 for (i = 0; i < _nebulaCount; ++i)
378 q = OORandomQuaternion();
381 while ((i < _nebulaCount) && (
randf() < nebulaClusterFactor))
392 currQuad->color = DebugColor(vk);
399 offset = vector_multiply_scalar(vector_add(vi, vj), 0.5f *
size);
408 vj = vector_multiply_scalar(vj,
size);
409 vi = vector_multiply_scalar(vi,
size);
412 currQuad->corners[0] = vector_subtract(middle,
offset);
413 currQuad->corners[1] = vector_add(currQuad->corners[0], vj);
414 currQuad->corners[2] = vector_add(currQuad->corners[1], vi);
415 currQuad->corners[3] = vector_add(currQuad->corners[0], vi);
423 quaternion_normalize(&q);
437 _nebulaCount = actualCount;
351- (void)setUpNebulaeWithColor1:(
OOColor *)color1 {
…}
457 initWithPListName:@"startextures.plist"
458 options:kOOTextureMinFilterMipMap | kOOTextureMagFilterLinear | kOOTextureAlphaMask
463 [
NSException raise:OOLITE_EXCEPTION_DATA_NOT_FOUND format:@"No star textures could be loaded."];
477 initWithPListName:@"nebulatextures.plist"
478 options:kOOTextureDefaultOptions | kOOTextureAlphaMask
483 [
NSException raise:OOLITE_EXCEPTION_DATA_NOT_FOUND format:@"No nebula textures could be loaded."];
503 if (_displayListName != 0)
505 glDeleteLists(_displayListName, 1);
506 _displayListName = 0;
515+ (void)addQuads:(
OOSkyQuadDesc *)quads count:(
unsigned)count toArray:(NSMutableArray *)ioArray
517 NSMutableSet *seenTextures =
nil;
524 for (i = 0; i !=
count; ++i)
529 if (![seenTextures containsObject:
texture])
534 quadSet = [[
self alloc] initWithQuadsWithTexture:texture
515+ (void)addQuads:(
OOSkyQuadDesc *)quads count:(
unsigned)count toArray:(NSMutableArray *)ioArray {
…}
550 unsigned i, j, vertexCount;
555 size_t posSize, tcSize, colSize;
557 int skyColorCorrection = [[
NSUserDefaults standardUserDefaults] oo_integerForKey:@"sky-color-correction" defaultValue:0];
561#define SKYCOLOR_TONEMAP_COMPONENT(skyColorComponent) \
563 x = MAX(0.0, skyColorComponent - 0.004); \
564 *col++ = (x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06); \
568 if (
self ==
nil) OK = NO;
573 for (i = 0; i != totalCount; ++i)
602 for (i = 0; i != totalCount; ++i)
606 r = [
array[
i].color redComponent];
607 g = [
array[
i].color greenComponent];
608 b = [
array[
i].color blueComponent];
611 for (j = 0; j != 4; ++j)
618 if (skyColorCorrection == 0)
624 else if (skyColorCorrection == 1)
626 *col++ = pow(r, 1.0/2.2);
627 *col++ = pow(g, 1.0/2.2);
628 *col++ = pow(b, 1.0/2.2);
657 OOLog(
@"sky.setup",
@"Generated quadset with %u quads for texture %@",
count,
_texture);
684 return [
NSString stringWithFormat:@"<%@ %p>{%u quads, texture: %@}", [
self class],
self, _count, _texture];
721 float hue, saturation, brightness, alpha;
726 saturation = 0.5 * saturation + 0.5;
#define OOLog(class, format,...)
#define OO_ENTER_OPENGL()
@ OPENGL_STATE_ADDITIVE_BLENDING
#define OOVerifyOpenGLState()
BOOL OOCheckOpenGLErrors(NSString *format,...)
#define OOSetOpenGLState(STATE)
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)
static float sMaxTexCoord
#define SKY_ELEMENT_SCALE_FACTOR
static float sMinTexCoord
@ kSkyQuadSetTexCoordEntriesPerVertex
@ kSkyQuadSetPositionEntriesPerVertex
@ kSkyQuadSetColorEntriesPerVertex
static OOProbabilisticTextureManager * sNebulaTextures
#define NEBULA_SHUFFLE_FACTOR
#define SKYCOLOR_TONEMAP_COMPONENT(skyColorComponent)
static OOProbabilisticTextureManager * sStarTextures
static OOColor * SaturatedColorInRange(OOColor *color1, OOColor *color2, BOOL hueFix)
void resetGraphicsState()
void loadNebulaTextures()
void ensureTexturesLoaded()
void getHue:saturation:brightness:alpha:(float *hue,[saturation] float *saturation,[brightness] float *brightness,[alpha] float *alpha)
OOColor * colorWithBrightnessFactor:(float factor)
OOColor * colorWithHue:saturation:brightness:alpha:(float hue,[saturation] float saturation,[brightness] float brightness,[alpha] float alpha)
OOColor * blendedColorWithFraction:ofColor:(float fraction,[ofColor] OOColor *color)
void registerClient:(id< OOGraphicsResetClient > client)
void unregisterClient:(id< OOGraphicsResetClient > client)
OOGraphicsResetManager * sharedManager()
void ensureTexturesLoaded()
void setSeed:(RANROTSeed seed)
OOTexture * selectTexture()
NSMutableArray * _quadSets
GLfloat maxDrawDistance()
void loadNebulaTextures()
void addQuads:count:(OOSkyQuadDesc *quads,[count] unsigned count)
void ensureTexturesLoaded()
void setUpStarsWithColor1:color2:(OOColor *color1,[color2] OOColor *color2)
void setUpNebulaeWithColor1:color2:clusterFactor:nebulaHueFix:alpha:scale:(OOColor *color1,[color2] OOColor *color2,[clusterFactor] float nebulaClusterFactor,[nebulaHueFix] BOOL nebulaHueFix,[alpha] float nebulaAlpha,[scale] float nebulaScale)
void addQuads:count:toArray:(OOSkyQuadDesc *quads,[count] unsigned count,[toArray] NSMutableArray *ioArray)