Subversion Repositories Kolibri OS

Rev

Rev 8059 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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