rt300@0: // rt300@0: // 3Dbox.h rt300@0: // tweakathlon rt300@0: // rt300@0: // Created by Robert Tubb on 13/02/2014. rt300@0: // rt300@0: // rt300@0: rt300@0: #ifndef __tweakathlon___Dbox__ rt300@0: #define __tweakathlon___Dbox__ rt300@0: rt300@0: #include rt300@0: #include "UIElement.h" rt300@0: #include "ofMain.h" rt300@0: rt300@0: rt300@0: class Leap3DBox : public UIElement { rt300@0: rt300@0: public: rt300@0: Leap3DBox(float ax, rt300@0: float ay, rt300@0: float awidth, rt300@0: float aheight, rt300@0: float azx, rt300@0: float azy, rt300@0: const UIProps& props); rt300@0: void init(const UIProps& props); rt300@0: rt300@26: virtual void setValueAndScale(int which, int val){ rt300@0: if(which == 0) xVal = (val - minVal)/(maxVal - minVal); rt300@0: if(which == 1) yVal = (val - minVal)/(maxVal - minVal); rt300@0: if(which == 2) zVal = (val - minVal)/(maxVal - minVal); rt300@0: //cout << zVal << endl; rt300@0: } rt300@0: rt300@26: virtual void setHintValue(int which, int val){ rt300@0: if(which == 0) hintX = (val - minVal)/(maxVal - minVal); rt300@0: if(which == 1) hintY = (val - minVal)/(maxVal - minVal); rt300@0: if(which == 2) hintZ = (val - minVal)/(maxVal - minVal); rt300@0: rt300@0: }; rt300@0: rt300@26: virtual void draw(){ rt300@0: if(hidden)return; rt300@0: if(on){ rt300@0: ofSetColor(foregroundHi); rt300@0: }else{ rt300@0: ofSetColor(foregroundLo); rt300@0: rt300@0: } rt300@0: if(inactive){ rt300@0: ofSetColor(fgInactive); rt300@0: } rt300@0: rt300@0: rt300@0: // draw rear face zy+ rt300@0: ofLine(zx+x,zy+y,zx+x,zy+y+height); // left rt300@0: ofLine(zx+x,zy+y,zx+x+width,zy+y); // top rt300@0: ofLine(zx+x+width,zy+y,zx+x+width,zy+y+height); //right rt300@0: ofLine(zx+x+width,zy+y+height,zx+x,zy+y+height); // bottom rt300@0: rt300@0: // draw indicators rt300@0: drawIndicator(); rt300@0: rt300@0: ofSetColor(foregroundHi); rt300@0: rt300@0: // draw connectors rt300@0: ofLine(x,y,zx+x,zy+y); // top left rt300@0: ofLine(x+width,y,zx+x+width,zy+y); // top right rt300@0: ofLine(x,y+height,zx+x,zy+y+height); // bot left rt300@0: ofLine(x+width,y+height,zx+x+width,zy+y+height); // bot right rt300@0: rt300@0: rt300@0: // draw front face rt300@0: ofLine(x,y,x,y+height); // left rt300@0: ofLine(x,y,x+width,y); // top rt300@0: ofLine(x+width,y,x+width,y+height); //right rt300@0: ofLine(x+width,y+height,x,y+height); // bottom rt300@0: rt300@26: //drawLabels(); rt300@0: rt300@0: }; rt300@0: rt300@0: void drawLabels(){ rt300@0: ofColor fg,bg; rt300@0: rt300@0: if(on){ rt300@0: fg = foregroundHi; rt300@0: bg = backgroundHi; rt300@0: }else{ rt300@0: fg = foregroundLo; rt300@0: bg = backgroundLo; rt300@0: } rt300@0: if(inactive){ rt300@0: fg = fgInactive; rt300@0: } rt300@0: ofSetColor(fg); rt300@0: verdana16.drawString(labelNameX + " (L/R)", ofGetWidth()/2 - 120, y + height + 50 ); rt300@0: verdana16.drawString(labelNameY + " (Up/Dn)", ofGetWidth()/2 - width + 50, y + height/2 ); rt300@0: verdana16.drawString(labelNameZ + " Fwd/Bck)", ofGetWidth()/2 + width - 20, y+height); rt300@0: rt300@0: // TODO up down etc rt300@0: }; rt300@0: void setLabels(string ax, string ay, string az){ rt300@0: labelNameX = ax; rt300@0: labelNameY = ay; rt300@0: labelNameZ = az; rt300@0: } rt300@0: rt300@0: bool handleMyTouch(int x, int y, touchType ttype, int touchID){ rt300@0: return false; rt300@0: }; rt300@0: void showHint(bool show){ rt300@0: hintShowing = show; rt300@0: } rt300@0: void setHintColor(ofColor c){ rt300@0: hintColor = c; rt300@0: }; rt300@0: rt300@0: protected: rt300@26: virtual void drawIndicator(){ rt300@0: ofSetColor(foregroundHi); rt300@0: float px,py; rt300@0: px = x + xVal*width + zx*zVal; rt300@0: py = y + (1-yVal)*height + zy*zVal; rt300@0: rt300@0: // line to left wall (no x) rt300@0: ofLine(px , py , x+zx*zVal, py); rt300@0: rt300@0: ofEllipse(px,py,thickness,thickness); rt300@0: rt300@0: rt300@0: // line to bottom wall (no y) rt300@0: ofLine(px , py , px, y+height+zy*zVal); rt300@0: // line to front wall ( no z) rt300@0: ofLine(px , py , x+ width*xVal, y + height*(1-yVal)); rt300@0: rt300@0: if(hintShowing) drawHintIndicator(); rt300@0: }; rt300@26: virtual void drawHintIndicator(){ rt300@0: ofSetColor(hintColor); rt300@0: float px,py; rt300@0: px = x + hintX*width + zx*hintZ; rt300@0: py = y + (1-hintY)*height + zy*hintZ; rt300@0: rt300@0: // line to left wall (no x) rt300@0: ofLine(px , py , x+zx*hintZ, py); rt300@0: rt300@0: ofEllipse(px,py,thickness,thickness); rt300@0: rt300@0: rt300@0: // line to bottom wall (no y) rt300@0: ofLine(px , py , px, y+height+zy*hintZ); rt300@0: // line to front wall ( no z) rt300@0: ofLine(px , py , x+ width*hintX, y + height*(1-hintY)); rt300@0: rt300@0: }; rt300@0: rt300@0: rt300@0: float xVal,yVal,zVal; rt300@26: rt300@26: ofVec3f posVals; rt300@0: float zx,zy; // how much of z and x shows up in diagonal x and y rt300@0: rt300@0: rt300@0: float minVal; rt300@0: float maxVal; rt300@0: rt300@0: rt300@0: float hintX; rt300@0: float hintY; rt300@0: float hintZ; rt300@0: bool hintShowing; rt300@0: rt300@0: string labelNameX; rt300@0: string labelNameY; rt300@0: string labelNameZ; rt300@0: rt300@0: float thickness; // width of border and indicator rt300@0: ofColor foregroundHi; rt300@0: ofColor backgroundHi; rt300@0: ofColor foregroundLo; rt300@0: ofColor backgroundLo; rt300@0: ofColor fgInactive; rt300@0: ofColor hintColor; rt300@28: rt300@28: rt300@0: }; rt300@0: #endif /* defined(__tweakathlon___Dbox__) */