Rev 2758 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2748 | IgorA | 1 | ; |
2 | |||
3 | BUF_STRUCT_SIZE equ 21 |
||
4 | buf2d_data equ dword[edi] ;данные буфера изображения |
||
5 | buf2d_w equ dword[edi+8] ;ширина буфера |
||
6 | buf2d_h equ dword[edi+12] ;высота буфера |
||
7 | buf2d_l equ word[edi+4] |
||
8 | buf2d_t equ word[edi+6] ;отступ сверху |
||
9 | buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера |
||
10 | buf2d_color equ dword[edi+16] ;цвет фона буфера |
||
11 | buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения |
||
12 | |||
13 | vox_offs_tree_table equ 4 |
||
14 | vox_offs_data equ 12 |
||
15 | |||
16 | ;output: |
||
2758 | IgorA | 17 | ; eax - (event shl 30) + position |
2748 | IgorA | 18 | align 4 |
2758 | IgorA | 19 | proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword |
20 | mov ecx,[scale_obj] |
||
21 | stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx |
||
22 | cmp eax,[coord_y] |
||
23 | jle .test_x |
||
24 | stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx |
||
25 | cmp eax,[coord_x] |
||
26 | jle .test_z |
||
2748 | IgorA | 27 | |
2758 | IgorA | 28 | .no_change: |
29 | xor eax,eax |
||
30 | jmp .end_f |
||
2748 | IgorA | 31 | |
2758 | IgorA | 32 | .test_x: |
33 | mov ebx,[h_br] |
||
34 | movzx ebx,byte[ebx+1] |
||
35 | add eax,ebx |
||
36 | cmp eax,[coord_y] |
||
37 | jl .no_change |
||
38 | stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx |
||
39 | cmp eax,[coord_x] |
||
40 | jl .no_change |
||
41 | mov ebx,eax |
||
42 | mov ecx,[scale_img] |
||
43 | inc ecx |
||
44 | shr ebx,cl |
||
45 | xor edx,edx |
||
46 | mov eax,[coord_x] |
||
47 | div ebx |
||
48 | dec ecx |
||
49 | xor ebx,ebx |
||
50 | inc ebx |
||
51 | shl ebx,cl |
||
52 | cmp eax,ebx |
||
53 | jge @f |
||
54 | or eax,1 shl 30 |
||
2748 | IgorA | 55 | jmp .end_f |
56 | @@: |
||
2758 | IgorA | 57 | sub eax,ebx |
58 | or eax,2 shl 30 |
||
59 | jmp .end_f |
||
2748 | IgorA | 60 | |
2758 | IgorA | 61 | .test_z: |
62 | mov ebx,[h_br] |
||
63 | movzx ebx,byte[ebx] |
||
64 | add eax,ebx |
||
65 | cmp eax,[coord_x] |
||
66 | jl .no_change |
||
67 | mov ebx,[h_br] |
||
68 | movzx ebx,byte[ebx+1] |
||
69 | mov ecx,[scale_obj] |
||
70 | shl ebx,cl |
||
71 | mov ecx,[scale_img] |
||
72 | shr ebx,cl |
||
73 | mov eax,[coord_y] |
||
74 | xor edx,edx |
||
75 | div ebx |
||
76 | ;инверсия координаты y |
||
77 | xor edx,edx |
||
78 | inc edx |
||
79 | shl edx,cl |
||
80 | dec edx |
||
81 | sub edx,eax |
||
82 | mov eax,edx |
||
83 | or eax,3 shl 30 |
||
2748 | IgorA | 84 | |
85 | .end_f: |
||
86 | ret |
||
87 | endp |
||
88 | |||
89 | ; |
||
90 | ;x0y0 - x1y0 |
||
91 | ;x1y0 - x1y1 |
||
92 | ;x0y1 - x0y0 |
||
93 | ;x1y1 - x0y1 |
||
94 | align 4 |
||
95 | proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword |
||
96 | mov ebx,[v_obj] |
||
97 | add ebx,vox_offs_tree_table |
||
98 | mov ecx,2 |
||
99 | cld |
||
100 | @@: |
||
101 | mov eax,dword[ebx] |
||
102 | mov byte[ebx+1],al |
||
103 | mov byte[ebx+3],ah |
||
104 | shr eax,16 |
||
105 | mov byte[ebx],al |
||
106 | mov byte[ebx+2],ah |
||
107 | add ebx,4 |
||
108 | loop @b |
||
109 | ret |
||
110 | endp |
||
111 | |||
112 | ; |
||
113 | ;y0z0 - y0z1 |
||
114 | ;y0z1 - y1z1 |
||
115 | ;y1z1 - y1z0 |
||
116 | ;y1z0 - y0z0 |
||
117 | align 4 |
||
118 | proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword |
||
119 | mov ebx,[v_obj] |
||
120 | add ebx,vox_offs_tree_table |
||
121 | mov eax,dword[ebx] |
||
122 | mov ecx,dword[ebx+4] |
||
123 | |||
124 | mov byte[ebx+4],al |
||
125 | mov byte[ebx+5],ah |
||
126 | shr eax,16 |
||
127 | mov byte[ebx+0],al |
||
128 | mov byte[ebx+1],ah |
||
129 | |||
130 | mov byte[ebx+6],cl |
||
131 | mov byte[ebx+7],ch |
||
132 | shr ecx,16 |
||
133 | mov byte[ebx+2],cl |
||
134 | mov byte[ebx+3],ch |
||
135 | |||
136 | ret |
||
137 | endp |
||
138 | |||
139 | ; |
||
140 | ;output: |
||
141 | ; eax - число узлов в объекте v_obj |
||
142 | align 4 |
||
143 | proc vox_obj_get_nodes uses edi, v_obj:dword |
||
144 | mov edi,[v_obj] |
||
145 | add edi,vox_offs_data |
||
146 | xor eax,eax |
||
147 | stdcall vox_obj_rec0 |
||
148 | ret |
||
149 | endp |
||
150 | |||
2758 | IgorA | 151 | ;??? |
2748 | IgorA | 152 | ;input: |
153 | ; edi - указатель на данные воксельного объекта |
||
154 | ;output: |
||
155 | ; eax - eax + число узлов в данных вокс. объекта |
||
156 | ; edi - указатель на смещенные данные вокс. объекта |
||
157 | align 4 |
||
158 | proc vox_obj_rec0 |
||
159 | inc eax |
||
160 | cmp byte[edi+3],0 ;смотрим есть ли поддеревья |
||
161 | je .sub_trees |
||
162 | |||
163 | ;рекурсивный перебор поддеревьев |
||
164 | push ebx ecx |
||
165 | mov bh,byte[edi+3] |
||
166 | add edi,4 |
||
167 | mov bl,8 |
||
168 | .cycle: |
||
169 | bt bx,8 ;тестируем только bh |
||
170 | jnc .c_next |
||
171 | stdcall vox_obj_rec0 |
||
172 | .c_next: |
||
173 | shr bh,1 |
||
174 | dec bl |
||
175 | jnz .cycle |
||
176 | pop ecx ebx |
||
177 | |||
178 | jmp .end_f |
||
179 | .sub_trees: |
||
180 | add edi,4 |
||
181 | .end_f: |
||
182 | ret |
||
183 | endp |
||
184 | |||
185 | ; |
||
186 | ;output: |
||
187 | ; eax - размер в байтах занимаемый объектом v_obj |
||
188 | align 4 |
||
189 | proc buf2d_vox_obj_get_size, v_obj:dword |
||
190 | stdcall vox_obj_get_nodes,[v_obj] |
||
191 | shl eax,2 |
||
192 | add eax,vox_offs_data |
||
193 | ret |
||
194 | endp |
||
195 | |||
196 | ; создание вокселя в 3 этапа: |
||
197 | ; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем) |
||
198 | ; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем) |
||
199 | ; 3) меняем цвет вокселя |
||
200 | align 4 |
||
201 | proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
2758 | IgorA | 202 | coord_z:dword,k_scale:dword,color:dword |
2748 | IgorA | 203 | pushad |
204 | locals |
||
205 | p_node dd 0 ;родительский узел |
||
206 | endl |
||
207 | |||
208 | mov edi,[v_obj] |
||
209 | add edi,vox_offs_data |
||
210 | mov esi,[k_scale] |
||
211 | cmp esi,1 |
||
212 | jl .change |
||
213 | ; *** (1) *** |
||
214 | .found: |
||
215 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
216 | movzx bx,byte[edi+3] |
||
217 | mov [p_node],edi |
||
218 | add edi,4 |
||
2758 | IgorA | 219 | |
2748 | IgorA | 220 | cmp eax,0 |
221 | je .end_1 |
||
222 | mov ecx,eax |
||
223 | cld |
||
2758 | IgorA | 224 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
2748 | IgorA | 225 | bt bx,0 ;проверяем есть ли дочерние узлы |
226 | jnc .end_0 |
||
227 | xor eax,eax |
||
228 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
229 | .end_0: |
||
230 | shr bx,1 |
||
231 | loop @b |
||
232 | .end_1: |
||
233 | bt bx,0 |
||
234 | jnc .creat ;если поддерева не существует, переходим к созданию |
||
235 | dec esi |
||
236 | cmp esi,0 |
||
237 | jg .found |
||
238 | jmp .change |
||
239 | |||
240 | ; *** (2) *** |
||
241 | .creat: |
||
242 | mov edx,[color] ;меняем цвет |
||
243 | and edx,0xffffff ;для профилактики |
||
244 | mov ecx,esi |
||
245 | stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов |
||
246 | mov ebx,[p_node] |
||
247 | cld |
||
248 | @@: |
||
249 | mov dword[edi],edx |
||
250 | stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
251 | or byte[ebx+3],al |
||
252 | |||
253 | mov ebx,edi |
||
254 | add edi,4 |
||
255 | dec esi |
||
256 | loop @b |
||
257 | jmp .end_2 |
||
258 | |||
259 | ; *** (3) *** |
||
260 | .change: |
||
261 | mov eax,[color] ;меняем цвет |
||
262 | mov word[edi],ax |
||
263 | shr eax,16 |
||
264 | mov byte[edi+2],al |
||
265 | |||
266 | .end_2: |
||
267 | popad |
||
268 | ret |
||
269 | endp |
||
270 | |||
2758 | IgorA | 271 | ; удаление вокселя в 2 этапа: |
2748 | IgorA | 272 | ; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции) |
2758 | IgorA | 273 | ; 2) удаляем ветвь с вокселем |
2748 | IgorA | 274 | align 4 |
275 | proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
276 | coord_z:dword,k_scale:dword |
||
277 | pushad |
||
278 | locals |
||
279 | p_node dd 0 ;родительский узел |
||
280 | endl |
||
281 | mov edi,[v_obj] |
||
282 | add edi,vox_offs_data |
||
283 | mov esi,[k_scale] |
||
284 | cmp esi,1 |
||
285 | jl .end_2 |
||
286 | ; *** (1) *** |
||
287 | .found: |
||
288 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
289 | movzx bx,byte[edi+3] |
||
290 | mov [p_node],edi |
||
291 | add edi,4 |
||
292 | cmp eax,0 |
||
293 | je .end_1 |
||
294 | mov ecx,eax |
||
295 | cld |
||
2758 | IgorA | 296 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
2748 | IgorA | 297 | bt bx,0 ;проверяем есть ли дочерние узлы |
298 | jnc .end_0 |
||
299 | xor eax,eax |
||
300 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
301 | .end_0: |
||
302 | shr bx,1 |
||
303 | loop @b |
||
304 | .end_1: |
||
305 | bt bx,0 |
||
306 | jnc .end_2 ;если поддерева не существует |
||
307 | dec esi |
||
308 | cmp esi,0 |
||
309 | jg .found |
||
310 | |||
311 | ; *** (2) *** |
||
312 | ;delete |
||
313 | stdcall vox_obj_del_nodes_mem, [v_obj],edi ;сужаем место занимаемое объектом, при удалении узла |
||
314 | mov ebx,[p_node] |
||
315 | |||
316 | stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
317 | xor byte[ebx+3],al |
||
318 | |||
319 | .end_2: |
||
320 | popad |
||
321 | ret |
||
322 | endp |
||
323 | |||
2883 | IgorA | 324 | ; взять цвет вокселя в 2 этапа: |
325 | ; 1) ищем место в структуре дерева, где есть узел (если ветвь не существует, выходим из функции) |
||
326 | ; 2) берем цвет вокселя |
||
327 | ;output: |
||
328 | ; eax - цвет вокселя |
||
329 | align 4 |
||
330 | proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
331 | coord_z:dword,k_scale:dword |
||
332 | push ebx ecx edi esi |
||
333 | locals |
||
334 | p_node dd 0 ;родительский узел |
||
335 | endl |
||
336 | mov edi,[v_obj] |
||
337 | add edi,vox_offs_data |
||
338 | mov esi,[k_scale] |
||
339 | cmp esi,1 |
||
340 | jl .end_2 |
||
341 | ; *** (1) *** |
||
342 | .found: |
||
343 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
344 | movzx bx,byte[edi+3] |
||
345 | mov [p_node],edi |
||
346 | add edi,4 |
||
347 | cmp eax,0 |
||
348 | je .end_1 |
||
349 | mov ecx,eax |
||
350 | cld |
||
351 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
||
352 | bt bx,0 ;проверяем есть ли дочерние узлы |
||
353 | jnc .end_0 |
||
354 | xor eax,eax |
||
355 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
356 | .end_0: |
||
357 | shr bx,1 |
||
358 | loop @b |
||
359 | .end_1: |
||
360 | bt bx,0 |
||
361 | jnc .end_2 ;если поддерева не существует |
||
362 | dec esi |
||
363 | cmp esi,0 |
||
364 | jg .found |
||
365 | |||
366 | ; *** (2) *** |
||
367 | ;get |
||
368 | mov eax,dword[edi] |
||
369 | and eax,0xffffff |
||
370 | jmp .end_3 |
||
371 | .end_2: |
||
372 | mov eax,1 shl 31 |
||
373 | .end_3: |
||
374 | pop esi edi ecx ebx |
||
375 | ret |
||
376 | endp |
||
377 | |||
2748 | IgorA | 378 | ; сдвигает узлы для добавления новых узлов |
379 | ;input: |
||
380 | ; p_insert - позиция для вставки |
||
381 | ; count - колличество вставляемых узлов |
||
382 | align 4 |
||
383 | proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword |
||
384 | stdcall buf2d_vox_obj_get_size,[v_obj] |
||
385 | mov esi,[v_obj] |
||
386 | add esi,eax ;esi - указатель на конец файла |
||
387 | mov edi,[count] |
||
388 | shl edi,2 |
||
389 | add edi,esi ;edi - указатель на будущий конец файла |
||
390 | mov ecx,esi |
||
391 | sub ecx,[p_insert] |
||
392 | shr ecx,2 ;ecx - число циклов для копирования |
||
393 | sub esi,4 ;esi - указатель на последний узел |
||
394 | sub edi,4 ;edi - указатель на будущий последний узел |
||
395 | std |
||
396 | rep movsd ;сдвигаем память |
||
397 | ret |
||
398 | endp |
||
399 | |||
400 | ;input: |
||
401 | ; p_insert - позиция для ... |
||
402 | align 4 |
||
403 | proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword |
||
404 | stdcall buf2d_vox_obj_get_size,[v_obj] |
||
405 | mov ecx,eax |
||
406 | mov edi,[p_insert] |
||
407 | add ecx,[v_obj] |
||
408 | sub ecx,edi |
||
409 | xor eax,eax |
||
410 | stdcall vox_obj_rec0 |
||
411 | shr ecx,2 |
||
412 | sub ecx,eax ;ecx - число циклов для копирования |
||
413 | shl eax,2 |
||
414 | add eax,[p_insert] |
||
415 | mov esi,eax |
||
416 | mov edi,[p_insert] |
||
417 | cld |
||
418 | rep movsd ;сдвигаем память |
||
419 | ret |
||
420 | endp |
||
421 | |||
2758 | IgorA | 422 | ;??? |
2748 | IgorA | 423 | ; определение позиции узла в дереве (от 0 до 7) |
424 | align 4 |
||
425 | proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ |
||
426 | coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword |
||
427 | mov ecx,[k_scale] |
||
428 | dec ecx |
||
429 | mov eax,[coord_x] |
||
430 | mov ebx,[coord_y] |
||
431 | mov edi,[coord_z] |
||
432 | cmp ecx,1 |
||
433 | jl .end_0 |
||
434 | shr eax,cl |
||
435 | shr ebx,cl |
||
436 | shr edi,cl |
||
437 | .end_0: |
||
438 | and eax,1 |
||
439 | bt ebx,0 |
||
440 | jnc @f |
||
441 | bts eax,1 |
||
442 | @@: |
||
443 | bt edi,0 |
||
444 | jnc @f |
||
445 | bts eax,2 |
||
446 | @@: |
||
447 | |||
448 | mov edi,[v_obj] |
||
449 | add edi,vox_offs_tree_table |
||
450 | @@: |
||
451 | cmp al,byte[edi] |
||
452 | je @f |
||
453 | inc edi |
||
454 | jmp @b |
||
455 | @@: |
||
456 | sub edi,[v_obj] |
||
457 | sub edi,vox_offs_tree_table |
||
458 | mov eax,edi |
||
459 | |||
460 | ret |
||
461 | endp |
||
462 | |||
463 | ;output: |
||
464 | ; eax - 1,2,4,8,16, ... ,128 |
||
465 | align 4 |
||
466 | proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\ |
||
467 | coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword |
||
468 | mov ecx,[k_scale] |
||
469 | dec ecx |
||
470 | mov eax,[coord_x] |
||
471 | mov ebx,[coord_y] |
||
472 | mov edi,[coord_z] |
||
473 | cmp ecx,1 |
||
474 | jl .end_0 |
||
475 | shr eax,cl |
||
476 | shr ebx,cl |
||
477 | shr edi,cl |
||
478 | .end_0: |
||
479 | and eax,1 |
||
480 | bt ebx,0 |
||
481 | jnc @f |
||
482 | bts eax,1 |
||
483 | @@: |
||
484 | bt edi,0 |
||
485 | jnc @f |
||
486 | bts eax,2 |
||
487 | @@: |
||
488 | |||
489 | mov ecx,[v_obj] |
||
490 | add ecx,vox_offs_tree_table |
||
491 | @@: |
||
492 | cmp al,byte[ecx] |
||
493 | je @f |
||
494 | inc ecx |
||
495 | jmp @b |
||
496 | @@: |
||
497 | mov eax,1 ;устанавливаем первоначальное значение бита |
||
498 | sub ecx,[v_obj] |
||
499 | sub ecx,vox_offs_tree_table |
||
500 | jz @f |
||
501 | shl eax,cl ;сдвигаем бит |
||
502 | @@: |
||
503 | |||
504 | ret |
||
505 | endp |
||
506 | |||
507 | ;функция для рисования палитры |
||
508 | align 4 |
||
509 | proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\ |
||
510 | cell_w:dword, cell_h:dword, colors_w:dword, colors:dword |
||
511 | pushad |
||
512 | mov ebx,[coord_x] |
||
513 | mov edx,[coord_y] |
||
514 | mov ecx,[colors] |
||
515 | xor edi,edi |
||
516 | mov esi,[cell_h] |
||
517 | cld |
||
518 | .cycle_0: |
||
519 | stdcall get_palete_color, ecx,3 |
||
520 | stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax |
||
521 | inc edi |
||
522 | cmp edi,[colors_w] |
||
523 | jl @f |
||
524 | mov ebx,[coord_x] |
||
525 | sub ebx,[cell_w] |
||
526 | dec ebx |
||
527 | add edx,esi ;высота ячейки |
||
528 | inc edx ;отступ между ячейками |
||
529 | xor edi,edi |
||
530 | @@: |
||
531 | add ebx,[cell_w] |
||
532 | inc ebx |
||
533 | loop .cycle_0 |
||
534 | popad |
||
535 | ret |
||
536 | endp |
||
537 | |||
538 | ;input: |
||
539 | ; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512 |
||
540 | ;output: |
||
541 | ; eax - color |
||
542 | align 4 |
||
543 | proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword |
||
544 | mov ecx,[r] |
||
545 | xor edi,edi |
||
546 | inc edi |
||
547 | |||
548 | mov ebx,[ind] |
||
549 | ;b = b xor (b shr 1) |
||
550 | ;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов |
||
551 | mov eax,ebx |
||
552 | shr eax,1 |
||
553 | xor ebx,eax |
||
554 | |||
555 | mov edx,ebx |
||
556 | shr edx,cl |
||
557 | mov eax,edx |
||
558 | shr eax,cl |
||
559 | |||
560 | mov ch,8 |
||
561 | sub ch,cl |
||
562 | shr ecx,8 |
||
563 | shl ebx,cl |
||
564 | shl edx,cl |
||
565 | shl eax,cl |
||
566 | |||
567 | shl edi,cl |
||
568 | dec edi ;edi - 1...1b |
||
569 | |||
570 | or ebx,edi |
||
571 | or edx,edi |
||
572 | or eax,edi |
||
573 | |||
574 | shl eax,8 |
||
575 | mov al,dl |
||
576 | shl eax,8 |
||
577 | mov al,bl |
||
578 | and eax,0xffffff |
||
579 | ret |
||
580 | endp |
||
581 |