view mesh.h @ 15:d5758530a039 tip

oF0.84 Retina, and iPhone support
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Tue, 12 May 2015 15:48:52 +0100
parents 426d645d8e69
children
line wrap: on
line source
/*
 *  mesh.h
 *  springstructure
 *
 *  Created by Robert Tubb on 07/06/2011.
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef _MESHH
#define _MESHH

#include <iostream>
#include "lump.h"
#include "scanpath.h"
#include "globalForces.h"
#include "json.h"

class Mesh{
public:
    int dim1, dim2;
    
    bool radial; // tells us if mesh is radial or not
	// toggles
	bool syrup;
    bool home;

    double propagationSpeed;
    
    double k,m,f; // for stability check and asym
	
	int numLumps;
	int numSprings;
    
	//Lump *lumps;
    vector<Lump> lumps;
    vector<Spring> springs;
	//Spring *springs;
    
    TwoVector centre;

	
	// modes
	enum constrainMode { CONSTRAIN_CORNERS, CONSTRAIN_EDGES,CONSTRAIN_EDGES_XY, CONSTRAIN_SINGLE_POINT, CONSTRAIN_SINGLE_POINT_X, CONSTRAIN_SINGLE_POINT_Y, CONSTRAIN_GRAB_REGION,CONSTRAIN_GRAB_REGION_X,CONSTRAIN_GRAB_REGION_Y, CONSTRAIN_ALL_X, CONSTRAIN_ALL_Y};
	double GRAB_RANGE;
	 
	enum MeshType {SQUARE_MESH, SQUARE_CROSS_MESH, SPIDER_MESH, SPIDER_CROSS_MESH, DROPLET_MESH, LINE_MESH, TRIANGLE_MESH, GROUNDED_LINE_MESH, HOLED_SPIDER_MESH};
    MeshType meshType;

    // MEMBER FUNCTIONS
	Mesh();
    Mesh(Json::Value& savedMesh); // contructor using saved mesh
    void setReasonableDefaults();
	virtual ~Mesh();

    void draw();
    
	// INTERACTIONS
    void resetAll();
    void resetPositions();
    void resetVelocities();
    void resetEverything();
    
     // excite via position, velocity force
    // using shapes : noise, hamming, sine, 
    void hit(double dax,double day,int velocity = 100, GlobalForces::excitationTypes aEType = GlobalForces::POSITION, 
             GlobalForces::excitationShapes aEShape = GlobalForces::NOISE); 
    void spatialHarmonic(int aharm1 = 1, int aharm2 = 0);
    void damp();
    void forceField(double dax,double day,double strength);
    void averagingFilter(double amt);
    
	void grab(double x, double y,  int touchID); 
	void drag(double ax,double ay, int touchID);
	void unGrab(int touchID);
    
	virtual void constrain(double x, double y, constrainMode aMode);	// diff meshes will have diff edges
	void unconstrain();
    void unconstrain(double x, double y, constrainMode aMode);

    
    // PARAMETER SETTINGS
    void toggleSyrup();
	void toggleSyrup(bool on);
    void toggleSpringForces();
	void toggleSpringForces(bool on);
    void toggleGravity();
    void toggleGravity(bool on);
    void toggleHome(bool on);
    
	void setRestLength();
    void zeroRestLength();
    
    void setPropagationSpeed(double aSpeed); // sets k and m to give a certain speed
    void decreasePropagationSpeed();
    void increasePropagationSpeed();
    void setSpringConstant(double aK);
    void setMass(double aM);
    void setFriction(double aF);
    
    // create varying constants
    void setSpringConstantAsym(double aAsym);
    void setMassAsym(double aAsym);
    void setFrictionAsym(double aAsym);	
    void setZeroAudioLine();

    // only for mouse cursor
	void checkHover(double x, double y);

//	SCANPATH STUFF
	void clearScanPath();
    void disconnectDraw(); // enables you to draw scanpths anywhere
	int inscribeScanPath(double ax, double ay);
    
    // inscribeScanPathFromJson
    
    // called by scanpath.update wavetables
	double getNextSample();
    
    virtual void update();
    
// save stuff
    Json::Value convertToJsonForSaving();
    Json::Value saveConnectionsAsJson();
    // UTILS
    TwoVector calculateCentre();
	void connect(int springnum,int lumpnum);
    void connect(int springnum,int lumpnum,int alumpnum2);
	int getNearestLump(double ax,double ay);
protected:

    int prevLump;
    
	// specific mesh shapes override these:

	virtual void makeComponents(int adimension1, int adimension2);
	virtual void setLumpPositions();
	virtual void makeConnections();
	virtual void makeDefaultScanPath();
    
    // alternatively get from saved:
    
	void setLumpPositionsFromJson(Json::Value lumpPositions, Json::Value lumpRestPositions);
	void makeConnectionsFromJson(Json::Value connections);
	void makeScanPathFromJson(Json::Value scanPathElements);
    void constrainFromJson(Json::Value constrainedLumps);

	
};
//---------------------------------------------------------
class SpiderMesh : public Mesh{
public:
	int numSpokes, numRings;
	
	SpiderMesh(int aNumSpokes,int aNumRings);
	
	virtual void constrain(double x, double y, constrainMode aMode);
	virtual void makeComponents(int adimension1, int adimension2);
	virtual void setLumpPositions();
	virtual void makeConnections();
	virtual void makeDefaultScanPath();
};
//---------------------------------------------------------
class HoledSpiderMesh : public Mesh{
public:
    int numSpokes, numRings;
	
    HoledSpiderMesh(int aNumSpokes,int aNumRings);
	void constrain(double x, double y, constrainMode aMode);
	void makeComponents(int adimension1, int adimension2);
	void setLumpPositions();
	void makeConnections();
	void makeDefaultScanPath();
};
//---------------------------------------------------------
class SpiderCrossMesh : public Mesh{
public:
	int numSpokes, numRings;
	
	SpiderCrossMesh(int aNumSpokes,int aNumRings);
	
	void constrain(double x, double y, constrainMode aMode);
	void makeComponents(int adimension1, int adimension2); // override
	void setLumpPositions(); // same
	void makeConnections(); // overrride
	void makeDefaultScanPath(); // same
};
//---------------------------------------------------------
// square grid 
class SquareMesh : public Mesh{
public:
	// square specific
	int height;
	int width;
	SquareMesh();
	SquareMesh(int height, int width);
    ~SquareMesh();
	void constrain(double x, double y, constrainMode aMode);
    void makeComponents(int adimension1, int adimension2);
    void setLumpPositions();
    void makeConnections();
    void makeDefaultScanPath();
};
//---------------------------------------------------------
// square grid with all diagonals connected i.e. we override makeConnections
class SquareCrossMesh : public SquareMesh{
public:
    SquareCrossMesh(){};
	SquareCrossMesh(int height, int width);
    ~SquareCrossMesh();
	 void makeConnections();

};
//---------------------------------------------------------
// simple 1d line
class LineMesh : public Mesh{
public:
	// square specific
	int numSegments;
	
	LineMesh(int aNumSegments);	
	void constrain(double x, double y, constrainMode aMode);
    void makeComponents(int adimension1, int adimension2);
    void setLumpPositions();
    void makeConnections();
    void makeDefaultScanPath();
};
//---------------------------------------------------------
// simple 1d line attached to 'ground' (constrained lumps) by other springs...
class GroundedLineMesh : public Mesh{
public:
    int numSegments;
	
	GroundedLineMesh(int aNumSegments);	
	void constrain(double x, double y, constrainMode aMode);
    void makeComponents(int adimension1, int adimension2);
    void setLumpPositions();
    void makeConnections();
    void makeDefaultScanPath();
};

//----------------------------------------------------------
//---------------------------------------------------------
// circular spring with internal pressure
class DropletMesh : public Mesh{
public:
	// specific
	int numSegments;
    double restArea;
	
	DropletMesh(int aNumSegments);	
	void constrain(double x, double y, constrainMode aMode);
    void makeComponents(int adimension1, int adimension2);
    void setLumpPositions();
    void makeConnections();
    void makeDefaultScanPath();
    double calculatePressure();
    double calculateArea();
    void update();
};
//---------------------------------------------------------
// trangular mesh
class TriangleMesh : public Mesh{
public:
	// square specific
	int height;
	int width;
	
	TriangleMesh(int height, int width);	
	void constrain(double x, double y, constrainMode aMode);
    void makeComponents(int adimension1, int adimension2);
    void setLumpPositions();
    void makeConnections();
    void makeDefaultScanPath();
};
//----------------------------------------------------------

#endif