// -*- C++ -*- /* * Simple MultimEdia LiTerator(SMELT) * by Chris Xiong 2015 * Indicator header & implementation * * WARNING: This library is in development and interfaces would be very * unstable. * */ #ifndef SMINDICATOR_H #define SMINDICATOR_H #include "smelt.hpp" #include "smmath.hpp" #include "smcolor.hpp" #include "smentity.hpp" #include "smgrid.hpp" class indicatorCircular { private: smGrid *circle; float value,radius,thickness; DWORD color; BYTE alpha; public: void init(float r,float thkns,BYTE a,SMTEX tex,smTexRect tr) { circle=new smGrid(1025,3); circle->setTexture(tex); circle->setTextureRectv(tr); radius=r;thickness=thkns;alpha=a;color=0; for(int i=0;i<=1024;++i) { float tang,tx,ty; tang=(float)i/1024.*PI*2-PI/2; tx=-cos(tang)*radius;ty=sin(tang)*radius; circle->setPos(i,2,tx,ty,0.5,GRID_REFTOPLEFT); tx=-cos(tang)*(radius-thickness);ty=sin(tang)*(radius-thickness); circle->setPos(i,1,tx,ty,0.5,GRID_REFTOPLEFT); tx=-cos(tang)*(radius-2*thickness);ty=sin(tang)*(radius-2*thickness); circle->setPos(i,0,tx,ty,0.5,GRID_REFTOPLEFT); } } void overrideColor(DWORD col){color=col;} void setAlpha(BYTE a){alpha=a;} void setValue(float v) { value=v; for(int i=0;i<=1024;++i) { int tr=(int)((1.0f-value)*255); int tg=(int)(value*255); DWORD tcolor=ARGB(alpha,tr,tg,0); smColorHSVA *tc=new smColorHSVA(tcolor); if(tc->v<0.85)tc->v=0.85; tcolor=color?SETA(color,alpha):SETA(tc->getHWColor(),alpha); delete tc; if((float)i/1024.<=value) { circle->setColor(i,2,tcolor); circle->setColor(i,1,SETA(0x00FFFFFF,alpha)); circle->setColor(i,0,tcolor); } else { circle->setColor(i,2,0); circle->setColor(i,1,0); circle->setColor(i,0,0); } } } void render(float x,float y){circle->render(x,y);} void deinit(){delete circle;circle=NULL;} }; class indicatorLinear { private: smEntity2D *upper,*lower; float value,maxlength,thickness; DWORD color;smTexRect trect; BYTE alpha; public: void init(float ml,float thkns,BYTE a,SMTEX tex,smTexRect tr) { upper=new smEntity2D(tex,tr.x,tr.y,tr.w,tr.h/2); lower=new smEntity2D(tex,tr.x,tr.y+tr.h/2,tr.w,tr.h/2); maxlength=ml;thickness=thkns;alpha=a;color=0;trect=tr; } void overrideColor(DWORD col){color=col;} void setAlpha(BYTE a){alpha=a;} void setValue(float v) { value=v; int tr=(int)((1.0f-value)*255); int tg=(int)(value*255); DWORD tcolor=ARGB(alpha,tr,tg,0); smColorHSVA *tc=new smColorHSVA(tcolor); if(tc->v<0.85)tc->v=0.85; tcolor=color?SETA(color,alpha):SETA(tc->getHWColor(),alpha); delete tc; upper->setColor(tcolor,0);upper->setColor(tcolor,1); upper->setColor(0,2);upper->setColor(0,3); lower->setColor(0,0);lower->setColor(0,1); lower->setColor(tcolor,2);lower->setColor(tcolor,3); } void render(float x,float y) { upper->render(x,y,0,value*maxlength/trect.w,thickness/trect.h/2); lower->render(x,y+thickness/2,0,value*maxlength/trect.w,thickness/trect.h/2); } void deinit(){delete upper;delete lower;upper=lower=NULL;} }; #endif