Subversion Repositories Kolibri OS

Rev

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