Oolite 1.91.0.7644-241112-7f5034b
Loading...
Searching...
No Matches
SkyEntity.m
Go to the documentation of this file.
1/*
2
3SkyEntity.m
4
5Oolite
6Copyright (C) 2004-2013 Giles C Williams and contributors
7
8This program is free software; you can redistribute it and/or
9modify it under the terms of the GNU General Public License
10as published by the Free Software Foundation; either version 2
11of the License, or (at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21MA 02110-1301, USA.
22
23*/
24
25
26#import "SkyEntity.h"
27#import "OOSkyDrawable.h"
28#import "PlayerEntity.h"
29
30#import "OOMaths.h"
31#import "Universe.h"
32#import "MyOpenGLView.h"
33#import "OOColor.h"
34#import "OOStringParsing.h"
36#import "OOMaterial.h"
37
38
39#define SKY_BASIS_STARS 4800
40#define SKY_BASIS_BLOBS 1280
41#define SKY_clusterChance 0.80
42#define SKY_alpha 0.10
43#define SKY_scale 10.0
44
45
46@interface SkyEntity (OOPrivate)
47
48- (BOOL)readColor1:(OOColor **)ioColor1 andColor2:(OOColor **)ioColor2 andColor3:(OOColor **)ioColor3 andColor4:(OOColor **)ioColor4 fromDictionary:(NSDictionary *)dictionary;
49
50@end
51
52
53@implementation SkyEntity
54
55- (id) initWithColors:(OOColor *)col1 :(OOColor *)col2 andSystemInfo:(NSDictionary *)systemInfo
56{
57 OOSkyDrawable *skyDrawable;
58 float clusterChance,
59 alpha,
60 scale,
61 starCountMultiplier,
62 nebulaCountMultiplier;
63 signed starCount, // Need to be able to hold -1...
64 nebulaCount;
65
66 self = [super init];
67 if (self == nil) return nil;
68
71
72 // Load colours
73 BOOL nebulaColorSet = [self readColor1:&col1 andColor2:&col2 andColor3:&col3 andColor4:&col4 fromDictionary:systemInfo];
74
75 skyColor = [[OOColor colorWithDescription:[systemInfo objectForKey:@"sun_color"]] retain];
76 if (skyColor == nil)
77 {
78 skyColor = [[col2 blendedColorWithFraction:0.5 ofColor:col1] retain];
79 }
80
81 // Load distribution values
82 clusterChance = [systemInfo oo_floatForKey:@"sky_blur_cluster_chance" defaultValue:SKY_clusterChance];
83 alpha = [systemInfo oo_floatForKey:@"sky_blur_alpha" defaultValue:SKY_alpha];
84 scale = [systemInfo oo_floatForKey:@"sky_blur_scale" defaultValue:SKY_scale];
85
86 // Load star count
87 starCount = [systemInfo oo_floatForKey:@"sky_n_stars" defaultValue:-1];
88 starCountMultiplier = [systemInfo oo_floatForKey:@"star_count_multiplier" defaultValue:1.0f];
89 if (starCountMultiplier < 0.0f) starCountMultiplier *= -1.0f;
90 if (0 <= starCount)
91 {
92 // changed for 1.82, default set to 1
93 // lets OXPers modify the broad number without stopping variation
94 starCount *= starCountMultiplier;
95 }
96 else
97 {
98 starCount = starCountMultiplier * SKY_BASIS_STARS * (0.5 + randf());
99 }
100
101 // ...and nebula count. (Note: simplifying this would change the appearance of stars/blobs.)
102 nebulaCount = [systemInfo oo_floatForKey:@"sky_n_blurs" defaultValue:-1];
103 nebulaCountMultiplier = [systemInfo oo_floatForKey:@"nebula_count_multiplier" defaultValue:1.0f];
104 if (nebulaCountMultiplier < 0.0f) nebulaCountMultiplier *= -1.0f;
105 if (0 <= nebulaCount)
106 {
107 // changed for 1.82, default set to 1
108 // lets OXPers modify the broad number without stopping variation
109 nebulaCount *= nebulaCountMultiplier;
110 }
111 else
112 {
113 nebulaCount = nebulaCountMultiplier * SKY_BASIS_BLOBS * (0.5 + randf());
114 }
115
116 if ([UNIVERSE reducedDetail])
117 {
118 // limit stars and blobs to basis levels, and halve stars again
119 if (starCount > SKY_BASIS_STARS)
120 {
121 starCount = SKY_BASIS_STARS;
122 }
123 starCount /= 2;
124 if (nebulaCount > SKY_BASIS_BLOBS)
125 {
126 nebulaCount = SKY_BASIS_BLOBS;
127 }
128 }
129
130 skyDrawable = [[OOSkyDrawable alloc]
131 initWithColor1:col1
132 Color2:col2
133 Color3:col3
134 Color4:col4
135 starCount:starCount
136 nebulaCount:nebulaCount
137 nebulaHueFix:nebulaColorSet
138 clusterFactor:clusterChance
139 alpha:alpha
140 scale:scale];
141 [self setDrawable:skyDrawable];
142 [skyDrawable release];
143
144 [self setStatus:STATUS_EFFECT];
145
146 return self;
147}
148
149
150- (void) dealloc
151{
152 [skyColor release];
153
154 [super dealloc];
155}
156
157
158- (OOColor *) skyColor
159{
160 return skyColor;
161}
162
163
164- (BOOL) changeProperty:(NSString *)key withDictionary:(NSDictionary*)dict
165{
166 id object = [dict objectForKey:key];
167
168 // TODO: properties requiring reInit?
169 if ([key isEqualToString:@"sun_color"])
170 {
171 OOColor *col=[[OOColor colorWithDescription:object] retain];
172 if (col != nil)
173 {
174 [skyColor release];
175 skyColor = [col copy];
176 [col release];
177 [UNIVERSE setLighting];
178 }
179 }
180 else
181 {
182 OOLogWARN(@"script.warning", @"Change to property '%@' not applied, will apply only on leaving and re-entering this system.",key);
183 return NO;
184 }
185 return YES;
186}
187
188
189- (void) update:(OOTimeDelta) delta_t
190{
191 PlayerEntity *player = PLAYER;
192 zero_distance = MAX_CLEAR_DEPTH * MAX_CLEAR_DEPTH;
193 cam_zero_distance = zero_distance;
194 if (player != nil)
195 {
196 position = [player viewpointPosition];
197 }
198 else
199 {
200 OOLog(@"sky.warning", @"%@", @"PLAYER is nil");
201 }
202}
203
204
205- (BOOL) isSky
206{
207 return YES;
208}
209
210
211- (BOOL) isVisible
212{
213 return YES;
214}
215
216
217- (BOOL) canCollide
218{
219 return NO;
220}
221
222
223- (GLfloat) cameraRangeFront
224{
225 return MAX_CLEAR_DEPTH;
226}
227
228
229- (GLfloat) cameraRangeBack
230{
231 return MAX_CLEAR_DEPTH;
232}
233
234
235- (void) drawImmediate:(bool)immediate translucent:(bool)translucent
236{
237 if ([UNIVERSE breakPatternHide]) return;
238
239 [super drawImmediate:immediate translucent:translucent];
240
241 OOCheckOpenGLErrors(@"SkyEntity after drawing %@", self);
242}
243
244
245#ifndef NDEBUG
246- (NSString *) descriptionForObjDump
247{
248 // Don't include range and visibility flag as they're irrelevant.
249 return [self descriptionForObjDumpBasic];
250}
251#endif
252
253@end
254
255
256@implementation SkyEntity (OOPrivate)
257
258- (BOOL)readColor1:(OOColor **)ioColor1 andColor2:(OOColor **)ioColor2 andColor3:(OOColor **)ioColor3 andColor4:(OOColor **)ioColor4 fromDictionary:(NSDictionary *)dictionary
259{
260 NSString *string = nil;
261 NSArray *tokens = nil;
262 id colorDesc = nil;
263 OOColor *color = nil;
264 BOOL nebulaSet = NO;
265
266 assert(ioColor1 != NULL && ioColor2 != NULL);
267
268 string = [dictionary oo_stringForKey:@"sky_rgb_colors"];
269 if (string != nil)
270 {
271 tokens = ScanTokensFromString(string);
272
273 if ([tokens count] == 6)
274 {
275 float r1 = OOClamp_0_1_f([tokens oo_floatAtIndex:0]);
276 float g1 = OOClamp_0_1_f([tokens oo_floatAtIndex:1]);
277 float b1 = OOClamp_0_1_f([tokens oo_floatAtIndex:2]);
278 float r2 = OOClamp_0_1_f([tokens oo_floatAtIndex:3]);
279 float g2 = OOClamp_0_1_f([tokens oo_floatAtIndex:4]);
280 float b2 = OOClamp_0_1_f([tokens oo_floatAtIndex:5]);
281 *ioColor1 = [OOColor colorWithRed:r1 green:g1 blue:b1 alpha:1.0];
282 *ioColor2 = [OOColor colorWithRed:r2 green:g2 blue:b2 alpha:1.0];
283 }
284 else
285 {
286 OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as two RGB colours (must be six numbers).", string);
287 }
288 }
289 colorDesc = [dictionary objectForKey:@"sky_color_1"];
290 if (colorDesc != nil)
291 {
292 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
293 if (color != nil) *ioColor1 = color;
294 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
295 }
296 colorDesc = [dictionary objectForKey:@"sky_color_2"];
297 if (colorDesc != nil)
298 {
299 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
300 if (color != nil) *ioColor2 = color;
301 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
302 }
303
304 colorDesc = [dictionary objectForKey:@"nebula_color_1"];
305 if (colorDesc != nil)
306 {
307 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
308 if (color != nil)
309 {
310 *ioColor3 = color;
311 nebulaSet = YES;
312 }
313 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
314 }
315 else
316 {
317 colorDesc = [dictionary objectForKey:@"sky_color_1"];
318 if (colorDesc != nil)
319 {
320 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
321 if (color != nil) *ioColor3 = color;
322 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
323 }
324 }
325
326 colorDesc = [dictionary objectForKey:@"nebula_color_2"];
327 if (colorDesc != nil)
328 {
329 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
330 if (color != nil)
331 {
332 *ioColor4 = color;
333 nebulaSet = YES;
334 }
335 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
336 }
337 else
338 {
339 colorDesc = [dictionary objectForKey:@"sky_color_2"];
340 if (colorDesc != nil)
341 {
342 color = [[OOColor colorWithDescription:colorDesc] premultipliedColor];
343 if (color != nil) *ioColor4 = color;
344 else OOLogWARN(@"sky.fromDict", @"could not interpret \"%@\" as a colour.", colorDesc);
345 }
346 }
347 return nebulaSet;
348}
349
350@end
#define MAX_CLEAR_DEPTH
#define OOLogWARN(class, format,...)
Definition OOLogging.h:113
#define OOLog(class, format,...)
Definition OOLogging.h:88
BOOL OOCheckOpenGLErrors(NSString *format,...)
Definition OOOpenGL.m:39
unsigned count
return nil
NSMutableArray * ScanTokensFromString(NSString *values)
double OOTimeDelta
Definition OOTypes.h:224
#define PLAYER
#define SKY_BASIS_STARS
Definition SkyEntity.m:39
#define SKY_BASIS_BLOBS
Definition SkyEntity.m:40
#define UNIVERSE
Definition Universe.h:833
id init()
Definition Entity.m:68
void setStatus:(OOEntityStatus stat)
Definition Entity.m:787
OOColor * colorWithRed:green:blue:alpha:(float red,[green] float green,[blue] float blue,[alpha] float alpha)
Definition OOColor.m:95
OOColor * colorWithDescription:(id description)
Definition OOColor.m:127
OOColor * premultipliedColor()
Definition OOColor.m:492
OOColor * blendedColorWithFraction:ofColor:(float fraction,[ofColor] OOColor *color)
Definition OOColor.m:328
void setDrawable:(OODrawable *drawable)
HPVector viewpointPosition()
BOOL readColor1:andColor2:andColor3:andColor4:fromDictionary:(OOColor **ioColor1,[andColor2] OOColor **ioColor2,[andColor3] OOColor **ioColor3,[andColor4] OOColor **ioColor4,[fromDictionary] NSDictionary *dictionary)
Definition SkyEntity.m:258
float randf(void)