Revision: 1745
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1745&view=rev
Author:   rorthomas
Date:     2011-03-08 10:50:25 +0000 (Tue, 08 Mar 2011)

Log Message:
-----------
fixed #647

Modified Paths:
--------------
    trunk/source/main/gameplay/Replay.cpp
    trunk/source/main/gameplay/Replay.h
    trunk/source/main/physics/Beam.cpp
    trunk/source/main/physics/BeamForcesEuler.cpp

Modified: trunk/source/main/gameplay/Replay.cpp
===================================================================
--- trunk/source/main/gameplay/Replay.cpp       2011-03-08 10:35:15 UTC (rev 
1744)
+++ trunk/source/main/gameplay/Replay.cpp       2011-03-08 10:50:25 UTC (rev 
1745)
@@ -41,6 +41,8 @@
        beams = 0;
        times = 0;
 
+       outOfMemory = false;
+
        unsigned long bsize = (numNodes * numFrames * sizeof(node_simple_t) + 
numBeams * numFrames * sizeof(beam_simple_t) + numFrames * sizeof(unsigned 
long)) / 1024.0f;
        LOG("replay buffer size: " + TOSTRING(bsize) + " kB");
 
@@ -83,12 +85,31 @@
 
 void *Replay::getWriteBuffer(int type)
 {
+       if(outOfMemory) return 0;
        if(!nodes)
        {
                // get memory
                nodes = (node_simple_t*)calloc(numNodes * numFrames, 
sizeof(node_simple_t));
+               if(!nodes)
+               {
+                       outOfMemory=true;
+                       return 0;
+               }
                beams = (beam_simple_t*)calloc(numBeams * numFrames, 
sizeof(beam_simple_t));    
+               if(!beams)
+               {
+                       free(nodes); nodes=0;
+                       outOfMemory=true;
+                       return 0;
+               }
                times = (unsigned long*)calloc(numFrames, sizeof(unsigned 
long));
+               if(!times)
+               {
+                       free(nodes); nodes=0;
+                       free(beams); beams=0;
+                       outOfMemory=true;
+                       return 0;
+               }
        }
        void *ptr = 0;
        times[writeIndex] = replayTimer->getMicroseconds();
@@ -106,6 +127,7 @@
 
 void Replay::writeDone()
 {
+       if(outOfMemory) return;
        writeIndex++;
        if(writeIndex == numFrames)
        {
@@ -135,6 +157,8 @@
        curOffset = offset;
        updateGUI();
        
+       if(outOfMemory) return 0;
+
        // return buffer pointer
        if(type == 0)
                return (void *)(nodes + delta * numNodes);
@@ -146,12 +170,18 @@
 void Replay::updateGUI()
 {
 #ifdef USE_MYGUI 
-       char tmp[128]="";
-       unsigned long t = curFrameTime;
-       sprintf(tmp, "Position: %0.6f s, frame %i / %i", ((float)t)/1000000.0f, 
curOffset, numFrames);
-       txt->setCaption(String(tmp));
-       //LOG(">>>2>"+TOSTRING(times[writeIndex]) + " /3> 
"+TOSTRING(curFrameTime));
-       pr->setProgressPosition(abs(curOffset));
+       if(outOfMemory)
+       {
+               txt->setCaption("Out of Memory");
+               pr->setProgressPosition(0);
+       } else
+       {
+               char tmp[128]="";
+               unsigned long t = curFrameTime;
+               sprintf(tmp, "Position: %0.6f s, frame %i / %i", 
((float)t)/1000000.0f, curOffset, numFrames);
+               txt->setCaption(String(tmp));
+               pr->setProgressPosition(abs(curOffset));
+       }
 #endif // MYGUI
 }
 

Modified: trunk/source/main/gameplay/Replay.h
===================================================================
--- trunk/source/main/gameplay/Replay.h 2011-03-08 10:35:15 UTC (rev 1744)
+++ trunk/source/main/gameplay/Replay.h 2011-03-08 10:50:25 UTC (rev 1745)
@@ -55,11 +55,13 @@
        void setVisible(bool value);
        bool getVisible();
 
+       bool isValid() { return !outOfMemory; };
 protected:
        Ogre::Timer *replayTimer;
        int numNodes;
        int numBeams;
        int numFrames;
+       bool outOfMemory;
 
 
        int writeIndex;

Modified: trunk/source/main/physics/Beam.cpp
===================================================================
--- trunk/source/main/physics/Beam.cpp  2011-03-08 10:35:15 UTC (rev 1744)
+++ trunk/source/main/physics/Beam.cpp  2011-03-08 10:50:25 UTC (rev 1745)
@@ -1920,7 +1920,7 @@
        fasted=1;
        slowed=1;
        stabsleep-=dt;
-       if (replaymode && replay)
+       if (replaymode && replay && replay->isValid())
        {
                // no replay update needed if position was not changed
                if(replaypos != oldreplaypos)
@@ -1928,27 +1928,30 @@
                        unsigned long time=0;
                        //replay update
                        node_simple_t *nbuff = (node_simple_t 
*)replay->getReadBuffer(replaypos, 0, time);
-                       Vector3 pos = Vector3::ZERO;
-                       for (i=0; i<free_node; i++)
+                       if(nbuff)
                        {
-                               nodes[i].AbsPosition = nbuff[i].pos;
-                               nodes[i].RelPosition = nbuff[i].pos - origin;
-                               nodes[i].smoothpos = nbuff[i].pos;
-                               pos = pos + nbuff[i].pos;
-                       }
-                       updateSlideNodePositions();
+                               Vector3 pos = Vector3::ZERO;
+                               for (i=0; i<free_node; i++)
+                               {
+                                       nodes[i].AbsPosition = nbuff[i].pos;
+                                       nodes[i].RelPosition = nbuff[i].pos - 
origin;
+                                       nodes[i].smoothpos = nbuff[i].pos;
+                                       pos = pos + nbuff[i].pos;
+                               }
+                               updateSlideNodePositions();
 
-                       position=pos/(float)(free_node);
-                       // now beams
-                       beam_simple_t *bbuff = (beam_simple_t 
*)replay->getReadBuffer(replaypos, 1, time);
-                       for (i=0; i<free_beam; i++)
-                       {
-                               beams[i].scale = bbuff[i].scale;
-                               beams[i].broken = bbuff[i].broken;
-                               beams[i].disabled = bbuff[i].disabled;
+                               position=pos/(float)(free_node);
+                               // now beams
+                               beam_simple_t *bbuff = (beam_simple_t 
*)replay->getReadBuffer(replaypos, 1, time);
+                               for (i=0; i<free_beam; i++)
+                               {
+                                       beams[i].scale = bbuff[i].scale;
+                                       beams[i].broken = bbuff[i].broken;
+                                       beams[i].disabled = bbuff[i].disabled;
+                               }
+                               //LOG("replay: " + TOSTRING(time));
+                               oldreplaypos = replaypos;
                        }
-                       //LOG("replay: " + TOSTRING(time));
-                       oldreplaypos = replaypos;
                }
        }
        else
@@ -4561,7 +4564,8 @@
 
 void Beam::setReplayMode(bool rm)
 {
-       if (!replay) return;
+       if (!replay || !replay->isValid()) return;
+
        if (replaymode && !rm)
        {
                replaypos=0;

Modified: trunk/source/main/physics/BeamForcesEuler.cpp
===================================================================
--- trunk/source/main/physics/BeamForcesEuler.cpp       2011-03-08 10:35:15 UTC 
(rev 1744)
+++ trunk/source/main/physics/BeamForcesEuler.cpp       2011-03-08 10:50:25 UTC 
(rev 1745)
@@ -1870,27 +1870,30 @@
        BES_START(BES_CORE_Replay);
 
        //we also store a new replay frame
-       if(replay)
+       if(replay && replay->isValid())
        {
                replayTimer += dt;
                if(replayTimer > replayPrecision)
                {
                        // store nodes
                        node_simple_t *nbuff = (node_simple_t 
*)replay->getWriteBuffer(0);
-                       for (i=0; i<free_node; i++)
-                               nbuff[i].pos = nodes[i].AbsPosition;
+                       if(nbuff)
+                       {
+                               for (i=0; i<free_node; i++)
+                                       nbuff[i].pos = nodes[i].AbsPosition;
 
-                       // store beams
-                       beam_simple_t *bbuff = (beam_simple_t 
*)replay->getWriteBuffer(1);
-                       for (i=0; i<free_beam; i++)
-                       {
-                               bbuff[i].scale = beams[i].scale;
-                               bbuff[i].broken = beams[i].broken;
-                               bbuff[i].disabled = beams[i].disabled;
+                               // store beams
+                               beam_simple_t *bbuff = (beam_simple_t 
*)replay->getWriteBuffer(1);
+                               for (i=0; i<free_beam; i++)
+                               {
+                                       bbuff[i].scale = beams[i].scale;
+                                       bbuff[i].broken = beams[i].broken;
+                                       bbuff[i].disabled = beams[i].disabled;
+                               }
+
+                               replay->writeDone();
+                               replayTimer = 0.0f;
                        }
-
-                       replay->writeDone();
-                       replayTimer = 0.0f;
                }
        }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
What You Don't Know About Data Connectivity CAN Hurt You
This paper provides an overview of data connectivity, details
its effect on application quality, and explores various alternative
solutions. http://p.sf.net/sfu/progress-d2d
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to