Rev 5388 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5388 | IgorA | 1 | ; |
2 | ; Функции нужные для отображения воксельного объекта через библиотеку tinygl |
||
3 | ; |
||
4 | |||
5393 | IgorA | 5 | normal_gran_z1 equ -1.0 |
6 | normal_gran_z0 equ 1.0 |
||
7 | normal_gran_y1 equ -1.0 |
||
8 | normal_gran_y0 equ 1.0 |
||
9 | normal_gran_x1 equ -1.0 |
||
10 | normal_gran_x0 equ 1.0 |
||
11 | |||
5388 | IgorA | 12 | ;марос коректировки вектора нормали для закругления крайних вокселей |
13 | macro normal_gran param, gran |
||
14 | { |
||
15 | mov dword[param],0.0 |
||
16 | bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran |
||
17 | jnc @f |
||
18 | mov dword[param],normal_gran_#gran |
||
19 | @@: |
||
20 | } |
||
21 | |||
22 | ;марос коректировки вектора нормали для диагонального сглаживания вокселей |
||
23 | ;диагональные воксели после этого сглаживания смотрятся не степеньками а сплошной плоскостью |
||
24 | macro normal_gran_2 param, gran2, gran1 |
||
25 | { |
||
26 | bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran2 |
||
27 | jnc @f |
||
28 | mov dword[param],normal_gran_#gran1 ;поставить 0.0 в dword[param] если нужно не сильное сглаживание |
||
29 | @@: |
||
30 | } |
||
31 | |||
32 | vox_ogl_x0 equ 0 |
||
33 | vox_ogl_y0 equ 4 |
||
34 | vox_ogl_z0 equ 8 |
||
35 | vox_ogl_x1 equ 12 |
||
36 | vox_ogl_y1 equ 16 |
||
37 | vox_ogl_z1 equ 20 |
||
38 | vox_ogl_color equ 24 |
||
39 | vox_ogl_zoom equ 28 |
||
40 | vox_ogl_planes equ 30 |
||
41 | vox_ogl_size equ 34 |
||
42 | |||
43 | def_del_planes equ 63 |
||
44 | |||
45 | ;номера битов, которые указывают на то какие есть соседние воксели |
||
46 | ;нужно для отсечения внутренних граней между соседними вокселями |
||
47 | ;а еще нужно для задания векторов нормалей, что-бы воксели были сглаженными (закругленными) |
||
48 | vox_ogl_gran_z1 equ 1 |
||
49 | vox_ogl_gran_z0 equ 0 |
||
50 | vox_ogl_gran_y1 equ 3 |
||
51 | vox_ogl_gran_y0 equ 2 |
||
52 | vox_ogl_gran_x1 equ 5 |
||
53 | vox_ogl_gran_x0 equ 4 |
||
54 | vox_ogl_gran_y1z1 equ 7 |
||
55 | vox_ogl_gran_y0z0 equ 6 |
||
56 | vox_ogl_gran_x1z1 equ 9 |
||
57 | vox_ogl_gran_x0z0 equ 8 |
||
58 | vox_ogl_gran_y0z1 equ 11 |
||
59 | vox_ogl_gran_y1z0 equ 10 |
||
60 | vox_ogl_gran_x0z1 equ 13 |
||
61 | vox_ogl_gran_x1z0 equ 12 |
||
62 | vox_ogl_gran_x1y1 equ 15 |
||
63 | vox_ogl_gran_x0y0 equ 14 |
||
64 | vox_ogl_gran_x0y1 equ 17 |
||
65 | vox_ogl_gran_x1y0 equ 16 |
||
66 | |||
67 | |||
68 | vox_offs_tree_table equ 4 |
||
69 | vox_offs_data equ 12 |
||
70 | |||
71 | |||
72 | ;description: |
||
73 | ; создание воксельного объекта для показа в 3d графике |
||
74 | ;input: |
||
75 | align 4 |
||
76 | proc buf_vox_obj_create_3d, v_obj:dword, p_mem:dword, coord_x:dword,\ |
||
77 | coord_y:dword, k_scale:dword |
||
78 | cmp [k_scale],0 |
||
79 | jl .end_f |
||
80 | pushad |
||
81 | mov edi,[p_mem] |
||
82 | mov dword[edi],0 ;count voxels |
||
83 | |||
84 | mov ecx,[k_scale] |
||
85 | mov ebx,[coord_x] |
||
86 | mov edx,[coord_y] |
||
87 | mov edi,[v_obj] |
||
88 | add edi,vox_offs_data |
||
89 | xor esi,esi |
||
90 | stdcall create_sub_vox_obj_3d, [v_obj],[p_mem],[k_scale] |
||
91 | |||
92 | ; (1) |
||
93 | ; сортировка вокселей по координатам x,y,z |
||
94 | ; |
||
95 | mov edi,[p_mem] |
||
96 | mov ecx,dword[edi] |
||
97 | ;inc ecx |
||
98 | add edi,4 |
||
99 | sub edi,vox_ogl_size |
||
100 | stdcall pole_fl_sort, edi, ecx |
||
101 | |||
102 | ;отсечение соседних граней для ускорения отрисовки |
||
103 | mov edi,[p_mem] |
||
104 | mov ecx,dword[edi] |
||
105 | dec ecx |
||
106 | add edi,4 |
||
107 | |||
108 | align 4 |
||
109 | .cycle_0: |
||
110 | mov ax,word[edi+vox_ogl_zoom] |
||
111 | cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom] |
||
112 | jne @f |
||
113 | mov eax,dword[edi+vox_ogl_x0] |
||
114 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0] |
||
115 | jne @f |
||
116 | mov eax,dword[edi+vox_ogl_y0] |
||
117 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0] |
||
118 | jne @f |
||
119 | mov eax,dword[edi+vox_ogl_z0] |
||
120 | inc eax ;увеличиваем высоту, для будущего сравнения |
||
121 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0] |
||
122 | jne @f |
||
123 | ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем |
||
124 | btr dword[edi+vox_ogl_planes],vox_ogl_gran_z1 ;верх отсекаем |
||
125 | btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_z0 ;низ отсекаем |
||
126 | @@: |
||
127 | add edi,vox_ogl_size |
||
128 | loop .cycle_0 |
||
129 | |||
130 | push ebx edx esi |
||
131 | ;диагональные соседние воксели |
||
132 | mov edi,[p_mem] |
||
133 | mov ecx,dword[edi] |
||
134 | dec ecx |
||
135 | add edi,4 |
||
136 | |||
137 | mov ebx,ecx |
||
138 | ;inc ebx ;??? cmp esi,ebx -> jge @f |
||
139 | imul ebx,vox_ogl_size |
||
140 | add ebx,edi |
||
141 | |||
142 | align 4 |
||
143 | .cycle_3: |
||
144 | mov dx,word[edi+vox_ogl_zoom] |
||
145 | mov esi,edi |
||
146 | align 4 |
||
147 | .cycle_4: |
||
148 | add esi,vox_ogl_size |
||
149 | cmp esi,ebx |
||
150 | jg @f |
||
151 | cmp dx,word[esi+vox_ogl_zoom] |
||
152 | jne .cycle_4 |
||
153 | |||
154 | mov eax,dword[edi+vox_ogl_x0] |
||
155 | cmp eax,dword[esi+vox_ogl_x0] |
||
156 | jne @f |
||
157 | mov eax,dword[edi+vox_ogl_y0] |
||
158 | inc eax ; y+ |
||
159 | cmp eax,dword[esi+vox_ogl_y0] |
||
160 | jl @f |
||
161 | jne .cycle_4 |
||
162 | mov eax,dword[edi+vox_ogl_z0] |
||
163 | inc eax ; z+ |
||
164 | cmp eax,dword[esi+vox_ogl_z0] |
||
165 | jne .cycle_4 |
||
166 | ;если по высоте воксели различается на 1 координату |
||
167 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z1 ; |
||
168 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z0 ; |
||
169 | @@: |
||
170 | add edi,vox_ogl_size |
||
171 | loop .cycle_3 |
||
172 | |||
173 | ; *** |
||
174 | mov edi,[p_mem] |
||
175 | mov ecx,dword[edi] |
||
176 | dec ecx |
||
177 | add edi,4 |
||
178 | |||
179 | align 4 |
||
180 | .cycle_7: |
||
181 | mov dx,word[edi+vox_ogl_zoom] |
||
182 | mov esi,edi |
||
183 | align 4 |
||
184 | .cycle_8: |
||
185 | add esi,vox_ogl_size |
||
186 | cmp esi,ebx |
||
187 | jg @f |
||
188 | cmp dx,word[esi+vox_ogl_zoom] |
||
189 | jne .cycle_8 |
||
190 | |||
191 | mov eax,dword[edi+vox_ogl_x0] |
||
192 | cmp eax,dword[esi+vox_ogl_x0] |
||
193 | jne @f |
||
194 | mov eax,dword[edi+vox_ogl_y0] |
||
195 | inc eax ; y+ |
||
196 | cmp eax,dword[esi+vox_ogl_y0] |
||
197 | jl @f |
||
198 | jne .cycle_8 |
||
199 | mov eax,dword[edi+vox_ogl_z0] |
||
200 | dec eax ; z- |
||
201 | cmp eax,dword[esi+vox_ogl_z0] |
||
202 | jne .cycle_8 |
||
203 | ;если по высоте воксели различается на 1 координату |
||
204 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z0 ; |
||
205 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z1 ; |
||
206 | @@: |
||
207 | add edi,vox_ogl_size |
||
208 | loop .cycle_7 |
||
209 | pop esi edx ebx |
||
210 | |||
211 | ; (2) |
||
212 | ; сортировка вокселей по координатам x,z,y |
||
213 | ; |
||
214 | mov edi,[p_mem] |
||
215 | mov ecx,dword[edi] |
||
216 | add edi,4 |
||
217 | sub edi,vox_ogl_size |
||
218 | stdcall pole_fl_sort_zxy, edi, ecx |
||
219 | |||
220 | ;отсечение соседних граней для ускорения отрисовки |
||
221 | mov edi,[p_mem] |
||
222 | mov ecx,dword[edi] |
||
223 | dec ecx |
||
224 | add edi,4 |
||
225 | |||
226 | align 4 |
||
227 | .cycle_1: |
||
228 | mov ax,word[edi+vox_ogl_zoom] |
||
229 | cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom] |
||
230 | jne @f |
||
231 | mov eax,dword[edi+vox_ogl_z0] |
||
232 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0] |
||
233 | jne @f |
||
234 | mov eax,dword[edi+vox_ogl_x0] |
||
235 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0] |
||
236 | jne @f |
||
237 | mov eax,dword[edi+vox_ogl_y0] |
||
238 | inc eax ;увеличиваем высоту, для будущего сравнения |
||
239 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0] |
||
240 | jne @f |
||
241 | ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем |
||
242 | btr dword[edi+vox_ogl_planes],vox_ogl_gran_y1 ;верх отсекаем |
||
243 | btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_y0 ;низ отсекаем |
||
244 | @@: |
||
245 | add edi,vox_ogl_size |
||
246 | loop .cycle_1 |
||
247 | |||
248 | push ebx edx esi |
||
249 | ;диагональные соседние воксели |
||
250 | mov edi,[p_mem] |
||
251 | mov ecx,dword[edi] |
||
252 | dec ecx |
||
253 | add edi,4 |
||
254 | |||
255 | mov ebx,ecx |
||
256 | ;inc ebx ;??? cmp esi,ebx -> jge @f |
||
257 | imul ebx,vox_ogl_size |
||
258 | add ebx,edi |
||
259 | |||
260 | align 4 |
||
261 | .cycle_11: |
||
262 | mov dx,word[edi+vox_ogl_zoom] |
||
263 | mov esi,edi |
||
264 | align 4 |
||
265 | .cycle_12: |
||
266 | add esi,vox_ogl_size |
||
267 | cmp esi,ebx |
||
268 | jg @f |
||
269 | cmp dx,word[esi+vox_ogl_zoom] |
||
270 | jne .cycle_12 |
||
271 | |||
272 | mov eax,dword[edi+vox_ogl_z0] |
||
273 | cmp eax,dword[esi+vox_ogl_z0] |
||
274 | jne @f |
||
275 | mov eax,dword[edi+vox_ogl_x0] |
||
276 | inc eax ; x+ |
||
277 | cmp eax,dword[esi+vox_ogl_x0] |
||
278 | jl @f |
||
279 | jne .cycle_12 |
||
280 | mov eax,dword[edi+vox_ogl_y0] |
||
281 | inc eax ; y+ |
||
282 | cmp eax,dword[esi+vox_ogl_y0] |
||
283 | jne .cycle_12 |
||
284 | ;если по высоте воксели различается на 1 координату |
||
285 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y1 ; |
||
286 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y0 ; |
||
287 | @@: |
||
288 | add edi,vox_ogl_size |
||
289 | loop .cycle_11 |
||
290 | |||
291 | ; *** |
||
292 | mov edi,[p_mem] |
||
293 | mov ecx,dword[edi] |
||
294 | dec ecx |
||
295 | add edi,4 |
||
296 | |||
297 | align 4 |
||
298 | .cycle_15: |
||
299 | mov dx,word[edi+vox_ogl_zoom] |
||
300 | mov esi,edi |
||
301 | align 4 |
||
302 | .cycle_16: |
||
303 | add esi,vox_ogl_size |
||
304 | cmp esi,ebx |
||
305 | jg @f |
||
306 | cmp dx,word[esi+vox_ogl_zoom] |
||
307 | jne .cycle_16 |
||
308 | |||
309 | mov eax,dword[edi+vox_ogl_z0] |
||
310 | cmp eax,dword[esi+vox_ogl_z0] |
||
311 | jne @f |
||
312 | mov eax,dword[edi+vox_ogl_x0] |
||
313 | inc eax ; x+ |
||
314 | cmp eax,dword[esi+vox_ogl_x0] |
||
315 | jl @f |
||
316 | jne .cycle_16 |
||
317 | mov eax,dword[edi+vox_ogl_y0] |
||
318 | dec eax ; y- |
||
319 | cmp eax,dword[esi+vox_ogl_y0] |
||
320 | jne .cycle_16 |
||
321 | ;если по высоте воксели различается на 1 координату |
||
322 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y0 ; |
||
323 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y1 ; |
||
324 | @@: |
||
325 | add edi,vox_ogl_size |
||
326 | loop .cycle_15 |
||
327 | |||
328 | pop esi edx ebx |
||
329 | |||
330 | ; (3) |
||
331 | ; сортировка вокселей по координатам y,z,x |
||
332 | ; |
||
333 | mov edi,[p_mem] |
||
334 | mov ecx,dword[edi] |
||
335 | add edi,4 |
||
336 | sub edi,vox_ogl_size |
||
337 | stdcall pole_fl_sort_yzx, edi, ecx |
||
338 | |||
339 | ;отсечение соседних граней для ускорения отрисовки |
||
340 | mov edi,[p_mem] |
||
341 | mov ecx,dword[edi] |
||
342 | dec ecx |
||
343 | add edi,4 |
||
344 | |||
345 | align 4 |
||
346 | .cycle_2: |
||
347 | mov ax,word[edi+vox_ogl_zoom] |
||
348 | cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom] |
||
349 | jne @f |
||
350 | mov eax,dword[edi+vox_ogl_y0] |
||
351 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0] |
||
352 | jne @f |
||
353 | mov eax,dword[edi+vox_ogl_z0] |
||
354 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0] |
||
355 | jne @f |
||
356 | mov eax,dword[edi+vox_ogl_x0] |
||
357 | inc eax ;увеличиваем высоту, для будущего сравнения |
||
358 | cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0] |
||
359 | jne @f |
||
360 | ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем |
||
361 | btr dword[edi+vox_ogl_planes],vox_ogl_gran_x1 ;верх отсекаем |
||
362 | btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_x0 ;низ отсекаем |
||
363 | @@: |
||
364 | add edi,vox_ogl_size |
||
365 | loop .cycle_2 |
||
366 | |||
367 | push ebx edx esi |
||
368 | ;диагональные соседние воксели |
||
369 | mov edi,[p_mem] |
||
370 | mov ecx,dword[edi] |
||
371 | dec ecx |
||
372 | add edi,4 |
||
373 | |||
374 | mov ebx,ecx |
||
375 | ;inc ebx ;??? cmp esi,ebx -> jge @f |
||
376 | imul ebx,vox_ogl_size |
||
377 | add ebx,edi |
||
378 | |||
379 | align 4 |
||
380 | .cycle_5: |
||
381 | mov dx,word[edi+vox_ogl_zoom] |
||
382 | mov esi,edi |
||
383 | align 4 |
||
384 | .cycle_6: |
||
385 | add esi,vox_ogl_size |
||
386 | cmp esi,ebx |
||
387 | jg @f |
||
388 | cmp dx,word[esi+vox_ogl_zoom] |
||
389 | jne .cycle_6 |
||
390 | |||
391 | mov eax,dword[edi+vox_ogl_y0] |
||
392 | cmp eax,dword[esi+vox_ogl_y0] |
||
393 | jne @f |
||
394 | mov eax,dword[edi+vox_ogl_z0] |
||
395 | inc eax ; z+ |
||
396 | cmp eax,dword[esi+vox_ogl_z0] |
||
397 | jl @f |
||
398 | jne .cycle_6 |
||
399 | mov eax,dword[edi+vox_ogl_x0] |
||
400 | inc eax ; x+ |
||
401 | cmp eax,dword[esi+vox_ogl_x0] |
||
402 | jne .cycle_6 |
||
403 | ;если по высоте воксели различается на 1 координату |
||
404 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1z1 ; |
||
405 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0z0 ; |
||
406 | @@: |
||
407 | add edi,vox_ogl_size |
||
408 | loop .cycle_5 |
||
409 | |||
410 | ; *** |
||
411 | mov edi,[p_mem] |
||
412 | mov ecx,dword[edi] |
||
413 | dec ecx |
||
414 | add edi,4 |
||
415 | |||
416 | align 4 |
||
417 | .cycle_9: |
||
418 | mov dx,word[edi+vox_ogl_zoom] |
||
419 | mov esi,edi |
||
420 | align 4 |
||
421 | .cycle_10: |
||
422 | add esi,vox_ogl_size |
||
423 | cmp esi,ebx |
||
424 | jg @f |
||
425 | cmp dx,word[esi+vox_ogl_zoom] |
||
426 | jne .cycle_10 |
||
427 | |||
428 | mov eax,dword[edi+vox_ogl_y0] |
||
429 | cmp eax,dword[esi+vox_ogl_y0] |
||
430 | jne @f |
||
431 | mov eax,dword[edi+vox_ogl_z0] |
||
432 | inc eax ; z+ |
||
433 | cmp eax,dword[esi+vox_ogl_z0] |
||
434 | jl @f |
||
435 | jne .cycle_10 |
||
436 | mov eax,dword[edi+vox_ogl_x0] |
||
437 | dec eax ; x- |
||
438 | cmp eax,dword[esi+vox_ogl_x0] |
||
439 | jne .cycle_10 |
||
440 | ;если по высоте воксели различается на 1 координату |
||
441 | bts dword[edi+vox_ogl_planes],vox_ogl_gran_x0z1 ; |
||
442 | bts dword[esi+vox_ogl_planes],vox_ogl_gran_x1z0 ; |
||
443 | @@: |
||
444 | add edi,vox_ogl_size |
||
445 | loop .cycle_9 |
||
446 | |||
447 | pop esi edx ebx |
||
448 | |||
449 | ;преобразование координат во float |
||
450 | stdcall vox_obj_3d_recalc, [p_mem] |
||
451 | popad |
||
452 | .end_f: |
||
453 | ret |
||
454 | endp |
||
455 | |||
456 | ;input: |
||
457 | ; ebx - coord_x |
||
458 | ; edx - coord_y |
||
459 | ; esi - coord_z |
||
460 | ; ecx - уровень текушего узла |
||
461 | ; edi - указатель на данные воксельного объекта |
||
462 | align 4 |
||
463 | proc create_sub_vox_obj_3d, v_obj:dword, p_mem:dword, k_scale:dword |
||
464 | cmp byte[edi+3],0 ;смотрим есть ли поддеревья |
||
465 | je .sub_trees |
||
466 | |||
467 | ;добавляем узел, который содержит дочерние узлы, при этом дочерние мелкие и не попадают на вывод |
||
468 | cmp ecx,0 |
||
469 | jne @f |
||
470 | push ecx |
||
471 | mov eax,[p_mem] |
||
472 | inc dword[eax] ;увеличиваем счетчик вокселей на 1 |
||
473 | mov eax,[eax] |
||
474 | imul eax,vox_ogl_size ;умножаем на размер данных о вокселе |
||
475 | add eax,4-vox_ogl_size ;число вокселей 4 байта |
||
476 | add eax,[p_mem] |
||
477 | mov [eax+vox_ogl_x0],ebx |
||
478 | mov [eax+vox_ogl_y0],edx |
||
479 | mov [eax+vox_ogl_z0],esi |
||
480 | sub ecx,[k_scale] |
||
481 | mov word[eax+vox_ogl_zoom],cx |
||
482 | mov dword[eax+vox_ogl_planes],def_del_planes |
||
483 | mov ecx,dword[edi] |
||
484 | and ecx,0xffffff |
||
485 | mov [eax+vox_ogl_color],ecx |
||
486 | pop ecx |
||
487 | @@: |
||
488 | |||
489 | ;рекурсивный перебор поддеревьев |
||
490 | push edx |
||
491 | ;вход внутрь узла |
||
492 | dec ecx |
||
493 | |||
494 | mov eax,1 |
||
495 | cmp ecx,1 |
||
496 | jl @f |
||
497 | shl eax,cl |
||
498 | @@: |
||
499 | |||
500 | add edx,eax ;коректировка высоты под воксель нижнего уровня |
||
501 | |||
502 | mov ah,byte[edi+3] |
||
503 | add edi,4 |
||
504 | mov al,8 |
||
505 | .cycle: |
||
506 | bt ax,8 ;тестируем только ah |
||
507 | jnc .c_next |
||
508 | push eax ebx edx esi |
||
509 | stdcall vox_corect_coords_pl, [v_obj],1 |
||
510 | stdcall create_sub_vox_obj_3d, [v_obj], [p_mem],[k_scale] |
||
511 | pop esi edx ebx eax |
||
512 | .c_next: |
||
513 | shr ah,1 |
||
514 | dec al |
||
515 | jnz .cycle |
||
516 | ;выход из узла |
||
517 | inc ecx |
||
518 | pop edx |
||
519 | jmp .end_f |
||
520 | .sub_trees: |
||
521 | cmp ecx,0 |
||
522 | jl .end_0 ;не рисуем очень маленькие воксели |
||
523 | |||
524 | ;cmp ecx,1 |
||
525 | ;jl @f |
||
526 | ;квадрат больше текущего масштаба |
||
527 | ;stdcall vox_draw_square_1g, [buf_i],[buf_z],eax |
||
528 | ;jmp .end_0 |
||
529 | ;@@: |
||
530 | ;квадрат текущего масштаба |
||
531 | push ecx |
||
532 | mov eax,[p_mem] |
||
533 | inc dword[eax] ;увеличиваем счетчик вокселей на 1 |
||
534 | mov eax,[eax] |
||
535 | imul eax,vox_ogl_size ;умножаем на размер данных о вокселе |
||
536 | add eax,4-vox_ogl_size ;число вокселей 4 байта |
||
537 | add eax,[p_mem] |
||
538 | mov [eax+vox_ogl_x0],ebx |
||
539 | mov [eax+vox_ogl_y0],edx |
||
540 | mov [eax+vox_ogl_z0],esi |
||
541 | cmp ecx,1 |
||
542 | jl @f |
||
543 | ;квадрат больше текущего масштаба |
||
544 | shr dword[eax+vox_ogl_x0],cl |
||
545 | shr dword[eax+vox_ogl_y0],cl |
||
546 | shr dword[eax+vox_ogl_z0],cl |
||
547 | @@: |
||
548 | sub ecx,[k_scale] |
||
549 | mov word[eax+vox_ogl_zoom],cx |
||
550 | mov dword[eax+vox_ogl_planes],def_del_planes |
||
551 | mov ecx,dword[edi] |
||
552 | and ecx,0xffffff |
||
553 | mov [eax+vox_ogl_color],ecx |
||
554 | pop ecx |
||
555 | .end_0: |
||
556 | add edi,4 |
||
557 | .end_f: |
||
558 | ret |
||
559 | endp |
||
560 | |||
561 | ;description: |
||
562 | ; в OpenGL требуются координаты float |
||
563 | ; преобразование координат из int во float, |
||
564 | align 4 |
||
565 | proc vox_obj_3d_recalc uses eax ebx ecx, p_mem:dword |
||
566 | |||
567 | ;получаем координаты в пределах от 0 до 1 в дробном виде |
||
568 | mov eax,[p_mem] |
||
569 | mov ecx,dword[eax] |
||
570 | add eax,4 |
||
571 | |||
572 | finit |
||
573 | align 4 |
||
574 | @@: |
||
575 | fild word[eax+vox_ogl_zoom] |
||
576 | fld1 ; размер кубической грани без учета масштаба |
||
577 | fscale ; st0=1*2^st1 или размер кубической грани с учетом масштаба |
||
578 | fxch |
||
579 | |||
580 | ;coord x |
||
581 | fild dword[eax+vox_ogl_x0] |
||
582 | fscale |
||
583 | fst dword[eax+vox_ogl_x0] |
||
5393 | IgorA | 584 | fadd st0,st2 ;добавляем ко второй точке размер масштабированной кубической грани |
5388 | IgorA | 585 | fstp dword[eax+vox_ogl_x1] |
586 | ;coord y |
||
587 | fild dword[eax+vox_ogl_y0] |
||
588 | fscale |
||
589 | fst dword[eax+vox_ogl_y0] |
||
590 | fadd st0,st2 |
||
591 | fstp dword[eax+vox_ogl_y1] |
||
592 | ;coord z |
||
593 | fild dword[eax+vox_ogl_z0] |
||
594 | fscale |
||
595 | fst dword[eax+vox_ogl_z0] |
||
596 | fadd st0,st2 |
||
597 | fstp dword[eax+vox_ogl_z1] |
||
598 | |||
599 | ;goto next voxel |
||
600 | add eax,vox_ogl_size |
||
601 | ffree st0 |
||
602 | fincstp |
||
603 | ffree st0 |
||
604 | fincstp |
||
605 | loop @b |
||
606 | |||
607 | ;отнимаем от каждой координаты по 0.5 для центровки объекта по центру экрана |
||
608 | mov eax,[p_mem] |
||
609 | mov ecx,dword[eax] |
||
610 | add eax,4 |
||
611 | fld1 ;st0=1 |
||
612 | fchs ;st0=-1 |
||
613 | fld1 ;st0=1 st1=-1 |
||
614 | fscale ;st0=1*2^st1 или 1*2^-1=1/2=0.5 |
||
615 | align 4 |
||
616 | @@: |
||
617 | ;coord x |
||
618 | fld dword[eax+vox_ogl_x0] |
||
5393 | IgorA | 619 | fsub st0,st1 ;-0.5 |
5388 | IgorA | 620 | fstp dword[eax+vox_ogl_x0] |
621 | fld dword[eax+vox_ogl_x1] |
||
5393 | IgorA | 622 | fsub st0,st1 ;-0.5 |
5388 | IgorA | 623 | fstp dword[eax+vox_ogl_x1] |
624 | ;coord y |
||
625 | fld dword[eax+vox_ogl_y0] |
||
626 | fsub st0,st1 ;-0.5 |
||
627 | fstp dword[eax+vox_ogl_y0] |
||
628 | fld dword[eax+vox_ogl_y1] |
||
629 | fsub st0,st1 ;-0.5 |
||
630 | fstp dword[eax+vox_ogl_y1] |
||
631 | ;coord z |
||
632 | fld dword[eax+vox_ogl_z0] |
||
633 | fsub st0,st1 ;-0.5 |
||
634 | fstp dword[eax+vox_ogl_z0] |
||
635 | fld dword[eax+vox_ogl_z1] |
||
636 | fsub st0,st1 ;-0.5 |
||
637 | fstp dword[eax+vox_ogl_z1] |
||
638 | |||
639 | ;goto next voxel |
||
640 | add eax,vox_ogl_size |
||
641 | loop @b |
||
642 | ffree st0 |
||
643 | fincstp |
||
644 | ffree st0 |
||
645 | fincstp |
||
646 | ret |
||
647 | endp |
||
648 | |||
649 | ;Сортировка вектора a[1..n] методом Флойда |
||
650 | align 4 |
||
651 | proc pole_fl_sort, a:dword, n:dword |
||
652 | pushad |
||
653 | mov ecx,dword[a] |
||
654 | ;Формировать исходное частично упорядоченное дерево |
||
655 | mov eax,dword[n] |
||
656 | shr eax,1 |
||
657 | @@: ;for(i=n/2; i>=2; i--) |
||
658 | stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n) |
||
659 | dec eax |
||
660 | cmp eax,2 |
||
661 | jge @b |
||
662 | ;Выполнить процедуру всплытия Флойда для каждого поддерева |
||
663 | mov eax,dword[n] |
||
664 | @@: ;for(i=n; i>=2; i--){ |
||
665 | stdcall pole_fl_surface, ecx,1,eax ;(a,1,i) |
||
666 | ;Поместить найденный максимальный элемент в конец списка |
||
667 | stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i] |
||
668 | dec eax |
||
669 | cmp eax,2 |
||
670 | jge @b |
||
671 | popad |
||
672 | ret |
||
673 | endp |
||
674 | |||
675 | ;Процедура всплытия Флойда по дереву a[1..k] |
||
676 | align 4 |
||
677 | proc pole_fl_surface, a:dword, i:dword, k:dword |
||
678 | pushad |
||
679 | ;edx -> ... |
||
680 | ;edi -> m |
||
681 | ;esi -> j |
||
682 | mov eax,dword[a] |
||
683 | mov ebx,dword[i] |
||
684 | mov ecx,dword[k] |
||
685 | |||
686 | stdcall copy_cell, eax, -1,ebx ;copy=a[i]; |
||
687 | mov edi,ebx |
||
688 | shl edi,1 ;m=2*i где edi=m |
||
689 | .cycle_b: ;while (m<=k) { |
||
690 | cmp edi,ecx |
||
691 | jg .cycle_e |
||
692 | jne @f ;if (m==k) j=m; |
||
693 | mov esi,edi |
||
694 | jmp .else_e |
||
695 | @@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m; |
||
696 | mov edx,edi |
||
697 | inc edx |
||
698 | stdcall pole_compare_cells_bm, eax, edi,edx |
||
699 | cmp dl,0 |
||
700 | je @f |
||
701 | mov esi,edi |
||
702 | jmp .else_e |
||
703 | @@: ;else j=m+1; |
||
704 | mov esi,edi |
||
705 | inc esi |
||
706 | .else_e: |
||
707 | |||
708 | ;if (pole_compare_cells_bm(a[j],copy)) { |
||
709 | stdcall pole_compare_cells_bm, eax, esi,-1 |
||
710 | cmp dl,0 |
||
711 | je .cycle_e ;} else break; //выход из цикла |
||
712 | |||
713 | stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; |
||
714 | mov ebx,esi ;i=j; |
||
715 | mov edi,ebx |
||
716 | shl edi,1 ;m=2*i; |
||
717 | |||
718 | jmp .cycle_b |
||
719 | .cycle_e: |
||
720 | |||
721 | ;значения многих регистров уже не важны т. к. конец функции |
||
722 | stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; |
||
723 | |||
724 | popad |
||
725 | ret |
||
726 | endp |
||
727 | |||
728 | ;output: |
||
729 | ; dl |
||
730 | align 4 |
||
731 | proc pole_compare_cells_bm uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword |
||
732 | |||
733 | mov eax,[i0] ;eax -> cell[i0] |
||
734 | imul eax,vox_ogl_size |
||
735 | add eax,[p_mem] |
||
736 | |||
737 | mov ebx,[i1] ;ebx -> cell[i1] |
||
738 | cmp ebx,0 |
||
739 | jl .copy |
||
740 | imul ebx,vox_ogl_size |
||
741 | add ebx,[p_mem] |
||
742 | jmp @f |
||
743 | .copy: |
||
744 | mov ebx,mem_copy_32 |
||
745 | @@: |
||
746 | |||
747 | mov cx,word[ebx+vox_ogl_zoom] ;zoom |
||
748 | cmp word[eax+vox_ogl_zoom],cx |
||
749 | jle @f ;zoom0>zoom1 |
||
750 | mov dl,1 |
||
751 | jmp .fun_e |
||
752 | @@: |
||
753 | jne .r_0 ;if zoom0 |
||
754 | |||
755 | mov ecx,dword[ebx+vox_ogl_x0] ;coord x |
||
756 | cmp dword[eax+vox_ogl_x0],ecx |
||
757 | jle @f ;x0>x1 |
||
758 | mov dl,1 |
||
759 | jmp .fun_e |
||
760 | @@: |
||
761 | jne .r_0 ;if x0 |
||
762 | |||
763 | mov ecx,dword[ebx+vox_ogl_y0] ;coord y |
||
764 | cmp dword[eax+vox_ogl_y0],ecx |
||
765 | jle @f ;y0>y1 |
||
766 | mov dl,1 |
||
767 | jmp .fun_e |
||
768 | @@: |
||
769 | jne .r_0 ;if y0 |
||
770 | |||
771 | mov ecx,dword[ebx+vox_ogl_z0] ;coord z |
||
772 | cmp dword[eax+vox_ogl_z0],ecx |
||
773 | jle @f ;z0>z1 |
||
774 | mov dl,1 |
||
775 | jmp .fun_e |
||
776 | @@: |
||
777 | |||
778 | .r_0: |
||
779 | xor dl,dl |
||
780 | .fun_e: |
||
781 | ret |
||
782 | endp |
||
783 | |||
784 | if 0 ;пока не нужно, но работало правильно |
||
785 | ;Сортировка вектора a[1..n] методом Флойда |
||
786 | align 4 |
||
787 | proc pole_fl_sort_xzy, a:dword, n:dword |
||
788 | pushad |
||
789 | mov ecx,dword[a] |
||
790 | ;Формировать исходное частично упорядоченное дерево |
||
791 | mov eax,dword[n] |
||
792 | shr eax,1 |
||
793 | @@: ;for(i=n/2; i>=2; i--) |
||
794 | stdcall pole_fl_surface_xzy, ecx,eax,[n] ;(a,i,n) |
||
795 | dec eax |
||
796 | cmp eax,2 |
||
797 | jge @b |
||
798 | ;Выполнить процедуру всплытия Флойда для каждого поддерева |
||
799 | mov eax,dword[n] |
||
800 | @@: ;for(i=n; i>=2; i--){ |
||
801 | stdcall pole_fl_surface_xzy, ecx,1,eax ;(a,1,i) |
||
802 | ;Поместить найденный максимальный элемент в конец списка |
||
803 | stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i] |
||
804 | dec eax |
||
805 | cmp eax,2 |
||
806 | jge @b |
||
807 | popad |
||
808 | ret |
||
809 | endp |
||
810 | |||
811 | ;Процедура всплытия Флойда по дереву a[1..k] |
||
812 | align 4 |
||
813 | proc pole_fl_surface_xzy, a:dword, i:dword, k:dword |
||
814 | pushad |
||
815 | ;edx -> ... |
||
816 | ;edi -> m |
||
817 | ;esi -> j |
||
818 | mov eax,dword[a] |
||
819 | mov ebx,dword[i] |
||
820 | mov ecx,dword[k] |
||
821 | |||
822 | stdcall copy_cell, eax, -1,ebx ;copy=a[i]; |
||
823 | mov edi,ebx |
||
824 | shl edi,1 ;m=2*i где edi=m |
||
825 | .cycle_b: ;while (m<=k) { |
||
826 | cmp edi,ecx |
||
827 | jg .cycle_e |
||
828 | jne @f ;if (m==k) j=m; |
||
829 | mov esi,edi |
||
830 | jmp .else_e |
||
831 | @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m; |
||
832 | mov edx,edi |
||
833 | inc edx |
||
834 | stdcall pole_compare_bm_xzy, eax, edi,edx |
||
835 | cmp dl,0 |
||
836 | je @f |
||
837 | mov esi,edi |
||
838 | jmp .else_e |
||
839 | @@: ;else j=m+1; |
||
840 | mov esi,edi |
||
841 | inc esi |
||
842 | .else_e: |
||
843 | |||
844 | ;if (pole_compare_bm_xzy(a[j],copy)) { |
||
845 | stdcall pole_compare_bm_xzy, eax, esi,-1 |
||
846 | cmp dl,0 |
||
847 | je .cycle_e ;} else break; //выход из цикла |
||
848 | |||
849 | stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; |
||
850 | mov ebx,esi ;i=j; |
||
851 | mov edi,ebx |
||
852 | shl edi,1 ;m=2*i; |
||
853 | |||
854 | jmp .cycle_b |
||
855 | .cycle_e: |
||
856 | |||
857 | ;значения многих регистров уже не важны т. к. конец функции |
||
858 | stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; |
||
859 | |||
860 | popad |
||
861 | ret |
||
862 | endp |
||
863 | |||
864 | ;output: |
||
865 | ; dl |
||
866 | align 4 |
||
867 | proc pole_compare_bm_xzy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword |
||
868 | |||
869 | mov eax,[i0] ;eax -> cell[i0] |
||
870 | imul eax,vox_ogl_size |
||
871 | add eax,[p_mem] |
||
872 | |||
873 | mov ebx,[i1] ;ebx -> cell[i1] |
||
874 | cmp ebx,0 |
||
875 | jl .copy |
||
876 | imul ebx,vox_ogl_size |
||
877 | add ebx,[p_mem] |
||
878 | jmp @f |
||
879 | .copy: |
||
880 | mov ebx,mem_copy_32 |
||
881 | @@: |
||
882 | |||
883 | mov cx,word[ebx+vox_ogl_zoom] ;zoom |
||
884 | cmp word[eax+vox_ogl_zoom],cx |
||
885 | jle @f ;zoom0>zoom1 |
||
886 | mov dl,1 |
||
887 | jmp .fun_e |
||
888 | @@: |
||
889 | jne .r_0 ;if zoom0 |
||
890 | |||
891 | mov ecx,dword[ebx+vox_ogl_x0] ;coord x |
||
892 | cmp dword[eax+vox_ogl_x0],ecx |
||
893 | jle @f ;x0>x1 |
||
894 | mov dl,1 |
||
895 | jmp .fun_e |
||
896 | @@: |
||
897 | jne .r_0 ;if x0 |
||
898 | |||
899 | mov ecx,dword[ebx+vox_ogl_z0] ;coord z |
||
900 | cmp dword[eax+vox_ogl_z0],ecx |
||
901 | jle @f ;z0>z1 |
||
902 | mov dl,1 |
||
903 | jmp .fun_e |
||
904 | @@: |
||
905 | jne .r_0 ;if z0 |
||
906 | |||
907 | mov ecx,dword[ebx+vox_ogl_y0] ;coord y |
||
908 | cmp dword[eax+vox_ogl_y0],ecx |
||
909 | jle @f ;y0>y1 |
||
910 | mov dl,1 |
||
911 | jmp .fun_e |
||
912 | @@: |
||
913 | |||
914 | .r_0: |
||
915 | xor dl,dl |
||
916 | .fun_e: |
||
917 | ret |
||
918 | endp |
||
919 | end if |
||
920 | |||
921 | ;Сортировка вектора a[1..n] методом Флойда |
||
922 | align 4 |
||
923 | proc pole_fl_sort_zxy, a:dword, n:dword |
||
924 | pushad |
||
925 | mov ecx,dword[a] |
||
926 | ;Формировать исходное частично упорядоченное дерево |
||
927 | mov eax,dword[n] |
||
928 | shr eax,1 |
||
929 | @@: ;for(i=n/2; i>=2; i--) |
||
930 | stdcall pole_fl_surface_zxy, ecx,eax,[n] ;(a,i,n) |
||
931 | dec eax |
||
932 | cmp eax,2 |
||
933 | jge @b |
||
934 | ;Выполнить процедуру всплытия Флойда для каждого поддерева |
||
935 | mov eax,dword[n] |
||
936 | @@: ;for(i=n; i>=2; i--){ |
||
937 | stdcall pole_fl_surface_zxy, ecx,1,eax ;(a,1,i) |
||
938 | ;Поместить найденный максимальный элемент в конец списка |
||
939 | stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i] |
||
940 | dec eax |
||
941 | cmp eax,2 |
||
942 | jge @b |
||
943 | popad |
||
944 | ret |
||
945 | endp |
||
946 | |||
947 | ;Процедура всплытия Флойда по дереву a[1..k] |
||
948 | align 4 |
||
949 | proc pole_fl_surface_zxy, a:dword, i:dword, k:dword |
||
950 | pushad |
||
951 | ;edx -> ... |
||
952 | ;edi -> m |
||
953 | ;esi -> j |
||
954 | mov eax,dword[a] |
||
955 | mov ebx,dword[i] |
||
956 | mov ecx,dword[k] |
||
957 | |||
958 | stdcall copy_cell, eax, -1,ebx ;copy=a[i]; |
||
959 | mov edi,ebx |
||
960 | shl edi,1 ;m=2*i где edi=m |
||
961 | .cycle_b: ;while (m<=k) { |
||
962 | cmp edi,ecx |
||
963 | jg .cycle_e |
||
964 | jne @f ;if (m==k) j=m; |
||
965 | mov esi,edi |
||
966 | jmp .else_e |
||
967 | @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m; |
||
968 | mov edx,edi |
||
969 | inc edx |
||
970 | stdcall pole_compare_bm_zxy, eax, edi,edx |
||
971 | cmp dl,0 |
||
972 | je @f |
||
973 | mov esi,edi |
||
974 | jmp .else_e |
||
975 | @@: ;else j=m+1; |
||
976 | mov esi,edi |
||
977 | inc esi |
||
978 | .else_e: |
||
979 | |||
980 | ;if (pole_compare_bm_xzy(a[j],copy)) { |
||
981 | stdcall pole_compare_bm_zxy, eax, esi,-1 |
||
982 | cmp dl,0 |
||
983 | je .cycle_e ;} else break; //выход из цикла |
||
984 | |||
985 | stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; |
||
986 | mov ebx,esi ;i=j; |
||
987 | mov edi,ebx |
||
988 | shl edi,1 ;m=2*i; |
||
989 | |||
990 | jmp .cycle_b |
||
991 | .cycle_e: |
||
992 | |||
993 | ;значения многих регистров уже не важны т. к. конец функции |
||
994 | stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; |
||
995 | |||
996 | popad |
||
997 | ret |
||
998 | endp |
||
999 | |||
1000 | ;output: |
||
1001 | ; dl |
||
1002 | align 4 |
||
1003 | proc pole_compare_bm_zxy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword |
||
1004 | |||
1005 | mov eax,[i0] ;eax -> cell[i0] |
||
1006 | imul eax,vox_ogl_size |
||
1007 | add eax,[p_mem] |
||
1008 | |||
1009 | mov ebx,[i1] ;ebx -> cell[i1] |
||
1010 | cmp ebx,0 |
||
1011 | jl .copy |
||
1012 | imul ebx,vox_ogl_size |
||
1013 | add ebx,[p_mem] |
||
1014 | jmp @f |
||
1015 | .copy: |
||
1016 | mov ebx,mem_copy_32 |
||
1017 | @@: |
||
1018 | |||
1019 | mov cx,word[ebx+vox_ogl_zoom] ;zoom |
||
1020 | cmp word[eax+vox_ogl_zoom],cx |
||
1021 | jle @f ;zoom0>zoom1 |
||
1022 | mov dl,1 |
||
1023 | jmp .fun_e |
||
1024 | @@: |
||
1025 | jne .r_0 ;if zoom0 |
||
1026 | |||
1027 | mov ecx,dword[ebx+vox_ogl_z0] ;coord z |
||
1028 | cmp dword[eax+vox_ogl_z0],ecx |
||
1029 | jle @f ;z0>z1 |
||
1030 | mov dl,1 |
||
1031 | jmp .fun_e |
||
1032 | @@: |
||
1033 | jne .r_0 ;if z0 |
||
1034 | |||
1035 | mov ecx,dword[ebx+vox_ogl_x0] ;coord x |
||
1036 | cmp dword[eax+vox_ogl_x0],ecx |
||
1037 | jle @f ;x0>x1 |
||
1038 | mov dl,1 |
||
1039 | jmp .fun_e |
||
1040 | @@: |
||
1041 | jne .r_0 ;if x0 |
||
1042 | |||
1043 | mov ecx,dword[ebx+vox_ogl_y0] ;coord y |
||
1044 | cmp dword[eax+vox_ogl_y0],ecx |
||
1045 | jle @f ;y0>y1 |
||
1046 | mov dl,1 |
||
1047 | jmp .fun_e |
||
1048 | @@: |
||
1049 | |||
1050 | .r_0: |
||
1051 | xor dl,dl |
||
1052 | .fun_e: |
||
1053 | ret |
||
1054 | endp |
||
1055 | |||
1056 | ;Сортировка вектора a[1..n] методом Флойда |
||
1057 | align 4 |
||
1058 | proc pole_fl_sort_yzx, a:dword, n:dword |
||
1059 | pushad |
||
1060 | mov ecx,dword[a] |
||
1061 | ;Формировать исходное частично упорядоченное дерево |
||
1062 | mov eax,dword[n] |
||
1063 | shr eax,1 |
||
1064 | @@: ;for(i=n/2; i>=2; i--) |
||
1065 | stdcall pole_fl_surface_yzx, ecx,eax,[n] ;(a,i,n) |
||
1066 | dec eax |
||
1067 | cmp eax,2 |
||
1068 | jge @b |
||
1069 | ;Выполнить процедуру всплытия Флойда для каждого поддерева |
||
1070 | mov eax,dword[n] |
||
1071 | @@: ;for(i=n; i>=2; i--){ |
||
1072 | stdcall pole_fl_surface_yzx, ecx,1,eax ;(a,1,i) |
||
1073 | ;Поместить найденный максимальный элемент в конец списка |
||
1074 | stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i] |
||
1075 | dec eax |
||
1076 | cmp eax,2 |
||
1077 | jge @b |
||
1078 | popad |
||
1079 | ret |
||
1080 | endp |
||
1081 | |||
1082 | ;Процедура всплытия Флойда по дереву a[1..k] |
||
1083 | align 4 |
||
1084 | proc pole_fl_surface_yzx, a:dword, i:dword, k:dword |
||
1085 | pushad |
||
1086 | ;edx -> ... |
||
1087 | ;edi -> m |
||
1088 | ;esi -> j |
||
1089 | mov eax,dword[a] |
||
1090 | mov ebx,dword[i] |
||
1091 | mov ecx,dword[k] |
||
1092 | |||
1093 | stdcall copy_cell, eax, -1,ebx ;copy=a[i]; |
||
1094 | mov edi,ebx |
||
1095 | shl edi,1 ;m=2*i где edi=m |
||
1096 | .cycle_b: ;while (m<=k) { |
||
1097 | cmp edi,ecx |
||
1098 | jg .cycle_e |
||
1099 | jne @f ;if (m==k) j=m; |
||
1100 | mov esi,edi |
||
1101 | jmp .else_e |
||
1102 | @@: ;else if (pole_compare_bm_yzx(a[m],a[m+1])) j=m; |
||
1103 | mov edx,edi |
||
1104 | inc edx |
||
1105 | stdcall pole_compare_bm_yzx, eax, edi,edx |
||
1106 | cmp dl,0 |
||
1107 | je @f |
||
1108 | mov esi,edi |
||
1109 | jmp .else_e |
||
1110 | @@: ;else j=m+1; |
||
1111 | mov esi,edi |
||
1112 | inc esi |
||
1113 | .else_e: |
||
1114 | |||
1115 | ;if (pole_compare_bm_yzx(a[j],copy)) { |
||
1116 | stdcall pole_compare_bm_yzx, eax, esi,-1 |
||
1117 | cmp dl,0 |
||
1118 | je .cycle_e ;} else break; //выход из цикла |
||
1119 | |||
1120 | stdcall copy_cell, eax, ebx,esi ;a[i]=a[j]; |
||
1121 | mov ebx,esi ;i=j; |
||
1122 | mov edi,ebx |
||
1123 | shl edi,1 ;m=2*i; |
||
1124 | |||
1125 | jmp .cycle_b |
||
1126 | .cycle_e: |
||
1127 | |||
1128 | ;значения многих регистров уже не важны т. к. конец функции |
||
1129 | stdcall copy_cell, eax, ebx,-1 ;a[i]=copy; |
||
1130 | |||
1131 | popad |
||
1132 | ret |
||
1133 | endp |
||
1134 | |||
1135 | ;output: |
||
1136 | ; dl |
||
1137 | align 4 |
||
1138 | proc pole_compare_bm_yzx uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword |
||
1139 | |||
1140 | mov eax,[i0] ;eax -> cell[i0] |
||
1141 | imul eax,vox_ogl_size |
||
1142 | add eax,[p_mem] |
||
1143 | |||
1144 | mov ebx,[i1] ;ebx -> cell[i1] |
||
1145 | cmp ebx,0 |
||
1146 | jl .copy |
||
1147 | imul ebx,vox_ogl_size |
||
1148 | add ebx,[p_mem] |
||
1149 | jmp @f |
||
1150 | .copy: |
||
1151 | mov ebx,mem_copy_32 |
||
1152 | @@: |
||
1153 | |||
1154 | mov cx,word[ebx+vox_ogl_zoom] ;zoom |
||
1155 | cmp word[eax+vox_ogl_zoom],cx |
||
1156 | jle @f ;zoom0>zoom1 |
||
1157 | mov dl,1 |
||
1158 | jmp .fun_e |
||
1159 | @@: |
||
1160 | jne .r_0 ;if zoom0 |
||
1161 | |||
1162 | mov ecx,dword[ebx+vox_ogl_y0] ;coord y |
||
1163 | cmp dword[eax+vox_ogl_y0],ecx |
||
1164 | jle @f ;y0>y1 |
||
1165 | mov dl,1 |
||
1166 | jmp .fun_e |
||
1167 | @@: |
||
1168 | jne .r_0 ;if y0 |
||
1169 | |||
1170 | mov ecx,dword[ebx+vox_ogl_z0] ;coord z |
||
1171 | cmp dword[eax+vox_ogl_z0],ecx |
||
1172 | jle @f ;z0>z1 |
||
1173 | mov dl,1 |
||
1174 | jmp .fun_e |
||
1175 | @@: |
||
1176 | jne .r_0 ;if z0 |
||
1177 | |||
1178 | mov ecx,dword[ebx+vox_ogl_x0] ;coord x |
||
1179 | cmp dword[eax+vox_ogl_x0],ecx |
||
1180 | jle @f ;x0>x1 |
||
1181 | mov dl,1 |
||
1182 | jmp .fun_e |
||
1183 | @@: |
||
1184 | |||
1185 | .r_0: |
||
1186 | xor dl,dl |
||
1187 | .fun_e: |
||
1188 | ret |
||
1189 | endp |
||
1190 | |||
1191 | align 4 |
||
1192 | proc copy_cell uses ecx edi esi, p_mem:dword, i0:dword, i1:dword |
||
1193 | |||
1194 | mov esi,[i1] |
||
1195 | cmp esi,0 |
||
1196 | jl .copy_0 |
||
1197 | imul esi,vox_ogl_size |
||
1198 | add esi,[p_mem] |
||
1199 | jmp @f |
||
1200 | .copy_0: |
||
1201 | mov esi,mem_copy_32 |
||
1202 | @@: |
||
1203 | |||
1204 | mov edi,[i0] |
||
1205 | cmp edi,0 |
||
1206 | jl .copy_1 |
||
1207 | imul edi,vox_ogl_size |
||
1208 | add edi,[p_mem] |
||
1209 | jmp @f |
||
1210 | .copy_1: |
||
1211 | mov edi,mem_copy_32 |
||
1212 | @@: |
||
1213 | |||
1214 | if vox_ogl_size eq 34 |
||
1215 | mov ecx,8 ;ecx=32/4 |
||
1216 | cld |
||
1217 | rep movsd |
||
1218 | movsw |
||
1219 | else |
||
1220 | vox_ogl_size не равно 34 ! |
||
1221 | end if |
||
1222 | ret |
||
1223 | endp |
||
1224 | |||
1225 | align 4 |
||
1226 | proc swap_cell uses eax ebx ecx edi esi, p_mem:dword, i0:dword, i1:dword |
||
1227 | mov esi,[i0] |
||
1228 | imul esi,vox_ogl_size |
||
1229 | add esi,[p_mem] |
||
1230 | mov edi,[i1] |
||
1231 | imul edi,vox_ogl_size |
||
1232 | add edi,[p_mem] |
||
1233 | if vox_ogl_size eq 34 |
||
1234 | ;vox_ogl_size = 34 = 32 + 2 |
||
1235 | mov ecx,8 ;ecx=32/4 |
||
1236 | cld |
||
1237 | @@: |
||
1238 | mov eax,dword[edi] |
||
1239 | mov ebx,dword[esi] |
||
1240 | mov dword[edi],ebx |
||
1241 | mov dword[esi],eax |
||
1242 | add esi,4 |
||
1243 | add edi,4 |
||
1244 | loop @b |
||
1245 | mov ax,word[edi] |
||
1246 | mov bx,word[esi] |
||
1247 | mov word[edi],bx |
||
1248 | mov word[esi],ax |
||
1249 | else |
||
1250 | vox_ogl_size не равно 34 ! |
||
1251 | end if |
||
1252 | ret |
||
1253 | endp |
||
1254 | |||
1255 | align 4 |
||
1256 | mem_copy_32 rb vox_ogl_size |
||
1257 | |||
1258 | ;функция для коректировки координат |
||
1259 | ;направления осей координат в вокселе: |
||
1260 | ;*z |
||
1261 | ;| |
||
1262 | ;+-* x |
||
1263 | ;input: |
||
1264 | ; al - номер узла в дереве (от 1 до 8) |
||
1265 | ; ebx - координата x |
||
1266 | ; edx - координата y |
||
1267 | ; esi - координата z |
||
1268 | ; ecx - уровень текушего узла |
||
1269 | ;output: |
||
1270 | ; ebx - новая координата x |
||
1271 | ; edx - новая координата y |
||
1272 | ; esi - новая координата z |
||
1273 | align 4 |
||
1274 | proc vox_corect_coords_pl, v_obj:dword, v_size:dword |
||
1275 | cmp ecx,0 |
||
1276 | jl .end_f ;для ускорения отрисовки |
||
1277 | |||
1278 | push eax edi |
||
1279 | and eax,15 ;выделяем номер узла в дереве |
||
1280 | mov edi,[v_obj] |
||
1281 | add edi,vox_offs_tree_table |
||
1282 | add edi,8 |
||
1283 | sub edi,eax |
||
1284 | |||
1285 | mov eax,[v_size] |
||
1286 | cmp ecx,1 |
||
1287 | jl @f |
||
1288 | shl eax,cl |
||
1289 | @@: |
||
1290 | |||
1291 | bt word[edi],0 ;test voxel coord x |
||
1292 | jnc @f |
||
1293 | add ebx,eax |
||
1294 | @@: |
||
1295 | bt word[edi],2 ;test voxel coord z |
||
1296 | jnc @f |
||
1297 | sub edx,eax |
||
1298 | @@: |
||
1299 | bt word[edi],1 ;test voxel coord y |
||
1300 | jc @f |
||
1301 | mov eax,1 |
||
1302 | cmp ecx,1 |
||
1303 | jl .end_0 |
||
1304 | shl eax,cl |
||
1305 | .end_0: |
||
1306 | add esi,eax ;меняем глубину для буфера z |
||
1307 | @@: |
||
1308 | pop edi eax |
||
1309 | .end_f: |
||
1310 | ret |
||
1311 | endp |
||
1312 | |||
1313 | align 4 |
||
1314 | p1 dd ? |
||
1315 | p2 dd ? |
||
1316 | |||
1317 | align 4 |
||
1318 | proc draw_voxels_3d uses ebx ecx edx edi, p_mem:dword |
||
1319 | locals |
||
1320 | v_count dd ? |
||
1321 | endl |
||
1322 | mov edi,[p_mem] |
||
1323 | cmp edi,0 |
||
1324 | je .end_f |
||
1325 | mov eax,dword[edi] |
||
1326 | mov dword[v_count],eax |
||
1327 | add edi,4 |
||
1328 | |||
1329 | bt word[opt_cube_box],0 |
||
1330 | jnc @f |
||
1331 | ;рисование рамки |
||
1332 | stdcall [glColor3ub],128,128,128 |
||
1333 | stdcall [glBegin],GL_LINE_STRIP |
||
1334 | stdcall [glVertex3f], -0.5, -0.5, -0.5 |
||
1335 | stdcall [glVertex3f], -0.5, 0.5, -0.5 |
||
1336 | stdcall [glVertex3f], 0.5, 0.5, -0.5 |
||
1337 | stdcall [glVertex3f], 0.5, -0.5, -0.5 |
||
1338 | stdcall [glVertex3f], -0.5, -0.5, -0.5 |
||
1339 | stdcall [glVertex3f], -0.5, -0.5, 0.5 |
||
1340 | stdcall [glVertex3f], -0.5, 0.5, 0.5 |
||
1341 | stdcall [glVertex3f], 0.5, 0.5, 0.5 |
||
1342 | stdcall [glVertex3f], 0.5, -0.5, 0.5 |
||
1343 | stdcall [glVertex3f], -0.5, -0.5, 0.5 |
||
1344 | stdcall [glEnd] |
||
1345 | stdcall [glBegin],GL_LINES |
||
1346 | stdcall [glVertex3f], -0.5, 0.5, -0.5 |
||
1347 | stdcall [glVertex3f], -0.5, 0.5, 0.5 |
||
1348 | stdcall [glVertex3f], 0.5, 0.5, -0.5 |
||
1349 | stdcall [glVertex3f], 0.5, 0.5, 0.5 |
||
1350 | stdcall [glVertex3f], 0.5, -0.5, -0.5 |
||
1351 | stdcall [glVertex3f], 0.5, -0.5, 0.5 |
||
1352 | stdcall [glEnd] |
||
1353 | @@: |
||
1354 | |||
1355 | ;рисование объекта |
||
1356 | stdcall [glBegin],GL_QUADS |
||
1357 | .cycle_0: |
||
1358 | cmp dword[v_count],1 |
||
1359 | jl .cycle_1 |
||
1360 | stdcall [glColor3ub],[edi+vox_ogl_color+2],[edi+vox_ogl_color+1],[edi+vox_ogl_color] |
||
1361 | |||
1362 | bt word[edi+vox_ogl_planes],vox_ogl_gran_z1 |
||
1363 | jnc .e_gran_z1 |
||
1364 | ;передняя грань Normal(0.0,0.0,normal_gran_z1) |
||
1365 | normal_gran p1,x0 |
||
1366 | normal_gran_2 p1,x0z1,x1 |
||
1367 | normal_gran p2,y0 |
||
1368 | normal_gran_2 p2,y0z1,y1 |
||
1369 | stdcall [glNormal3f], [p1],[p2],normal_gran_z1 |
||
1370 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1371 | normal_gran p1,x1 |
||
1372 | normal_gran_2 p1,x1z1,x0 |
||
1373 | ;normal_gran p2,y0 |
||
1374 | ;normal_gran_2 p2,y0z1,y1 |
||
1375 | stdcall [glNormal3f], [p1],[p2],normal_gran_z1 |
||
1376 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1377 | ;normal_gran p1,x1 |
||
1378 | ;normal_gran_2 p1,x1z1,x0 |
||
1379 | normal_gran p2,y1 |
||
1380 | normal_gran_2 p2,y1z1,y0 |
||
1381 | stdcall [glNormal3f], [p1],[p2],normal_gran_z1 |
||
1382 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1383 | normal_gran p1,x0 |
||
1384 | normal_gran_2 p1,x0z1,x1 |
||
1385 | ;normal_gran p2,y1 |
||
1386 | ;normal_gran_2 p2,y1z1,y0 |
||
1387 | stdcall [glNormal3f], [p1],[p2],normal_gran_z1 |
||
1388 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1389 | .e_gran_z1: |
||
1390 | |||
1391 | bt word[edi+vox_ogl_planes],vox_ogl_gran_y0 |
||
1392 | jnc .e_gran_y0 |
||
1393 | ;верхняя грань Normal(0.0,normal_gran_y0,0.0) |
||
1394 | normal_gran p1,x0 |
||
1395 | normal_gran_2 p1,x0y0,x1 |
||
1396 | normal_gran p2,z0 |
||
1397 | normal_gran_2 p2,y0z0,z1 |
||
1398 | stdcall [glNormal3f], [p1],normal_gran_y0,[p2] |
||
1399 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1400 | normal_gran p1,x1 |
||
1401 | normal_gran_2 p1,x1y0,x0 |
||
1402 | ;normal_gran p2,z0 |
||
1403 | ;normal_gran_2 p2,y0z0,z1 |
||
1404 | stdcall [glNormal3f], [p1],normal_gran_y0,[p2] |
||
1405 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1406 | ;normal_gran p1,x1 |
||
1407 | ;normal_gran_2 p1,x1y0,x0 |
||
1408 | normal_gran p2,z1 |
||
1409 | normal_gran_2 p2,y0z1,z0 |
||
1410 | stdcall [glNormal3f], [p1],normal_gran_y0,[p2] |
||
1411 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1412 | normal_gran p1,x0 |
||
1413 | normal_gran_2 p1,x0y0,x1 |
||
1414 | ;normal_gran p2,z1 |
||
1415 | ;normal_gran_2 p2,y0z1,z0 |
||
1416 | stdcall [glNormal3f], [p1],normal_gran_y0,[p2] |
||
1417 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1418 | .e_gran_y0: |
||
1419 | |||
1420 | bt word[edi+vox_ogl_planes],vox_ogl_gran_y1 |
||
1421 | jnc .e_gran_y1 |
||
1422 | ;нижняя грань Normal(0.0,normal_gran_y1,0.0) |
||
1423 | normal_gran p1,x0 |
||
1424 | normal_gran_2 p1,x0y1,x1 |
||
1425 | normal_gran p2,z1 |
||
1426 | normal_gran_2 p2,y1z1,z0 |
||
1427 | stdcall [glNormal3f], [p1],normal_gran_y1,[p2] |
||
1428 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1429 | normal_gran p1,x1 |
||
1430 | normal_gran_2 p1,x1y1,x0 |
||
1431 | ;normal_gran p2,z1 |
||
1432 | ;normal_gran_2 p2,y1z1,z0 |
||
1433 | stdcall [glNormal3f], [p1],normal_gran_y1,[p2] |
||
1434 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1435 | ;normal_gran p1,x1 |
||
1436 | ;normal_gran_2 p1,x1y1,x0 |
||
1437 | normal_gran p2,z0 |
||
1438 | normal_gran_2 p2,y1z0,z1 |
||
1439 | stdcall [glNormal3f], [p1],normal_gran_y1,[p2] |
||
1440 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1441 | normal_gran p1,x0 |
||
1442 | normal_gran_2 p1,x0y1,x1 |
||
1443 | ;normal_gran p2,z0 |
||
1444 | ;normal_gran_2 p2,y1z0,z1 |
||
1445 | stdcall [glNormal3f], [p1],normal_gran_y1,[p2] |
||
1446 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1447 | .e_gran_y1: |
||
1448 | |||
1449 | bt word[edi+vox_ogl_planes],vox_ogl_gran_x0 |
||
1450 | jnc .e_gran_x0 |
||
1451 | ;левая грань Normal(normal_gran_x0,0.0,0.0) |
||
1452 | normal_gran p1,y0 |
||
1453 | normal_gran_2 p1,x0y0,y1 |
||
1454 | normal_gran p2,z1 |
||
1455 | normal_gran_2 p2,x0z1,z0 |
||
1456 | stdcall [glNormal3f], normal_gran_x0,[p1],[p2] |
||
1457 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1458 | normal_gran p1,y1 |
||
1459 | normal_gran_2 p1,x0y1,y0 |
||
1460 | ;normal_gran p2,z1 |
||
1461 | ;normal_gran_2 p2,x0z1,z0 |
||
1462 | stdcall [glNormal3f], normal_gran_x0,[p1],[p2] |
||
1463 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1464 | ;normal_gran p1,y1 |
||
1465 | ;normal_gran_2 p1,x0y1,y0 |
||
1466 | normal_gran p2,z0 |
||
1467 | normal_gran_2 p2,x0z0,z1 |
||
1468 | stdcall [glNormal3f], normal_gran_x0,[p1],[p2] |
||
1469 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1470 | normal_gran p1,y0 |
||
1471 | normal_gran_2 p1,x0y0,y1 |
||
1472 | ;normal_gran p2,z0 |
||
1473 | ;normal_gran_2 p2,x0z0,z1 |
||
1474 | stdcall [glNormal3f], normal_gran_x0,[p1],[p2] |
||
1475 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1476 | .e_gran_x0: |
||
1477 | |||
1478 | bt word[edi+vox_ogl_planes],vox_ogl_gran_x1 |
||
1479 | jnc .e_gran_x1 |
||
1480 | ;правая грань Normal(normal_gran_x1,0.0,0.0) |
||
1481 | normal_gran p1,y0 |
||
1482 | normal_gran_2 p1,x1y0,y1 |
||
1483 | normal_gran p2,z1 |
||
1484 | normal_gran_2 p2,x1z1,z0 |
||
1485 | stdcall [glNormal3f], normal_gran_x1,[p1],[p2] |
||
1486 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1] |
||
1487 | ;normal_gran p1,y0 |
||
1488 | ;normal_gran_2 p1,x1y0,y1 |
||
1489 | normal_gran p2,z0 |
||
1490 | normal_gran_2 p2,x1z0,z1 |
||
1491 | stdcall [glNormal3f], normal_gran_x1,[p1],[p2] |
||
1492 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1493 | normal_gran p1,y1 |
||
1494 | normal_gran_2 p1,x1y1,y0 |
||
1495 | ;normal_gran p2,z0 |
||
1496 | ;normal_gran_2 p2,x1z0,z1 |
||
1497 | stdcall [glNormal3f], normal_gran_x1,[p1],[p2] |
||
1498 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1499 | ;normal_gran p1,y1 |
||
1500 | ;normal_gran_2 p1,x1y1,y0 |
||
1501 | normal_gran p2,z1 |
||
1502 | normal_gran_2 p2,x1z1,z0 |
||
1503 | stdcall [glNormal3f], normal_gran_x1,[p1],[p2] |
||
1504 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1] |
||
1505 | .e_gran_x1: |
||
1506 | |||
1507 | bt word[edi+vox_ogl_planes],vox_ogl_gran_z0 |
||
1508 | jnc .e_gran_z0 |
||
1509 | ;задняя грань Normal(0.0,0.0,normal_gran_z0) |
||
1510 | normal_gran p1,x0 |
||
1511 | normal_gran_2 p1,x0z0,x1 |
||
1512 | normal_gran p2,y1 |
||
1513 | normal_gran_2 p2,y1z0,y0 |
||
1514 | stdcall [glNormal3f], [p1],[p2],normal_gran_z0 |
||
1515 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1516 | normal_gran p1,x1 |
||
1517 | normal_gran_2 p1,x1z0,x0 |
||
1518 | ;normal_gran p2,y1 |
||
1519 | ;normal_gran_2 p2,y1z0,y0 |
||
1520 | stdcall [glNormal3f], [p1],[p2],normal_gran_z0 |
||
1521 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0] |
||
1522 | ;normal_gran p1,x1 |
||
1523 | ;normal_gran_2 p1,x1z0,x0 |
||
1524 | normal_gran p2,y0 |
||
1525 | normal_gran_2 p2,y0z0,y1 |
||
1526 | stdcall [glNormal3f], [p1],[p2],normal_gran_z0 |
||
1527 | stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1528 | normal_gran p1,x0 |
||
1529 | normal_gran_2 p1,x0z0,x1 |
||
1530 | ;normal_gran p2,y0 |
||
1531 | ;normal_gran_2 p2,y0z0,y1 |
||
1532 | stdcall [glNormal3f], [p1],[p2],normal_gran_z0 |
||
1533 | stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0] |
||
1534 | .e_gran_z0: |
||
1535 | |||
1536 | ;goto next voxel |
||
1537 | add edi,vox_ogl_size |
||
1538 | dec dword[v_count] |
||
1539 | jmp .cycle_0 |
||
1540 | .cycle_1: |
||
1541 | |||
1542 | stdcall [glEnd] |
||
1543 | |||
1544 | .end_f: |
||
1545 | ret |
||
1546 | endp=k)>->=k)>->=k)>->=k)>-> |