Changeset 576

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

fog of war culling

Files:

Legend:

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

    r574 r576  
    99    vec4 c = texture2D(lightmap, vec2(gl_TexCoord[0])); 
    1010 
    11     gl_FragColor = max(a, b * 0.67f) * c; 
     11    gl_FragColor = max(a, b * 0.55f) * c; 
     12    //gl_FragColor = a * c; 
    1213} 
  • trunk/src/defend/Camera.d

    r572 r576  
    100100        if(minDistance < 2) 
    101101            minDistance = 2; 
     102         
     103        //collision(); 
    102104    } 
    103105 
     
    153155        }); 
    154156         
    155         /+foreach(object; gameObjects) 
     157        /*foreach(object; gameObjects) 
    156158        { 
    157159            auto bbox = object.sceneNode.boundingBox.expanded(2); 
     
    159161            if(bbox.checkCollision(pos) && bbox.max.y > minDistance) 
    160162            { 
    161                 minDistance = bbox.max.y; 
     163                pos.y = bbox.max.y; 
    162164                return; 
    163165            } 
    164         }+
     166        }*
    165167    } 
    166168 
  • trunk/src/defend/game/Game.d

    r575 r576  
    274274 
    275275        // Fog of war 
    276         fogOfWar = new FogOfWar(gameObjects, terrain.lightmapTexture, vec2i.from(terrain.dimension)); 
     276        fogOfWar = new FogOfWar(gameObjects, terrain.lightmapTexture, vec2i.from(terrain.dimension), true); 
    277277 
    278278        // Create the HUD 
  • trunk/src/defend/game/hud/MiniMap.d

    r573 r576  
    4040    void renderTerrain() 
    4141    { 
    42         with(renderer) 
    43         { 
    44             assert(terrain !is null); 
    45             assert(texture !is null); 
     42        renderer.setViewport(Rect(0, 0, width, height)); 
    4643 
    47             setViewport(Rect(0, 0, width, height)); 
     44        renderer.identity(MatrixType.Projection); 
     45        glOrtho(terrain.dimension.x - 1, 0, terrain.dimension.y - 1, 0, 0, 1337); 
     46         
     47        renderer.identity(); 
     48         
     49        auto center = vec2( (terrain.dimension.x - 1), 
     50                           -(terrain.dimension.y - 1)); 
     51         
     52        gluLookAt(center.x, 500.0f, center.y, center.x, 0.0f, 
     53                  center.y, 0.0f, 0.0f, 1.0f); 
    4854 
    49             identity(MatrixType.Projection); 
    50             orthogonal(vec2i.from(terrain.dimension) - vec2i.one); 
    51              
    52             identity(MatrixType.Modelview); 
    53              
    54             { 
    55                 auto center = vec2( (terrain.dimension.x - 1), 
    56                                    -(terrain.dimension.y - 1)); 
    57                  
    58                 gluLookAt(center.x, 500.0f, center.y, center.x, 0.0f, 
    59                           center.y, 0.0f, 0.0f, 1.0f); 
    60             } 
     55        renderer.clear(); 
     56        terrain.renderOrthogonal(); 
    6157 
    62            clear(); 
    63            terrain.renderOrthogonal(); 
     58        texture.copyFromScreen(); 
     59        renderer.clear(); 
    6460 
    65             texture.copyFromScreen(); 
    66             clear(); 
    67         } 
     61        renderer.setViewport(Rect(0, 0, renderer.width, renderer.height)); 
    6862    } 
    6963 
  • trunk/src/defend/game/hud/Mouse.d

    r575 r576  
    7272    BufferedArray!(GameObject) selectionBuffer; 
    7373    BufferedArray!(object_id_t) objectIDBuffer; 
    74  
     74     
     75    invariant() 
     76    { 
     77        if(selectionBuffer.length) 
     78        { 
     79            auto owner = selectionBuffer[0].owner; 
     80             
     81            foreach(object; selectionBuffer.toArray[1 .. $]) 
     82                assert(object.owner == owner); 
     83        } 
     84    } 
     85     
    7586    // Object placement 
    7687    object_type_t placeObject; 
     
    239250                    { 
    240251                        // Don't put it twice into the list 
    241                         if(!obj.selected && selectionBuffer.length < MAX_ORDERED_OBJECTS) 
     252                        if(!obj.selected && selectionBuffer.length < MAX_ORDERED_OBJECTS && 
     253                           (!selectionBuffer.length || selectionBuffer[0].owner == obj.owner)) 
    242254                        { 
    243                             selectionBuffer.append(cast(GameObject)obj); 
     255                            selectionBuffer.append(obj); 
    244256                             
    245257                            obj.selected = true; 
  • trunk/src/defend/sim/Core.d

    r575 r576  
    358358            { 
    359359                final tile = map.getTile(x, y); 
    360                 final tile_height = tile.height; 
    361360 
    362361                if(height == -1) 
    363                     height = tile_height; 
     362                    height = tile.height; 
    364363                else 
    365364                { 
    366                     if(abs(tile_height - height) > tolerance) 
     365                    if(abs(tile.height - height) > tolerance) 
    367366                        return false; 
    368367                } 
     
    933932 
    934933        debug(gameobjects) 
    935             logger = Log.getLogger("objects.object." ~ Integer.toString(id)); 
     934            logger = Log.getLogger("sim.object." ~ Integer.toString(id)); 
    936935    } 
    937936 
     
    950949    { 
    951950        assert(objects.length > 0); 
     951         
     952        auto owner = objects[0].owner; 
     953        foreach(object; objects[1 .. $]) assert(object.owner == owner); 
    952954    } 
    953955    body 
     
    964966            { 
    965967                ObjectTypeInfo ti = object.typeInfo; 
    966                  
     968 
    967969                if(!ti.isTypeInHierarchy(currentLevel.localTypeID)) 
    968970                { 
  • trunk/src/defend/sim/SceneNode.d

    r574 r576  
    4444public: 
    4545    mixin MAllocator; 
     46 
     47    bool fogOfWarCulled; 
    4648     
    4749    this(SceneNode parent, char[] file, vec3 color, bool isNeutral = false) 
     
    7274    override void process(Camera camera) 
    7375    { 
    74         visible = camera.frustum.boundingBoxVisible(bbox)
     76        visible = camera.frustum.boundingBoxVisible(bbox) && !fogOfWarCulled
    7577    } 
    7678     
  • trunk/src/defend/sim/obj/Resource.d

    r574 r576  
    138138    } 
    139139     
    140     bool intersectRay(Ray!(float) ray) 
     140    override bool intersectRay(Ray!(float) ray) 
    141141    { 
    142142        return ray.intersectBoundingBox(_sceneNode.boundingBox); 
     143    } 
     144     
     145    override void update() 
     146    { 
     147        _sceneNode.fogOfWarCulled = fogOfWarCulled; 
    143148    } 
    144149     
  • trunk/src/defend/terrain/FogOfWar.d

    r574 r576  
    1212import gen.math.Vector; 
    1313import gen.math.Rectangle; 
    14 import gen.math.Misc : clamp
     14import gen.math.Misc : clamp, min, max
    1515 
    1616import defend.sim.Core; 
     
    169169        foreach(object; gameObjects) with(object) 
    170170        { 
    171             // TODO: fog of war needs to include any object of the own team 
     171            // TODO: fog of war needs to include any objects of the own team 
    172172            if(mayBeOrdered) 
    173173            { 
    174                 auto ti = typeInfo; 
    175                  
    176                 visibleTiles.fill(true, mapPos.x, mapPos.y, ti.dimension.x, ti.dimension.y); 
    177                 visitedTiles.fill(true, mapPos.x, mapPos.y, ti.dimension.x, ti.dimension.y); 
    178             } 
    179         } 
    180          
     174                auto sight = cast(int)(cast(real)property(GameObject.Property.Sight)); 
     175             
     176                auto x = max(0, cast(int)mapPos.x - sight / 2); 
     177                auto y = max(0, cast(int)mapPos.y - sight / 2); 
     178                auto w = min(dimension.x - 1 - mapPos.x, sight); 
     179                auto h = min(dimension.y - 1 - mapPos.y, sight); 
     180 
     181                visibleTiles.fill(true, x, y, w, h); 
     182                visitedTiles.fill(true, x, y, w, h); 
     183            } 
     184        } 
     185 
    181186        foreach(object; gameObjects) with(object) 
    182187        { 
     
    197202                } 
    198203            } 
    199                  
     204             
     205            if(cull) 
     206            { 
     207                foreach(tile; visitedTiles.iterate(mapPos.x, mapPos.y, ti.dimension.x, ti.dimension.y)) 
     208                { 
     209                    if(tile) 
     210                    { 
     211                        cull = false; 
     212                        break; 
     213                    } 
     214                } 
     215            } 
     216             
    200217            fogOfWarCulled = cull; 
    201218            //if(cull) synchronized(Stdout) Stdout("fog of war culled: ")(object.id).newline; 
     
    204221 
    205222    // Generate a circle, which can be rendered on the fog of war texture 
    206     static Texture generateCircle(vec2i size = vec2i(64, 64), float intensity = 1.2
     223    static Texture generateCircle(vec2i size = vec2i(64, 64), float intensity = 5
    207224    { 
    208225        scope image = new Image(size.tuple, ImageFormat.A); 
     
    216233 
    217234public: 
     235    //bool isVisible(uint x, uint y) { return visibleTiles[x, y]; } 
     236 
    218237    this(GameObjectManager gameObjects, Texture lightmap, vec2i dimension, bool enable = true) 
    219238    { 
  • trunk/src/defend/terrain/Generator.d

    r574 r576  
    7676            //  localCreate(cast(player_id_t)0, "house", 40, 30); 
    7777             
    78             for(int i = 0; i < 20; i++) 
     78            for(int i = 0; i < 50; i++) 
    7979            { 
    8080                auto ti = getTypeInfo(NEUTRAL_PLAYER, "wood"); 
  • trunk/src/defend/terrain/Terrain.d

    r573 r576  
    424424 
    425425            // debugging if the unit sight ranges are scaled correctly 
    426             /*renderer.setRenderState(RenderState.Wireframe, true); 
     426            /+renderer.setRenderState(RenderState.Wireframe, true); 
    427427            renderer.setRenderState(RenderState.Blending, true); 
    428428            renderer.setColor(vec4(1, 1, 1, 0.5)); 
     
    434434             
    435435            renderer.setRenderState(RenderState.Blending, false); 
    436             renderer.setRenderState(RenderState.Wireframe, false);*
     436            renderer.setRenderState(RenderState.Wireframe, false);+
    437437 
    438438            debug if(sceneGraph.debugNodeVisible(this)) 
    439439                foreach(patch; patches) if(patch.visible) 
    440440                    renderer.drawBoundingBox(patch.boundingBox, vec3(0, 0.7, 1)); 
     441             
     442            /+for(uint x = 0; x < dimension.x; x++) 
     443            { 
     444                for(uint y = 0; y < dimension.y; y++) 
     445                { 
     446                    auto visible = fogOfWar.isVisible(x, y); 
     447                     
     448                    if(visible) 
     449                    { 
     450                        auto pos = getWorldPos(x, y); 
     451                        renderer.drawLine(pos, pos + vec3(0, 1, 0), vec3(1, 0, 0)); 
     452                    } 
     453                } 
     454            }+/ 
    441455             
    442456            renderer.popMatrix(); 
  • trunk/src/gen/util/Array.d

    r573 r576  
    7474        uint x, y, w, h; 
    7575         
    76         int opApply(int delegate(ref T value) dg) 
     76        int opApply(int delegate(ref T) dg) 
    7777        { 
    7878            for(uint _x = x; _x < x + w; _x++) 
     
    8181                { 
    8282                    if(auto result = dg(array.data[_x + _y * array.width]) != 0) 
     83                        return result; 
     84                } 
     85            } 
     86             
     87            return 0; 
     88        } 
     89         
     90        int opApply(int delegate(ref uint, ref uint, ref T) dg) 
     91        { 
     92            for(uint _x = x; _x < x + w; _x++) 
     93            { 
     94                for(uint _y = y; _y < y + h; _y++) 
     95                { 
     96                    if(auto result = dg(_x, _y, array.data[_x + _y * array.width]) != 0) 
    8397                        return result; 
    8498                } 
     
    125139    void fill(T value, uint x, uint y, uint w, uint h) 
    126140    { 
    127         data[x + y * width .. (x + w) + (y + h) * width] = value; 
     141        //data[x + y * width .. (x + w) + (y + h) * width] = value; 
     142         
     143        foreach(ref x; iterate(x, y, w, h)) 
     144            x = value; 
    128145    } 
    129146     
     
    140157    } 
    141158     
     159    Iterator iterate() 
     160    { 
     161        return iterate(0, 0, width, height); 
     162    } 
     163     
    142164    void reset() 
    143165    {