Mercurial > hg > wabletios
changeset 4:79c7cf39a0a0
Fixed new mesh crash - static array bounds.
Made home made mutex for wavetable access. Less clicks?
author | Robert Tubb <rt300@eecs.qmul.ac.uk> |
---|---|
date | Mon, 10 Dec 2012 13:00:03 +0000 |
parents | d346ddc50f70 |
children | 085d80989ba7 |
files | lump.h lump.mm mesh.h mesh.mm scanpath.mm testApp.mm |
diffstat | 6 files changed, 149 insertions(+), 136 deletions(-) [+] |
line wrap: on
line diff
--- a/lump.h Fri Dec 07 19:20:57 2012 +0000 +++ b/lump.h Mon Dec 10 13:00:03 2012 +0000 @@ -18,22 +18,23 @@ private: double mass, inverseMass; bool grabbed, highlighted; - const int maxSprings; - + TwoVector velocity; TwoVector accel; double friction; public: bool constrained; - Spring** attachedSprings; // pointers to all attached springs + vector<Spring*> attachedSprings; // pointers to all attached springs int numAttachedSprings; enum ConstrainMode {NOT_CONSTRAINED,CONSTRAIN_X,CONSTRAIN_Y,CONSTRAIN_XY}; ConstrainMode constrainMode; bool isInScanPath; - + bool isScanPathEnd; + bool isScanPathStart; + TwoVector position; TwoVector previousPosition; double totalForceMag;
--- a/lump.mm Fri Dec 07 19:20:57 2012 +0000 +++ b/lump.mm Mon Dec 10 13:00:03 2012 +0000 @@ -16,7 +16,7 @@ //int Lump::numLumps = 0; //-------------------------------------------------------------- // default constr -Lump::Lump() : maxSprings(100){ +Lump::Lump(){ //cout << "constructing a default lump" << endl; mass = 10.0; inverseMass = 1.0/mass; // not needed - used csquared for force @@ -34,45 +34,40 @@ totalForceMag = 0.0; size = 3; //sqrt(mass/3.0); isInScanPath = false; + isScanPathStart = false; + isScanPathEnd = false; + previousPosition.setCoord(0.5,0.5); zeroRefPos.setCoord(0.0,0.0); constrainMode = NOT_CONSTRAINED; - - attachedSprings = new Spring*[maxSprings]; + grabID = -1; - //myIndex = Lump::numLumps++; - //cout << numAttachedSprings << endl; } //-------------------------------------------------------------- // arg constructor -Lump::Lump(double aMass,double aFriction, double positionX, double positionY) : maxSprings(100){ +Lump::Lump(double aMass,double aFriction, double positionX, double positionY){ // set members } //-------------------------------------------------------------- Lump::~Lump(){ - - delete [] attachedSprings; + } //-------------------------------------------------------------- void Lump::attachSpring(Spring* aSpring){ - // stick pointer in array - if(numAttachedSprings < maxSprings){ - attachedSprings[numAttachedSprings] = aSpring; - numAttachedSprings++; - }else{ - cout << "cant attach another spring as mass already has " << maxSprings << endl; - return; - } + + attachedSprings.push_back(aSpring); + numAttachedSprings++; + } //-------------------------------------------------------------- Spring * Lump::checkConnectedTo(Lump * otherLump){ // loop thru all attached springs looking at other end - for(int i = 0; i<numAttachedSprings; i++){ + for(int i = 0; i<attachedSprings.size(); i++){ if(attachedSprings[i]->getLumpOnOtherEnd(this) == otherLump){ return attachedSprings[i]; } @@ -122,7 +117,18 @@ int xpos = position.x * ofGetHeight() + globalUI.borderSize; int ypos = position.y * ofGetHeight(); ofEllipse(xpos,ypos, 6, 6); - + if(isScanPathEnd){ + ofSetColor(255, 255, 0); + ofNoFill(); + ofCircle(xpos, ypos, 6.0); + ofFill(); + } + if(isScanPathStart){ + ofSetColor(0, 255, 255); + ofNoFill(); + ofCircle(xpos, ypos, 7.0); + ofFill(); + } // code to display restpos and displacement /* ofSetColor(0, 0, 0); @@ -141,7 +147,10 @@ int ypos = position.y * ofGetHeight(); ofEllipse(xpos,ypos, 2, 2); }else if (constrained){ - ofSetColor(200,23,23); + ofSetColor(200,5,5); + int xpos = position.x * ofGetHeight() + globalUI.borderSize; + int ypos = position.y * ofGetHeight(); + ofEllipse(xpos,ypos, 2, 2); }else{ // dont draw 'normal ' lumps return; @@ -166,7 +175,7 @@ TwoVector totalForce(0.0,0.0); // sum up force from each attached spring - for(int i = 0;i<numAttachedSprings; i++){ + for(int i = 0;i<attachedSprings.size(); i++){ springForce = (attachedSprings[i])->getForce(this); @@ -260,14 +269,14 @@ if (constrained || grabbed) return; double avx = 0.0, avy = 0.0; // average the position of all the attached lumps - for(int i = 0;i<numAttachedSprings; i++){ + for(int i = 0;i<attachedSprings.size(); i++){ Lump* otherLump = attachedSprings[i]->getLumpOnOtherEnd(this); avx += otherLump->position.x; avy += otherLump->position.y; } - avx /= numAttachedSprings; - avy /= numAttachedSprings; + avx /= attachedSprings.size(); + avy /= attachedSprings.size(); // mix in the average with the 'real' position.x = (1 - amt)*position.x + amt*avx; @@ -281,14 +290,14 @@ //TODO what if edges unconstrained? this is why filtered unconstrained just ends up as a line... // average the position of all the attached lumps - for(int i = 0;i<numAttachedSprings; i++){ + for(int i = 0;i<attachedSprings.size(); i++){ Lump* otherLump = attachedSprings[i]->getLumpOnOtherEnd(this); av.x += otherLump->position.x; av.y += otherLump->position.y; } - av.x /= numAttachedSprings; - av.y /= numAttachedSprings; + av.x /= attachedSprings.size(); + av.y /= attachedSprings.size(); return av;
--- a/mesh.h Fri Dec 07 19:20:57 2012 +0000 +++ b/mesh.h Mon Dec 10 13:00:03 2012 +0000 @@ -31,8 +31,8 @@ int numLumps; int numSprings; - Lump *lumps; - + //Lump *lumps; + vector<Lump> lumps; vector<Spring> springs; //Spring *springs;
--- a/mesh.mm Fri Dec 07 19:20:57 2012 +0000 +++ b/mesh.mm Mon Dec 10 13:00:03 2012 +0000 @@ -42,9 +42,8 @@ Mesh::~Mesh(){ cout << "destroying mesh" << endl; - delete [] lumps; - //delete scanPath; + } /////////// // interface (called from testApp) @@ -59,13 +58,13 @@ static int updown = 0; updown++; if(updown > 24){ - for(int i=0;i<numLumps;i++){ + for(int i=0;i<lumps.size();i++){ lumps[i].position.y = 0.4; } }else{ - for(int i=0;i<numLumps;i++){ + for(int i=0;i<lumps.size();i++){ lumps[i].position.y = 0.6; } @@ -83,18 +82,18 @@ globalForces.update(); // calculate all the forces in the springs - for(int i=0;i<numSprings;i++){ + for(int i=0;i<springs.size();i++){ springs[i].calculateForce(); } // accelerate the lumps - for(int i=0;i<numLumps;i++){ + for(int i=0;i<lumps.size();i++){ lumps[i].applyForce(); } // move filters into apply force? not really, they're not forces. // apply homing filter - for(int i=0;i<numLumps;i++){ + for(int i=0;i<lumps.size();i++){ lumps[i].homingFilter(globalForces.homingAmt); } // apply averaging filter @@ -112,13 +111,14 @@ //-------------------------------------------------------------- void Mesh::averagingFilter(double amt){ // we need a temporary store for average position, can't update in place with central diffs - static TwoVector * avLumpPos = new TwoVector[numLumps]; + vector<TwoVector> avLumpPos = vector<TwoVector>(lumps.size()); - for(int i=0;i<numLumps;i++){ + + for(int i=0;i<lumps.size();i++){ avLumpPos[i] = lumps[i].averageOfConnected(); } - // now we can set pos - for(int i=0;i<numLumps;i++){ + // now we can set pos. needs to be separate loop because we don't want to average *moved* lumps + for(int i=0;i<lumps.size();i++){ // mix in the average with the 'real' lumps[i].position.x = (1 - amt)*lumps[i].position.x + amt*avLumpPos[i].x; @@ -137,7 +137,7 @@ springs[i].draw(); } - for(i=0;i<numLumps;i++){ + for(i=0;i<lumps.size();i++){ lumps[i].draw(); } @@ -150,13 +150,13 @@ // calculates average of all lump positions double x = 0, y = 0; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ x += lumps[i].position.x; y += lumps[i].position.y; } - x = x/numLumps; - y = y/numLumps; + x = x/lumps.size(); + y = y/lumps.size(); //cout << "centre : " << x << "," << y << endl; @@ -185,7 +185,7 @@ } //-------------------------------------------------------------- void Mesh::resetVelocities(){ - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setVelocity(0.0,0.0); } @@ -221,10 +221,10 @@ void Mesh::toggleSyrup(bool on){ if (!on){ syrup = false; - for(int i=0;i<numLumps;i++) lumps[i].setFriction(0.998); + for(int i=0;i<lumps.size();i++) lumps[i].setFriction(0.998); }else{ syrup = true; - for(int i=0;i<numLumps;i++) lumps[i].setFriction(0.90); + for(int i=0;i<lumps.size();i++) lumps[i].setFriction(0.90); } } //---------------------------------------------------------------- @@ -260,7 +260,7 @@ //-------------------------------------------------------------- void Mesh::unconstrain(){ - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ lumps[i].unconstrain(); @@ -273,7 +273,7 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -300,7 +300,7 @@ //-------------------------------------------------------------- void Mesh::setZeroAudioLine(){ // set zero rest pos to where they are now - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ lumps[i].setZeroRefPos(); @@ -310,7 +310,7 @@ void Mesh::setPropagationSpeed(double aSpeed){ propagationSpeed = aSpeed; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setInvMass(propagationSpeed*propagationSpeed); // inverse mass is c^2 } } @@ -318,7 +318,7 @@ void Mesh::increasePropagationSpeed(){ propagationSpeed = propagationSpeed + 0.01; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setInvMass(propagationSpeed*propagationSpeed); // inverse mass is c^2 } cout << "prop speed = " << propagationSpeed << endl; @@ -327,7 +327,7 @@ void Mesh::decreasePropagationSpeed(){ propagationSpeed = propagationSpeed - 0.01; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setInvMass(propagationSpeed*propagationSpeed); // inverse mass is c^2 } cout << "prop speed = " << propagationSpeed << endl; @@ -353,14 +353,14 @@ } cout << "k/m = " << k/m << endl; double im = 1/aM; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setInvMass(im); } } //-------------------------------------------------------------- void Mesh::setFriction(double newF){ f = newF; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setFriction(f); } } @@ -369,8 +369,8 @@ // use m as bass and add asym linearly across mesh. might be wierd for some meshes! double newm,incr; newm = m; - incr = aAsym*m/(numLumps-1); - for(int i = 0; i < numLumps; i++){ + incr = aAsym*m/(lumps.size()-1); + for(int i = 0; i < lumps.size(); i++){ lumps[i].setInvMass(1/newm); newm += incr; } @@ -398,8 +398,8 @@ // multiplying it doesn't make sense! double newF,incr; newF = f; - incr = aAsym*f/(numLumps-1); - for(int i = 0; i < numLumps; i++){ + incr = aAsym*f/(lumps.size()-1); + for(int i = 0; i < lumps.size(); i++){ lumps[i].setFriction(newF); newF += incr; } @@ -409,7 +409,7 @@ TwoVector diff; bool found = false; // check if lump is within grab range - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); //cout << "diff " << diff.x << "," << diff.y << endl; if (diff.norm() < GRAB_RANGE){ @@ -446,7 +446,7 @@ //-------------------------------------------------------------- void Mesh::unGrab(int touchID){ - for(int i=0; i<numLumps;i++){ + for(int i=0; i<lumps.size();i++){ if(lumps[i].grabID == touchID){ // only release the lumps that were grabbed by this finger lumps[i].unGrab(); lumps[i].unhighlight(); @@ -457,7 +457,7 @@ //-------------------------------------------------------------- void Mesh::drag(double ax, double ay, int touchID){ // maybe set up specific id's for grabbed lumps - for(int i=0; i<numLumps;i++){ + for(int i=0; i<lumps.size();i++){ if(lumps[i].grabID == touchID){// only move the lumps that were grabbed by this finger lumps[i].drag(ax,ay,touchID); @@ -506,7 +506,7 @@ double distance = 1.0; double minDistance = 1.0; - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); distance = diff.norm(); if(distance < minDistance && !lumps[i].constrained){ // don't grab if constrained ?? @@ -538,13 +538,14 @@ targetLump = getNearestLump(ax,ay); // target is the one closest to touch point, prev is last point already on our path - while(!foundPath && count < 2048){ + while(!foundPath && count < 10000){ count++; if(prevLump == -1){ // (scanPath.howManyElements() == 0){ // //first lump foundPath = true; prevLump = targetLump; //cout << "first lump" << endl; + lumps[targetLump].isScanPathStart = true; return targetLump; } // check if this lump connected to last lump by a spring @@ -587,6 +588,10 @@ // get pointer to lump and spring scanPath.addElement(&lumps[targetLump], connectedToPrev); + + // indicate end + lumps[prevLump].isScanPathEnd = false; + lumps[targetLump].isScanPathEnd = true; // and set prev lump to that one prevLump = targetLump; foundPath = true; @@ -618,7 +623,7 @@ case GlobalForces::SINE: // applies a sine wave to all lumps, x and y - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ if(!lumps[i].constrained){ lumps[i].position.y = lumps[i].zeroRefPos.y + impactStrength*sin(PI* (2*(xamt-1) + 1) * lumps[i].position.x); lumps[i].position.x = lumps[i].zeroRefPos.x + impactStrength*sin(PI* (2*(yamt-1) + 1) * lumps[i].position.y); @@ -628,7 +633,7 @@ break; case GlobalForces::GAUSS: // temporarily not a gauss... - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ diff.setCoord(lumps[i].position.x - dax, lumps[i].position.y - day); distance = diff.norm(); if(distance < radius){ @@ -640,7 +645,7 @@ break; case GlobalForces::NOISE: // 2D noise - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].position.x += impactStrength*rand(); lumps[i].position.y += impactStrength*rand(); @@ -660,7 +665,7 @@ // applies a sine wave to all lumps, x and y if(radial){ // distance from centre is tweaked - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ if(!lumps[i].constrained ){ //&& lumps[i].isInScanPath // lots of sins and tans - might be simplifiable? @@ -676,7 +681,7 @@ } } }else{ - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ if(!lumps[i].constrained){ lumps[i].position.y = lumps[i].zeroRefPos.y + globalForces.touchStrength/256.0*sin(PI* (2*(aharm-1) + 1) * lumps[i].position.x); lumps[i].position.x = lumps[i].zeroRefPos.x + globalForces.touchStrength/256.0*sin(PI* (2*(aharm2-1) + 1) * lumps[i].position.y); @@ -770,7 +775,8 @@ // horz // vert // criss cross numSprings = (width-1)*height + (height-1)*width + 2*(height-1)*(width-1); - lumps = new Lump[numLumps]; + //lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); cout << "made " << numLumps << " lumps\n"; // one by one @@ -787,7 +793,7 @@ // set positions for(int row = 0; row < height; row++){ // go down column for(int col = 0;col < width; col++){ // go along row - if(i >= numLumps){ + if(i >= lumps.size()){ cout << " setLumpPosisions index error!\n"; } lumps[i].setPosition(hspacing*col,vspacing*row); @@ -811,7 +817,7 @@ if(springnum >= numSprings){ cout << " makeConnections index error!\n"; } - if(lumpnum >= numLumps){ + if(lumpnum >= lumps.size()){ cout << " makeConnections index error!\n"; } connect(springnum,lumpnum); @@ -830,7 +836,7 @@ if(springnum >= numSprings){ cout << " makeConnections index error!\n"; } - if(lumpnum >= numLumps){ + if(lumpnum >= lumps.size()){ cout << " makeConnections index error!\n"; } connect(springnum,lumpnum); @@ -848,7 +854,7 @@ if(springnum >= numSprings){ cout << " makeConnections index error!\n"; } - if(lumpnum >= numLumps){ + if(lumpnum >= lumps.size()){ cout << " makeConnections index error!\n"; } connect(springnum,lumpnum+1); @@ -866,7 +872,7 @@ if(springnum >= numSprings){ cout << " makeConnections index error!\n"; } - if(lumpnum >= numLumps){ + if(lumpnum >= lumps.size()){ cout << " makeConnections index error!\n"; } connect(springnum,lumpnum-1); @@ -886,12 +892,12 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); if (diff.norm() < GRAB_RANGE){ - if(i >= numLumps){ + if(i >= lumps.size()){ cout << "constrain index error\n"; } lumps[i].constrain(); @@ -903,7 +909,7 @@ for(int row = 0; row < height; row++){ // go down column for(int col = 0;col < width; col++){ // go along row if(row == 0 || row == height-1 || col == 0 || col == width-1){ - if(i >= numLumps){ + if(i >= lumps.size()){ cout << "constrain index error\n"; } lumps[i].constrain(); @@ -917,12 +923,12 @@ for(int row = 0; row < height; row++){ // go down column for(int col = 0;col < width; col++){ // go along row if(row == 0 || row == height-1){ - if(i >= numLumps){ + if(i >= lumps.size()){ cout << "constrain index error\n"; } lumps[i].constrain(Lump::CONSTRAIN_Y); }else if( col == 0 || col == width-1){ - if(i >= numLumps){ + if(i >= lumps.size()){ cout << "constrain index error\n"; } lumps[i].constrain(Lump::CONSTRAIN_X); @@ -939,7 +945,7 @@ || (row == height-1 && col == 0) || (row == 0 && col == width-1) || (row == height-1 && col == width-1)){ - if(i >= numLumps){ + if(i >= lumps.size()){ cout << "constrain index error\n"; } lumps[i].constrain(); @@ -966,7 +972,7 @@ int springno = vmarg * (width - 1) + hmarg; // do top horz for(int i = 0; i < width - 2*hmarg; i++){ - if(lumpno >= numLumps) cout << "makeDefaultScanPath index error\n"; + if(lumpno >= lumps.size()) cout << "makeDefaultScanPath index error\n"; if(springno >= numSprings) cout << "makeDefaultScanPath index error\n"; scanPath.addElement(&lumps[lumpno], &springs[springno]); lumpno++; @@ -978,7 +984,7 @@ springno = height*(width-1) + ((height-1) * (width - hmarg)) + vmarg; for(int i = 0; i < height - (2 * vmarg); i++){ - if(lumpno >= numLumps) cout << "makeDefaultScanPath index error\n"; + if(lumpno >= lumps.size()) cout << "makeDefaultScanPath index error\n"; if(springno >= numSprings) cout << "makeDefaultScanPath index error\n"; scanPath.addElement(&lumps[lumpno], &springs[springno]); springno++; // jump to next row @@ -989,7 +995,7 @@ // do bottom horz right to left springno = (height - vmarg) * (width - 1) + (width - hmarg - 1); for(int i = 0; i < width - 2*hmarg; i++){ - if(lumpno >= numLumps) cout << "makeDefaultScanPath index error\n"; + if(lumpno >= lumps.size()) cout << "makeDefaultScanPath index error\n"; if(springno >= numSprings) cout << "makeDefaultScanPath index error\n"; scanPath.addElement(&lumps[lumpno], &springs[springno]); springno--; // jump to next row @@ -999,7 +1005,7 @@ // all horz spr // left marg rows // top margin springno = height*(width-1) + ((height-1) * hmarg) + height - vmarg - 1; for(int i = 0; i < height - 2 * vmarg; i++){ - if(lumpno >= numLumps) cout << "makeDefaultScanPath index error\n"; + if(lumpno >= lumps.size()) cout << "makeDefaultScanPath index error\n"; if(springno >= numSprings) cout << "makeDefaultScanPath index error\n"; scanPath.addElement(&lumps[lumpno], &springs[springno]); springno--; // jump to next row @@ -1042,8 +1048,9 @@ numLumps = numSpokes * numRings + 1; // +1 cos one in the middle numSprings = 2 * numSpokes * numRings; - lumps = new Lump[numLumps]; - cout << "made " << numLumps << " lumps\n"; + //lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); + cout << "made " << numLumps << " lumps\n"; springs = vector<Spring>(numSprings); cout << "made " << numSprings << " springs\n"; @@ -1136,7 +1143,7 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1226,8 +1233,9 @@ numLumps = numSpokes * numRings; numSprings = numSpokes * numRings + numSpokes * (numRings - 1); - lumps = new Lump[numLumps]; - cout << "made " << numLumps << " lumps\n"; + //lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); + cout << "made " << numLumps << " lumps\n"; springs = vector<Spring>(numSprings); cout << "made " << numSprings << " springs\n"; @@ -1310,7 +1318,7 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1403,7 +1411,7 @@ // rings // spokes & diags numSprings = numSpokes * numRings + 3 * numSpokes * (numRings - 1); - lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); cout << "made " << numLumps << " lumps\n"; springs = vector<Spring>(numSprings); cout << "made " << numSprings << " springs\n"; @@ -1511,7 +1519,7 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1602,7 +1610,7 @@ // numLumps = numSegments+1; numSprings = numSegments; - lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); springs = vector<Spring>(numSprings); } @@ -1611,7 +1619,7 @@ cout << "LineMesh class setLumpPositions\n"; // double hspacing = (1.0 - 0.05)/numSegments; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ lumps[i].setPosition(0.025+hspacing*i, 0.5); } } @@ -1632,10 +1640,10 @@ cout << "LineMesh class constrain\n"; if (aMode == CONSTRAIN_EDGES || aMode == CONSTRAIN_CORNERS){ lumps[0].constrain(); - lumps[numLumps-1].constrain(); + lumps[lumps.size()-1].constrain(); }else if (aMode == CONSTRAIN_GRAB_REGION){ TwoVector diff; - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1686,7 +1694,7 @@ // numLumps = (numSegments+1)*2; numSprings = numSegments*2; - lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); springs = vector<Spring>(numSprings); } @@ -1726,16 +1734,16 @@ cout << "LineMesh class constrain\n"; if (aMode == CONSTRAIN_EDGES || aMode == CONSTRAIN_CORNERS){ lumps[0].constrain(); - lumps[numLumps-1].constrain(); + lumps[lumps.size()-1].constrain(); - for(int i = numSegments; i < numLumps; i++){ + for(int i = numSegments; i < lumps.size(); i++){ lumps[i].constrain(); } } if (aMode == CONSTRAIN_GRAB_REGION){ TwoVector diff; - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1751,11 +1759,11 @@ lumps[i].constrain(Lump::CONSTRAIN_X); } - for(int i = numSegments; i < numLumps; i++){ + for(int i = numSegments; i < lumps.size(); i++){ lumps[i].constrain(); } lumps[0].constrain(); - lumps[numLumps-1].constrain(); + lumps[lumps.size()-1].constrain(); } } @@ -1805,7 +1813,7 @@ // numLumps = numSegments; numSprings = numSegments; - lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); //springs = new PressureSpring[numSprings]; //TODO PressureSpring shoudl BE a spring ? @@ -1865,10 +1873,10 @@ cout << "DropletMesh class constrain\n"; if (aMode == CONSTRAIN_EDGES || aMode == CONSTRAIN_CORNERS){ lumps[0].constrain(); - lumps[numLumps-1].constrain(); + lumps[lumps.size()-1].constrain(); } else if (aMode == CONSTRAIN_GRAB_REGION){ TwoVector diff; - for(int i = 0; i<numLumps; i++){ + for(int i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay); @@ -1895,13 +1903,13 @@ // calc average radius magnitude double radiusMag = 0.0, avRadiusMag = 0.0; - for(int i = 0; i < numLumps; i++){ + for(int i = 0; i < lumps.size(); i++){ TwoVector radius; radius.setCoord(centre.x - lumps[i].position.x, centre.y - lumps[i].position.y ); radiusMag = radius.norm(); avRadiusMag += radiusMag; } - avRadiusMag /= numLumps; + avRadiusMag /= lumps.size(); // calc area double area = 2 * PI * avRadiusMag*avRadiusMag; @@ -1962,7 +1970,7 @@ /* horz --- \ diag / diag */ numSprings = (width-1) * (height-1) + width * (height - 1) + (width-1) * (height - 1); - lumps = new Lump[numLumps]; + lumps = vector<Lump>(numLumps); cout << "made " << numLumps << " lumps\n"; springs = vector<Spring>(numSprings); cout << "made " << numSprings << " springs\n"; @@ -2050,7 +2058,7 @@ // check if lump is within grab range switch (aMode) { case CONSTRAIN_GRAB_REGION: - for(i = 0; i<numLumps; i++){ + for(i = 0; i<lumps.size(); i++){ diff.setCoord(lumps[i].position.x - ax, lumps[i].position.y - ay);
--- a/scanpath.mm Fri Dec 07 19:20:57 2012 +0000 +++ b/scanpath.mm Mon Dec 10 13:00:03 2012 +0000 @@ -29,7 +29,9 @@ scanMode = DISPLACEMENT; initWavetables(); framesPerSample = 60.0/SAMPLE_RATE; - + updateAccessing = false; + audioAccessing = false; + } void ScanPath::init(){ framesPerSample = ofGetFrameRate()/SAMPLE_RATE; @@ -37,8 +39,7 @@ } //---------------------------------------------------------------- ScanPath::~ScanPath(){ - - //VECTORISE + delete [] wavetableNew; delete [] wavetableOld; @@ -47,7 +48,7 @@ } void ScanPath::clear(){ - //VECTORISE + for(vector<Element>::iterator elitr = pathElements.begin(); elitr < pathElements.end(); elitr++){ (*elitr).eLump->removeFromScanPath(); (*elitr).eSpring->removeFromScanPath(); @@ -162,16 +163,18 @@ // TODO THRED MUTEX HERE!?? // this is called from graphics thread // reset the interp between frames - - /* + int i = 0; while(audioAccessing){ i++; } - cout << "buffers swapped while update!" << i << "times\n"; + if(i > 0){ + cout << "Update wavetables had to wait for audio access " << i << " times\n"; + // hardly ever happens + } updateAccessing = true; - */ + switch(scanMode){ case DISPLACEMENT: // now fill with new values @@ -206,13 +209,9 @@ break; default: break; - - + } - - - - + temp = wavetableOld; wavetableOld = wavetableNew; wavetableNew = wavetableUpdate; @@ -247,15 +246,14 @@ // TODO THRED MUTEX HERE!?? // this is called from audio thread - /* + int i = 0; while(updateAccessing){ i++; } audioAccessing = true; - cout << "update is accessing while audio is" << i << "times\n"; - - */ + if(i>0) cout << "Audio thread had to wait for wavetable update " << i << " times\n"; + double oldsample = (1 - frac) * wavetableOld[n0] + frac * wavetableOld[n1];
--- a/testApp.mm Fri Dec 07 19:20:57 2012 +0000 +++ b/testApp.mm Mon Dec 10 13:00:03 2012 +0000 @@ -48,7 +48,7 @@ globalUI.touchMode = globalUI.GRAB; scanPath.scanMode = scanPath.DISPLACEMENT; } - +//-------------------------------------------------------------- void testApp::setupMesh(){ // SET UP THE MESH STRUCTURE if(audioAccessFlag) return; // or rather wait ! @@ -810,7 +810,7 @@ void testApp::audioRequested (float * output, int bufferSize, int nChannels){ float sample; static double phasor; - static double sinePhasor; + if(meshConstructionFlag) return; // if no mesh , scanpath will still be there, but empty @@ -819,11 +819,8 @@ if(audioOn){ audioAccessFlag = TRUE; for (int i = 0; i < bufferSize; i++){ - sinePhasor = sin(2*PI*phasor); sample = float(scanPath.getNextSample(phasor)); - //sample = float(scanPath.getNextSample()); - // BASIC STRING sample = float(basicString->getNextSample(phasor)); // hipass to get rid of DC //sample = mydspTools.highpass1(sample);