Subversion Repositories Kolibri OS

Rev

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