From 56de4bac0fed2feb882d16251e055ac298145190 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 21 Jun 2012 11:32:18 +0000 Subject: [PATCH] 'buf2d.obj' new function and 2 examples git-svn-id: svn://kolibrios.org@2815 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 40 ++- .../develop/libraries/buf2d/trunk/buf2d.asm | 314 +++++++++++++----- .../libraries/buf2d/trunk/examples/build.bat | 5 + .../buf2d/trunk/examples/e6_vox_1g.asm | 226 +++++++++++++ .../buf2d/trunk/examples/e7_vox_3g.asm | 249 ++++++++++++++ .../media/voxel_editor/trunk/voxel_editor.asm | 9 +- 6 files changed, 745 insertions(+), 98 deletions(-) create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 5b87002478..cc65d82027 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -54,6 +54,7 @@ table { font-size: 15px; } @@ -70,7 +71,7 @@ table { font-size: 15px; } ┼ёЄ№ ЇєэъЎшш Ёшёютрэш  ышэшщ, ъЁшт√ї ┴хч№х, яЁ ьюєуюы№эшъют, юъЁєцэюёЄхщ. ╥ръцх хёЄ№ ЇєэъЎшш фы  Ёшёютрэшщ тюъёхы№эющ уЁрЇшъш.

-

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 12.06.12.

+

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 21.06.12.

╘юЁьрЄ√ сєЇхЁют

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. @@ -203,16 +204,16 @@ stdcall [buf2d_convert_text_matrix], buf_1

buf2d_draw_text

╨шёєхЄ ЄхъёЄ т сєЇхЁх, шёяюы№чє  ьрЄЁшЎє ё ЄхъёЄюь ЁрчьхЁюь 1*256 ёшьтюыют. ╧ЁшьхЁ:

stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;Ёшёєхь ёЄЁюъє ё ЄхъёЄюь
-

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ЄхъёЄ; - buf_1 - ёЄЁєъЄєЁр сєЇхЁр ё ЄхъёЄютющ ьрЄЁшЎхщ т ЇюЁьрЄх 8 сшЄ, ЁрчьхЁюь 1*256 ёшьтюыют; - some_text - ЄхъёЄ, ъюЄюЁ√щ сєфхЄ т√тхфхэ т сєЇхЁ buf_0.

+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ЄхъёЄ;

+

buf_1 - ёЄЁєъЄєЁр сєЇхЁр ё ЄхъёЄютющ ьрЄЁшЎхщ т ЇюЁьрЄх 8 сшЄ, ЁрчьхЁюь 1*256 ёшьтюыют;

+

some_text - ЄхъёЄ, ъюЄюЁ√щ сєфхЄ т√тхфхэ т сєЇхЁ buf_0.

-

buf2d_crop_color

+

buf2d_crop_color

╬сЁхчрэшх сєЇхЁр, яю єърчрээюьє ЎтхЄє. ╘єэъЎш  шёяюы№чєхЄё  фы  єьхэ№°хэш  ярь Єш, чрэшьрхьющ сєЇхЁюь. ╬ЄЁхчр■Єё  ъЁрщэшх ўрёЄш сєЇхЁр шьх■∙шх юфшэръют√щ ЎтхЄ. ╧ЁшьхЁ:

stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM
-

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр ъюЄюЁ√щ сєфхЄ юсЁхчрэ; - 0xffffff - ЎтхЄ яю ъюЄюЁюьє сєфхЄ юсЁхчрЄ№ё  сєЇхЁ; - BUF2D_OPT_CROP_TOP ш BUF2D_OPT_CROP_BOTTOM - ъюэёЄрэЄ√, єърч√тр■∙шх ё ъръшї ёЄюЁюэ юсЁхчрЄ№ сєЇхЁ.

+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр ъюЄюЁ√щ сєфхЄ юсЁхчрэ;

+

0xffffff - ЎтхЄ яю ъюЄюЁюьє сєфхЄ юсЁхчрЄ№ё  сєЇхЁ;

+

BUF2D_OPT_CROP_TOP ш BUF2D_OPT_CROP_BOTTOM - ъюэёЄрэЄ√, єърч√тр■∙шх ё ъръшї ёЄюЁюэ юсЁхчрЄ№ сєЇхЁ.

buf2d_offset_h

╤фтшу шчюсЁрцхэш  т сєЇхЁх яю т√ёюЄх ттхЁї шыш тэшч.

@@ -220,11 +221,11 @@ stdcall [buf2d_convert_text_matrix], buf_1

buf2d_flood_fill

╘єэъЎш  фы  ЁхъєЁёштэющ чрыштъш т√сЁрээ√ь ЎтхЄюь. ╚ьххЄё  фтр трЁшрэЄр чрыштъш. ╧ЁшьхЁ:

stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000
-

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр; - 100,200 - ъююЁфшэрЄ√ Єюўъш, ё ъюЄюЁющ эрўэхЄё  чрыштър; - 0 - ярЁрьхЄЁ, юяЁхфхы хЄ рыуюЁшЄь чрыштъш (ьюцхЄ с√Є№ 0 шыш 1); - 0xff - ЎтхЄ чрыштъш;

- 0xff0000 - чртшёшЄ юЄ чэрўхэш  4-ую ярЁрьхЄЁр, 1) хёыш 0 - ЎтхЄ фю ъюЄюЁюую сєфхЄ чрыштрЄ№ё  юсырёЄ№; 2) хёыш 1 - ЎтхЄ юсырёЄш ъюЄюЁр  сєфхЄ чрыштрЄё ;

+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр;

+

100,200 - ъююЁфшэрЄ√ Єюўъш, ё ъюЄюЁющ эрўэхЄё  чрыштър;

+

0 - ярЁрьхЄЁ, юяЁхфхы хЄ рыуюЁшЄь чрыштъш (ьюцхЄ с√Є№ 0 шыш 1);

+

0xff - ЎтхЄ чрыштъш;

+

0xff0000 - чртшёшЄ юЄ чэрўхэш  4-ую ярЁрьхЄЁр, 1) хёыш 0 - ЎтхЄ фю ъюЄюЁюую сєфхЄ чрыштрЄ№ё  юсырёЄ№; 2) хёыш 1 - ЎтхЄ юсырёЄш ъюЄюЁр  сєфхЄ чрыштрЄё ;

buf2d_set_pixel

╘єэъЎш  ёЄртшЄ Єюўъє, яЁшэшьрхЄ ъююЁфшэрЄ√ ш ЎтхЄ.

@@ -246,6 +247,9 @@ stdcall [buf2d_convert_text_matrix], buf_1

buf2d_vox_brush_delete

╙фрыхэшх тюъёхы№эющ ъшёЄш.

+

buf2d_vox_obj_draw_1g

+

╨шёютрэшх тюъёхы№эюую юс·хъЄр ё 1-щ уЁрэ№■.

+

buf2d_vox_obj_get_img_w_3g

┬ючтЁр°рхЄ °шЁшэє тюъёхы№эюую шчюсЁрцхэш  ё 3-ь  уЁрэ ьш (ъюЄюЁюх ЁшёєхЄё  ЇєэъЎшхщ buf2d_vox_obj_draw_3g), яЁшэшьрхЄ єърчрЄхы№ эр ъшёЄ№ ш ьрё°Єрс.

@@ -269,13 +273,13 @@ stdcall [buf2d_convert_text_matrix], buf_1

╩юэёЄрэЄ√

BUF2D_OPT_CROP_TOP equ 1

-

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ётхЁїє

+

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ётхЁїє

BUF2D_OPT_CROP_LEFT equ 2

-

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёыхтр

+

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёыхтр

BUF2D_OPT_CROP_BOTTOM equ 4

-

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёэшчє

+

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёэшчє

BUF2D_OPT_CROP_RIGHT equ 8

-

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёяЁртр

+

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёяЁртр

╥рсышЎр ¤ъёяюЁЄр

╧ЁшьхЁ ЄрсышЎ√ ¤ъёяюЁЄр, ЁрёўшЄрээющ эр шёяюы№чютрэшх ьръЁюёр @use_library_mem:

@@ -312,6 +316,7 @@ import_buf2d_lib: ;тюъёхы№э√х ЇєэъЎшш: buf2d_vox_brush_create dd sz_buf2d_vox_brush_create buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g 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 @@ -352,6 +357,7 @@ import_buf2d_lib: ;тюъёхы№э√х ЇєэъЎшш: 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_draw_1g db 'buf2d_vox_obj_draw_1g',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 diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm index 9d6278e9dc..945871c2e4 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -2986,7 +2986,169 @@ proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword endp ;description: -; функция рисующая воксельный объект +; функция рисующая воксельный объект (видна 1 грань) +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +align 4 +proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, k_scale:dword + cmp [k_scale],0 + jl .end_f +pushad + mov edi,[buf_i] + cmp buf2d_bits,24 + jne .error1 + mov edi,[buf_z] + cmp buf2d_bits,32 + jne .error2 + + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + mov edi,[v_obj] + add edi,vox_offs_data + xor esi,esi + stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] + + jmp .end_0 + .error1: + stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b + jmp .end_0 + .error2: + stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b + .end_0: +popad + .end_f: + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + ;проверка глубины esi + stdcall buf_get_pixel, [buf_z], ebx,edx, esi + cmp eax,esi + jge @f + push ecx + mov ecx,dword[edi] + and ecx,0xffffff + stdcall buf_set_pixel, [buf_i], ebx,edx, ecx + stdcall buf_set_pixel, [buf_z], ebx,edx, esi + pop ecx + @@: + + ;рекурсивный перебор поддеревьев + push edx + ;вход внутрь узла + dec ecx + + mov eax,1 + 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],1 + stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] + 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 ;не рисуем очень маленькие воксели + + ;рисуем узел + mov eax,[edi] + and eax,0xffffff + + cmp ecx,1 + jl @f + ;квадрат больше текущего масштаба + stdcall vox_draw_square_1g, [buf_i],[buf_z],eax + jmp .end_0 + @@: + ;квадрат текущего масштаба + push ecx + mov ecx,eax + stdcall buf_get_pixel, [buf_z], ebx,edx + cmp eax,esi + jge .end_1 + stdcall buf_set_pixel, [buf_i], ebx,edx,ecx + stdcall buf_set_pixel, [buf_z], ebx,edx,esi + .end_1: + pop ecx + .end_0: + add edi,4 + .end_f: + ret +endp + +;output: +; eax - разрушается +align 4 +proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword +locals + img_size dd ? + coord_y dd ? +endl + mov edi,[buf_z] + xor eax,eax + inc eax + shl eax,cl + mov [img_size],eax + mov [coord_y],eax + .cycle_0: + push ebx + mov ecx,[img_size] + cld + .cycle_1: + push ecx + mov ecx,edx + call get_pixel_32 + pop ecx + cmp eax,esi + jge @f + stdcall buf_set_pixel, [buf_i], ebx,edx, [color] + stdcall buf_set_pixel, edi, ebx,edx, esi + @@: + inc ebx + loop .cycle_1 + pop ebx + inc edx + dec dword[coord_y] + jnz .cycle_0 + ret +endp + +;description: +; функция рисующая воксельный объект (видно 3 грани) ;input: ; buf_i - буфер в котором рисуется (24 бита) ; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) @@ -3000,27 +3162,10 @@ 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 @@ -3425,15 +3570,18 @@ pushad pop ecx ;eax - размер одного квадрата - ;edi - указатель рисуемые данные из объекта + ;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 + mov eax,1 + shl eax,cl + dec eax + sub eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax popad .end_f: ret @@ -3531,13 +3679,16 @@ endl mov eax,[v_size] ;eax - размер одного квадрата - ;edi - указатель рисуемые данные из объекта + ;edi - указатель на рисуемые данные из объекта mov ecx,[k_scale] mov ebx,[coord_x] mov edx,[coord_y] xor esi,esi push eax - imul eax,[n_plane] + mov eax,1 + shl eax,cl + dec eax + sub eax,[n_plane] stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax .end_2: @@ -3651,21 +3802,20 @@ v_size:dword ;прорисовка рамки если размер узла = 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 + ;проверка глубины esi + ;clip_z=n_plane + 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 @@ -3674,6 +3824,7 @@ v_size:dword jl @f shl eax,cl @@: + add edx,eax ;коректировка высоты под воксель нижнего уровня mov ah,byte[edi+3] @@ -3690,49 +3841,46 @@ v_size:dword 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 + ;проверка глубины esi + ;clip_z=n_plane + stdcall vox_is_clip, [clip_z] + 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 + ;рисуем узел + 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: @@ -3744,24 +3892,24 @@ endp ;input: ; ecx - уровень текушего узла ; esi - coord z -; clip_z - n_plane*v_size +; clip_z - n_plane ;output: ; eax - 0 if no draw, 1 if draw align 4 -proc vox_is_clip uses ebx edi, clip_z:dword, v_size:dword +proc vox_is_clip uses ebx edi, clip_z:dword xor eax,eax mov ebx,[clip_z] - mov edi,[v_size] + mov edi,1 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 + cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw jle @f - add ebx,[v_size] - cmp esi,ebx ;if (esi >= (n_plane+1)*v_size) no draw + inc ebx + cmp esi,ebx ;if (esi >= (n_plane+1)) no draw jge @f inc eax @@: @@ -3795,9 +3943,9 @@ proc vox_corect_coords_pl, v_obj:dword, v_size:dword add edi,8 sub edi,eax - mov eax,[v_size] ;eax - высота основания единичного вокселя + mov eax,[v_size] cmp ecx,1 - jl @f ;во избежание зацикливания + jl @f shl eax,cl @@: @@ -3805,14 +3953,19 @@ proc vox_corect_coords_pl, v_obj:dword, v_size:dword 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 @@: + bt word[edi],1 ;test voxel coord y + jc @f + mov eax,1 + cmp ecx,1 + jl .end_0 + shl eax,cl + .end_0: + add esi,eax ;меняем глубину для буфера z + @@: pop edi eax .end_f: ret @@ -3933,6 +4086,7 @@ 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_n32b db 'need buffer 32 bit',13,10,0 txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 align 16 @@ -3968,6 +4122,7 @@ EXPORTS: 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_1g, buf_vox_obj_draw_1g 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 @@ -4005,6 +4160,7 @@ EXPORTS: 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_1g db 'buf2d_vox_obj_draw_1g',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 diff --git a/programs/develop/libraries/buf2d/trunk/examples/build.bat b/programs/develop/libraries/buf2d/trunk/examples/build.bat index 800930fb80..38fa52ccf8 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/build.bat +++ b/programs/develop/libraries/buf2d/trunk/examples/build.bat @@ -6,6 +6,7 @@ if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\trunk\font8x9.bmp bin\ @copy foto.jpg bin\foto.jpg @copy img0.png bin\img0.png @copy img1.png bin\img1.png +if not exist bin\vaz2106.vox @copy ..\..\..\..\..\media\voxel_editor\trunk\vaz2106.vox bin\vaz2106.vox @fasm.exe -m 16384 e0_dr_lines.asm bin\e0_dr_lines.kex @fasm.exe -m 16384 e1_scaling.asm bin\e1_scaling.kex @@ -13,6 +14,8 @@ if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\trunk\font8x9.bmp bin\ @fasm.exe -m 16384 e3_text.asm bin\e3_text.kex @fasm.exe -m 16384 e4_graf_ed.asm bin\e4_graf_ed.kex @fasm.exe -m 16384 e5_lines_sm.asm bin\e5_lines_sm.kex +@fasm.exe -m 16384 e6_vox_1g.asm bin\e6_vox_1g.kex +@fasm.exe -m 16384 e7_vox_3g.asm bin\e7_vox_3g.kex @kpack bin\e0_dr_lines.kex @kpack bin\e1_scaling.kex @@ -20,4 +23,6 @@ if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\trunk\font8x9.bmp bin\ @kpack bin\e3_text.kex @kpack bin\e4_graf_ed.kex @kpack bin\e5_lines_sm.kex +@kpack bin\e6_vox_1g.kex +@kpack bin\e7_vox_3g.kex pause \ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm b/programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm new file mode 100644 index 0000000000..843ebd883c --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm @@ -0,0 +1,226 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,cur_dir_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +max_open_file_size equ 64*1024 ;64 Kb + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов +run_file_70 FileInfoBlock +f_name db 'vaz2106.vox',0 + +vox_offs_tree_table equ 4 + +;поворот объекта на 90 градусов +;x0y0 - x1y0 +;x1y0 - x1y1 +;x0y1 - x0y0 +;x1y1 - x0y1 +align 4 +proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov ecx,2 + cld + @@: + mov eax,dword[ebx] + mov byte[ebx+1],al + mov byte[ebx+3],ah + shr eax,16 + mov byte[ebx],al + mov byte[ebx+2],ah + add ebx,4 + loop @b + ret +endp + + + +align 4 +start: + load_library vectors_name, cur_dir_path, library_path, system_path, \ + err_message_found_lib, head_f_l, import_buf2d_lib, err_message_import, head_f_i + cmp eax,-1 + jz button.exit + + mcall 40,0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_create], buf_z + + stdcall mem.Alloc,max_open_file_size + mov dword[open_file_vox],eax + + copy_path f_name,[32],file_name,0x0 + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], max_open_file_size + m2m [run_file_70.Buffer], [open_file_vox] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем воксельный объект + + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,0, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,0, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,128, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,128, 7 + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,0x33000000 + mcall 0,(50 shl 16)+330,(30 shl 16)+295,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +align 4 +key: + mcall 2 + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_z + stdcall mem.Free,[open_file_vox] + mcall -1 ;выход из программы + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + + ;воксельные функции: + ;buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + ;buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + ;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_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + ;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 + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',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_draw_1g db 'buf2d_vox_obj_draw_1g',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_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',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 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 5 ;+6 top + dd 256 ;+8 w + dd 256 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_z: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 5 ;+6 top + dd 256 ;+8 w + dd 256 ;+12 h + dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +vectors_name db 'buf2d.obj',0 +err_message_found_lib db 'Sorry I cannot load library buf2d.obj',0 +head_f_i: +head_f_l db 'System error',0 +err_message_import db 'Error on load import library buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: + file_name: + rb 4096 +cur_dir_path: + rb 4096 +library_path: + rb 4096 +mem: + diff --git a/programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm b/programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm new file mode 100644 index 0000000000..d808ec675e --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm @@ -0,0 +1,249 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,cur_dir_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +max_open_file_size equ 64*1024 ;64 Kb + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов +run_file_70 FileInfoBlock +f_name db 'vaz2106.vox',0 + +BUF_STRUCT_SIZE equ 21 +vox_offs_tree_table equ 4 + +;поворот объекта на 90 градусов +;x0y0 - x1y0 +;x1y0 - x1y1 +;x0y1 - x0y0 +;x1y1 - x0y1 +align 4 +proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov ecx,2 + cld + @@: + mov eax,dword[ebx] + mov byte[ebx+1],al + mov byte[ebx+3],ah + shr eax,16 + mov byte[ebx],al + mov byte[ebx+2],ah + add ebx,4 + loop @b + ret +endp + + + +align 4 +start: + load_library vectors_name, cur_dir_path, library_path, system_path, \ + err_message_found_lib, head_f_l, import_buf2d_lib, err_message_import, head_f_i + cmp eax,-1 + jz button.exit + + mcall 40,0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_create], buf_z + stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z ;создаем воксельную кисть + + stdcall mem.Alloc,max_open_file_size + mov dword[open_file_vox],eax + + copy_path f_name,[32],file_name,0x0 + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], max_open_file_size + m2m [run_file_70.Buffer], [open_file_vox] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем воксельный объект + + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox,\ + [open_file_vox], 0,0, 0, 6 ;рисуем воксельный объект + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_z, buf_vox,\ + 0,0, 0, 6, 3 ;рисуем тени + + stdcall vox_obj_rot_z, [open_file_vox] ;поворачиваем + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 0,0, 0, 5 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 100,0, 0, 5 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 200,0, 0, 5 + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,0x33000000 + mcall 0,(50 shl 16)+410,(30 shl 16)+480,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +align 4 +key: + mcall 2 + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_z + stdcall [buf2d_vox_brush_delete],buf_vox + stdcall mem.Free,[open_file_vox] + mcall -1 ;выход из программы + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + + ;воксельные функции: + buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + ;buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + ;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_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + ;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 + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',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_draw_1g db 'buf2d_vox_obj_draw_1g',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_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',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 + +align 4 +buf_0: ;буфер основного изображения + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 3 ;+6 top + dd 6*64 ;+8 w + dd 7*64 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_z: ;буфер глубины + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 6*64 ;+8 w + dd 7*64 ;+12 h + dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;данные для создания минимального единичного вокселя +align 4 +vox_6_7_z: +dd 0,0,1,1,0,0,\ + 0,2,2,2,2,0,\ + 2,2,2,2,2,2,\ + 2,3,2,2,3,2,\ + 2,3,3,3,3,2,\ + 0,3,3,3,3,0,\ + 0,0,3,3,0,0 + +align 4 +buf_vox: + db 6,7,4,3 ;w,h,h_osn,n + rb BUF_STRUCT_SIZE*(2+1) + +;-------------------------------------------------- +system_path db '/sys/lib/' +vectors_name db 'buf2d.obj',0 +err_message_found_lib db 'Sorry I cannot load library buf2d.obj',0 +head_f_i: +head_f_l db 'System error',0 +err_message_import db 'Error on load import library buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: + file_name: + rb 4096 +cur_dir_path: + rb 4096 +library_path: + rb 4096 +mem: + diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/trunk/voxel_editor.asm index 69b339bf24..705d865a29 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 19.06.12',0 ;подпись окна +caption db 'Voxel editor 21.06.12',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -932,6 +932,7 @@ push edi inc eax stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax + stdcall [buf2d_vox_obj_draw_1g], buf_r_img, buf_r_z, [open_file_vox], 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 @@ -1021,7 +1022,9 @@ draw_objects: 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], [sc.work_graph] + OT_MAP_X,OT_MAP_Y,TILE_SIZE, eax, [n_plane], [sc.work_graph] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_0z,\ + [open_file_vox], 0,0, eax bt dword[mode_light],0 jnc .end_1 stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, ebx,ecx, 0, eax, 3 @@ -1327,6 +1330,7 @@ import_buf2d: 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_1g dd sz_buf2d_vox_obj_draw_1g 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_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows @@ -1363,6 +1367,7 @@ import_buf2d: 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_1g db 'buf2d_vox_obj_draw_1g',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_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0