rt300@0: // rt300@0: // grid.h rt300@0: // oscSenderExample rt300@0: // rt300@0: // Created by Robert Tubb on 03/10/2012. rt300@0: // rt300@0: // This is the view onto the zoomable movable grid rt300@0: rt300@0: #ifndef __oscSenderExample__grid__ rt300@0: #define __oscSenderExample__grid__ rt300@0: rt300@0: #include rt300@0: #include "2dvector.h" rt300@3: #include "ofMain.h" rt300@3: #include "eventLogger.h" rt300@3: #include "presetManager.h" rt300@34: #include "hilbert.h" rt300@37: rt300@46: #define PRESET_INTERP_TIME 90 // frames rt300@0: using namespace std; rt300@7: class Preset; rt300@0: rt300@0: class Grid { rt300@24: rt300@24: public: rt300@24: bool snapped; rt300@46: bool automatedMovementInProgress; rt300@44: bool presetWasTapped; rt300@43: Hilbert hilbert; rt300@24: rt300@24: Grid(); rt300@24: ~Grid(); rt300@24: void init(); rt300@24: void move(TwoVector moveP); // shift view by pixels rt300@24: void zoom(float factor); rt300@24: rt300@46: void animateTo(TwoVector point); rt300@46: rt300@44: void tap(TwoVector pixel); // user has tapped a point rt300@44: rt300@37: typedef enum{NO_INTERPOLATION, INTERPOLATE_GRID, INTERPOLATE_PRESET} interpolateModeType; rt300@37: interpolateModeType interpolateMode; rt300@24: void snapCheck(); rt300@24: void shiftCentreToSnapped(); rt300@37: void draw(); rt300@43: rt300@46: void update(); // only called if animating rt300@38: double interpLevel; rt300@37: int smallestGridSpacing; // number of pixels when small grid dissappears from view rt300@24: vector getParams(); rt300@24: TwoVector getCoord(); rt300@39: double getScale(){return scale;}; rt300@24: void setMinZoom(); rt300@24: void setMaxZoom(); rt300@38: void setInterpolation(interpolateModeType mode); rt300@44: rt300@46: void startInterpolatedAnimation(TwoVector endCoordinate); rt300@46: rt300@46: rt300@46: rt300@44: Preset * getClosestPresetOf(vector closePresets); rt300@44: void interpolateTo(TwoVector coord); rt300@35: // HILBERT now does each coord for this rt300@37: vector calculateParamsFromCoord(TwoVector coord); rt300@37: TwoVector calculateCoordFromParams(vector params); rt300@37: vector calculateInterpolatedParamsFromCoord(TwoVector coord); rt300@24: TwoVector coordToPixel(TwoVector coord); rt300@44: TwoVector pixelToCoord(TwoVector pixel); rt300@44: rt300@39: void setScale(double scaleLevel); rt300@24: // the inverse stuff rt300@24: void setParams(vector); rt300@39: TwoVector getCoordForPresetSave(); rt300@43: rt300@43: // experimental rt300@43: void changeNumberOfParamsPerDim(); rt300@0: private: rt300@46: int framesRemaining; rt300@46: rt300@46: vector startInterpParams; rt300@46: vector endInterpParams; rt300@46: TwoVector endInterpCoord; rt300@46: rt300@43: void drawGridLines(); rt300@24: double scale; // surface units per pixel GUI rt300@0: rt300@43: double maxValue; // width of entire space rt300@3: const double minValue; // smallest zoom rt300@35: int paramsPerDim; // no of parameters per dimension ( rt300@35: int paramBitDepth; // number of bits for the parameter control data - i.e. always 7 for midi CC rt300@38: rt300@5: rt300@5: rt300@24: TwoVector topLeft; // top left corner of view, surface coords GUI rt300@0: TwoVector bottomRight; rt300@0: TwoVector size; // size of view, surface coords rt300@0: TwoVector pixSize; // size of view pixels (ie screen size!) rt300@24: rt300@0: TwoVector centre; rt300@5: TwoVector snapCentre; rt300@24: TwoVector snapDist; // number of pixels to snap to GUI rt300@7: Preset * closestPreset; // pointer to the currently selected (snapped to ) preset.. NULL if none. rt300@47: Preset * tappedPreset; // pointer to currently highlighted (tapped) rt300@47: rt300@47: rt300@0: bool maxZoom, minZoom; rt300@3: rt300@43: vector midiCC; // the actual params rt300@0: rt300@0: // private functions rt300@0: rt300@38: rt300@0: void checkLimits(); rt300@0: void viewWasChanged(); rt300@0: void checkConsistencies(); rt300@0: rt300@38: rt300@0: rt300@0: vector walkDiff(vector left, vector right); // not used... not worth it! rt300@0: rt300@0: void displayInfo(); rt300@3: void drawPresets(); rt300@0: rt300@0: void setCoord(TwoVector coord); rt300@5: void drawCrossHairs(); rt300@46: void continueInterpolatedAnimation(); rt300@44: rt300@38: double calculateInterpolateLevel(); rt300@37: vector interpVector(vector upper, vector lower, float frac); rt300@38: vector interpHilbert(int bitlevel, TwoVector coord); rt300@3: rt300@38: // the old stuff!!!!!!!!!! rt300@38: rt300@38: int codeLength; // the 1d size of the code, determines max extent of single tile, related to params per dim rt300@38: rt300@38: void makeCode(); rt300@38: vector< vector > vcode; // rt300@38: vector icode; rt300@38: vector transSeq; rt300@38: rt300@38: TwoVector calculateCoordFromParamsOld(vector params) const; rt300@38: vector calculateParamsFromCoordOld(TwoVector coord) const; rt300@38: vector intToGray(int num, int dimToTravel=3) const; rt300@38: vector coordTobase32(double coord) const; rt300@38: vector grayToMidi(vector > grayCodes) const; rt300@38: rt300@38: // the inverse stuff rt300@38: int grayToInt(vector) const; rt300@38: double base32toCoord(vector) const; rt300@38: vector > midiToGray(vector) const; rt300@38: vector codesToBase32(vector >) const; rt300@0: rt300@0: rt300@0: }; rt300@0: rt300@0: #endif /* defined(__oscSenderExample__grid__) */