Rev 2883 | 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 | ;output: |
||
91 | ; eax - число узлов в объекте v_obj |
||
92 | align 4 |
||
93 | proc vox_obj_get_nodes uses edi, v_obj:dword |
||
94 | mov edi,[v_obj] |
||
95 | add edi,vox_offs_data |
||
96 | xor eax,eax |
||
97 | stdcall vox_obj_rec0 |
||
98 | ret |
||
99 | endp |
||
100 | |||
2758 | IgorA | 101 | ;??? |
2748 | IgorA | 102 | ;input: |
103 | ; edi - указатель на данные воксельного объекта |
||
104 | ;output: |
||
105 | ; eax - eax + число узлов в данных вокс. объекта |
||
106 | ; edi - указатель на смещенные данные вокс. объекта |
||
107 | align 4 |
||
108 | proc vox_obj_rec0 |
||
109 | inc eax |
||
110 | cmp byte[edi+3],0 ;смотрим есть ли поддеревья |
||
111 | je .sub_trees |
||
112 | |||
113 | ;рекурсивный перебор поддеревьев |
||
114 | push ebx ecx |
||
115 | mov bh,byte[edi+3] |
||
116 | add edi,4 |
||
117 | mov bl,8 |
||
118 | .cycle: |
||
119 | bt bx,8 ;тестируем только bh |
||
120 | jnc .c_next |
||
121 | stdcall vox_obj_rec0 |
||
122 | .c_next: |
||
123 | shr bh,1 |
||
124 | dec bl |
||
125 | jnz .cycle |
||
126 | pop ecx ebx |
||
127 | |||
128 | jmp .end_f |
||
129 | .sub_trees: |
||
130 | add edi,4 |
||
131 | .end_f: |
||
132 | ret |
||
133 | endp |
||
134 | |||
135 | ; |
||
136 | ;output: |
||
137 | ; eax - размер в байтах занимаемый объектом v_obj |
||
138 | align 4 |
||
139 | proc buf2d_vox_obj_get_size, v_obj:dword |
||
140 | stdcall vox_obj_get_nodes,[v_obj] |
||
141 | shl eax,2 |
||
142 | add eax,vox_offs_data |
||
143 | ret |
||
144 | endp |
||
145 | |||
146 | ; создание вокселя в 3 этапа: |
||
147 | ; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем) |
||
148 | ; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем) |
||
149 | ; 3) меняем цвет вокселя |
||
150 | align 4 |
||
151 | proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
2758 | IgorA | 152 | coord_z:dword,k_scale:dword,color:dword |
2748 | IgorA | 153 | pushad |
154 | locals |
||
155 | p_node dd 0 ;родительский узел |
||
156 | endl |
||
157 | |||
158 | mov edi,[v_obj] |
||
159 | add edi,vox_offs_data |
||
160 | mov esi,[k_scale] |
||
161 | cmp esi,1 |
||
162 | jl .change |
||
163 | ; *** (1) *** |
||
164 | .found: |
||
165 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
166 | movzx bx,byte[edi+3] |
||
167 | mov [p_node],edi |
||
168 | add edi,4 |
||
2758 | IgorA | 169 | |
2748 | IgorA | 170 | cmp eax,0 |
171 | je .end_1 |
||
172 | mov ecx,eax |
||
173 | cld |
||
2758 | IgorA | 174 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
2748 | IgorA | 175 | bt bx,0 ;проверяем есть ли дочерние узлы |
176 | jnc .end_0 |
||
177 | xor eax,eax |
||
178 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
179 | .end_0: |
||
180 | shr bx,1 |
||
181 | loop @b |
||
182 | .end_1: |
||
183 | bt bx,0 |
||
184 | jnc .creat ;если поддерева не существует, переходим к созданию |
||
185 | dec esi |
||
186 | cmp esi,0 |
||
187 | jg .found |
||
188 | jmp .change |
||
189 | |||
190 | ; *** (2) *** |
||
191 | .creat: |
||
192 | mov edx,[color] ;меняем цвет |
||
193 | and edx,0xffffff ;для профилактики |
||
194 | mov ecx,esi |
||
195 | stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов |
||
196 | mov ebx,[p_node] |
||
197 | cld |
||
198 | @@: |
||
199 | mov dword[edi],edx |
||
200 | stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
201 | or byte[ebx+3],al |
||
202 | |||
203 | mov ebx,edi |
||
204 | add edi,4 |
||
205 | dec esi |
||
206 | loop @b |
||
207 | jmp .end_2 |
||
208 | |||
209 | ; *** (3) *** |
||
210 | .change: |
||
211 | mov eax,[color] ;меняем цвет |
||
212 | mov word[edi],ax |
||
213 | shr eax,16 |
||
214 | mov byte[edi+2],al |
||
215 | |||
216 | .end_2: |
||
217 | popad |
||
218 | ret |
||
219 | endp |
||
220 | |||
2758 | IgorA | 221 | ; удаление вокселя в 2 этапа: |
2748 | IgorA | 222 | ; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции) |
2758 | IgorA | 223 | ; 2) удаляем ветвь с вокселем |
2748 | IgorA | 224 | align 4 |
225 | proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
226 | coord_z:dword,k_scale:dword |
||
227 | pushad |
||
228 | locals |
||
229 | p_node dd 0 ;родительский узел |
||
230 | endl |
||
231 | mov edi,[v_obj] |
||
232 | add edi,vox_offs_data |
||
233 | mov esi,[k_scale] |
||
234 | cmp esi,1 |
||
235 | jl .end_2 |
||
236 | ; *** (1) *** |
||
237 | .found: |
||
238 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
239 | movzx bx,byte[edi+3] |
||
240 | mov [p_node],edi |
||
241 | add edi,4 |
||
242 | cmp eax,0 |
||
243 | je .end_1 |
||
244 | mov ecx,eax |
||
245 | cld |
||
2758 | IgorA | 246 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
2748 | IgorA | 247 | bt bx,0 ;проверяем есть ли дочерние узлы |
248 | jnc .end_0 |
||
249 | xor eax,eax |
||
250 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
251 | .end_0: |
||
252 | shr bx,1 |
||
253 | loop @b |
||
254 | .end_1: |
||
255 | bt bx,0 |
||
256 | jnc .end_2 ;если поддерева не существует |
||
257 | dec esi |
||
258 | cmp esi,0 |
||
259 | jg .found |
||
260 | |||
261 | ; *** (2) *** |
||
262 | ;delete |
||
263 | stdcall vox_obj_del_nodes_mem, [v_obj],edi ;сужаем место занимаемое объектом, при удалении узла |
||
264 | mov ebx,[p_node] |
||
265 | |||
266 | stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
267 | xor byte[ebx+3],al |
||
268 | |||
269 | .end_2: |
||
270 | popad |
||
271 | ret |
||
272 | endp |
||
273 | |||
2883 | IgorA | 274 | ; взять цвет вокселя в 2 этапа: |
275 | ; 1) ищем место в структуре дерева, где есть узел (если ветвь не существует, выходим из функции) |
||
276 | ; 2) берем цвет вокселя |
||
277 | ;output: |
||
278 | ; eax - цвет вокселя |
||
279 | align 4 |
||
280 | proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\ |
||
281 | coord_z:dword,k_scale:dword |
||
282 | push ebx ecx edi esi |
||
283 | locals |
||
284 | p_node dd 0 ;родительский узел |
||
285 | endl |
||
286 | mov edi,[v_obj] |
||
287 | add edi,vox_offs_data |
||
288 | mov esi,[k_scale] |
||
289 | cmp esi,1 |
||
290 | jl .end_2 |
||
291 | ; *** (1) *** |
||
292 | .found: |
||
293 | stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi |
||
294 | movzx bx,byte[edi+3] |
||
295 | mov [p_node],edi |
||
296 | add edi,4 |
||
297 | cmp eax,0 |
||
298 | je .end_1 |
||
299 | mov ecx,eax |
||
300 | cld |
||
301 | @@: ;цикл для пропуска предыдущих поддеревьев в узле |
||
302 | bt bx,0 ;проверяем есть ли дочерние узлы |
||
303 | jnc .end_0 |
||
304 | xor eax,eax |
||
305 | stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви |
||
306 | .end_0: |
||
307 | shr bx,1 |
||
308 | loop @b |
||
309 | .end_1: |
||
310 | bt bx,0 |
||
311 | jnc .end_2 ;если поддерева не существует |
||
312 | dec esi |
||
313 | cmp esi,0 |
||
314 | jg .found |
||
315 | |||
316 | ; *** (2) *** |
||
317 | ;get |
||
318 | mov eax,dword[edi] |
||
319 | and eax,0xffffff |
||
320 | jmp .end_3 |
||
321 | .end_2: |
||
322 | mov eax,1 shl 31 |
||
323 | .end_3: |
||
324 | pop esi edi ecx ebx |
||
325 | ret |
||
326 | endp |
||
327 | |||
2748 | IgorA | 328 | ; сдвигает узлы для добавления новых узлов |
329 | ;input: |
||
330 | ; p_insert - позиция для вставки |
||
331 | ; count - колличество вставляемых узлов |
||
332 | align 4 |
||
333 | proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword |
||
334 | stdcall buf2d_vox_obj_get_size,[v_obj] |
||
335 | mov esi,[v_obj] |
||
336 | add esi,eax ;esi - указатель на конец файла |
||
337 | mov edi,[count] |
||
338 | shl edi,2 |
||
339 | add edi,esi ;edi - указатель на будущий конец файла |
||
340 | mov ecx,esi |
||
341 | sub ecx,[p_insert] |
||
342 | shr ecx,2 ;ecx - число циклов для копирования |
||
343 | sub esi,4 ;esi - указатель на последний узел |
||
344 | sub edi,4 ;edi - указатель на будущий последний узел |
||
345 | std |
||
346 | rep movsd ;сдвигаем память |
||
347 | ret |
||
348 | endp |
||
349 | |||
350 | ;input: |
||
351 | ; p_insert - позиция для ... |
||
352 | align 4 |
||
353 | proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword |
||
354 | stdcall buf2d_vox_obj_get_size,[v_obj] |
||
355 | mov ecx,eax |
||
356 | mov edi,[p_insert] |
||
357 | add ecx,[v_obj] |
||
358 | sub ecx,edi |
||
359 | xor eax,eax |
||
360 | stdcall vox_obj_rec0 |
||
361 | shr ecx,2 |
||
362 | sub ecx,eax ;ecx - число циклов для копирования |
||
363 | shl eax,2 |
||
364 | add eax,[p_insert] |
||
365 | mov esi,eax |
||
366 | mov edi,[p_insert] |
||
367 | cld |
||
368 | rep movsd ;сдвигаем память |
||
369 | ret |
||
370 | endp |
||
371 | |||
2758 | IgorA | 372 | ;??? |
2748 | IgorA | 373 | ; определение позиции узла в дереве (от 0 до 7) |
374 | align 4 |
||
375 | proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ |
||
376 | coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword |
||
377 | mov ecx,[k_scale] |
||
378 | dec ecx |
||
379 | mov eax,[coord_x] |
||
380 | mov ebx,[coord_y] |
||
381 | mov edi,[coord_z] |
||
382 | cmp ecx,1 |
||
383 | jl .end_0 |
||
384 | shr eax,cl |
||
385 | shr ebx,cl |
||
386 | shr edi,cl |
||
387 | .end_0: |
||
388 | and eax,1 |
||
389 | bt ebx,0 |
||
390 | jnc @f |
||
391 | bts eax,1 |
||
392 | @@: |
||
393 | bt edi,0 |
||
394 | jnc @f |
||
395 | bts eax,2 |
||
396 | @@: |
||
397 | |||
398 | mov edi,[v_obj] |
||
399 | add edi,vox_offs_tree_table |
||
400 | @@: |
||
401 | cmp al,byte[edi] |
||
402 | je @f |
||
403 | inc edi |
||
404 | jmp @b |
||
405 | @@: |
||
406 | sub edi,[v_obj] |
||
407 | sub edi,vox_offs_tree_table |
||
408 | mov eax,edi |
||
409 | |||
410 | ret |
||
411 | endp |
||
412 | |||
413 | ;output: |
||
414 | ; eax - 1,2,4,8,16, ... ,128 |
||
415 | align 4 |
||
416 | proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\ |
||
417 | coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword |
||
418 | mov ecx,[k_scale] |
||
419 | dec ecx |
||
420 | mov eax,[coord_x] |
||
421 | mov ebx,[coord_y] |
||
422 | mov edi,[coord_z] |
||
423 | cmp ecx,1 |
||
424 | jl .end_0 |
||
425 | shr eax,cl |
||
426 | shr ebx,cl |
||
427 | shr edi,cl |
||
428 | .end_0: |
||
429 | and eax,1 |
||
430 | bt ebx,0 |
||
431 | jnc @f |
||
432 | bts eax,1 |
||
433 | @@: |
||
434 | bt edi,0 |
||
435 | jnc @f |
||
436 | bts eax,2 |
||
437 | @@: |
||
438 | |||
439 | mov ecx,[v_obj] |
||
440 | add ecx,vox_offs_tree_table |
||
441 | @@: |
||
442 | cmp al,byte[ecx] |
||
443 | je @f |
||
444 | inc ecx |
||
445 | jmp @b |
||
446 | @@: |
||
447 | mov eax,1 ;устанавливаем первоначальное значение бита |
||
448 | sub ecx,[v_obj] |
||
449 | sub ecx,vox_offs_tree_table |
||
450 | jz @f |
||
451 | shl eax,cl ;сдвигаем бит |
||
452 | @@: |
||
453 | |||
454 | ret |
||
455 | endp |
||
456 | |||
457 | ;функция для рисования палитры |
||
458 | align 4 |
||
459 | proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\ |
||
460 | cell_w:dword, cell_h:dword, colors_w:dword, colors:dword |
||
461 | pushad |
||
462 | mov ebx,[coord_x] |
||
463 | mov edx,[coord_y] |
||
464 | mov ecx,[colors] |
||
465 | xor edi,edi |
||
466 | mov esi,[cell_h] |
||
467 | cld |
||
468 | .cycle_0: |
||
469 | stdcall get_palete_color, ecx,3 |
||
470 | stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax |
||
471 | inc edi |
||
472 | cmp edi,[colors_w] |
||
473 | jl @f |
||
474 | mov ebx,[coord_x] |
||
475 | sub ebx,[cell_w] |
||
476 | dec ebx |
||
477 | add edx,esi ;высота ячейки |
||
478 | inc edx ;отступ между ячейками |
||
479 | xor edi,edi |
||
480 | @@: |
||
481 | add ebx,[cell_w] |
||
482 | inc ebx |
||
483 | loop .cycle_0 |
||
484 | popad |
||
485 | ret |
||
486 | endp |
||
487 | |||
488 | ;input: |
||
489 | ; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512 |
||
490 | ;output: |
||
491 | ; eax - color |
||
492 | align 4 |
||
493 | proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword |
||
494 | mov ecx,[r] |
||
495 | xor edi,edi |
||
496 | inc edi |
||
497 | |||
498 | mov ebx,[ind] |
||
499 | ;b = b xor (b shr 1) |
||
500 | ;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов |
||
501 | mov eax,ebx |
||
502 | shr eax,1 |
||
503 | xor ebx,eax |
||
504 | |||
505 | mov edx,ebx |
||
506 | shr edx,cl |
||
507 | mov eax,edx |
||
508 | shr eax,cl |
||
509 | |||
510 | mov ch,8 |
||
511 | sub ch,cl |
||
512 | shr ecx,8 |
||
513 | shl ebx,cl |
||
514 | shl edx,cl |
||
515 | shl eax,cl |
||
516 | |||
517 | shl edi,cl |
||
518 | dec edi ;edi - 1...1b |
||
519 | |||
520 | or ebx,edi |
||
521 | or edx,edi |
||
522 | or eax,edi |
||
523 | |||
524 | shl eax,8 |
||
525 | mov al,dl |
||
526 | shl eax,8 |
||
527 | mov al,bl |
||
528 | and eax,0xffffff |
||
529 | ret |
||
530 | endp |
||
531 |