From ed44ecca0496a7340a9a8758b86335eb0df2b572 Mon Sep 17 00:00:00 2001 From: IgorA Date: Wed, 10 Feb 2016 18:41:35 +0000 Subject: [PATCH] add example with panorama, modify other examples git-svn-id: svn://kolibrios.org@6189 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../TinyGL/asm_fork/examples/build.bat | 42 +- .../TinyGL/asm_fork/examples/test_glu2.asm | 156 +++-- .../TinyGL/asm_fork/examples/text_3.png | Bin 0 -> 92311 bytes .../TinyGL/asm_fork/examples/textures0.asm | 113 ++-- .../TinyGL/asm_fork/examples/textures1.asm | 171 ++++-- .../TinyGL/asm_fork/examples/textures2.asm | 554 ++++++++++++++++++ .../TinyGL/asm_fork/examples/toolb_1.png | Bin 737 -> 1011 bytes .../libraries/TinyGL/asm_fork/image_util.asm | 246 ++++++++ .../libraries/TinyGL/asm_fork/texture.asm | 13 +- .../libraries/TinyGL/asm_fork/tinygl.asm | 2 +- 10 files changed, 1127 insertions(+), 170 deletions(-) create mode 100644 programs/develop/libraries/TinyGL/asm_fork/examples/text_3.png create mode 100644 programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm create mode 100644 programs/develop/libraries/TinyGL/asm_fork/image_util.asm diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/build.bat b/programs/develop/libraries/TinyGL/asm_fork/examples/build.bat index 17ac9abd2e..4a68e69a31 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/build.bat +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/build.bat @@ -1,3 +1,41 @@ -@fasm.exe test_glu2.asm test_glu2 -@FASM.exe textures0.asm textures0 +if not exist bin mkdir bin +@copy *.png bin\*.png +if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp +if not exist bin\tinygl.obj @fasm.exe -m 16384 ..\tinygl.asm bin\tinygl.obj + +@fasm.exe -m 16384 test0.asm bin\test0.kex +@fasm.exe -m 16384 test1.asm bin\test1.kex +@fasm.exe -m 16384 test2.asm bin\test2.kex +@fasm.exe -m 16384 test3.asm bin\test3.kex + +@fasm.exe -m 16384 test_array0.asm bin\test_array0.kex +@fasm.exe -m 16384 test_array1.asm bin\test_array1.kex + +@fasm.exe -m 16384 test_glu0.asm bin\test_glu0.kex +@fasm.exe -m 16384 test_glu1.asm bin\test_glu1.kex +@fasm.exe -m 16384 test_glu2.asm bin\test_glu2.kex + +@fasm.exe -m 16384 gears.asm bin\gears.kex +@fasm.exe -m 16384 textures0.asm bin\textures0.kex +@fasm.exe -m 16384 textures1.asm bin\textures1.kex +@fasm.exe -m 16384 textures2.asm bin\textures2.kex + + +@kpack bin\test0.kex +@kpack bin\test1.kex +@kpack bin\test2.kex +@kpack bin\test3.kex + +@kpack bin\test_array0.kex +@kpack bin\test_array1.kex + +@kpack bin\test_glu0.kex +@kpack bin\test_glu1.kex +@kpack bin\test_glu2.kex + +@kpack bin\gears.kex +@kpack bin\textures0.kex +@kpack bin\textures1.kex +@kpack bin\textures2.kex + pause \ No newline at end of file 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 6450f97c6a..89bc130684 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/test_glu2.asm @@ -25,44 +25,74 @@ struct FileInfoBlock FileName dd ? ends -image_data dd 0 ;указатель на временную память, нужен для преобразования изображения +align 4 +open_b rb 560 image_data_toolbar dd 0 -IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*3+54 -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .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 - stdcall mem.Alloc, dword size ;выделяем память для изображения +;макрос для загрузки изображений +; 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], dword size + 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 - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall dword[img_decode], dword[buf],ebx,0 - mov dword[image_data],eax - ;преобразуем изображение к формату rgb - stdcall dword[img_to_rgb2], dword[image_data],dword[buf] - ;удаляем временный буфер image_data - stdcall dword[img_destroy], dword[image_data] + ;определяем вид изображения и пишем его параметры + 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 ;удаляем временный буфер с параметрами изображения @@: } @@ -99,13 +129,13 @@ 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,IMAGE_FILE1_SIZE + load_image_file 'font8x9.bmp', image_data_toolbar 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 бит stdcall [buf2d_convert_text_matrix], buf_1 - load_image_file 'toolb_1.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE + load_image_file 'toolb_1.png', image_data_toolbar call draw_3d align 4 @@ -133,12 +163,18 @@ draw_window: 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 ,(126 shl 16)+19,,7+0x40000000 ;масштаб - mcall SF_PUT_IMAGE,[image_data_toolbar],(21 shl 16)+21,(5 shl 16)+5 ;вершины вкл. add ebx,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 ;масштаб + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(125 shl 16)+5 ;масштаб - stdcall [kosglSwapBuffers] mcall SF_REDRAW,SSF_END_DRAW @@ -154,31 +190,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 @@ -257,6 +275,16 @@ button: call but_st_face jmp still @@: + cmp ah,6 + jne @f + call but_zoom_p + jmp still + @@: + cmp ah,7 + jne @f + call but_zoom_m + jmp still + @@: cmp ah,1 jne still .exit: @@ -285,6 +313,36 @@ but_st_face: stdcall [kosglSwapBuffers] ret +align 4 +but_zoom_p: + 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] + ret + +align 4 +but_zoom_m: + 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] + ret + align 4 caption db 'Test gluSphere, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0 diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/text_3.png b/programs/develop/libraries/TinyGL/asm_fork/examples/text_3.png new file mode 100644 index 0000000000000000000000000000000000000000..791c513ea178c4aa6191c7a0820f36ad0ec5680a GIT binary patch literal 92311 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�AoDGlQ=1i-For@Yfog)Ir1 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 z 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 literal 0 HcmV?d00001 diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm index 1920ebc3ac..8e91d90eff 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures0.asm @@ -25,44 +25,74 @@ struct FileInfoBlock FileName dd ? ends -image_data dd 0 ;указатель на временную память, нужен для преобразования изображения +align 4 +open_b rb 560 image_data_toolbar dd 0 -IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*3+54 -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .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 - stdcall mem.Alloc, dword size ;выделяем память для изображения +;макрос для загрузки изображений +; 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], dword size + 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 - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall dword[img_decode], dword[buf],ebx,0 - mov dword[image_data],eax - ;преобразуем изображение к формату rgb - stdcall dword[img_to_rgb2], dword[image_data],dword[buf] - ;удаляем временный буфер image_data - stdcall dword[img_destroy], dword[image_data] + ;определяем вид изображения и пишем его параметры + 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 ;удаляем временный буфер с параметрами изображения @@: } @@ -100,24 +130,23 @@ 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,IMAGE_FILE1_SIZE + load_image_file 'font8x9.bmp', image_data_toolbar 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 бит stdcall [buf2d_convert_text_matrix], buf_1 - load_image_file 'toolb_1.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE - - load_image_file 'text_1.png', texture, (256*256*3+54) ;открытие файла текстуры + load_image_file 'toolb_1.png', image_data_toolbar + load_image_file 'text_1.png', texture, text_w,text_h ;открытие файла текстуры ;* Setup texturing * stdcall [glTexEnvi], GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL - stdcall [glHint], GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST ;* generate texture object IDs * stdcall [glGenTextures], 1, TexObj stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj] - stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, [texture] + stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, [text_w], [text_h],\ + 0, GL_RGB, GL_UNSIGNED_BYTE, [texture] stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST @@ -301,8 +330,6 @@ draw_3d: stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glPushMatrix] - call SetLight - stdcall [glTranslatef], 0.0,0.0,0.5 stdcall [glScalef], [scale], [scale], [scale] stdcall [glRotatef], [angle_z],0.0,0.0,1.0 @@ -396,28 +423,12 @@ stdcall [glPopMatrix] stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_y,5,25,0xffff00 ret -align 4 -SetLight: - stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position - stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir - - stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light - stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light - - stdcall [glEnable], GL_COLOR_MATERIAL - stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE - stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular - ;stdcall [glMaterialf], GL_FRONT, GL_SHININESS, [mat_shininess] - stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient - - stdcall [glEnable],GL_LIGHTING - stdcall [glEnable],GL_LIGHT0 -ret - dr_figure dd 0 qObj dd 0 TexObj dd 0 ;массив указателей на текстуры (в данном случае 1 шт.) texture dd 0 ;указатель на память с текстурой +text_w dd 0 +text_h dd 0 scale dd 0.4 delt_sc dd 0.05 diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm index 3530475e89..52c72556fe 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures1.asm @@ -25,44 +25,74 @@ struct FileInfoBlock FileName dd ? ends -image_data dd 0 ;указатель на временную память, нужен для преобразования изображения +align 4 +open_b rb 560 image_data_toolbar dd 0 -IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3 -IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*3+54 -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .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 - stdcall mem.Alloc, dword size ;выделяем память для изображения +;макрос для загрузки изображений +; 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], dword size + 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 - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall dword[img_decode], dword[buf],ebx,0 - mov dword[image_data],eax - ;преобразуем изображение к формату rgb - stdcall dword[img_to_rgb2], dword[image_data],dword[buf] - ;удаляем временный буфер image_data - stdcall dword[img_destroy], dword[image_data] + ;определяем вид изображения и пишем его параметры + 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 ;удаляем временный буфер с параметрами изображения @@: } @@ -100,15 +130,14 @@ 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,IMAGE_FILE1_SIZE + load_image_file 'font8x9.bmp', image_data_toolbar 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 бит stdcall [buf2d_convert_text_matrix], buf_1 - load_image_file 'toolb_1.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE - - load_image_file 'text_2.png', texture, (256*256*3+54) ;открытие файла текстуры + load_image_file 'toolb_1.png', image_data_toolbar + load_image_file 'text_2.png', texture, text_w,text_h ;открытие файла текстуры ;* Setup texturing * stdcall [glTexEnvi], GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL @@ -116,7 +145,8 @@ load_libraries l_libs_start,l_libs_end ;* generate texture object IDs * stdcall [glGenTextures], 1, TexObj stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj] - stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, [texture] + stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, [text_w], [text_h],\ + 0, GL_RGB, GL_UNSIGNED_BYTE, [texture] stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST @@ -151,12 +181,18 @@ 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 ;масштаб - mov ebx,[image_data_toolbar] add ebx,IMAGE_TOOLBAR_ICON_SIZE mcall SF_PUT_IMAGE,,(21 shl 16)+21,(5 shl 16)+5 ;земля с меридиан. add ebx,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 @@ -172,31 +208,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,176 ;Left jne @f @@ -270,6 +288,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: @@ -291,6 +319,36 @@ but_dr_1: stdcall [kosglSwapBuffers] ret +align 4 +but_zoom_p: + 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] + ret + +align 4 +but_zoom_m: + 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] + ret + align 4 caption db 'Test textures, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0 align 4 @@ -304,6 +362,7 @@ stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим б stdcall [glPushMatrix] stdcall [glTranslatef], 0.0,0.0,0.5 stdcall [glScalef], [scale], [scale], [scale] + stdcall [glScalef], 1.0, 1.0, 0.1 ;прижимаем сферу, что-бы сразу не вылазила при увеличении stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_x],1.0,0.0,0.0 @@ -333,12 +392,14 @@ dr_figure dd 0 qObj dd 0 TexObj dd 0 ;массив указателей на текстуры (в данном случае 1 шт.) texture dd 0 ;указатель на память с текстурой +text_w dd 0 +text_h dd 0 -scale dd 0.5 +scale dd 0.95 delt_sc dd 0.05 angle_z dd 0.0 angle_x dd 90.0 -angle_y dd 225.0 +angle_y dd 0.0 delt_size dd 3.0 ;-------------------------------------------------- @@ -520,7 +581,7 @@ l_libs_start: 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,\ 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,\ + lib_2 l_libs lib_name_2, cur_dir_path, library_path, system_dir_2,\ err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i l_libs_end: diff --git a/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm b/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm new file mode 100644 index 0000000000..50272b319d --- /dev/null +++ b/programs/develop/libraries/TinyGL/asm_fork/examples/textures2.asm @@ -0,0 +1,554 @@ +use32 + org 0x0 + db 'MENUET01' + dd 1,start,i_end + dd mem,stacktop + dd 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 '../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 +start: +load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузились библиотеки + mov ebp,lib_0 + .test_lib_open: + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall SF_TERMINATE_PROCESS + @@: + add ebp,ll_struc_size + cmp ebp,l_libs_end + jl .test_lib_open + + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + mcall SF_SET_EVENTS_MASK,0x27 + + stdcall [kosglMakeCurrent], 5,30,[buf_ogl.w],[buf_ogl.h],ctx1 + stdcall [glEnable], GL_DEPTH_TEST + stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов + stdcall [gluNewQuadric] + mov [qObj],eax + stdcall [gluQuadricDrawStyle], eax,GLU_FILL + stdcall [gluQuadricTexture], eax,GL_TRUE + + stdcall [glClearColor], 0.0,0.0,0.0,0.0 + stdcall [glShadeModel], GL_SMOOTH + + mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext + mov eax,[eax] ;eax -> ZBuffer + mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf + mov dword[buf_ogl],eax + + load_image_file 'font8x9.bmp', image_data_toolbar + 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 бит + stdcall [buf2d_convert_text_matrix], buf_1 + + load_image_file 'toolb_1.png', image_data_toolbar + load_image_file 'text_3.png', texture, text_w,text_h ;открытие файла текстуры + + ;* Setup texturing * + stdcall [glTexEnvi], GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL + + ;* generate texture object IDs * + stdcall [glGenTextures], 1, TexObj + stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj] + stdcall [glTexImage2D], GL_TEXTURE_2D, 0, 3, [text_w], [text_h],\ + 0, GL_RGB, GL_UNSIGNED_BYTE, [texture] + + stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST + stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST + stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT + stdcall [glTexParameteri], GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT + stdcall [glBindTexture], GL_TEXTURE_2D, [TexObj] + stdcall [glEnable], GL_TEXTURE_2D + + call draw_3d + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + mcall SF_CREATE_WINDOW,(50 shl 16)+420,(30 shl 16)+410,0x33ffffff,,caption + + 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 ;масштаб - + + mov ebx,[image_data_toolbar] + add ebx,3*IMAGE_TOOLBAR_ICON_SIZE + mcall SF_PUT_IMAGE,,(21 shl 16)+21,(5 shl 16)+5 ;масштаб + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mcall ,,,(35 shl 16)+5 ;масштаб - + + stdcall [kosglSwapBuffers] + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + cmp ah,61 ;+ + jne @f + call but_zoom_p + jmp still + @@: + cmp ah,45 ;- + jne @f + call but_zoom_m + jmp still + @@: + cmp ah,176 ;Left + jne @f + finit + fld dword[angle_y] + fadd dword[delt_size] + fst dword[angle_y] + mov word[NumberSymbolsAD],2 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_angle_y.v],0 + stdcall str_cat, txt_angle_y.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,179 ;Right + jne @f + finit + fld dword[angle_y] + fsub dword[delt_size] + fst dword[angle_y] + mov word[NumberSymbolsAD],2 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_angle_y.v],0 + stdcall str_cat, txt_angle_y.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,178 ;Up + jne @f + finit + fld dword[angle_x] + fadd dword[delt_size] + fst dword[angle_x] + mov word[NumberSymbolsAD],2 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_angle_x.v],0 + stdcall str_cat, txt_angle_x.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + @@: + cmp ah,177 ;Down + jne @f + finit + fld dword[angle_x] + fsub dword[delt_size] + fst dword[angle_x] + mov word[NumberSymbolsAD],2 + fstp qword[Data_Double] + call DoubleFloat_to_String + mov byte[txt_angle_x.v],0 + stdcall str_cat, txt_angle_x.v,Data_String + call draw_3d + stdcall [kosglSwapBuffers] + @@: + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,3 + jne @f + call but_zoom_p + jmp still + @@: + cmp ah,4 + jne @f + call but_zoom_m + jmp still + @@: + cmp ah,1 + jne still +.exit: + stdcall [gluDeleteQuadric], [qObj] + stdcall mem.Free,[image_data_toolbar] + mcall SF_TERMINATE_PROCESS + +align 4 +but_zoom_p: + 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] + ret + +align 4 +but_zoom_m: + 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] + ret + +align 4 +caption db 'Test textures, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0 +align 4 +ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext +;sizeof.TinyGLContext = 28 + +align 4 +draw_3d: +stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины + +stdcall [glPushMatrix] + stdcall [glScalef], [scale], [scale], [scale] + stdcall [glScalef], 1.0, 1.0, 0.1 ;прижимаем сферу, что-бы сразу не вылазила при увеличении + stdcall [glRotatef], [angle_y],0.0,1.0,0.0 + stdcall [glRotatef], [angle_x],1.0,0.0,0.0 + + ; рисование панорамы + stdcall [gluSphere], [qObj], 1.0, 64,64 +stdcall [glPopMatrix] + + stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_scale,5,5,0xffff00 + stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_y,5,15,0xffff00 + stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_x,5,25,0xffff00 + ret + +qObj dd 0 +TexObj dd 0 ;массив указателей на текстуры (в данном случае 1 шт.) +texture dd 0 ;указатель на память с текстурой +text_w dd 0 +text_h dd 0 + +scale dd 1.5 +delt_sc dd 0.05 +angle_z dd 0.0 +angle_x dd 90.0 +angle_y dd 0.0 +delt_size dd 3.0 + +;-------------------------------------------------- +align 4 +import_lib_tinygl: + +macro E_LIB n +{ + n dd sz_#n +} +include '../export.inc' + dd 0,0 +macro E_LIB n +{ + sz_#n db `n,0 +} +include '../export.inc' + +align 4 +import_buf2d: + dd sz_init0 + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + dd 0,0 + sz_init0 db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + 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 + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +;-------------------------------------------------- +system_dir_0 db '/sys/lib/' +lib_name_0 db 'tinygl.obj',0 +system_dir_1 db '/sys/lib/' +lib_name_1 db 'buf2d.obj',0 +system_dir_2 db '/sys/lib/' +lib_name_2 db 'libimg.obj',0 +err_msg_found_lib_0 db 'Sorry I cannot load library ',39,'tinygl.obj',39,0 +err_msg_found_lib_1 db 'Sorry I cannot load library ',39,'buf2d.obj',39,0 +err_msg_found_lib_2 db 'Sorry I cannot load library ',39,'libimg.obj',39,0 +head_f_i: +head_f_l db 'System error',0 +err_msg_import_0 db 'Error on load import library ',39,'tinygl.obj',39,0 +err_msg_import_1 db 'Error on load import library ',39,'buf2d.obj',39,0 +err_msg_import_2 db 'Error on load import library ',39,'libimg.obj',39,0 +;-------------------------------------------------- + +txt_scale: +db 'Scale: ' +.v: +db 0 +rb 10 + +txt_angle_z: +db 'Rotate z: ' +.v: +db 0 +rb 10 + +txt_angle_x: +db 'Rotate x: ' +.v: +db 0 +rb 10 + +txt_angle_y: +db 'Rotate y: ' +.v: +db 0 +rb 10 + +align 4 +buf_ogl: + dd 0 ;указатель на буфер изображения + dw 10,10 ;+4 left,top +.w: dd 400 +.h: dd 350 + dd 0,24 ;+16 color,bit in pixel + +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 + +align 4 +l_libs_start: + lib_0 l_libs lib_name_0, cur_dir_path, library_path, 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,\ + 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,\ + err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i +l_libs_end: + +align 4 +i_end: + run_file_70 FileInfoBlock + sc system_colors +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/toolb_1.png b/programs/develop/libraries/TinyGL/asm_fork/examples/toolb_1.png index 585acb14596725e7356aa1e38fed3557dca75990..d9582395d1578036236f17fd4508632aa9318c96 100644 GIT binary patch delta 1002 zcmVPx#1ZP1_K>z@;j|==^ z1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9a%BK;VQFr3E^cLXAT%y8 zE;(#7eog=Y17t}=K~z{r?Uv6=6j2<&*PC892o(v!4jy!iJb(1VIqXF$3#wC*=LnDc z7X)<>%v%@>A?!gR5)b0Ri$>JaA|eSQbO@4A58d_>5ybX+^ZhzK=hx26Ziiw&Ja*o^ z_x-%@dvD&1<{q_%@f%qw7K`eC%0yEC^D%pSd)nlZ$VdC}><;DU<07{V;f>PV7a6lr zx!af;u3tT~vwyP_=eyH1NDvi#BbTn=H->UcORv2l{JuonQ>8`Cso`HY^Krh&-c*Su z4(JlI;pCB<_`#_PV%l` zjPYAR=bsJDPfZt;l6L!FEu_UpJFKn{|6BPf=agRwweh+n7(#q=&K>jdh%7@nPNBp{ z4)33_j#9WK%m;-{ibK9|fGzZG=;+0gvdbU`U;x9=X)=14Gv_~yTb_+q_6 z5q{vz+l3?C@jJfD-|*dt_!8*@eMyku5I+@d^0{Qj_^qJx&xYowrV9%2#X_4bn)o>L z^Yev5p}V`gr>BQXxm@1e-PP`RA9-YC#BrRBjeiZ!)#2gc>gwv)*x2~^`110y#6Vtad=uy9|dO=eFnI2S2W2WBxhH^)LE{r>*`#l=O52A@AYJ>A#W zx3#qu>9b+xT{<@HLgU)nT31&WZ$YHbZnI%AelC}*R;!Wzz`%gy7d#V=j*b=<7J7So zBY*Sn@9&pNrPc( zw)%bj!jr*sQcc+U*G*6}yebnwd74MfUqX znfi-YFW29{VV!IhyUj24@bgddp!~M>PGbWj@cXG`I5B@5%;Ykh@BvMV+%`phE}1cY zE9m^Qq4}xlf&%a^d1#YG6CdaQ_nNZ$E=Dt~ delta 726 zcmV;{0xA9T2jK;f7k@tp0ssI2fI<|J00006bW%=J00000009}HHwOR!0+vZcK~#90 z?UX%e+dve@U-W^5F@Xqc2s8mhWKZ#Ix|x87f(xBWptKNL44qus)syLx#h!v8LrChO zltLkdY-z?2G9?WKS&0K4L|X^ry5f)!G9Avn$|uS4MHUm@ztn zJj4IEo?pw_w(WMHdG3#J94tOQ2dCcvV7A@Vw7PBE#L7`Hl`6+^g8m&EzW|`u)VTr0@{DhCC4|KlNo}|iLwl%G;C<)Uvzr6jdX?5(NC<&hD zN&NYvE-f*>p}rvSh-&A|AUWi?i-^K04Jc9Vg>sS1Ly`0hDge|=O5 zB*8H4x52KY=SGvX=!d@`Aw zioePE88W{@HBkRZBtq5*AQ>&dH&)Cy%74#P z2LO`mlCku34$?X5BOPD#V8c!S;{D&v&&d@yKTn6qJwNIDUnoBgp-5u?(MC5|9AX<$9wwkM5Q`x3?3nLw7xf0eDW|x)J@ON-$`H({R(7czW@LL07*qo IM6N<$g4`ToeE