/*This highlights the 4th dimension of the transformation matrix which is used for storing translations (shifts) in matricies so they can be combined with a matrix multiplication. Scroll bar works. The multiplication takes place in the $LK,"Sprite3ZB",A="MN:Sprite3ZB"$ routine. */ #define SLIDER_SPACING 20 #define SLIDER_RANGE 30 #define SLIDER_BORDER 2 class CSliderState { I64 s1,s2,s3; F64 arg1,arg2,scale; } s; U0 DrawCtrlSlider(CDC *dc,CCtrl *c) { CSliderState *s=c->state; dc->color=LTGREEN; GrRect(dc, c->left,c->top,SLIDER_SPACING*4+3,SLIDER_SPACING*2+SLIDER_RANGE); dc->color=BROWN; GrRect(dc, c->left+SLIDER_BORDER,c->top+SLIDER_BORDER, SLIDER_SPACING*4+3-2*SLIDER_BORDER, SLIDER_SPACING*2+SLIDER_RANGE-2*SLIDER_BORDER); dc->color=BLACK; GrLine(dc,c->left+SLIDER_SPACING,c->top+SLIDER_SPACING, c->left+SLIDER_SPACING,c->top+SLIDER_SPACING+SLIDER_RANGE-1); GrLine(dc,c->left+2*SLIDER_SPACING+1,c->top+SLIDER_SPACING, c->left+2*SLIDER_SPACING+1,c->top+SLIDER_SPACING+SLIDER_RANGE-1); GrLine(dc,c->left+3*SLIDER_SPACING+2,c->top+SLIDER_SPACING, c->left+3*SLIDER_SPACING+2,c->top+SLIDER_SPACING+SLIDER_RANGE-1); dc->color=LTGREEN; GrPrint(dc,c->left+SLIDER_SPACING-FONT_WIDTH/2, c->top+SLIDER_SPACING+SLIDER_RANGE+3, "%d",s->s1*10/SLIDER_RANGE); GrPrint(dc,c->left+2*SLIDER_SPACING+1-FONT_WIDTH/2, c->top+SLIDER_SPACING+SLIDER_RANGE+3, "%d",s->s2*10/SLIDER_RANGE); GrPrint(dc,c->left+3*SLIDER_SPACING+2-FONT_WIDTH/2, c->top+SLIDER_SPACING+SLIDER_RANGE+3, "%d",s->s3*10/SLIDER_RANGE); GrRect(dc,c->left+SLIDER_SPACING-3, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s1-2 ,7,5); GrRect(dc,c->left+2*SLIDER_SPACING+1-3, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s2-2,7,5); GrRect(dc,c->left+3*SLIDER_SPACING+2-3, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s3-2,7,5); dc->color=GREEN; GrRect(dc,c->left+SLIDER_SPACING-2, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s1-1 ,5,3); GrRect(dc,c->left+2*SLIDER_SPACING+1-2, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s2-1,5,3); GrRect(dc,c->left+3*SLIDER_SPACING+2-2, c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s3-1,5,3); } U0 UpdateDerivedCtrlSlider(CCtrl *c) { CSliderState *s=c->state; c->left=c->win_task->pix_width/2-(SLIDER_SPACING*4+3)/2; c->right=c->left+SLIDER_SPACING*4+3; c->top=c->win_task->pix_height/2-(SLIDER_SPACING*2+SLIDER_RANGE)/2; c->bottom=c->top+SLIDER_SPACING*2+SLIDER_RANGE; s->s1=ClampI64(s->s1,0,SLIDER_RANGE-1); s->s2=ClampI64(s->s2,0,SLIDER_RANGE-1); s->s3=ClampI64(s->s3,1,SLIDER_RANGE-1); s->arg1=ã/2.0*s->s1/SLIDER_RANGE; s->arg2=1.0*(s->s2-SLIDER_RANGE/2)/SLIDER_RANGE; s->scale=2.0*s->s3/SLIDER_RANGE; } U0 LeftClickSlider(CCtrl *c,I64 x,I64 y,Bool) { CSliderState *s=c->state; if (xleft+(c->right-c->left)/3) s->s1=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING)); else if (xleft+2*(c->right-c->left)/3) s->s2=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING)); else s->s3=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING)); if (c->update_derived_vals) (*c->update_derived_vals)(c); } CCtrl *SliderNew() { CCtrl *c=CAlloc(sizeof(CCtrl)); c->win_task=Fs; c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_MS; c->type=CTRLT_GENERIC; c->state=&s; MemSet(&s,0,sizeof(s)); c->draw_it=&DrawCtrlSlider; c->left_click=&LeftClickSlider; c->update_derived_vals=&UpdateDerivedCtrlSlider; QueIns(c,Fs->last_ctrl); TaskDerivedValsUpdate; return c; } U0 SliderDel(CCtrl *c) { QueRem(c); Free(c); } $SP,"<1>",BI=1$ #define MAP_HEIGHT 2048 #define MAP_WIDTH 2048 #define TREES_NUM 256 I64 tree_x[TREES_NUM],tree_y[TREES_NUM]; class MPCtrl { I64 mp_cnt; I64 r[16]; F64 a; } mp; I64 mp_not_done_flags; U0 MPDrawIt(CTask *task) { CDC *dc=DCAlias(gr.dc2,task); I64 i,lo=Gs->num*TREES_NUM/mp.mp_cnt,hi=(Gs->num+1)*TREES_NUM/mp.mp_cnt; MemCpy(dc->r,mp.r,sizeof(I64)*16); dc->flags|=DCF_TRANSFORMATION; for (i=lo;i",BI=1$,mp.a); DCDel(dc); LBtr(&mp_not_done_flags,Gs->num); } U0 DrawIt(CTask *task,CDC *dc) { I64 i,h,v; task->horz_scroll.min=-s.scale*MAP_HEIGHT*Sin(s.arg1); task->horz_scroll.max=s.scale*MAP_WIDTH*Cos(s.arg1)-task->pix_width; task->vert_scroll.min=0; task->vert_scroll.max=s.scale*(MAP_HEIGHT*Cos(s.arg1)+MAP_WIDTH*Sin(s.arg1)) -task->pix_height; TaskDerivedValsUpdate(task); h=task->horz_scroll.pos; v=task->vert_scroll.pos; Mat4x4RotZ(dc->r,s.arg1); Mat4x4Scale(dc->r,s.scale); DCMat4x4Set(dc,dc->r); Mat4x4TranslationEqu(dc->r,-h,-v,0); MemCpy(mp.r,dc->r,sizeof(I64)*16); mp.a=s.arg2; mp_not_done_flags=1<flags|=DCF_TRANSFORMATION; dc->color=BROWN; dc->thick=4; GrLine3(dc,2,2,0,MAP_WIDTH-3,2,0); GrLine3(dc,2,MAP_HEIGHT-3,0,MAP_WIDTH-3,MAP_HEIGHT-3,0); GrLine3(dc,2,2,0,2,MAP_HEIGHT-3,0); GrLine3(dc,MAP_WIDTH-3,2,0,MAP_WIDTH-3,MAP_HEIGHT-3,0); } U0 Init() { I64 i; for (i=0;iwin_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER -WIF_SELF_GRAB_SCROLL-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; Fs->draw_it=&DrawIt; WinBorder(ON); DocCursor; DocClear; DocScroll; Fs->horz_scroll.pos=0; Fs->vert_scroll.pos=0; CCtrl *c=SliderNew; s.s1=0; s.s2=SLIDER_RANGE/2; s.s3=SLIDER_RANGE/2; MemSet(&mp,0,sizeof(MPCtrl)); mp.mp_cnt=_mp_cnt; View; SliderDel(c); SettingsPop; //You might want to save the original state of the scroll bars. } TransformDemo; j îÿÿÿÁÿÿÿ(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ