33#import "MyOpenGLView.h"
40#define DEBUG_DUMP ( 0 && OOLITE_DEBUG)
51 OOColor *color = [dictionary objectForKey:key];
56 OOLog(
@"textureStore.FloatRGBFromDictColor.nilColor",
@"Expected color for key \"%@\
" in dictionary %@, got nil. Setting color to %@", key, dictionary, [color rgbaDescription]);
58 NSCAssert1([color isKindOfClass:[
OOColor class]],
@"Expected OOColor, got %@", [color
class]);
68 OOLerp(a.
r, b.
r, fraction),
69 OOLerp(a.
g, b.
g, fraction),
70 OOLerp(a.
b, b.
b, fraction)
77 const FloatRGB kWhite = { 1.0, 1.0, 1.0 };
78 float maxq = impress + bias;
80 float hi = 0.66667 * maxq;
82 float ih = 1.0 / (1.0 - hi);
90 return (
FloatRGB){ 1.0f, 1.0f, 1.0f };
94 return Blend(q * 100.0f, paleSeaColor, landColor);
98 return Blend((q - hi) * ih, paleLandColor, kWhite);
101 return Blend((hi - q) * oh, paleLandColor, landColor);
112#define PROC_TEXTURE_SIZE 512
114+ (BOOL) getPlanetTextureNameFor:(NSDictionary *)planetInfo intoData:(
unsigned char **)textureData width:(GLuint *)textureWidth height:(GLuint *)textureHeight
119 int tex_bytes = texture_w * texture_h * 4;
121 NSParameterAssert(textureData != NULL && textureWidth != NULL && textureHeight != NULL);
123 unsigned char *imageBuffer = malloc(tex_bytes);
124 if (imageBuffer == NULL)
return NO;
126 *textureData = imageBuffer;
127 *textureWidth = texture_w;
128 *textureHeight = texture_h;
130 float land_fraction = [[planetInfo objectForKey:@"land_fraction"] floatValue];
131 float sea_bias = land_fraction - 1.0;
141 FloatRGB pale_sea_color =
Blend(0.45, polar_sea_color,
Blend(0.7, sea_color, land_color));
153+ (BOOL) getCloudTextureNameFor:(
OOColor*)color :(GLfloat)impress :(GLfloat)bias intoData:(
unsigned char **)textureData width:(GLuint *)textureWidth height:(GLuint *)textureHeight
159 tex_bytes = texture_w * texture_h * 4;
161 NSParameterAssert(textureData != NULL && textureWidth != NULL && textureHeight != NULL);
163 unsigned char *imageBuffer = malloc(tex_bytes);
164 if (imageBuffer == NULL)
return NO;
166 *textureData = imageBuffer;
167 *textureWidth = texture_w;
168 *textureHeight = texture_h;
186 for (i = 0; i < 16384; i++)
191static void addNoise(
float * buffer,
int p,
int n,
float scale)
195 float r = (float)p / (
float)n;
196 for (
y = 0;
y < p;
y++)
for (
x = 0;
x < p;
x++)
198 int ix = floor( (
float)
x / r);
199 int jx = (ix + 1) % n;
200 int iy = floor( (
float)
y / r);
201 int jy = (iy + 1) % n;
202 float qx =
x / r - ix;
203 float qy =
y / r - iy;
210 float rfinal = scale * OOLerp(rix, rjx, qy);
212 buffer[y * p + x] += rfinal;
217static float q_factor(
float* accbuffer,
int x,
int y,
int width, BOOL polar_y_smooth,
float polar_y_value, BOOL polar_x_smooth,
float polar_x_value,
float impress,
float bias)
219 while (
x < 0 )
x+= width;
220 while (
y < 0 )
y+= width;
221 while (
x >= width )
x-= width;
222 while (
y >= width )
y-= width;
224 float q = accbuffer[ y * width + x];
229 float polar_y = (2.0f *
y - width) / (
float) width;
230 float polar_x = (2.0f *
x - width) / (
float) width;
236 q = q * (1.0 - polar_x) + polar_x * polar_x_value;
238 q = q * (1.0 - polar_y) + polar_y * polar_y_value;
240 if (q > 1.0) q = 1.0;
241 if (q < 0.0) q = 0.0;
249 NSCParameterAssert(width > 0);
251 float accbuffer[width * width];
252 memset(accbuffer, 0,
sizeof accbuffer);
263 while (octave < width)
265 addNoise(accbuffer, width, octave, scale);
270 float pole_value = (impress * accbuffer[0] - bias < 0.0)? 0.0: 1.0;
272 for (
y = 0;
y < width;
y++)
for (
x = 0;
x < width;
x++)
274 float q =
q_factor(accbuffer,
x,
y, width, YES, pole_value, NO, 0.0, impress, bias);
276 imageBuffer[0 + 4 * (y * width + x) ] = 255 * rgba[0];
277 imageBuffer[1 + 4 * (y * width + x) ] = 255 * rgba[1];
278 imageBuffer[2 + 4 * (y * width + x) ] = 255 * rgba[2];
279 imageBuffer[3 + 4 * (y * width + x) ] = 255 * rgba[3] * q;
282 NSString *name = [NSString stringWithFormat:@"atmosphere-%u-%u-old", sNoiseSeed.high, sNoiseSeed.low];
283 OOLog(
@"planetTex.dump", [NSString stringWithFormat:
@"Saving generated texture to file %@.", name]);
285 [[UNIVERSE gameView] dumpRGBAToFileNamed:name
299 float accbuffer[width * width];
300 memset(accbuffer, 0,
sizeof accbuffer);
304 while (octave < width)
306 addNoise(accbuffer, width, octave, scale);
311 float pole_value = (impress + bias > 0.5)? 0.5 * (impress + bias) : 0.0;
314 for (
y = 0;
y < width;
y++)
for (
x = 0;
x < width;
x++)
316 float q =
q_factor(accbuffer,
x,
y, width, YES, pole_value, NO, 0.0, impress, bias);
318 float yN =
q_factor(accbuffer,
x,
y - 1, width, YES, pole_value, NO, 0.0, impress, bias);
319 float yS =
q_factor(accbuffer,
x,
y + 1, width, YES, pole_value, NO, 0.0, impress, bias);
320 float yW =
q_factor(accbuffer,
x - 1,
y, width, YES, pole_value, NO, 0.0, impress, bias);
321 float yE =
q_factor(accbuffer,
x + 1,
y, width, YES, pole_value, NO, 0.0, impress, bias);
323 Vector norm = make_vector( 24.0 * (yW - yE), 24.0 * (yS - yN), 2.0);
325 norm = vector_normal(norm);
327 GLfloat shade = pow(norm.z, 3.2);
335 imageBuffer[0 + 4 * (y * width + x)] = 255 * color.
r;
336 imageBuffer[1 + 4 * (y * width + x)] = 255 * color.
g;
337 imageBuffer[2 + 4 * (y * width + x)] = 255 * color.
b;
338 imageBuffer[3 + 4 * (y * width + x)] = 255;
343 [[UNIVERSE gameView] dumpRGBAToFileNamed:[NSString stringWithFormat:@"planet-%u-%u-old", sNoiseSeed.high, sNoiseSeed.low]
#define OOLog(class, format,...)
static RANROTSeed sNoiseSeed
static FloatRGB PlanetTextureColor(float q, float impress, float bias, FloatRGB seaColor, FloatRGB paleSeaColor, FloatRGB landColor, FloatRGB paleLandColor)
static float ranNoiseBuffer[128 *128]
static FloatRGB FloatRGBFromDictColor(NSDictionary *dictionary, NSString *key)
static float q_factor(float *accbuffer, int x, int y, int width, BOOL polar_y_smooth, float polar_y_value, BOOL polar_x_smooth, float polar_x_value, float impress, float bias)
static void fillSquareImageDataWithCloudTexture(unsigned char *imageBuffer, int width, OOColor *cloudcolor, float impress, float bias)
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b)
static void fillSquareImageWithPlanetTex(unsigned char *imageBuffer, int width, float impress, float bias, FloatRGB seaColor, FloatRGB paleSeaColor, FloatRGB landColor, FloatRGB paleLandColor)
static void addNoise(float *buffer, int p, int n, float scale)
#define PROC_TEXTURE_SIZE
void fillRanNoiseBuffer()
static NSString *const kOOLogPlanetTextureGen
OOColor * colorWithDescription:(id description)
RANROTSeed RANROTGetFullSeed(void)