- yet more go-faster tweaks to the texture generator.
- integrated the previously separate atmosphere generator inside OOPlanetTextureGenerator, to avoid noise generator overheads. - added NEW_ATMOSPHERE compile-time switch to OOPlanetEntity. - tidying up of contract market generators: while they're still slow, some dead code was removed. git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@2918 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
parent
c0b6f16429
commit
bb93c112da
@ -181,7 +181,6 @@ OOLITE_GRAPHICS_MATERIAL_FILES = \
|
|||||||
OOMaterial.m \
|
OOMaterial.m \
|
||||||
OONullTexture.m \
|
OONullTexture.m \
|
||||||
OOPlanetTextureGenerator.m \
|
OOPlanetTextureGenerator.m \
|
||||||
OOCloudTextureGenerator.m \
|
|
||||||
OOPNGTextureLoader.m \
|
OOPNGTextureLoader.m \
|
||||||
OOShaderMaterial.m \
|
OOShaderMaterial.m \
|
||||||
OOShaderProgram.m \
|
OOShaderProgram.m \
|
||||||
|
@ -696,8 +696,6 @@
|
|||||||
2B13C521105D343900AF4A7B /* oolite-nova-system.png in Copy Images */ = {isa = PBXBuildFile; fileRef = 2B13C51E105D342D00AF4A7B /* oolite-nova-system.png */; };
|
2B13C521105D343900AF4A7B /* oolite-nova-system.png in Copy Images */ = {isa = PBXBuildFile; fileRef = 2B13C51E105D342D00AF4A7B /* oolite-nova-system.png */; };
|
||||||
2B4CDFEC107B3D8400526C98 /* OOJSManifest.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B4CDFEA107B3D8400526C98 /* OOJSManifest.h */; };
|
2B4CDFEC107B3D8400526C98 /* OOJSManifest.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B4CDFEA107B3D8400526C98 /* OOJSManifest.h */; };
|
||||||
2B4CDFED107B3D8400526C98 /* OOJSManifest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B4CDFEB107B3D8400526C98 /* OOJSManifest.m */; };
|
2B4CDFED107B3D8400526C98 /* OOJSManifest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B4CDFEB107B3D8400526C98 /* OOJSManifest.m */; };
|
||||||
2B6EB2DB10D03E08007EAC20 /* OOCloudTextureGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B6EB2D910D03E08007EAC20 /* OOCloudTextureGenerator.h */; };
|
|
||||||
2B6EB2DC10D03E08007EAC20 /* OOCloudTextureGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B6EB2DA10D03E08007EAC20 /* OOCloudTextureGenerator.m */; };
|
|
||||||
2B9A1089105D526200EE2AE6 /* javascript-errors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2B9A1088105D526200EE2AE6 /* javascript-errors.plist */; };
|
2B9A1089105D526200EE2AE6 /* javascript-errors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2B9A1088105D526200EE2AE6 /* javascript-errors.plist */; };
|
||||||
2B9A108A105D527C00EE2AE6 /* javascript-errors.plist in Copy Config */ = {isa = PBXBuildFile; fileRef = 2B9A1088105D526200EE2AE6 /* javascript-errors.plist */; };
|
2B9A108A105D527C00EE2AE6 /* javascript-errors.plist in Copy Config */ = {isa = PBXBuildFile; fileRef = 2B9A1088105D526200EE2AE6 /* javascript-errors.plist */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
@ -1813,8 +1811,6 @@
|
|||||||
2B13C51E105D342D00AF4A7B /* oolite-nova-system.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "oolite-nova-system.png"; sourceTree = "<group>"; };
|
2B13C51E105D342D00AF4A7B /* oolite-nova-system.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "oolite-nova-system.png"; sourceTree = "<group>"; };
|
||||||
2B4CDFEA107B3D8400526C98 /* OOJSManifest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOJSManifest.h; sourceTree = "<group>"; };
|
2B4CDFEA107B3D8400526C98 /* OOJSManifest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOJSManifest.h; sourceTree = "<group>"; };
|
||||||
2B4CDFEB107B3D8400526C98 /* OOJSManifest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OOJSManifest.m; sourceTree = "<group>"; };
|
2B4CDFEB107B3D8400526C98 /* OOJSManifest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OOJSManifest.m; sourceTree = "<group>"; };
|
||||||
2B6EB2D910D03E08007EAC20 /* OOCloudTextureGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOCloudTextureGenerator.h; sourceTree = "<group>"; };
|
|
||||||
2B6EB2DA10D03E08007EAC20 /* OOCloudTextureGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OOCloudTextureGenerator.m; sourceTree = "<group>"; };
|
|
||||||
2B9A1088105D526200EE2AE6 /* javascript-errors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = "javascript-errors.plist"; sourceTree = "<group>"; };
|
2B9A1088105D526200EE2AE6 /* javascript-errors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = "javascript-errors.plist"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@ -2481,8 +2477,6 @@
|
|||||||
1A71E85D0BCE8A5500CD5C13 /* Textures */ = {
|
1A71E85D0BCE8A5500CD5C13 /* Textures */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
2B6EB2D910D03E08007EAC20 /* OOCloudTextureGenerator.h */,
|
|
||||||
2B6EB2DA10D03E08007EAC20 /* OOCloudTextureGenerator.m */,
|
|
||||||
1A26D0E10BCF9D3B0073F257 /* OOTexture.h */,
|
1A26D0E10BCF9D3B0073F257 /* OOTexture.h */,
|
||||||
1A26D0E00BCF9D3B0073F257 /* OOTexture.m */,
|
1A26D0E00BCF9D3B0073F257 /* OOTexture.m */,
|
||||||
1A8BB8E80E8311F900122974 /* OONullTexture.h */,
|
1A8BB8E80E8311F900122974 /* OONullTexture.h */,
|
||||||
@ -3176,7 +3170,6 @@
|
|||||||
1AA7FE2D10C2F2070058FBED /* OOTextureGenerator.h in Headers */,
|
1AA7FE2D10C2F2070058FBED /* OOTextureGenerator.h in Headers */,
|
||||||
1AA7FE3410C2F26A0058FBED /* OOPlanetTextureGenerator.h in Headers */,
|
1AA7FE3410C2F26A0058FBED /* OOPlanetTextureGenerator.h in Headers */,
|
||||||
1ADA564810CD68D800E891B8 /* OOStellarBody.h in Headers */,
|
1ADA564810CD68D800E891B8 /* OOStellarBody.h in Headers */,
|
||||||
2B6EB2DB10D03E08007EAC20 /* OOCloudTextureGenerator.h in Headers */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -3548,7 +3541,6 @@
|
|||||||
1AA7FDDD10C2DC800058FBED /* OOSunEntity.m in Sources */,
|
1AA7FDDD10C2DC800058FBED /* OOSunEntity.m in Sources */,
|
||||||
1AA7FE2E10C2F2070058FBED /* OOTextureGenerator.m in Sources */,
|
1AA7FE2E10C2F2070058FBED /* OOTextureGenerator.m in Sources */,
|
||||||
1AA7FE3510C2F26A0058FBED /* OOPlanetTextureGenerator.m in Sources */,
|
1AA7FE3510C2F26A0058FBED /* OOPlanetTextureGenerator.m in Sources */,
|
||||||
2B6EB2DC10D03E08007EAC20 /* OOCloudTextureGenerator.m in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -50,7 +50,6 @@ MA 02110-1301, USA.
|
|||||||
OOTimeDelta _shuttleLaunchInterval;
|
OOTimeDelta _shuttleLaunchInterval;
|
||||||
|
|
||||||
NSDictionary *_materialParameters;
|
NSDictionary *_materialParameters;
|
||||||
NSDictionary *_atmosphereParameters;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) initAsMainPlanetForSystemSeed:(Random_Seed)seed;
|
- (id) initAsMainPlanetForSystemSeed:(Random_Seed)seed;
|
||||||
|
@ -27,6 +27,7 @@ MA 02110-1301, USA.
|
|||||||
#if NEW_PLANETS
|
#if NEW_PLANETS
|
||||||
|
|
||||||
#define SHADY_PLANETS !NO_SHADERS
|
#define SHADY_PLANETS !NO_SHADERS
|
||||||
|
#define NEW_ATMOSPHERE 0
|
||||||
|
|
||||||
#import "OOPlanetDrawable.h"
|
#import "OOPlanetDrawable.h"
|
||||||
|
|
||||||
@ -42,7 +43,6 @@ MA 02110-1301, USA.
|
|||||||
#import "OOCollectionExtractors.h"
|
#import "OOCollectionExtractors.h"
|
||||||
|
|
||||||
#import "OOPlanetTextureGenerator.h"
|
#import "OOPlanetTextureGenerator.h"
|
||||||
#import "OOCloudTextureGenerator.h"
|
|
||||||
#import "OOSingleTextureMaterial.h"
|
#import "OOSingleTextureMaterial.h"
|
||||||
#import "OOShaderMaterial.h"
|
#import "OOShaderMaterial.h"
|
||||||
|
|
||||||
@ -108,11 +108,32 @@ MA 02110-1301, USA.
|
|||||||
|
|
||||||
_planetDrawable = [[OOPlanetDrawable alloc] init];
|
_planetDrawable = [[OOPlanetDrawable alloc] init];
|
||||||
|
|
||||||
// Load material parameters.
|
// Load material parameters, including atmosphere.
|
||||||
RANROTSeed planetNoiseSeed = RANROTGetFullSeed();
|
RANROTSeed planetNoiseSeed = RANROTGetFullSeed();
|
||||||
[planetInfo setObject:[NSValue valueWithBytes:&planetNoiseSeed objCType:@encode(RANROTSeed)] forKey:@"noise_map_seed"];
|
[planetInfo setObject:[NSValue valueWithBytes:&planetNoiseSeed objCType:@encode(RANROTSeed)] forKey:@"noise_map_seed"];
|
||||||
[self setUpLandParametersWithSourceInfo:dict targetInfo:planetInfo];
|
[self setUpLandParametersWithSourceInfo:dict targetInfo:planetInfo];
|
||||||
|
|
||||||
|
#if NEW_ATMOSPHERE
|
||||||
|
if (atmosphere)
|
||||||
|
{
|
||||||
|
_atmosphereDrawable = [[OOPlanetDrawable atmosphereWithRadius:collision_radius + ATMOSPHERE_DEPTH] retain];
|
||||||
|
|
||||||
|
// convert the atmosphere settings to generic 'material parameters'
|
||||||
|
percent_land = 100 - [dict oo_intForKey:@"percent_cloud" defaultValue:100 - (3 + (gen_rnd_number() & 31)+(gen_rnd_number() & 31))];
|
||||||
|
[planetInfo setObject:[NSNumber numberWithFloat:0.01 * percent_land] forKey:@"cloud_fraction"];
|
||||||
|
[self setUpAtmosphereParametersWithSourceInfo:dict targetInfo:planetInfo];
|
||||||
|
|
||||||
|
_materialParameters = [planetInfo dictionaryWithValuesForKeys:[NSArray arrayWithObjects:@"cloud_fraction", @"air_color", @"polar_air_color", @"cloud_color", @"polar_cloud_color", @"cloud_alpha",
|
||||||
|
@"land_fraction", @"land_color", @"sea_color", @"polar_land_color", @"polar_sea_color", @"noise_map_seed", @"economy", nil]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#else
|
||||||
|
// differentiate between normal planets and moons.
|
||||||
|
if (atmosphere) _atmosphereDrawable = [[OOPlanetDrawable atmosphereWithRadius:collision_radius + ATMOSPHERE_DEPTH] retain];
|
||||||
|
#endif
|
||||||
|
{
|
||||||
_materialParameters = [planetInfo dictionaryWithValuesForKeys:[NSArray arrayWithObjects:@"land_fraction", @"land_color", @"sea_color", @"polar_land_color", @"polar_sea_color", @"noise_map_seed", @"economy", nil]];
|
_materialParameters = [planetInfo dictionaryWithValuesForKeys:[NSArray arrayWithObjects:@"land_fraction", @"land_color", @"sea_color", @"polar_land_color", @"polar_sea_color", @"noise_map_seed", @"economy", nil]];
|
||||||
|
}
|
||||||
[_materialParameters retain];
|
[_materialParameters retain];
|
||||||
|
|
||||||
NSString *textureName = [dict oo_stringForKey:@"texture"];
|
NSString *textureName = [dict oo_stringForKey:@"texture"];
|
||||||
@ -138,30 +159,6 @@ MA 02110-1301, USA.
|
|||||||
_rotationalVelocity *= [planetInfo oo_floatForKey:@"rotation_speed_factor" defaultValue:1.0f];
|
_rotationalVelocity *= [planetInfo oo_floatForKey:@"rotation_speed_factor" defaultValue:1.0f];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atmosphere)
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
_atmosphereDrawable = [[OOPlanetDrawable atmosphereWithRadius:collision_radius + ATMOSPHERE_DEPTH] retain];
|
|
||||||
|
|
||||||
NSMutableDictionary *atmosphereInfo = [NSMutableDictionary dictionaryWithCapacity:6];
|
|
||||||
|
|
||||||
// convert the atmosphere settings to generic 'material parameters'
|
|
||||||
percent_land = 100 - [dict oo_intForKey:@"percent_cloud" defaultValue:100 - (3 + (gen_rnd_number() & 31)+(gen_rnd_number() & 31))];
|
|
||||||
[atmosphereInfo setObject:[NSNumber numberWithFloat:0.01 * percent_land] forKey:@"land_fraction"];
|
|
||||||
[atmosphereInfo setObject:[planetInfo objectForKey:@"noise_map_seed"] forKey:@"noise_map_seed"];
|
|
||||||
[self setUpAtmosphereParametersWithSourceInfo:dict targetInfo:atmosphereInfo];
|
|
||||||
|
|
||||||
_atmosphereParameters = [atmosphereInfo copy];
|
|
||||||
//[atmosphereInfo autorelease];
|
|
||||||
OOTexture *atmosphereTexture = [OOCloudTextureGenerator cloudTextureWithInfo:_atmosphereParameters];
|
|
||||||
|
|
||||||
OOSingleTextureMaterial *material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:atmosphereTexture configuration:nil];
|
|
||||||
[_atmosphereDrawable setMaterial:material];
|
|
||||||
[material release];
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// set energy
|
// set energy
|
||||||
energy = collision_radius * 1000.0;
|
energy = collision_radius * 1000.0;
|
||||||
|
|
||||||
@ -254,7 +251,7 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
ScanVectorFromString([sourceInfo oo_stringForKey:@"land_hsb_color"], &landHSB);
|
ScanVectorFromString([sourceInfo oo_stringForKey:@"land_hsb_color"], &landHSB);
|
||||||
ScanVectorFromString([sourceInfo oo_stringForKey:@"sea_hsb_color"], &seaHSB);
|
ScanVectorFromString([sourceInfo oo_stringForKey:@"sea_hsb_color"], &seaHSB);
|
||||||
|
|
||||||
// polar areas are brighter but have less color (closer to white)
|
// polar areas are brighter but have less colour (closer to white)
|
||||||
landPolarHSB = LighterHSBColor(landHSB);
|
landPolarHSB = LighterHSBColor(landHSB);
|
||||||
seaPolarHSB = LighterHSBColor(seaHSB);
|
seaPolarHSB = LighterHSBColor(seaHSB);
|
||||||
|
|
||||||
@ -263,24 +260,18 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
[targetInfo setObject:ColorWithHSBColor(seaHSB) forKey:@"sea_color"];
|
[targetInfo setObject:ColorWithHSBColor(seaHSB) forKey:@"sea_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColor(landPolarHSB) forKey:@"polar_land_color"];
|
[targetInfo setObject:ColorWithHSBColor(landPolarHSB) forKey:@"polar_land_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColor(seaPolarHSB) forKey:@"polar_sea_color"];
|
[targetInfo setObject:ColorWithHSBColor(seaPolarHSB) forKey:@"polar_sea_color"];
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float cloudAlpha = cloudAlpha = OOClamp_0_1_f([sourceInfo oo_floatForKey:@"cloud_alpha" defaultValue:1.0f]);
|
float cloudAlpha = cloudAlpha = OOClamp_0_1_f([sourceInfo oo_floatForKey:@"cloud_alpha" defaultValue:1.0f]);
|
||||||
[targetInfo setObject:[NSNumber numberWithFloat:cloudAlpha] forKey:@"cloud_alpha"];
|
[targetInfo setObject:[NSNumber numberWithFloat:cloudAlpha] forKey:@"cloud_alpha"];
|
||||||
|
|
||||||
#define CLEAR_SKY_ALPHA 0.05
|
|
||||||
#define CLOUD_ALPHA 0.50
|
|
||||||
#define POLAR_CLEAR_SKY_ALPHA 0.34
|
|
||||||
#define POLAR_CLOUD_ALPHA 0.75
|
|
||||||
|
|
||||||
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"cloud_color"]];
|
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"cloud_color"]];
|
||||||
if (color != nil) landHSB = HSBColorWithColor(color);
|
if (color != nil) landHSB = HSBColorWithColor(color);
|
||||||
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"clear_sky_color"]];
|
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"clear_sky_color"]];
|
||||||
if (color != nil) seaHSB = HSBColorWithColor(color);
|
if (color != nil) seaHSB = HSBColorWithColor(color);
|
||||||
|
|
||||||
// polar areas are brighter but have less color (closer to white)
|
// polar areas are brighter but have less colour (closer to white)
|
||||||
landPolarHSB = LighterHSBColor(landHSB);
|
landPolarHSB = LighterHSBColor(landHSB);
|
||||||
seaPolarHSB = LighterHSBColor(seaHSB);
|
seaPolarHSB = LighterHSBColor(seaHSB);
|
||||||
|
|
||||||
@ -289,11 +280,10 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"polar_clear_sky_color"]];
|
color = [OOColor colorWithDescription:[sourceInfo objectForKey:@"polar_clear_sky_color"]];
|
||||||
if (color != nil) seaPolarHSB = HSBColorWithColor(color);
|
if (color != nil) seaPolarHSB = HSBColorWithColor(color);
|
||||||
|
|
||||||
//TODO: rename these keys to something sensible
|
[targetInfo setObject:ColorWithHSBColor(landHSB) forKey:@"air_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColorAndAlpha(landHSB, CLEAR_SKY_ALPHA) forKey:@"land_color"];
|
[targetInfo setObject:ColorWithHSBColor(seaHSB) forKey:@"cloud_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColorAndAlpha(seaHSB, CLOUD_ALPHA) forKey:@"sea_color"];
|
[targetInfo setObject:ColorWithHSBColor(landPolarHSB) forKey:@"polar_air_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColorAndAlpha(landPolarHSB, POLAR_CLEAR_SKY_ALPHA) forKey:@"polar_land_color"];
|
[targetInfo setObject:ColorWithHSBColor(seaPolarHSB) forKey:@"polar_cloud_color"];
|
||||||
[targetInfo setObject:ColorWithHSBColorAndAlpha(seaPolarHSB, POLAR_CLOUD_ALPHA) forKey:@"polar_sea_color"];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,7 +329,6 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
DESTROY(_planetDrawable);
|
DESTROY(_planetDrawable);
|
||||||
DESTROY(_atmosphereDrawable);
|
DESTROY(_atmosphereDrawable);
|
||||||
DESTROY(_materialParameters);
|
DESTROY(_materialParameters);
|
||||||
DESTROY(_atmosphereParameters);
|
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
@ -408,10 +397,12 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
[_planetDrawable renderOpaqueParts];
|
[_planetDrawable renderOpaqueParts];
|
||||||
if (0)//(_atmosphereDrawable != nil)
|
#if NEW_ATMOSPHERE
|
||||||
|
if (_atmosphereDrawable != nil)
|
||||||
{
|
{
|
||||||
[_atmosphereDrawable renderOpaqueParts];
|
[_atmosphereDrawable renderOpaqueParts];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if ([UNIVERSE wireframeGraphics]) GLDebugWireframeModeOff();
|
if ([UNIVERSE wireframeGraphics]) GLDebugWireframeModeOff();
|
||||||
}
|
}
|
||||||
@ -477,6 +468,8 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
|
|
||||||
- (void) setTextureFileName:(NSString *)textureName
|
- (void) setTextureFileName:(NSString *)textureName
|
||||||
{
|
{
|
||||||
|
BOOL isMoon = _atmosphereDrawable == nil;
|
||||||
|
|
||||||
#if !SHADY_PLANETS
|
#if !SHADY_PLANETS
|
||||||
if (textureName != nil)
|
if (textureName != nil)
|
||||||
{
|
{
|
||||||
@ -484,8 +477,27 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OOTexture *texture = [OOPlanetTextureGenerator planetTextureWithInfo:_materialParameters];
|
OOTexture *texture = nil;
|
||||||
OOSingleTextureMaterial *material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:texture configuration:nil];
|
OOSingleTextureMaterial *material = nil
|
||||||
|
if (isMoon)
|
||||||
|
{
|
||||||
|
texture = [OOPlanetTextureGenerator planetTextureWithInfo:_materialParameters];
|
||||||
|
material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:texture configuration:nil];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OOTexture *atmosphere = nil;
|
||||||
|
|
||||||
|
[OOPlanetTextureGenerator generatePlanetTexture:&texture
|
||||||
|
andAtmosphere:&atmosphere
|
||||||
|
withInfo:_materialParameters];
|
||||||
|
|
||||||
|
material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:atmosphere configuration:nil];
|
||||||
|
[_atmosphereDrawable setMaterial:material];
|
||||||
|
[material release];
|
||||||
|
material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:texture configuration:nil];
|
||||||
|
}
|
||||||
|
|
||||||
[_planetDrawable setMaterial:material];
|
[_planetDrawable setMaterial:material];
|
||||||
[material release];
|
[material release];
|
||||||
}
|
}
|
||||||
@ -500,7 +512,6 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
#else
|
#else
|
||||||
const BOOL shadersOn = NO;
|
const BOOL shadersOn = NO;
|
||||||
#endif
|
#endif
|
||||||
BOOL isMoon = _atmosphereDrawable == nil;
|
|
||||||
|
|
||||||
if (textureName != nil)
|
if (textureName != nil)
|
||||||
{
|
{
|
||||||
@ -509,10 +520,25 @@ static OOColor *ColorWithHSBColorAndAlpha(Vector c, float a)
|
|||||||
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:isMoon ? @"moon-customized-macros" : @"planet-customized-macros"];
|
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:isMoon ? @"moon-customized-macros" : @"planet-customized-macros"];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (isMoon)
|
||||||
{
|
{
|
||||||
[OOPlanetTextureGenerator generatePlanetTexture:&diffuseMap
|
[OOPlanetTextureGenerator generatePlanetTexture:&diffuseMap
|
||||||
secondaryTexture:(shaderLevel == SHADERS_FULL) ? &normalMap : NULL
|
secondaryTexture:(shaderLevel == SHADERS_FULL) ? &normalMap : NULL
|
||||||
withInfo:_materialParameters];
|
withInfo:_materialParameters];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OOTexture *atmosphere = nil;
|
||||||
|
[OOPlanetTextureGenerator generatePlanetTexture:&diffuseMap
|
||||||
|
secondaryTexture:(shaderLevel == SHADERS_FULL) ? &normalMap : NULL
|
||||||
|
andAtmosphere:&atmosphere
|
||||||
|
withInfo:_materialParameters];
|
||||||
|
|
||||||
|
OOSingleTextureMaterial *material = [[OOSingleTextureMaterial alloc] initWithName:@"dynamic" texture:atmosphere configuration:nil];
|
||||||
|
[_atmosphereDrawable setMaterial:material];
|
||||||
|
[material release];
|
||||||
|
}
|
||||||
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:isMoon ? @"moon-dynamic-macros" : @"planet-dynamic-macros"];
|
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:isMoon ? @"moon-dynamic-macros" : @"planet-dynamic-macros"];
|
||||||
textureName = @"dynamic";
|
textureName = @"dynamic";
|
||||||
}
|
}
|
||||||
|
@ -3834,7 +3834,7 @@ static PlayerEntity *sSharedPlayer = nil;
|
|||||||
|
|
||||||
if ([dockedStation localMarket] == nil)
|
if ([dockedStation localMarket] == nil)
|
||||||
{
|
{
|
||||||
[dockedStation initialiseLocalMarketWithSeed:system_seed andRandomFactor:market_rnd];
|
[dockedStation initialiseLocalMarketWithRandomFactor:market_rnd];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *escapepodReport = [self processEscapePods];
|
NSString *escapepodReport = [self processEscapePods];
|
||||||
@ -6014,7 +6014,7 @@ static NSString *last_outfitting_key=nil;
|
|||||||
if ([self isDocked]) station = dockedStation;
|
if ([self isDocked]) station = dockedStation;
|
||||||
else station = [UNIVERSE station];
|
else station = [UNIVERSE station];
|
||||||
localMarket = [station localMarket];
|
localMarket = [station localMarket];
|
||||||
if (localMarket == nil) localMarket = [station initialiseLocalMarketWithSeed:system_seed andRandomFactor:market_rnd];
|
if (localMarket == nil) localMarket = [station initialiseLocalMarketWithRandomFactor:market_rnd];
|
||||||
|
|
||||||
return localMarket;
|
return localMarket;
|
||||||
}
|
}
|
||||||
|
@ -549,9 +549,9 @@ static NSString * const kOOLogNoteShowShipyardModel = @"script.debug.note.showSh
|
|||||||
// set up initial markets if there are none
|
// set up initial markets if there are none
|
||||||
StationEntity* the_station = [UNIVERSE station];
|
StationEntity* the_station = [UNIVERSE station];
|
||||||
if (![the_station localPassengers])
|
if (![the_station localPassengers])
|
||||||
[the_station setLocalPassengers:[NSMutableArray arrayWithArray:[UNIVERSE passengersForSystem:system_seed atTime:ship_clock]]];
|
[the_station setLocalPassengers:[NSMutableArray arrayWithArray:[UNIVERSE passengersForLocalSystemAtTime:ship_clock]]];
|
||||||
if (![the_station localContracts])
|
if (![the_station localContracts])
|
||||||
[the_station setLocalContracts:[NSMutableArray arrayWithArray:[UNIVERSE contractsForSystem:system_seed atTime:ship_clock]]];
|
[the_station setLocalContracts:[NSMutableArray arrayWithArray:[UNIVERSE contractsForLocalSystemAtTime:ship_clock]]];
|
||||||
|
|
||||||
NSMutableArray* passenger_market = [the_station localPassengers];
|
NSMutableArray* passenger_market = [the_station localPassengers];
|
||||||
NSMutableArray* contract_market = [the_station localContracts];
|
NSMutableArray* contract_market = [the_station localContracts];
|
||||||
|
@ -485,7 +485,7 @@
|
|||||||
{
|
{
|
||||||
NSArray *market = [fileDic oo_arrayForKey:@"localMarket"];
|
NSArray *market = [fileDic oo_arrayForKey:@"localMarket"];
|
||||||
if (market != nil) [dockedStation setLocalMarket:market];
|
if (market != nil) [dockedStation setLocalMarket:market];
|
||||||
else [dockedStation initialiseLocalMarketWithSeed:system_seed andRandomFactor:market_rnd];
|
else [dockedStation initialiseLocalMarketWithRandomFactor:market_rnd];
|
||||||
}
|
}
|
||||||
[self calculateCurrentCargo];
|
[self calculateCurrentCargo];
|
||||||
[UNIVERSE setGalaxy_seed: galaxy_seed andReinit:YES]; // set overridden planet names on long range map
|
[UNIVERSE setGalaxy_seed: galaxy_seed andReinit:YES]; // set overridden planet names on long range map
|
||||||
|
@ -108,9 +108,8 @@ typedef enum
|
|||||||
- (NSMutableArray *) localShipyard;
|
- (NSMutableArray *) localShipyard;
|
||||||
- (void) setLocalShipyard:(NSArray *) some_market;
|
- (void) setLocalShipyard:(NSArray *) some_market;
|
||||||
|
|
||||||
- (NSMutableArray *) initialiseLocalMarketWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor;
|
- (NSMutableArray *) initialiseLocalMarketWithRandomFactor:(int) random_factor;
|
||||||
- (NSMutableArray *) initialiseLocalPassengersWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor;
|
- (NSMutableArray *) initialiseMarketWithSeed:(Random_Seed) s_seed andRandomFactor:(int) random_factor;
|
||||||
- (NSMutableArray *) initialiseLocalContractsWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor;
|
|
||||||
|
|
||||||
- (OOTechLevelID) equivalentTechLevel;
|
- (OOTechLevelID) equivalentTechLevel;
|
||||||
- (void) setEquivalentTechLevel:(OOTechLevelID) value;
|
- (void) setEquivalentTechLevel:(OOTechLevelID) value;
|
||||||
|
@ -163,7 +163,13 @@ static NSDictionary* instructions(int station_id, Vector coords, float speed, fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSMutableArray *) initialiseLocalMarketWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor
|
- (NSMutableArray *) initialiseLocalMarketWithRandomFactor:(int) random_factor
|
||||||
|
{
|
||||||
|
return [self initialiseMarketWithSeed:[[PlayerEntity sharedPlayer] system_seed] andRandomFactor:random_factor];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSMutableArray *) initialiseMarketWithSeed:(Random_Seed) s_seed andRandomFactor:(int) random_factor
|
||||||
{
|
{
|
||||||
int rf = (random_factor ^ universalID) & 0xff;
|
int rf = (random_factor ^ universalID) & 0xff;
|
||||||
int economy = [[UNIVERSE generateSystemData:s_seed] oo_intForKey:KEY_ECONOMY];
|
int economy = [[UNIVERSE generateSystemData:s_seed] oo_intForKey:KEY_ECONOMY];
|
||||||
@ -174,24 +180,6 @@ static NSDictionary* instructions(int station_id, Vector coords, float speed, fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSMutableArray *) initialiseLocalPassengersWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor
|
|
||||||
{
|
|
||||||
if (localPassengers)
|
|
||||||
[localPassengers release];
|
|
||||||
localPassengers = [[NSMutableArray alloc] initWithArray:[UNIVERSE passengersForSystem:s_seed atTime:[[[PlayerEntity sharedPlayer] clock_number] intValue]]];
|
|
||||||
return localPassengers;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (NSMutableArray *) initialiseLocalContractsWithSeed: (Random_Seed) s_seed andRandomFactor: (int) random_factor
|
|
||||||
{
|
|
||||||
if (localContracts)
|
|
||||||
[localContracts release];
|
|
||||||
localContracts = [[NSMutableArray alloc] initWithArray:[UNIVERSE contractsForSystem:s_seed atTime:[[[PlayerEntity sharedPlayer] clock_number] intValue]]];
|
|
||||||
return localContracts;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (void) setPlanet:(OOPlanetEntity *)planet_entity
|
- (void) setPlanet:(OOPlanetEntity *)planet_entity
|
||||||
{
|
{
|
||||||
if (planet_entity)
|
if (planet_entity)
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
OOCloudTextureGenerator.h
|
|
||||||
|
|
||||||
Generator for planet diffuse maps.
|
|
||||||
|
|
||||||
|
|
||||||
Oolite
|
|
||||||
Copyright (C) 2004-2009 Giles C Williams and contributors
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
MA 02110-1301, USA.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#import "OOTextureGenerator.h"
|
|
||||||
#import "OOMaths.h"
|
|
||||||
|
|
||||||
|
|
||||||
@interface OOCloudTextureGenerator: OOTextureGenerator
|
|
||||||
{
|
|
||||||
@private
|
|
||||||
float _landFraction, _overallAlpha;
|
|
||||||
FloatRGB _landColor;
|
|
||||||
FloatRGB _seaColor;
|
|
||||||
FloatRGB _polarLandColor;
|
|
||||||
FloatRGB _polarSeaColor;
|
|
||||||
unsigned _width, _height;
|
|
||||||
RANROTSeed _seed;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id) initWithPlanetInfo:(NSDictionary *)planetInfo;
|
|
||||||
|
|
||||||
+ (OOTexture *) cloudTextureWithInfo:(NSDictionary *)planetInfo;
|
|
||||||
//+ (void) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture forShaderLevel:(OOShaderSetting)shaderLevel;
|
|
||||||
|
|
||||||
@end
|
|
@ -1,358 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
OOCloudTextureGenerator.m
|
|
||||||
|
|
||||||
Generator for planet diffuse maps.
|
|
||||||
|
|
||||||
|
|
||||||
Oolite
|
|
||||||
Copyright (C) 2004-2009 Giles C Williams and contributors
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
MA 02110-1301, USA.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define DEBUG_DUMP ( 0 && !defined(NDEBUG))
|
|
||||||
#define DISABLE_SPECULAR ( 1 && DEBUG_DUMP) // No transparency in debug dump to make life easier.
|
|
||||||
|
|
||||||
|
|
||||||
#import "OOCloudTextureGenerator.h"
|
|
||||||
#import "OOCollectionExtractors.h"
|
|
||||||
#import "OOColor.h"
|
|
||||||
#import "OOTexture.h"
|
|
||||||
|
|
||||||
#if DEBUG_DUMP
|
|
||||||
#import "Universe.h"
|
|
||||||
#import "MyOpenGLView.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kNoiseBufferSize = 128
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static FloatRGB FloatRGBFromDictColor(NSDictionary *dictionary, NSString *key);
|
|
||||||
|
|
||||||
static void FillNoiseBuffer(float *noiseBuffer, RANROTSeed seed);
|
|
||||||
static void AddNoise(float *buffer, unsigned width, unsigned height, unsigned octave, float scale, const float *noiseBuffer);
|
|
||||||
|
|
||||||
static float QFactor(float *accbuffer, int x, int y, unsigned width, unsigned height, float polar_y_value, float bias);
|
|
||||||
|
|
||||||
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b);
|
|
||||||
static FloatRGBA CloudMix(float q, float maxQ, FloatRGB cloudColor, float alpha);
|
|
||||||
|
|
||||||
#define PLANET_ASPECT_RATIO 1 // Ideally, aspect ratio would be 2:1 - keeping it as 1:1 for now - Kaks 20091211
|
|
||||||
#define PLANET_HEIGHT 512
|
|
||||||
#define PLANET_WIDTH (PLANET_HEIGHT * PLANET_ASPECT_RATIO)
|
|
||||||
|
|
||||||
@implementation OOCloudTextureGenerator
|
|
||||||
|
|
||||||
- (id) initWithPlanetInfo:(NSDictionary *)planetInfo
|
|
||||||
{
|
|
||||||
if ((self = [super init]))
|
|
||||||
{
|
|
||||||
_landFraction = OOClamp_0_1_f([planetInfo oo_floatForKey:@"land_fraction" defaultValue:0.3]);
|
|
||||||
_landColor = FloatRGBFromDictColor(planetInfo, @"land_color");
|
|
||||||
_seaColor = FloatRGBFromDictColor(planetInfo, @"sea_color");
|
|
||||||
_polarLandColor = FloatRGBFromDictColor(planetInfo, @"polar_land_color");
|
|
||||||
_polarSeaColor = FloatRGBFromDictColor(planetInfo, @"polar_sea_color");
|
|
||||||
[[planetInfo objectForKey:@"noise_map_seed"] getValue:&_seed];
|
|
||||||
|
|
||||||
_overallAlpha = [planetInfo oo_floatForKey:@"cloud_alpha" defaultValue:1.0f];
|
|
||||||
|
|
||||||
_width = PLANET_WIDTH;
|
|
||||||
_height = PLANET_HEIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
+ (OOTexture *) cloudTextureWithInfo:(NSDictionary *)planetInfo
|
|
||||||
{
|
|
||||||
OOTexture *result = nil;
|
|
||||||
OOCloudTextureGenerator *generator = [[self alloc] initWithPlanetInfo:planetInfo];
|
|
||||||
if (generator != nil)
|
|
||||||
{
|
|
||||||
result = [OOTexture textureWithGenerator:generator];
|
|
||||||
[generator release];
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (NSString *) descriptionComponents
|
|
||||||
{
|
|
||||||
return [NSString stringWithFormat:@"seed: %u,%u", _seed.high, _seed.low];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (uint32_t) textureOptions
|
|
||||||
{
|
|
||||||
return kOOTextureMinFilterLinear | kOOTextureMagFilterLinear | kOOTextureRepeatS | kOOTextureNoShrink;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (NSString *) cacheKey
|
|
||||||
{
|
|
||||||
return [NSString stringWithFormat:@"OOCloudTextureGenerator-base\n\n%u,%u/%g/%u,%u/%f,%f,%f/%f,%f,%f/%f,%f,%f/%f,%f,%f",
|
|
||||||
_width, _height, _landFraction, _seed.high, _seed.low,
|
|
||||||
_landColor.r, _landColor.g, _landColor.b,
|
|
||||||
_seaColor.r, _seaColor.g, _seaColor.b,
|
|
||||||
_polarLandColor.r, _polarLandColor.g, _polarLandColor.b,
|
|
||||||
_polarSeaColor.r, _polarSeaColor.g, _polarSeaColor.b];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (BOOL)getResult:(void **)outData
|
|
||||||
format:(OOTextureDataFormat *)outFormat
|
|
||||||
width:(uint32_t *)outWidth
|
|
||||||
height:(uint32_t *)outHeight
|
|
||||||
{
|
|
||||||
BOOL waiting = NO;
|
|
||||||
if (![self isReady])
|
|
||||||
{
|
|
||||||
waiting = true;
|
|
||||||
OOLog(@"planetTex.temp", @"%s cloud generator %@", "Waiting for", self);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL result = [super getResult:outData format:outFormat width:outWidth height:outHeight];
|
|
||||||
|
|
||||||
if (waiting)
|
|
||||||
{
|
|
||||||
OOLog(@"planetTex.temp", @"%s generator %@", result ? "Dequeued" : "Failed to dequeue", self);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OOLog(@"planetTex.temp", @"%s generator %@ without waiting.", result ? "Dequeued" : "Failed to dequeue", self);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (void) loadTexture
|
|
||||||
{
|
|
||||||
OOLog(@"planetTex.temp", @"Started generator %@", self);
|
|
||||||
|
|
||||||
BOOL success = NO;
|
|
||||||
|
|
||||||
uint8_t *buffer = NULL, *px = NULL;
|
|
||||||
float *accBuffer = NULL;
|
|
||||||
float *randomBuffer = NULL;
|
|
||||||
|
|
||||||
width = _width;
|
|
||||||
height = _height;
|
|
||||||
|
|
||||||
buffer = malloc(4 * width * height);
|
|
||||||
if (buffer == NULL) goto END;
|
|
||||||
px = buffer;
|
|
||||||
|
|
||||||
accBuffer = calloc(sizeof (float), width * height);
|
|
||||||
if (accBuffer == NULL) goto END;
|
|
||||||
|
|
||||||
randomBuffer = calloc(sizeof (float), kNoiseBufferSize * kNoiseBufferSize);
|
|
||||||
if (randomBuffer == NULL) goto END;
|
|
||||||
FillNoiseBuffer(randomBuffer, _seed);
|
|
||||||
|
|
||||||
// Generate basic Perlin noise.
|
|
||||||
unsigned octave = 8 * PLANET_ASPECT_RATIO;
|
|
||||||
float scale = 0.5f;
|
|
||||||
while (octave < height)
|
|
||||||
{
|
|
||||||
AddNoise(accBuffer, width, height, octave, scale, randomBuffer);
|
|
||||||
octave *= 2;
|
|
||||||
scale *= 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
float seaBias = 1.0 - _landFraction;
|
|
||||||
float poleValue =(_landFraction * accBuffer[0] < seaBias) ? 0.0f : 1.0f;
|
|
||||||
float q;
|
|
||||||
|
|
||||||
unsigned x, y;
|
|
||||||
FloatRGBA color = (FloatRGBA){_seaColor.r, _seaColor.g, _seaColor.b, 1.0f};
|
|
||||||
|
|
||||||
GLfloat shade = 1.0f;
|
|
||||||
|
|
||||||
for (y = 0; y < height; y++)
|
|
||||||
{
|
|
||||||
for (x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
q = QFactor(accBuffer, x, y, width, height, poleValue, 0.0f);
|
|
||||||
|
|
||||||
if (NO) color = CloudMix(q, 0.5, _seaColor, _overallAlpha); // TODO: better values.
|
|
||||||
|
|
||||||
*px++ = 255 * color.r * shade;
|
|
||||||
*px++ = 255 * color.g * shade;
|
|
||||||
*px++ = 255 * color.b * shade;
|
|
||||||
|
|
||||||
*px++ = 255 * q * _overallAlpha;
|
|
||||||
//*px++ = 255 * color.a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
success = YES;
|
|
||||||
format = kOOTextureDataRGBA;
|
|
||||||
|
|
||||||
END:
|
|
||||||
free(accBuffer);
|
|
||||||
free(randomBuffer);
|
|
||||||
if (success) data = buffer;
|
|
||||||
else free(buffer);
|
|
||||||
|
|
||||||
OOLog(@"planetTex.temp", @"Completed generator %@ %@successfully", self, success ? @"" : @"un");
|
|
||||||
|
|
||||||
#if DEBUG_DUMP
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
NSString *name = [NSString stringWithFormat:@"atmosphere-%u-%u-new", _seed.high, _seed.low];
|
|
||||||
|
|
||||||
[[UNIVERSE gameView] dumpRGBAToFileNamed:name
|
|
||||||
bytes:buffer
|
|
||||||
width:width
|
|
||||||
height:height
|
|
||||||
rowBytes:width * 4];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b)
|
|
||||||
{
|
|
||||||
float prime = 1.0f - fraction;
|
|
||||||
|
|
||||||
return (FloatRGB)
|
|
||||||
{
|
|
||||||
fraction * a.r + prime * b.r,
|
|
||||||
fraction * a.g + prime * b.g,
|
|
||||||
fraction * a.b + prime * b.b,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FloatRGBA CloudMix(float q, float maxQ, FloatRGB cloudColor, float alpha)
|
|
||||||
{
|
|
||||||
|
|
||||||
#define RECIP_CLOUD_PORTION (20.0f)
|
|
||||||
#define CLOUD_PORTION (1.0f / RECIP_CLOUD_PORTION)
|
|
||||||
const FloatRGB white = { 1.0f, 1.0f, 1.0f };
|
|
||||||
//const FloatRGB black = { 0.0f, 0.0f, 0.0f };
|
|
||||||
FloatRGB result = cloudColor;
|
|
||||||
|
|
||||||
q -= CLOUD_PORTION;
|
|
||||||
|
|
||||||
if (q <= 0.0f)
|
|
||||||
{
|
|
||||||
if (q >= -CLOUD_PORTION){
|
|
||||||
alpha *= -q * RECIP_CLOUD_PORTION;
|
|
||||||
result = Blend( -q * 0.5 * RECIP_CLOUD_PORTION + 0.5, result, white);
|
|
||||||
}
|
|
||||||
//else result=black;
|
|
||||||
}
|
|
||||||
else if (q >= CLOUD_PORTION)
|
|
||||||
{
|
|
||||||
result = Blend( q * 0.5 +0.5, white, result);
|
|
||||||
}
|
|
||||||
else if (q < CLOUD_PORTION)
|
|
||||||
{
|
|
||||||
alpha *= q * RECIP_CLOUD_PORTION;
|
|
||||||
result = Blend( q * RECIP_CLOUD_PORTION , result, white);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return (FloatRGBA){ result.r, result.g, result.b, alpha * (q )};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FloatRGB FloatRGBFromDictColor(NSDictionary *dictionary, NSString *key)
|
|
||||||
{
|
|
||||||
OOColor *color = [dictionary objectForKey:key];
|
|
||||||
NSCAssert1([color isKindOfClass:[OOColor class]], @"Expected OOColor, got %@", [color class]);
|
|
||||||
|
|
||||||
return (FloatRGB){ [color redComponent], [color greenComponent], [color blueComponent] };
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void FillNoiseBuffer(float *noiseBuffer, RANROTSeed seed)
|
|
||||||
{
|
|
||||||
NSCParameterAssert(noiseBuffer != NULL);
|
|
||||||
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < kNoiseBufferSize * kNoiseBufferSize; i++)
|
|
||||||
{
|
|
||||||
noiseBuffer[i] = randfWithSeed(&seed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static float lerp(float v0, float v1, float q)
|
|
||||||
{
|
|
||||||
return v0 + q * (v1 - v0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void AddNoise(float *buffer, unsigned width, unsigned height, unsigned octave, float scale, const float *noiseBuffer)
|
|
||||||
{
|
|
||||||
unsigned x, y;
|
|
||||||
float r = (float)width / (float)octave;
|
|
||||||
|
|
||||||
for (y = 0; y < height; y++)
|
|
||||||
{
|
|
||||||
for (x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
// FIXME: do this with less float/int conversions.
|
|
||||||
int ix = floor( (float)x / r);
|
|
||||||
int jx = (ix + 1) % octave;
|
|
||||||
int iy = floor( (float)y / r);
|
|
||||||
int jy = (iy + 1) % octave;
|
|
||||||
float qx = x / r - ix;
|
|
||||||
float qy = y / r - iy;
|
|
||||||
ix &= 127;
|
|
||||||
iy &= 127;
|
|
||||||
jx &= 127;
|
|
||||||
jy &= 127;
|
|
||||||
float rix = lerp( noiseBuffer[iy * kNoiseBufferSize + ix], noiseBuffer[iy * kNoiseBufferSize + jx], qx);
|
|
||||||
float rjx = lerp( noiseBuffer[jy * kNoiseBufferSize + ix], noiseBuffer[jy * kNoiseBufferSize + jx], qx);
|
|
||||||
float rfinal = scale * lerp(rix, rjx, qy);
|
|
||||||
|
|
||||||
buffer[y * width + x] += rfinal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static float QFactor(float *accbuffer, int x, int y, unsigned width, unsigned height, float polar_y_value, float bias)
|
|
||||||
{
|
|
||||||
x = (x + width) % width;
|
|
||||||
// FIXME: wrong wrapping mode for Y, should flip to other hemisphere.
|
|
||||||
y = (y + height) % height;
|
|
||||||
|
|
||||||
float q = accbuffer[y * width + x]; // 0.0 -> 1.0
|
|
||||||
q += bias;
|
|
||||||
|
|
||||||
// Polar Y smooth. FIXME: float/int conversions.
|
|
||||||
float polar_y = (2.0f * y - height) / (float) height;
|
|
||||||
polar_y *= polar_y;
|
|
||||||
q = q * (1.0 - polar_y) + polar_y * polar_y_value;
|
|
||||||
|
|
||||||
return q;
|
|
||||||
}
|
|
@ -28,7 +28,7 @@ MA 02110-1301, USA.
|
|||||||
#import "OOTextureGenerator.h"
|
#import "OOTextureGenerator.h"
|
||||||
#import "OOMaths.h"
|
#import "OOMaths.h"
|
||||||
|
|
||||||
@class OOPlanetNormalMapGenerator;
|
@class OOPlanetNormalMapGenerator, OOPlanetAtmosphereGenerator;
|
||||||
|
|
||||||
|
|
||||||
@interface OOPlanetTextureGenerator: OOTextureGenerator
|
@interface OOPlanetTextureGenerator: OOTextureGenerator
|
||||||
@ -39,14 +39,25 @@ MA 02110-1301, USA.
|
|||||||
FloatRGB _seaColor;
|
FloatRGB _seaColor;
|
||||||
FloatRGB _polarLandColor;
|
FloatRGB _polarLandColor;
|
||||||
FloatRGB _polarSeaColor;
|
FloatRGB _polarSeaColor;
|
||||||
|
|
||||||
|
float _cloudAlpha;
|
||||||
|
float _cloudFraction;
|
||||||
|
FloatRGB _airColor;
|
||||||
|
FloatRGB _cloudColor;
|
||||||
|
FloatRGB _polarAirColor;
|
||||||
|
FloatRGB _polarCloudColor;
|
||||||
|
|
||||||
RANROTSeed _seed;
|
RANROTSeed _seed;
|
||||||
OOPlanetNormalMapGenerator *_nMapGenerator;
|
OOPlanetNormalMapGenerator *_nMapGenerator;
|
||||||
|
OOPlanetAtmosphereGenerator *_atmoGenerator;
|
||||||
OOUInteger _planetScale;
|
OOUInteger _planetScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) initWithPlanetInfo:(NSDictionary *)planetInfo;
|
- (id) initWithPlanetInfo:(NSDictionary *)planetInfo;
|
||||||
|
|
||||||
+ (OOTexture *) planetTextureWithInfo:(NSDictionary *)planetInfo;
|
+ (OOTexture *) planetTextureWithInfo:(NSDictionary *)planetInfo;
|
||||||
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture andAtmosphere:(OOTexture **)atmosphere withInfo:(NSDictionary *)planetInfo;
|
||||||
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture withInfo:(NSDictionary *)planetInfo;
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture withInfo:(NSDictionary *)planetInfo;
|
||||||
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture andAtmosphere:(OOTexture **)atmosphere withInfo:(NSDictionary *)planetInfo;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -58,6 +58,7 @@ enum
|
|||||||
|
|
||||||
- (NSString *) cacheKeyForType:(NSString *)type;
|
- (NSString *) cacheKeyForType:(NSString *)type;
|
||||||
- (OOTextureGenerator *) normalMapGenerator; // Must be called before generator is enqueued for rendering.
|
- (OOTextureGenerator *) normalMapGenerator; // Must be called before generator is enqueued for rendering.
|
||||||
|
- (OOTextureGenerator *) atmosphereGenerator; // Must be called before generator is enqueued for rendering.
|
||||||
|
|
||||||
#if DEBUG_DUMP_RAW
|
#if DEBUG_DUMP_RAW
|
||||||
- (void) dumpNoiseBuffer:(float *)noise;
|
- (void) dumpNoiseBuffer:(float *)noise;
|
||||||
@ -66,7 +67,6 @@ enum
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The planet generator actually generates two textures when shaders are
|
/* The planet generator actually generates two textures when shaders are
|
||||||
active, but the texture loader interface assumes we only load/generate
|
active, but the texture loader interface assumes we only load/generate
|
||||||
one texture per loader. Rather than complicate that, we use a mock
|
one texture per loader. Rather than complicate that, we use a mock
|
||||||
@ -86,6 +86,21 @@ enum
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
/* Doing the same as above for the atmosphere. */
|
||||||
|
@interface OOPlanetAtmosphereGenerator: OOTextureGenerator
|
||||||
|
{
|
||||||
|
@private
|
||||||
|
NSString *_cacheKey;
|
||||||
|
RANROTSeed _seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id) initWithCacheKey:(NSString *)cacheKey seed:(RANROTSeed)seed;
|
||||||
|
|
||||||
|
- (void) completeWithData:(void *)data width:(unsigned)width height:(unsigned)height;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
static int heightMask, widthMask;
|
static int heightMask, widthMask;
|
||||||
static float mix_hi, mix_oh, mix_ih, mix_polarCap;
|
static float mix_hi, mix_oh, mix_ih, mix_polarCap;
|
||||||
|
|
||||||
@ -98,7 +113,9 @@ static float QFactor(float *accbuffer, int x, int y, unsigned width, float polar
|
|||||||
static float GetQ(float *qbuffer, int x, int y, unsigned width, unsigned height);
|
static float GetQ(float *qbuffer, int x, int y, unsigned width, unsigned height);
|
||||||
|
|
||||||
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b);
|
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b);
|
||||||
|
static float fBlend(float fraction, float a, float b);
|
||||||
static void SetMixConstants(float maxQ, float temperatureFraction);
|
static void SetMixConstants(float maxQ, float temperatureFraction);
|
||||||
|
static FloatRGBA CloudMix(float q, FloatRGB airColor, FloatRGB cloudColor, FloatRGB paleAirColor, FloatRGB paleCloudColor, float alpha, float nearPole);
|
||||||
static FloatRGBA PlanetMix(float q, FloatRGB landColor, FloatRGB seaColor, FloatRGB paleLandColor, FloatRGB paleSeaColor, FloatRGB polarSeaColor, float nearPole);
|
static FloatRGBA PlanetMix(float q, FloatRGB landColor, FloatRGB seaColor, FloatRGB paleLandColor, FloatRGB paleSeaColor, FloatRGB polarSeaColor, float nearPole);
|
||||||
|
|
||||||
|
|
||||||
@ -131,6 +148,17 @@ enum
|
|||||||
_polarSeaColor = FloatRGBFromDictColor(planetInfo, @"polar_sea_color");
|
_polarSeaColor = FloatRGBFromDictColor(planetInfo, @"polar_sea_color");
|
||||||
[[planetInfo objectForKey:@"noise_map_seed"] getValue:&_seed];
|
[[planetInfo objectForKey:@"noise_map_seed"] getValue:&_seed];
|
||||||
|
|
||||||
|
if ([planetInfo objectForKey:@"cloud_alpha"])
|
||||||
|
{
|
||||||
|
// we have an atmosphere:
|
||||||
|
_cloudAlpha = [planetInfo oo_floatForKey:@"cloud_alpha" defaultValue:1.0f];
|
||||||
|
_cloudFraction = OOClamp_0_1_f([planetInfo oo_floatForKey:@"cloud_fraction" defaultValue:0.3]);
|
||||||
|
_airColor = FloatRGBFromDictColor(planetInfo, @"air_color");
|
||||||
|
_cloudColor = FloatRGBFromDictColor(planetInfo, @"cloud_color");
|
||||||
|
_polarAirColor = FloatRGBFromDictColor(planetInfo, @"polar_air_color");
|
||||||
|
_polarCloudColor = FloatRGBFromDictColor(planetInfo, @"polar_cloud_color");
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef TEXGEN_TEST_RIG
|
#ifndef TEXGEN_TEST_RIG
|
||||||
if ([UNIVERSE reducedDetail])
|
if ([UNIVERSE reducedDetail])
|
||||||
{
|
{
|
||||||
@ -163,6 +191,25 @@ enum
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture andAtmosphere:(OOTexture **)atmosphere withInfo:(NSDictionary *)planetInfo
|
||||||
|
{
|
||||||
|
NSParameterAssert(texture != NULL);
|
||||||
|
|
||||||
|
OOPlanetTextureGenerator *diffuseGen = [[[self alloc] initWithPlanetInfo:planetInfo] autorelease];
|
||||||
|
if (diffuseGen == nil) return NO;
|
||||||
|
|
||||||
|
OOTextureGenerator *atmoGen = [diffuseGen atmosphereGenerator];
|
||||||
|
if (atmoGen == nil) return NO;
|
||||||
|
|
||||||
|
*atmosphere = [OOTexture textureWithGenerator:atmoGen];
|
||||||
|
if (*atmosphere == nil) return NO;
|
||||||
|
|
||||||
|
*texture = [OOTexture textureWithGenerator:diffuseGen];
|
||||||
|
|
||||||
|
return *texture != nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture withInfo:(NSDictionary *)planetInfo
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture withInfo:(NSDictionary *)planetInfo
|
||||||
{
|
{
|
||||||
NSParameterAssert(texture != NULL);
|
NSParameterAssert(texture != NULL);
|
||||||
@ -185,9 +232,42 @@ enum
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+ (BOOL) generatePlanetTexture:(OOTexture **)texture secondaryTexture:(OOTexture **)secondaryTexture andAtmosphere:(OOTexture **)atmosphere withInfo:(NSDictionary *)planetInfo
|
||||||
|
{
|
||||||
|
NSParameterAssert(texture != NULL);
|
||||||
|
|
||||||
|
OOPlanetTextureGenerator *diffuseGen = [[[self alloc] initWithPlanetInfo:planetInfo] autorelease];
|
||||||
|
if (diffuseGen == nil) return NO;
|
||||||
|
|
||||||
|
if (secondaryTexture != NULL)
|
||||||
|
{
|
||||||
|
OOTextureGenerator *normalGen = [diffuseGen normalMapGenerator];
|
||||||
|
if (normalGen == nil) return NO;
|
||||||
|
|
||||||
|
*secondaryTexture = [OOTexture textureWithGenerator:normalGen];
|
||||||
|
if (*secondaryTexture == nil) return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
OOTextureGenerator *atmoGen = [diffuseGen atmosphereGenerator];
|
||||||
|
if (atmoGen == nil) return NO;
|
||||||
|
|
||||||
|
*atmosphere = [OOTexture textureWithGenerator:atmoGen];
|
||||||
|
if (*atmosphere == nil)
|
||||||
|
{
|
||||||
|
*secondaryTexture = nil;
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
*texture = [OOTexture textureWithGenerator:diffuseGen];
|
||||||
|
|
||||||
|
return *texture != nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void) dealloc
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
DESTROY(_nMapGenerator);
|
DESTROY(_nMapGenerator);
|
||||||
|
DESTROY(_atmoGenerator);
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
@ -207,7 +287,9 @@ enum
|
|||||||
|
|
||||||
- (NSString *) cacheKey
|
- (NSString *) cacheKey
|
||||||
{
|
{
|
||||||
return [self cacheKeyForType:(_nMapGenerator == nil) ? @"diffuse-baked" : @"diffuse-raw"];
|
NSString *type =(_nMapGenerator == nil) ? @"diffuse-baked" : @"diffuse-raw";
|
||||||
|
if (_atmoGenerator != nil) type = [NSString stringWithFormat:@"%@-atmo", type];
|
||||||
|
return [self cacheKeyForType:type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -233,6 +315,16 @@ enum
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (OOTextureGenerator *) atmosphereGenerator
|
||||||
|
{
|
||||||
|
if (_atmoGenerator == nil)
|
||||||
|
{
|
||||||
|
_atmoGenerator = [[OOPlanetAtmosphereGenerator alloc] initWithCacheKey:[self cacheKeyForType:@"atmo"] seed:_seed];
|
||||||
|
}
|
||||||
|
return _atmoGenerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
- (BOOL)getResult:(void **)outData
|
- (BOOL)getResult:(void **)outData
|
||||||
format:(OOTextureDataFormat *)outFormat
|
format:(OOTextureDataFormat *)outFormat
|
||||||
width:(uint32_t *)outWidth
|
width:(uint32_t *)outWidth
|
||||||
@ -266,9 +358,11 @@ enum
|
|||||||
|
|
||||||
BOOL success = NO;
|
BOOL success = NO;
|
||||||
BOOL generateNormalMap = (_nMapGenerator != nil);
|
BOOL generateNormalMap = (_nMapGenerator != nil);
|
||||||
|
BOOL generateAtmosphere = (_atmoGenerator != nil);
|
||||||
|
|
||||||
uint8_t *buffer = NULL, *px = NULL;
|
uint8_t *buffer = NULL, *px = NULL;
|
||||||
uint8_t *nBuffer = NULL, *npx = NULL;
|
uint8_t *nBuffer = NULL, *npx = NULL;
|
||||||
|
uint8_t *aBuffer = NULL, *apx = NULL;
|
||||||
float *accBuffer = NULL;
|
float *accBuffer = NULL;
|
||||||
float *qBuffer = NULL;
|
float *qBuffer = NULL;
|
||||||
float *randomBuffer = NULL;
|
float *randomBuffer = NULL;
|
||||||
@ -289,6 +383,13 @@ enum
|
|||||||
npx = nBuffer;
|
npx = nBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (generateAtmosphere)
|
||||||
|
{
|
||||||
|
aBuffer = malloc(4 * width * height);
|
||||||
|
if (aBuffer == NULL) goto END;
|
||||||
|
apx = aBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
accBuffer = calloc(sizeof (float), width * height);
|
accBuffer = calloc(sizeof (float), width * height);
|
||||||
if (accBuffer == NULL) goto END;
|
if (accBuffer == NULL) goto END;
|
||||||
|
|
||||||
@ -319,17 +420,15 @@ enum
|
|||||||
[self dumpNoiseBuffer:accBuffer];
|
[self dumpNoiseBuffer:accBuffer];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
float polarClouds =(_cloudFraction * accBuffer[0] < 1.0f - _cloudFraction) ? 0.0f : 1.0f;
|
||||||
float poleValue = (_landFraction > 0.5f) ? 0.5f * _landFraction : 0.0f;
|
float poleValue = (_landFraction > 0.5f) ? 0.5f * _landFraction : 0.0f;
|
||||||
float seaBias = _landFraction - 1.0;
|
float seaBias = _landFraction - 1.0f;
|
||||||
|
|
||||||
/* The system key 'polar_sea_colour' is used here as 'paleSeaColour'.
|
/* The system key 'polar_sea_colour' was used as 'paleSeaColour'.
|
||||||
While most polar seas would be covoered in ice, and therefore white,
|
The generated texture had presumably iceberg covered shallows.
|
||||||
paleSeaColour doesn't seem to take latitutde into account, resulting
|
paleSeaColour is now a pale blend of sea and land colours, giving
|
||||||
in all coastal areas to be white, or whatever defined as polar sea
|
a softer transition colour for the shallows - those have also been
|
||||||
colours.
|
widened from 1.73 to smooth out the coast / deep sea boundary.
|
||||||
For now, I'm overriding paleSeaColour to be pale blend of sea and land,
|
|
||||||
and widened the shallows.
|
|
||||||
TODO: investigate the use of polar land colour for the sea at higher latitudes.
|
|
||||||
-- Kaks
|
-- Kaks
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -339,17 +438,19 @@ enum
|
|||||||
|
|
||||||
unsigned x, y;
|
unsigned x, y;
|
||||||
FloatRGBA color;
|
FloatRGBA color;
|
||||||
|
FloatRGBA cloudColor = (FloatRGBA){_cloudColor.r, _cloudColor.g, _cloudColor.b, 1.0f};
|
||||||
Vector norm;
|
Vector norm;
|
||||||
float q, yN, yS, yW, yE, nearPole;
|
float q, yN, yS, yW, yE, nearPole;
|
||||||
GLfloat shade;
|
GLfloat shade;
|
||||||
float rHeight = 1.0f / height;
|
float rHeight = 1.0f / height;
|
||||||
|
float fy, fHeight = height;
|
||||||
// The second parameter is the temperature fraction. Most favourable: 1.0f, little ice. Most unfavourable: 0.0f, frozen planet. TODO: make it dependent on ranrot / planetinfo key...
|
// The second parameter is the temperature fraction. Most favourable: 1.0f, little ice. Most unfavourable: 0.0f, frozen planet. TODO: make it dependent on ranrot / planetinfo key...
|
||||||
SetMixConstants(_landFraction, 0.95f); // no need to recalculate them inside each loop!
|
SetMixConstants(_landFraction, 0.95f); // no need to recalculate them inside each loop!
|
||||||
|
|
||||||
// first pass, calculate q.
|
// first pass, calculate q.
|
||||||
for (y = 0; y < height; y++)
|
for (y = 0, fy = 0.0f; y < height; y++, fy++)
|
||||||
{
|
{
|
||||||
nearPole = ((float)(y << 1) - height) * rHeight;
|
nearPole = (2.0f * fy - fHeight) * rHeight;
|
||||||
nearPole *= nearPole;
|
nearPole *= nearPole;
|
||||||
|
|
||||||
for (x = 0; x < width; x++)
|
for (x = 0; x < width; x++)
|
||||||
@ -359,15 +460,15 @@ enum
|
|||||||
}
|
}
|
||||||
|
|
||||||
// second pass, use q.
|
// second pass, use q.
|
||||||
for (y = 0; y < height; y++)
|
for (y = 0, fy = 0.0f; y < height; y++, fy++)
|
||||||
{
|
{
|
||||||
nearPole = ((float)(y << 1) - height) * rHeight;
|
nearPole = (2.0f * fy - fHeight) * rHeight;
|
||||||
nearPole *= nearPole;
|
nearPole *= nearPole;
|
||||||
|
|
||||||
for (x = 0; x < width; x++)
|
for (x = 0; x < width; x++)
|
||||||
{
|
{
|
||||||
q = qBuffer[y * width + x]; // no need to use GetQ, here x and y will never be out of bounds.
|
q = qBuffer[y * width + x]; // no need to use GetQ, x and y are always within bounds.
|
||||||
yN = GetQ(qBuffer, x, y - 1, width, height);
|
yN = GetQ(qBuffer, x, y - 1, width, height); // recalculates x & y if they go out of bounds.
|
||||||
yS = GetQ(qBuffer, x, y + 1, width, height);
|
yS = GetQ(qBuffer, x, y + 1, width, height);
|
||||||
yW = GetQ(qBuffer, x - 1, y, width, height);
|
yW = GetQ(qBuffer, x - 1, y, width, height);
|
||||||
yE = GetQ(qBuffer, x + 1, y, width, height);
|
yE = GetQ(qBuffer, x + 1, y, width, height);
|
||||||
@ -407,7 +508,7 @@ enum
|
|||||||
so we can recycle that to avoid branching.
|
so we can recycle that to avoid branching.
|
||||||
-- Ahruman
|
-- Ahruman
|
||||||
*/
|
*/
|
||||||
shade += color.a - color.a * shade; // equivalent to, but slightly faster than previous calculation
|
shade += color.a - color.a * shade; // equivalent to - but slightly faster than - previous implementation.
|
||||||
}
|
}
|
||||||
|
|
||||||
*px++ = 255.0f * color.r * shade;
|
*px++ = 255.0f * color.r * shade;
|
||||||
@ -415,6 +516,19 @@ enum
|
|||||||
*px++ = 255.0f * color.b * shade;
|
*px++ = 255.0f * color.b * shade;
|
||||||
|
|
||||||
*px++ = 0; // FIXME: light map goes here.
|
*px++ = 0; // FIXME: light map goes here.
|
||||||
|
|
||||||
|
if (generateAtmosphere)
|
||||||
|
{
|
||||||
|
//q = QFactor(accBuffer, x, y, width, polarClouds, _cloudFraction, nearPole);
|
||||||
|
q=accBuffer[y * width + x];
|
||||||
|
q *= q;
|
||||||
|
//color = CloudMix(q, _airColor, _cloudColor, _polarAirColor, _polarCloudColor, _cloudAlpha, nearPole);
|
||||||
|
color = cloudColor;
|
||||||
|
*apx++ = 255.0f * color.r;
|
||||||
|
*apx++ = 255.0f * color.g;
|
||||||
|
*apx++ = 255.0f * color.b;
|
||||||
|
*apx++ = 255.0f * _cloudAlpha * q;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,14 +542,17 @@ END:
|
|||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
data = buffer;
|
data = buffer;
|
||||||
[_nMapGenerator completeWithData:nBuffer width:width height:height];
|
if (generateNormalMap) [_nMapGenerator completeWithData:nBuffer width:width height:height];
|
||||||
|
if (generateAtmosphere) [_atmoGenerator completeWithData:aBuffer width:width height:height];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
free(buffer);
|
free(buffer);
|
||||||
free(nBuffer);
|
free(nBuffer);
|
||||||
|
free(aBuffer);
|
||||||
}
|
}
|
||||||
DESTROY(_nMapGenerator);
|
DESTROY(_nMapGenerator);
|
||||||
|
DESTROY(_atmoGenerator);
|
||||||
|
|
||||||
OOLog(@"planetTex.temp", @"Completed generator %@ %@successfully", self, success ? @"" : @"un");
|
OOLog(@"planetTex.temp", @"Completed generator %@ %@successfully", self, success ? @"" : @"un");
|
||||||
|
|
||||||
@ -485,6 +602,12 @@ END:
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
static float fBlend(float fraction, float a, float b)
|
||||||
|
{
|
||||||
|
return fraction * a + (1.0f - fraction) * b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b)
|
static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b)
|
||||||
{
|
{
|
||||||
float prime = 1.0f - fraction;
|
float prime = 1.0f - fraction;
|
||||||
@ -498,6 +621,83 @@ static FloatRGB Blend(float fraction, FloatRGB a, FloatRGB b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static FloatRGBA CloudMix(float q, FloatRGB airColor, FloatRGB cloudColor, FloatRGB paleAirColor, FloatRGB paleCloudColor, float alpha, float nearPole)
|
||||||
|
{
|
||||||
|
#define AIR_ALPHA (0.05f)
|
||||||
|
#define CLOUD_ALPHA (0.50f)
|
||||||
|
#define POLAR_AIR_ALPHA (0.34f)
|
||||||
|
#define POLAR_CLOUD_ALPHA (0.75f)
|
||||||
|
|
||||||
|
#define POLAR_BOUNDARY (0.66f)
|
||||||
|
#define RECIP_CLOUD_BOUNDARY (200.0f)
|
||||||
|
#define CLOUD_BOUNDARY (1.0f / RECIP_CLOUD_BOUNDARY)
|
||||||
|
|
||||||
|
FloatRGB result = cloudColor;
|
||||||
|
float portion = 0.0f;
|
||||||
|
|
||||||
|
q -= CLOUD_BOUNDARY;
|
||||||
|
|
||||||
|
if (nearPole > POLAR_BOUNDARY)
|
||||||
|
{
|
||||||
|
portion = nearPole > POLAR_BOUNDARY + 0.06f ? 1.0f : 0.4f + (nearPole - POLAR_BOUNDARY) * 10.0f; // x * 10 == ((x / 0.06) * 0.6
|
||||||
|
|
||||||
|
if (q <= 0.0f)
|
||||||
|
{
|
||||||
|
alpha *= fBlend(portion, CLOUD_ALPHA, POLAR_CLOUD_ALPHA);
|
||||||
|
if (q >= -CLOUD_BOUNDARY)
|
||||||
|
{
|
||||||
|
portion = -q * 0.5f * RECIP_CLOUD_BOUNDARY + 0.5f;
|
||||||
|
result = Blend(portion, paleCloudColor, paleAirColor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = paleCloudColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alpha *= portion * POLAR_AIR_ALPHA;
|
||||||
|
if (q < CLOUD_BOUNDARY)
|
||||||
|
{
|
||||||
|
result = Blend(q * RECIP_CLOUD_BOUNDARY, paleAirColor, paleCloudColor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = paleAirColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (q <= 0.0f)
|
||||||
|
{
|
||||||
|
if (q >= -CLOUD_BOUNDARY){
|
||||||
|
portion = -q * 0.5f * RECIP_CLOUD_BOUNDARY + 0.5f;
|
||||||
|
alpha *= portion * CLOUD_ALPHA;
|
||||||
|
result = Blend(portion, cloudColor, airColor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = cloudColor;
|
||||||
|
alpha *= CLOUD_ALPHA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (q < CLOUD_BOUNDARY)
|
||||||
|
{
|
||||||
|
alpha *= AIR_ALPHA;
|
||||||
|
result = Blend(q * RECIP_CLOUD_BOUNDARY, airColor, cloudColor);
|
||||||
|
}
|
||||||
|
else if (q >= CLOUD_BOUNDARY)
|
||||||
|
{
|
||||||
|
alpha *= AIR_ALPHA;
|
||||||
|
result = airColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (FloatRGBA){ result.r, result.g, result.b, alpha};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static FloatRGBA PlanetMix(float q, FloatRGB landColor, FloatRGB seaColor, FloatRGB paleLandColor, FloatRGB paleSeaColor, FloatRGB polarSeaColor, float nearPole)
|
static FloatRGBA PlanetMix(float q, FloatRGB landColor, FloatRGB seaColor, FloatRGB paleLandColor, FloatRGB paleSeaColor, FloatRGB polarSeaColor, float nearPole)
|
||||||
{
|
{
|
||||||
float phi = mix_polarCap + mix_polarCap - nearPole; // (q > mix_polarCap + mix_polarCap - nearPole) == ((nearPole + q) / 2 > mix_polarCap)
|
float phi = mix_polarCap + mix_polarCap - nearPole; // (q > mix_polarCap + mix_polarCap - nearPole) == ((nearPole + q) / 2 > mix_polarCap)
|
||||||
@ -632,34 +832,38 @@ OOINLINE float Hermite(float q)
|
|||||||
static void AddNoise(float *buffer, unsigned width, unsigned height, float octave, unsigned octaveMask, float scale, const float *noiseBuffer)
|
static void AddNoise(float *buffer, unsigned width, unsigned height, float octave, unsigned octaveMask, float scale, const float *noiseBuffer)
|
||||||
{
|
{
|
||||||
unsigned x, y;
|
unsigned x, y;
|
||||||
|
int ix, jx, iy, jy;
|
||||||
float rr = octave / width;
|
float rr = octave / width;
|
||||||
float *dst = buffer;
|
float *dst = buffer;
|
||||||
float fx, fy;
|
float fx, fy, qx, qy, rix, rjx, rfinal;
|
||||||
|
|
||||||
for (fy = 0, y = 0; y < height; fy++, y++)
|
for (fy = 0, y = 0; y < height; fy++, y++)
|
||||||
{
|
|
||||||
for (fx = 0, x = 0; x < width; fx++, x++)
|
|
||||||
{
|
{
|
||||||
// FIXME: do this with less float/int conversions.
|
// FIXME: do this with less float/int conversions.
|
||||||
int ix = fx * rr; // FLOAT->INT
|
iy = fy * rr; // FLOAT->INT
|
||||||
int jx = (ix + 1) & octaveMask;
|
jy = (iy + 1) & octaveMask;
|
||||||
int iy = fy * rr; // FLOAT->INT
|
qy = fy * rr - iy;
|
||||||
int jy = (iy + 1) & octaveMask;
|
|
||||||
float qx = fx * rr - ix;
|
|
||||||
float qy = fy * rr - iy;
|
|
||||||
ix &= (kNoiseBufferSize - 1);
|
|
||||||
iy &= (kNoiseBufferSize - 1);
|
iy &= (kNoiseBufferSize - 1);
|
||||||
jx &= (kNoiseBufferSize - 1);
|
|
||||||
jy &= (kNoiseBufferSize - 1);
|
jy &= (kNoiseBufferSize - 1);
|
||||||
|
|
||||||
#if HERMITE
|
#if HERMITE
|
||||||
qx = Hermite(qx);
|
|
||||||
qy = Hermite(qy);
|
qy = Hermite(qy);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float rix = Lerp(noiseBuffer[iy * kNoiseBufferSize + ix], noiseBuffer[iy * kNoiseBufferSize + jx], qx);
|
for (fx = 0, x = 0; x < width; fx++, x++)
|
||||||
float rjx = Lerp(noiseBuffer[jy * kNoiseBufferSize + ix], noiseBuffer[jy * kNoiseBufferSize + jx], qx);
|
{
|
||||||
float rfinal = scale * Lerp(rix, rjx, qy);
|
// FIXME: do this with less float/int conversions.
|
||||||
|
ix = fx * rr; // FLOAT->INT
|
||||||
|
jx = (ix + 1) & octaveMask;
|
||||||
|
qx = fx * rr - ix;
|
||||||
|
ix &= (kNoiseBufferSize - 1);
|
||||||
|
jx &= (kNoiseBufferSize - 1);
|
||||||
|
#if HERMITE
|
||||||
|
qx = Hermite(qx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rix = Lerp(noiseBuffer[iy * kNoiseBufferSize + ix], noiseBuffer[iy * kNoiseBufferSize + jx], qx);
|
||||||
|
rjx = Lerp(noiseBuffer[jy * kNoiseBufferSize + ix], noiseBuffer[jy * kNoiseBufferSize + jx], qx);
|
||||||
|
rfinal = scale * Lerp(rix, rjx, qy);
|
||||||
|
|
||||||
*dst++ += rfinal;
|
*dst++ += rfinal;
|
||||||
}
|
}
|
||||||
@ -777,3 +981,72 @@ static void SetMixConstants(float maxQ, float temperatureFraction)
|
|||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@implementation OOPlanetAtmosphereGenerator
|
||||||
|
|
||||||
|
- (id) initWithCacheKey:(NSString *)cacheKey seed:(RANROTSeed)seed
|
||||||
|
{
|
||||||
|
if ((self = [super init]))
|
||||||
|
{
|
||||||
|
_cacheKey = [cacheKey copy];
|
||||||
|
_seed = seed;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
DESTROY(_cacheKey);
|
||||||
|
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSString *) cacheKey
|
||||||
|
{
|
||||||
|
return _cacheKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (uint32_t) textureOptions
|
||||||
|
{
|
||||||
|
return PLANET_TEXTURE_OPTIONS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (BOOL) enqueue
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void) loadTexture
|
||||||
|
{
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void) completeWithData:(void *)data_ width:(unsigned)width_ height:(unsigned)height_
|
||||||
|
{
|
||||||
|
data = data_;
|
||||||
|
width = width_;
|
||||||
|
height = height_;
|
||||||
|
format = kOOTextureDataRGBA;
|
||||||
|
|
||||||
|
// Enqueue so superclass can apply texture options and so forth.
|
||||||
|
[super enqueue];
|
||||||
|
|
||||||
|
#if DEBUG_DUMP
|
||||||
|
NSString *name = [NSString stringWithFormat:@"planet-%u-%u-atmosphere-new", _seed.high, _seed.low];
|
||||||
|
|
||||||
|
[[UNIVERSE gameView] dumpRGBAToFileNamed:name
|
||||||
|
bytes:data
|
||||||
|
width:width
|
||||||
|
height:height
|
||||||
|
rowBytes:width * 4];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
@ -506,6 +506,7 @@ enum
|
|||||||
- (void) setSystemDataForGalaxy:(OOGalaxyID) gnum planet:(OOSystemID) pnum key:(NSString *)key value:(id)object;
|
- (void) setSystemDataForGalaxy:(OOGalaxyID) gnum planet:(OOSystemID) pnum key:(NSString *)key value:(id)object;
|
||||||
- (id) getSystemDataForGalaxy:(OOGalaxyID) gnum planet:(OOSystemID) pnum key:(NSString *)key;
|
- (id) getSystemDataForGalaxy:(OOGalaxyID) gnum planet:(OOSystemID) pnum key:(NSString *)key;
|
||||||
- (NSString *) getSystemName:(Random_Seed) s_seed;
|
- (NSString *) getSystemName:(Random_Seed) s_seed;
|
||||||
|
- (OOGovernmentID) getSystemGovernment:(Random_Seed)s_seed;
|
||||||
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed;
|
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed;
|
||||||
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed plural:(BOOL)plural;
|
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed plural:(BOOL)plural;
|
||||||
- (NSString *) generateSystemName:(Random_Seed) system_seed;
|
- (NSString *) generateSystemName:(Random_Seed) system_seed;
|
||||||
@ -544,8 +545,8 @@ double estimatedTimeForJourney(double distance, int hops);
|
|||||||
- (NSString *) shortTimeDescription:(OOTimeDelta) interval;
|
- (NSString *) shortTimeDescription:(OOTimeDelta) interval;
|
||||||
|
|
||||||
- (Random_Seed) marketSeed;
|
- (Random_Seed) marketSeed;
|
||||||
- (NSArray *) passengersForSystem:(Random_Seed) s_seed atTime:(OOTimeAbsolute) current_time;
|
- (NSArray *) passengersForLocalSystemAtTime:(OOTimeAbsolute) current_time;
|
||||||
- (NSArray *) contractsForSystem:(Random_Seed) s_seed atTime:(OOTimeAbsolute) current_time;
|
- (NSArray *) contractsForLocalSystemAtTime:(OOTimeAbsolute) current_time;
|
||||||
- (NSArray *) shipsForSaleForSystem:(Random_Seed) s_seed withTL:(OOTechLevelID) specialTL atTime:(OOTimeAbsolute) current_time;
|
- (NSArray *) shipsForSaleForSystem:(Random_Seed) s_seed withTL:(OOTechLevelID) specialTL atTime:(OOTimeAbsolute) current_time;
|
||||||
|
|
||||||
/* Calculate base cost, before depreciation */
|
/* Calculate base cost, before depreciation */
|
||||||
|
@ -469,7 +469,7 @@ OOINLINE size_t class_getInstanceSize(Class cls)
|
|||||||
[self initPlayerSettings];
|
[self initPlayerSettings];
|
||||||
autoSaveNow = NO; // don't autosave immediately after loading / restarting game!
|
autoSaveNow = NO; // don't autosave immediately after loading / restarting game!
|
||||||
|
|
||||||
[[self station] initialiseLocalMarketWithSeed:system_seed andRandomFactor:[player random_factor]];
|
[[self station] initialiseLocalMarketWithRandomFactor:[player random_factor]];
|
||||||
|
|
||||||
if(showDemo)
|
if(showDemo)
|
||||||
{
|
{
|
||||||
@ -6274,7 +6274,7 @@ static NSDictionary *sCachedSystemData = nil;
|
|||||||
{
|
{
|
||||||
if ([key isEqualToString:KEY_ECONOMY])
|
if ([key isEqualToString:KEY_ECONOMY])
|
||||||
{
|
{
|
||||||
if([self station]) [[self station] initialiseLocalMarketWithSeed:s_seed andRandomFactor:[[PlayerEntity sharedPlayer] random_factor]];
|
if([self station]) [[self station] initialiseLocalMarketWithRandomFactor:[[PlayerEntity sharedPlayer] random_factor]];
|
||||||
}
|
}
|
||||||
else if ([key isEqualToString:KEY_TECHLEVEL])
|
else if ([key isEqualToString:KEY_TECHLEVEL])
|
||||||
{
|
{
|
||||||
@ -6357,6 +6357,12 @@ static NSDictionary *sCachedSystemData = nil;
|
|||||||
return [[self generateSystemData:s_seed] oo_stringForKey:KEY_NAME];
|
return [[self generateSystemData:s_seed] oo_stringForKey:KEY_NAME];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (OOGovernmentID) getSystemGovernment:(Random_Seed)s_seed
|
||||||
|
{
|
||||||
|
return [[self generateSystemData:s_seed] oo_unsignedCharForKey:KEY_GOVERNMENT];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed
|
- (NSString *) getSystemInhabitants:(Random_Seed) s_seed
|
||||||
{
|
{
|
||||||
@ -6968,13 +6974,13 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSArray *) passengersForSystem:(Random_Seed) s_seed atTime:(OOTimeAbsolute) current_time
|
- (NSArray *) passengersForLocalSystemAtTime:(OOTimeAbsolute) current_time
|
||||||
{
|
{
|
||||||
PlayerEntity* player = [PlayerEntity sharedPlayer];
|
PlayerEntity* player = [PlayerEntity sharedPlayer];
|
||||||
int player_repute = [player passengerReputation];
|
int player_repute = [player passengerReputation];
|
||||||
|
|
||||||
int start = [self findSystemNumberAtCoords:NSMakePoint(s_seed.d, s_seed.b) withGalaxySeed:galaxy_seed];
|
int start = [self currentSystemID];
|
||||||
NSString* native_species = [self getSystemInhabitants:s_seed plural:NO];
|
NSString* native_species = [self getSystemInhabitants:system_seed plural:NO];
|
||||||
|
|
||||||
// passenger seed is calculated in a similar way to all other market seeds
|
// passenger seed is calculated in a similar way to all other market seeds
|
||||||
// but gives better results when done .a to .f instead of .f to .a...
|
// but gives better results when done .a to .f instead of .f to .a...
|
||||||
@ -6984,7 +6990,7 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
long random_factor = current_time;
|
long random_factor = current_time;
|
||||||
random_factor = (random_factor >> 24) &0xff;
|
random_factor = (random_factor >> 24) &0xff;
|
||||||
|
|
||||||
Random_Seed passenger_seed = s_seed;
|
Random_Seed passenger_seed = system_seed;
|
||||||
passenger_seed.a ^= random_factor; // XOR
|
passenger_seed.a ^= random_factor; // XOR
|
||||||
passenger_seed.b ^= passenger_seed.a; // XOR
|
passenger_seed.b ^= passenger_seed.a; // XOR
|
||||||
passenger_seed.c ^= passenger_seed.b; // XOR
|
passenger_seed.c ^= passenger_seed.b; // XOR
|
||||||
@ -6995,13 +7001,13 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
// 'standardised' passenger seed - not as good as the traditional one.
|
// 'standardised' passenger seed - not as good as the traditional one.
|
||||||
//Random_Seed passenger_seed = [self marketSeed];
|
//Random_Seed passenger_seed = [self marketSeed];
|
||||||
|
|
||||||
NSMutableArray* resultArray = [NSMutableArray arrayWithCapacity:255];
|
NSMutableArray* resultArray = [NSMutableArray arrayWithCapacity:256];
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
|
|
||||||
|
long long reference_time = 0x1000000 * floor(current_time / 0x1000000);
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
long long reference_time = 0x1000000 * floor(current_time / 0x1000000);
|
|
||||||
|
|
||||||
long long passenger_time = passenger_seed.a * 0x10000 + passenger_seed.b * 0x100 + passenger_seed.c;
|
long long passenger_time = passenger_seed.a * 0x10000 + passenger_seed.b * 0x100 + passenger_seed.c;
|
||||||
double passenger_departure_time = reference_time + passenger_time;
|
double passenger_departure_time = reference_time + passenger_time;
|
||||||
|
|
||||||
@ -7022,21 +7028,22 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
BOOL lowercaseIgnore = [[self descriptions] oo_boolForKey:@"lowercase_ignore"]; // i18n.
|
BOOL lowercaseIgnore = [[self descriptions] oo_boolForKey:@"lowercase_ignore"]; // i18n.
|
||||||
// determine the passenger's species
|
// determine the passenger's species
|
||||||
int passenger_species = passenger_seed.f & 3; // 0-1 native, 2 human colonial, 3 other
|
int passenger_species = passenger_seed.f & 3; // 0-1 native, 2 human colonial, 3 other
|
||||||
NSString* passenger_species_string = [NSString stringWithString:native_species];
|
NSString* passenger_species_string = nil;
|
||||||
if (passenger_species == 2)
|
switch (passenger_species)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
passenger_species_string = DESC(@"human-colonial-description%0");
|
passenger_species_string = DESC(@"human-colonial-description%0");
|
||||||
if (passenger_species == 3)
|
break;
|
||||||
{
|
case 3:
|
||||||
passenger_species_string = [self getSystemInhabitants:passenger_seed plural:NO];
|
passenger_species_string = [self getSystemInhabitants:passenger_seed plural:NO];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
passenger_species_string = [NSString stringWithString:native_species];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(!lowercaseIgnore)
|
|
||||||
{
|
if (!lowercaseIgnore) passenger_species_string = [passenger_species_string lowercaseString];
|
||||||
passenger_species_string = [[passenger_species_string lowercaseString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
passenger_species_string = [passenger_species_string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
passenger_species_string = [passenger_species_string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
}
|
|
||||||
|
|
||||||
// determine the passenger's name
|
// determine the passenger's name
|
||||||
seed_RNG_only_for_planet_description(passenger_seed);
|
seed_RNG_only_for_planet_description(passenger_seed);
|
||||||
@ -7183,7 +7190,7 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSArray *) contractsForSystem:(Random_Seed) s_seed atTime:(double) current_time
|
- (NSArray *) contractsForLocalSystemAtTime:(double) current_time
|
||||||
{
|
{
|
||||||
PlayerEntity* player = [PlayerEntity sharedPlayer];
|
PlayerEntity* player = [PlayerEntity sharedPlayer];
|
||||||
|
|
||||||
@ -7194,21 +7201,21 @@ double estimatedTimeForJourney(double distance, int hops)
|
|||||||
random_factor = (random_factor >> 24) &0xff;
|
random_factor = (random_factor >> 24) &0xff;
|
||||||
Random_Seed contract_seed = [self marketSeed];
|
Random_Seed contract_seed = [self marketSeed];
|
||||||
|
|
||||||
int start = [self findSystemNumberAtCoords:NSMakePoint(s_seed.d, s_seed.b) withGalaxySeed:galaxy_seed];
|
int start = [self currentSystemID];
|
||||||
|
|
||||||
NSMutableArray* resultArray = [NSMutableArray arrayWithCapacity:255];
|
NSMutableArray* resultArray = [NSMutableArray arrayWithCapacity:256];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
NSArray* localMarket;
|
NSArray* localMarket;
|
||||||
if ([[self station] localMarket])
|
if ([[self station] localMarket])
|
||||||
localMarket = [[self station] localMarket];
|
localMarket = [[self station] localMarket];
|
||||||
else
|
else
|
||||||
localMarket = [[self station] initialiseLocalMarketWithSeed:s_seed andRandomFactor:random_factor];
|
localMarket = [[self station] initialiseLocalMarketWithRandomFactor:random_factor];
|
||||||
|
|
||||||
|
long long reference_time = 0x1000000 * floor(current_time / 0x1000000);
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
long long reference_time = 0x1000000 * floor(current_time / 0x1000000);
|
|
||||||
|
|
||||||
long long contract_time = contract_seed.a * 0x10000 + contract_seed.b * 0x100 + contract_seed.c;
|
long long contract_time = contract_seed.a * 0x10000 + contract_seed.b * 0x100 + contract_seed.c;
|
||||||
double contract_departure_time = reference_time + contract_time;
|
double contract_departure_time = reference_time + contract_time;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user