update 'voxel_editor'

git-svn-id: svn://kolibrios.org@2759 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2012-06-12 09:56:51 +00:00
parent 3c47cb905e
commit d00cd6a604
5 changed files with 209 additions and 49 deletions

View File

@ -49,9 +49,15 @@ table { font-size: 15px; }
<h1>Оглавление</h1>
<ul>
<li>Вступление</li>
<li><a href="#f_buf">Форматы буферов</a></li>
<li><a href="#format_buf">Форматы буферов</a></li>
<li><a href="#fun">Функции</a><br>
<li><a href="#const">Константы</a><br>
<ul>
<li><a href="#f_init">lib_init</a></li>
<li><a href="#f_b_create">buf2d_create</a></li>
<li><a href="#f_v_brush_c">buf2d_vox_brush_create</a></li>
</ul>
</li>
<li><a href="#const">Константы</a></li>
<li><a href="#tabl_e">Таблица экспорта</a></li>
<li><a href="#hist">История</a></li>
</ul>
@ -60,11 +66,13 @@ table { font-size: 15px; }
<p>Документация к свободной библиотеке <b>buf2d.asm</b>, для <b>ОС Колибри</b>.
Эта библиотека создана для работы с 2d изображениями.
С ее помощью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран.
Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями, есть функция рисования лини пока на этом все.</p>
Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями.
Есть функции рисования линий, кривых Безье, прямоугольников, окружностей.
Также есть функции для рисований воксельной графики.</p>
<p>Последнее обновление библиотеки 11.05.12.</p>
<p>Последнее обновление библиотеки 12.06.12.</p>
<h1><a name="f_buf">Форматы буферов</a></h1>
<h1><a name="format_buf">Форматы буферов</a></h1>
<p>Поддерживается 3 формата буферов.
Каждая функция при работе с буферами может быть расчитана на работу с определенными форматами изображений.</p>
@ -90,11 +98,14 @@ buf_0:
dd 0x80 ;+16 фоновый цвет
db 24 ;+20 бит на пиксель</pre>
<h4>lib_init</h4>
<h4><a name="f_init">lib_init</a></h4>
<p>Эта функция получает указатели на функции работы с памятью, вызыватся должна при загрузке библиотеки. Можете использовать макрос <b>@use_library_mem</b>, для ее автоматической настройки.</p>
<h4>buf2d_create</h4>
<p>Создает буфер и чистит его фоновым цветом.</p>
<h4><a name="f_b_create">buf2d_create</a></h4>
<p>Создает буфер и чистит его фоновым цветом. Пример:</p>
<pre>stdcall [buf2d_create], buf_0</pre>
<p>где buf_0 - структура буфера.</p>
<p>Параметры для создания буфера берутся из структуры.</p>
<h4>buf2d_create_f_img</h4>
<p>Создает буфер на основе изображения в формате <b>rgb</b>.</p>
@ -229,6 +240,33 @@ stdcall [buf2d_convert_text_matrix], buf_1</pre>
<p>100,150 - координаты точки;</p>
<p>eax - цвет точки (для 8 и 24 битных буферов не используемые старшие биты в eax равны 0) или значение -1 в случае ошибки.</p>
<h4><a name="f_v_brush_c">buf2d_vox_brush_create</a></h4>
<p>Создание воксельной кисти.</p>
<h4>buf2d_vox_brush_delete</h4>
<p>Удаление воксельной кисти.</p>
<h4>buf2d_vox_obj_get_img_w_3g</h4>
<p>Возврашает ширину воксельного изображения с 3-мя гранями (которое рисуется функцией <b>buf2d_vox_obj_draw_3g</b>), принимает указатель на кисть и масштаб.</p>
<h4>buf2d_vox_obj_get_img_h_3g</h4>
<p>Возврашает высоту воксельного изображения с 3-мя гранями (которое рисуется функцией <b>buf2d_vox_obj_draw_3g</b>), принимает указатель на кисть и масштаб.</p>
<h4>buf2d_vox_obj_draw_3g</h4>
<p>Рисование воксельного объекта с 3-мя гранями.</p>
<h4>buf2d_vox_obj_draw_3g_scaled</h4>
<p>Рисование части воксельного объекта.</p>
<h4>buf2d_vox_obj_draw_3g_shadows</h4>
<p>Функция рисующая тени для изображений нарисованных с помощью функции <b>buf2d_vox_obj_draw_3g</b> или <b>buf2d_vox_obj_draw_3g_scaled</b>.</p>
<h4>buf2d_vox_obj_draw_pl</h4>
<p>Функция рисующая срез воксельного обьекта.</p>
<h4>buf2d_vox_obj_draw_pl_scaled</h4>
<p>Функция рисующая срез части воксельного обьекта.</p>
<h1><a name="const">Константы</a></h1>
<h4>BUF2D_OPT_CROP_TOP equ 1</h4>
<p>Константа для функции buf2d_crop_color, обозначает обрезку буфера сверху</p>
@ -271,6 +309,17 @@ import_buf2d_lib:
buf2d_set_pixel dd sz_buf2d_set_pixel
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_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
@ -298,7 +347,18 @@ import_buf2d_lib:
sz_buf2d_offset_h db 'buf2d_offset_h',0
sz_buf2d_flood_fill db 'buf2d_flood_fill',0
sz_buf2d_set_pixel db 'buf2d_set_pixel',0
sz_buf2d_get_pixel db 'buf2d_get_pixel',0</pre>
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_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</pre>
<h1><a name="hist">История</a></h1>
<p>02.07.10 - самая первая версия библиотеки, 2 примера использования.</p>
@ -321,5 +381,6 @@ import_buf2d_lib:
<p>20.02.12 - функции buf2d_filled_rect_by_size и buf2d_rect_by_size могут принимать отрицательные размеры для прямоугольников, в функции buf2d_line горизонтальная линия рисуется на 1 пиксель длинее (раньше не дорисовывало), некоторые функции могут рисовать в 8 битных буферах.</p>
<p>23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp</p>
<p>11.05.12 - добавлена функция для взятия цвета точки buf2d_get_pixel, доработки в buf2d_set_pixel.</p>
<p>12.06.12 - добавлены функции для рисования воксельной графики.</p>
</body>
</html>

View File

@ -2912,13 +2912,13 @@ endp
align 4
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]
mov ebx,[coord_x]
mov eax,[coord_y]
mov edi,[buf_v2]
mov ecx,buf2d_h
mov esi,buf2d_w
imul ecx,esi
add esi,eax
add esi,ebx
mov edx,buf2d_data
cld
;ecx - count pixels in voxel
@ -2929,23 +2929,24 @@ pushad
cmp dword[edx],0
je @f
;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
push eax ecx esi
push eax ecx edi esi
mov ecx,eax
stdcall buf_get_pixel, [buf_v1],ecx,ebx
mov edi,[buf_v1]
call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx
mov esi,[edx]
add esi,[coord_z]
cmp eax,esi
jge .end_draw
stdcall buf_set_pixel, [buf_v1],ecx,ebx,esi ;esi = new coord z
stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z
.end_draw:
pop esi ecx eax
pop esi edi ecx eax
@@:
add edx,4
inc eax
cmp eax,esi
jl @f
inc ebx
sub eax,buf2d_w
cmp ebx,esi
jl @f
inc eax
sub ebx,buf2d_w
@@:
loop .cycle
popad

Binary file not shown.

View File

@ -9,15 +9,15 @@ use32
dd 0
dd sys_path
include 'd:/kolibri/svn/programs/macros.inc'
include 'd:/kolibri/svn/programs/proc32.inc'
include 'd:/kolibri/svn/programs/develop/libraries/box_lib/load_lib.mac'
include '../../../../programs/macros.inc'
include '../../../../programs/proc32.inc'
include '../../../../programs/develop/libraries/box_lib/load_lib.mac'
include 'mem.inc'
include 'dll.inc'
include 'vox_draw.inc'
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db 'Voxel editor 11.06.12',0 ;¯®¤¯¨áì ®ª­ 
caption db 'Voxel editor 12.06.12',0 ;¯®¤¯¨áì ®ª­ 
struct FileInfoBlock
Function dd ?
@ -302,12 +302,7 @@ pushad
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 ;®¡­®¢«ï¥¬ ¡ãä¥à ­  íªà ­¥
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
call on_change_color ;®â®¡à ¦ ¥¬ ¨§¬¥­¥­¨ï 梥â 
.end_f:
popad
ret
@ -472,24 +467,21 @@ draw_pok:
mov eax,47
mov ecx,[v_zoom]
mov ebx,(2 shl 16)
mov ebx,(3 shl 16)+(1 shl 31)
mov edx,((365+6*9) shl 16)+5
mov esi,[sc.work_button_text]
or esi,(1 shl 30)
mov edi,[sc.work_button]
int 0x40 ;¬ áèâ ¡
mov ebx,(5 shl 16)
mov ecx,[v_cur_x]
add edx,(6*2)*65536+9
int 0x40 ;
mov ebx,(5 shl 16)
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 ;
int 0x40 ;­®¬¥à á¥ç¥­¨ï
mov eax,4 ;à¨á®¢ ­¨¥ ⥪áâ 
mov ebx,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2
@ -498,10 +490,25 @@ draw_pok:
mov edx,txt_color
int 0x40
call on_change_color
ret
align 4
on_change_color:
pushad
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
mov ebx,(1 shl 8)+(6 shl 16)
mov ecx,edx
mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2
mov esi,[sc.work_text]
add esi,(1 shl 30)
mov edi,[sc.work]
mcall 47
popad
ret
align 4
@ -529,11 +536,11 @@ button:
@@:
cmp ah,6
jne @f
call but_1
call but_zoom_p
@@:
cmp ah,7
jne @f
call but_2
call but_zoom_m
@@:
cmp ah,8
jne @f
@ -639,6 +646,9 @@ but_open_file:
movzx eax,byte[eax]
and eax,0xff ;¡¥à¥¬ ¬ áèâ ¡ ¯® 㬮«ç ­¨î
mov dword[v_zoom],eax ;¡¥à¥¬ ¬ áèâ ¡ ¯® 㬮«ç ­¨î
mov dword[cam_x],0
mov dword[cam_y],0
mov dword[cam_z],0
call draw_objects
.end_open_file:
popad
@ -679,7 +689,7 @@ but_save_file:
;㢥«¨ç¥­¨¥ ¬ áèâ ¡ 
align 4
but_1:
but_zoom_p:
cmp dword[v_zoom],10 ;¬ ªá¨¬ «ì­ë© à §¬¥à, ¤® ª®â®à®£® ¬®¦­® 㢥«¨ç¨âì 2^10=1024
jge @f
inc dword[v_zoom]
@ -688,9 +698,21 @@ but_1:
mov eax,[v_zoom]
cmp eax,[scaled_zoom]
jl .end_0
push ecx
mov ecx,[scaled_zoom]
xor eax,eax
inc eax
shl eax,cl
shl dword[cam_x],1
shl dword[cam_y],1
shl dword[cam_z],1
cmp eax,[n_plane]
jg .end_1
;ª®à¥ªâ¨à®¢ª  ¯®«§ã­ª 
sub [n_plane],eax
inc dword[cam_y]
.end_1:
pop ecx
.end_0:
pop eax
call draw_objects
@ -700,8 +722,8 @@ but_1:
;㬥­ì襭¨¥ ¬ áèâ ¡ 
align 4
but_2:
cmp dword[v_zoom],-1
but_zoom_m:
cmp dword[v_zoom],1
jl @f
dec dword[v_zoom]
shr dword[n_plane],1
@ -711,6 +733,17 @@ but_2:
jl .end_0
shr dword[cam_x],1
shr dword[cam_y],1
jnc .end_1
;ª®à¥ªâ¨à®¢ª  ¯®«§ã­ª 
push ecx
mov ecx,[scaled_zoom]
dec ecx
xor eax,eax
inc eax
shl eax,cl
add [n_plane],eax
pop ecx
.end_1:
shr dword[cam_z],1
.end_0:
pop eax
@ -731,21 +764,83 @@ but_4:
call draw_objects
ret
;ᤢ¨£ ¥¬ ¯«®áª®áâì á१ 
align 4
but_5:
push eax ecx
inc dword[n_plane]
mov eax,[v_zoom]
cmp eax,[scaled_zoom]
jle .end_0
;¯à®¨á室¨â ¬ áèâ ¡¨à®¢ ­¨¥
mov ecx,[scaled_zoom]
xor eax,eax
inc eax
shl eax,cl
cmp eax,[n_plane]
jg @f
mov dword[n_plane],0
inc dword[cam_y] ;¯¥à¥å®¤¨¬ ¢ á®á¥¤­¨© ªã¡
neg ecx
;inc ecx
add ecx,[v_zoom]
xor eax,eax
inc eax
shl eax,cl
cmp eax,[cam_y]
jg @f
mov dword[cam_y],0 ;§ æ¨ª«¨¢ ¥¬ ¥á«¨ ¢ë«¥§«¨ §  ¯à¥¤¥«ë ¯®á«¥¤­¥£® ªã¡ 
@@:
jmp .end_1
.end_0:
;¬ áèâ ¡¨à®¢ ­¨¥ ­¥ ¯à®¨á室¨â
mov ecx,eax
xor eax,eax
inc eax
shl eax,cl
cmp eax,[n_plane]
jg .end_1
mov dword[n_plane],0
.end_1:
call draw_objects
call draw_pok
pop ecx eax
ret
;ᤢ¨£ ¥¬ ¯«®áª®áâì á१ 
align 4
but_6:
cmp dword[n_plane],0
jle @f
dec dword[n_plane]
cmp dword[n_plane],0
jge .end_f
push eax ecx
mov ecx,[scaled_zoom]
xor eax,eax
inc eax
shl eax,cl
dec eax
mov dword[n_plane],eax
mov eax,[v_zoom]
cmp eax,[scaled_zoom]
jle .end_0
;¯à®¨á室¨â ¬ áèâ ¡¨à®¢ ­¨¥
dec dword[cam_y] ;¯¥à¥å®¤¨¬ ¢ á®á¥¤­¨© ªã¡
cmp dword[cam_y],0
jge .end_0
mov ecx,eax
sub ecx,[scaled_zoom]
xor eax,eax
inc eax
shl eax,cl
dec eax
mov dword[cam_y],eax ;¥á«¨ ­®¬¥à ªã¡  ®ª § «áï ¬¥­ìè¥ 0 ¨á¯à ¢«ï¥¬ ­  ¬ ªá¨¬ «ì­®¥ §­ ç¥­¨¥
.end_0:
pop ecx eax
.end_f:
call draw_objects
call draw_pok
@@:
ret
align 4
@ -922,8 +1017,10 @@ draw_objects:
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
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]
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
@ -1179,9 +1276,10 @@ import_buf2d:
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
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
@ -1214,9 +1312,9 @@ import_buf2d:
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
sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
mouse_dd dd 0x0
sc system_colors