diff --git a/programs/develop/libraries/box_lib/trunk/t_edit.mac b/programs/develop/libraries/box_lib/trunk/t_edit.mac index 4ad2e8b55e..a3039e2a1e 100644 --- a/programs/develop/libraries/box_lib/trunk/t_edit.mac +++ b/programs/develop/libraries/box_lib/trunk/t_edit.mac @@ -449,6 +449,15 @@ proc ted_key, edit:dword, table:dword, control:dword stdcall ted_text_add,edi,ecx,1,edx ;добавляем символ введенный с клавиатуры cmp ted_key_new,13 jne .dr_m_win + ;если вставили символ новой строки + mov ecx,ted_scr_w + inc dword[ecx+sb_offs_max_area] ;увеличиваем размер вертикального скроллинга + mov edx,ted_cur_y + cmp edx,dword[ecx+sb_offs_cur_area] + jl .no_change + dec ted_cur_y ;курсор оставляем на месте + inc dword[ecx+sb_offs_position] ;сдвигаем ползунок + .no_change: stdcall ted_draw,edi jmp .dr_cur_l .dr_m_win: diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm index f587309f07..df46efba8d 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -2910,7 +2910,7 @@ endp ; align 4 -proc vox_add uses ebx ecx, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword +proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword pushad mov eax,[coord_x] mov ebx,[coord_y] @@ -2952,6 +2952,984 @@ popad ret endp +;description: +; возврашает ширину воксельного изображения с 3-мя гранями +; принимает указатель на кисть и масштаб +align 4 +proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +;description: +; возврашает высоту воксельного изображения с 3-мя гранями +; принимает указатель на кисть и масштаб +align 4 +proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx+1] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +;description: +; функция рисующая воксельный объект +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword +pushad + mov edi,[v_obj] + mov ecx,[k_scale] + mov ebx,[coord_x] + +;--- + ;тестовая рамка + mov eax,[h_br] + + movzx edx,byte[eax] + movzx esi,byte[eax+1] + cmp ecx,1 + jl .end_c0 + shl edx,cl + shl esi,cl + .end_c0: + stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, 0xd0d0d0 +;--- + + mov edx,[coord_y] + add edi,vox_offs_data + + mov esi,[coord_z] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + +popad + ret +endp + +;description: +; функция рисующая часть воксельного объекта +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\ +s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword +pushad +locals + p_node dd 0 ;родительский узел +endl + mov edi,[v_obj] + add edi,vox_offs_data + + mov ecx,[k_scale] + mov ebx,[coord_x] + + ;тестовая рамка + mov eax,[h_br] + + movzx edx,byte[eax] + movzx esi,byte[eax+1] + cmp ecx,1 + jl .end_c0 + shl edx,cl + shl esi,cl + .end_c0: + ;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] + + ;вертикальная полоса + add ebx,edx + shr edx,cl + stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] + mov ecx,[s_k_scale] + shr esi,cl + xor eax,eax + inc eax + shl eax,cl + dec eax + sub eax,[s_c_z] ;значения по оси z возрастают с низу вверх + imul eax,esi + add eax,[coord_y] + stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color] + mov ebx,[coord_y] + shl esi,cl + add ebx,esi + stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] + shr eax,1 + mov esi,[h_br] + movzx esi,byte[esi+1] + ;ползунок + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color] + mov edx,[coord_x] + add edx,eax + ;ползунок + stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color] +;--- + + mov esi,[s_k_scale] + cmp esi,1 + jl .end_2 + + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ;цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + ; *** (2) *** + ;рисование части объекта + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + mov esi,[coord_z] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + .end_2: + +popad + ret +endp + +;input: +; h_br - кисть с изображениями вокселей (32 бита) +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + ;рекурсивный перебор поддеревьев + push eax edx + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne .end_2 + push eax + stdcall vox_get_sub_brush,[h_br],0 ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] + @@: + pop eax + .end_2: + + ;вход внутрь узла + dec ecx +;--- + push ebx + ;mov eax,(h-h_osn/2) + mov ebx,[h_br] + movzx eax,byte[ebx+1] + movzx ebx,byte[ebx+2] + shr ebx,1 + sub eax,ebx + cmp ecx,1 + jl .end_c1 + shl eax,cl + shl ebx,cl + .end_c1: + add esi,ebx + pop ebx + add edx,eax ;коректировка высоты под воксель нижнего уровня +;--- + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push ebx edx esi + stdcall vox_corect_coords, [h_br], [v_obj] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + pop esi edx ebx + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc ecx + pop edx eax + + jmp .end_f + .sub_trees: + ;рисуем узел + push eax + stdcall vox_get_sub_brush,[h_br],ecx ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] + @@: + pop eax + + add edi,4 + .end_f: + ret +endp + +;description: +; функция рисующая одиночный воксел +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; buf_v - буфер с изображением вокселя (32 бита) +; v_color - цвет +align 4 +proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword +pushad + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[buf_v] + mov ecx,buf2d_h + mov esi,buf2d_w + imul ecx,esi + add esi,eax + mov edx,buf2d_data + cld + ;ecx - count pixels in voxel + ;edx - указатель на данные в воксельном буфере + ;edi - указатель на воксельный буфер + ;esi - width voxel buffer add coord x + .cycle: + cmp dword[edx],0 + je @f + ;проверяем буфер глубины + push eax + stdcall buf_get_pixel, [buf_z],eax,ebx + sub eax,[coord_z] + cmp eax,[edx] + jl .dr_pixel + pop eax + jmp @f + .dr_pixel: + ;рисуем точку + pop eax + stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color] + push ecx + mov ecx,[coord_z] + add ecx,[edx] + stdcall buf_set_pixel, [buf_z],eax,ebx,ecx + pop ecx + @@: + add edx,4 + inc eax + cmp eax,esi + jl @f + inc ebx + sub eax,buf2d_w + @@: + loop .cycle +popad + ret +endp + +;description: +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+ +; * y +; / +;+ +; \ +; * x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; edx - координата y +; esi - координата z +; ecx - уровень текушего узла +;output: +; ebx - новая координата x +; edx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords, h_br:dword, v_obj:dword +locals + osn_w_2 dd ? ;ширина основания единичного вокселя : 2 + vox_h dd ? ;высота единичного вокселя +endl + cmp ecx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + push ebx ecx + mov ebx,[h_br] + + movzx ecx,byte[ebx] + shr ecx,1 + mov dword[osn_w_2],ecx + + movzx ecx,byte[ebx+2] + movzx ebx,byte[ebx+1] + sub ebx,ecx + mov dword[vox_h],ebx + shr ecx,1 + mov eax,ecx ;eax - высота основания единичного вокселя : 2 + pop ecx ebx + + cmp ecx,1 + jl .no_scale ;во избежание зацикливания + shl eax,cl + shl dword[osn_w_2],cl + shl dword[vox_h],cl + .no_scale: + +; add esi,eax ;меняем глубину для буфера z (компенсация для координаты y) + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,[osn_w_2] + add edx,eax + add esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add ebx,[osn_w_2] + sub edx,eax + sub esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,[vox_h] + @@: + pop edi eax + .end_f: + ret +endp + +;извлекаем из h_br указатель на буфер с изображением вокселя, указанного порядка n +align 4 +proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword + xor eax,eax + mov ebx,[n] + cmp ebx,0 + jl @f + mov ecx,[h_br] + cmp bl,byte[ecx+3] + jg @f + add ecx,4 + imul ebx,BUF_STRUCT_SIZE + mov eax,ebx + add eax,ecx + @@: + ret +endp + +;description: +; функция рисующая срез воксельного обьекта +;input: +; v_size - размер квадрата с вокселем +; k_scale - степень детализации изображения +; n_plane - номер плоскости сечния (в пределах от 0 до 2^k_scale - 1) +; b_color - цвет границы +align 4 +proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword + cmp [k_scale],0 + jl .end_f +pushad + mov eax,[v_size] + mov ecx,[k_scale] + mov ebx,eax + cmp ecx,1 + jl @f + shl ebx,cl + @@: + ;ebx - полный размер изображения + stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок + mov edx,ebx + add ebx,[coord_y] + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения + + ;рисование точек для сетки + push ecx + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + dec edi + cmp edi,1 + jl .end_0 + mov ecx,edi + imul ecx,edi + mov ebx,[coord_x] + mov edx,[coord_y] + add edx,eax + xor esi,esi + cld + @@: + add ebx,eax + inc esi + stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] + cmp esi,edi + jl .end_1 + ;переход точек на новую строку + xor esi,esi + mov ebx,[coord_x] + add edx,eax + .end_1: + loop @b + .end_0: + pop ecx + + ;eax - размер одного квадрата + ;edi - указатель рисуемые данные из объекта + mov ebx,[coord_x] + mov edx,[coord_y] + mov edi,[v_obj] + add edi,vox_offs_data + xor esi,esi + push eax + imul eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax +popad + .end_f: + ret +endp + +;description: +; функция рисующая срез части воксельного обьекта +;input: +; s_c_x, s_c_y, s_c_z, s_k_scale - параметры определяющие часть воксельного объекта, которая будет рисоваться +align 4 +proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\ +s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword + cmp [k_scale],0 + jl .end_f +pushad +locals + p_node dd 0 ;родительский узел +endl + mov eax,[v_size] + mov ecx,[k_scale] + mov ebx,eax + cmp ecx,1 + jl @f + shl ebx,cl + @@: + ;ebx - полный размер изображения + stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок + mov edx,ebx + add ebx,[coord_y] + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения + + ;рисование точек для сетки + push ecx + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + dec edi + cmp edi,1 + jl .end_3 + mov ecx,edi + imul ecx,edi + mov ebx,[coord_x] + mov edx,[coord_y] + add edx,eax + xor esi,esi + cld + @@: + add ebx,eax + inc esi + stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] + cmp esi,edi + jl .end_4 + ;переход точек на новую строку + xor esi,esi + mov ebx,[coord_x] + add edx,eax + .end_4: + loop @b + .end_3: + pop ecx + + mov esi,[s_k_scale] + cmp esi,1 + jl .end_2 + mov edi,[v_obj] + add edi,vox_offs_data + + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ;цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + mov eax,[v_size] + ;eax - размер одного квадрата + ;edi - указатель рисуемые данные из объекта + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + xor esi,esi + push eax + imul eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax + + .end_2: +popad + .end_f: + ret +endp + +;description: +; определение позиции узла в дереве (от 0 до 7) +align 4 +proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ +coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword + mov ecx,[k_scale] + dec ecx + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[coord_z] + cmp ecx,1 + jl .end_0 + shr eax,cl + shr ebx,cl + shr edi,cl + .end_0: + and eax,1 + bt ebx,0 + jnc @f + bts eax,1 + @@: + bt edi,0 + jnc @f + bts eax,2 + @@: + + mov edi,[v_obj] + add edi,vox_offs_tree_table + @@: + cmp al,byte[edi] + je @f + inc edi + jmp @b + @@: + sub edi,[v_obj] + sub edi,vox_offs_tree_table + mov eax,edi + + ret +endp + +;input: +; edi - указатель на данные воксельного объекта +;output: +; eax - eax + число узлов в данных вокс. объекта +; edi - указатель на смещенные данные вокс. объекта +align 4 +proc vox_obj_rec0 + inc eax + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;рекурсивный перебор поддеревьев + push ebx ecx + mov bh,byte[edi+3] + add edi,4 + mov bl,8 + .cycle: + bt bx,8 ;тестируем только bh + jnc .c_next + stdcall vox_obj_rec0 + .c_next: + shr bh,1 + dec bl + jnz .cycle + pop ecx ebx + + jmp .end_f + .sub_trees: + add edi,4 + .end_f: + ret +endp + +;description: +; функция рисующая горизонтальную полосу с ползунком +align 4 +proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\ +size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword + mov ebx,[size_x] + stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color] + mov ecx,[k_scale] + shr ebx,cl + mov eax,[pos] + imul eax,ebx + add eax,[coord_x] + stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color] + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ +v_size:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + ;проверка глубины esi + ;clip_z=n_plane*v_size + stdcall vox_is_clip, [clip_z],[v_size] + cmp eax,0 + je @f + push ecx + mov ecx,dword[edi] + and ecx,0xffffff + stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx + pop ecx + @@: + + ;рекурсивный перебор поддеревьев + push edx + + ;вход внутрь узла + dec ecx + + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl + @@: + add edx,eax ;коректировка высоты под воксель нижнего уровня + + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push eax ebx edx esi + stdcall vox_corect_coords_pl, [v_obj],[v_size] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] + pop esi edx ebx eax + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc ecx + pop edx + + jmp .end_f + .sub_trees: + cmp ecx,0 + jl .end_0 ;не рисуем очень маленькие воксели + + ;проверка глубины esi + ;clip_z=n_plane*v_size + stdcall vox_is_clip, [clip_z],[v_size] + cmp eax,0 + je .end_0 + + ;рисуем узел + mov eax,[edi] + and eax,0xffffff + push eax ;цвет узла + + mov eax,[v_size] + cmp ecx,1 + jl @f + ;квадрат больше текущего масштаба + shl eax,cl ;размер узла + stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax + push ebx edx esi + mov esi,eax + inc ebx + inc edx + sub esi,2 + mov eax,[buf_i] + push dword 128 + push dword[eax+16] ;+16 - b_color + stdcall combine_colors_3,[edi] + stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax + pop esi edx ebx + jmp .end_0 + @@: + ;квадрат текущего масштаба + stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax + + .end_0: + add edi,4 + .end_f: + ret +endp + +;description: +; вспомогательная функция для проверки глубины esi +;input: +; ecx - уровень текушего узла +; esi - coord z +; clip_z - n_plane*v_size +;output: +; eax - 0 if no draw, 1 if draw +align 4 +proc vox_is_clip uses ebx edi, clip_z:dword, v_size:dword + xor eax,eax + mov ebx,[clip_z] + mov edi,[v_size] + cmp ecx,1 + jl @f + shl edi,cl + @@: + ;edi = 2^ecx + add edi,esi + cmp edi,ebx ;if (esi+2^ecx*v_size <= (n_plane*v_size)) no draw + jle @f + add ebx,[v_size] + cmp esi,ebx ;if (esi >= (n_plane+1)*v_size) no draw + jge @f + inc eax + @@: + ret +endp + +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+-* x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; edx - координата y +; esi - координата z +; ecx - уровень текушего узла +;output: +; ebx - новая координата x +; edx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords_pl, v_obj:dword, v_size:dword + cmp ecx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + mov eax,[v_size] ;eax - высота основания единичного вокселя + cmp ecx,1 + jl @f ;во избежание зацикливания + shl eax,cl + @@: + + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,eax + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,eax + @@: + pop edi eax + .end_f: + ret +endp + +;description: +; функция рисующая тени +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ +coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword +locals + correct_z dd 0 ;коректировка для буфера глубины +endl +pushad + mov eax,[k_scale] + add eax,[prop] + mov dword[correct_z],8 + sub [correct_z],eax + mov ebx,[coord_x] + ;correct_z = 8-k_scale-prop + + stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] + mov edx,eax ;edx - ширина изображения + stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale] + mov esi,eax + + mov edi,[coord_y] + mov ecx,edx + add edx,ebx ;ширина + отступ слева + imul ecx,esi + cld + .cycle_0: + stdcall buf_get_pixel, [buf_z],ebx,edi + cmp eax,0 + je @f + stdcall vox_correct_z, [correct_z] + push eax + stdcall buf_get_pixel, [buf_i],ebx,edi + stdcall combine_colors_3,eax,[color] ;,eax + stdcall buf_set_pixel, [buf_i],ebx,edi,eax + @@: + inc ebx + cmp ebx,edx + jl @f + mov ebx,[coord_x] + inc edi + @@: + loop .cycle_0 + +popad + ret +endp + +;output: +; eax - scaled coord z +align 4 +proc vox_correct_z uses ecx, correct_z:dword + mov ecx,[correct_z] + cmp ecx,0 + je .end_f + jl .end_0 + shl eax,cl + jmp .end_f + .end_0: + neg ecx + inc ecx + shr eax,cl + .end_f: + ret +endp + +;output: +; eax - color +align 4 +proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword + + mov ebx,[col_0] + mov ecx,[col_1] + movzx di,byte[alpha] ;pro + mov si,0x00ff ;---get transparent--- + sub si,di ;256-pro + + ;---blye--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + mov cl,ah + ;---green--- + movzx ax,bh + imul ax,si + movzx dx,ch + imul dx,di + add ax,dx + mov ch,ah + shr ebx,16 + ror ecx,16 + ;---red--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + + shl eax,8 + ror ecx,16 + mov ax,cx + and eax,0xffffff + + ret +endp + txt_err_n8b db 'need buffer 8 bit',13,10,0 txt_err_n24b db 'need buffer 24 bit',13,10,0 txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 @@ -2987,6 +3965,13 @@ EXPORTS: dd sz_buf2d_get_pixel, buf_get_pixel dd sz_buf2d_vox_brush_create, vox_brush_create dd sz_buf2d_vox_brush_delete, vox_brush_delete + dd sz_buf2d_vox_obj_get_img_w_3g, buf_vox_obj_get_img_w_3g + dd sz_buf2d_vox_obj_get_img_h_3g, buf_vox_obj_get_img_h_3g + dd sz_buf2d_vox_obj_draw_3g, buf_vox_obj_draw_3g + dd sz_buf2d_vox_obj_draw_3g_scaled, buf_vox_obj_draw_3g_scaled + dd sz_buf2d_vox_obj_draw_pl, buf_vox_obj_draw_pl + dd sz_buf2d_vox_obj_draw_pl_scaled, buf_vox_obj_draw_pl_scaled + dd sz_buf2d_vox_obj_draw_3g_shadows, buf_vox_obj_draw_3g_shadows dd 0,0 sz_lib_init db 'lib_init',0 sz_buf2d_create db 'buf2d_create',0 @@ -3017,3 +4002,10 @@ EXPORTS: sz_buf2d_get_pixel db 'buf2d_get_pixel',0 sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 diff --git a/programs/media/voxel_editor/trunk/vox_draw.inc b/programs/media/voxel_editor/trunk/vox_draw.inc index 149dff5abd..2bdcec8efa 100644 --- a/programs/media/voxel_editor/trunk/vox_draw.inc +++ b/programs/media/voxel_editor/trunk/vox_draw.inc @@ -13,399 +13,75 @@ buf2d_bits equ byte[edi+20] ; vox_offs_tree_table equ 4 vox_offs_data equ 12 -;description: -; функция рисующая одиночный воксел -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; buf_v - буфер с изображением вокселя (32 бита) -; v_color - цвет -align 4 -proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ -coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword -pushad - mov eax,[coord_x] - mov ebx,[coord_y] - mov edi,[buf_v] - mov ecx,buf2d_h - mov esi,buf2d_w - imul ecx,esi - add esi,eax - mov edx,buf2d_data - cld - ;ecx - count pixels in voxel - ;edx - указатель на данные в воксельном буфере - ;edi - указатель на воксельный буфер - ;esi - width voxel buffer add coord x - .cycle: - cmp dword[edx],0 - je @f - ;проверяем буфер глубины - push eax - stdcall [buf2d_get_pixel], [buf_z],eax,ebx - sub eax,[coord_z] - cmp eax,[edx] - jl .dr_pixel - pop eax - jmp @f - .dr_pixel: - ;рисуем точку - pop eax - stdcall [buf2d_set_pixel], [buf_i],eax,ebx,[v_color] - push ecx - mov ecx,[coord_z] - add ecx,[edx] - stdcall [buf2d_set_pixel], [buf_z],eax,ebx,ecx - pop ecx - @@: - add edx,4 - inc eax - cmp eax,esi - jl @f - inc ebx - sub eax,buf2d_w - @@: - loop .cycle -popad - ret -endp - -;description: -; функция рисующая воксельный объект -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; h_br - кисть с изображениями вокселей (32 бита) -; v_obj - воксельный объект -; k_scale - коэф. для масштабирования изображения -align 4 -proc buf2d_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ -coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword -pushad - mov edi,[v_obj] - mov eax,[k_scale] - mov ebx,[coord_x] - -;--- - ;тестовая рамка - mov ecx,[h_br] - - movzx edx,byte[ecx] - movzx esi,byte[ecx+1] - cmp eax,1 - jl .end_c0 - mov ecx,eax - shl edx,cl - shl esi,cl - .end_c0: - stdcall [buf2d_rect_by_size], [buf_i], ebx,[coord_y],edx,esi, 0xd0d0d0 -;--- - - mov ecx,[coord_y] - mov edx,eax - add edi,vox_offs_data - - mov esi,[coord_z] - stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] - -popad - ret -endp - -;description: -; функция рисующая тени -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; h_br - кисть с изображениями вокселей (32 бита) -; k_scale - коэф. для масштабирования изображения -align 4 -proc buf2d_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ -coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword -locals - correct_z dd 0 ;коректировка для буфера глубины -endl -pushad - mov eax,[k_scale] - add eax,[prop] - mov dword[correct_z],8 - sub [correct_z],eax - mov ebx,[coord_x] - ;correct_z = 8-k_scale-prop - - stdcall buf2d_vox_obj_get_img_w_3g, [h_br],[k_scale] - mov edx,eax ;edx - ширина изображения - stdcall buf2d_vox_obj_get_img_h_3g, [h_br],[k_scale] - mov esi,eax - - mov edi,[coord_y] - mov ecx,edx - add edx,ebx ;ширина + отступ слева - imul ecx,esi - cld - .cycle_0: - stdcall [buf2d_get_pixel], [buf_z],ebx,edi - cmp eax,0 - je @f - stdcall vox_correct_z, [correct_z] - push eax - stdcall [buf2d_get_pixel], [buf_i],ebx,edi - stdcall combine_colors_3,eax,[color] ;,eax - stdcall [buf2d_set_pixel], [buf_i],ebx,edi,eax - @@: - inc ebx - cmp ebx,edx - jl @f - mov ebx,[coord_x] - inc edi - @@: - loop .cycle_0 - -popad - ret -endp - ;output: -; eax - scaled coord z +; eax - (event shl 30) + position align 4 -proc vox_correct_z uses ecx, correct_z:dword - mov ecx,[correct_z] - cmp ecx,0 - je .end_f - jl .end_0 - shl eax,cl - jmp .end_f - .end_0: - neg ecx - inc ecx - shr eax,cl - .end_f: - ret -endp +proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword + mov ecx,[scale_obj] + stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx + cmp eax,[coord_y] + jle .test_x + stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx + cmp eax,[coord_x] + jle .test_z -;output: -; eax - color -align 4 -proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword - - mov ebx,[col_0] - mov ecx,[col_1] - movzx di,byte[alpha] ;pro - mov si,0x00ff ;---get transparent--- - sub si,di ;256-pro - - ;---blye--- - movzx ax,bl - imul ax,si - movzx dx,cl - imul dx,di - add ax,dx - mov cl,ah - ;---green--- - movzx ax,bh - imul ax,si - movzx dx,ch - imul dx,di - add ax,dx - mov ch,ah - shr ebx,16 - ror ecx,16 - ;---red--- - movzx ax,bl - imul ax,si - movzx dx,cl - imul dx,di - add ax,dx - - shl eax,8 - ror ecx,16 - mov ax,cx - and eax,0xffffff - - ret -endp - -;input: -; h_br - кисть с изображениями вокселей (32 бита) -; ebx - coord_x -; ecx - coord_y -; esi - coord_z -; edx - уровень текушего узла -; edi - указатель на данные воксельного объекта -align 4 -proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword -;, coord_z:dword - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - ;рекурсивный перебор поддеревьев - push eax ecx - - ;прорисовка рамки если размер узла = 1 - cmp edx,0 - jne .end_2 - push eax - stdcall vox_get_sub_brush,[h_br],0 ;определяем кисть для рисования - cmp eax,0 ;если кисть не найдена - je @f - stdcall draw_vox, [buf_i], [buf_z], eax, ebx,ecx,esi, [edi] - @@: - pop eax - .end_2: - - ;вход внутрь узла - dec edx -;--- - push ebx - ;mov eax,(7-4/2) - mov ebx,[h_br] - movzx eax,byte[ebx+1] - movzx ebx,byte[ebx+2] - shr ebx,1 - sub eax,ebx - cmp edx,1 - jl .end_c1 - push ecx - mov ecx,edx - shl eax,cl - shl ebx,cl ;??? - pop ecx - .end_c1: - add esi,ebx ;??? - pop ebx - add ecx,eax ;коректировка высоты под воксель нижнего уровня -;--- - mov ah,byte[edi+3] - add edi,4 - mov al,8 - .cycle: - bt ax,8 ;тестируем только ah - jnc .c_next - push ebx ecx esi - stdcall vox_corect_coords, [h_br], [v_obj] - stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] - pop esi ecx ebx - .c_next: - shr ah,1 - dec al - jnz .cycle - - ;выход из узла - inc edx - pop ecx eax - - jmp .end_f - .sub_trees: - ;рисуем узел - push eax - stdcall vox_get_sub_brush,[h_br],edx ;определяем кисть для рисования - cmp eax,0 ;если кисть не найдена - je @f - stdcall draw_vox, [buf_i], [buf_z], eax, ebx,ecx,esi, [edi] - @@: - pop eax - - add edi,4 - .end_f: - ret -endp - -;извлекаем из h_br указатель на буфер с изображением вокселя, указанного порядка n -align 4 -proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword + .no_change: xor eax,eax - mov ebx,[n] - cmp ebx,0 - jl @f - mov ecx,[h_br] - cmp bl,byte[ecx+3] - jg @f - add ecx,4 - imul ebx,BUF_STRUCT_SIZE - mov eax,ebx - add eax,ecx + jmp .end_f + + .test_x: + mov ebx,[h_br] + movzx ebx,byte[ebx+1] + add eax,ebx + cmp eax,[coord_y] + jl .no_change + stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx + cmp eax,[coord_x] + jl .no_change + mov ebx,eax + mov ecx,[scale_img] + inc ecx + shr ebx,cl + xor edx,edx + mov eax,[coord_x] + div ebx + dec ecx + xor ebx,ebx + inc ebx + shl ebx,cl + cmp eax,ebx + jge @f + or eax,1 shl 30 + jmp .end_f @@: - ret -endp + sub eax,ebx + or eax,2 shl 30 + jmp .end_f -;функция для коректировки координат -;направления осей координат в вокселе: -;*z -;| -;+ -; * y -; / -;+ -; \ -; * x -;input: -; al - номер узла в дереве (от 1 до 8) -; ebx - координата x -; ecx - координата y -; esi - координата z -; edx - уровень текушего узла -;output: -; ebx - новая координата x -; ecx - новая координата y -; esi - новая координата z -align 4 -proc vox_corect_coords, h_br:dword, v_obj:dword -locals - osn_w_2 dd ? ;ширина основания единичного вокселя : 2 - vox_h dd ? ;высота единичного вокселя -endl - cmp edx,0 - jl .end_f ;для ускорения отрисовки + .test_z: + mov ebx,[h_br] + movzx ebx,byte[ebx] + add eax,ebx + cmp eax,[coord_x] + jl .no_change + mov ebx,[h_br] + movzx ebx,byte[ebx+1] + mov ecx,[scale_obj] + shl ebx,cl + mov ecx,[scale_img] + shr ebx,cl + mov eax,[coord_y] + xor edx,edx + div ebx + ;инверсия координаты y + xor edx,edx + inc edx + shl edx,cl + dec edx + sub edx,eax + mov eax,edx + or eax,3 shl 30 - push eax edi - and eax,15 ;выделяем номер узла в дереве - mov edi,[v_obj] - add edi,vox_offs_tree_table - add edi,8 - sub edi,eax - - push ebx ecx - mov ebx,[h_br] - - movzx ecx,byte[ebx] - shr ecx,1 - mov dword[osn_w_2],ecx - - movzx ecx,byte[ebx+2] - movzx ebx,byte[ebx+1] - sub ebx,ecx - mov dword[vox_h],ebx - shr ecx,1 - mov eax,ecx ;eax - высота основания единичного вокселя : 2 - pop ecx ebx - - cmp edx,1 - jl .no_scale ;во избежание зацикливания - push ecx - mov ecx,edx - shl eax,cl - shl dword[osn_w_2],cl - shl dword[vox_h],cl - pop ecx - .no_scale: - -; add esi,eax ;меняем глубину для буфера z (компенсация для координаты y) - bt word[edi],0 ;test voxel coord x - jnc @f - add ebx,[osn_w_2] - add ecx,eax - add esi,eax ;меняем глубину для буфера z - @@: - bt word[edi],1 ;test voxel coord y - jnc @f - add ebx,[osn_w_2] - sub ecx,eax - sub esi,eax ;меняем глубину для буфера z - @@: - bt word[edi],2 ;test voxel coord z - jnc @f - sub ecx,[vox_h] - @@: - pop edi eax .end_f: ret endp @@ -460,245 +136,6 @@ proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword ret endp -;рисование среза изображения -; v_size - размер квадрата с вокселем -; k_scale - степень детализации изображения -; n_plane - номер плоскости сечния (в пределах от 0 до 2^k_scale - 1) -; b_color - цвет границы -align 4 -proc buf2d_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ -coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword - cmp [k_scale],0 - jl .end_f -pushad - mov eax,[v_size] - mov ecx,[k_scale] - mov ebx,eax - cmp ecx,1 - jl @f - shl ebx,cl - @@: - ;ebx - полный размер изображения - stdcall [buf2d_rect_by_size], [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок - add ebx,[coord_y] - mov edx,[n_plane] - imul edx,eax - add edx,[coord_x] - stdcall [buf2d_filled_rect_by_size], [buf_i], edx,ebx, eax,eax, [b_color] ;квадратик, показывающий номер сечения - - ;рисование точек для сетки - push ecx - mov edi,1 - cmp ecx,1 - jl @f - shl edi,cl - @@: - dec edi - cmp edi,1 - jl .end_0 - mov ecx,edi - imul ecx,edi - mov ebx,[coord_x] - mov edx,[coord_y] - add edx,eax - xor esi,esi - cld - @@: - add ebx,eax - inc esi - stdcall [buf2d_set_pixel], [buf_i], ebx,edx, [b_color] - cmp esi,edi - jl .end_1 - ;переход точек на новую строку - xor esi,esi - mov ebx,[coord_x] - add edx,eax - .end_1: - loop @b - .end_0: - pop ecx - - ;eax - размер одного квадрата - ;edi - указатель рисуемые данные из объекта - mov ebx,[coord_x] - mov edx,[coord_y] - mov edi,[v_obj] - add edi,vox_offs_data - xor esi,esi - push eax - imul eax,[n_plane] - stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax -popad - .end_f: - ret -endp - -;input: -; ebx - coord_x -; edx - coord_y -; esi - coord_z -; ecx - уровень текушего узла -; edi - указатель на данные воксельного объекта -align 4 -proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ -v_size:dword - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - - ;прорисовка рамки если размер узла = 1 - cmp ecx,0 - jne @f - ;проверка глубины esi - ;clip_z=n_plane*v_size - stdcall vox_is_clip, [clip_z],[v_size] - cmp eax,0 - je @f - push ecx - mov ecx,dword[edi] - and ecx,0xffffff - stdcall [buf2d_rect_by_size], [buf_i], ebx,edx, [v_size],[v_size],ecx - pop ecx - @@: - - ;рекурсивный перебор поддеревьев - push edx - - ;вход внутрь узла - dec ecx -;--- - mov eax,[v_size] - cmp ecx,1 - jl @f - shl eax,cl - @@: - add edx,eax ;коректировка высоты под воксель нижнего уровня -;--- - mov ah,byte[edi+3] - add edi,4 - mov al,8 - .cycle: - bt ax,8 ;тестируем только ah - jnc .c_next - push eax ebx edx esi - stdcall vox_corect_coords_pl, [v_obj],[v_size] - stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] - pop esi edx ebx eax - .c_next: - shr ah,1 - dec al - jnz .cycle - - ;выход из узла - inc ecx - pop edx - - jmp .end_f - .sub_trees: - cmp ecx,0 - jl .end_0 ;не рисуем очень маленькие воксели - - ;проверка глубины esi - ;clip_z=n_plane*v_size - stdcall vox_is_clip, [clip_z],[v_size] - cmp eax,0 - je .end_0 - - ;рисуем узел - mov eax,[edi] - and eax,0xffffff - push eax ;цвет узла - - mov eax,[v_size] - cmp ecx,1 - jl @f - shl eax,cl ;размер узла - @@: - - stdcall [buf2d_filled_rect_by_size], [buf_i], ebx,edx, eax,eax - .end_0: - add edi,4 - .end_f: - ret -endp - -;проверка глубины esi -;input: -; ecx - уровень текушего узла -; esi - coord z -; clip_z - n_plane*v_size -;output: -; eax - 0 if no draw, 1 if draw -align 4 -proc vox_is_clip uses ebx edi, clip_z:dword, v_size:dword - xor eax,eax - mov ebx,[clip_z] - mov edi,[v_size] - cmp ecx,1 - jl @f - shl edi,cl - @@: - ;edi = 2^ecx - add edi,esi - cmp edi,ebx ;if (esi+2^ecx*v_size <= (n_plane*v_size)) no draw - jle @f - add ebx,[v_size] - cmp esi,ebx ;if (esi >= (n_plane+1)*v_size) no draw - jge @f - inc eax - @@: - ret -endp - -;функция для коректировки координат -;направления осей координат в вокселе: -;*z -;| -;+-* x -;input: -; al - номер узла в дереве (от 1 до 8) -; ebx - координата x -; edx - координата y -; esi - координата z -; ecx - уровень текушего узла -;output: -; ebx - новая координата x -; edx - новая координата y -; esi - новая координата z -align 4 -proc vox_corect_coords_pl, v_obj:dword, v_size:dword - cmp ecx,0 - jl .end_f ;для ускорения отрисовки - - push eax edi - and eax,15 ;выделяем номер узла в дереве - mov edi,[v_obj] - add edi,vox_offs_tree_table - add edi,8 - sub edi,eax - - mov eax,[v_size] ;eax - высота основания единичного вокселя - cmp ecx,1 - jl @f ;во избежание зацикливания - shl eax,cl - @@: - - bt word[edi],0 ;test voxel coord x - jnc @f - add ebx,eax - @@: - bt word[edi],1 ;test voxel coord y - jnc @f - add esi,eax ;меняем глубину для буфера z - @@: - bt word[edi],2 ;test voxel coord z - jnc @f - sub edx,eax - @@: - pop edi eax - .end_f: - ret -endp - ; ;output: ; eax - число узлов в объекте v_obj @@ -711,6 +148,7 @@ proc vox_obj_get_nodes uses edi, v_obj:dword ret endp +;??? ;input: ; edi - указатель на данные воксельного объекта ;output: @@ -755,114 +193,17 @@ proc buf2d_vox_obj_get_size, v_obj:dword ret endp -if 0 -;output: -; eax - указатель на данные вокселя -align 4 -proc buf2d_vox_obj_is_node uses ebx ecx edx edi esi, v_obj:dword,\ -coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword - mov edi,[v_obj] - add edi,vox_offs_data - mov esi,[k_scale] - xor eax,eax - xor edx,edx - stdcall vox_obj_rec1, [v_obj],[coord_x],[coord_y],[coord_z], 0,0,0 - ret -endp - -;input: -; eax - ... -; edx - ... -; edi - указатель на данные воксельного объекта -; esi - уровень искомого вокселя -align 4 -proc vox_obj_rec1, v_obj:dword, coord_x:dword,coord_y:dword,coord_z, tc_x:dword,tc_y:dword,tc_z - cmp edx,esi - jne @f - mov ebx,[tc_x] - cmp [coord_x],ebx - jne @f - mov ebx,[tc_y] - cmp [coord_y],ebx - jne @f - mov ebx,[tc_z] - cmp [coord_z],ebx - jne @f - mov eax,edi - @@: - - cmp eax,0 - jne .end_f ;если указатель уже найден - - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - inc edx - shl dword[tc_x],1 - shl dword[tc_y],1 - shl dword[tc_z],1 - ;рекурсивный перебор поддеревьев - - mov bh,byte[edi+3] - add edi,4 - ;mov bl,8 - xor bl,bl - .cycle: - bt bx,8 ;тестируем только bh - jnc .c_next -push dword[tc_x] -push dword[tc_y] -push dword[tc_z] - push edx - movzx edx,bl - add edx,[v_obj] - add edx,vox_offs_tree_table - bt word[edx],0 ;coord x - jnc .end_x - inc dword[tc_x] - .end_x: - bt word[edx],1 ;coord y - jnc .end_y - inc dword[tc_y] - .end_y: - bt word[edx],2 ;coord z - jnc .end_z - inc dword[tc_z] - .end_z: - pop edx - push ebx ecx - stdcall vox_obj_rec1, [v_obj],[coord_x],[coord_y],[coord_z], [tc_x],[tc_y],[tc_z] - pop ecx ebx -pop dword[tc_z] -pop dword[tc_y] -pop dword[tc_x] - .c_next: - shr bh,1 - inc bl - ;jnz .cycle - cmp bl,8 - jl .cycle - - dec edx - jmp .end_f - .sub_trees: - add edi,4 - .end_f: - ret -endp -end if - ; создание вокселя в 3 этапа: ; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем) ; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем) ; 3) меняем цвет вокселя align 4 proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\ -coord_z:dword,color:dword,k_scale:dword +coord_z:dword,k_scale:dword,color:dword pushad locals p_node dd 0 ;родительский узел endl -;stdcall print_err, txt_f1, txt_b mov edi,[v_obj] add edi,vox_offs_data @@ -875,15 +216,14 @@ endl movzx bx,byte[edi+3] mov [p_node],edi add edi,4 -;stdcall print_err, txt_chi, txt_e + cmp eax,0 je .end_1 mov ecx,eax cld - @@: ; цикл для пропуска предыдущих поддеревьев в узле + @@: ;цикл для пропуска предыдущих поддеревьев в узле bt bx,0 ;проверяем есть ли дочерние узлы jnc .end_0 -;stdcall print_err, txt_st, txt_e xor eax,eax stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви .end_0: @@ -928,9 +268,9 @@ popad ret endp -; удаление вокселя в 3 этапа: +; удаление вокселя в 2 этапа: ; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции) -; 2) вставляем новую ветвь с вокселем +; 2) удаляем ветвь с вокселем align 4 proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\ coord_z:dword,k_scale:dword @@ -953,7 +293,7 @@ endl je .end_1 mov ecx,eax cld - @@: ; цикл для пропуска предыдущих поддеревьев в узле + @@: ;цикл для пропуска предыдущих поддеревьев в узле bt bx,0 ;проверяем есть ли дочерние узлы jnc .end_0 xor eax,eax @@ -1025,6 +365,7 @@ proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword ret endp +;??? ; определение позиции узла в дереве (от 0 до 7) align 4 proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ @@ -1109,32 +450,6 @@ coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword ret endp -align 4 -proc buf2d_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword - mov ecx,[h_br] - - movzx eax,byte[ecx] - cmp dword[k_scale],1 - jl .end_c0 - mov ecx,[k_scale] - shl eax,cl - .end_c0: - ret -endp - -align 4 -proc buf2d_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword - mov ecx,[h_br] - - movzx eax,byte[ecx+1] - cmp dword[k_scale],1 - jl .end_c0 - mov ecx,[k_scale] - shl eax,cl - .end_c0: - ret -endp - ;функция для рисования палитры align 4 proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\ @@ -1210,40 +525,3 @@ proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword ret endp - -if 0 -txt_f1 db 13,10,'f1',0 -txt_chi db ' chi',0 -txt_st db ' st',0 - -txt_b db 'beg' -txt_e db 13,10,0 - -align 4 -proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки - pushad - mov eax,63 - mov ebx,1 - - mov esi,[fun] - @@: - mov cl,byte[esi] - int 0x40 - inc esi - cmp byte[esi],0 - jne @b - mov cl,':' - int 0x40 - mov cl,' ' - int 0x40 - mov esi,[mes] - @@: - mov cl,byte[esi] - int 0x40 - inc esi - cmp byte[esi],0 - jne @b - popad - ret -endp -end if diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/trunk/voxel_editor.asm index 9febd73e67..ead0afa8e8 100644 --- a/programs/media/voxel_editor/trunk/voxel_editor.asm +++ b/programs/media/voxel_editor/trunk/voxel_editor.asm @@ -17,7 +17,7 @@ include 'dll.inc' include 'vox_draw.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel editor 5.06.12',0 ;подпись окна +caption db 'Voxel editor 11.06.12',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -81,7 +81,9 @@ macro load_image_file path,buf,size { ; OT_MAP_X equ 0 OT_MAP_Y equ 0 -TILE_SIZE equ 10 +TILE_SIZE equ 10 ;размер квадратика на плоскости с сечением +OT_CAPT_X_COLOR equ 5 ;отступ для подписи цвета +OT_CAPT_Y_COLOR equ 30 align 4 start: @@ -136,11 +138,21 @@ align 4 mouse: pushad mcall 37,2 + bt eax,1 ;right button + jnc @f + mcall 37,1 ;get mouse coords + mov ebx,eax + shr ebx,16 + and eax,0xffff + stdcall get_buf_color, buf_0 + stdcall get_buf_color, buf_pl + jmp .end_f + @@: bt eax,0 ;left button jnc .end_f mcall 37,1 ;get mouse coords - mov ebx,eax + shr ebx,16 and eax,0xffff cmp dword[v_pen_mode],2 ;select color @@ -150,6 +162,37 @@ mouse: jmp .end_f .end_2: + + push eax ebx + mov edx,[v_zoom] + cmp edx,[scaled_zoom] + jle @f + ;режим масштабирования изображения + sub edx,[scaled_zoom] + sub ax,word[buf_0.t] + sub bx,word[buf_0.l] + stdcall get_mouse_ev_scale, buf_vox, ebx, eax, [scaled_zoom],edx + cmp eax,0 + je @f + mov ebx,eax + and eax,0x3fffffff + rol ebx,2 + and ebx,3 + dec ebx + + shl ebx,2 + add ebx,cam_x + mov dword[ebx],eax ;change [cam_x] or [cam_y] or [cam_z] + call draw_objects + + pop ebx eax + jmp .end_f + @@: + pop ebx eax + + + ;eax - mouse coord y + ;ebx - mouse coord x movzx edx,word[buf_pl.t] add edx,OT_MAP_Y cmp eax,edx @@ -158,7 +201,6 @@ mouse: xor edx,edx mov ecx,TILE_SIZE ;H div ecx - shr ebx,16 movzx edx,word[buf_pl.l] add edx,OT_MAP_X cmp ebx,edx @@ -186,12 +228,54 @@ mouse: mov [v_cur_x],eax ;X-coord cmp dword[v_pen_mode],0 - jne @f - stdcall buf2d_vox_obj_delete_node, [open_file_vox], [v_cur_x],[n_plane],[v_cur_y], [v_zoom] - @@: + jl .end_1 cmp dword[v_pen_mode],1 - jne .end_1 - stdcall buf2d_vox_obj_create_node, [open_file_vox], [v_cur_x],[n_plane],[v_cur_y], [v_color], [v_zoom] + jg .end_1 + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle .no_c_coord_0 + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + .no_c_coord_0: + + ;отличающийся параметр для функции создания вокселя + cmp dword[v_pen_mode],1 + jne @f + push dword[v_color] + @@: + + ;вызов общих параметров для функций + push dword[v_zoom] + push edx + push ebx + push eax + push dword[open_file_vox] + + ;вызов функций + cmp dword[v_pen_mode],1 + jne @f + call buf2d_vox_obj_create_node + ;stdcall buf2d_vox_obj_create_node, [open_file_vox], eax,ebx,edx, [v_zoom], [v_color] + jmp .end_1 + @@: + call buf2d_vox_obj_delete_node + ;stdcall buf2d_vox_obj_delete_node, [open_file_vox], eax,ebx,edx, [v_zoom] + .end_1: call draw_objects call draw_pok @@ -199,15 +283,18 @@ mouse: popad ret +;input: +; eax - coord y +; ebx - coord x align 4 -proc get_buf_color uses eax ebx edi, buf:dword +proc get_buf_color, buf:dword +pushad mov edi,[buf] cmp ax,buf2d_t jl .end_f sub ax,buf2d_t cmp eax,buf2d_h jg .end_f - shr ebx,16 cmp bx,buf2d_l jl .end_f sub bx,buf2d_l @@ -215,9 +302,14 @@ proc get_buf_color uses eax ebx edi, buf:dword jg .end_f stdcall [buf2d_get_pixel], edi,ebx,eax mov [v_color],eax - stdcall [buf2d_filled_rect_by_size], buf_0, 5,3, 8,8,eax - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ;stdcall [buf2d_filled_rect_by_size], buf_0, 5,3, 8,8,eax + ;stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + mov ebx,((OT_CAPT_X_COLOR+35) shl 16)+16 ;по оси x + mov ecx,(OT_CAPT_Y_COLOR shl 16)+12 ;по оси y + mov edx,[v_color] + mcall 13 .end_f: +popad ret endp @@ -226,14 +318,15 @@ align 4 convert_y: push ecx edx mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + mov ecx,[scaled_zoom] + @@: mov edx,1 cmp ecx,1 - jl .end_0 - cld + jl @f + shl edx,cl @@: - shl edx,1 - loop @b - .end_0: sub edx,eax dec edx mov eax,edx @@ -247,7 +340,7 @@ pushad ; *** рисование главного окна (выполняется 1 раз при запуске) *** xor eax,eax - mov ebx,(20 shl 16)+540 + mov ebx,(20 shl 16)+550 mov ecx,(20 shl 16)+415 mov edx,[sc.work] or edx,(3 shl 24)+0x30000000 @@ -393,12 +486,22 @@ draw_pok: mov ecx,[v_cur_y] add edx,(6*0)*65536+9 int 0x40 ; - mov ebx,(5 shl 16) mov ecx,[n_plane] add edx,(6*0)*65536+9 int 0x40 ; + mov eax,4 ;рисование текста + mov ebx,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 + mov ecx,[sc.work_text] + or ecx,0x80000000 ;or (1 shl 30) + mov edx,txt_color + int 0x40 + + mov ebx,((OT_CAPT_X_COLOR+35) shl 16)+16 ;по оси x + mov ecx,(OT_CAPT_Y_COLOR shl 16)+12 ;по оси y + mov edx,[v_color] + mcall 13 ret align 4 @@ -574,23 +677,43 @@ but_save_file: popad ret +;увеличение масштаба align 4 but_1: - cmp dword[v_zoom],7 + cmp dword[v_zoom],10 ;максимальный размер, до которого можно увеличить 2^10=1024 jge @f inc dword[v_zoom] shl dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + shl dword[cam_x],1 + shl dword[cam_y],1 + shl dword[cam_z],1 + .end_0: + pop eax call draw_objects call draw_pok @@: ret +;уменьшение масштаба align 4 but_2: cmp dword[v_zoom],-1 jl @f dec dword[v_zoom] shr dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + shr dword[cam_x],1 + shr dword[cam_y],1 + shr dword[cam_z],1 + .end_0: + pop eax call draw_objects call draw_pok @@: @@ -690,12 +813,32 @@ push edi push eax ebx ecx mov eax,[v_zoom] - inc eax + cmp eax,[scaled_zoom] + jle .end_scaled + ;рендер увеличенной части объекта + mov ebx,[scaled_zoom] + sub eax,ebx + inc ebx + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, ebx, [cam_x],[cam_y],[cam_z],eax, 0xd080d0 + bt dword[mode_light],0 + jnc @f + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, buf_vox, 0,0, 0, ebx, 3 + @@: + xor ebx,ebx + xor ecx,ecx + mov edi,buf_r_img + stdcall [buf2d_img_hdiv2], edi + shr buf2d_h,1 + stdcall [buf2d_img_wdiv2], edi + shr buf2d_w,1 + jmp .show + .end_scaled: - stdcall buf2d_vox_obj_draw_3g, buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax + inc eax + stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax bt dword[mode_light],0 jnc @f - stdcall buf2d_vox_obj_draw_3g_shadows, buf_r_img, buf_r_z, buf_vox, 0,0, 0, eax, 3 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, buf_vox, 0,0, 0, eax, 3 @@: mov edi,buf_r_img @@ -704,17 +847,18 @@ push edi stdcall [buf2d_img_wdiv2], edi shr buf2d_w,1 - stdcall buf2d_vox_obj_get_img_w_3g, buf_vox,[v_zoom] + stdcall [buf2d_vox_obj_get_img_w_3g], buf_vox,[v_zoom] mov ebx,[buf_0.w] sub ebx,eax shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали - stdcall buf2d_vox_obj_get_img_h_3g, buf_vox,[v_zoom] + stdcall [buf2d_vox_obj_get_img_h_3g], buf_vox,[v_zoom] cmp eax,[buf_0.h] jg @f mov ecx,[buf_0.h] sub ecx,eax - shr ecx,1 ;ecx - для центровки маленьких изображений по - @@: + shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали + @@: + .show: stdcall [buf2d_bit_blt], buf_0, ebx,ecx, edi shl buf2d_h,1 shl buf2d_w,1 @@ -726,23 +870,27 @@ pop edi align 4 draw_palete: stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - stdcall [buf2d_filled_rect_by_size], buf_0, 5,3, 8,8,[v_color] - stdcall buf2d_draw_palete, buf_0, 5,14, 9,6, 18, 512 + stdcall buf2d_draw_palete, buf_0, 5,3, 9,6, 18, 512 stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране ret -v_zoom dd 2 ;текущий масштаб +v_zoom dd 3 ;текущий масштаб v_cur_x dd 0 ;координата курсора x v_cur_y dd 0 ;координата курсора y (но ось в объекте z) n_plane dd 0 ;плоскость сечения v_color dd 0xff ;цвет карандаша v_pen_mode dd 1 ;режим: 0-стирания, 1-рисования mode_light dd 1 ;режим освещения +cam_x dd 0 +cam_y dd 0 +cam_z dd 0 +scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения txt_zoom db 'Масштаб:',0 txt_cur_x db 'x:',0 txt_cur_y db 'y:',0 txt_n_plane db 'Сечение:',0 +txt_color db 'Цвет:',0 align 4 draw_objects: @@ -755,30 +903,46 @@ draw_objects: call draw_palete jmp .end_f @@: - push eax ebx ecx - stdcall buf2d_vox_obj_get_img_w_3g, buf_vox,[v_zoom] - mov ebx,[buf_0.w] - sub ebx,eax - shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали + push eax ebx ecx + stdcall [buf2d_vox_obj_get_img_w_3g], buf_vox,[v_zoom] + mov ebx,[buf_0.w] + sub ebx,eax + shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали - xor ecx,ecx - stdcall buf2d_vox_obj_get_img_h_3g, buf_vox,[v_zoom] - cmp eax,[buf_0.h] - jg @f - mov ecx,[buf_0.h] - sub ecx,eax - shr ecx,1 ;ecx - для центровки маленьких изображений по - @@: + xor ecx,ecx + stdcall [buf2d_vox_obj_get_img_h_3g], buf_vox,[v_zoom] + cmp eax,[buf_0.h] + jg @f + mov ecx,[buf_0.h] + sub ecx,eax + shr ecx,1 ;ecx - для центровки маленьких изображений по + @@: - stdcall buf2d_vox_obj_draw_3g, buf_0, buf_0z, buf_vox, [open_file_vox], ebx,ecx, 0, [v_zoom] + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jg @f + ;обычный режим изображения + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox, [open_file_vox], ebx,ecx, 0, eax + stdcall [buf2d_vox_obj_draw_pl], buf_pl, [open_file_vox], OT_MAP_X,OT_MAP_Y,TILE_SIZE, [v_zoom], [n_plane], 0xd0d0d0 bt dword[mode_light],0 - jnc @f - stdcall buf2d_vox_obj_draw_3g_shadows, buf_0, buf_0z, buf_vox, ebx,ecx, 0, [v_zoom], 3 - @@: - pop ecx ebx eax + jnc .end_1 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, ebx,ecx, 0, eax, 3 + .end_1: + jmp .end_0 + @@: + ;режим масштабирования изображения + sub eax,[scaled_zoom] + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_0, buf_0z, buf_vox,\ + [open_file_vox], 0,0, 0, [scaled_zoom], [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] ;scroll -> 2^eax + stdcall [buf2d_vox_obj_draw_pl_scaled], buf_pl, [open_file_vox],\ + OT_MAP_X,OT_MAP_Y,TILE_SIZE, [scaled_zoom], [n_plane], [sc.work_graph],[cam_x],[cam_y],[cam_z],eax + bt dword[mode_light],0 + jnc .end_2 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, 0,0, 0, [scaled_zoom], 3 + .end_2: .end_0: - stdcall buf2d_vox_obj_draw_pl, buf_pl, [open_file_vox], OT_MAP_X,OT_MAP_Y,TILE_SIZE, [v_zoom], [n_plane], 0xd0d0d0 + pop ecx ebx eax stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране @@ -1011,6 +1175,13 @@ import_buf2d: buf2d_get_pixel dd sz_buf2d_get_pixel buf2d_vox_brush_create dd sz_buf2d_vox_brush_create buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g + buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g + buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g + buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled + buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl + buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled + buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows dd 0,0 sz_init db 'lib_init',0 sz_buf2d_create db 'buf2d_create',0 @@ -1039,6 +1210,13 @@ import_buf2d: sz_buf2d_get_pixel db 'buf2d_get_pixel',0 sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 mouse_dd dd 0x0 sc system_colors @@ -1051,8 +1229,8 @@ align 4 buf_0: dd 0 ;указатель на дaные изображения .l: dw 5 ;+4 left .t: dw 45 ;+6 top -.w: dd 192 ;+8 w -.h: dd 224 ;+12 h +.w: dd 192+6 ;+8 w +.h: dd 224+7 ;+12 h .color: dd 0xffffff ;+16 color db 24 ;+20 bit in pixel @@ -1061,15 +1239,15 @@ align 4 buf_0z: dd 0 dw 0 ;+4 left dw 0 ;+6 top -.w: dd 192 ;+8 w -.h: dd 224 ;+12 h +.w: dd 192+6 ;+8 w +.h: dd 224+7 ;+12 h .color: dd 0 ;+16 color db 32 ;+20 bit in pixel ;буфер для рисования среза объекта align 4 buf_pl: dd 0 -.l: dw 10+192 ;+4 left +.l: dw 15+192+6 ;+4 left .t: dw 45 ;+6 top .w: dd 320 ;+8 w .h: dd 330 ;+12 h