From 4d9f8efb445301405d71154d3e4df6c103e48cd7 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 16 Dec 2009 15:05:36 +0000 Subject: [PATCH] - Planet textures: corrected wrapping method for latitude, minor code cleanup. git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@2886 127b21dd-08f5-0310-b4b7-95ae10353056 --- src/Core/Materials/OOPlanetTextureGenerator.m | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Core/Materials/OOPlanetTextureGenerator.m b/src/Core/Materials/OOPlanetTextureGenerator.m index 0770abf0..c89eed5c 100644 --- a/src/Core/Materials/OOPlanetTextureGenerator.m +++ b/src/Core/Materials/OOPlanetTextureGenerator.m @@ -80,6 +80,8 @@ enum @end +static int heightMask, widthMask; + static FloatRGB FloatRGBFromDictColor(NSDictionary *dictionary, NSString *key); static void FillNoiseBuffer(float *noiseBuffer, RANROTSeed seed); @@ -123,7 +125,7 @@ enum _planetScale = 3; // 1024x1024 } #else - _planetScale = 5; + _planetScale = 5; //4096x4096 #endif } @@ -256,6 +258,8 @@ enum height = 1 << (_planetScale + kPlanetScaleOffset); width = height * kPlanetAspectRatio; + heightMask = height - 1; + widthMask = width - 1; buffer = malloc(4 * width * height); if (buffer == NULL) goto END; @@ -541,14 +545,19 @@ static void AddNoise(float *buffer, unsigned width, unsigned height, float octav static float QFactor(float *accbuffer, int x, int y, unsigned width, unsigned height, float rHeight, float polar_y_value, float bias) { - x = (x + width) & (width - 1); - // FIXME: wrong wrapping mode for Y, should flip to other hemisphere. - y = (y + height) & (height - 1); + // Correct Y wrapping mode, unoptimised. + //if (y < 0) { y = -y; x += width / 2; } + //else if (y >= height) { y -= y + 1 - height; x += width / 2; } + + // Correct Y wrapping mode, faster method. In the following lines of code, both + // width and height are assumed to be powers of 2: 512, 1024, 2048, etc... + if (y & height) { y = (y ^ heightMask) & heightMask; x += width >> 1; } + x &= widthMask; float q = accbuffer[y * width + x]; // 0.0 -> 1.0 q += bias; - // Polar Y smooth. FIXME: float/int conversions. + // Polar Y smooth. float polar_y = (2.0f * y - height) * rHeight; polar_y *= polar_y; q = q * (1.0f - polar_y) + polar_y * polar_y_value;