Subversion Repositories Kolibri OS

Rev

Rev 6100 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         org 0x0
  3.         db 'MENUET01'
  4.         dd 1,start,i_end
  5.         dd mem,stacktop
  6.         dd 0,cur_dir_path
  7.  
  8. include '../../../../../proc32.inc'
  9. include '../../../../../macros.inc'
  10. include '../../../../../develop/libraries/box_lib/load_lib.mac'
  11. include '../../../../../dll.inc'
  12. include '../opengl_const.inc'
  13. include '../../../../../develop/info3ds/info_fun_float.inc'
  14.  
  15. @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
  16.  
  17. struct FileInfoBlock
  18.         Function dd ?
  19.         Position dd ?
  20.         Flags    dd ?
  21.         Count    dd ?
  22.         Buffer   dd ?
  23.                 db ?
  24.         FileName dd ?
  25. ends
  26.  
  27. image_data dd 0 ;указатель на временную память, нужен для преобразования изображения
  28. image_data_toolbar dd 0
  29. IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением
  30.  
  31. macro load_image_file path,buf,size { ;макрос для загрузки изображений
  32.         ;path - может быть переменной или строковым параметром
  33.         if path eqtype '' ;проверяем задан ли строкой параметр path
  34.                 jmp @f
  35.                         local .path_str
  36.                         .path_str db path ;формируем локальную переменную
  37.                         db 0
  38.                 @@:
  39.                 ;32 - стандартный адрес по которому должен быть буфер с системным путем
  40.                 copy_path .path_str,[32],file_name,0
  41.         else
  42.                 copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
  43.         end if
  44.         stdcall mem.Alloc, dword size ;выделяем память для изображения
  45.         mov [buf],eax
  46.         mov [run_file_70.Function], 0
  47.         mov [run_file_70.Position], 0
  48.         mov [run_file_70.Flags], 0
  49.         mov [run_file_70.Count], dword size
  50.         mov [run_file_70.Buffer], eax
  51.         mov byte[run_file_70+20], 0
  52.         mov [run_file_70.FileName], file_name
  53.         mcall 70,run_file_70 ;загружаем файл изображения
  54.         cmp ebx,0xffffffff
  55.         je @f
  56.                 ;определяем вид изображения и переводим его во временный буфер image_data
  57.                 stdcall dword[img_decode], dword[buf],ebx,0
  58.                 mov dword[image_data],eax
  59.                 ;преобразуем изображение к формату rgb
  60.                 stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
  61.                 ;удаляем временный буфер image_data
  62.                 stdcall dword[img_destroy], dword[image_data]
  63.         @@:
  64. }
  65.  
  66. offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc'
  67.  
  68. align 4
  69. start:
  70. load_libraries l_libs_start,l_libs_end
  71.         ;проверка на сколько удачно загузились библиотеки
  72.         mov     ebp,lib_0
  73.         .test_lib_open:
  74.         cmp     dword [ebp+ll_struc_size-4],0
  75.         jz      @f
  76.                 mcall -1 ;exit not correct
  77.         @@:
  78.         add ebp,ll_struc_size
  79.         cmp ebp,l_libs_end
  80.         jl .test_lib_open
  81.  
  82.         mcall 40,0x27
  83.  
  84.         stdcall [kosglMakeCurrent], 10,10,[buf_ogl.w],[buf_ogl.h],ctx1
  85.         stdcall [glEnable], GL_DEPTH_TEST
  86.         stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
  87.         stdcall [gluNewQuadric]
  88.         mov [qObj],eax
  89.  
  90.         stdcall [glClearColor], 0.25,0.25,0.25,0.0
  91.         stdcall [glShadeModel], GL_SMOOTH
  92.  
  93.         mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
  94.         mov eax,[eax] ;eax -> ZBuffer
  95.         mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
  96.         mov dword[buf_ogl],eax
  97.  
  98.         load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE
  99.         stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
  100.         stdcall mem.Free,[image_data_toolbar] ;освобождаем память
  101.         stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
  102.         stdcall [buf2d_convert_text_matrix], buf_1
  103.         call draw_3d
  104.  
  105. align 4
  106. red_win:
  107.         call draw_window
  108.  
  109. align 4
  110. still:
  111.         mcall 10
  112.         cmp al,1
  113.         jz red_win
  114.         cmp al,2
  115.         jz key
  116.         cmp al,3
  117.         jz button
  118.         jmp still
  119.  
  120. align 4
  121. draw_window:
  122.         pushad
  123.         mcall 12,1
  124.  
  125.         mov edx,0x33ffffff ;0x73ffffff
  126.         mcall 0,(50 shl 16)+430,(30 shl 16)+400,,,caption
  127.         stdcall [kosglSwapBuffers]
  128.  
  129.         mcall 12,2
  130.         popad
  131.         ret
  132.  
  133. align 4
  134. key:
  135.         mcall 2
  136.  
  137.         cmp ah,27 ;Esc
  138.         je button.exit
  139.  
  140.         cmp ah,61 ;+
  141.         jne @f
  142.                 finit
  143.                 fld dword[scale]
  144.                 fadd dword[delt_sc]
  145.                 fst dword[scale]
  146.                 mov word[NumberSymbolsAD],3
  147.                 fstp qword[Data_Double]
  148.                 call DoubleFloat_to_String
  149.                 mov byte[txt_scale.v],0
  150.                 stdcall str_cat, txt_scale.v,Data_String
  151.                 call draw_3d
  152.                 stdcall [kosglSwapBuffers]
  153.         @@:
  154.         cmp ah,45 ;-
  155.         jne @f
  156.                 finit
  157.                 fld dword[scale]
  158.                 fsub dword[delt_sc]
  159.                 fst dword[scale]
  160.                 mov word[NumberSymbolsAD],3
  161.                 fstp qword[Data_Double]
  162.                 call DoubleFloat_to_String
  163.                 mov byte[txt_scale.v],0
  164.                 stdcall str_cat, txt_scale.v,Data_String
  165.                 call draw_3d
  166.                 stdcall [kosglSwapBuffers]
  167.         @@:
  168.         cmp ah,178 ;Up
  169.         jne @f
  170.                 finit
  171.                 fld dword[angle_y]
  172.                 fadd dword[delt_size]
  173.                 fst dword[angle_y]
  174.                 mov word[NumberSymbolsAD],2
  175.                 fstp qword[Data_Double]
  176.                 call DoubleFloat_to_String
  177.                 mov byte[txt_angle_y.v],0
  178.                 stdcall str_cat, txt_angle_y.v,Data_String
  179.                 call draw_3d
  180.                 stdcall [kosglSwapBuffers]
  181.         @@:
  182.         cmp ah,177 ;Down
  183.         jne @f
  184.                 finit
  185.                 fld dword[angle_y]
  186.                 fsub dword[delt_size]
  187.                 fst dword[angle_y]
  188.                 mov word[NumberSymbolsAD],2
  189.                 fstp qword[Data_Double]
  190.                 call DoubleFloat_to_String
  191.                 mov byte[txt_angle_y.v],0
  192.                 stdcall str_cat, txt_angle_y.v,Data_String
  193.                 call draw_3d
  194.                 stdcall [kosglSwapBuffers]
  195.         @@:
  196.         cmp ah,176 ;Left
  197.         jne @f
  198.                 finit
  199.                 fld dword[angle_z]
  200.                 fadd dword[delt_size]
  201.                 fst dword[angle_z]
  202.                 mov word[NumberSymbolsAD],2
  203.                 fstp qword[Data_Double]
  204.                 call DoubleFloat_to_String
  205.                 mov byte[txt_angle_z.v],0
  206.                 stdcall str_cat, txt_angle_z.v,Data_String
  207.                 call draw_3d
  208.                 stdcall [kosglSwapBuffers]
  209.         @@:
  210.         cmp ah,179 ;Right
  211.         jne @f
  212.                 finit
  213.                 fld dword[angle_z]
  214.                 fsub dword[delt_size]
  215.                 fst dword[angle_z]
  216.                 mov word[NumberSymbolsAD],2
  217.                 fstp qword[Data_Double]
  218.                 call DoubleFloat_to_String
  219.                 mov byte[txt_angle_z.v],0
  220.                 stdcall str_cat, txt_angle_z.v,Data_String
  221.                 call draw_3d
  222.                 stdcall [kosglSwapBuffers]
  223.         @@:
  224.  
  225.         jmp still
  226.  
  227. align 4
  228. button:
  229.         mcall 17
  230.         cmp ah,1
  231.         jne still
  232. .exit:
  233.         stdcall [gluDeleteQuadric], [qObj]
  234.         ;stdcall mem.Free,[image_data_toolbar]
  235.         mcall -1
  236.  
  237.  
  238. align 4
  239. caption db 'Test gluSphere, [Esc] - exit, [<-],[->],[Up],[Down] - rotate',0
  240. align 4
  241. ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
  242. ;sizeof.TinyGLContext = 28
  243.  
  244. align 4
  245. draw_3d:
  246. stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
  247.  
  248. stdcall [glPushMatrix]
  249.         call SetLight
  250.  
  251.         stdcall [glTranslatef], 0.0,0.0,0.5
  252.         stdcall [glScalef], [scale], [scale], [scale]
  253.  
  254.         stdcall [glColor3f], 1.0, 1.0, 0.0
  255.         stdcall [glRotatef], [angle_z],0.0,0.0,1.0
  256.         stdcall [glRotatef], [angle_y],0.0,1.0,0.0
  257.         stdcall [gluSphere], [qObj], 1.0, 32,32
  258.  
  259.         stdcall [glColor3f], 1.0, 0.0, 0.0
  260.         stdcall [glTranslatef], -1.6,0.0,0.0
  261.         stdcall [gluSphere], [qObj], 0.55, 16,16
  262.  
  263.         stdcall [glColor3f], 0.0, 0.0, 1.0
  264.         stdcall [glTranslatef], 3.2,0.0,0.0
  265.         stdcall [gluSphere], [qObj], 0.55, 16,16
  266. stdcall [glPopMatrix]
  267.  
  268.         stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_scale,5,5,0xffff00
  269.         stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_z,5,15,0xffff00
  270.         stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_angle_y,5,25,0xffff00
  271.         ret
  272.  
  273. align 4
  274. SetLight:
  275.         stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
  276.         stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
  277.  
  278.         stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
  279.         stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
  280.  
  281.         stdcall [glEnable], GL_COLOR_MATERIAL
  282.         stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
  283.         stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
  284.         stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
  285.         stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
  286.  
  287.         stdcall [glEnable],GL_LIGHTING
  288.         stdcall [glEnable],GL_LIGHT0
  289. ret
  290.  
  291. qObj dd 0
  292.  
  293. scale dd 0.4
  294. delt_sc dd 0.05
  295. angle_z dd 0.0
  296. angle_y dd 0.0
  297. delt_size dd 3.0
  298.  
  299. light_position dd 3.0, 2.0, -10.0, 1.0 ; Расположение источника [0][1][2]
  300.         ;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
  301. light_dir dd 0.0,0.0,0.0 ;направление лампы
  302. mat_specular dd 0.1, 0.1, 0.1, 1.0 ; Цвет блика
  303. mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
  304. white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
  305. lmodel_ambient dd 0.2, 0.2, 0.2, 1.0 ; Параметры фонового освещения
  306.  
  307. ;--------------------------------------------------
  308. align 4
  309. import_lib_tinygl:
  310.  
  311. macro E_LIB n
  312. {
  313.         n dd sz_#n
  314. }
  315. include '../export.inc'
  316.         dd 0,0
  317. macro E_LIB n
  318. {
  319.         sz_#n db `n,0
  320. }
  321. include '../export.inc'
  322.  
  323. align 4
  324. import_buf2d:
  325.         dd sz_init0
  326.         buf2d_create dd sz_buf2d_create
  327.         buf2d_create_f_img dd sz_buf2d_create_f_img
  328.         buf2d_clear dd sz_buf2d_clear
  329.         buf2d_draw dd sz_buf2d_draw
  330.         buf2d_delete dd sz_buf2d_delete
  331.         buf2d_resize dd sz_buf2d_resize
  332.         buf2d_line dd sz_buf2d_line
  333.         buf2d_rect_by_size dd sz_buf2d_rect_by_size
  334.         buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
  335.         buf2d_circle dd sz_buf2d_circle
  336.         buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
  337.         buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
  338.         buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
  339.         buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
  340.         buf2d_bit_blt dd sz_buf2d_bit_blt
  341.         buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
  342.         buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
  343.         buf2d_curve_bezier dd sz_buf2d_curve_bezier
  344.         buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
  345.         buf2d_draw_text dd sz_buf2d_draw_text
  346.         buf2d_crop_color dd sz_buf2d_crop_color
  347.         buf2d_offset_h dd sz_buf2d_offset_h
  348.         buf2d_flood_fill dd sz_buf2d_flood_fill
  349.         buf2d_set_pixel dd sz_buf2d_set_pixel
  350.         dd 0,0
  351.         sz_init0 db 'lib_init',0
  352.         sz_buf2d_create db 'buf2d_create',0
  353.         sz_buf2d_create_f_img db 'buf2d_create_f_img',0
  354.         sz_buf2d_clear db 'buf2d_clear',0
  355.         sz_buf2d_draw db 'buf2d_draw',0
  356.         sz_buf2d_delete db 'buf2d_delete',0
  357.         sz_buf2d_resize db 'buf2d_resize',0
  358.         sz_buf2d_line db 'buf2d_line',0
  359.         sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
  360.         sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
  361.         sz_buf2d_circle db 'buf2d_circle',0
  362.         sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
  363.         sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
  364.         sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
  365.         sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
  366.         sz_buf2d_bit_blt db 'buf2d_bit_blt',0
  367.         sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
  368.         sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
  369.         sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
  370.         sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
  371.         sz_buf2d_draw_text db 'buf2d_draw_text',0
  372.         sz_buf2d_crop_color db 'buf2d_crop_color',0
  373.         sz_buf2d_offset_h db 'buf2d_offset_h',0
  374.         sz_buf2d_flood_fill db 'buf2d_flood_fill',0
  375.         sz_buf2d_set_pixel db 'buf2d_set_pixel',0
  376.  
  377. align 4
  378. import_libimg:
  379.         dd alib_init1
  380.         img_is_img  dd aimg_is_img
  381.         img_info    dd aimg_info
  382.         img_from_file dd aimg_from_file
  383.         img_to_file dd aimg_to_file
  384.         img_from_rgb dd aimg_from_rgb
  385.         img_to_rgb  dd aimg_to_rgb
  386.         img_to_rgb2 dd aimg_to_rgb2
  387.         img_decode  dd aimg_decode
  388.         img_encode  dd aimg_encode
  389.         img_create  dd aimg_create
  390.         img_destroy dd aimg_destroy
  391.         img_destroy_layer dd aimg_destroy_layer
  392.         img_count   dd aimg_count
  393.         img_lock_bits dd aimg_lock_bits
  394.         img_unlock_bits dd aimg_unlock_bits
  395.         img_flip    dd aimg_flip
  396.         img_flip_layer dd aimg_flip_layer
  397.         img_rotate  dd aimg_rotate
  398.         img_rotate_layer dd aimg_rotate_layer
  399.         img_draw    dd aimg_draw
  400.  
  401.         dd 0,0
  402.         alib_init1   db 'lib_init',0
  403.         aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
  404.         aimg_info    db 'img_info',0
  405.         aimg_from_file db 'img_from_file',0
  406.         aimg_to_file db 'img_to_file',0
  407.         aimg_from_rgb db 'img_from_rgb',0
  408.         aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
  409.         aimg_to_rgb2 db 'img_to_rgb2',0
  410.         aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
  411.         aimg_encode  db 'img_encode',0
  412.         aimg_create  db 'img_create',0
  413.         aimg_destroy db 'img_destroy',0
  414.         aimg_destroy_layer db 'img_destroy_layer',0
  415.         aimg_count   db 'img_count',0
  416.         aimg_lock_bits db 'img_lock_bits',0
  417.         aimg_unlock_bits db 'img_unlock_bits',0
  418.         aimg_flip    db 'img_flip',0
  419.         aimg_flip_layer db 'img_flip_layer',0
  420.         aimg_rotate  db 'img_rotate',0
  421.         aimg_rotate_layer db 'img_rotate_layer',0
  422.         aimg_draw    db 'img_draw',0
  423.  
  424. ;--------------------------------------------------
  425. system_dir_0 db '/sys/lib/'
  426. lib_name_0 db 'tinygl.obj',0
  427. system_dir_1 db '/sys/lib/'
  428. lib_name_1 db 'buf2d.obj',0
  429. system_dir_2 db '/sys/lib/'
  430. lib_name_2 db 'libimg.obj',0
  431. err_msg_found_lib_0 db 'Sorry I cannot load library ',39,'tinygl.obj',39,0
  432. err_msg_found_lib_1 db 'Sorry I cannot load library ',39,'buf2d.obj',39,0
  433. err_msg_found_lib_2 db 'Sorry I cannot load library ',39,'libimg.obj',39,0
  434. head_f_i:
  435. head_f_l db 'System error',0
  436. err_msg_import_0 db 'Error on load import library ',39,'tinygl.obj',39,0
  437. err_msg_import_1 db 'Error on load import library ',39,'buf2d.obj',39,0
  438. err_msg_import_2 db 'Error on load import library ',39,'libimg.obj',39,0
  439. ;--------------------------------------------------
  440.  
  441. txt_scale:
  442. db 'Scale: '
  443. .v:
  444. db 0
  445. rb 10
  446.  
  447. txt_angle_z:
  448. db 'Rotate z: '
  449. .v:
  450. db 0
  451. rb 10
  452.  
  453. txt_angle_y:
  454. db 'Rotate y: '
  455. .v:
  456. db 0
  457. rb 10
  458.  
  459. align 4
  460. buf_ogl:
  461.         dd 0 ;указатель на буфер изображения
  462.         dw 10,10 ;+4 left,top
  463. .w: dd 400
  464. .h: dd 350
  465.         dd 0,24 ;+16 color,bit in pixel
  466.  
  467. align 4
  468. buf_1:
  469.         dd 0 ;указатель на буфер изображения
  470.         dw 25,25 ;+4 left,top
  471.         dd 128,144 ;+8 w,h
  472.         dd 0,24 ;+16 color,bit in pixel
  473.  
  474. align 4
  475. l_libs_start:
  476.         lib_0 l_libs lib_name_0, cur_dir_path, library_path,  system_dir_0,\
  477.                 err_msg_found_lib_0, head_f_l, import_lib_tinygl,err_msg_import_0,head_f_i
  478.         lib_1 l_libs lib_name_1, cur_dir_path, library_path,  system_dir_1,\
  479.                 err_msg_found_lib_1, head_f_l, import_buf2d,  err_msg_import_1,head_f_i
  480.         lib_2 l_libs lib_name_2, cur_dir_path, file_name, system_dir_2,\
  481.                 err_msg_found_lib_2, head_f_l, import_libimg, err_msg_import_2, head_f_i
  482. l_libs_end:
  483.  
  484. align 4
  485. i_end:
  486.         run_file_70 FileInfoBlock
  487. align 16
  488.         rb 4096
  489. stacktop:
  490.         cur_dir_path rb 4096
  491.         library_path rb 4096
  492.         file_name rb 4096
  493. mem:
  494.