Changeset 520

Show
Ignore:
Timestamp:
04/17/08 13:06:59 (9 months ago)
Author:
LeoD
Message:

stuff!

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/run/data/shaders/terrain.pixel.glsl

    r511 r520  
    44uniform sampler2D texture3; 
    55uniform sampler2D lightmap; 
     6uniform sampler2D shadow; 
     7 
     8uniform vec3 lightPos; 
     9 
     10varying vec4 lightSpacePos; 
    611 
    712void main(void) 
     
    1621    c1 *= a.r * inverse; 
    1722    c2 *= a.g * inverse; 
    18     c3 *= a.b * inverse; 
     23    c3 *= a.b * inverse;    
    1924     
    2025    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    }*/ 
    2158} 
  • trunk/run/data/shaders/terrain.vertex.glsl

    r511 r520  
     1uniform mat4 lightTransform; 
     2 
     3varying vec4 lightSpacePos; 
     4 
    15void main(void) 
    26{ 
     
    48    gl_TexCoord[0] = gl_MultiTexCoord0; 
    59    gl_TexCoord[1] = gl_MultiTexCoord1; 
     10     
     11    lightSpacePos = lightTransform * gl_Vertex; 
    612} 
  • trunk/src/defend/Loop.d

    r515 r520  
    2525        logger.info("setting function to {}", (funcName = Fn.stringof)); 
    2626     
    27         func = &Fn
     27        func = &wrapper!(Fn)
    2828    } 
    2929 
     
    4141             
    4242            // Initialize the main function 
    43             fiber.call(true); 
     43            fiber.call(false); 
    4444             
    4545            // Main loop 
     
    6565             
    6666            // Unload 
    67             fiber.call(true); 
     67            fiber.call(false); 
    6868 
    6969            if(auto diff = (getMemoryUsage() - memoryUsage) > 0) 
     
    8383        Logger logger; 
    8484        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        } 
    8598    } 
    8699} 
  • trunk/src/defend/game/Game.d

    r519 r520  
    256256     
    257257    mainCamera = new MainCamera; 
    258     mainCamera.projection = mat4.projection(aspect, fov, 1, 100); 
     258    mainCamera.projection = mat4.projection(aspect, fov * PI / 180, 1, 300); 
    259259    sceneGraph.addCamera("main", mainCamera, vec3(0, 0, 0.2)); 
    260260 
  • trunk/src/defend/game/hud/MiniMap.d

    r519 r520  
    66import gen.math.Rectangle; 
    77import gen.math.Vector; 
     8import gen.math.Matrix; 
     9import gen.scene.Camera; 
     10import gen.scene.StaticCamera; 
     11import gen.scene.Graph; 
    812import gen.rend.Renderer; 
    913import gen.rend.Texture; 
     
    6266        renderer.setViewport(Rect(0, 0, renderer.width, renderer.height)); 
    6367    } 
    64      
     68 
    6569public: 
    6670    mixin MAllocator; 
     
    6872    this() 
    6973    { 
    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); 
    7184        renderTerrain(); 
    72  
     85         
    7386        sprite = new Sprite(texture, Rect(0, 0, width - 1, height - 1), true); 
    7487        position = vec2i(renderer.width - 150, renderer.height - HUD_HEIGHT + 10); 
  • trunk/src/defend/game/hud/Mouse.d

    r519 r520  
    415415    { 
    416416        GLint[4] viewport; 
    417  
    418         // register a callback for mouse move? 
     417         
    419418        auto pt = mouse.mousePos; 
    420419         
     
    507506        auto pos = terrain.getWorldPos(mapPos); 
    508507        mouseCube.translation = pos; 
    509  
    510         //if(inputManager.keyPressedFirst(KeyType.LeftButton)) 
    511         //  particles.system("smoke").spawn(pos + vec3(0, 1, 0), 17); 
    512508    } 
    513509     
     
    575571 
    576572        camera = cast(MainCamera)sceneGraph.getCamera("main").core; 
     573        assert(camera !is null, "fail."); 
    577574     
    578575        { 
  • trunk/src/defend/objects/SceneNode.d

    r516 r520  
    8989        this.parent = parent; 
    9090        this.mesh = mesh; 
     91        renderShadow = true; 
    9192    } 
    9293     
  • trunk/src/defend/terrain/Patch.d

    r510 r520  
    130130                vec2 tex1 = vec2(cast(float)_x / cast(float)heightmap.size.width, 
    131131                                 cast(float)_z / cast(float)heightmap.size.height); 
    132                 vec2 tex2 = tex1 * 8
     132                vec2 tex2 = tex1 * 16
    133133                vec2 tex3 = tex1; 
    134134                vec2 tex4 = tex3 * 32; 
  • trunk/src/defend/terrain/Terrain.d

    r518 r520  
    377377            renderer.mulMatrix(absoluteModelview); 
    378378 
    379             //renderer.setRenderState(RenderState.Blending, true); 
    380379            renderer.setRenderState(RenderState.BackfaceCulling, true); 
    381380 
    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); 
    385383 
    386384            renderer.setShader(shader); 
     
    391389            renderer.setTexture(3, diffuseMaps[2]); 
    392390            renderer.setTexture(4, lightmapTexture); 
     391            //renderer.setTexture(5, shadow.texture); 
    393392             
    394393            shader.setUniform("alpha", 0); 
     
    397396            shader.setUniform("texture3", 3); 
    398397            shader.setUniform("lightmap", 4); 
     398            //shader.setUniform("shadow", 5); 
     399 
     400            //shader.setUniform("lightTransform", shadow.core.projection * shadow.core.modelview); 
    399401             
    400402            foreach(patch; patches) 
     
    402404             
    403405            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); 
    430408            renderer.setTexture(4, null); 
    431409            renderer.setTexture(3, null); 
  • trunk/src/gen/math/Matrix.d

    r501 r520  
    348348        Mat4 projection(T aspect, T fov, T near, T far) 
    349349        { 
    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); 
    356356        } 
    357357 
  • trunk/src/gen/rend/Renderer.d

    r511 r520  
    162162    void setUniform(char[] name, int value); 
    163163    void setUniform(char[] name, vec3 value); 
     164    void setUniform(char[] name, mat4 value); 
    164165} 
    165166 
     
    339340     * Create an empty texture 
    340341     */ 
    341     Texture createTexture(vec2i dimension); 
     342    Texture createTexture(vec2i dimension, ImageFormat format = ImageFormat.RGB); 
    342343     
    343344    /** 
  • trunk/src/gen/rend/opengl/Renderer.d

    r518 r520  
    255255        setRenderState(RenderState.DepthTest, true); 
    256256        setRenderState(RenderState.Texture, true); 
    257         glDepthFunc(GL_LEQUAL); 
     257        glDepthFunc(GL_LESS); 
    258258    } 
    259259 
     
    467467    } 
    468468     
    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); 
    472472    } 
    473473     
  • trunk/src/gen/rend/opengl/Shader.d

    r511 r520  
    1313 
    1414import gen.math.Vector; 
     15import gen.math.Matrix; 
    1516import gen.util.File; 
    1617import gen.rend.Shader; 
     
    4142            glGetInfoLogARB(object, length, &length, error.ptr); 
    4243             
    43             throw new Exception("GLSL error: " ~ error); 
     44            Stdout("GLSL error: ")(error).newline; 
     45            //throw new Exception("GLSL error: " ~ error); 
    4446        } 
    4547    } 
     
    123125        glUniform3fARB(uniformHandle(name), value.tupleof); 
    124126    } 
     127     
     128    override void setUniform(char[] name, mat4 value) 
     129    { 
     130        glUniformMatrix4fvARB(uniformHandle(name), 1, false, value.ptr); 
     131    } 
    125132} 
  • trunk/src/gen/rend/opengl/Texture.d

    r518 r520  
    11module gen.rend.opengl.Texture; 
    22 
     3import tango.io.Console; 
    34import tango.io.Stdout; 
    4  
    5 import derelict.opengl.gl; 
    6 import derelict.opengl.glu; 
    75 
    86import gen.util.Memory; 
     
    108import gen.math.Vector; 
    119import gen.rend.Texture; 
     10import gen.rend.opengl.Wrapper; 
    1211 
    1312package class OGLTexture : Texture 
     
    1514private: 
    1615    ImageFormat _format; 
     16    float[] depthBuffer; 
    1717     
    1818    GLuint id; 
     
    6060    } 
    6161     
    62     this(vec2i dim
     62    this(vec2i dim, ImageFormat format
    6363    { 
    6464        this.dim = dim; 
    65         _format = ImageFormat.RGB
     65        _format = format
    6666         
    6767        create(); 
     68 
     69        // hack 
     70        if(format == ImageFormat.A) 
     71        { 
     72            depthBuffer.alloc(width * height); 
     73            return; 
     74        } 
    6875         
    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); 
    7078    } 
    7179     
    7280    ~this() 
    7381    { 
     82        // hack 
     83        if(depthBuffer) 
     84            depthBuffer.free(); 
     85     
    7486        glDeleteTextures(1, &id); 
    7587    } 
     
    97109    override void copyFromScreen() 
    98110    { 
     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     
    99143        assert(format == ImageFormat.RGB); 
    100144         
    101145        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); 
    103149    } 
    104150     
  • trunk/src/gen/rend/opengl/Wrapper.d

    r507 r520  
    33// Thanks to Dk (http://while-nan.blogspot.com/) for this idea 
    44 
    5 public import derelict.opengl.gl; 
    6 public import derelict.opengl.glu; 
    7 public import derelict.opengl.extension.arb.vertex_buffer_object; 
     5public 
     6
     7    import derelict.opengl.gl; 
     8    import derelict.opengl.glu; 
     9    import derelict.opengl.extension.arb.vertex_buffer_object; 
     10
    811 
    912import tango.core.Traits; 
     
    1114 
    1215private bool insideblock = false; // Are we currently inside of a glBegin/glEnd block? 
     16 
     17//debug = dump; 
    1318 
    1419template glCheck(alias Fn) 
     
    5459     
    5560    alias glCheck!(GL.glViewport) glViewport; 
     61    alias glCheck!(GL.glReadPixels) glReadPixels; 
     62    alias glCheck!(GL.glTexImage2D) glTexImage2D; 
    5663    alias glCheck!(GL.glMatrixMode) glMatrixMode; 
    5764    alias glCheck!(GL.glLoadIdentity) glLoadIdentity; 
  • trunk/src/gen/scene/Graph.d

    r518 r520  
    22 
    33import tango.io.Stdout; 
    4  
     4import tango.util.Convert; 
     5 
     6import gen.image.Image; 
    57import gen.list.BufferedArray; 
    68import gen.util.Log; 
     
    3739    BufferedArray!(NodeHolder)[RenderPass.max + 1] renderPasses; 
    3840    bool active = true; 
     41     
     42public: 
    3943    vec3 clearColor; 
    40      
    41 public: 
     44 
     45    char[] name; 
    4246    Camera core; 
    4347    Texture texture; // The texture that is rendered to (not available for the main camera) 
     48    bool shadowMap; 
    4449     
    4550    bool isMain() 
     
    4752        return texture is null; 
    4853    } 
     54     
     55    char[] toString() { return to!(char[])(cast(int)cast(void*)core); } 
    4956} 
    5057 
     
    5764 
    5865    // All cameras 
    59     CameraData[char[]] cameras; 
     66    CameraData[] cameras; 
    6067 
    6168    // Current camera 
     
    8491        logger.info("full reset"); 
    8592         
    86         foreach(key, cam; cameras) 
     93        foreach(cam; cameras) 
    8794        { 
    88             logger.info("deleting camera " ~ key); 
     95            logger.info("deleting camera {}", cam.name); 
    8996             
    9097            foreach(pass; cam.renderPasses) 
     
    97104 
    98105            delete cam; 
    99              
    100             cameras.remove(key); 
    101106        } 
     107         
     108        cameras.length = 0; 
    102109         
    103110        debug foreach(key, cam; cameras) 
     
    113120 
    114121    // 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); 
    118126         
    119127        CameraData data = new CameraData; 
     128        data.name = name; 
    120129        data.active = true; 
    121130        data.clearColor = clearColor; 
    122131        data.core = core; 
    123132        data.texture = texture; 
     133        data.shadowMap = shadowMap; 
     134 
     135        if(shadowMap) 
     136            assert(texture !is null); 
    124137 
    125138        if(data.texture) 
     
    129142            pass.create(16); 
    130143 
    131         cameras[name] = data; 
    132  
    133         // Ensure that only main camera exists 
     144        cameras ~= data; 
     145 
     146        // Ensure that only one main camera exists 
    134147        debug 
    135148        { 
     
    141154            } 
    142155 
    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"); 
    145157        } 
    146158 
    147159        // 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) 
    152161        { 
    153162            if(cam.isMain) 
    154                 main = key; 
     163            { 
     164                swap(cameras[$ - 1], cameras[i]); 
     165                break; 
     166            } 
    155167        } 
    156  
    157         foreach_reverse(key; cameras.keys) 
    158         { 
    159             last = key; 
    160             break; 
    161         } 
    162  
    163         swap(cameras[main], cameras[last]); 
    164  
     168         
    165169        return data; 
    166170    } 
     
    169173    CameraData getCamera(char[] name) 
    170174    { 
    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     
    201182    // Debug data visible? 
    202183    bool debugNodeVisible(SceneNode node) 
     
    351332    void addToRender(RenderPass pass, SceneNode node) 
    352333    { 
     334        if(cameraData.shadowMap && !node.renderShadow) 
     335            return; 
     336     
    353337        NodeHolder holder; 
    354338        holder.node = node; 
  • trunk/src/gen/scene/Node.d

    r511 r520  
    9595    Shader shader; 
    9696     
     97    // Render this node for shadows? 
     98    bool renderShadow = false; 
     99     
    97100    // Relative position of the object 
    98101    vec3 relativePosition; 
  • trunk/src/windefend.cbp

    r513 r520  
    105105        <Unit filename="defend\Map.d" /> 
    106106        <Unit filename="defend\MapGenerator.d" /> 
    107         <Unit filename="defend\MiniMap.d" /> 
    108107        <Unit filename="defend\Simulation.d" /> 
    109108        <Unit filename="defend\com\Gateway.d" /> 
     
    120119        <Unit filename="defend\game\hud\Console.d" /> 
    121120        <Unit filename="defend\game\hud\Hud.d" /> 
     121        <Unit filename="defend\game\hud\MiniMap.d" /> 
    122122        <Unit filename="defend\game\hud\Mouse.d" /> 
    123123        <Unit filename="defend\game\net\Client.d" />