Rudimentary planet shader (disabled with SHADY_PLANETS macro in OOPlanetEntity.m; texture mapping only, no lighting, but with per-pixel calculation of longitude component to completely eliminate distortion. Interacts badly with mip-mapping, though.)
git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@2860 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
parent
8afb80c43c
commit
41f5d03697
@ -606,6 +606,8 @@
|
|||||||
1AD1F4FF0CD9E83700EAE520 /* NSThreadOOExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD1F4C80CD9E42A00EAE520 /* NSThreadOOExtensions.m */; };
|
1AD1F4FF0CD9E83700EAE520 /* NSThreadOOExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD1F4C80CD9E42A00EAE520 /* NSThreadOOExtensions.m */; };
|
||||||
1AD1F5000CD9E83800EAE520 /* NSThreadOOExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AD1F4C70CD9E42A00EAE520 /* NSThreadOOExtensions.h */; };
|
1AD1F5000CD9E83800EAE520 /* NSThreadOOExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AD1F4C70CD9E42A00EAE520 /* NSThreadOOExtensions.h */; };
|
||||||
1ADA564810CD68D800E891B8 /* OOStellarBody.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADA564710CD68D800E891B8 /* OOStellarBody.h */; };
|
1ADA564810CD68D800E891B8 /* OOStellarBody.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADA564710CD68D800E891B8 /* OOStellarBody.h */; };
|
||||||
|
1ADA576D10CDB1E700E891B8 /* oolite-default-planet.vertex in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 1ADA576710CDB1C300E891B8 /* oolite-default-planet.vertex */; };
|
||||||
|
1ADA576E10CDB1E700E891B8 /* oolite-default-planet.fragment in Copy Shaders */ = {isa = PBXBuildFile; fileRef = 1ADA576910CDB1C600E891B8 /* oolite-default-planet.fragment */; };
|
||||||
1ADA8AB30F42DBA80001BEC9 /* OODeepCopy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADA8AB10F42DBA80001BEC9 /* OODeepCopy.h */; };
|
1ADA8AB30F42DBA80001BEC9 /* OODeepCopy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADA8AB10F42DBA80001BEC9 /* OODeepCopy.h */; };
|
||||||
1ADA8AB40F42DBA80001BEC9 /* OODeepCopy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA8AB20F42DBA80001BEC9 /* OODeepCopy.m */; };
|
1ADA8AB40F42DBA80001BEC9 /* OODeepCopy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA8AB20F42DBA80001BEC9 /* OODeepCopy.m */; };
|
||||||
1ADBA5500BD0F173008FC99C /* OOBasicMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADBA54E0BD0F173008FC99C /* OOBasicMaterial.h */; };
|
1ADBA5500BD0F173008FC99C /* OOBasicMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADBA54E0BD0F173008FC99C /* OOBasicMaterial.h */; };
|
||||||
@ -1066,6 +1068,8 @@
|
|||||||
dstPath = Shaders;
|
dstPath = Shaders;
|
||||||
dstSubfolderSpec = 7;
|
dstSubfolderSpec = 7;
|
||||||
files = (
|
files = (
|
||||||
|
1ADA576D10CDB1E700E891B8 /* oolite-default-planet.vertex in Copy Shaders */,
|
||||||
|
1ADA576E10CDB1E700E891B8 /* oolite-default-planet.fragment in Copy Shaders */,
|
||||||
1A6515100CCC9E2E0054D01B /* oolite-standard-vertex.vertex in Copy Shaders */,
|
1A6515100CCC9E2E0054D01B /* oolite-standard-vertex.vertex in Copy Shaders */,
|
||||||
1A02FD460EE0490B008F9B09 /* oolite-tangent-space-vertex.vertex in Copy Shaders */,
|
1A02FD460EE0490B008F9B09 /* oolite-tangent-space-vertex.vertex in Copy Shaders */,
|
||||||
1A6515110CCC9E2E0054D01B /* oolite-default-shader.fragment in Copy Shaders */,
|
1A6515110CCC9E2E0054D01B /* oolite-default-shader.fragment in Copy Shaders */,
|
||||||
@ -1697,6 +1701,8 @@
|
|||||||
1AD6B3280E3BB55E001C42D9 /* debug-exports-64.exp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.exports; path = "debug-exports-64.exp"; sourceTree = "<group>"; };
|
1AD6B3280E3BB55E001C42D9 /* debug-exports-64.exp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.exports; path = "debug-exports-64.exp"; sourceTree = "<group>"; };
|
||||||
1AD88FAF103F29D300AA36F4 /* oolite-options.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "oolite-options.xcconfig"; path = "src/Cocoa/oolite-options.xcconfig"; sourceTree = "<group>"; };
|
1AD88FAF103F29D300AA36F4 /* oolite-options.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "oolite-options.xcconfig"; path = "src/Cocoa/oolite-options.xcconfig"; sourceTree = "<group>"; };
|
||||||
1ADA564710CD68D800E891B8 /* OOStellarBody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOStellarBody.h; sourceTree = "<group>"; };
|
1ADA564710CD68D800E891B8 /* OOStellarBody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOStellarBody.h; sourceTree = "<group>"; };
|
||||||
|
1ADA576710CDB1C300E891B8 /* oolite-default-planet.vertex */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.frag; path = "oolite-default-planet.vertex"; sourceTree = "<group>"; };
|
||||||
|
1ADA576910CDB1C600E891B8 /* oolite-default-planet.fragment */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.vert; path = "oolite-default-planet.fragment"; sourceTree = "<group>"; };
|
||||||
1ADA8AB10F42DBA80001BEC9 /* OODeepCopy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OODeepCopy.h; sourceTree = "<group>"; };
|
1ADA8AB10F42DBA80001BEC9 /* OODeepCopy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OODeepCopy.h; sourceTree = "<group>"; };
|
||||||
1ADA8AB20F42DBA80001BEC9 /* OODeepCopy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OODeepCopy.m; sourceTree = "<group>"; };
|
1ADA8AB20F42DBA80001BEC9 /* OODeepCopy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OODeepCopy.m; sourceTree = "<group>"; };
|
||||||
1ADBA54E0BD0F173008FC99C /* OOBasicMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOBasicMaterial.h; sourceTree = "<group>"; };
|
1ADBA54E0BD0F173008FC99C /* OOBasicMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOBasicMaterial.h; sourceTree = "<group>"; };
|
||||||
@ -2383,6 +2389,8 @@
|
|||||||
1A65150D0CCC9E220054D01B /* oolite-standard-vertex.vertex */,
|
1A65150D0CCC9E220054D01B /* oolite-standard-vertex.vertex */,
|
||||||
1A02FD340EE048E8008F9B09 /* oolite-tangent-space-vertex.vertex */,
|
1A02FD340EE048E8008F9B09 /* oolite-tangent-space-vertex.vertex */,
|
||||||
1A65150E0CCC9E220054D01B /* oolite-default-shader.fragment */,
|
1A65150E0CCC9E220054D01B /* oolite-default-shader.fragment */,
|
||||||
|
1ADA576710CDB1C300E891B8 /* oolite-default-planet.vertex */,
|
||||||
|
1ADA576910CDB1C600E891B8 /* oolite-default-planet.fragment */,
|
||||||
);
|
);
|
||||||
path = Shaders;
|
path = Shaders;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -8,19 +8,41 @@
|
|||||||
// Macros prepended to shader source code for ship entities.
|
// Macros prepended to shader source code for ship entities.
|
||||||
"ship-prefix-macros" =
|
"ship-prefix-macros" =
|
||||||
{
|
{
|
||||||
"OO_USER_DEFINED_BINDINGS" = 1;
|
OO_USER_DEFINED_BINDINGS = 1;
|
||||||
"OO_TANGENT_ATTR" = 1;
|
OO_TANGENT_ATTR = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Material definition used for DAT files with no TEXTURES section (which specifies material names and texture co-ordinates).
|
// Material definition used for DAT files with no TEXTURES section (which specifies material names and texture co-ordinates).
|
||||||
"no-textures-material" =
|
"no-textures-material" =
|
||||||
{
|
{
|
||||||
"diffuse_map" = "";
|
diffuse_map = "";
|
||||||
"diffuse" = (0, 0, 0.4);
|
diffuse = (0, 0, 0.4);
|
||||||
"ambient" = (0, 0, 0.4);
|
ambient = (0, 0, 0.4);
|
||||||
"emission" = (0.9, 0.9, 0.9);
|
emission = (0.9, 0.9, 0.9);
|
||||||
"specular" = (1.0, 0.8, 0.8);
|
specular = (1.0, 0.8, 0.8);
|
||||||
"shininess" = 1;
|
shininess = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
"planet-material" =
|
||||||
|
{
|
||||||
|
// Textures added dynamically.
|
||||||
|
vertex_shader = "oolite-default-planet.vertex";
|
||||||
|
fragment_shader = "oolite-default-planet.fragment";
|
||||||
|
uniforms =
|
||||||
|
{
|
||||||
|
uDiffuseMap = { type = texture; value = 0; };
|
||||||
|
uNormalMap = { type = texture; value = 1; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"planet-synthetic-macros" =
|
||||||
|
{
|
||||||
|
OOSTD_DIFFUSE_AND_SPECULAR_MAP = 1;
|
||||||
|
OOSTD_CUBE_MAP = 0;
|
||||||
|
};
|
||||||
|
"planet-customized-macros" =
|
||||||
|
{
|
||||||
|
OOSTD_DIFFUSE_MAP = 1;
|
||||||
|
OOSTD_CUBE_MAP = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
69
Resources/Shaders/oolite-default-planet.fragment
Normal file
69
Resources/Shaders/oolite-default-planet.fragment
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#define OO_LIGHT_0_FIX 0
|
||||||
|
|
||||||
|
uniform sampler2D uDiffuseMap;
|
||||||
|
|
||||||
|
// No vNormal, because normal is always 0,0,1 in tangent space.
|
||||||
|
varying vec3 vEyeVector;
|
||||||
|
varying vec2 vTexCoords;
|
||||||
|
varying vec3 vLight0Vector;
|
||||||
|
varying vec3 vLight1Vector;
|
||||||
|
varying vec3 vNormal;
|
||||||
|
varying vec3 vCoords;
|
||||||
|
|
||||||
|
|
||||||
|
vec4 CalcDiffuseLight(in vec3 lightVector, in vec3 normal, in vec4 lightColor)
|
||||||
|
{
|
||||||
|
float intensity = lightVector.z;
|
||||||
|
intensity = max(intensity, 0.0);
|
||||||
|
return lightColor * intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef OO_REDUCED_COMPLEXITY
|
||||||
|
/* Approximation of atan(y/z) with quadrant rectification, scaled to -0.5..0.5 instead of -pi..pi.
|
||||||
|
It is assumed that the values are in range. You are not expected to understand this.
|
||||||
|
*/
|
||||||
|
float TexLongitude(float z, float y)
|
||||||
|
{
|
||||||
|
const float k2Pi = 6.283185307179586;
|
||||||
|
const float kMagic = 0.2732395447351; // (4 - pi) / pi
|
||||||
|
|
||||||
|
float ratio = z / y;
|
||||||
|
|
||||||
|
float r1 = 1.0 / ((ratio + kMagic / ratio) * k2Pi); // Result when abs(y) >= abs(x).
|
||||||
|
float r2 = 0.25 * sign(ratio) - ratio / ((1.0 + kMagic * ratio * ratio) * k2Pi); // Result when abs(y) <= abs(x).
|
||||||
|
|
||||||
|
float result = (abs(ratio) > 1.0) ? r1 : r2;
|
||||||
|
|
||||||
|
// Adjust for sector.
|
||||||
|
// Equivalent to (z < 0.0) ? ((y > 0.0) ? 0.75 : -0.25) : 0.25.
|
||||||
|
// Well, technically not equivalent for z < 0, y = 0, but you'll very rarely see that exact case.
|
||||||
|
return result + step(z, 0.0) * sign(y) * 0.5 + 0.25;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
/* Fun sphere facts: the normalized coordinates of a point on a sphere at the origin
|
||||||
|
is equal to the object-space normal of the surface at that point.
|
||||||
|
Furthermore, we can construct the binormal (a vector pointing westward along the
|
||||||
|
surface) as the cross product of the normal with the Y axis. (This produces
|
||||||
|
singularities at the pole, but there have to be singularities according to the
|
||||||
|
Hairy Ball Theorem.) The tangent (a vector north along the surface) is then the
|
||||||
|
inverse of the cross product of the normal and binormal.
|
||||||
|
*/
|
||||||
|
vec3 coords = normalize(vCoords);
|
||||||
|
#define normal coords
|
||||||
|
vec3 binormal = cross(normal, vec3(0, 1, 0));
|
||||||
|
vec3 tangent = -cross(normal, binormal);
|
||||||
|
|
||||||
|
#ifdef OO_REDUCED_COMPLEXITY
|
||||||
|
#define texCoords vTexCoords
|
||||||
|
#else
|
||||||
|
vec2 texCoords = vec2(TexLongitude(coords.x, coords.z), vTexCoords.t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec4 diffuseMapColor = texture2D(uDiffuseMap, texCoords);
|
||||||
|
gl_FragColor = diffuseMapColor;
|
||||||
|
}
|
36
Resources/Shaders/oolite-default-planet.vertex
Normal file
36
Resources/Shaders/oolite-default-planet.vertex
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
attribute vec3 tangent;
|
||||||
|
|
||||||
|
|
||||||
|
// No vNormal, because normal is always 0,0,1 in tangent space.
|
||||||
|
varying vec3 vEyeVector;
|
||||||
|
varying vec2 vTexCoords;
|
||||||
|
varying vec3 vLight0Vector;
|
||||||
|
varying vec3 vLight1Vector;
|
||||||
|
varying vec3 vNormal;
|
||||||
|
varying vec3 vCoords;
|
||||||
|
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
vCoords = gl_Vertex.xyz;
|
||||||
|
|
||||||
|
// Build tangent basis
|
||||||
|
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
|
||||||
|
vec3 t = normalize(gl_NormalMatrix * tangent);
|
||||||
|
vec3 b = cross(n, t);
|
||||||
|
vNormal = n;
|
||||||
|
|
||||||
|
mat3 TBN = mat3(t, b, n);
|
||||||
|
|
||||||
|
vec3 eyeVector = -vec3(gl_ModelViewMatrix * gl_Vertex);
|
||||||
|
vEyeVector = eyeVector * TBN;
|
||||||
|
|
||||||
|
vec3 light0Vector = gl_LightSource[0].position.xyz + eyeVector;
|
||||||
|
vLight0Vector = light0Vector * TBN;
|
||||||
|
|
||||||
|
vec3 light1Vector = /*gl_LightSource[1].position.xyz*/ vec3(30, 100, 50) + eyeVector;
|
||||||
|
vLight1Vector = light1Vector * TBN;
|
||||||
|
|
||||||
|
vTexCoords = gl_MultiTexCoord0.st;
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||||
|
}
|
@ -26,6 +26,8 @@ MA 02110-1301, USA.
|
|||||||
|
|
||||||
#if NEW_PLANETS
|
#if NEW_PLANETS
|
||||||
|
|
||||||
|
#define SHADY_PLANETS 0
|
||||||
|
|
||||||
#import "OOPlanetDrawable.h"
|
#import "OOPlanetDrawable.h"
|
||||||
|
|
||||||
#import "AI.h"
|
#import "AI.h"
|
||||||
@ -34,11 +36,13 @@ MA 02110-1301, USA.
|
|||||||
#import "OOCharacter.h"
|
#import "OOCharacter.h"
|
||||||
|
|
||||||
#import "OOMaths.h"
|
#import "OOMaths.h"
|
||||||
|
#import "ResourceManager.h"
|
||||||
#import "OOStringParsing.h"
|
#import "OOStringParsing.h"
|
||||||
#import "OOCollectionExtractors.h"
|
#import "OOCollectionExtractors.h"
|
||||||
|
|
||||||
#import "OOPlanetTextureGenerator.h"
|
#import "OOPlanetTextureGenerator.h"
|
||||||
#import "OOSingleTextureMaterial.h"
|
#import "OOSingleTextureMaterial.h"
|
||||||
|
#import "OOShaderMaterial.h"
|
||||||
|
|
||||||
|
|
||||||
@interface OOPlanetEntity (Private)
|
@interface OOPlanetEntity (Private)
|
||||||
@ -388,6 +392,7 @@ static OOColor *ColorWithHSBColor(Vector c)
|
|||||||
|
|
||||||
- (void) setTextureFileName:(NSString *)textureName
|
- (void) setTextureFileName:(NSString *)textureName
|
||||||
{
|
{
|
||||||
|
#if !SHADY_PLANETS
|
||||||
if (textureName != nil)
|
if (textureName != nil)
|
||||||
{
|
{
|
||||||
[_planetDrawable setTextureName:textureName];
|
[_planetDrawable setTextureName:textureName];
|
||||||
@ -399,8 +404,48 @@ static OOColor *ColorWithHSBColor(Vector c)
|
|||||||
[_planetDrawable setMaterial:material];
|
[_planetDrawable setMaterial:material];
|
||||||
[material release];
|
[material release];
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
OOTexture *diffuseMap = nil;
|
||||||
|
NSDictionary *macros = nil;
|
||||||
|
NSDictionary *materialDefaults = [ResourceManager materialDefaults];
|
||||||
|
#if !NO_SHADERS
|
||||||
|
OOShaderSetting shaderLevel = [UNIVERSE shaderEffectsLevel];
|
||||||
|
BOOL shadersOn = shaderLevel > SHADERS_OFF;
|
||||||
|
#else
|
||||||
|
const BOOL shadersOn = NO;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (textureName != nil)
|
||||||
|
{
|
||||||
|
NSDictionary *spec = [NSDictionary dictionaryWithObjectsAndKeys:textureName, @"name", @"yes", @"repeat_s", @"linear", @"min_filter", nil];
|
||||||
|
diffuseMap = [OOTexture textureWithConfiguration:spec];
|
||||||
|
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:@"planet-customized-macros"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
diffuseMap = [OOPlanetTextureGenerator planetTextureWithInfo:_materialParameters];
|
||||||
|
if (shadersOn) macros = [materialDefaults oo_dictionaryForKey:@"planet-synthetic-macros"];
|
||||||
|
textureName = @"dynamic";
|
||||||
|
}
|
||||||
|
OOMaterial *material = nil;
|
||||||
|
|
||||||
|
#if !NO_SHADERS
|
||||||
|
if (shadersOn)
|
||||||
|
{
|
||||||
|
NSMutableDictionary *config = [[[materialDefaults oo_dictionaryForKey:@"planet-material"] mutableCopy] autorelease];
|
||||||
|
[config setObject:[NSArray arrayWithObjects:diffuseMap, nil] forKey:@"_oo_texture_objects"];
|
||||||
|
material = [OOShaderMaterial shaderMaterialWithName:textureName
|
||||||
|
configuration:config
|
||||||
|
macros:macros
|
||||||
|
bindingTarget:self];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (material == nil)
|
||||||
|
{
|
||||||
|
material = [[OOSingleTextureMaterial alloc] initWithName:textureName texture:diffuseMap configuration:nil];
|
||||||
|
}
|
||||||
|
[_planetDrawable setMaterial:material];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -9337,12 +9337,10 @@ static BOOL AuthorityPredicate(Entity *entity, void *parameter)
|
|||||||
NSDictionary *DefaultShipShaderMacros(void)
|
NSDictionary *DefaultShipShaderMacros(void)
|
||||||
{
|
{
|
||||||
static NSDictionary *macros = nil;
|
static NSDictionary *macros = nil;
|
||||||
NSDictionary *materialDefaults = nil;
|
|
||||||
|
|
||||||
if (macros == nil)
|
if (macros == nil)
|
||||||
{
|
{
|
||||||
materialDefaults = [ResourceManager dictionaryFromFilesNamed:@"material-defaults.plist" inFolder:@"Config" andMerge:YES];
|
macros = [[[ResourceManager materialDefaults] oo_dictionaryForKey:@"ship-prefix-macros" defaultValue:[NSDictionary dictionary]] retain];
|
||||||
macros = [[materialDefaults oo_dictionaryForKey:@"ship-prefix-macros" defaultValue:[NSDictionary dictionary]] retain];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return macros;
|
return macros;
|
||||||
|
@ -101,7 +101,7 @@ static FloatRGBA PlanetMix(float q, float maxQ, FloatRGB landColor, FloatRGB sea
|
|||||||
|
|
||||||
- (uint32_t) textureOptions
|
- (uint32_t) textureOptions
|
||||||
{
|
{
|
||||||
return [super textureOptions] | kOOTextureRepeatS | kOOTextureNoShrink;
|
return kOOTextureMinFilterLinear | kOOTextureMagFilterLinear | kOOTextureRepeatS | kOOTextureNoShrink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ MA 02110-1301, USA.
|
|||||||
|
|
||||||
This file may also be distributed under the MIT/X11 license:
|
This file may also be distributed under the MIT/X11 license:
|
||||||
|
|
||||||
Copyright (C) 2007 Jens Ayton
|
Copyright (C) 2007-2009 Jens Ayton
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -65,7 +65,11 @@ static NSString *MacrosToString(NSDictionary *macros);
|
|||||||
|
|
||||||
@interface OOShaderMaterial (OOPrivate)
|
@interface OOShaderMaterial (OOPrivate)
|
||||||
|
|
||||||
- (void)addTexturesFromArray:(NSArray *)textureNames unitCount:(GLuint)max;
|
// Convert a "textures" array to an "_oo_texture_objects" array.
|
||||||
|
- (NSArray *) loadTexturesFromArray:(NSArray *)textureSpecs unitCount:(GLuint)max;
|
||||||
|
|
||||||
|
// Load up an array of texture objects.
|
||||||
|
- (void) addTexturesFromArray:(NSArray *)textureObjects unitCount:(GLuint)max;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -98,8 +102,6 @@ static NSString *MacrosToString(NSDictionary *macros);
|
|||||||
bindingTarget:(id<OOWeakReferenceSupport>)target
|
bindingTarget:(id<OOWeakReferenceSupport>)target
|
||||||
{
|
{
|
||||||
BOOL OK = YES;
|
BOOL OK = YES;
|
||||||
NSDictionary *uniformDefs = nil;
|
|
||||||
NSArray *textureDefs = nil;
|
|
||||||
NSString *macroString = nil;
|
NSString *macroString = nil;
|
||||||
NSString *vertexShader = nil;
|
NSString *vertexShader = nil;
|
||||||
NSString *fragmentShader = nil;
|
NSString *fragmentShader = nil;
|
||||||
@ -160,14 +162,23 @@ static NSString *MacrosToString(NSDictionary *macros);
|
|||||||
|
|
||||||
if (OK)
|
if (OK)
|
||||||
{
|
{
|
||||||
// Load uniforms
|
// Load uniforms and textures, which are a flavour of uniform for our purpose.
|
||||||
uniformDefs = [configuration oo_dictionaryForKey:@"uniforms"];
|
NSDictionary *uniformDefs = [configuration oo_dictionaryForKey:@"uniforms"];
|
||||||
textureDefs = [configuration oo_arrayForKey:@"textures"];
|
|
||||||
|
|
||||||
uniforms = [[NSMutableDictionary alloc] initWithCapacity:[uniformDefs count] + [textureDefs count]];
|
// ..
|
||||||
|
NSArray *textureArray = [configuration oo_arrayForKey:@"_oo_texture_objects"];
|
||||||
|
if (textureArray == nil)
|
||||||
|
{
|
||||||
|
NSArray *textureSpecs = [configuration oo_arrayForKey:@"textures"];
|
||||||
|
if (textureSpecs != nil)
|
||||||
|
{
|
||||||
|
textureArray = [self loadTexturesFromArray:textureSpecs unitCount:textureUnits];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uniforms = [[NSMutableDictionary alloc] initWithCapacity:[uniformDefs count] + [textureArray count]];
|
||||||
[self addUniformsFromDictionary:uniformDefs withBindingTarget:target];
|
[self addUniformsFromDictionary:uniformDefs withBindingTarget:target];
|
||||||
// ...and textures, which are a flavour of uniform for our purpose.
|
[self addTexturesFromArray:textureArray unitCount:textureUnits];
|
||||||
[self addTexturesFromArray:textureDefs unitCount:textureUnits];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!OK)
|
if (!OK)
|
||||||
@ -601,13 +612,27 @@ static NSString *MacrosToString(NSDictionary *macros);
|
|||||||
|
|
||||||
@implementation OOShaderMaterial (OOPrivate)
|
@implementation OOShaderMaterial (OOPrivate)
|
||||||
|
|
||||||
- (void)addTexturesFromArray:(NSArray *)textureNames unitCount:(GLuint)max
|
- (NSArray *) loadTexturesFromArray:(NSArray *)textureSpecs unitCount:(GLuint)max
|
||||||
{
|
{
|
||||||
id textureDef = nil;
|
unsigned i, count = MIN([textureSpecs count], max);
|
||||||
unsigned i = 0;
|
NSMutableArray *result = [NSMutableArray arrayWithCapacity:count];
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
id textureSpec = [textureSpecs objectAtIndex:i];
|
||||||
|
OOTexture *texture = [OOTexture textureWithConfiguration:textureSpec];
|
||||||
|
if (texture == nil) texture = [OOTexture nullTexture];
|
||||||
|
[result addObject:texture];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void) addTexturesFromArray:(NSArray *)textureObjects unitCount:(GLuint)max
|
||||||
|
{
|
||||||
// Allocate space for texture object name array
|
// Allocate space for texture object name array
|
||||||
texCount = MAX(MIN(max, [textureNames count]), 0U);
|
texCount = MIN(max, [textureObjects count]);
|
||||||
if (texCount == 0) return;
|
if (texCount == 0) return;
|
||||||
|
|
||||||
textures = malloc(texCount * sizeof *textures);
|
textures = malloc(texCount * sizeof *textures);
|
||||||
@ -618,13 +643,12 @@ static NSString *MacrosToString(NSDictionary *macros);
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set up texture object names and appropriate uniforms
|
// Set up texture object names and appropriate uniforms
|
||||||
|
unsigned i;
|
||||||
for (i = 0; i != texCount; ++i)
|
for (i = 0; i != texCount; ++i)
|
||||||
{
|
{
|
||||||
[self setUniform:[NSString stringWithFormat:@"tex%u", i] intValue:i];
|
[self setUniform:[NSString stringWithFormat:@"tex%u", i] intValue:i];
|
||||||
|
|
||||||
textureDef = [textureNames objectAtIndex:i];
|
textures[i] = [textureObjects objectAtIndex:i];
|
||||||
textures[i] = [OOTexture textureWithConfiguration:textureDef];
|
|
||||||
if (textures[i] == nil) textures[i] = [OOTexture nullTexture];
|
|
||||||
[textures[i] retain];
|
[textures[i] retain];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,10 +151,7 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)object
|
|||||||
|
|
||||||
if (placeholderMaterial == nil)
|
if (placeholderMaterial == nil)
|
||||||
{
|
{
|
||||||
NSDictionary *materialDefaults = nil;
|
placeholderMaterial = [[OOBasicMaterial alloc] initWithName:@"/placeholder/" configuration:[[ResourceManager materialDefaults] oo_dictionaryForKey:@"no-textures-material"]];
|
||||||
|
|
||||||
materialDefaults = [ResourceManager dictionaryFromFilesNamed:@"material-defaults.plist" inFolder:@"Config" andMerge:YES];
|
|
||||||
placeholderMaterial = [[OOBasicMaterial alloc] initWithName:@"/placeholder/" configuration:[materialDefaults oo_dictionaryForKey:@"no-textures-material"]];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return placeholderMaterial;
|
return placeholderMaterial;
|
||||||
|
@ -140,8 +140,7 @@
|
|||||||
if (![textureName isEqual:[self textureName]])
|
if (![textureName isEqual:[self textureName]])
|
||||||
{
|
{
|
||||||
[_material release];
|
[_material release];
|
||||||
NSDictionary *spec = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"repeat_s"];
|
NSDictionary *spec = [@"{diffuse_map={repeat_s=yes;};}" propertyList];
|
||||||
spec = [NSDictionary dictionaryWithObject:spec forKey:@"diffuse_map"];
|
|
||||||
_material = [[OOSingleTextureMaterial alloc] initWithName:textureName configuration:spec];
|
_material = [[OOSingleTextureMaterial alloc] initWithName:textureName configuration:spec];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,8 @@ typedef enum
|
|||||||
|
|
||||||
+ (BOOL) writeDiagnosticData:(NSData *)data toFileNamed:(NSString *)name;
|
+ (BOOL) writeDiagnosticData:(NSData *)data toFileNamed:(NSString *)name;
|
||||||
|
|
||||||
|
+ (NSDictionary *) materialDefaults;
|
||||||
|
|
||||||
// Clear ResourceManager-internal caches (not those handled by OOCacheManager)
|
// Clear ResourceManager-internal caches (not those handled by OOCacheManager)
|
||||||
+ (void) clearCaches;
|
+ (void) clearCaches;
|
||||||
|
|
||||||
|
@ -946,6 +946,12 @@ static NSMutableDictionary *sStringCache;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+ (NSDictionary *) materialDefaults
|
||||||
|
{
|
||||||
|
return [self dictionaryFromFilesNamed:@"material-defaults.plist" inFolder:@"Config" andMerge:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+ (BOOL)directoryExists:(NSString *)inPath create:(BOOL)inCreate
|
+ (BOOL)directoryExists:(NSString *)inPath create:(BOOL)inCreate
|
||||||
{
|
{
|
||||||
BOOL exists, directory;
|
BOOL exists, directory;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user