351 clusterFactor:(float)nebulaClusterFactor
352 nebulaHueFix:(BOOL)nebulaHueFix
353 alpha:(float)nebulaAlpha
354 scale:(float)nebulaScale
355{
357 unsigned i, actualCount = 0;
359 Quaternion q;
360 Vector vi, vj, vk;
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 {
374
375
376 q = OORandomQuaternion();
377
378
379 while ((i < _nebulaCount) && (
randf() < nebulaClusterFactor))
380 {
381
384
385
387
388
389#if DEBUG_COLORS
390 currQuad->color = DebugColor(vk);
391#else
393#endif
394 currQuad->texture = [sNebulaTextures selectTexture];
395
397 offset = vector_multiply_scalar(vector_add(vi, vj), 0.5f *
size);
398
399
404
405
406 vj = vector_multiply_scalar(vj,
size);
407 vi = vector_multiply_scalar(vi,
size);
408
409
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
421 quaternion_normalize(&q);
422
423 ++i;
424 ++currQuad;
425 ++actualCount;
426 }
427 }
428
429
430
431
432
433
434 _nebulaCount = actualCount;
435
436 [self addQuads:quads count:_nebulaCount];
437 free(quads);
438}
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)
OOColor * colorWithBrightnessFactor:(float factor)