diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/gears.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/gears.asm index 03a5d40228..f8ba0784bb 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/gears.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/gears.asm @@ -130,13 +130,13 @@ draw_window: pushad mcall SF_REDRAW,SSF_BEGIN_DRAW - mcall SF_CREATE_WINDOW,(50 shl 16)+410,(30 shl 16)+425,0x33ffffff,,title1 + mcall SF_CREATE_WINDOW,(50 shl 16)+410,(30 shl 16)+425,0x33404040,,title1 stdcall [kosglSwapBuffers] ;Title - mcall SF_DRAW_TEXT,(300 shl 16)+4,0x808080,fps, fps.end-fps - mcall SF_DRAW_TEXT,(8 shl 16)+4,0x808080,title3,title3.end-title3 - ;mcall SF_DRAW_TEXT,(180 shl 16)+4,0x808080,title2,title2.end-title2 + mcall SF_DRAW_TEXT,(300 shl 16)+4,0xc0c0c0,fps, fps.end-fps + mcall SF_DRAW_TEXT,(8 shl 16)+4,0xc0c0c0,title3,title3.end-title3 + ;mcall SF_DRAW_TEXT,(180 shl 16)+4,0xc0c0c0,title2,title2.end-title2 mcall SF_REDRAW,SSF_END_DRAW popad @@ -210,7 +210,7 @@ title2: db 'F full screen' .end: db 0 title3: db 'ESC - exit' .end: db 0 -fps: db 'FPS:' +fps: db 'FPS:' .end: db 0 align 4 diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm index 89bc130684..061a1b0607 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm @@ -1,101 +1,21 @@ use32 org 0x0 db 'MENUET01' - dd 1,start,i_end - dd mem,stacktop - dd 0,cur_dir_path + dd 1,start,i_end,mem,stacktop,0,cur_dir_path include '../../../../../proc32.inc' include '../../../../../macros.inc' include '../../../../../KOSfuncs.inc' -include '../../../../../develop/libraries/box_lib/load_lib.mac' -include '../../../../../dll.inc' +include '../../../../../load_img.inc' include '../opengl_const.inc' include '../../../../../develop/info3ds/info_fun_float.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - align 4 -open_b rb 560 image_data_toolbar dd 0 IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -;макрос для загрузки изображений -; path - может быть переменной или строковым параметром -; buf - переменная куда будет записан указатель на изображение в формате rgb -; img_w, img_h - переменные куда будут записаны размеры открываемого -; изображения, не обязательные параметры -macro load_image_file path, buf, img_w, img_h -{ -if path eqtype '' ;проверяем задан ли строкой параметр path - local .path_str - jmp @f - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 -else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой -end if - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 - or eax,eax - jnz @f - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - stdcall mem.Alloc,ecx ;выделяем память для изображения - mov [buf],eax - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - mov [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и пишем его параметры - stdcall [img_decode], [buf],ebx,0 - mov ebx,eax - ;определяем размер декодированного изображения - mov ecx,[eax+4] ;+4 = image width -if img_w eq -else - mov dword[img_w],ecx -end if -if img_h eq - imul ecx,[eax+8] ;+8 = image height -else - mov eax,[eax+8] ;+8 = image height - mov dword[img_h],eax - imul ecx,eax -end if - imul ecx,3 ;need for r,g,b - stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера - mov [buf],eax - stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb - stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения - @@: -} - offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' align 4 @@ -129,7 +49,7 @@ load_libraries l_libs_start,l_libs_end mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf mov dword[buf_ogl],eax - load_image_file 'font8x9.bmp', image_data_toolbar + load_image_file 'font8x9.bmp', image_data_toolbar, buf_1.w,buf_1.h stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер stdcall mem.Free,[image_data_toolbar] ;освобождаем память stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит @@ -317,7 +237,15 @@ align 4 but_zoom_p: finit fld dword[scale] - fadd dword[delt_sc] + fadd dword[sc_delt] + fcom dword[sc_max] + fstsw ax + sahf + jbe @f + ffree st0 + fincstp + fld dword[sc_max] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -332,7 +260,15 @@ align 4 but_zoom_m: finit fld dword[scale] - fsub dword[delt_sc] + fsub dword[sc_delt] + fcom dword[sc_min] + fstsw ax + sahf + ja @f + ffree st0 + fincstp + fld dword[sc_min] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -399,8 +335,10 @@ ret qObj dd 0 -scale dd 0.4 -delt_sc dd 0.05 +scale dd 0.4 ;начальный масштаб +sc_delt dd 0.05 ;изменение масштаба при нажатии +sc_min dd 0.1 ;минимальный масштаб +sc_max dd 1.1 ;максимальный масштаб angle_z dd 0.0 angle_y dd 0.0 delt_size dd 3.0 @@ -576,15 +514,15 @@ buf_ogl: align 4 buf_1: dd 0 ;указатель на буфер изображения - dw 25,25 ;+4 left,top - dd 128,144 ;+8 w,h - dd 0,24 ;+16 color,bit in pixel + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+16 color,bit in pixel align 4 l_libs_start: - lib_0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\ + lib_0 l_libs lib_name_0, cur_dir_path, file_name, system_dir_0,\ err_msg_found_lib_0, head_f_l, import_lib_tinygl,err_msg_import_0,head_f_i - lib_1 l_libs lib_name_1, cur_dir_path, library_path, system_dir_1,\ + lib_1 l_libs lib_name_1, cur_dir_path, file_name, system_dir_1,\ err_msg_found_lib_1, head_f_l, import_buf2d, err_msg_import_1,head_f_i lib_2 l_libs lib_name_2, cur_dir_path, file_name, system_dir_2,\ err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i @@ -598,6 +536,5 @@ align 16 rb 4096 stacktop: cur_dir_path rb 4096 - library_path rb 4096 file_name rb 4096 mem: diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm index 8e91d90eff..b5c7c65e83 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm @@ -1,101 +1,21 @@ use32 org 0x0 db 'MENUET01' - dd 1,start,i_end - dd mem,stacktop - dd 0,cur_dir_path + dd 1,start,i_end,mem,stacktop,0,cur_dir_path include '../../../../../proc32.inc' include '../../../../../macros.inc' include '../../../../../KOSfuncs.inc' -include '../../../../../develop/libraries/box_lib/load_lib.mac' -include '../../../../../dll.inc' +include '../../../../../load_img.inc' include '../opengl_const.inc' include '../../../../../develop/info3ds/info_fun_float.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - align 4 -open_b rb 560 image_data_toolbar dd 0 IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -;макрос для загрузки изображений -; path - может быть переменной или строковым параметром -; buf - переменная куда будет записан указатель на изображение в формате rgb -; img_w, img_h - переменные куда будут записаны размеры открываемого -; изображения, не обязательные параметры -macro load_image_file path, buf, img_w, img_h -{ -if path eqtype '' ;проверяем задан ли строкой параметр path - local .path_str - jmp @f - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 -else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой -end if - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 - or eax,eax - jnz @f - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - stdcall mem.Alloc,ecx ;выделяем память для изображения - mov [buf],eax - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - mov [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и пишем его параметры - stdcall [img_decode], [buf],ebx,0 - mov ebx,eax - ;определяем размер декодированного изображения - mov ecx,[eax+4] ;+4 = image width -if img_w eq -else - mov dword[img_w],ecx -end if -if img_h eq - imul ecx,[eax+8] ;+8 = image height -else - mov eax,[eax+8] ;+8 = image height - mov dword[img_h],eax - imul ecx,eax -end if - imul ecx,3 ;need for r,g,b - stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера - mov [buf],eax - stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb - stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения - @@: -} - offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' align 4 @@ -130,7 +50,7 @@ load_libraries l_libs_start,l_libs_end mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf mov dword[buf_ogl],eax - load_image_file 'font8x9.bmp', image_data_toolbar + load_image_file 'font8x9.bmp', image_data_toolbar, buf_1.w,buf_1.h stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер stdcall mem.Free,[image_data_toolbar] ;освобождаем память stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит @@ -181,10 +101,16 @@ draw_window: mov esi,[sc.work_button] mcall SF_DEFINE_BUTTON,(6 shl 16)+19,(6 shl 16)+19,3+0x40000000 ;сферы mcall ,(36 shl 16)+19,,4+0x40000000 ;куб + mcall ,(66 shl 16)+19,,5+0x40000000 ;масштаб + + mcall ,(96 shl 16)+19,,6+0x40000000 ;масштаб - mcall SF_PUT_IMAGE,[image_data_toolbar],(21 shl 16)+21,(5 shl 16)+5 ;сферы add ebx,2*IMAGE_TOOLBAR_ICON_SIZE mcall ,,,(35 shl 16)+5 ;куб + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(65 shl 16)+5 ;масштаб + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(95 shl 16)+5 ;масштаб - stdcall [kosglSwapBuffers] mcall SF_REDRAW,SSF_END_DRAW @@ -200,31 +126,13 @@ key: cmp ah,61 ;+ jne @f - finit - fld dword[scale] - fadd dword[delt_sc] - fst dword[scale] - mov word[NumberSymbolsAD],3 - fstp qword[Data_Double] - call DoubleFloat_to_String - mov byte[txt_scale.v],0 - stdcall str_cat, txt_scale.v,Data_String - call draw_3d - stdcall [kosglSwapBuffers] + call but_zoom_p + jmp still @@: cmp ah,45 ;- jne @f - finit - fld dword[scale] - fsub dword[delt_sc] - fst dword[scale] - mov word[NumberSymbolsAD],3 - fstp qword[Data_Double] - call DoubleFloat_to_String - mov byte[txt_scale.v],0 - stdcall str_cat, txt_scale.v,Data_String - call draw_3d - stdcall [kosglSwapBuffers] + call but_zoom_m + jmp still @@: cmp ah,178 ;Up jne @f @@ -298,6 +206,16 @@ button: call but_dr_1 jmp still @@: + cmp ah,5 + jne @f + call but_zoom_p + jmp still + @@: + cmp ah,6 + jne @f + call but_zoom_m + jmp still + @@: cmp ah,1 jne still .exit: @@ -319,6 +237,52 @@ but_dr_1: stdcall [kosglSwapBuffers] ret +align 4 +but_zoom_p: + finit + fld dword[scale] + fadd dword[sc_delt] + fcom dword[sc_max] + fstsw ax + sahf + jbe @f + ffree st0 + fincstp + fld dword[sc_max] + @@: + fst dword[scale] + mov word[NumberSymbolsAD],3 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_scale.v],0 + stdcall str_cat, txt_scale.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + ret + +align 4 +but_zoom_m: + finit + fld dword[scale] + fsub dword[sc_delt] + fcom dword[sc_min] + fstsw ax + sahf + ja @f + ffree st0 + fincstp + fld dword[sc_min] + @@: + fst dword[scale] + mov word[NumberSymbolsAD],3 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_scale.v],0 + stdcall str_cat, txt_scale.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + ret + align 4 caption db 'Test textures, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0 align 4 @@ -430,8 +394,10 @@ texture dd 0 ;указатель на память с текстурой text_w dd 0 text_h dd 0 -scale dd 0.4 -delt_sc dd 0.05 +scale dd 0.4 ;начальный масштаб +sc_delt dd 0.05 ;изменение масштаба при нажатии +sc_min dd 0.1 ;минимальный масштаб +sc_max dd 1.1 ;максимальный масштаб angle_z dd 0.0 angle_y dd 0.0 delt_size dd 3.0 @@ -607,15 +573,15 @@ buf_ogl: align 4 buf_1: dd 0 ;указатель на буфер изображения - dw 25,25 ;+4 left,top - dd 128,144 ;+8 w,h - dd 0,24 ;+16 color,bit in pixel + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+16 color,bit in pixel align 4 l_libs_start: - lib_0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\ + lib_0 l_libs lib_name_0, cur_dir_path, file_name, system_dir_0,\ err_msg_found_lib_0, head_f_l, import_lib_tinygl,err_msg_import_0,head_f_i - lib_1 l_libs lib_name_1, cur_dir_path, library_path, system_dir_1,\ + lib_1 l_libs lib_name_1, cur_dir_path, file_name, system_dir_1,\ err_msg_found_lib_1, head_f_l, import_buf2d, err_msg_import_1,head_f_i lib_2 l_libs lib_name_2, cur_dir_path, file_name, system_dir_2,\ err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i @@ -629,6 +595,5 @@ align 16 rb 4096 stacktop: cur_dir_path rb 4096 - library_path rb 4096 file_name rb 4096 mem: diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm index 52c72556fe..030ad78761 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm @@ -1,101 +1,21 @@ use32 org 0x0 db 'MENUET01' - dd 1,start,i_end - dd mem,stacktop - dd 0,cur_dir_path + dd 1,start,i_end,mem,stacktop,0,cur_dir_path include '../../../../../proc32.inc' include '../../../../../macros.inc' include '../../../../../KOSfuncs.inc' -include '../../../../../develop/libraries/box_lib/load_lib.mac' -include '../../../../../dll.inc' +include '../../../../../load_img.inc' include '../opengl_const.inc' include '../../../../../develop/info3ds/info_fun_float.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - align 4 -open_b rb 560 image_data_toolbar dd 0 IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -;макрос для загрузки изображений -; path - может быть переменной или строковым параметром -; buf - переменная куда будет записан указатель на изображение в формате rgb -; img_w, img_h - переменные куда будут записаны размеры открываемого -; изображения, не обязательные параметры -macro load_image_file path, buf, img_w, img_h -{ -if path eqtype '' ;проверяем задан ли строкой параметр path - local .path_str - jmp @f - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 -else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой -end if - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 - or eax,eax - jnz @f - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - stdcall mem.Alloc,ecx ;выделяем память для изображения - mov [buf],eax - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - mov [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и пишем его параметры - stdcall [img_decode], [buf],ebx,0 - mov ebx,eax - ;определяем размер декодированного изображения - mov ecx,[eax+4] ;+4 = image width -if img_w eq -else - mov dword[img_w],ecx -end if -if img_h eq - imul ecx,[eax+8] ;+8 = image height -else - mov eax,[eax+8] ;+8 = image height - mov dword[img_h],eax - imul ecx,eax -end if - imul ecx,3 ;need for r,g,b - stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера - mov [buf],eax - stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb - stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения - @@: -} - offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' align 4 @@ -130,7 +50,7 @@ load_libraries l_libs_start,l_libs_end mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf mov dword[buf_ogl],eax - load_image_file 'font8x9.bmp', image_data_toolbar + load_image_file 'font8x9.bmp', image_data_toolbar, buf_1.w,buf_1.h stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер stdcall mem.Free,[image_data_toolbar] ;освобождаем память stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит @@ -323,7 +243,15 @@ align 4 but_zoom_p: finit fld dword[scale] - fadd dword[delt_sc] + fadd dword[sc_delt] + fcom dword[sc_max] + fstsw ax + sahf + jbe @f + ffree st0 + fincstp + fld dword[sc_max] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -338,7 +266,15 @@ align 4 but_zoom_m: finit fld dword[scale] - fsub dword[delt_sc] + fsub dword[sc_delt] + fcom dword[sc_min] + fstsw ax + sahf + ja @f + ffree st0 + fincstp + fld dword[sc_min] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -395,8 +331,10 @@ texture dd 0 ;указатель на память с текстурой text_w dd 0 text_h dd 0 -scale dd 0.95 -delt_sc dd 0.05 +scale dd 0.95 ;начальный масштаб +sc_delt dd 0.05 ;изменение масштаба при нажатии +sc_min dd 0.1 ;минимальный масштаб +sc_max dd 5.0 ;максимальный масштаб angle_z dd 0.0 angle_x dd 90.0 angle_y dd 0.0 @@ -571,17 +509,17 @@ buf_ogl: align 4 buf_1: dd 0 ;указатель на буфер изображения - dw 25,25 ;+4 left,top - dd 128,144 ;+8 w,h - dd 0,24 ;+16 color,bit in pixel + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+16 color,bit in pixel align 4 l_libs_start: - lib_0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\ + lib_0 l_libs lib_name_0, cur_dir_path, file_name, system_dir_0,\ err_msg_found_lib_0, head_f_l, import_lib_tinygl,err_msg_import_0,head_f_i - lib_1 l_libs lib_name_1, cur_dir_path, library_path, system_dir_1,\ + lib_1 l_libs lib_name_1, cur_dir_path, file_name, system_dir_1,\ err_msg_found_lib_1, head_f_l, import_buf2d, err_msg_import_1,head_f_i - lib_2 l_libs lib_name_2, cur_dir_path, library_path, system_dir_2,\ + lib_2 l_libs lib_name_2, cur_dir_path, file_name, system_dir_2,\ err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i l_libs_end: @@ -593,6 +531,5 @@ align 16 rb 4096 stacktop: cur_dir_path rb 4096 - library_path rb 4096 file_name rb 4096 mem: diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm index 50272b319d..c5e26e56f6 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm @@ -1,101 +1,21 @@ use32 org 0x0 db 'MENUET01' - dd 1,start,i_end - dd mem,stacktop - dd 0,cur_dir_path + dd 1,start,i_end,mem,stacktop,0,cur_dir_path include '../../../../../proc32.inc' include '../../../../../macros.inc' include '../../../../../KOSfuncs.inc' -include '../../../../../develop/libraries/box_lib/load_lib.mac' -include '../../../../../dll.inc' +include '../../../../../load_img.inc' include '../opengl_const.inc' include '../../../../../develop/info3ds/info_fun_float.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - align 4 -open_b rb 560 image_data_toolbar dd 0 IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -;макрос для загрузки изображений -; path - может быть переменной или строковым параметром -; buf - переменная куда будет записан указатель на изображение в формате rgb -; img_w, img_h - переменные куда будут записаны размеры открываемого -; изображения, не обязательные параметры -macro load_image_file path, buf, img_w, img_h -{ -if path eqtype '' ;проверяем задан ли строкой параметр path - local .path_str - jmp @f - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 -else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой -end if - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 - or eax,eax - jnz @f - - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - stdcall mem.Alloc,ecx ;выделяем память для изображения - mov [buf],eax - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - mov [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и пишем его параметры - stdcall [img_decode], [buf],ebx,0 - mov ebx,eax - ;определяем размер декодированного изображения - mov ecx,[eax+4] ;+4 = image width -if img_w eq -else - mov dword[img_w],ecx -end if -if img_h eq - imul ecx,[eax+8] ;+8 = image height -else - mov eax,[eax+8] ;+8 = image height - mov dword[img_h],eax - imul ecx,eax -end if - imul ecx,3 ;need for r,g,b - stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера - mov [buf],eax - stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb - stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения - @@: -} - offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' align 4 @@ -131,7 +51,7 @@ load_libraries l_libs_start,l_libs_end mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf mov dword[buf_ogl],eax - load_image_file 'font8x9.bmp', image_data_toolbar + load_image_file 'font8x9.bmp', image_data_toolbar, buf_1.w,buf_1.h stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер stdcall mem.Free,[image_data_toolbar] ;освобождаем память stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит @@ -294,7 +214,15 @@ align 4 but_zoom_p: finit fld dword[scale] - fadd dword[delt_sc] + fadd dword[sc_delt] + fcom dword[sc_max] + fstsw ax + sahf + jbe @f + ffree st0 + fincstp + fld dword[sc_max] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -309,7 +237,15 @@ align 4 but_zoom_m: finit fld dword[scale] - fsub dword[delt_sc] + fsub dword[sc_delt] + fcom dword[sc_min] + fstsw ax + sahf + ja @f + ffree st0 + fincstp + fld dword[sc_min] + @@: fst dword[scale] mov word[NumberSymbolsAD],3 fstp qword[Data_Double] @@ -320,6 +256,7 @@ but_zoom_m: stdcall [kosglSwapBuffers] ret + align 4 caption db 'Test textures, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0 align 4 @@ -351,8 +288,10 @@ texture dd 0 ;указатель на память с текстурой text_w dd 0 text_h dd 0 -scale dd 1.5 -delt_sc dd 0.05 +scale dd 1.5 ;начальный масштаб +sc_delt dd 0.05 ;изменение масштаба при нажатии +sc_min dd 0.95 ;минимальный масштаб +sc_max dd 2.5 ;максимальный масштаб angle_z dd 0.0 angle_x dd 90.0 angle_y dd 0.0 @@ -527,17 +466,17 @@ buf_ogl: align 4 buf_1: dd 0 ;указатель на буфер изображения - dw 25,25 ;+4 left,top - dd 128,144 ;+8 w,h - dd 0,24 ;+16 color,bit in pixel + dd 0 ;+4 left,top +.w: dd 0 +.h: dd 0,0,24 ;+16 color,bit in pixel align 4 l_libs_start: - lib_0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\ + lib_0 l_libs lib_name_0, cur_dir_path, file_name, system_dir_0,\ err_msg_found_lib_0, head_f_l, import_lib_tinygl,err_msg_import_0,head_f_i - lib_1 l_libs lib_name_1, cur_dir_path, library_path, system_dir_1,\ + lib_1 l_libs lib_name_1, cur_dir_path, file_name, system_dir_1,\ err_msg_found_lib_1, head_f_l, import_buf2d, err_msg_import_1,head_f_i - lib_2 l_libs lib_name_2, cur_dir_path, library_path, system_dir_2,\ + lib_2 l_libs lib_name_2, cur_dir_path, file_name, system_dir_2,\ err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i l_libs_end: @@ -549,6 +488,5 @@ align 16 rb 4096 stacktop: cur_dir_path rb 4096 - library_path rb 4096 file_name rb 4096 mem: diff --git a/programs/load_img.inc b/programs/load_img.inc new file mode 100644 index 0000000000..5fe655a3c8 --- /dev/null +++ b/programs/load_img.inc @@ -0,0 +1,95 @@ +; +; Макрос для загрузки изображений чрез функции библиотеки libimg. +; Действия которые делает макрос load_image_file: +; +; Проверяет размер полученного файла с изображением. +; Выделяет под него память и загружает туда файл. +; Определяет размер памяти необходимой для распаковки изображения. +; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ... +; в формат rgb который можно выводить на экран через сист. функцию. +; При необходимости можно также получить размеры открываемого изображения для +; их дальнейшего использования в программе. +; +; В использующей программе должна быть подключена библиотека libimg, +; объявлена переменная file_name размером около 4096 байт, +; а также структура run_file_70 типа FileInfoBlock. + +; подключение некоторых необходимых файлов: +include 'dll.inc' +include 'develop/libraries/box_lib/load_lib.mac' +include 'libio.inc' + +align 4 +open_b rb 560 + +; path - может быть переменной или строковым параметром +; buf - переменная куда будет записан указатель на изображение в формате rgb +; img_w, img_h - переменные куда будут записаны размеры открываемого +; изображения, не обязательные параметры +; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр +; если не указан берется 3. Минимальное значение должно быть не меньше 3. +macro load_image_file path, buf, img_w, img_h, bytes_p_p +{ +local .end_open +if path eqtype '' ;проверяем задан ли строкой параметр path + local .path_str + jmp @f + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0 +else + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой +end if + mov [run_file_70.Function], SSF_GET_INFO + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mcall SF_FILE,run_file_70 + or eax,eax + jnz .end_open + + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + stdcall mem.Alloc,ecx ;выделяем память для изображения + mov [buf],eax + mov [run_file_70.Function], SSF_READ_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], ecx + mov [run_file_70.Buffer], eax + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mcall SF_FILE,run_file_70 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_open + ;определяем вид изображения и пишем его параметры + stdcall [img_decode], [buf],ebx,0 + mov ebx,eax + ;определяем размер декодированного изображения + mov ecx,[eax+4] ;+4 = image width +if img_w eq +else + mov dword[img_w],ecx +end if +if img_h eq + imul ecx,[eax+8] ;+8 = image height +else + mov eax,[eax+8] ;+8 = image height + mov dword[img_h],eax + imul ecx,eax +end if +if bytes_p_p eq + imul ecx,3 ;need for r,g,b +else + imul ecx,bytes_p_p +end if + stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера + mov [buf],eax + stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb + stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения + .end_open: +}