// This goes in game.cpp void prepareBarrierRenderingGeometry2(Game *game) { GridDatabase *gb = game->getGridDatabase(); Vector barriers; // Put all barriers into easy list. for(S32 i = 0; i < game->mGameObjects.size(); i++) { Barrier *barrier = dynamic_cast(game->mGameObjects[i]); if(barrier) { barriers.push_back(barrier); } } if(barriers.size() == 0) return; Point p1; Point p2; S32 cur1 = 0; Barrier * barrierPrev = NULL; Barrier * barrierCur; barrierCur = barriers[0]; p1 = barrierCur->mPoints.last(); p2 = barrierCur->mPoints[0]; for(S32 loop=10000; loop>0 && barrierCur != NULL; loop--) { Point closestPoint; F32 closestDist = F32_MAX; S32 closestNumber = -1; Barrier *closestBarrier; Vector objects; gb->findObjects(BarrierType, objects, Rect(p1,p2)); for(S32 i=0; i(objects[i]); Point cp2 = barrier2->mPoints.last(); if(barrier2 != barrierCur && barrier2 != barrierPrev) // Don't check self.. for(S32 j=0; jmPoints.size(); j++) { Point intersection; if(findIntersection(p1,p2,barrier2->mPoints[j],cp2,intersection)) { F32 newDist = p1.distSquared(intersection); if(newDist < closestDist && newDist > 0.0f) // avoid points on top of each other { closestDist = newDist; closestPoint = intersection; closestBarrier = barrier2; closestNumber = j; } } cp2 = barrier2->mPoints[j]; } } barrierPrev = barrierCur; barrierCur->mRenderLineSegments.push_back(p1); if(closestNumber != -1) { barrierCur->mRenderLineSegments.push_back(closestPoint); barrierCur = closestBarrier; p1 = closestPoint; cur1 = closestNumber; //curDir = -curDir; //if(curDir < 0) //cur1++; } else { barrierCur->mRenderLineSegments.push_back(p2); p1 = p2; cur1++; if(cur1 >= barrierCur->mPoints.size()) cur1 = 0; } p2 = barrierCur->mPoints[cur1]; for(S32 j=0; jmRenderLineSegments.size(); j += 2) { if(p1 == barrierCur->mRenderLineSegments[j]) { barrierCur = NULL; for(S32 k=0; kmRenderLineSegments.size() == 0) { barrierCur = barriers[k]; barrierPrev = NULL; cur1 = 0; p1 = barrierCur->mPoints.last(); p2 = barrierCur->mPoints[0]; break; } } break; } } } } // Client only void ClientGame::prepareBarrierRenderingGeometry() { prepareBarrierRenderingGeometry2(this); return; }