Changeset 537
- Timestamp:
- 05/13/08 16:09:14 (8 months ago)
- Files:
-
- trunk/run/data/shaders/model-pixel.glsl (modified) (3 diffs)
- trunk/run/data/shaders/model-sm.cfg (deleted)
- trunk/run/data/shaders/model-vertex.glsl (modified) (2 diffs)
- trunk/run/data/shaders/model.cfg (moved) (moved from trunk/run/data/shaders/model-no-sm.cfg) (1 diff)
- trunk/run/data/shaders/shadowmap.glsl (modified) (2 diffs)
- trunk/run/data/shaders/terrain-no-sm.cfg (deleted)
- trunk/run/data/shaders/terrain-pixel.glsl (modified) (2 diffs)
- trunk/run/data/shaders/terrain.cfg (moved) (moved from trunk/run/data/shaders/terrain-sm.cfg) (1 diff)
- trunk/src/defend/Main.d (modified) (2 diffs)
- trunk/src/defend/game/Game.d (modified) (5 diffs)
- trunk/src/defend/game/hud/MiniMap.d (modified) (3 diffs)
- trunk/src/defend/objects/SceneNode.d (modified) (2 diffs)
- trunk/src/defend/terrain/Terrain.d (modified) (1 diff)
- trunk/src/gen/rend/Renderer.d (modified) (1 diff)
- trunk/src/gen/rend/opengl/Shader.d (modified) (8 diffs)
- trunk/src/gen/scene/Graph.d (modified) (1 diff)
- trunk/src/gen/util/Allocator.d (added)
- trunk/src/gen/util/Config.d (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/run/data/shaders/model-pixel.glsl
r536 r537 1 #include shadowmap.glsl2 3 1 uniform sampler2D diffuseTexture; 4 2 uniform sampler2D lightTexture; 3 4 #ifdef SHADOWMAPPING 5 # include "shadowmap.glsl" 6 5 7 uniform sampler2D shadow; 6 8 9 varying vec4 lightSpacePos; 10 #endif 11 7 12 uniform vec3 color; 8 9 varying vec4 lightSpacePos;10 13 11 14 void main() … … 14 17 vec4 light = texture2D(lightTexture, vec2(gl_TexCoord[1])); 15 18 16 //gl_FragColor = vec4(tex.rgb * tex.a + color * (1 - tex.a), 1.0) * gl_Color * (light * 2); //* shadowMap(shadow, lightSpacePos);17 19 gl_FragColor = vec4(tex.rgb * tex.a + color * (1 - tex.a), 1.0) * (light * 2); 18 20 … … 20 22 gl_FragColor *= shadowMap(shadow, lightSpacePos); 21 23 #else 22 gl_FragColor *= gl_Color * 2;24 gl_FragColor *= gl_Color; 23 25 #endif 24 25 gl_FragColor = vec4(tex.rgb, 1.0);26 26 } trunk/run/data/shaders/model-vertex.glsl
r536 r537 1 #define LIGHT_POSITION vec4(10.0, 10.0, 0.0, 1.0) 2 #define LIGHT_AMBIENT vec4(2.0, 2.0, 2.0, 1.0) 3 #define LIGHT_DIFFUSE vec4(1.0, 1.0, 1.0, 1.0) 1 uniform vec3 mapPos; 2 uniform vec3 mapSize; 4 3 4 #ifdef SHADOWMAPPING 5 5 uniform mat4 lightTransform; 6 6 uniform mat4 modelTransform; 7 7 8 uniform vec3 mapPos;9 uniform vec3 mapSize;10 11 8 varying vec4 lightSpacePos; 9 #else 10 # define LIGHT_POSITION vec4(10.0, 10.0, 0.0, 1.0) 11 # define LIGHT_AMBIENT vec4(2.0, 2.0, 2.0, 1.0) 12 # define LIGHT_DIFFUSE vec4(1.0, 1.0, 1.0, 1.0) 13 #endif 12 14 13 15 void main(void) … … 21 23 lightSpacePos = lightTransform * (modelTransform * gl_Vertex); 22 24 #else 23 // Lighting24 25 vec3 position = vec3(gl_ModelViewMatrix * gl_Vertex); 25 vec3 light = vec3(normalize(vec3(gl_ModelViewMatrix * LIGHT_POSITION) - position));26 26 vec3 light = vec3(normalize(vec3(gl_LightSource[0].position) - position)); 27 27 vec3 normal = normalize(gl_NormalMatrix * gl_Normal); trunk/run/data/shaders/model.cfg
r535 r537 1 1 vertex_shader = "model-vertex.glsl" 2 2 pixel_shader = "model-pixel.glsl" 3 4 section defines5 SHADOWMAPPINGtrunk/run/data/shaders/shadowmap.glsl
r534 r537 1 float shadowMapSingle(in sampler2D sampler, in vec2 shadowMapCoord, in float lightDistance) { 1 #ifdef SHADOWMAPPING 2 3 float shadowMapSingle(in sampler2D sampler, in vec2 shadowMapCoord, in float lightDistance) 4 { 2 5 float shadowMapDistance = texture2D(sampler, shadowMapCoord).r; 3 6 4 //if(shadowMapCoord.x >= 0 && shadowMapCoord.x <= 1 && shadowMapCoord.y >= 0 && shadowMapCoord.y <= 1 &&5 // lightDistance >= shadowMapDistance && shadowMapDistance != 1.0f) // point is in shadow6 // return 0.35f;7 8 //return 1.0f;9 7 return (shadowMapCoord.x >= 0 && shadowMapCoord.x <= 1 && shadowMapCoord.y >= 0 && shadowMapCoord.y <= 1 && 10 8 lightDistance >= shadowMapDistance && shadowMapDistance != 1.0f) ? 0.35f : 1.0f; … … 21 19 float o2 = 0.0005f; 22 20 23 val = shadowMapSingle(sampler, shadowMapCoord + vec2( 0f, 0f), lightDistance) + 24 shadowMapSingle(sampler, shadowMapCoord + vec2(-o1+0.0001,-o1), lightDistance) + 25 shadowMapSingle(sampler, shadowMapCoord + vec2( o1,-o1+0.0001), lightDistance) + 26 shadowMapSingle(sampler, shadowMapCoord + vec2( o1-0.0001, o1), lightDistance) + 27 shadowMapSingle(sampler, shadowMapCoord + vec2(-o1, o1-0.0001), lightDistance); //+ 28 //shadowMapSingle(sampler, shadowMapCoord + vec2(-o2,-o2+0.0001), lightDistance); //+ 29 //shadowMapSingle(sampler, shadowMapCoord + vec2( o2+0.0001,-o2), lightDistance) + 30 //shadowMapSingle(sampler, shadowMapCoord + vec2( o2, o2-0.0001), lightDistance) + 31 //shadowMapSingle(sampler, shadowMapCoord + vec2(-o2-0.0001, o2), lightDistance); 32 21 #if SHADOWMAPPING_SAMPLES > 0 22 val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o1+0.0001,-o1), lightDistance); 23 #endif 24 25 #if SHADOWMAPPING_SAMPLES > 1 26 val += shadowMapSingle(sampler, shadowMapCoord + vec2( o1,-o1+0.0001), lightDistance); 27 #endif 33 28 34 /* val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o1+0.0001,-o1), lightDistance); 35 val += shadowMapSingle(sampler, shadowMapCoord + vec2( o1,-o1+0.0001), lightDistance); 29 #if SHADOWMAPPING_SAMPLES > 2 36 30 val += shadowMapSingle(sampler, shadowMapCoord + vec2( o1-0.0001, o1), lightDistance); 31 #endif 32 33 #if SHADOWMAPPING_SAMPLES > 3 37 34 val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o1, o1-0.0001), lightDistance); 35 #endif 38 36 37 #if SHADOWMAPPING_SAMPLES > 4 39 38 val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o2,-o2+0.0001), lightDistance); 39 #endif 40 41 #if SHADOWMAPPING_SAMPLES > 5 40 42 val += shadowMapSingle(sampler, shadowMapCoord + vec2( o2+0.0001,-o2), lightDistance); 43 #endif 44 45 #if SHADOWMAPPING_SAMPLES > 6 41 46 val += shadowMapSingle(sampler, shadowMapCoord + vec2( o2, o2-0.0001), lightDistance); 42 val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o2-0.0001, o2), lightDistance);*/ 47 #endif 43 48 44 val /= 5f; 49 #if SHADOWMAPPING_SAMPLES > 7 50 val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o2-0.0001, o2), lightDistance); 51 #endif 52 53 val /= SHADOWMAPPING_SAMPLES; 45 54 return val; 46 55 } 56 57 #endif trunk/run/data/shaders/terrain-pixel.glsl
r536 r537 6 6 7 7 #ifdef SHADOWMAPPING 8 # include shadowmap.glsl8 # include "shadowmap.glsl" 9 9 10 10 uniform sampler2D shadow; … … 29 29 c3 *= a.b * inverse; 30 30 31 //gl_FragColor = vec4(shadowMap(shadow, lightSpacePos));32 31 gl_FragColor = (c1 + c2 + c3) * (l * 2); 33 32 trunk/run/data/shaders/terrain.cfg
r535 r537 1 1 vertex_shader = "terrain-vertex.glsl" 2 2 pixel_shader = "terrain-pixel.glsl" 3 4 section defines5 SHADOWMAPPINGtrunk/src/defend/Main.d
r535 r537 16 16 import gen.math.Vector : vec2i, vec3; 17 17 import gen.rend.Window : Window; 18 import gen.rend.Renderer : RendererConfig, Renderer, renderer;18 import gen.rend.Renderer : RendererConfig, Shader, Renderer, renderer; 19 19 import gen.rend.opengl.Renderer : OGLRenderer; 20 20 import gen.scene.Graph : SceneGraph, sceneGraph; … … 243 243 } 244 244 245 // Mirror config settings to shader defines 246 if(defendConfig("graphics").integer("shadowmapping")) 247 { 248 Shader.define("SHADOWMAPPING"); 249 Shader.define("SHADOWMAPPING_SAMPLES", 250 to!(char[])(defendConfig("graphics")("shadowmapping").integer("samples"))); 251 } 252 245 253 // Create the renderer 246 254 logger.info("creating renderer"); trunk/src/defend/game/Game.d
r535 r537 120 120 void initShadowMapping() 121 121 { 122 auto fb = renderer.createFramebuffer(vec2i(2048, 2048), ImageFormat.A); 122 auto size = defendConfig("graphics")("shadowmapping").integer("size"); 123 auto fb = renderer.createFramebuffer(vec2i(size, size), ImageFormat.A); 123 124 124 125 auto camera = new StaticCamera(vec3(-20, 40, -39), vec3(-0.9, -1.57, 0), … … 153 154 154 155 // Call the requested map generators 156 logger.info("generating map"); 157 155 158 generateMap(info, (TerrainHeightmap heightmap) 156 159 { … … 181 184 players = new PlayerManager(gateway); 182 185 183 // Create the synchronizedobject manager186 // Create the game object manager 184 187 gameObjects = new GameObjectManager(gateway, players, simulation); 185 188 … … 272 275 sceneGraph.addCamera("main", mainCamera, vec3(0, 0, 0.2)); 273 276 274 //initShadowMapping(); 277 if(defendConfig("graphics").integer("shadowmapping")) 278 initShadowMapping(); 275 279 276 280 logger.info("initializing communication"); … … 286 290 logger.info("communication process finished"); 287 291 288 //createTerrain();289 290 292 // Move the camera to the first object we find 291 293 foreach(object; gameObjects) trunk/src/defend/game/hud/MiniMap.d
r536 r537 23 23 { 24 24 private: 25 const width = 2048;26 const height = 2048;25 const width = 128; 26 const height = 128; 27 27 28 28 Image image; … … 71 71 72 72 this() 73 { 74 // shadow map test 75 if(defendConfig("graphics").integer("shadowmapping") || true * false) 76 { 77 auto fb = renderer.createFramebuffer(vec2i(width, height), ImageFormat.A); 78 texture = fb.texture; 79 80 auto camera = new StaticCamera(vec3(-20, 40, -39), vec3(-0.9, -1.57, 0), 81 mat4.projection(width / height, 70, 50, 200)); 82 83 //auto camera = new StaticCamera(vec3(-50, 150, -59), vec3(-0.9, -1.57, 0), 84 // mat4.projection(width / height, 70, 50, 300)); 85 86 sceneGraph.addCamera("shadow", camera, vec3(0), fb, true); 87 } 88 89 return; 90 73 { 91 74 if(!texture) 92 75 { … … 103 86 ~this() 104 87 { 105 //delete sprite;106 //delete texture;88 delete sprite; 89 delete texture; 107 90 } 108 91 109 92 void render() 110 93 { 111 //assert(texture !is null);112 //assert(sprite !is null);94 assert(texture !is null); 95 assert(sprite !is null); 113 96 114 //sprite.render(position);97 sprite.render(position); 115 98 } 116 99 trunk/src/defend/objects/SceneNode.d
r536 r537 87 87 88 88 texture = mesh.texture; 89 shader = Shader.acquire(defendConfig("graphics").integer("shadowmapping") ? 90 "data/shaders/model-sm.cfg" : 91 "data/shaders/model-no-sm.cfg"); 89 shader = Shader.acquire("data/shaders/model.cfg"); 92 90 this.parent = parent; 93 91 this.mesh = mesh; … … 137 135 } 138 136 else 137 { 138 renderer.setTexture(0, null); 139 139 renderer.setShader(null); 140 } 140 141 141 mesh.render(); 142 //mesh.texture = Texture.loadResource("data/models/house/model.png"); 143 //mesh.render(); 144 renderer.draw(mesh.vertices, null, mesh.type); 142 145 143 146 renderer.popMatrix(); trunk/src/defend/terrain/Terrain.d
r536 r537 338 338 size = heightmap.size; 339 339 patchCount = 16; 340 341 shader = Shader.acquire(defendConfig("graphics").integer("shadowmapping") ? 342 "data/shaders/terrain-sm.cfg" : 343 "data/shaders/terrain-no-sm.cfg"); 344 340 341 shader = Shader.acquire("data/shaders/terrain.cfg"); 342 343 logger.info("loading diffuse maps"); 345 344 loadDiffuseMaps(); 345 346 logger.info("creating patches"); 346 347 createPatches(); 348 349 logger.info("creating alpha maps"); 347 350 createAlphaMaps(); 351 352 logger.info("creating lightmap"); 348 353 createLightmap(); 349 354 355 logger.info("creating cull tree"); 350 356 createCullTree(); 351 357 } trunk/src/gen/rend/Renderer.d
r535 r537 154 154 { 155 155 mixin MResource; 156 157 // Global defines, will be set for each shader 158 static char[][char[]] defines; 159 160 static void define(char[] name, char[] value = "") 161 { 162 defines[name] = value; 163 } 156 164 157 165 static Shader loadResource(char[] file) trunk/src/gen/rend/opengl/Shader.d
r535 r537 23 23 { 24 24 private: 25 char[] globalDefines; 26 25 27 int context; 26 28 27 29 int[char[]] uniformHandles; 28 30 29 char[] preprocess (char[] base, char[] code)31 char[] preprocessIncludes(char[] base, char[] code) 30 32 { 31 33 char[] result; 32 34 33 foreach(line; lines(code)) 34 { 35 //Stdout(line).newline; 36 37 line = trim(line); 38 39 if(line.length && line[0] == '#') 35 foreach(origLine; lines(code)) 36 { 37 auto line = trim(origLine); 38 39 if(!line.length || line[0] != '#') 40 continue; 41 42 if(auto pos = locate(line, ' ')) 40 43 { 41 if(auto pos = locate(line, ' ')) 44 auto command = trim(line[1 .. pos]); 45 46 if(command == "include") 42 47 { 43 switch(line[1 .. pos])48 withReadFile!(GCAllocator, char)(base ~ line[pos + 2 .. $ - 1], (char[] code) 44 49 { 45 case "include": 46 result ~= preprocess(base, cast(char[])(new File(base ~ line[pos + 1 .. $])).read); 47 break; 48 49 default: 50 result ~= line ~ "\n"; 50 result ~= code ~ "\n" ~ preprocessIncludes(base, code) ~ "\n"; 51 }); 52 53 // however :P 54 { 55 auto offset = origLine.ptr - code.ptr; 56 code[offset .. offset + origLine.length] = ' '; 51 57 } 52 58 } 53 59 } 54 else55 result ~= line ~ "\n";56 60 } 57 61 … … 76 80 77 81 Stdout("GLSL error: ")(error).newline; 78 //throw new Exception("GLSL error: " ~ error); 79 } 80 } 81 82 int compile(U, T...)(U type, T codes) 82 throw new Exception("GLSL error: " ~ error); 83 } 84 } 85 86 import tango.io.Console; 87 88 void compile(U, T...)(U type, T codes) 83 89 { 84 90 assert(context); … … 91 97 foreach(i, code; codes) 92 98 { 93 strings[i] = code.ptr; 99 //Stdout(code).newline; 100 //Cin.get; 101 102 // somehow the \0 is necessary even though I'm passing the lengths 103 strings[i] = (code ~ '\0').ptr; 94 104 lengths[i] = code.length; 95 105 } 96 106 97 107 glShaderSourceARB(result, T.length, strings.ptr, lengths.ptr); 98 108 glCompileShaderARB(result); … … 113 123 114 124 int uniformHandle(char[] name) 125 in 126 { 127 assert(*(name.ptr + name.length) == '\0', "uniform names need to be zero terminated"); 128 } 129 body 115 130 { 116 131 if(auto handle = name in uniformHandles) 117 132 return *handle; 118 119 // assuming zero-terminated strings 133 120 134 return (uniformHandles[name] = glGetUniformLocationARB(context, name.ptr)); 121 135 } … … 127 141 128 142 context = glCreateProgramObjectARB(); 143 144 // create GLSL code for setting the global defines 145 foreach(key, val; Shader.defines) 146 globalDefines ~= "#define " ~ key ~ " " ~ val ~ "\n"; 129 147 } 130 148 … … 133 151 if(FilePath(vertexFile).exists) withReadFile!(GCAllocator, char)(vertexFile, (char[] code) 134 152 { 135 compile(GL_VERTEX_SHADER_ARB, addCodes, preprocess(base, code)); 153 // needs to be called before compile() because it might change 'code' 154 char[] includes = preprocessIncludes(base, code); 155 156 compile(GL_VERTEX_SHADER_ARB, addCodes, globalDefines, 157 includes, code); 136 158 }); 137 159 138 160 if(FilePath(pixelFile).exists) withReadFile!(GCAllocator, char)(pixelFile, (char[] code) 139 161 { 140 compile(GL_FRAGMENT_SHADER_ARB, addCodes, preprocess(base, code)); 162 char[] includes = preprocessIncludes(base, code); 163 164 compile(GL_FRAGMENT_SHADER_ARB, addCodes, globalDefines, 165 includes, code); 141 166 }); 142 167 } … … 156 181 this(char[] file) 157 182 { 158 assert(false, "please use configs for shaders");159 160 183 init(); 161 184 … … 166 189 base ~= part ~ "/"; 167 190 168 createShaders(base, file ~ "-vertex.glsl", file ~ "-pixel.glsl" , "");191 createShaders(base, file ~ "-vertex.glsl", file ~ "-pixel.glsl"); 169 192 } 170 193 trunk/src/gen/scene/Graph.d
r534 r537 300 300 foreach(object; cam.renderPasses[renderPass]) 301 301 { 302 renderer.setShader(object.node.shader);303 renderer.setTexture(0, object.node.texture);302 //renderer.setShader(object.node.shader); 303 //renderer.setTexture(0, object.node.texture); 304 304 305 305 object.node.render(); trunk/src/gen/util/Config.d
r536 r537 227 227 Assign, 228 228 229 Section 229 LBracket, 230 RBracket 230 231 } 231 232 … … 313 314 314 315 // I should rather use some 'isIdentifierChar' function 315 while(c != ' ' && c != '=' && c != '\r' && c != '\n' && c != '\0') 316 while(c != ' ' && c != '=' && c != '\r' && c != '\n' && c != '\0' && 317 c != ']' && c != '[') 316 318 token.text ~= cn; 317 318 switch(token.text)319 {320 case "section": // TODO: map of keywords321 token.type = TokenType.Section;322 break;323 324 default:325 break;326 }327 319 328 320 return token; … … 338 330 339 331 continue; 340 332 333 case '[': 334 nc; 335 336 token.type = TokenType.LBracket; 337 return token; 338 339 case ']': 340 nc; 341 342 token.type = TokenType.RBracket; 343 return token; 344 341 345 case '/': 342 346 if(nc != '/') … … 345 349 while(nc != '\r' && c != '\n' && c != '\0') {} 346 350 347 if(c == '\0') 348 goto case '\0'; 349 350 // fallthrough 351 continue; 351 352 352 353 case '\r', '\n': … … 361 362 362 363 token.type = TokenType.NewLine; 363 return token;364 365 case '@':366 nc;367 368 token.type = TokenType.Section;369 364 return token; 370 365 … … 471 466 switch(token.type) 472 467 { 473 case TokenType. Section:468 case TokenType.LBracket: 474 469 if(next.type != TokenType.Identifier) 475 470 error("expected 'identifier' after 'section'"); 476 471 477 472 auto name = token.text; 478 473 474 if(next.type != TokenType.RBracket) 475 error("expected ']' after section identifier, got " ~ Integer.toString(token.type)); 476 479 477 if(next.type != TokenType.NewLine) 480 478 error("expected 'new line' after section definition");
