Subversion Repositories Kolibri OS

Rev

Rev 6120 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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