hschumann2/TempleOS-Source-Code
0847
1 2/*This highlights the 4th dimension3of the transformation matrix which4is used for storing translations (shifts)5in matricies so they can be combined6with a matrix multiplication.7 8Scroll bar works.9 10The multiplication takes place in the11Sprite3ZB routine.12*/13 14#define SLIDER_SPACING 2015#define SLIDER_RANGE 3016#define SLIDER_BORDER 217 18class CSliderState19{20 I64 s1,s2,s3;21 F64 arg1,arg2,scale;22} s;23 24U0 DrawCtrlSlider(CDC *dc,CCtrl *c)25{26 CSliderState *s=c->state;27 28 dc->color=LTGREEN;29 GrRect(dc, c->left,c->top,SLIDER_SPACING*4+3,SLIDER_SPACING*2+SLIDER_RANGE);30 dc->color=BROWN;31 GrRect(dc, c->left+SLIDER_BORDER,c->top+SLIDER_BORDER,32 SLIDER_SPACING*4+3-2*SLIDER_BORDER,33 SLIDER_SPACING*2+SLIDER_RANGE-2*SLIDER_BORDER);34 dc->color=BLACK;35 GrLine(dc,c->left+SLIDER_SPACING,c->top+SLIDER_SPACING,36 c->left+SLIDER_SPACING,c->top+SLIDER_SPACING+SLIDER_RANGE-1);37 GrLine(dc,c->left+2*SLIDER_SPACING+1,c->top+SLIDER_SPACING,38 c->left+2*SLIDER_SPACING+1,c->top+SLIDER_SPACING+SLIDER_RANGE-1);39 GrLine(dc,c->left+3*SLIDER_SPACING+2,c->top+SLIDER_SPACING,40 c->left+3*SLIDER_SPACING+2,c->top+SLIDER_SPACING+SLIDER_RANGE-1);41 42 dc->color=LTGREEN;43 GrPrint(dc,c->left+SLIDER_SPACING-FONT_WIDTH/2,44 c->top+SLIDER_SPACING+SLIDER_RANGE+3,45 "%d",s->s1*10/SLIDER_RANGE);46 GrPrint(dc,c->left+2*SLIDER_SPACING+1-FONT_WIDTH/2,47 c->top+SLIDER_SPACING+SLIDER_RANGE+3,48 "%d",s->s2*10/SLIDER_RANGE);49 GrPrint(dc,c->left+3*SLIDER_SPACING+2-FONT_WIDTH/2,50 c->top+SLIDER_SPACING+SLIDER_RANGE+3,51 "%d",s->s3*10/SLIDER_RANGE);52 GrRect(dc,c->left+SLIDER_SPACING-3,53 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s1-2 ,7,5);54 GrRect(dc,c->left+2*SLIDER_SPACING+1-3,55 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s2-2,7,5);56 GrRect(dc,c->left+3*SLIDER_SPACING+2-3,57 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s3-2,7,5);58 dc->color=GREEN;59 GrRect(dc,c->left+SLIDER_SPACING-2,60 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s1-1 ,5,3);61 GrRect(dc,c->left+2*SLIDER_SPACING+1-2,62 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s2-1,5,3);63 GrRect(dc,c->left+3*SLIDER_SPACING+2-2,64 c->top+SLIDER_SPACING+SLIDER_RANGE-1-s->s3-1,5,3);65}66 67U0 UpdateDerivedCtrlSlider(CCtrl *c)68{69 CSliderState *s=c->state;70 c->left=c->win_task->pix_width/2-(SLIDER_SPACING*4+3)/2;71 c->right=c->left+SLIDER_SPACING*4+3;72 c->top=c->win_task->pix_height/2-(SLIDER_SPACING*2+SLIDER_RANGE)/2;73 c->bottom=c->top+SLIDER_SPACING*2+SLIDER_RANGE;74 s->s1=ClampI64(s->s1,0,SLIDER_RANGE-1);75 s->s2=ClampI64(s->s2,0,SLIDER_RANGE-1);76 s->s3=ClampI64(s->s3,1,SLIDER_RANGE-1);77 s->arg1=pi/2.0*s->s1/SLIDER_RANGE;78 s->arg2=1.0*(s->s2-SLIDER_RANGE/2)/SLIDER_RANGE;79 s->scale=2.0*s->s3/SLIDER_RANGE;80}81 82U0 LeftClickSlider(CCtrl *c,I64 x,I64 y,Bool)83{84 CSliderState *s=c->state;85 if (x<c->left+(c->right-c->left)/3)86 s->s1=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING));87 else if (x<c->left+2*(c->right-c->left)/3)88 s->s2=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING));89 else90 s->s3=SLIDER_RANGE-1-(y-(c->top+SLIDER_SPACING));91 if (c->update_derived_vals)92 (*c->update_derived_vals)(c);93}94 95CCtrl *SliderNew()96{97 CCtrl *c=CAlloc(sizeof(CCtrl));98 c->win_task=Fs;99 c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_MS;100 c->type=CTRLT_GENERIC;101 c->state=&s;102 MemSet(&s,0,sizeof(s));103 c->draw_it=&DrawCtrlSlider;104 c->left_click=&LeftClickSlider;105 c->update_derived_vals=&UpdateDerivedCtrlSlider;106 QueIns(c,Fs->last_ctrl);107 TaskDerivedValsUpdate;108 return c;109}110 111U0 SliderDel(CCtrl *c)112{113 QueRem(c);114 Free(c);115}116 117 118 119 120 121<1>/* Graphics Not Rendered in HTML */122 123#define MAP_HEIGHT 2048124#define MAP_WIDTH 2048125 126#define TREES_NUM 256127 128I64 tree_x[TREES_NUM],tree_y[TREES_NUM];129 130class MPCtrl {131 I64 mp_cnt;132 I64 r[16];133 F64 a;134} mp;135 136I64 mp_not_done_flags;137 138U0 MPDrawIt(CTask *task)139{140 CDC *dc=DCAlias(gr.dc2,task);141 I64 i,lo=Gs->num*TREES_NUM/mp.mp_cnt,hi=(Gs->num+1)*TREES_NUM/mp.mp_cnt;142 MemCpy(dc->r,mp.r,sizeof(I64)*16);143 dc->flags|=DCF_TRANSFORMATION;144 for (i=lo;i<hi;i++)145 Sprite3ZB(dc,tree_x[i],146 tree_y[i],0,<tree>,mp.a);147 DCDel(dc);148 LBtr(&mp_not_done_flags,Gs->num);149}150 151U0 DrawIt(CTask *task,CDC *dc)152{153 I64 i,h,v;154 task->horz_scroll.min=-s.scale*MAP_HEIGHT*Sin(s.arg1);155 task->horz_scroll.max=s.scale*MAP_WIDTH*Cos(s.arg1)-task->pix_width;156 task->vert_scroll.min=0;157 task->vert_scroll.max=s.scale*(MAP_HEIGHT*Cos(s.arg1)+MAP_WIDTH*Sin(s.arg1))158 -task->pix_height;159 TaskDerivedValsUpdate(task);160 161 h=task->horz_scroll.pos;162 v=task->vert_scroll.pos;163 164 Mat4x4RotZ(dc->r,s.arg1);165 Mat4x4Scale(dc->r,s.scale);166 DCMat4x4Set(dc,dc->r);167 Mat4x4TranslationEqu(dc->r,-h,-v,0);168 MemCpy(mp.r,dc->r,sizeof(I64)*16);169 mp.a=s.arg2;170 171 mp_not_done_flags=1<<mp_cnt-1;172 for (i=0;i<mp.mp_cnt;i++)173 JobQue(&MPDrawIt,task,i);174 while (mp_not_done_flags)175 Yield;176 177 dc->flags|=DCF_TRANSFORMATION;178 dc->color=BROWN;179 dc->thick=4;180 GrLine3(dc,2,2,0,MAP_WIDTH-3,2,0);181 GrLine3(dc,2,MAP_HEIGHT-3,0,MAP_WIDTH-3,MAP_HEIGHT-3,0);182 GrLine3(dc,2,2,0,2,MAP_HEIGHT-3,0);183 GrLine3(dc,MAP_WIDTH-3,2,0,MAP_WIDTH-3,MAP_HEIGHT-3,0);184}185 186U0 Init()187{188 I64 i;189 for (i=0;i<TREES_NUM;i++) {190 tree_x[i]=RandU16%MAP_WIDTH;191 tree_y[i]=RandU16%MAP_HEIGHT;192 }193}194 195U0 TransformDemo(I64 _mp_cnt=mp_cnt)196{197 SettingsPush; //See SettingsPush198 Init;199 Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER200 -WIF_SELF_GRAB_SCROLL-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS;201 Fs->draw_it=&DrawIt;202 WinBorder(ON);203 DocCursor;204 DocClear;205 DocScroll;206 207 Fs->horz_scroll.pos=0;208 Fs->vert_scroll.pos=0;209 CCtrl *c=SliderNew;210 s.s1=0;211 s.s2=SLIDER_RANGE/2;212 s.s3=SLIDER_RANGE/2;213 214 MemSet(&mp,0,sizeof(MPCtrl));215 mp.mp_cnt=_mp_cnt;216 217 View;218 SliderDel(c);219 SettingsPop;220//You might want to save the original state of the scroll bars.221}222 223TransformDemo;224 