Rev 8069 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5418 | IgorA | 1 | use32 |
8059 | IgorA | 2 | org 0 |
5418 | IgorA | 3 | db 'MENUET01' |
6120 | IgorA | 4 | dd 1,start,i_end,mem,stacktop,0,cur_dir_path |
5418 | IgorA | 5 | |
6 | include '../../../../../proc32.inc' |
||
7 | include '../../../../../macros.inc' |
||
6120 | IgorA | 8 | include '../../../../../KOSfuncs.inc' |
8408 | IgorA | 9 | include '../../../../../load_lib.mac' |
5418 | IgorA | 10 | include '../../../../../dll.inc' |
11 | include '../opengl_const.inc' |
||
6120 | IgorA | 12 | include 'fps.inc' |
5418 | IgorA | 13 | |
14 | @use_library |
||
15 | |||
16 | macro matr_cell c_funct,c_param,funct,param, dia |
||
17 | { |
||
18 | dia dword[esp-4*(c_param*(c_funct-funct)+(1+c_param-param))] |
||
19 | } |
||
20 | |||
8408 | IgorA | 21 | ;Макрос для параметров типа double (8 байт) |
8059 | IgorA | 22 | macro glpush GLDoubleVar { |
23 | push dword[GLDoubleVar+4] |
||
24 | push dword[GLDoubleVar] |
||
25 | } |
||
26 | |||
5418 | IgorA | 27 | align 4 |
28 | start: |
||
8408 | IgorA | 29 | load_library name_tgl, library_path, system_path, import_tinygl |
6288 | IgorA | 30 | cmp eax,SF_TERMINATE_PROCESS |
5418 | IgorA | 31 | jz button.exit |
32 | |||
6120 | IgorA | 33 | mcall SF_SET_EVENTS_MASK,0x27 |
5418 | IgorA | 34 | |
6120 | IgorA | 35 | stdcall [kosglMakeCurrent], 0,15,400,380,ctx1 |
36 | stdcall reshape, 400,380 |
||
5418 | IgorA | 37 | |
38 | ; *** init *** |
||
39 | stdcall [glLightfv], GL_LIGHT0, GL_POSITION, pos |
||
40 | stdcall [glEnable], GL_CULL_FACE |
||
41 | stdcall [glEnable], GL_LIGHTING |
||
42 | stdcall [glEnable], GL_LIGHT0 |
||
43 | stdcall [glEnable], GL_DEPTH_TEST |
||
44 | |||
45 | ; make the gears |
||
46 | stdcall [glGenLists],1 |
||
47 | mov [gear1],eax |
||
48 | stdcall [glNewList], eax, GL_COMPILE |
||
49 | stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red |
||
50 | stdcall gear, 1.0, 4.0, 1.0, 20, 0.7 |
||
51 | call [glEndList] |
||
52 | |||
53 | stdcall [glGenLists],1 |
||
54 | mov [gear2],eax |
||
55 | stdcall [glNewList], eax, GL_COMPILE |
||
56 | stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green |
||
57 | stdcall gear, 0.5, 2.0, 2.0, 10, 0.7 |
||
58 | call [glEndList] |
||
59 | |||
60 | stdcall [glGenLists],1 |
||
61 | mov [gear3],eax |
||
62 | stdcall [glNewList], eax, GL_COMPILE |
||
63 | stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue |
||
64 | stdcall gear, 1.3, 2.0, 0.5, 10, 0.7 |
||
65 | call [glEndList] |
||
66 | |||
67 | stdcall [glEnable], GL_NORMALIZE |
||
68 | ; *** end init *** |
||
69 | |||
70 | align 4 |
||
71 | red_win: |
||
72 | call draw_window |
||
8059 | IgorA | 73 | mcall SF_THREAD_INFO,procinfo,-1 |
74 | mov eax,dword[procinfo.box.height] |
||
75 | cmp eax,120 |
||
76 | jge @f |
||
77 | mov eax,120 ;min size |
||
78 | @@: |
||
8069 | IgorA | 79 | sub eax,43 |
8059 | IgorA | 80 | mov ebx,dword[procinfo.box.width] |
81 | cmp ebx,200 |
||
82 | jge @f |
||
83 | mov ebx,200 |
||
84 | @@: |
||
85 | sub ebx,10 |
||
86 | stdcall reshape, ebx,eax |
||
87 | .end0: |
||
5418 | IgorA | 88 | |
6120 | IgorA | 89 | align 16 |
5418 | IgorA | 90 | still: |
6120 | IgorA | 91 | call draw_3d |
8069 | IgorA | 92 | cmp dword[stop],1 |
93 | je @f |
||
94 | stdcall Fps, 365,4 |
||
6120 | IgorA | 95 | |
8069 | IgorA | 96 | mov dword[esp-4],eax |
97 | fild dword[esp-4] |
||
98 | fmul dword[a2] |
||
99 | fadd dword[a1] |
||
100 | fadd dword[angle] |
||
101 | fstp dword[angle] |
||
6120 | IgorA | 102 | |
8069 | IgorA | 103 | mcall SF_CHECK_EVENT |
104 | jmp .end0 |
||
105 | align 4 |
||
106 | @@: |
||
107 | mcall SF_WAIT_EVENT |
||
108 | .end0: |
||
5418 | IgorA | 109 | cmp al,1 |
110 | jz red_win |
||
111 | cmp al,2 |
||
112 | jz key |
||
113 | cmp al,3 |
||
114 | jz button |
||
115 | jmp still |
||
116 | |||
6120 | IgorA | 117 | align 4 |
118 | a1 dd 0.01 |
||
119 | a2 dd 0.3 |
||
120 | |||
5418 | IgorA | 121 | ; new window size or exposure |
122 | align 4 |
||
8059 | IgorA | 123 | proc reshape, width:dword, height:dword |
5418 | IgorA | 124 | locals |
125 | h dq ? |
||
126 | mh dq ? |
||
127 | endl |
||
128 | stdcall [glViewport], 0, 0, [width], [height] |
||
129 | stdcall [glMatrixMode], GL_PROJECTION |
||
130 | stdcall [glLoadIdentity] |
||
131 | fild dword[height] |
||
132 | fidiv dword[width] |
||
133 | fst qword[h] ;h = height / width |
||
134 | fchs |
||
135 | fstp qword[mh] |
||
8059 | IgorA | 136 | |
137 | glpush p6 |
||
138 | glpush p5 |
||
139 | glpush h |
||
140 | glpush mh |
||
141 | glpush p2 |
||
142 | glpush p1 |
||
143 | call [glFrustum] |
||
144 | |||
5418 | IgorA | 145 | stdcall [glMatrixMode], GL_MODELVIEW |
146 | stdcall [glLoadIdentity] |
||
147 | stdcall [glTranslatef], 0.0, 0.0, -40.0 |
||
148 | stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT |
||
149 | ret |
||
150 | endp |
||
151 | |||
152 | align 4 |
||
153 | p1 dq -1.0 |
||
154 | p2 dq 1.0 |
||
155 | p5 dq 5.0 |
||
156 | p6 dq 60.0 |
||
157 | |||
158 | align 4 |
||
159 | draw_window: |
||
160 | pushad |
||
6120 | IgorA | 161 | mcall SF_REDRAW,SSF_BEGIN_DRAW |
5418 | IgorA | 162 | |
7423 | leency | 163 | mcall SF_CREATE_WINDOW,(50 shl 16)+409,(30 shl 16)+425,0x33404040,,title1 |
8069 | IgorA | 164 | call [kosglSwapBuffers] |
5418 | IgorA | 165 | |
6120 | IgorA | 166 | ;Title |
7423 | leency | 167 | mcall SF_DRAW_TEXT,(338 shl 16)+4,0xc0c0c0,fps, fps.end-fps |
6200 | IgorA | 168 | mcall SF_DRAW_TEXT,(8 shl 16)+4,0xc0c0c0,title3,title3.end-title3 |
169 | ;mcall SF_DRAW_TEXT,(180 shl 16)+4,0xc0c0c0,title2,title2.end-title2 |
||
6120 | IgorA | 170 | |
171 | mcall SF_REDRAW,SSF_END_DRAW |
||
5418 | IgorA | 172 | popad |
173 | ret |
||
174 | |||
175 | align 4 |
||
176 | key: |
||
6120 | IgorA | 177 | mcall SF_GET_KEY |
5418 | IgorA | 178 | |
179 | cmp ah,27 ;Esc |
||
180 | je button.exit |
||
181 | |||
7421 | leency | 182 | cmp ah,43 ;+ |
5418 | IgorA | 183 | jne @f |
184 | fld dword[scale] |
||
185 | fdiv dword[delt_sc] |
||
186 | fstp dword[scale] |
||
8069 | IgorA | 187 | jmp still |
5418 | IgorA | 188 | @@: |
7421 | leency | 189 | cmp ah,61 ;= |
190 | jne @f |
||
191 | fld dword[scale] |
||
192 | fdiv dword[delt_sc] |
||
193 | fstp dword[scale] |
||
8069 | IgorA | 194 | jmp still |
7421 | leency | 195 | @@: |
5418 | IgorA | 196 | cmp ah,45 ;- |
197 | jne @f |
||
198 | fld dword[scale] |
||
199 | fmul dword[delt_sc] |
||
200 | fstp dword[scale] |
||
8069 | IgorA | 201 | jmp still |
5418 | IgorA | 202 | @@: |
8069 | IgorA | 203 | cmp ah,112 ;P |
204 | jne @f |
||
205 | xor dword[stop],1 |
||
206 | jmp still |
||
207 | @@: |
||
5418 | IgorA | 208 | cmp ah,178 ;Up |
209 | jne @f |
||
210 | fld dword[view_rotx] |
||
211 | fadd dword[delt_size] |
||
212 | fstp dword[view_rotx] |
||
8069 | IgorA | 213 | jmp still |
5418 | IgorA | 214 | @@: |
215 | cmp ah,177 ;Down |
||
216 | jne @f |
||
217 | fld dword[view_rotx] |
||
218 | fsub dword[delt_size] |
||
219 | fstp dword[view_rotx] |
||
8069 | IgorA | 220 | jmp still |
5418 | IgorA | 221 | @@: |
222 | cmp ah,176 ;Left |
||
223 | jne @f |
||
224 | fld dword[view_roty] |
||
225 | fadd dword[delt_size] |
||
226 | fstp dword[view_roty] |
||
8069 | IgorA | 227 | jmp still |
5418 | IgorA | 228 | @@: |
229 | cmp ah,179 ;Right |
||
230 | jne @f |
||
231 | fld dword[view_roty] |
||
232 | fsub dword[delt_size] |
||
233 | fstp dword[view_roty] |
||
8069 | IgorA | 234 | jmp still |
5418 | IgorA | 235 | @@: |
236 | jmp still |
||
237 | |||
238 | align 4 |
||
239 | button: |
||
6120 | IgorA | 240 | mcall SF_GET_BUTTON |
5418 | IgorA | 241 | cmp ah,1 |
242 | jne still |
||
243 | .exit: |
||
6120 | IgorA | 244 | mcall SF_TERMINATE_PROCESS |
5418 | IgorA | 245 | |
246 | |||
247 | align 4 |
||
6120 | IgorA | 248 | title1: db 'TinyGL in KolibriOS' |
249 | .end: db 0 |
||
8069 | IgorA | 250 | ;title2: db 'F full screen' |
251 | ;.end: db 0 |
||
252 | title3: db 'ESC - exit, Arrow keys - rotate, +/- zoom, P - pause' |
||
6120 | IgorA | 253 | .end: db 0 |
6200 | IgorA | 254 | fps: db 'FPS:' |
6120 | IgorA | 255 | .end: db 0 |
256 | |||
257 | align 16 |
||
5418 | IgorA | 258 | draw_3d: |
259 | stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT |
||
260 | |||
8069 | IgorA | 261 | call [glPushMatrix] |
7421 | leency | 262 | stdcall [glScalef], [scale], [scale], [scale] |
5418 | IgorA | 263 | stdcall [glRotatef], [view_rotx], 1.0, 0.0, 0.0 |
264 | stdcall [glRotatef], [view_roty], 0.0, 1.0, 0.0 |
||
265 | stdcall [glRotatef], [view_rotz], 0.0, 0.0, 1.0 |
||
266 | |||
8069 | IgorA | 267 | call [glPushMatrix] |
5418 | IgorA | 268 | stdcall [glTranslatef], -3.0, -2.0, 0.0 |
269 | stdcall [glRotatef], [angle], 0.0, 0.0, 1.0 |
||
270 | stdcall [glCallList],[gear1] |
||
8069 | IgorA | 271 | call [glPopMatrix] |
5418 | IgorA | 272 | |
8069 | IgorA | 273 | call [glPushMatrix] |
5418 | IgorA | 274 | stdcall [glTranslatef], 3.1, -2.0, 0.0 |
275 | push dword 1.0 |
||
276 | push dword 0.0 |
||
277 | push dword 0.0 |
||
278 | finit |
||
279 | fld1 |
||
280 | fld1 |
||
281 | faddp |
||
282 | fchs |
||
283 | fld dword[angle] |
||
284 | fmulp |
||
285 | fsub dword[an_9] |
||
286 | fstp dword[esp-4] |
||
287 | sub esp,4 |
||
288 | call [glRotatef] ;, -2.0*angle-9.0, 0.0, 0.0, 1.0 |
||
289 | stdcall [glCallList],[gear2] |
||
8069 | IgorA | 290 | call [glPopMatrix] |
5418 | IgorA | 291 | |
8069 | IgorA | 292 | call [glPushMatrix] |
5418 | IgorA | 293 | stdcall [glTranslatef], -3.1, 4.2, 0.0 |
294 | push dword 1.0 |
||
295 | push dword 0.0 |
||
296 | push dword 0.0 |
||
297 | finit |
||
298 | fld1 |
||
299 | fld1 |
||
300 | faddp |
||
301 | fchs |
||
302 | fld dword[angle] |
||
303 | fmulp |
||
304 | fsub dword[an_25] |
||
305 | fstp dword[esp-4] |
||
306 | sub esp,4 |
||
307 | call [glRotatef] ;, -2.0*angle-25.0, 0.0, 0.0, 1.0 |
||
308 | stdcall [glCallList],[gear3] |
||
8069 | IgorA | 309 | call [glPopMatrix] |
5418 | IgorA | 310 | |
8069 | IgorA | 311 | call [glPopMatrix] |
5418 | IgorA | 312 | |
8069 | IgorA | 313 | call [kosglSwapBuffers] |
5418 | IgorA | 314 | |
315 | ; count++; |
||
316 | ; if (count==limit) { |
||
317 | ; exit(0); |
||
6120 | IgorA | 318 | ret |
5418 | IgorA | 319 | |
320 | align 4 |
||
321 | an_9 dd 9.0 |
||
322 | an_25 dd 25.0 |
||
7421 | leency | 323 | scale dd 1.0 ;??? |
5418 | IgorA | 324 | delt_sc dd 0.85 ;??? |
325 | delt_size dd 5.0 |
||
326 | |||
327 | align 4 |
||
328 | pos dd 5.0, 5.0, 10.0, 0.0 |
||
329 | red dd 0.8, 0.1, 0.0, 1.0 |
||
330 | green dd 0.0, 0.8, 0.2, 1.0 |
||
331 | blue dd 0.2, 0.2, 1.0, 1.0 |
||
332 | |||
333 | view_rotx dd 20.0 |
||
334 | view_roty dd 30.0 |
||
335 | view_rotz dd 0.0 |
||
336 | gear1 dd ? |
||
337 | gear2 dd ? |
||
338 | gear3 dd ? |
||
339 | angle dd 0.0 |
||
340 | |||
341 | limit dd ? |
||
342 | count dd 1 |
||
8069 | IgorA | 343 | stop dd 0 ;пауза |
5418 | IgorA | 344 | |
345 | ; |
||
346 | ; Draw a gear wheel. You'll probably want to call this function when |
||
347 | ; building a display list since we do a lot of trig here. |
||
348 | ; |
||
349 | ; Input: inner_radius - radius of hole at center |
||
350 | ; outer_radius - radius at center of teeth |
||
351 | ; width - width of gear |
||
352 | ; teeth - number of teeth |
||
353 | ; tooth_depth - depth of tooth |
||
354 | ; |
||
355 | align 4 |
||
356 | proc gear uses eax ebx, inner_radius:dword, outer_radius:dword, width:dword, teeth:dword, tooth_depth:dword |
||
357 | locals |
||
358 | i dd ? |
||
359 | r0 dd ? |
||
360 | r1 dd ? |
||
361 | r2 dd ? |
||
362 | angle dd ? |
||
363 | da dd ? |
||
364 | u dd ? |
||
365 | v dd ? |
||
366 | endl |
||
367 | |||
368 | finit |
||
369 | mov eax,[inner_radius] |
||
370 | mov [r0],eax |
||
371 | fld1 |
||
372 | fld1 |
||
373 | faddp |
||
374 | fld dword[tooth_depth] |
||
375 | fdiv st0,st1 |
||
376 | fld dword[outer_radius] |
||
377 | fsub st0,st1 |
||
378 | fst dword[r1] ;r1 = outer_radius - tooth_depth/2.0 |
||
379 | fadd dword[tooth_depth] |
||
380 | fstp dword[r2] ;r2 = outer_radius + tooth_depth/2.0 |
||
381 | ffree st0 ;st0 = tooth_depth/2.0 |
||
382 | fincstp |
||
383 | ;st0 = 2.0 |
||
384 | |||
385 | fldpi |
||
386 | fidiv dword[teeth] |
||
387 | fdiv st0,st1 |
||
388 | fstp dword[da] ;da = M_PI / teeth / 2.0 |
||
389 | |||
390 | stdcall [glShadeModel], GL_FLAT |
||
391 | |||
392 | stdcall [glNormal3f], 0.0, 0.0, 1.0 |
||
393 | |||
394 | mov ebx,[teeth] |
||
395 | |||
396 | ; draw front face |
||
397 | stdcall [glBegin], GL_QUAD_STRIP |
||
398 | mov dword[i],0 |
||
399 | @@: |
||
400 | cmp dword[i],ebx |
||
401 | jg @f |
||
402 | finit |
||
403 | fld1 |
||
404 | fld1 |
||
405 | faddp |
||
406 | |||
407 | fldpi |
||
408 | fmul st0,st1 |
||
409 | fimul dword[i] |
||
410 | fidiv dword[teeth] |
||
411 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
412 | |||
413 | fld dword[width] |
||
414 | fdiv st0,st2 |
||
415 | matr_cell 4,3,1,3,fst |
||
416 | matr_cell 4,3,2,3,fst |
||
417 | matr_cell 4,3,3,3,fst |
||
418 | matr_cell 4,3,4,3,fstp |
||
419 | |||
420 | fld st0 |
||
421 | fsin |
||
422 | fmul dword[r0] |
||
423 | matr_cell 4,3,1,2,fst |
||
424 | matr_cell 4,3,3,2,fstp |
||
425 | fld st0 |
||
426 | fcos |
||
427 | fmul dword[r0] |
||
428 | matr_cell 4,3,1,1,fst |
||
429 | matr_cell 4,3,3,1,fstp |
||
430 | |||
431 | fld st0 |
||
432 | fsin |
||
433 | fmul dword[r1] |
||
434 | matr_cell 4,3,2,2,fstp |
||
435 | fld st0 |
||
436 | fcos |
||
437 | fmul dword[r1] |
||
438 | matr_cell 4,3,2,1,fstp |
||
439 | |||
440 | ;st0 = angle |
||
441 | fadd dword[da] |
||
442 | fadd dword[da] |
||
443 | fadd dword[da] |
||
444 | fld st0 |
||
445 | fsin |
||
446 | fmul dword[r1] |
||
447 | matr_cell 4,3,4,2,fstp |
||
448 | fcos |
||
449 | fmul dword[r1] |
||
450 | matr_cell 4,3,4,1,fstp |
||
451 | |||
452 | sub esp,48 ;12*4 |
||
453 | |||
454 | call [glVertex3f] ;, r0*cos(angle), r0*sin(angle), width*0.5 |
||
455 | call [glVertex3f] ;, r1*cos(angle), r1*sin(angle), width*0.5 |
||
456 | call [glVertex3f] ;, r0*cos(angle), r0*sin(angle), width*0.5 |
||
457 | call [glVertex3f] ;, r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 |
||
458 | inc dword[i] |
||
459 | jmp @b |
||
460 | @@: |
||
461 | call [glEnd] |
||
462 | |||
463 | ; draw front sides of teeth |
||
464 | stdcall [glBegin], GL_QUADS |
||
465 | mov dword[i],0 |
||
466 | @@: |
||
467 | cmp dword[i],ebx |
||
468 | jg @f |
||
469 | finit |
||
470 | fld1 |
||
471 | fld1 |
||
472 | faddp |
||
473 | |||
474 | fldpi |
||
475 | fmul st0,st1 |
||
476 | fimul dword[i] |
||
477 | fidiv dword[teeth] |
||
478 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
479 | |||
480 | fld dword[width] |
||
481 | fdiv st0,st2 |
||
482 | matr_cell 4,3,1,3,fst |
||
483 | matr_cell 4,3,2,3,fst |
||
484 | matr_cell 4,3,3,3,fst |
||
485 | matr_cell 4,3,4,3,fstp |
||
486 | |||
487 | fld st0 |
||
488 | fcos |
||
489 | fmul dword[r1] |
||
490 | matr_cell 4,3,1,1,fstp |
||
491 | fld st0 |
||
492 | fsin |
||
493 | fmul dword[r1] |
||
494 | matr_cell 4,3,1,2,fstp |
||
495 | |||
496 | fadd dword[da] ;st0 = angle+da |
||
497 | fld st0 |
||
498 | fcos |
||
499 | fmul dword[r2] |
||
500 | matr_cell 4,3,2,1,fstp |
||
501 | fld st0 |
||
502 | fsin |
||
503 | fmul dword[r2] |
||
504 | matr_cell 4,3,2,2,fstp |
||
505 | |||
506 | fadd dword[da] ;st0 = angle+2*da |
||
507 | fld st0 |
||
508 | fcos |
||
509 | fmul dword[r2] |
||
510 | matr_cell 4,3,3,1,fstp |
||
511 | fld st0 |
||
512 | fsin |
||
513 | fmul dword[r2] |
||
514 | matr_cell 4,3,3,2,fstp |
||
515 | |||
516 | fadd dword[da] ;st0 = angle+3*da |
||
517 | fld st0 |
||
518 | fcos |
||
519 | fmul dword[r1] |
||
520 | matr_cell 4,3,4,1,fstp |
||
521 | fsin |
||
522 | fmul dword[r1] |
||
523 | matr_cell 4,3,4,2,fstp |
||
524 | |||
525 | sub esp,48 ;12*4 |
||
526 | |||
527 | call [glVertex3f];, r1*cos(angle), r1*sin(angle), width*0.5 |
||
528 | call [glVertex3f];, r2*cos(angle+da), r2*sin(angle+da), width*0.5 |
||
529 | call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 |
||
530 | call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 |
||
531 | inc dword[i] |
||
532 | jmp @b |
||
533 | @@: |
||
534 | call [glEnd] |
||
535 | |||
536 | stdcall [glNormal3f], 0.0, 0.0, -1.0 |
||
537 | |||
538 | ; draw back face |
||
539 | stdcall [glBegin], GL_QUAD_STRIP |
||
540 | mov dword[i],0 |
||
541 | @@: |
||
542 | cmp dword[i],ebx |
||
543 | jg @f |
||
544 | finit |
||
545 | fld1 |
||
546 | fld1 |
||
547 | faddp |
||
548 | |||
549 | fldpi |
||
550 | fmul st0,st1 |
||
551 | fimul dword[i] |
||
552 | fidiv dword[teeth] |
||
553 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
554 | |||
555 | fld dword[width] |
||
556 | fdiv st0,st2 |
||
557 | fchs |
||
558 | matr_cell 4,3,1,3,fst |
||
559 | matr_cell 4,3,2,3,fst |
||
560 | matr_cell 4,3,3,3,fst |
||
561 | matr_cell 4,3,4,3,fstp |
||
562 | |||
563 | fld st0 |
||
564 | fsin |
||
565 | fld st0 |
||
566 | fmul dword[r1] |
||
567 | matr_cell 4,3,1,2,fstp |
||
568 | fmul dword[r0] |
||
569 | matr_cell 4,3,2,2,fst |
||
570 | matr_cell 4,3,4,2,fstp |
||
571 | |||
572 | fld st0 |
||
573 | fcos |
||
574 | fld st0 |
||
575 | fmul dword[r1] |
||
576 | matr_cell 4,3,1,1,fstp |
||
577 | fmul dword[r0] |
||
578 | matr_cell 4,3,2,1,fst |
||
579 | matr_cell 4,3,4,1,fstp |
||
580 | |||
581 | ;st0 = angle |
||
582 | fadd dword[da] |
||
583 | fadd dword[da] |
||
584 | fadd dword[da] |
||
585 | fld st0 |
||
586 | fsin |
||
587 | fmul dword[r1] |
||
588 | matr_cell 4,3,3,2,fstp |
||
589 | fcos |
||
590 | fmul dword[r1] |
||
591 | matr_cell 4,3,3,1,fstp |
||
592 | |||
593 | sub esp,48 ;12*4 |
||
594 | |||
595 | call [glVertex3f];, r1*cos(angle), r1*sin(angle), -width*0.5 |
||
596 | call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5 |
||
597 | call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 |
||
598 | call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5 |
||
599 | inc dword[i] |
||
600 | jmp @b |
||
601 | @@: |
||
602 | call [glEnd] |
||
603 | |||
604 | ; draw back sides of teeth |
||
605 | stdcall [glBegin], GL_QUADS |
||
606 | mov dword[i],0 |
||
607 | @@: |
||
608 | cmp dword[i],ebx |
||
609 | jg @f |
||
610 | finit |
||
611 | fld1 |
||
612 | fld1 |
||
613 | faddp |
||
614 | |||
615 | fldpi |
||
616 | fmul st0,st1 |
||
617 | fimul dword[i] |
||
618 | fidiv dword[teeth] |
||
619 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
620 | |||
621 | fld dword[width] |
||
622 | fdiv st0,st2 |
||
623 | fchs |
||
624 | matr_cell 4,3,1,3,fst |
||
625 | matr_cell 4,3,2,3,fst |
||
626 | matr_cell 4,3,3,3,fst |
||
627 | matr_cell 4,3,4,3,fstp |
||
628 | |||
629 | fld st0 |
||
630 | fcos |
||
631 | fmul dword[r1] |
||
632 | matr_cell 4,3,4,1,fstp |
||
633 | fld st0 |
||
634 | fsin |
||
635 | fmul dword[r1] |
||
636 | matr_cell 4,3,4,2,fstp |
||
637 | |||
638 | fadd dword[da] ;st0 = angle+da |
||
639 | fld st0 |
||
640 | fcos |
||
641 | fmul dword[r2] |
||
642 | matr_cell 4,3,3,1,fstp |
||
643 | fld st0 |
||
644 | fsin |
||
645 | fmul dword[r2] |
||
646 | matr_cell 4,3,3,2,fstp |
||
647 | |||
648 | fadd dword[da] ;st0 = angle+2*da |
||
649 | fld st0 |
||
650 | fcos |
||
651 | fmul dword[r2] |
||
652 | matr_cell 4,3,2,1,fstp |
||
653 | fld st0 |
||
654 | fsin |
||
655 | fmul dword[r2] |
||
656 | matr_cell 4,3,2,2,fstp |
||
657 | |||
658 | fadd dword[da] ;st0 = angle+3*da |
||
659 | fld st0 |
||
660 | fcos |
||
661 | fmul dword[r1] |
||
662 | matr_cell 4,3,1,1,fstp |
||
663 | fsin |
||
664 | fmul dword[r1] |
||
665 | matr_cell 4,3,1,2,fstp |
||
666 | |||
667 | sub esp,48 ;12*4 |
||
668 | |||
669 | call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 |
||
670 | call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 |
||
671 | call [glVertex3f];, r2*cos(angle+da), r2*sin(angle+da), -width*0.5 |
||
672 | call [glVertex3f];, r1*cos(angle), r1*sin(angle), -width*0.5 |
||
673 | inc dword[i] |
||
674 | jmp @b |
||
675 | @@: |
||
676 | call [glEnd] |
||
677 | |||
678 | ; draw outward faces of teeth |
||
679 | stdcall [glBegin], GL_QUAD_STRIP |
||
680 | mov dword[i],0 |
||
681 | @@: |
||
682 | cmp dword[i],ebx |
||
683 | jg @f |
||
684 | finit |
||
685 | fld1 |
||
686 | fld1 |
||
687 | faddp |
||
688 | |||
689 | fldpi |
||
690 | fmul st0,st1 |
||
691 | fimul dword[i] |
||
692 | fidiv dword[teeth] |
||
693 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
694 | |||
695 | fld dword[width] |
||
696 | fdiv st0,st2 |
||
697 | matr_cell 12,3, 1,3,fst |
||
698 | matr_cell 12,3, 4,3,fst |
||
699 | matr_cell 12,3, 7,3,fst |
||
700 | matr_cell 12,3,10,3,fst |
||
701 | fchs |
||
702 | matr_cell 12,3, 2,3,fst |
||
703 | matr_cell 12,3, 5,3,fst |
||
704 | matr_cell 12,3, 8,3,fst |
||
705 | matr_cell 12,3,11,3,fstp |
||
706 | fldz |
||
707 | matr_cell 12,3, 3,3,fst |
||
708 | matr_cell 12,3, 6,3,fst |
||
709 | matr_cell 12,3, 9,3,fst |
||
710 | matr_cell 12,3,12,3,fstp |
||
711 | |||
712 | fld st0 |
||
713 | fsin |
||
714 | matr_cell 12,3, 6,2,fst |
||
715 | matr_cell 12,3,12,2,fst |
||
716 | fmul dword[r1] |
||
717 | matr_cell 12,3, 1,2,fst |
||
718 | matr_cell 12,3, 2,2,fstp |
||
719 | |||
720 | fld st0 |
||
721 | fcos |
||
722 | matr_cell 12,3, 6,1,fst |
||
723 | matr_cell 12,3,12,1,fst |
||
724 | fmul dword[r1] |
||
725 | matr_cell 12,3, 1,1,fst |
||
726 | matr_cell 12,3, 2,1,fstp |
||
727 | |||
728 | fadd dword[da] ;st0 = angle+da |
||
729 | fld st0 |
||
730 | fcos |
||
731 | fmul dword[r2] |
||
732 | matr_cell 12,3, 4,1,fst |
||
733 | matr_cell 12,3, 5,1,fst |
||
734 | matr_cell 12,3, 1,1,fsub |
||
735 | fstp dword[u] |
||
736 | |||
737 | fld st0 |
||
738 | fsin |
||
739 | fmul dword[r2] |
||
740 | matr_cell 12,3, 4,2,fst |
||
741 | matr_cell 12,3, 5,2,fst |
||
742 | matr_cell 12,3, 1,2,fsub |
||
743 | fst dword[v] |
||
744 | |||
745 | fmul st0,st0 |
||
746 | fld dword[u] |
||
747 | fmul st0,st0 |
||
748 | faddp |
||
749 | fsqrt ;st0 = len |
||
750 | fld dword[u] |
||
751 | fdiv st0,st1 |
||
752 | fchs |
||
753 | matr_cell 12,3, 3,2,fstp |
||
754 | fld dword[v] |
||
755 | fdiv st0,st1 |
||
756 | matr_cell 12,3, 3,1,fstp |
||
757 | ffree st0 ;len |
||
758 | fincstp |
||
759 | |||
760 | fadd dword[da] ;st0 = angle+2*da |
||
761 | fld st0 |
||
762 | fcos |
||
763 | fmul dword[r2] |
||
764 | matr_cell 12,3, 7,1,fst |
||
765 | matr_cell 12,3, 8,1,fstp |
||
766 | fld st0 |
||
767 | fsin |
||
768 | fmul dword[r2] |
||
769 | matr_cell 12,3, 7,2,fst |
||
770 | matr_cell 12,3, 8,2,fstp |
||
771 | |||
772 | fadd dword[da] ;st0 = angle+3*da |
||
773 | fld st0 |
||
774 | fcos |
||
775 | fmul dword[r1] |
||
776 | matr_cell 12,3,10,1,fst |
||
777 | matr_cell 12,3,11,1,fst |
||
778 | matr_cell 12,3, 7,1,fsub |
||
779 | fchs |
||
780 | matr_cell 12,3, 9,2,fstp ;-u |
||
781 | |||
782 | fsin |
||
783 | fmul dword[r1] |
||
784 | matr_cell 12,3,10,2,fst |
||
785 | matr_cell 12,3,11,2,fst |
||
786 | matr_cell 12,3, 7,2,fsub |
||
787 | matr_cell 12,3, 9,1,fstp ;v |
||
788 | |||
789 | sub esp,144 ;12*12 |
||
790 | |||
791 | call [glVertex3f];, r1*cos(angle), r1*sin(angle), width*0.5 |
||
792 | call [glVertex3f];, r1*cos(angle), r1*sin(angle), -width*0.5 |
||
793 | ;u = r2*cos(angle+da) - r1*cos(angle) |
||
794 | ;v = r2*sin(angle+da) - r1*sin(angle) |
||
795 | ;len = sqrt( u*u + v*v ) |
||
796 | ;u /= len |
||
797 | ;v /= len |
||
798 | call [glNormal3f];, v, -u, 0.0 |
||
799 | call [glVertex3f];, r2*cos(angle+da), r2*sin(angle+da), width*0.5 |
||
800 | call [glVertex3f];, r2*cos(angle+da), r2*sin(angle+da), -width*0.5 |
||
801 | call [glNormal3f];, cos(angle), sin(angle), 0.0 |
||
802 | call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 |
||
803 | call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 |
||
804 | ;u = r1*cos(angle+3*da) - r2*cos(angle+2*da) |
||
805 | ;v = r1*sin(angle+3*da) - r2*sin(angle+2*da) |
||
806 | call [glNormal3f];, v, -u, 0.0 |
||
807 | call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 |
||
808 | call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 |
||
809 | call [glNormal3f];, cos(angle), sin(angle), 0.0 |
||
810 | inc dword[i] |
||
811 | jmp @b |
||
812 | @@: |
||
813 | |||
814 | finit |
||
815 | fld1 |
||
816 | fld1 |
||
817 | faddp |
||
818 | |||
819 | fld dword[width] |
||
820 | fdiv st0,st1 |
||
821 | matr_cell 2,3,1,3,fst |
||
822 | fchs |
||
823 | matr_cell 2,3,2,3,fstp |
||
824 | fldz |
||
825 | matr_cell 2,3,1,2,fst |
||
826 | matr_cell 2,3,2,2,fstp |
||
827 | fldz |
||
828 | fcos |
||
829 | fmul dword[r1] |
||
830 | matr_cell 2,3,1,1,fst |
||
831 | matr_cell 2,3,2,1,fstp |
||
832 | |||
833 | sub esp,24 |
||
834 | |||
835 | call [glVertex3f];, r1*cos(0), r1*sin(0), width*0.5 |
||
836 | call [glVertex3f];, r1*cos(0), r1*sin(0), -width*0.5 |
||
837 | |||
838 | call [glEnd] |
||
839 | |||
840 | |||
841 | stdcall [glShadeModel], GL_SMOOTH |
||
842 | |||
843 | ; draw inside radius cylinder |
||
844 | stdcall [glBegin], GL_QUAD_STRIP |
||
845 | mov dword[i],0 |
||
6126 | IgorA | 846 | finit |
5418 | IgorA | 847 | @@: |
848 | cmp dword[i],ebx |
||
849 | jg @f |
||
850 | fld1 |
||
851 | fld1 |
||
852 | faddp |
||
853 | |||
854 | fldpi |
||
6126 | IgorA | 855 | fmul st0,st1 |
5418 | IgorA | 856 | fimul dword[i] |
857 | fidiv dword[teeth] |
||
858 | fst dword[angle] ;angle = i * 2.0*M_PI / teeth |
||
859 | |||
860 | fldz |
||
861 | matr_cell 3,3,1,3,fstp |
||
862 | fld dword[width] |
||
863 | fdiv st0,st2 |
||
864 | matr_cell 3,3,3,3,fst |
||
865 | fchs |
||
866 | matr_cell 3,3,2,3,fstp |
||
867 | |||
868 | fld st0 |
||
869 | fsin |
||
870 | fchs |
||
871 | matr_cell 3,3,1,2,fst |
||
872 | fchs |
||
873 | fmul dword[r0] |
||
874 | matr_cell 3,3,2,2,fst |
||
875 | matr_cell 3,3,3,2,fstp |
||
876 | |||
877 | fcos |
||
878 | fchs |
||
879 | matr_cell 3,3,1,1,fst |
||
880 | fchs |
||
881 | fmul dword[r0] |
||
882 | matr_cell 3,3,2,1,fst |
||
883 | matr_cell 3,3,3,1,fstp |
||
884 | |||
885 | sub esp,36 ;12*3 |
||
886 | |||
887 | call [glNormal3f];, -cos(angle), -sin(angle), 0.0 |
||
888 | call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5 |
||
889 | call [glVertex3f];, r0*cos(angle), r0*sin(angle), width*0.5 |
||
6126 | IgorA | 890 | ffree st0 ;2.0 |
891 | fincstp |
||
5418 | IgorA | 892 | inc dword[i] |
893 | jmp @b |
||
894 | @@: |
||
895 | call [glEnd] |
||
896 | |||
897 | ret |
||
898 | endp |
||
899 | |||
900 | |||
901 | |||
902 | ;-------------------------------------------------- |
||
903 | align 4 |
||
8408 | IgorA | 904 | import_tinygl: |
5418 | IgorA | 905 | |
906 | macro E_LIB n |
||
907 | { |
||
908 | n dd sz_#n |
||
909 | } |
||
910 | include '../export.inc' |
||
911 | dd 0,0 |
||
912 | macro E_LIB n |
||
913 | { |
||
914 | sz_#n db `n,0 |
||
915 | } |
||
916 | include '../export.inc' |
||
917 | |||
918 | ;-------------------------------------------------- |
||
6737 | leency | 919 | system_path db '/sys/lib/' |
5418 | IgorA | 920 | name_tgl db 'tinygl.obj',0 |
921 | ;-------------------------------------------------- |
||
922 | |||
923 | align 16 |
||
924 | i_end: |
||
8059 | IgorA | 925 | ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext |
926 | ;sizeof.TinyGLContext = 28 |
||
927 | procinfo process_information |
||
8408 | IgorA | 928 | cur_dir_path rb 4096 |
929 | library_path rb 4096 |
||
5418 | IgorA | 930 | rb 4096 |
931 | stacktop: |
||
932 | mem: |