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: |