Changeset 543

Show
Ignore:
Timestamp:
05/19/08 13:51:07 (8 months ago)
Author:
LeoD
Message:

fixed a bug with mouse rays being wrong at some rotation angles

Files:

Legend:

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

    r541 r543  
    195195 
    196196        position = vec3(0, 0, 0); 
     197         
    197198        rotate(vec3(-1, 0.0, 0)); 
    198199    } 
  • trunk/src/defend/game/hud/Mouse.d

    r541 r543  
    419419         
    420420        auto pt = mouse.mousePos; 
    421          
    422         //Stdout(camera.modelview()).newline; 
    423         //Stdout(camera.projection()).newline; 
    424          
    425421        auto modelview = mat4d.from(camera.modelview()); 
    426422        auto projection = mat4d.from(camera.projection()); 
     
    441437 
    442438        vec3d result = far - near; 
    443         result /= -result.z; 
    444439 
    445440        result = result.normalized(); 
  • trunk/src/defend/game/net/Server.d

    r525 r543  
    77import tango.net.ServerSocket; 
    88import tango.net.SocketConduit; 
     9import tango.util.log.Trace; 
    910import Integer = tango.text.convert.Integer; 
    1011 
     
    4546    phase_counter_t whichPhase; 
    4647 
    47     // Ping 
    48     uint pingLast = 0; 
    49     uint lastHighestPing = 0; 
     48    // Footex 
     49    Mutex mutex; 
    5050 
    5151    // Client info 
     
    6666     
    6767    // Ping info 
    68     uint pingSend = 0; 
     68    uint pingSent = 0; 
    6969    uint pingCount = 0; 
    7070    bool pingAnswer = true; 
     71     
     72    uint lastPing = 0; 
     73    uint lastHighestPing = 0; 
     74 
     75    const PING_INTERVAL = 1000; 
    7176 
    7277    // The background thread 
    7378    void update() 
    7479    { 
     80        void ping() 
     81        { 
     82            MessagePing message; 
     83            socket.send(message); 
     84             
     85            assert(pingAnswer); 
     86            pingAnswer = false; 
     87             
     88            pingSent = getTickCount(); 
     89        } 
     90     
    7591        try 
    7692        { 
     
    7995            logger.info("sending ping"); 
    8096            { 
    81                 MessagePing message; 
    82                 socket.send(message); 
     97                ping(); 
    8398            } 
    8499 
     
    102117            } 
    103118 
    104             uint lastPing = 0; 
    105119            while(!socket.stop) 
    106120            { 
    107                 if(server.gameStarted && getTickCount() - lastPing > 1000 //&& 
    108                    /*pingAnswer*/) 
     121                if(server.gameStarted && getTickCount() - pingSent > PING_INTERVAL) 
    109122                { 
    110                     if(!pingAnswer
     123                    synchronized(mutex
    111124                    { 
    112                         logger.warn("no pong in 1 second"); 
    113                          
    114                         // man, wtf 
    115                         Thread.sleep(2); 
    116                         continue; 
     125                        if(!pingAnswer) 
     126                        { 
     127                            logger.warn("pong is taking longer than 1 second"); 
     128                             
     129                            Thread.sleep(2); 
     130                            continue; 
     131                        } 
     132 
     133                        ping(); 
    117134                    } 
    118                  
    119                     //logger.trace("sending ping"); 
    120                  
    121                     MessagePing message; 
    122                     socket.send(message); 
    123  
    124                     pingAnswer = false; 
    125                     pingSend = getTickCount(); 
    126                     lastPing = getTickCount(); 
    127135                } 
    128136 
    129137                Thread.yield(); 
    130138            } 
    131              
    132             //logger.trace("thread's done for"); 
    133139        } 
    134140        catch(Exception exception) 
     
    167173    void onPong(MessagePong* message) 
    168174    { 
    169         pingLast = getTickCount() - pingSend; 
    170         pingAnswer = true; 
    171  
    172         if(!firstPong) firstPong = true; 
    173  
    174         lastHighestPing = pingLast; 
    175          
    176         /*debug(networking)*/ //if(pingCount == 0) 
    177         //  logger.info("ping: {}", pingLast); 
    178          
    179         if(++pingCount == 5) 
    180             pingCount = 0;   
     175        synchronized(mutex) 
     176        { 
     177            //Trace.formatln("(pong got called)"); 
     178         
     179            lastPing = getTickCount() - pingSent; 
     180             
     181            assert(!pingAnswer); 
     182            pingAnswer = true; 
     183 
     184            if(!firstPong) firstPong = true; 
     185 
     186            lastHighestPing = lastPing; 
     187             
     188            //logger.info("ping: {}", lastPing); 
     189        } 
    181190    } 
    182191     
     
    184193    { 
    185194        me = message.info; 
    186         logger.info("received info: {}", me.toString()); 
     195        logger.info("received info: {}", me); 
    187196 
    188197        infoReceived = true;     
     
    298307        this.cm = cm; 
    299308        this.server = server; 
     309         
     310        mutex = new Mutex; 
    300311         
    301312        syncChecks.create(2000); 
     
    638649 
    639650public: 
    640     this(GameConfig c
    641     { 
    642         config = c
     651    this(GameConfig config
     652    { 
     653        this.config = config
    643654         
    644655        logger = Log.getLogger("server"); 
  • trunk/src/defend/objects/Core.d

    r541 r543  
    13251325            { 
    13261326                // TODO: Emit a signal telling that the order isn't valid 
    1327                  
    1328                 // Why the hell does dmd append a space to T.stringof? 
    1329                 logger.trace("invalid order (T = {}), not sending", T.stringof[0 .. $ - 1]); 
     1327                logger.trace("invalid order (T = {}), not sending", T.stringof); 
    13301328            } 
    13311329        }); 
  • trunk/src/defend/objects/SceneNode.d

    r542 r543  
    9595            { 
    9696                renderer.setRenderState(RenderState.BackfaceCulling, true); 
    97              
    98                 renderer.setMatrix(camera.projection(), MatrixType.Projection); 
    99                 renderer.setMatrix(camera.modelview(), MatrixType.Modelview); 
    10097                 
    10198                auto shader = Shader.acquire("data/shaders/model.cfg"); 
     
    147144            function(NodeHolder[] nodes, Camera camera) 
    148145            { 
    149                 renderer.setMatrix(camera.projection(), MatrixType.Projection); 
    150                 renderer.setMatrix(camera.modelview(), MatrixType.Modelview); 
    151                  
    152146                renderer.setShader(null); 
    153147                renderer.setTexture(0, null); 
     
    198192         
    199193        renderer.setTexture(0, texture); 
    200         //Stdout("setting ")(texture.file).newline; 
    201194         
    202195        shader.setUniform("color", parent.color); 
     
    231224        renderer.pushMatrix(); 
    232225        renderer.mulMatrix(absoluteModelview); 
    233  
    234         debug 
    235         { 
    236             if(sceneGraph.debugNodeVisible(this)) 
    237                 renderer.drawBoundingBox(mesh.boundingBox, vec3(1, 0, 1)); 
    238         } 
    239          
     226        renderer.drawBoundingBox(mesh.boundingBox, vec3(1, 0, 1)); 
    240227        renderer.popMatrix(); 
    241228    } 
  • trunk/src/gen/math/Ray.d

    r542 r543  
    11module gen.math.Ray; 
     2 
     3import tango.io.Stdout; 
    24 
    35import tango.math.Math; 
     
    101103        if(direction == Vec3!(T).zero) 
    102104            return false; 
    103      
     105        
    104106        with(bbox) 
    105107        { 
    106108            auto maxT = Vec3!(T)(-1, -1, -1); 
    107             auto div = 1 / direction; 
     109            auto div = 1.0f / direction; 
    108110            bool inside = true; 
    109111             
     
    138140                if(i != index) 
    139141                { 
    140                     float temp = getVectorField(origin, i) + getVectorField(maxT, index) * getVectorField(direction, i); 
     142                    float temp = getVectorField(origin, i) + 
     143                                 getVectorField(maxT, index) * getVectorField(direction, i); 
    141144                     
    142                     if(temp < getVectorField(min, i) - Epsilon!(T) || temp > getVectorField(max, i) + Epsilon!(T)) 
     145                    if(temp < getVectorField(min, i) - Epsilon!(T) || 
     146                       temp > getVectorField(max, i) + Epsilon!(T)) 
    143147                        return false; 
    144148                } 
  • trunk/src/gen/math/Vector.d

    r541 r543  
    2020T.flt getVectorField(T)(T vector, uint index) 
    2121{ 
    22     if(index == 0) return vector.x; 
    23     if(index == 1) return vector.y; 
    24     if(index == 2) return vector.z; 
    25      
    26     assert(false); 
    27 
    28  
    29 void setVectorField(T, U)(ref T vector, uint index, U value) 
    30 
    31     if(index == 0) vector.x = value; 
    32     else if(index == 1) vector.y = value; 
    33     else if(index == 2) vector.z = value; 
    34     else assert(false); 
     22    assert(index < T.dim); 
     23    return vector.ptr[index]; 
     24
     25 
     26U setVectorField(T, U)(ref T vector, uint index, U value) 
     27
     28    assert(index < T.dim); 
     29    return vector.ptr[index] = value; 
    3530} 
    3631 
  • trunk/src/gen/model/ModelObj.d

    r541 r543  
    178178 
    179179            char[][] parts = split(line, " "); 
    180             vec3 floats
     180            vec3 floats = vec3.zero
    181181             
    182182            char[] desc = descriptor(line); 
  • trunk/src/gen/net/tcp/Socket.d

    r524 r543  
    7171        scope stream = new ArrayReader(data); 
    7272         
    73         //static if(messageBehaviour == MessageBehaviour.Queue) 
    74         //  Trace.formatln("message of type {}, length {}", T.stringof, data.length); 
    75          
    7673        T message; 
    7774        unserialize(message, stream); 
    7875         
    79         //static if(messageBehaviour == MessageBehaviour.Queue) 
    80         //  Trace.formatln("unserialized"); 
     76        auto name = getMessageTypeName(T.type); 
     77 
     78        //if(name == "MessagePing" && messageBehaviour == MessageBehaviour.Queue) 
     79        //  Trace.formatln("client: PING received"); 
     80        //else if(name == "MessagePong" && messageBehaviour == MessageBehaviour.Immediately) 
     81        //  Trace.formatln("server: PONG received"); 
    8182         
    8283        messageHandlers[T.type](&message); 
     
    176177                 
    177178                // debug 
    178                 //auto name = getMessageTypeName(*(cast(message_type_t*)message.data[0 .. message_type_t.sizeof])); 
    179                  
    180                 //if(name == "MessagePing " || name == "MessagePong ") 
    181                 //  logger.trace("=> {}", name); 
     179                auto name = getMessageTypeName(*(cast(message_type_t*)message.data[0 .. 
     180                                                                                   message_type_t.sizeof])); 
     181                 
     182                //if(name == "MessagePing" && messageBehaviour == MessageBehaviour.Immediately) 
     183                //  Trace.formatln("server: PING sent"); 
     184                //else if(name == "MessagePong" && messageBehaviour == MessageBehaviour.Queue) 
     185                //  Trace.formatln("client: PONG sent"); 
    182186                 
    183187                //logger.trace("REMAIN: {}", writeQueue.length); 
     
    241245            auto message = messagePool.allocate(); 
    242246             
     247            if(message.dataBuffer.length < data.length) 
     248                message.dataBuffer.realloc(data.length); 
     249             
    243250            message.dataBuffer[0 .. data.length] = data[]; 
    244251            message.data = message.dataBuffer[0 .. data.length]; 
  • trunk/src/gen/scene/Graph.d

    r542 r543  
    171171            function(NodeHolder[], Camera camera) // Setup function 
    172172            { 
    173                 renderer.setRenderState(RenderState.ZWrite, false); 
     173                renderer.pushMatrix(); 
    174174                renderer.identity(); 
    175175                renderer.translate(camera.position()); 
     
    181181            function // Clean function 
    182182            { 
     183                renderer.popMatrix(); 
     184             
    183185                renderer.setRenderState(RenderState.ZWrite, true); 
    184186                renderer.setRenderState(RenderState.DepthTest, true); 
     
    193195             
    194196            function(NodeHolder[] nodes, Camera camera) 
    195             { 
    196                 renderer.setMatrix(camera.projection(), MatrixType.Projection); 
    197                 renderer.setMatrix(camera.modelview(), MatrixType.Modelview); 
    198                  
     197            {                
    199198                // Solid objects are sorted by their texture 
    200199                nodes.quickSort((NodeHolder first, NodeHolder second) 
     
    219218            function(NodeHolder[] nodes, Camera camera) 
    220219            { 
    221                 renderer.setMatrix(camera.projection(), MatrixType.Projection); 
    222                 renderer.setMatrix(camera.modelview(), MatrixType.Modelview);            
     220         
    223221            }, 
    224222             
     
    239237                renderer.setRenderState(RenderState.ZWrite, false); 
    240238                //renderer.setRenderState(RenderState.DepthTest, false); 
    241              
    242                 renderer.setMatrix(camera.projection(), MatrixType.Projection); 
    243                 renderer.setMatrix(camera.modelview(), MatrixType.Modelview);    
    244239                 
    245240                // Blended objects are sorted by their distance from the camera 
     
    405400                root.doProcess(camera); 
    406401            }); 
     402 
     403            // Set the current camera's matrices 
     404            renderer.setMatrix(camera.projection(), MatrixType.Projection); 
     405            renderer.setMatrix(camera.modelview(), MatrixType.Modelview); 
    407406 
    408407            // Go through all render passes 
  • trunk/src/xf/omg/core/LinearAlgebra.d

    r542 r543  
    960960         
    961961        static if (4 == rows) { 
    962             /*  Mat4 projection(T aspect, T fov, T near, T far) 
    963         { 
    964             T f = 1.0f / tan(fov / 2); 
    965  
    966             return Mat4(f / aspect, 0, 0, 0, 
    967                         0, f, 0, 0, 
    968                         0, 0, (far + near) / (near - far), -1, 
    969                         0, 0, 2.0f * near * far / (near - far), 0); 
    970         }*/ 
    971  
    972          
    973962            static Matrix perspective(real fov, real aspect, real near, real far) { 
    974963                assert (fov <>= 0 && aspect <>= 0 && near <>= 0 && far <>= 0);