Changeset 520
- Timestamp:
- 04/17/08 13:06:59 (9 months ago)
- Files:
-
- trunk/run/data/shaders/terrain.pixel.glsl (modified) (2 diffs)
- trunk/run/data/shaders/terrain.vertex.glsl (modified) (2 diffs)
- trunk/src/defend/Loop.d (modified) (4 diffs)
- trunk/src/defend/game/Game.d (modified) (1 diff)
- trunk/src/defend/game/hud/MiniMap.d (modified) (3 diffs)
- trunk/src/defend/game/hud/Mouse.d (modified) (3 diffs)
- trunk/src/defend/objects/SceneNode.d (modified) (1 diff)
- trunk/src/defend/terrain/Patch.d (modified) (1 diff)
- trunk/src/defend/terrain/Terrain.d (modified) (4 diffs)
- trunk/src/gen/math/Matrix.d (modified) (1 diff)
- trunk/src/gen/rend/Renderer.d (modified) (2 diffs)
- trunk/src/gen/rend/opengl/Renderer.d (modified) (2 diffs)
- trunk/src/gen/rend/opengl/Shader.d (modified) (3 diffs)
- trunk/src/gen/rend/opengl/Texture.d (modified) (5 diffs)
- trunk/src/gen/rend/opengl/Wrapper.d (modified) (3 diffs)
- trunk/src/gen/scene/Graph.d (modified) (11 diffs)
- trunk/src/gen/scene/Node.d (modified) (1 diff)
- trunk/src/windefend.cbp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/run/data/shaders/terrain.pixel.glsl
r511 r520 4 4 uniform sampler2D texture3; 5 5 uniform sampler2D lightmap; 6 uniform sampler2D shadow; 7 8 uniform vec3 lightPos; 9 10 varying vec4 lightSpacePos; 6 11 7 12 void main(void) … … 16 21 c1 *= a.r * inverse; 17 22 c2 *= a.g * inverse; 18 c3 *= a.b * inverse; 23 c3 *= a.b * inverse; 19 24 20 25 gl_FragColor = (c1 + c2 + c3) * (l * 2); 26 27 /*vec2 shadowMapCoord = 0.5f * lightSpacePos.xy / lightSpacePos.w + vec2(0.5f, 0.5f); 28 float shadowMapDistance = texture2D(shadow, shadowMapCoord).r; 29 30 #define FAR 300.0f 31 #define NEAR 50.0f 32 33 float lightDistance = (1.0f / NEAR - 1.0f / (lightSpacePos.z)) / (1.0f / NEAR - 1.0f / FAR); 34 lightDistance = lightSpacePos.z / lightSpacePos.w; 35 36 if(lightDistance < 0 || lightDistance > 1) // debugging 37 { 38 gl_FragColor = vec4(1, 0, 0, 0); 39 return; 40 } 41 42 float shadowValue = 1; 43 44 if(lightDistance + 0.2f >= shadowMapDistance && shadowMapDistance != 1.0f) // point is in shadow 45 { 46 shadowValue = 0.3; 47 } 48 49 if(shadowMapCoord.x >= 0 && shadowMapCoord.x <= 1 && shadowMapCoord.y >= 0 && shadowMapCoord.y <= 1) 50 { 51 //float x = shadowMapDistance - lightDistance; 52 53 gl_FragColor *= vec4(shadowValue, shadowValue, shadowValue, 0); 54 //gl_FragColor = vec4(lightDistance, lightDistance, lightDistance, 0); 55 //gl_FragColor = vec4(x, x, x, 0); 56 //gl_FragColor = vec4(shadowMapDistance, shadowMapDistance, shadowMapDistance, 0); 57 }*/ 21 58 } trunk/run/data/shaders/terrain.vertex.glsl
r511 r520 1 uniform mat4 lightTransform; 2 3 varying vec4 lightSpacePos; 4 1 5 void main(void) 2 6 { … … 4 8 gl_TexCoord[0] = gl_MultiTexCoord0; 5 9 gl_TexCoord[1] = gl_MultiTexCoord1; 10 11 lightSpacePos = lightTransform * gl_Vertex; 6 12 } trunk/src/defend/Loop.d
r515 r520 25 25 logger.info("setting function to {}", (funcName = Fn.stringof)); 26 26 27 func = & Fn;27 func = &wrapper!(Fn); 28 28 } 29 29 … … 41 41 42 42 // Initialize the main function 43 fiber.call( true);43 fiber.call(false); 44 44 45 45 // Main loop … … 65 65 66 66 // Unload 67 fiber.call( true);67 fiber.call(false); 68 68 69 69 if(auto diff = (getMemoryUsage() - memoryUsage) > 0) … … 83 83 Logger logger; 84 84 char[] funcName; 85 86 // tmp because of bug in tango's fibers 87 void wrapper(alias Fn)() 88 { 89 try 90 { 91 Fn(); 92 } 93 catch(Exception exception) 94 { 95 logger.fatal("exception: {} ({}:{})", exception, exception.file, exception.line); 96 } 97 } 85 98 } 86 99 } trunk/src/defend/game/Game.d
r519 r520 256 256 257 257 mainCamera = new MainCamera; 258 mainCamera.projection = mat4.projection(aspect, fov , 1, 100);258 mainCamera.projection = mat4.projection(aspect, fov * PI / 180, 1, 300); 259 259 sceneGraph.addCamera("main", mainCamera, vec3(0, 0, 0.2)); 260 260 trunk/src/defend/game/hud/MiniMap.d
r519 r520 6 6 import gen.math.Rectangle; 7 7 import gen.math.Vector; 8 import gen.math.Matrix; 9 import gen.scene.Camera; 10 import gen.scene.StaticCamera; 11 import gen.scene.Graph; 8 12 import gen.rend.Renderer; 9 13 import gen.rend.Texture; … … 62 66 renderer.setViewport(Rect(0, 0, renderer.width, renderer.height)); 63 67 } 64 68 65 69 public: 66 70 mixin MAllocator; … … 68 72 this() 69 73 { 70 texture = renderer.createTexture(vec2i(width, height)); 74 // shadow map test 75 /*texture = renderer.createTexture(vec2i(width, height), ImageFormat.A); 76 77 auto camera = new StaticCamera(vec3(-50, 150, -59), vec3(-0.9, -1.57, 0), 78 mat4.projection(width / height, 70, 50, 300)); 79 80 sceneGraph.addCamera("shadow", camera, vec3(0), texture, true); 81 //sceneGraph.addCamera("shadow", sceneGraph.getCamera("main").core, vec3(0), texture, false);*/ 82 83 texture = renderer.createTexture(vec2i(width, height), ImageFormat.RGB); 71 84 renderTerrain(); 72 85 73 86 sprite = new Sprite(texture, Rect(0, 0, width - 1, height - 1), true); 74 87 position = vec2i(renderer.width - 150, renderer.height - HUD_HEIGHT + 10); trunk/src/defend/game/hud/Mouse.d
r519 r520 415 415 { 416 416 GLint[4] viewport; 417 418 // register a callback for mouse move? 417 419 418 auto pt = mouse.mousePos; 420 419 … … 507 506 auto pos = terrain.getWorldPos(mapPos); 508 507 mouseCube.translation = pos; 509 510 //if(inputManager.keyPressedFirst(KeyType.LeftButton))511 // particles.system("smoke").spawn(pos + vec3(0, 1, 0), 17);512 508 } 513 509 … … 575 571 576 572 camera = cast(MainCamera)sceneGraph.getCamera("main").core; 573 assert(camera !is null, "fail."); 577 574 578 575 { trunk/src/defend/objects/SceneNode.d
r516 r520 89 89 this.parent = parent; 90 90 this.mesh = mesh; 91 renderShadow = true; 91 92 } 92 93 trunk/src/defend/terrain/Patch.d
r510 r520 130 130 vec2 tex1 = vec2(cast(float)_x / cast(float)heightmap.size.width, 131 131 cast(float)_z / cast(float)heightmap.size.height); 132 vec2 tex2 = tex1 * 8;132 vec2 tex2 = tex1 * 16; 133 133 vec2 tex3 = tex1; 134 134 vec2 tex4 = tex3 * 32; trunk/src/defend/terrain/Terrain.d
r518 r520 377 377 renderer.mulMatrix(absoluteModelview); 378 378 379 //renderer.setRenderState(RenderState.Blending, true);380 379 renderer.setRenderState(RenderState.BackfaceCulling, true); 381 380 382 //renderer.setTextureMode(1, TextureMode.Replace); 383 //renderer.setTexture(2, lightmapTexture); 384 //renderer.setTexture(3, detailTexture); 381 //auto shadow = sceneGraph.getCamera("shadow"); 382 //assert(shadow.core !is null); 385 383 386 384 renderer.setShader(shader); … … 391 389 renderer.setTexture(3, diffuseMaps[2]); 392 390 renderer.setTexture(4, lightmapTexture); 391 //renderer.setTexture(5, shadow.texture); 393 392 394 393 shader.setUniform("alpha", 0); … … 397 396 shader.setUniform("texture3", 3); 398 397 shader.setUniform("lightmap", 4); 398 //shader.setUniform("shadow", 5); 399 400 //shader.setUniform("lightTransform", shadow.core.projection * shadow.core.modelview); 399 401 400 402 foreach(patch; patches) … … 402 404 403 405 renderer.setShader(null); 404 405 //uint k = 0; 406 407 /*for(uint i_ = 0; i_ < alphaMaps.length * 2; i_++) 408 { 409 int i = i_ / 2; 410 411 if (i_ & 1) 412 renderer.setBlendFunc(BlendFunc.SrcAlpha, BlendFunc.One); 413 else 414 renderer.setBlendFunc(BlendFunc.SrcAlpha, BlendFunc.OneMinusScrAlpha); 415 416 renderer.setTexture(0, alphaMaps[i]); 417 renderer.setTexture(1, diffuseMaps[i]); 418 419 foreach(patch; patches) 420 { 421 if(patch.visible && patch.maxHeight[i] != -10_000 && patch.minHeight[i] != 10_000 && 422 patch.maxHeight[i] >= terrainMinRange[i] && patch.maxHeight[i] <= terrainMaxRange[i]) 423 { 424 patch.render(); 425 k++; 426 } 427 } 428 }*/ 429 406 407 renderer.setTexture(5, null); 430 408 renderer.setTexture(4, null); 431 409 renderer.setTexture(3, null); trunk/src/gen/math/Matrix.d
r501 r520 348 348 Mat4 projection(T aspect, T fov, T near, T far) 349 349 { 350 T h = 1/ tan(fov / 2);351 352 return Mat4( h *aspect, 0, 0, 0,353 0, h, 0, 0,354 0, 0, (far + near) / (near - far), (2 * far * near) / (near - far),355 0, 0, -1, 0);350 T f = 1.0f / tan(fov / 2); 351 352 return Mat4(f / aspect, 0, 0, 0, 353 0, f, 0, 0, 354 0, 0, (far + near) / (near - far), -1, 355 0, 0, 2.0f * near * far / (near - far), 0); 356 356 } 357 357 trunk/src/gen/rend/Renderer.d
r511 r520 162 162 void setUniform(char[] name, int value); 163 163 void setUniform(char[] name, vec3 value); 164 void setUniform(char[] name, mat4 value); 164 165 } 165 166 … … 339 340 * Create an empty texture 340 341 */ 341 Texture createTexture(vec2i dimension );342 Texture createTexture(vec2i dimension, ImageFormat format = ImageFormat.RGB); 342 343 343 344 /** trunk/src/gen/rend/opengl/Renderer.d
r518 r520 255 255 setRenderState(RenderState.DepthTest, true); 256 256 setRenderState(RenderState.Texture, true); 257 glDepthFunc(GL_LE QUAL);257 glDepthFunc(GL_LESS); 258 258 } 259 259 … … 467 467 } 468 468 469 override Texture createTexture(vec2i dimension )470 { 471 return new OGLTexture(dimension );469 override Texture createTexture(vec2i dimension, ImageFormat format) 470 { 471 return new OGLTexture(dimension, format); 472 472 } 473 473 trunk/src/gen/rend/opengl/Shader.d
r511 r520 13 13 14 14 import gen.math.Vector; 15 import gen.math.Matrix; 15 16 import gen.util.File; 16 17 import gen.rend.Shader; … … 41 42 glGetInfoLogARB(object, length, &length, error.ptr); 42 43 43 throw new Exception("GLSL error: " ~ error); 44 Stdout("GLSL error: ")(error).newline; 45 //throw new Exception("GLSL error: " ~ error); 44 46 } 45 47 } … … 123 125 glUniform3fARB(uniformHandle(name), value.tupleof); 124 126 } 127 128 override void setUniform(char[] name, mat4 value) 129 { 130 glUniformMatrix4fvARB(uniformHandle(name), 1, false, value.ptr); 131 } 125 132 } trunk/src/gen/rend/opengl/Texture.d
r518 r520 1 1 module gen.rend.opengl.Texture; 2 2 3 import tango.io.Console; 3 4 import tango.io.Stdout; 4 5 import derelict.opengl.gl;6 import derelict.opengl.glu;7 5 8 6 import gen.util.Memory; … … 10 8 import gen.math.Vector; 11 9 import gen.rend.Texture; 10 import gen.rend.opengl.Wrapper; 12 11 13 12 package class OGLTexture : Texture … … 15 14 private: 16 15 ImageFormat _format; 16 float[] depthBuffer; 17 17 18 18 GLuint id; … … 60 60 } 61 61 62 this(vec2i dim )62 this(vec2i dim, ImageFormat format) 63 63 { 64 64 this.dim = dim; 65 _format = ImageFormat.RGB;65 _format = format; 66 66 67 67 create(); 68 69 // hack 70 if(format == ImageFormat.A) 71 { 72 depthBuffer.alloc(width * height); 73 return; 74 } 68 75 69 glTexImage2D(GL_TEXTURE_2D, 0, 3, dim.x, dim.y, 0, GL_RGB, GL_UNSIGNED_BYTE, null); 76 glTexImage2D(GL_TEXTURE_2D, 0, cast(uint)format, dim.x, dim.y, 0, 77 Image.formatToOpenGL(format), GL_UNSIGNED_BYTE, null); 70 78 } 71 79 72 80 ~this() 73 81 { 82 // hack 83 if(depthBuffer) 84 depthBuffer.free(); 85 74 86 glDeleteTextures(1, &id); 75 87 } … … 97 109 override void copyFromScreen() 98 110 { 111 // hack 112 if(format == ImageFormat.A) 113 { 114 /*int i; 115 float f; 116 glGetFloatv(GL_DEPTH_BIAS, &f); 117 glGetIntegerv(GL_DEPTH_BITS, &i); 118 119 Stdout(f).newline;*/ 120 121 glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthBuffer.ptr); 122 123 /*foreach(i, x; depthBuffer) 124 { 125 Stdout(x)(" "); 126 127 if(i % 10000 == 0) 128 { 129 Stdout(); 130 Cin.get; 131 } 132 } 133 134 Stdout(); 135 Cin.get;*/ 136 137 bind(); 138 glTexImage2D(GL_TEXTURE_2D, 0, cast(uint)format, width, height, 139 0, GL_RED, GL_FLOAT, depthBuffer.ptr); 140 return; 141 } 142 99 143 assert(format == ImageFormat.RGB); 100 144 101 145 bind(); 102 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0); 146 147 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height); 148 //glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0); 103 149 } 104 150 trunk/src/gen/rend/opengl/Wrapper.d
r507 r520 3 3 // Thanks to Dk (http://while-nan.blogspot.com/) for this idea 4 4 5 public import derelict.opengl.gl; 6 public import derelict.opengl.glu; 7 public import derelict.opengl.extension.arb.vertex_buffer_object; 5 public 6 { 7 import derelict.opengl.gl; 8 import derelict.opengl.glu; 9 import derelict.opengl.extension.arb.vertex_buffer_object; 10 } 8 11 9 12 import tango.core.Traits; … … 11 14 12 15 private bool insideblock = false; // Are we currently inside of a glBegin/glEnd block? 16 17 //debug = dump; 13 18 14 19 template glCheck(alias Fn) … … 54 59 55 60 alias glCheck!(GL.glViewport) glViewport; 61 alias glCheck!(GL.glReadPixels) glReadPixels; 62 alias glCheck!(GL.glTexImage2D) glTexImage2D; 56 63 alias glCheck!(GL.glMatrixMode) glMatrixMode; 57 64 alias glCheck!(GL.glLoadIdentity) glLoadIdentity; trunk/src/gen/scene/Graph.d
r518 r520 2 2 3 3 import tango.io.Stdout; 4 4 import tango.util.Convert; 5 6 import gen.image.Image; 5 7 import gen.list.BufferedArray; 6 8 import gen.util.Log; … … 37 39 BufferedArray!(NodeHolder)[RenderPass.max + 1] renderPasses; 38 40 bool active = true; 41 42 public: 39 43 vec3 clearColor; 40 41 public: 44 45 char[] name; 42 46 Camera core; 43 47 Texture texture; // The texture that is rendered to (not available for the main camera) 48 bool shadowMap; 44 49 45 50 bool isMain() … … 47 52 return texture is null; 48 53 } 54 55 char[] toString() { return to!(char[])(cast(int)cast(void*)core); } 49 56 } 50 57 … … 57 64 58 65 // All cameras 59 CameraData[ char[]] cameras;66 CameraData[] cameras; 60 67 61 68 // Current camera … … 84 91 logger.info("full reset"); 85 92 86 foreach( key,cam; cameras)93 foreach(cam; cameras) 87 94 { 88 logger.info("deleting camera " ~ key);95 logger.info("deleting camera {}", cam.name); 89 96 90 97 foreach(pass; cam.renderPasses) … … 97 104 98 105 delete cam; 99 100 cameras.remove(key);101 106 } 107 108 cameras.length = 0; 102 109 103 110 debug foreach(key, cam; cameras) … … 113 120 114 121 // Add a new camera 115 CameraData addCamera(char[] name, Camera core, vec3 clearColor, Texture texture = null) 116 { 117 logger.info("adding camera " ~ name); 122 CameraData addCamera(char[] name, Camera core, vec3 clearColor, 123 Texture texture = null, bool shadowMap = false) 124 { 125 logger.info("adding camera {}", name); 118 126 119 127 CameraData data = new CameraData; 128 data.name = name; 120 129 data.active = true; 121 130 data.clearColor = clearColor; 122 131 data.core = core; 123 132 data.texture = texture; 133 data.shadowMap = shadowMap; 134 135 if(shadowMap) 136 assert(texture !is null); 124 137 125 138 if(data.texture) … … 129 142 pass.create(16); 130 143 131 cameras [name]= data;132 133 // Ensure that only main camera exists144 cameras ~= data; 145 146 // Ensure that only one main camera exists 134 147 debug 135 148 { … … 141 154 } 142 155 143 assert(c == 0 || c == 1, 144 "there mustn't be more than one main camera"); 156 assert(c < 2, "there mustn't be more than one main camera"); 145 157 } 146 158 147 159 // Ensure that the main camera is the last entry in the camera list 148 char[] main; 149 char[] last; 150 151 foreach(key, cam; cameras) 160 foreach(i, cam; cameras) 152 161 { 153 162 if(cam.isMain) 154 main = key; 163 { 164 swap(cameras[$ - 1], cameras[i]); 165 break; 166 } 155 167 } 156 157 foreach_reverse(key; cameras.keys) 158 { 159 last = key; 160 break; 161 } 162 163 swap(cameras[main], cameras[last]); 164 168 165 169 return data; 166 170 } … … 169 173 CameraData getCamera(char[] name) 170 174 { 171 CameraData* data = (name in cameras); 172 assert(data !is null); 173 174 return *data; 175 } 176 177 // Removes a camera by its name 178 void removeCamera(char[] name) 179 { 180 logger.info("removing camera " ~ name); 181 182 cameras.remove(name); 183 } 184 185 // Activates a camera 186 void activateCamera(char[] name) 187 { 188 debug logger.trace("activating camera " ~ name); 189 190 cameras[name].active = true; 191 } 192 193 // Deactivates a camera 194 void deactivateCamera(char[] name) 195 { 196 debug logger.trace("deactivating camera {}", name); 197 198 cameras[name].active = false; 199 } 200 175 foreach(camera; cameras) 176 if(camera.name == name) 177 return camera; 178 179 assert(false); 180 } 181 201 182 // Debug data visible? 202 183 bool debugNodeVisible(SceneNode node) … … 351 332 void addToRender(RenderPass pass, SceneNode node) 352 333 { 334 if(cameraData.shadowMap && !node.renderShadow) 335 return; 336 353 337 NodeHolder holder; 354 338 holder.node = node; trunk/src/gen/scene/Node.d
r511 r520 95 95 Shader shader; 96 96 97 // Render this node for shadows? 98 bool renderShadow = false; 99 97 100 // Relative position of the object 98 101 vec3 relativePosition; trunk/src/windefend.cbp
r513 r520 105 105 <Unit filename="defend\Map.d" /> 106 106 <Unit filename="defend\MapGenerator.d" /> 107 <Unit filename="defend\MiniMap.d" />108 107 <Unit filename="defend\Simulation.d" /> 109 108 <Unit filename="defend\com\Gateway.d" /> … … 120 119 <Unit filename="defend\game\hud\Console.d" /> 121 120 <Unit filename="defend\game\hud\Hud.d" /> 121 <Unit filename="defend\game\hud\MiniMap.d" /> 122 122 <Unit filename="defend\game\hud\Mouse.d" /> 123 123 <Unit filename="defend\game\net\Client.d" />
