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@0: using namespace std; rt300@7: class Preset; rt300@0: rt300@0: class Grid { rt300@0: private: rt300@0: double scale; // surface units per pixel rt300@0: rt300@3: const double maxValue; // width of entire space rt300@3: const double minValue; // smallest zoom rt300@3: const int paramsPerDim; // no of parameters per dimension ( rt300@3: int codeLength; // the 1d size of the code, determines max extent of single tile, related to params per dim rt300@3: const int paramBitDepth; // number of bits for the parameter control data - i.e. always 7 for midi CC rt300@3: rt300@5: rt300@5: rt300@0: TwoVector topLeft; // top left corner of view, surface coords 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@0: TwoVector centre; rt300@5: rt300@5: rt300@5: TwoVector snapCentre; rt300@5: TwoVector snapDist; // number of pixels to snap to rt300@7: Preset * closestPreset; // pointer to the currently selected (snapped to ) preset.. NULL if none. rt300@5: rt300@0: bool maxZoom, minZoom; rt300@0: int cubeWidth; // side of hypercube. 2 for binary coding. rt300@3: rt300@0: vector< vector > vcode; // rt300@0: vector icode; rt300@0: vector transSeq; rt300@0: int midiCC[10]; // the actual params SHOULD BE INITED FROM 2*paramsPerDim rt300@0: rt300@0: // private functions rt300@0: rt300@0: void makeCode(); rt300@0: void checkLimits(); rt300@0: void viewWasChanged(); rt300@0: void checkConsistencies(); rt300@0: rt300@3: vector intToGray(int num, int dimToTravel=3) const; rt300@3: vector coordTobase32(double coord) const; rt300@3: vector grayToMidi(vector > grayCodes) const; rt300@0: rt300@0: // the inverse stuff rt300@3: int grayToInt(vector) const; rt300@3: double base32toCoord(vector) const; rt300@3: vector > midiToGray(vector) const; rt300@3: vector codesToBase32(vector >) const; 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@9: rt300@0: public: rt300@5: rt300@0: Grid(); rt300@0: ~Grid(); rt300@0: void init(); rt300@3: void move(TwoVector moveP); // shift view by pixels rt300@0: void zoom(float factor); rt300@5: bool snapped; rt300@9: rt300@9: void snapCheck(); rt300@0: void draw(); // draw lines rt300@3: rt300@0: void update(); // change according to zoom rt300@0: rt300@3: vector calculateParamsFromCoord(TwoVector coord) const; rt300@3: TwoVector calculateCoordFromParams(vector params) const; rt300@5: TwoVector coordToPixel(TwoVector coord); rt300@0: vector getParams(); rt300@0: TwoVector getCoord(); rt300@5: void setMinZoom(); rt300@5: void setMaxZoom(); rt300@5: rt300@0: // the inverse stuff rt300@0: void setParams(vector); rt300@3: rt300@3: rt300@0: rt300@0: rt300@0: }; rt300@0: rt300@0: #endif /* defined(__oscSenderExample__grid__) */