Changeset 537

Show
Ignore:
Timestamp:
05/13/08 16:09:14 (8 months ago)
Author:
LeoD
Message:

enabling/disabling shadow mapping

Files:

Legend:

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

    r536 r537  
    1 #include shadowmap.glsl 
    2  
    31uniform sampler2D diffuseTexture; 
    42uniform sampler2D lightTexture; 
     3 
     4#ifdef SHADOWMAPPING 
     5#   include "shadowmap.glsl" 
     6 
    57uniform sampler2D shadow; 
    68 
     9varying vec4 lightSpacePos; 
     10#endif 
     11 
    712uniform vec3 color;  
    8  
    9 varying vec4 lightSpacePos; 
    1013 
    1114void main() 
     
    1417    vec4 light = texture2D(lightTexture, vec2(gl_TexCoord[1])); 
    1518     
    16     //gl_FragColor = vec4(tex.rgb * tex.a + color * (1 - tex.a), 1.0) * gl_Color * (light * 2); //* shadowMap(shadow, lightSpacePos); 
    1719    gl_FragColor = vec4(tex.rgb * tex.a + color * (1 - tex.a), 1.0) * (light * 2); 
    1820     
     
    2022    gl_FragColor *= shadowMap(shadow, lightSpacePos); 
    2123#else 
    22     gl_FragColor *= gl_Color * 2
     24    gl_FragColor *= gl_Color
    2325#endif 
    24  
    25     gl_FragColor = vec4(tex.rgb, 1.0); 
    2626} 
  • 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) 
     1uniform vec3 mapPos; 
     2uniform vec3 mapSize; 
    43 
     4#ifdef SHADOWMAPPING 
    55uniform mat4 lightTransform; 
    66uniform mat4 modelTransform; 
    77 
    8 uniform vec3 mapPos; 
    9 uniform vec3 mapSize; 
    10  
    118varying 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 
    1214 
    1315void main(void) 
     
    2123    lightSpacePos = lightTransform * (modelTransform * gl_Vertex); 
    2224#else 
    23     // Lighting 
    2425    vec3 position = vec3(gl_ModelViewMatrix * gl_Vertex); 
    25     vec3 light = vec3(normalize(vec3(gl_ModelViewMatrix * LIGHT_POSITION) - position)); 
    2626    vec3 light = vec3(normalize(vec3(gl_LightSource[0].position) - position)); 
    2727    vec3 normal = normalize(gl_NormalMatrix * gl_Normal); 
  • trunk/run/data/shaders/model.cfg

    r535 r537  
    11vertex_shader = "model-vertex.glsl" 
    22pixel_shader = "model-pixel.glsl" 
    3  
    4 section defines 
    5     SHADOWMAPPING 
  • trunk/run/data/shaders/shadowmap.glsl

    r534 r537  
    1 float shadowMapSingle(in sampler2D sampler, in vec2 shadowMapCoord, in float lightDistance) { 
     1#ifdef SHADOWMAPPING 
     2 
     3float shadowMapSingle(in sampler2D sampler, in vec2 shadowMapCoord, in float lightDistance) 
     4
    25    float shadowMapDistance = texture2D(sampler, shadowMapCoord).r; 
    36 
    4     //if(shadowMapCoord.x >= 0 && shadowMapCoord.x <= 1 && shadowMapCoord.y >= 0 && shadowMapCoord.y <= 1 && 
    5     //   lightDistance >= shadowMapDistance && shadowMapDistance != 1.0f) // point is in shadow 
    6     //    return 0.35f; 
    7      
    8     //return 1.0f; 
    97    return (shadowMapCoord.x >= 0 && shadowMapCoord.x <= 1 && shadowMapCoord.y >= 0 && shadowMapCoord.y <= 1 && 
    108           lightDistance >= shadowMapDistance && shadowMapDistance != 1.0f) ? 0.35f : 1.0f; 
     
    2119    float o2 = 0.0005f; 
    2220 
    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 
    3328     
    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 
    3630    val += shadowMapSingle(sampler, shadowMapCoord + vec2( o1-0.0001, o1), lightDistance); 
     31#endif 
     32 
     33#if SHADOWMAPPING_SAMPLES > 3  
    3734    val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o1, o1-0.0001), lightDistance); 
     35#endif 
    3836 
     37#if SHADOWMAPPING_SAMPLES > 4 
    3938    val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o2,-o2+0.0001), lightDistance); 
     39#endif 
     40 
     41#if SHADOWMAPPING_SAMPLES > 5     
    4042    val += shadowMapSingle(sampler, shadowMapCoord + vec2( o2+0.0001,-o2), lightDistance); 
     43#endif 
     44     
     45#if SHADOWMAPPING_SAMPLES > 6 
    4146    val += shadowMapSingle(sampler, shadowMapCoord + vec2( o2, o2-0.0001), lightDistance); 
    42     val += shadowMapSingle(sampler, shadowMapCoord + vec2(-o2-0.0001, o2), lightDistance);*/ 
     47#endif 
    4348 
    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; 
    4554    return val; 
    4655} 
     56 
     57#endif 
  • trunk/run/data/shaders/terrain-pixel.glsl

    r536 r537  
    66 
    77#ifdef SHADOWMAPPING 
    8 #include shadowmap.glsl 
     8#  include "shadowmap.glsl" 
    99 
    1010uniform sampler2D shadow; 
     
    2929    c3 *= a.b * inverse; 
    3030     
    31     //gl_FragColor = vec4(shadowMap(shadow, lightSpacePos)); 
    3231    gl_FragColor = (c1 + c2 + c3) * (l * 2); 
    3332     
  • trunk/run/data/shaders/terrain.cfg

    r535 r537  
    11vertex_shader = "terrain-vertex.glsl" 
    22pixel_shader = "terrain-pixel.glsl" 
    3  
    4 section defines 
    5     SHADOWMAPPING 
  • trunk/src/defend/Main.d

    r535 r537  
    1616import gen.math.Vector : vec2i, vec3; 
    1717import gen.rend.Window : Window; 
    18 import gen.rend.Renderer : RendererConfig, Renderer, renderer; 
     18import gen.rend.Renderer : RendererConfig, Shader, Renderer, renderer; 
    1919import gen.rend.opengl.Renderer : OGLRenderer; 
    2020import gen.scene.Graph : SceneGraph, sceneGraph; 
     
    243243    } 
    244244 
     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 
    245253    // Create the renderer 
    246254    logger.info("creating renderer"); 
  • trunk/src/defend/game/Game.d

    r535 r537  
    120120    void initShadowMapping() 
    121121    { 
    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); 
    123124         
    124125        auto camera = new StaticCamera(vec3(-20, 40, -39), vec3(-0.9, -1.57, 0), 
     
    153154 
    154155        // Call the requested map generators 
     156        logger.info("generating map"); 
     157         
    155158        generateMap(info, (TerrainHeightmap heightmap) 
    156159        { 
     
    181184        players = new PlayerManager(gateway); 
    182185 
    183         // Create the synchronized object manager 
     186        // Create the game object manager 
    184187        gameObjects = new GameObjectManager(gateway, players, simulation); 
    185188 
     
    272275    sceneGraph.addCamera("main", mainCamera, vec3(0, 0, 0.2)); 
    273276 
    274     //initShadowMapping(); 
     277    if(defendConfig("graphics").integer("shadowmapping")) 
     278        initShadowMapping(); 
    275279 
    276280    logger.info("initializing communication"); 
     
    286290    logger.info("communication process finished"); 
    287291 
    288     //createTerrain(); 
    289      
    290292    // Move the camera to the first object we find 
    291293    foreach(object; gameObjects) 
  • trunk/src/defend/game/hud/MiniMap.d

    r536 r537  
    2323{ 
    2424private: 
    25     const width = 2048; 
    26     const height = 2048; 
     25    const width = 128; 
     26    const height = 128; 
    2727 
    2828    Image image; 
     
    7171 
    7272    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    {        
    9174        if(!texture) 
    9275        { 
     
    10386    ~this() 
    10487    { 
    105         //delete sprite; 
    106         //delete texture; 
     88        delete sprite; 
     89        delete texture; 
    10790    } 
    10891 
    10992    void render() 
    11093    { 
    111         //assert(texture !is null); 
    112         //assert(sprite !is null); 
     94        assert(texture !is null); 
     95        assert(sprite !is null); 
    11396 
    114         //sprite.render(position); 
     97        sprite.render(position); 
    11598    } 
    11699     
  • trunk/src/defend/objects/SceneNode.d

    r536 r537  
    8787         
    8888        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"); 
    9290        this.parent = parent; 
    9391        this.mesh = mesh; 
     
    137135        } 
    138136        else 
     137        { 
     138            renderer.setTexture(0, null); 
    139139            renderer.setShader(null); 
     140        } 
    140141         
    141         mesh.render(); 
     142        //mesh.texture = Texture.loadResource("data/models/house/model.png"); 
     143        //mesh.render(); 
     144        renderer.draw(mesh.vertices, null, mesh.type); 
    142145 
    143146        renderer.popMatrix(); 
  • trunk/src/defend/terrain/Terrain.d

    r536 r537  
    338338        size = heightmap.size; 
    339339        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"); 
    345344        loadDiffuseMaps(); 
     345         
     346        logger.info("creating patches"); 
    346347        createPatches(); 
     348         
     349        logger.info("creating alpha maps"); 
    347350        createAlphaMaps(); 
     351         
     352        logger.info("creating lightmap"); 
    348353        createLightmap(); 
    349354         
     355        logger.info("creating cull tree"); 
    350356        createCullTree(); 
    351357    } 
  • trunk/src/gen/rend/Renderer.d

    r535 r537  
    154154{ 
    155155    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    } 
    156164     
    157165    static Shader loadResource(char[] file) 
  • trunk/src/gen/rend/opengl/Shader.d

    r535 r537  
    2323{ 
    2424private: 
     25    char[] globalDefines; 
     26     
    2527    int context; 
    2628 
    2729    int[char[]] uniformHandles; 
    2830 
    29     char[] preprocess(char[] base, char[] code) 
     31    char[] preprocessIncludes(char[] base, char[] code) 
    3032    { 
    3133        char[] result; 
    3234     
    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, ' ')) 
    4043            { 
    41                 if(auto pos = locate(line, ' ')) 
     44                auto command = trim(line[1 .. pos]); 
     45                 
     46                if(command == "include") 
    4247                { 
    43                     switch(line[1 .. pos]
     48                    withReadFile!(GCAllocator, char)(base ~ line[pos + 2 .. $ - 1], (char[] code
    4449                    { 
    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] = ' '; 
    5157                    } 
    5258                } 
    5359            } 
    54             else 
    55                 result ~= line ~ "\n"; 
    5660        } 
    5761         
     
    7680             
    7781            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) 
    8389    { 
    8490        assert(context); 
     
    9197        foreach(i, code; codes) 
    9298        { 
    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; 
    94104            lengths[i] = code.length; 
    95105        } 
    96          
     106 
    97107        glShaderSourceARB(result, T.length, strings.ptr, lengths.ptr); 
    98108        glCompileShaderARB(result); 
     
    113123 
    114124    int uniformHandle(char[] name) 
     125    in 
     126    { 
     127        assert(*(name.ptr + name.length) == '\0', "uniform names need to be zero terminated"); 
     128    } 
     129    body 
    115130    { 
    116131        if(auto handle = name in uniformHandles) 
    117132            return *handle; 
    118              
    119         // assuming zero-terminated strings 
     133         
    120134        return (uniformHandles[name] = glGetUniformLocationARB(context, name.ptr)); 
    121135    } 
     
    127141             
    128142        context = glCreateProgramObjectARB(); 
     143         
     144        // create GLSL code for setting the global defines 
     145        foreach(key, val; Shader.defines) 
     146            globalDefines ~= "#define " ~ key ~ " " ~ val ~ "\n"; 
    129147    } 
    130148     
     
    133151        if(FilePath(vertexFile).exists) withReadFile!(GCAllocator, char)(vertexFile, (char[] code) 
    134152        { 
    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); 
    136158        }); 
    137159 
    138160        if(FilePath(pixelFile).exists) withReadFile!(GCAllocator, char)(pixelFile, (char[] code) 
    139161        { 
    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); 
    141166        });  
    142167    } 
     
    156181    this(char[] file) 
    157182    { 
    158         assert(false, "please use configs for shaders"); 
    159      
    160183        init(); 
    161184 
     
    166189                base ~= part ~ "/"; 
    167190 
    168             createShaders(base, file ~ "-vertex.glsl", file ~ "-pixel.glsl", ""); 
     191            createShaders(base, file ~ "-vertex.glsl", file ~ "-pixel.glsl"); 
    169192        } 
    170193         
  • trunk/src/gen/scene/Graph.d

    r534 r537  
    300300                foreach(object; cam.renderPasses[renderPass]) 
    301301                { 
    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); 
    304304                     
    305305                    object.node.render(); 
  • trunk/src/gen/util/Config.d

    r536 r537  
    227227        Assign, 
    228228         
    229         Section 
     229        LBracket, 
     230        RBracket 
    230231    } 
    231232     
     
    313314 
    314315                    // 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 != '[') 
    316318                        token.text ~= cn; 
    317  
    318                     switch(token.text) 
    319                     { 
    320                     case "section": // TODO: map of keywords 
    321                         token.type = TokenType.Section; 
    322                         break; 
    323                          
    324                     default: 
    325                         break; 
    326                     } 
    327319                     
    328320                    return token; 
     
    338330                     
    339331                    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                 
    341345                case '/': 
    342346                    if(nc != '/') 
     
    345349                    while(nc != '\r' && c != '\n' && c != '\0') {} 
    346350                     
    347                     if(c == '\0') 
    348                         goto case '\0'; 
    349                      
    350                     // fallthrough 
     351                    continue; 
    351352                     
    352353                case '\r', '\n': 
     
    361362                     
    362363                    token.type = TokenType.NewLine; 
    363                     return token; 
    364                  
    365                 case '@': 
    366                     nc; 
    367                      
    368                     token.type = TokenType.Section; 
    369364                    return token; 
    370365                 
     
    471466                switch(token.type) 
    472467                { 
    473                 case TokenType.Section
     468                case TokenType.LBracket
    474469                    if(next.type != TokenType.Identifier) 
    475470                        error("expected 'identifier' after 'section'"); 
    476471 
    477472                    auto name = token.text; 
    478  
     473                     
     474                    if(next.type != TokenType.RBracket) 
     475                        error("expected ']' after section identifier, got " ~ Integer.toString(token.type)); 
     476                     
    479477                    if(next.type != TokenType.NewLine) 
    480478                        error("expected 'new line' after section definition");