Changeset 589

Show
Ignore:
Timestamp:
05/30/08 18:09:18 (7 months ago)
Author:
LeoD
Message:

lowered simulation frequency to 10fps, added interpolation.. seems pretty smooth now

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/defend/demo/Player.d

    r583 r589  
    2323 
    2424    FileConduit file; 
    25     float _speed = 20
     25    float _speed = 0.3
    2626 
    2727    ubyte[] dataBuffer; 
     
    209209    } 
    210210 
    211     override void startPhase() 
     211    override bool startPhase() 
    212212    { 
    213213        if(finished) 
    214             return
     214            return false
    215215     
    216216        while(true) 
     
    221221                finished = true; 
    222222             
    223                 return
     223                return false
    224224            } 
    225225 
     
    245245                break; 
    246246        } 
     247         
     248        return true; 
    247249    } 
    248250     
  • trunk/src/defend/game/Game.d

    r585 r589  
    298298         
    299299        taskManager.addRepeatedTask(&InputChannel.global.update, 100); 
    300         taskManager.addRepeatedTask(&gameObjects.update, 30); 
     300        taskManager.addRepeatedTask(&gameObjects.update, 100); 
    301301        taskManager.addRepeatedTask(&sceneGraph.update, 60); 
    302302        taskManager.addRepeatedTask(&gateway.update, 10); 
  • trunk/src/defend/game/hud/Hud.d

    r583 r589  
    118118            }); 
    119119             
    120             version(none) foreach(obj; mouse.selection) 
    121             { 
    122                 auto p = mouse.getScreenPos(obj.realPos); 
    123                 p.y = renderer.height - p.y; 
    124                  
    125                 smallFont.write(guiRenderer, vec2i(p.x, p.y), vec3.one, "[{}]", obj.id); 
    126             } 
     120            foreach(obj; mouse.selection) 
     121                smallFont.write(guiRenderer, mouse.getScreenPos(obj.realPos), 
     122                                vec3.one, "[{}]", obj.id); 
    127123        } 
    128124    } 
  • trunk/src/defend/game/hud/Mouse.d

    r588 r589  
    527527            overTerrain = true; 
    528528 
    529         mouseCube.hide = true
     529        mouseCube.hide = !overTerrain
    530530 
    531531        auto pos = terrain.getWorldPos(mapPos); 
  • trunk/src/defend/game/net/Client.d

    r583 r589  
    344344    } 
    345345     
    346     override void startPhase() 
     346    override bool startPhase() 
    347347    { 
    348348        if(!phaseQueue.first.mayBeStarted) 
    349             return
     349            return false
    350350         
    351351        phase++; 
     
    367367        phaseQueue.last.whichPhase = phaseQueue[phaseQueue.length - 2].whichPhase + 
    368368                         cast(phase_counter_t)1; 
     369                          
     370        return true; 
    369371    } 
    370372     
  • trunk/src/defend/game/net/Server.d

    r584 r589  
    247247                    logger.info("need to adjust order's phase from {} to {}", 
    248248                                message.phase, 
    249                                 server.currentPhase + cast(phase_counter_t)2); 
    250                  
    251                 message.phase = server.currentPhase + cast(phase_counter_t)2
     249                                server.currentPhase + cast(phase_counter_t)1); 
     250                 
     251                message.phase = server.currentPhase + cast(phase_counter_t)1
    252252            } 
    253253             
     
    495495         
    496496        currentPhase++; 
     497         
     498        //debug(networking) 
     499        //  logger.info("current phase now {}", currentPhase); 
    497500    } 
    498501     
     
    577580        // Start first phase 
    578581        synchronized(phaseMutex) 
    579             startPhase(0, 100, numberSimulationSteps(100)); 
     582            startPhase(0, MIN_PHASE_LENGTH, numberSimulationSteps(MIN_PHASE_LENGTH)); 
    580583    } 
    581584     
     
    636639    // Calculates the number of simulation steps for a phase's length 
    637640    ushort numberSimulationSteps(ushort length) 
    638     { 
    639         return cast(ushort)((SIMULATION_STEPS_PER_SECOND) / (1000.0f / length)); 
    640     } 
    641  
     641    out(result) 
     642    { 
     643        //logger.info("steps: {}; length: {}", result, length); 
     644        assert(result > 0); 
     645    } 
     646    body 
     647    { 
     648        //return 1; 
     649        return cast(ushort)(SIMULATION_STEPS_PER_SECOND / (1000.0f / length)); 
     650    } 
     651 
     652    //const uint MIN_PHASE_LENGTH = 5000; 
     653    //const uint MAX_PHASE_LENGTH = 20500; 
     654     
    642655    const uint MIN_PHASE_LENGTH = 100; 
    643656    const uint MAX_PHASE_LENGTH = 1000; 
    644     const uint SIMULATION_STEPS_PER_SECOND = 50; 
     657    const uint SIMULATION_STEPS_PER_SECOND = 10; 
    645658 
    646659    void run() 
     
    660673                    int length; 
    661674                     
    662                     length = min(1000, max(MIN_PHASE_LENGTH, maxPing)); 
     675                    length = min(MAX_PHASE_LENGTH, max(MIN_PHASE_LENGTH, maxPing)); 
    663676                     
    664677                    //Trace.formatln("phase length: {}", length); 
    665                      
    666                     length = min(length, MAX_PHASE_LENGTH); 
    667678                     
    668679                    startPhase(currentPhase, length, 
  • trunk/src/defend/mp/Gateway.d

    r584 r589  
    6161    abstract void phaseDone(); 
    6262 
    63     // Try to start the next phase 
    64     abstract void startPhase(); 
     63    // Try to start the next phase, returns true if it could be started 
     64    abstract bool startPhase(); 
    6565     
    6666    /* Check, that the simulation is not out of sync with other clients. 
  • trunk/src/defend/sim/Core.d

    r588 r589  
    10161016private: 
    10171017    Logger logger; 
     1018     
     1019    // Current simulation step 
    10181020    uint _currentSimulationStep; 
    10191021 
     1022    // Player list 
    10201023    PlayerManager _players; 
    10211024 
    10221025    // The communication gateway 
    10231026    Gateway _gateway; 
     1027 
     1028    // Simulation runner 
     1029    Simulation _simulation; 
    10241030 
    10251031    // The object list 
     
    10321038    // Civs 
    10331039    Civ neutralCiv; 
    1034     Civ[player_id_t] civs; // fuuuuuck 
     1040    Civ[player_id_t] civs; 
    10351041     
    10361042    // Queueing orders 
     
    12161222    Signal!(GameObject) ObjectDead; 
    12171223 
    1218     this(Gateway g, PlayerManager _players, Simulation simulation) 
     1224    this(Gateway _gateway, PlayerManager _players, Simulation _simulation) 
    12191225    { 
    12201226        logger = Log.getLogger("sim.manager"); 
    12211227         
     1228        this._gateway = _gateway; 
    12221229        this._players = _players; 
     1230        this._simulation = _simulation; 
    12231231         
    12241232        objects.create(1024, true); 
     
    12301238 
    12311239        // Connect signals 
    1232         with(_gateway = g
     1240        with(_gateway
    12331241        { 
    12341242            CreateObject.connect(&onCreateObject); 
     
    12371245        } 
    12381246         
    1239         simulation.SimulationStep.connect(&onSimulationStep); 
     1247        _simulation.SimulationStep.connect(&onSimulationStep); 
    12401248         
    12411249        neutralCiv = typeRegister.loadCiv(this, NEUTRAL_PLAYER, "neutral"); 
     
    13821390    } 
    13831391     
     1392    Simulation simulation() 
     1393    { 
     1394        return _simulation; 
     1395    } 
     1396     
    13841397    GameObject getObject(object_id_t id) 
    13851398    out(result) 
  • trunk/src/defend/sim/Simulation.d

    r583 r589  
    11module defend.sim.Simulation; 
     2 
     3import tango.io.Stdout; 
    24 
    35import engine.core.TaskManager; 
    46import engine.util.Profiler; 
    57import engine.util.Signal; 
     8import engine.util.HardwareTimer; 
     9import engine.util.Log; 
    610 
    711import defend.mp.Phase; 
     
    1115{ 
    1216private: 
     17    Logger logger; 
     18 
    1319    Gateway gateway; 
    1420 
     
    1925    bool runningPhase; 
    2026     
     27    const interpolationFrequency = 100.0f; 
     28    float frequency = 10.0f; 
     29    float _interpolation = 0.0f; 
     30 
    2131    void update() 
    2232    { 
     
    2636            { 
    2737                assert(doneSimulationSteps == simulationSteps); 
    28                      
    29                 // Try to start the next phase 
    30                 gateway.startPhase(); 
    31                      
    32                 return; 
     38             
     39                if(!gateway.startPhase()) 
     40                    return; 
    3341            } 
    3442 
     43            //logger.spam("simulation step"); 
     44 
    3545            assert(doneSimulationSteps < simulationSteps); 
    36                 
     46             
    3747            SimulationStep(); 
    3848            doneSimulationSteps++; 
     49            _interpolation = 0; 
    3950                 
    4051            if(doneSimulationSteps == simulationSteps) 
     
    4657            } 
    4758        }); 
     59    } 
     60     
     61    void updateInterpolation() 
     62    { 
     63        if(!runningPhase) 
     64        { 
     65            gateway.startPhase(); 
     66            return; 
     67        } 
     68     
     69        _interpolation += frequency / interpolationFrequency; 
     70        if(_interpolation > 1.0f) _interpolation = 1.0f; 
    4871    } 
    4972     
     
    5982         
    6083        simulationSteps = phase.simulationSteps; 
     84         
    6185        doneSimulationSteps = 0; 
    6286        runningPhase = true; 
     
    6589        if(oldSimulationSteps != simulationSteps) 
    6690        { 
    67             final frequency = (1000 / cast(float)phase.length) * simulationSteps; 
    68          
     91            frequency = (1000 / cast(float)phase.length) * simulationSteps; 
    6992            taskManager.setTaskFrequency(&update, frequency); 
    7093        } 
     
    78101    this(Gateway g) 
    79102    { 
     103        logger = Log.getLogger("sim.runner"); 
     104     
    80105        with(gateway = g) 
    81106        { 
     
    83108        } 
    84109         
    85         taskManager.addRepeatedTask(&update, 50); 
     110        taskManager.addRepeatedTask(&update, frequency); 
     111        taskManager.addRepeatedTask(&updateInterpolation, interpolationFrequency); 
     112    } 
     113     
     114    float interpolation() 
     115    { 
     116        return _interpolation; 
    86117    } 
    87118} 
  • trunk/src/defend/sim/obj/Citizen.d

    r588 r589  
    3333            posOffset = vec3(0, 1, 0); 
    3434            scale = vec3.one; 
    35             developmentSteps = 18
     35            developmentSteps = 2
    3636            canBuild = [ "house" ]; 
    3737            properties[GameObject.Property.MaxLife] = prop_t(500); 
    3838            properties[Unit.Property.Attack]        = prop_t(10); 
    39             properties[Unit.Property.MovementSpeed] = prop_t(5); 
     39            properties[Unit.Property.MovementSpeed] = prop_t(50); 
    4040            properties[Unit.Property.AttackSpeed]   = prop_t(250); 
    4141            properties[GameObject.Property.Sight]   = prop_t(15); 
  • trunk/src/defend/sim/obj/House.d

    r583 r589  
    2323            posOffset = vec3(2, 0.2, -2.5); 
    2424            scale = vec3(0.4, 0.4, 0.4); 
    25             buildSteps = 10000; 
     25            buildSteps = 2000; 
    2626            canBuild = [ "sheep", "citizen" ];      
    2727            canDevelop = [ "sheep on drugs" ]; 
  • trunk/src/defend/sim/obj/Sheep.d

    r583 r589  
    3131            scale = vec3(0.035, 0.035, 0.035); 
    3232            normRotation = vec3(1.6, -1.6, 0); 
    33             developmentSteps = 18
     33            developmentSteps = 10
    3434            properties[GameObject.Property.MaxLife] = prop_t(500); 
    3535            properties[Unit.Property.Attack]        = prop_t(5); 
    36             properties[Unit.Property.MovementSpeed] = prop_t(10); 
     36            properties[Unit.Property.MovementSpeed] = prop_t(35); 
    3737            properties[Unit.Property.AttackSpeed]   = prop_t(50); 
    3838            properties[GameObject.Property.Sight]   = prop_t(20); 
  • trunk/src/defend/sim/obj/Unit.d

    r588 r589  
    110110    override void onOrder(GameObject[] objects, OrderMapRightClick* order) 
    111111    { 
    112      
    113112        // TODO: Group pathfinding 
    114113        iterateObjects(objects, (Unit object) 
     
    196195                   unit.property(Unit.Property.MovementSpeed)) 
    197196                { 
    198                     pause = 20
     197                    pause = 5
    199198                    path = null; 
    200                  
     199                    status = Status.Idle; 
     200 
     201                    currentRealPos = nextRealPos = realPos; 
     202 
    201203                    sceneNode.setAnimation("stand"); 
    202204                 
     
    384386    const MAX_MOVE_PERCENT = fixed.ctFromInt!(100); 
    385387     
     388    // Interpolation 
     389    vec3 currentRealPos = vec3.one; 
     390    vec3 nextRealPos = vec3.one; 
     391     
    386392    // Attacking 
    387393    GameObject target; // Attack target 
     
    400406                    bool considerObjects = false, bool isFinalGoal = true) 
    401407    { 
     408        pause = 0; 
     409     
    402410        debug(gameobjects) 
    403411            logger.trace("moving to [{}|{}] (order: {})", 
     
    529537        assert(map.getTile(mapPos).mapObject is null); 
    530538        map.getTile(mapPos).mapObject = this; 
     539 
     540        currentRealPos = realPos; 
     541        calcNextRealPos(); 
    531542    } 
    532543 
     
    541552    { 
    542553        pathPool.create(MAX_PATH_LENGTH, MAX_OBJECT_NUMBER); 
     554    } 
     555     
     556    // For interpolation 
     557    void calcNextRealPos() 
     558    { 
     559        auto percent = cast(real)((movePercent + property(Unit.Property.MovementSpeed)) / 
     560                                  MAX_MOVE_PERCENT); 
     561                                   
     562        if(percent > 1) percent = 1; 
     563         
     564        nextRealPos = lastWayPoint * (1.0 - percent) + nextWayPoint * percent; 
    543565    } 
    544566     
     
    621643        _sceneNode = new GameObjectModel(sceneGraph.root, unitInfo.model, 
    622644                                         playerColors[gameObjects.players.get(owner).info.color]); 
    623         
     645     
    624646        _realPos = terrain.getWorldPos(mapPos); 
    625647        sceneNode.translation = realPos + unitInfo.posOffset; 
     
    657679                foreach(b; path) 
    658680                { 
    659                     renderer.drawLine(terrain.getWorldPos(a) + vec3(0, 1, 0), 
    660                                       terrain.getWorldPos(b) + vec3(0, 1, 0), 
     681                    renderer.drawLine(terrain.getWorldPos(a) + vec3(0, 0.11, 0), 
     682                                      terrain.getWorldPos(b) + vec3(0, 0.11, 0), 
    661683                                      vec3(1, 0, 0)); 
    662684                     
     
    674696    override void update() 
    675697    { 
    676         // TODO: interpolate unit positions 
    677      
     698        // interpolation 
     699        if(moving && path) 
     700        { 
     701            auto interp = gameObjects.simulation.interpolation; 
     702            assert(interp <= 1.0f); 
     703             
     704            realPos = currentRealPos * (1.0 - interp) + nextRealPos * interp; 
     705        } 
     706         
    678707        sceneNode.translation = realPos + unitInfo.posOffset; 
    679708        sceneNode.rotation = direction + unitInfo.normRotation; 
     
    708737            else if(!--attackCounter) 
    709738            { 
     739                // ouch :( 
    710740                target.hurt(cast(int)cast(real)property(Property.Attack)); 
    711741                 
     
    758788             
    759789            // Calculate progress of the current tile, in percent 
    760             auto percent = cast(real)(movePercent / MAX_MOVE_PERCENT); 
    761             assert(percent >= 0.0f && percent <= 1.0f); 
    762              
    763             realPos = lastWayPoint * (1.0 - percent) + nextWayPoint * percent; 
     790            { 
     791                auto percent = cast(real)(movePercent / MAX_MOVE_PERCENT); 
     792                assert(percent >= 0.0f && percent <= 1.0f); 
     793                 
     794                currentRealPos = lastWayPoint * (1.0 - percent) + nextWayPoint * percent; 
     795                //realPos = currentRealPos; 
     796            } 
     797 
     798            // interpolation 
     799            calcNextRealPos(); 
    764800             
    765801            break; 
  • trunk/src/defend/terrain/Terrain.d

    r588 r589  
    456456                        { 
    457457                            auto pos = getWorldPos(x, y); 
    458                             renderer.drawLine(pos, pos + vec3(0, 0.5, 0), vec3(1, 0, 0)); 
     458                            renderer.drawLine(pos, pos + vec3(0, 0.1, 0), vec3(1, 0, 0)); 
    459459                        } 
    460460                    } 
  • trunk/src/engine/font/FreeType.d

    r583 r589  
    2121import engine.rend.Texture; 
    2222import engine.rend.VertexArray; 
    23 import engine.rend.PrimitiveType; 
    2423import engine.rend.opengl.Wrapper; 
    2524import engine.font.Font; 
  • trunk/src/engine/model/Mesh.d

    r583 r589  
    1212import engine.rend.IndexBuffer; 
    1313import engine.rend.Texture; 
    14 import engine.rend.PrimitiveType; 
    1514 
    1615class ModelInstance 
  • trunk/src/engine/model/Model.d

    r583 r589  
    1313import engine.rend.Texture; 
    1414import engine.rend.VertexArray; 
    15 import engine.rend.PrimitiveType; 
    1615import engine.rend.Renderer; 
    1716