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