Subversion Repositories Kolibri OS

Rev

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: