Subversion Repositories Kolibri OS

Rev

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

  1. use32
  2.         org 0x0
  3.         db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
  4.         dd 1, start, i_end, mem, stacktop, 0, sys_path
  5.  
  6. include '../../macros.inc'
  7. include '../../proc32.inc'
  8. include '../../develop/libraries/box_lib/load_lib.mac'
  9. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  10. include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
  11. include '../../dll.inc'
  12. include 'lang.inc'
  13. include 'info_fun_float.inc'
  14. include 'info_menu.inc'
  15.  
  16. offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc'
  17.  
  18. debug equ 0
  19.  
  20. @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
  21.  
  22. struct FileInfoBlock
  23.         Function dd ?
  24.         Position dd ?
  25.         Flags    dd ?
  26.         Count    dd ?
  27.         Buffer   dd ?
  28.                 db ?
  29.         FileName dd ?
  30. ends
  31.  
  32. align 4
  33. fl255 dd 255.0
  34. image_data dd 0 ;указатель на временную память, нужен для преобразования изображения
  35. open_file_data dd 0 ;указатель на память для открытия файлов 3ds
  36. open_file_size dd 0 ;размер открытого файла
  37. open_b rb 560
  38.  
  39. ;
  40. main_wnd_height equ 460 ;высота главного окна программы
  41. fn_toolbar db 'toolbar.png',0
  42. IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
  43. IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7
  44. image_data_toolbar dd 0
  45. ;
  46. TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
  47. icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок
  48. icon_toolbar dd 0 ;указатеель на память для хранения иконок объектов
  49. TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*10+54 ;размер bmp файла с иконками объектов
  50. ;
  51. IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением
  52.  
  53. macro load_image_file path,buf,size { ;макрос для загрузки изображений
  54.         ;path - может быть переменной или строковым параметром
  55.         if path eqtype '' ;проверяем задан ли строкой параметр path
  56.                 jmp @f
  57.                         local .path_str
  58.                         .path_str db path ;формируем локальную переменную
  59.                         db 0
  60.                 @@:
  61.                 ;32 - стандартный адрес по которому должен быть буфер с системным путем
  62.                 copy_path .path_str,[32],file_name,0
  63.         else
  64.                 copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
  65.         end if
  66.  
  67.         stdcall mem.Alloc, dword size ;выделяем память для изображения
  68.         mov [buf],eax
  69.  
  70.         mov [run_file_70.Function], 0
  71.         mov [run_file_70.Position], 0
  72.         mov [run_file_70.Flags], 0
  73.         mov [run_file_70.Count], dword size
  74.         mov [run_file_70.Buffer], eax
  75.         mov byte[run_file_70+20], 0
  76.         mov [run_file_70.FileName], file_name
  77.         mcall 70,run_file_70 ;загружаем файл изображения
  78.         cmp ebx,0xffffffff
  79.         je @f
  80.                 ;определяем вид изображения и переводим его во временный буфер image_data
  81.                 stdcall dword[img_decode], dword[buf],ebx,0
  82.                 mov dword[image_data],eax
  83.                 ;преобразуем изображение к формату rgb
  84.                 stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
  85.                 ;удаляем временный буфер image_data
  86.                 stdcall dword[img_destroy], dword[image_data]
  87.         @@:
  88. }
  89.  
  90. ;--------------------------------------
  91. include 'data.inc'
  92.  
  93. level_stack dd 0
  94. offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
  95.  
  96. ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
  97. ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
  98. ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
  99. ID_ICON_POINT equ 8
  100. ID_ICON_POINT_SEL equ 9
  101.  
  102. FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
  103.  
  104. align 4
  105. file_3ds: ;переменные используемые при открытии файла
  106. .offs: dd 0 ;+0 указатель на начало блока
  107. .size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
  108. rb 8*MAX_FILE_LEVEL
  109.  
  110. size_one_list equ 42
  111. list_offs_chunk_del equ 8 ;может ли блок удалятся
  112. list_offs_chunk_lev equ 9 ;уровень блока (прописан в данные узла)
  113. list_offs_p_data equ 10 ;указатель на подпись блока
  114. list_offs_text equ 14 ;сдвиг начала текста в листе
  115. buffer rb size_one_list ;буфер для добавления структур в список tree1
  116.  
  117. txt_3ds_symb db 0,0
  118. ;--------------------------------------
  119.  
  120. include 'info_wnd_coords.inc'
  121.  
  122. align 4
  123. start:
  124.         load_libraries l_libs_start,l_libs_end
  125.         ;проверка на сколько удачно загузились библиотеки
  126.         mov     ebp,lib_0
  127.         .test_lib_open:
  128.         cmp     dword [ebp+ll_struc_size-4],0
  129.         jz      @f
  130.                 mcall -1 ;exit not correct
  131.         @@:
  132.         add ebp,ll_struc_size
  133.         cmp ebp,l_libs_end
  134.         jl .test_lib_open
  135.         mcall 48,3,sc,sizeof.sys_colors_new
  136.         mcall 40,0x27
  137.         stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
  138.  
  139.         ;kmenu initialisation
  140.         stdcall [kmenu_init],sc
  141.         stdcall [ksubmenu_new]
  142.         mov [main_menu], eax
  143.  
  144.         stdcall [ksubmenu_new]
  145.         mov [main_menu_view], eax
  146.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Vertexes, 5
  147.         stdcall [ksubmenu_add], [main_menu_view], eax
  148.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces, 6
  149.         stdcall [ksubmenu_add], [main_menu_view], eax
  150.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Fill, 7
  151.         stdcall [ksubmenu_add], [main_menu_view], eax
  152.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Light, 8
  153.         stdcall [ksubmenu_add], [main_menu_view], eax
  154.         stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
  155.         stdcall [ksubmenu_add], [main_menu_view], eax
  156.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 9
  157.         stdcall [ksubmenu_add], [main_menu_view], eax
  158.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_View, [main_menu_view]
  159.         stdcall [ksubmenu_add], [main_menu], eax
  160.  
  161.         stdcall [ksubmenu_new]
  162.         mov [main_menu_vertexes], eax
  163.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Vertexes_Select, 10
  164.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  165.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Vertexes_Deselect, 11
  166.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  167.         stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
  168.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  169.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_x, 12
  170.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  171.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_y, 13
  172.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  173.         stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_z, 14
  174.         stdcall [ksubmenu_add], [main_menu_vertexes], eax
  175.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_Vertexes, [main_menu_vertexes]
  176.         stdcall [ksubmenu_add], [main_menu], eax
  177.  
  178.         mov dword[w_scr_t1.type],1
  179.         stdcall dword[tl_data_init], tree1
  180.         ;системные иконки 16*16 для tree_list
  181.         load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
  182.         ;если изображение не открылось, то в icon_tl_sys будут
  183.         ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
  184.         mov eax,dword[icon_tl_sys]
  185.         mov dword[tree1.data_img_sys],eax
  186.  
  187.         load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
  188.         mov eax,dword[icon_toolbar]
  189.         mov dword[tree1.data_img],eax
  190.  
  191.         stdcall [buf2d_create], buf_0 ;создание буфера
  192.  
  193.         load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE
  194.         stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
  195.         stdcall mem.Free,[image_data_toolbar] ;освобождаем память
  196.         stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
  197.         stdcall [buf2d_convert_text_matrix], buf_1
  198.  
  199.         load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
  200.  
  201.         ;работа с файлом настроек
  202.         copy_path ini_name,sys_path,file_name,0
  203.         mov dword[def_dr_mode],0
  204.         stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dv,1
  205.         or eax,eax
  206.         jz @f
  207.                 or dword[def_dr_mode], 1 shl bit_vertexes
  208.         @@:
  209.         stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_df,1
  210.         or eax,eax
  211.         jz @f
  212.                 or dword[def_dr_mode], 1 shl bit_faces
  213.         @@:
  214.         stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dff,1
  215.         or eax,eax
  216.         jz @f
  217.                 or dword[def_dr_mode], 1 shl bit_faces_fill
  218.         @@:
  219.         stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dl,1
  220.         or eax,eax
  221.         jz @f
  222.                 or dword[def_dr_mode], 1 shl bit_light
  223.         @@:
  224.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
  225.         mov [color_ox],eax
  226.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
  227.         mov [color_oy],eax
  228.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
  229.         mov [color_oz],eax
  230.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
  231.         mov [color_bk],eax
  232.         shr eax,8
  233.         mov [color_bk+4],eax
  234.         shr eax,8
  235.         mov [color_bk+8],eax
  236.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
  237.         mov [color_vert],eax
  238.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
  239.         mov [color_face],eax
  240.         stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
  241.         mov [color_select],eax
  242.         finit
  243.         fild dword[color_bk+8]
  244.         fdiv dword[fl255]
  245.         fstp dword[color_bk+8]
  246.         mov eax,[color_bk+4]
  247.         and eax,0xff
  248.         mov [color_bk+4],eax
  249.         fild dword[color_bk+4]
  250.         fdiv dword[fl255]
  251.         fstp dword[color_bk+4]
  252.         mov eax,[color_bk]
  253.         and eax,0xff
  254.         mov [color_bk],eax
  255.         fild dword[color_bk]
  256.         fdiv dword[fl255]
  257.         fstp dword[color_bk]
  258.  
  259.         mcall 26,9
  260.         mov [last_time],eax
  261.  
  262.         stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
  263.         stdcall [glEnable], GL_DEPTH_TEST
  264.         stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
  265.         stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
  266.         stdcall [glShadeModel], GL_SMOOTH
  267.         stdcall [gluNewQuadric]
  268.         mov [qObj],eax
  269.  
  270.         call draw_window
  271.  
  272. align 4
  273. still:
  274.         mcall 26,9
  275.         mov ebx,[last_time]
  276.         add ebx,10 ;задержка
  277.         cmp ebx,eax
  278.         jge @f
  279.                 mov ebx,eax
  280.         @@:
  281.         sub ebx,eax
  282.         mcall 23
  283.         cmp eax,0
  284.         je timer_funct
  285.  
  286.         cmp al,1
  287.         jne @f
  288.                 call draw_window
  289.                 jmp still
  290.         @@:
  291.         cmp al,2
  292.         jz key
  293.         cmp al,3
  294.         jz button
  295.         cmp al,6
  296.         jne @f
  297.                 mcall 9,procinfo,-1
  298.                 cmp ax,word[procinfo+4]
  299.                 jne @f ;окно не активно
  300.                 call mouse
  301.         @@:
  302.         jmp still
  303.  
  304. align 4
  305. mouse:
  306.         stdcall [tl_mouse], dword tree1
  307.         ret
  308.  
  309. align 4
  310. timer_funct:
  311.         pushad
  312.         mcall 26,9
  313.         mov [last_time],eax
  314.  
  315.         ;просматриваем выделенный блок данных
  316.         stdcall [tl_node_get_data],tree1
  317.         cmp eax,0
  318.         je @f
  319.                 mov ebx,eax
  320.                 mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла
  321.                 mov ecx,dword[ebx+4] ;размер блока
  322.                 stdcall hex_in_str, txt_3ds_offs.dig, eax,8
  323.                 stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
  324.  
  325.                 add eax,dword[open_file_data] ;получаем значение сдвига в памяти
  326.                 cmp dword[offs_last_timer],eax
  327.                 je @f
  328.                         ;если выделенный блок данных не совпадает с последним запомненным
  329.                         mov dword[offs_last_timer],eax
  330.                         call buf_draw_beg
  331.                         stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000
  332.                         mov edx,dword[ebx+list_offs_p_data]
  333.                         cmp edx,0 ;смотрим есть ли описание блока
  334.                         je .no_info
  335.                                 stdcall [buf2d_draw_text], buf_0, buf_1,edx,5,45,0xb000
  336.                         .no_info:
  337.                         add ecx,eax ;получаем размер блока
  338.                         stdcall buf_draw_hex_table,eax,ecx ;добавление 16-ричных данных
  339.                         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  340.         @@:
  341.         popad
  342.         jmp still
  343.  
  344. align 4
  345. buf_draw_beg:
  346.         stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
  347.         stdcall [buf2d_draw_text], buf_0, buf_1,txt_open_3ds,5,5,0xff
  348.         stdcall [buf2d_draw_text], buf_0, buf_1,openfile_path,5,15,0xff
  349.         cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
  350.         jne @f
  351.                 stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_err_sizes,5,25,0xff0000
  352.         @@:
  353.         ret
  354.  
  355. align 4
  356. proc buf_draw_hex_table, offs:dword, size_line:dword
  357.         pushad
  358.         locals
  359.                 coord_y dd 55 ;координата y для начала вывода таблицы
  360.         endl
  361.                 mov esi,dword[offs]
  362.                 mov edi,dword[open_file_data]
  363.                 add edi,dword[file_3ds.size] ;edi - указатель на конец файла в памяти
  364.                 mov dword[txt_3ds_offs.dig],0
  365.                 cld
  366.                 .cycle_rows:
  367.                         mov ebx,5 ;отступ слева для цифр
  368.                         mov edx,5+10*24 ;отступ слева для текста
  369.                         mov ecx,10
  370.                         @@:
  371.                                 stdcall hex_in_str, txt_3ds_offs.dig, dword[esi],2
  372.                                 stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs.dig,ebx,[coord_y],0
  373.  
  374.                                 mov al,byte[esi]
  375.                                 mov byte[txt_3ds_symb],al
  376.                                 stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_symb,edx,[coord_y],0x808080
  377.                                 inc esi
  378.                                 cmp esi,dword[size_line]
  379.                                 jne .end_block
  380.                                         stdcall draw_block_end_line, dword[coord_y]
  381.                                 .end_block:
  382.                                 cmp esi,edi
  383.                                 jge @f ;jg ???
  384.                                 add ebx,24
  385.                                 add edx,9 ;ширина 1-го символа +1pix
  386.                                 loop @b
  387.                         add dword[coord_y],10 ;высота 1-го символа (или интервал между строками)
  388.                         mov ebx,dword[buf_0.h]
  389.                         cmp dword[coord_y],ebx
  390.                         jl .cycle_rows
  391.                 @@:
  392.         popad
  393.         ret
  394. endp
  395.  
  396. align 4
  397. proc draw_block_end_line uses eax ebx ecx, coord_y:dword
  398.         add ebx,20 ;20 = width 2.5 symbols
  399.         mov eax,[coord_y]
  400.         sub eax,2
  401.         mov ecx,eax
  402.         add ecx,10
  403.         stdcall [buf2d_line], buf_0, 0,ecx,ebx,ecx ,0xff
  404.         stdcall [buf2d_line], buf_0, ebx,ecx,ebx,eax ,0xff
  405.         stdcall [buf2d_line], buf_0, ebx,eax,5+10*24-4,eax ,0xff
  406.         ret
  407. endp
  408.  
  409. align 4
  410. draw_window:
  411. pushad
  412.         mcall 12,1
  413.         xor eax,eax
  414.         mov edx,[sc.work]
  415.         or  edx,0x33000000
  416.         mov edi,capt
  417.         mcall , (20 shl 16)+560, (20 shl 16)+main_wnd_height
  418.  
  419.         mcall 9,procinfo,-1
  420.         mov eax,dword[procinfo.box.height]
  421.         cmp eax,250
  422.         jge @f
  423.                 mov eax,250
  424.         @@:
  425.         sub eax,65
  426.         mov dword[tree1.box_height],eax
  427.         mov word[w_scr_t1+4],ax ;новые размеры скроллинга
  428.         cmp eax,dword[buf_0.h] ;увеличиваем высоту буфера
  429.         jle @f
  430.                 stdcall [buf2d_resize],buf_0,0,eax
  431.                 mov dword[offs_last_timer],0 ;для обновления буфера в таймере
  432.         @@:
  433.  
  434.         mov eax,dword[procinfo.box.width]
  435.         cmp eax,400
  436.         jge @f
  437.                 mov eax,400
  438.         @@:
  439.         sub eax,[buf_0.w]
  440.         sub eax,41
  441.         mov dword[tree1.box_width],eax
  442.         add ax,word[tree1.box_left]
  443.         mov word[w_scr_t1+sb_offs_start_x],ax
  444.         add ax,16+5
  445.         mov word[buf_0.l],ax
  446.  
  447.         mov esi,[sc.work_button]
  448.         mcall 8,(5 shl 16)+20,(5 shl 16)+20,3
  449.  
  450.         mov ebx,(30 shl 16)+20
  451.         mov edx,4
  452.         int 0x40
  453.  
  454.         cmp byte[can_save],0
  455.         je @f
  456.                 mov ebx,(55 shl 16)+20
  457.                 mov edx,5
  458.                 int 0x40
  459.         @@:
  460.  
  461.         mcall ,(85 shl 16)+20,,6 ;окно с координатами
  462.         mcall ,(110 shl 16)+20,,7 ;удаление блока
  463.  
  464.         mcall 7,[image_data_toolbar],(16 shl 16)+16,(7 shl 16)+7 ;new
  465.  
  466.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  467.         mov edx,(32 shl 16)+7 ;open
  468.         int 0x40
  469.  
  470.         cmp byte[can_save],0
  471.         je @f
  472.                 add ebx,IMAGE_TOOLBAR_ICON_SIZE
  473.                 mov edx,(57 shl 16)+7 ;save
  474.                 int 0x40
  475.                 sub ebx,IMAGE_TOOLBAR_ICON_SIZE
  476.         @@:
  477.  
  478.         add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
  479.         mov edx,(87 shl 16)+7
  480.         int 0x40
  481.  
  482.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  483.         mov edx,(112 shl 16)+7
  484.         int 0x40
  485.  
  486.         mov dword[w_scr_t1.all_redraw],1
  487.         stdcall [tl_draw],dword tree1
  488.  
  489.         stdcall [buf2d_draw], buf_0
  490.  
  491.         mcall 12,2
  492. popad
  493.         ret
  494.  
  495. align 4
  496. key:
  497.         mcall 2
  498.         stdcall [tl_key], dword tree1
  499.         jmp still
  500.  
  501.  
  502. align 4
  503. button:
  504.         mcall 17
  505.         cmp ah,3
  506.         jne @f
  507.                 call but_new_file
  508.                 jmp still
  509.         @@:
  510.         cmp ah,4
  511.         jne @f
  512.                 call but_open_file
  513.                 jmp still
  514.         @@:
  515.         cmp ah,5
  516.         jne @f
  517.                 call but_save_file
  518.                 jmp still
  519.         @@:
  520.         cmp ah,6
  521.         jne @f
  522.                 call but_wnd_coords
  523.                 jmp still
  524.         @@:
  525.         cmp ah,7
  526.         jne @f
  527.                 call but_delete_chunk
  528.                 jmp still
  529.         @@:
  530.  
  531.         cmp ah,1
  532.         jne still
  533. .exit:
  534.         mov dword[tree1.data_img],0
  535.         mov dword[tree1.data_img_sys],0
  536.         stdcall [tl_data_clear], tree1
  537.         stdcall [buf2d_delete],buf_0
  538.         stdcall [buf2d_delete],buf_1 ;удаляем буфер
  539.         stdcall mem.Free,[image_data_toolbar]
  540.         stdcall mem.Free,[open_file_data]
  541.         stdcall [gluDeleteQuadric], [qObj]
  542.         mcall -1
  543.  
  544.  
  545. align 4
  546. but_new_file:
  547.         mov byte[can_save],0
  548.         stdcall [tl_info_clear], tree1 ;очистка списка объектов
  549.         stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
  550.         stdcall [tl_draw], tree1
  551.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  552.         ret
  553.  
  554. align 4
  555. but_open_file:
  556.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  557.         pushad
  558.         mov [OpenDialog_data.type],0
  559.         stdcall [OpenDialog_Start],OpenDialog_data
  560.         cmp [OpenDialog_data.status],2
  561.         je .end_open_file
  562.         ;код при удачном открытии диалога
  563.  
  564.     mov [run_file_70.Function], 5
  565.     mov [run_file_70.Position], 0
  566.     mov [run_file_70.Flags], 0
  567.     mov dword[run_file_70.Count], 0
  568.     mov dword[run_file_70.Buffer], open_b
  569.     mov byte[run_file_70+20], 0
  570.     mov dword[run_file_70.FileName], openfile_path
  571.     mcall 70,run_file_70
  572.  
  573.     mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
  574.     stdcall mem.ReAlloc,[open_file_data],ecx
  575.     mov [open_file_data],eax
  576.    
  577.     mov [run_file_70.Function], 0
  578.     mov [run_file_70.Position], 0
  579.     mov [run_file_70.Flags], 0
  580.     mov dword[run_file_70.Count], ecx
  581.     m2m dword[run_file_70.Buffer], dword[open_file_data]
  582.     mov byte[run_file_70+20], 0
  583.     mov dword[run_file_70.FileName], openfile_path
  584.     mcall 70,run_file_70 ;загружаем файл 3ds
  585.     cmp ebx,0xffffffff
  586.     je .end_open_file
  587.  
  588.         mov [open_file_size],ebx
  589.         ;mcall 71,1,openfile_path
  590.  
  591.         mov byte[can_save],0
  592.         call init_tree
  593.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  594.         call prop_wnd_clear_param ;чистим параметры окна с координатами
  595.         cmp byte[prop_wnd_run],0
  596.         je @f
  597.                 ;чистим окно с координатами
  598.                 stdcall [tl_info_clear], tree3
  599.         @@:
  600.  
  601.         .end_open_file:
  602.         popad
  603.         ret
  604.  
  605. align 4
  606. init_tree:
  607.         stdcall [tl_info_clear], tree1 ;очистка списка объектов
  608.  
  609.         mov esi,dword[open_file_data]
  610.         cmp word[esi],CHUNK_MAIN
  611.         je @f
  612.                 call buf_draw_beg
  613.                 stdcall [buf2d_draw_text], buf_0, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом
  614.                 jmp .end_open
  615.         @@:
  616.         ;--- обработка открытого *.3ds файла
  617.         mov eax,file_3ds
  618.         mov dword[level_stack],0 ;обнуляем уровень стека
  619.         mov dword[offs_last_timer],0
  620.         ;--- добавление главного блока в список
  621.         stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
  622.         call block_children ;вход в дочерний блок
  623.  
  624.         mov edi,dword[file_3ds.offs]
  625.         add edi,dword[file_3ds.size]
  626.         .cycle_main:
  627.                 cmp dword[level_stack],0
  628.                 jle .end_cycle
  629.                
  630.                 cmp esi,edi ;если конец файла
  631.                 jge .end_cycle
  632.  
  633.                 mov edx,dword[esi+2] ;размер блока
  634.                 call block_analiz
  635.                 cmp dword[bl_found],0
  636.                 jne @f
  637.                         ;объект не известного вида
  638.                         stdcall add_3ds_object, ID_ICON_CHUNK_NOT_FOUND,dword[level_stack],edx,0
  639.                         call block_next
  640.                         jmp .cycle_main
  641.                 @@:
  642.                         ;объект известного вида
  643.                         mov ecx,dword[bl_found]
  644.                         mov bx,word[ecx+2] ;номер иконки для объекта
  645.                         stdcall add_3ds_object, ebx,dword[level_stack],edx,dword[ecx+5]
  646.                         cmp byte[ecx+4],1
  647.                         je .bl_data
  648.                                 ;блок содержит дочерние блоки
  649.                                 call block_children ;вход в дочерний блок
  650.                                 jmp .cycle_main
  651.                         .bl_data:
  652.                                 ;блок содержит данные
  653.                                 call block_analiz_data
  654.                                 jmp .cycle_main
  655.         .end_cycle:
  656.                 stdcall [tl_cur_beg], tree1
  657.                 stdcall [tl_draw], tree1
  658.         .end_open:
  659.         ret
  660.  
  661. ;анализ данных блока
  662. ;input:
  663. ; esi - memory pointer
  664. ;output:
  665. ; eax - new stack pointer
  666. ; esi - new memory pointer
  667. align 4
  668. block_analiz_data:
  669.         push ebx ecx edx edi
  670.                 mov dx,word[esi]
  671.                 mov ecx,dword[esi+2]
  672.                 sub ecx,6 ;размер данных в блоке
  673.                 add esi,6
  674.                 mov ebx,dword[level_stack]
  675.                 inc ebx
  676.                 ; *** анализ блоков с разными данными и выделением подблоков
  677.                 cmp dx,CHUNK_OBJBLOCK ;объект
  678.                 jne @f
  679.                         push ax
  680.                                 cld
  681.                                 xor al,al
  682.                                 mov edi,esi
  683.                                 repne scasb
  684.                         pop ax
  685.                         sub edi,esi ;edi - strlen
  686.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
  687.                         add esi,edi
  688.                         ;sub ecx,edi ;уже сделано в repne
  689.                         jmp .next_bl
  690.                 @@:
  691.                 cmp dx,CHUNK_VERTLIST ;список вершин
  692.                 je .vertexes
  693.                 cmp dx,0x4111 ;флаги вершин
  694.                 je .vertexes
  695.                 cmp dx,CHUNK_MAPLIST ;текстурные координаты
  696.                 je .vertexes
  697.                 jmp @f
  698.                 .vertexes: ;обработка блоков, содержащих данные вершин
  699.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число вершин
  700.                         add esi,2
  701.                         sub ecx,2
  702.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные вершин
  703.                         sub esi,8 ;восстановление esi
  704.                         call block_next
  705.                         jmp .end_f             
  706.                 @@:
  707.                 cmp dx,CHUNK_FACELIST ;список граней
  708.                 jne @f
  709.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
  710.                         push eax
  711.                         xor eax,eax
  712.                         mov ax,[esi]
  713.                         shl eax,3
  714.                         add esi,2
  715.                         sub ecx,2
  716.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,eax,0 ;данные вершин
  717.  
  718.                         sub ecx,eax
  719.                         cmp ecx,1
  720.                         jl .data_3 ;проверяем есть ли блок описывающий материал, применяемый к объекту
  721.                                 add esi,eax
  722.                                 pop eax
  723.                                 jmp .next_bl
  724.                                 ;stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные материала
  725.                                 ;sub esi,eax ;восстановление esi
  726.                         .data_3:
  727.  
  728.                         sub esi,8 ;восстановление esi
  729.                         pop eax
  730.                         call block_next
  731.                         jmp .end_f             
  732.                 @@:
  733.                 cmp dx,CHUNK_FACEMAT ;материалы граней
  734.                 jne @f
  735.                         push ax
  736.                                 cld
  737.                                 xor al,al
  738.                                 mov edi,esi
  739.                                 repne scasb
  740.                         pop ax
  741.                         sub edi,esi ;edi - strlen
  742.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
  743.                         add esi,edi
  744.                         ;sub ecx,edi ;уже сделано в repne
  745.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
  746.                         add esi,2
  747.                         sub ecx,2
  748.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;номера граней, к которым применен материал
  749.                         sub esi,edi ;восстановление esi (1)
  750.                         sub esi,8   ;восстановление esi (2)
  751.                         call block_next
  752.                         jmp .end_f
  753.                 @@:
  754.                 ; *** анализ блока с данными по умолчанию (без выделения подблоков)
  755.                         stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0
  756.                         sub esi,6 ;восстановление esi
  757.                         call block_next
  758.                         jmp .end_f
  759.                 .next_bl:
  760.                 ; *** настройки для анализа оставшихся подблоков
  761.                         mov dword[eax],esi ;указатель на начало блока
  762.                         mov ebx,dword[esi+2]
  763.                         mov dword[eax+4],ebx ;размер блока
  764.                         inc dword[level_stack]
  765.                         add eax,8
  766.                 .end_f:
  767.         pop edi edx ecx ebx
  768.         ret
  769.  
  770. ;вход в 1-й дочерний блок
  771. ;output:
  772. ; edx - destroy
  773. align 4
  774. block_children:
  775.         push ecx
  776.                 ;проверка правильности размеров дочернего блока
  777.                 mov ebx,esi ;смещение начала родительского блока
  778.                 add ebx,6 ;переход на начало дочернего блока
  779.                 add ebx,dword[ebx+2] ;добавляем размер дочернего блока
  780.                 mov ecx,esi ;смещение начала родительского блока
  781.                 add ecx,dword[esi+2] ;добавляем размер родительского блока
  782.                 cmp ebx,ecx ;учитывать заголовки не нужно, т. к. сравниваются только данные блоков
  783.                 jle @f
  784.                         ;диагностировали ошибку файла, дочерний блок выходит за пределы родительского
  785.                         mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
  786.                         jmp .end_f
  787.                 @@:
  788.                 mov dword[eax],esi ;указатель на начало блока
  789.                 mov ebx,dword[esi+2]
  790.                 mov dword[eax+4],ebx ;размер блока
  791.                 add esi,6 ;переходим к данным блока
  792.                 inc dword[level_stack]
  793.                 add eax,8
  794.         .end_f:
  795.         pop ecx
  796.         ret
  797.  
  798. ;переход к следущему блоку текущего уровня
  799. ;input:
  800. ; eax - адрес структуры с переменными
  801. align 4
  802. block_next:
  803. push ebx
  804.         add esi,dword[esi+2] ;пропускаем данные блока
  805.  
  806.         ;проверка размеров родительского блока, для возможного выхода на верхний уровень если конец блока
  807.         @@:
  808.         mov ebx,dword[eax-8]
  809.         add ebx,dword[eax-4]
  810.         cmp esi,ebx
  811.         jl @f
  812.                 dec dword[level_stack]
  813.                 sub eax,8
  814.                 cmp dword[level_stack],0
  815.                 jg @b
  816.         @@:
  817. pop ebx
  818.         ret
  819.  
  820. ;функция поиска структуры описывающей блок
  821. ;input:
  822. ;esi - memory pointer
  823. ;output:
  824. ;dword[bl_found] - pointer to chunk struct (= 0 if not found)
  825. align 4
  826. bl_found dd 0
  827. block_analiz:
  828. pushad
  829.         mov dword[bl_found],0
  830.         mov ecx,type_bloks
  831.         @@:
  832.                 mov bx,word[ecx]
  833.                 cmp word[esi],bx
  834.                 je .found
  835.                 add ecx,sizeof.block_3ds
  836.                 cmp ecx,type_bloks.end
  837.                 jl @b
  838.         jmp .no_found
  839.         .found:
  840.                 mov dword[bl_found],ecx
  841.         .no_found:
  842. popad
  843.         ret
  844.  
  845. ;input:
  846. ; esi - указатель на анализируемые данные
  847. ; level - уровень вложенности узла
  848. ; size_bl - размер блока
  849. align 4
  850. proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword
  851.         pushad
  852.                 mov bx,word[icon]
  853.                 shl ebx,16
  854.                 mov bx,word[level]
  855.  
  856.                 mov eax,esi
  857.                 sub eax,dword[open_file_data]
  858.                 mov dword[buffer],eax ;смещение блока
  859.                 mov ecx,dword[size_bl]
  860.                 mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии)
  861.                 mov ecx,dword[bl_found]
  862.                 cmp ecx,0
  863.                 je @f
  864.                         ;... здесь нужен другой алгоритм защиты от удаления
  865.                         mov cl,byte[ecx+4]
  866.                 @@:
  867.                 mov byte[buffer+list_offs_chunk_del],cl
  868.                 mov ecx,[level]
  869.                 mov byte[buffer+list_offs_chunk_lev],cl
  870.                 mov ecx,dword[info_bl]
  871.                 mov dword[buffer+list_offs_p_data],ecx
  872.                 stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
  873.                 stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;код 3ds блока
  874.                 cmp ecx,0
  875.                 jne @f
  876.                         mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки
  877.                         jmp .no_capt
  878.                 @@:
  879.                         mov byte[buffer+list_offs_text+4],' '
  880.                         mov esi,ecx
  881.                         mov edi,buffer+list_offs_text+5
  882.                         mov ecx,size_one_list-(list_offs_text+5)
  883.                         cld
  884.                         rep movsb
  885.                         mov byte[buffer+size_one_list-1],0 ;0 - символ конца строки
  886.                 .no_capt:
  887.                 stdcall [tl_node_add], tree1, ebx, buffer
  888.                 stdcall [tl_cur_next], tree1
  889.                 if debug
  890.                         stdcall print_err,sz_add_3ds_object,buffer+list_offs_text
  891.                 end if
  892.         popad
  893.         ret
  894. endp
  895.  
  896. if debug
  897. sz_add_3ds_object db 13,10,'3ds_object',0
  898.  
  899. align 4
  900. proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
  901.         pushad
  902.         mov eax,63
  903.         mov ebx,1
  904.  
  905.         mov esi,[fun]
  906.         @@:
  907.                 mov cl,byte[esi]
  908.                 int 0x40
  909.                 inc esi
  910.                 cmp byte[esi],0
  911.                 jne @b
  912.         mov cl,':'
  913.         int 0x40
  914.         mov cl,' '
  915.         int 0x40
  916.         mov esi,[mes]
  917.         @@:
  918.                 mov cl,byte[esi]
  919.                 int 0x40
  920.                 inc esi
  921.                 cmp byte[esi],0
  922.                 jne @b
  923.         popad
  924.         ret
  925. endp
  926.  
  927. end if
  928.  
  929. ;input:
  930. ; eax - value
  931. ; buf - string buffer
  932. ; len - buffer len
  933. ;output:
  934. align 4
  935. proc convert_int_to_str, buf:dword, len:dword
  936. pushad
  937.         mov edi,[buf]
  938.         mov esi,[len]
  939.         add esi,edi
  940.         dec esi
  941.         call .str
  942. popad
  943.         ret
  944. endp
  945.  
  946. align 4
  947. .str:
  948.         mov ecx,0x0a
  949.         cmp eax,ecx
  950.         jb @f
  951.                 xor edx,edx
  952.                 div ecx
  953.                 push edx
  954.                 call .str
  955.                 pop eax
  956.         @@:
  957.         cmp edi,esi
  958.         jge @f
  959.                 or al,0x30
  960.                 stosb
  961.                 mov byte[edi],0
  962.         @@:
  963.         ret
  964.  
  965. align 4
  966. proc hex_in_str, buf:dword,val:dword,zif:dword
  967.         pushad
  968.                 mov edi,dword[buf]
  969.                 mov ecx,dword[zif]
  970.                 add edi,ecx
  971.                 dec edi
  972.                 mov ebx,dword[val]
  973.  
  974.                 .cycle:
  975.                         mov al,bl
  976.                         and al,0xf
  977.                         cmp al,10
  978.                         jl @f
  979.                                 add al,'a'-'0'-10
  980.                         @@:
  981.                         add al,'0'
  982.                         mov byte[edi],al
  983.                         dec edi
  984.                         shr ebx,4
  985.                 loop .cycle
  986.  
  987.         popad
  988.         ret
  989. endp
  990.  
  991. align 4
  992. but_save_file:
  993.         pushad
  994.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  995.         mov [OpenDialog_data.type],1
  996.         stdcall [OpenDialog_Start],OpenDialog_data
  997.         cmp [OpenDialog_data.status],2
  998.         je .end_save_file
  999.         ;код при удачном открытии диалога
  1000.  
  1001.         mov [run_file_70.Function], 2
  1002.         mov [run_file_70.Position], 0
  1003.         mov [run_file_70.Flags], 0
  1004.         mov ebx, dword[open_file_data]
  1005.         mov [run_file_70.Buffer], ebx
  1006.         mov ebx,dword[ebx+2]
  1007.         mov dword[run_file_70.Count], ebx ;размер файла
  1008.         mov byte[run_file_70+20], 0
  1009.         mov dword[run_file_70.FileName], openfile_path
  1010.         mcall 70,run_file_70
  1011.         cmp ebx,0xffffffff
  1012.         je .end_save_file
  1013.                 ;...сообщение...
  1014.         .end_save_file:
  1015.         popad
  1016.         ret
  1017.  
  1018. align 4
  1019. but_wnd_coords:
  1020.         cmp byte[prop_wnd_run],0
  1021.         jne @f
  1022.                 pushad
  1023.                 mcall 51,1,prop_start,thread_coords
  1024.                 popad
  1025.         @@:
  1026.         ret
  1027.  
  1028. ;description:
  1029. ; удаление выбранного блока из открытого файла
  1030. align 4
  1031. but_delete_chunk:
  1032.         pushad
  1033.         stdcall [tl_node_get_data],tree1
  1034.         cmp eax,0
  1035.         je .end_f
  1036.         cmp byte[eax+list_offs_chunk_del],0 ;если блок защищен от удаления
  1037.         jne .notify
  1038.  
  1039.         ;(1) копирование нижней части файла
  1040.         mov edx,dword[eax+4] ;размер блока
  1041.         sub [open_file_size],edx ;изменение размеров файла
  1042.         mov ecx,[open_file_size]
  1043.         mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
  1044.         sub ecx,ebx ;ecx - размер нижней сдвигаемой части файла
  1045.         add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
  1046.         mov edi,ebx
  1047.         mov esi,ebx
  1048.         add esi,edx
  1049.         mov bl,byte[eax+list_offs_chunk_lev] ;берем уровень текущего узла
  1050.         rep movsb
  1051.         mov byte[can_save],1
  1052.  
  1053.         ;(2) изменение размеров родительских блоков
  1054.         cmp bl,0
  1055.         je .end_2
  1056.         .cycle_2:
  1057.         stdcall [tl_cur_perv], tree1
  1058.         stdcall [tl_node_get_data],tree1
  1059.         cmp eax,0
  1060.         je .end_2
  1061.                 cmp byte[eax+list_offs_chunk_lev],bl
  1062.                 jge .cycle_2
  1063.                 mov bl,byte[eax+list_offs_chunk_lev]
  1064.                 mov ecx,[eax]
  1065.                 add ecx,[open_file_data]
  1066.                 sub dword[ecx+2],edx
  1067.                 cmp bl,0 ;если самый верхний узел, то bl=0
  1068.                 jne .cycle_2
  1069.         .end_2:
  1070.        
  1071.         ;(3) обновление списка tree1
  1072.         call init_tree
  1073.         call draw_window
  1074.  
  1075.         jmp .end_f
  1076.         .notify:
  1077.         notify_window_run txt_not_delete
  1078.         .end_f:
  1079.         popad
  1080.         ret
  1081.  
  1082. ;input:
  1083. ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
  1084. ;output:
  1085. ; eax - число
  1086. align 4
  1087. proc conv_str_to_int uses ebx ecx esi, buf:dword
  1088.         xor eax,eax
  1089.         xor ebx,ebx
  1090.         mov esi,[buf]
  1091.         ;определение отрицательных чисел
  1092.         xor ecx,ecx
  1093.         inc ecx
  1094.         cmp byte[esi],'-'
  1095.         jne @f
  1096.                 dec ecx
  1097.                 inc esi
  1098.         @@:
  1099.  
  1100.         cmp word[esi],'0x'
  1101.         je .load_digit_16
  1102.  
  1103.         .load_digit_10: ;считывание 10-тичных цифр
  1104.                 mov bl,byte[esi]
  1105.                 cmp bl,'0'
  1106.                 jl @f
  1107.                 cmp bl,'9'
  1108.                 jg @f
  1109.                         sub bl,'0'
  1110.                         imul eax,10
  1111.                         add eax,ebx
  1112.                         inc esi
  1113.                         jmp .load_digit_10
  1114.         jmp @f
  1115.  
  1116.         .load_digit_16: ;считывание 16-ричных цифр
  1117.                 add esi,2
  1118.         .cycle_16:
  1119.                 mov bl,byte[esi]
  1120.                 cmp bl,'0'
  1121.                 jl @f
  1122.                 cmp bl,'f'
  1123.                 jg @f
  1124.                 cmp bl,'9'
  1125.                 jle .us1
  1126.                         cmp bl,'A'
  1127.                         jl @f ;отсеиваем символы >'9' и <'A'
  1128.                 .us1: ;составное условие
  1129.                 cmp bl,'F'
  1130.                 jle .us2
  1131.                         cmp bl,'a'
  1132.                         jl @f ;отсеиваем символы >'F' и <'a'
  1133.                         sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
  1134.                 .us2: ;составное условие
  1135.                         sub bl,'0'
  1136.                         cmp bl,9
  1137.                         jle .cor1
  1138.                                 sub bl,7 ;convert 'A' to '10'
  1139.                         .cor1:
  1140.                         shl eax,4
  1141.                         add eax,ebx
  1142.                         inc esi
  1143.                         jmp .cycle_16
  1144.         @@:
  1145.         cmp ecx,0 ;если число отрицательное
  1146.         jne @f
  1147.                 sub ecx,eax
  1148.                 mov eax,ecx
  1149.         @@:
  1150.         ret
  1151. endp
  1152.  
  1153. ;данные для диалога открытия файлов
  1154. align 4
  1155. OpenDialog_data:
  1156. .type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
  1157. .procinfo               dd procinfo ;+4
  1158. .com_area_name  dd communication_area_name ;+8
  1159. .com_area               dd 0 ;+12
  1160. .opendir_path   dd plugin_path ;+16
  1161. .dir_default_path       dd default_dir ;+20
  1162. .start_path             dd file_name ;+24 путь к диалогу открытия файлов
  1163. .draw_window    dd draw_window ;+28
  1164. .status                 dd 0 ;+32
  1165. .openfile_path  dd openfile_path ;+36 путь к открываемому файлу
  1166. .filename_area  dd filename_area ;+40
  1167. .filter_area    dd Filter
  1168. .x:
  1169. .x_size                 dw 420 ;+48 ; Window X size
  1170. .x_start                dw 10 ;+50 ; Window X position
  1171. .y:
  1172. .y_size                 dw 320 ;+52 ; Window y size
  1173. .y_start                dw 10 ;+54 ; Window Y position
  1174.  
  1175. default_dir db '/rd/1',0
  1176.  
  1177. communication_area_name:
  1178.         db 'FFFFFFFF_open_dialog',0
  1179. open_dialog_name:
  1180.         db 'opendial',0
  1181. communication_area_default_path:
  1182.         db '/rd/1/File managers/',0
  1183.  
  1184. Filter:
  1185. dd Filter.end - Filter.1
  1186. .1:
  1187. db '3DS',0
  1188. db 'TXT',0
  1189. .end:
  1190. db 0
  1191.  
  1192.  
  1193. align 4
  1194. system_dir_0 db '/sys/lib/'
  1195. lib_name_0 db 'proc_lib.obj',0
  1196. system_dir_1 db '/sys/lib/'
  1197. lib_name_1 db 'libimg.obj',0
  1198. system_dir_2 db '/sys/lib/'
  1199. lib_name_2 db 'box_lib.obj',0
  1200. system_dir_3 db '/sys/lib/'
  1201. lib_name_3 db 'buf2d.obj',0
  1202. system_dir_4 db '/sys/lib/'
  1203. lib_name_4 db 'kmenu.obj',0
  1204. system_dir_5 db '/sys/lib/'
  1205. lib_name_5 db 'tinygl.obj',0
  1206. system_dir_6 db '/sys/lib/'
  1207. lib_name_6 db 'libini.obj',0
  1208.  
  1209. if lang eq ru
  1210.         head_f_i:
  1211.         head_f_l db 'Системная ошибка',0
  1212.         err_msg_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
  1213.         err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
  1214.         err_msg_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
  1215.         err_msg_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
  1216.         err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
  1217.         err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,0
  1218.         err_msg_found_lib_3 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
  1219.         err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
  1220.         err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,0
  1221.         err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,0
  1222.         err_msg_found_lib_5 db 'Не найдена библиотека ',39,'tinygl.obj',39,0
  1223.         err_msg_import_5 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,0
  1224.         err_msg_found_lib_6 db 'Не найдена библиотека ',39,'libini.obj',39,0
  1225.         err_msg_import_6 db 'Ошибка при импорте библиотеки ',39,'libini',39,0
  1226. else
  1227.         head_f_i:
  1228.         head_f_l db 'System error',0
  1229.         err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,0
  1230.         err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,0
  1231.         err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,0
  1232.         err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,0
  1233.         err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,0
  1234.         err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,0
  1235.         err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,0
  1236.         err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,0
  1237.         err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,0
  1238.         err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,0
  1239.         err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,0
  1240.         err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,0
  1241.         err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,0
  1242.         err_msg_import_6 db 'Error on load import library ',39,'libini',39,0
  1243. end if
  1244.  
  1245. align 4
  1246. l_libs_start:
  1247.         lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
  1248.                 err_msg_found_lib_0, head_f_l, proclib_import,err_msg_import_0, head_f_i
  1249.         lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
  1250.                 err_msg_found_lib_1, head_f_l, import_libimg, err_msg_import_1, head_f_i
  1251.         lib_2 l_libs lib_name_2, sys_path, library_path,  system_dir_2,\
  1252.                 err_msg_found_lib_2, head_f_l, import_box_lib,err_msg_import_2,head_f_i
  1253.         lib_3 l_libs lib_name_3, sys_path, library_path,  system_dir_3,\
  1254.                 err_msg_found_lib_3, head_f_l, import_buf2d,  err_msg_import_3,head_f_i
  1255.         lib_4 l_libs lib_name_4, sys_path, library_path,  system_dir_4,\
  1256.                 err_msg_found_lib_4, head_f_l, import_libkmenu,err_msg_import_4,head_f_i
  1257.         lib_5 l_libs lib_name_5, sys_path, library_path,  system_dir_5,\
  1258.                 err_msg_found_lib_5, head_f_l, import_lib_tinygl,err_msg_import_5,head_f_i
  1259.         lib_6 l_libs lib_name_6, sys_path, library_path,  system_dir_6,\
  1260.                 err_msg_found_lib_6, head_f_l, import_libini, err_msg_import_6,head_f_i        
  1261. l_libs_end:
  1262.  
  1263. align 4
  1264. import_libimg:
  1265.         dd alib_init1
  1266.         img_is_img  dd aimg_is_img
  1267.         img_info    dd aimg_info
  1268.         img_from_file dd aimg_from_file
  1269.         img_to_file dd aimg_to_file
  1270.         img_from_rgb dd aimg_from_rgb
  1271.         img_to_rgb  dd aimg_to_rgb
  1272.         img_to_rgb2 dd aimg_to_rgb2
  1273.         img_decode  dd aimg_decode
  1274.         img_encode  dd aimg_encode
  1275.         img_create  dd aimg_create
  1276.         img_destroy dd aimg_destroy
  1277.         img_destroy_layer dd aimg_destroy_layer
  1278.         img_count   dd aimg_count
  1279.         img_lock_bits dd aimg_lock_bits
  1280.         img_unlock_bits dd aimg_unlock_bits
  1281.         img_flip    dd aimg_flip
  1282.         img_flip_layer dd aimg_flip_layer
  1283.         img_rotate  dd aimg_rotate
  1284.         img_rotate_layer dd aimg_rotate_layer
  1285.         img_draw    dd aimg_draw
  1286.  
  1287.         dd 0,0
  1288.         alib_init1   db 'lib_init',0
  1289.         aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
  1290.         aimg_info    db 'img_info',0
  1291.         aimg_from_file db 'img_from_file',0
  1292.         aimg_to_file db 'img_to_file',0
  1293.         aimg_from_rgb db 'img_from_rgb',0
  1294.         aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
  1295.         aimg_to_rgb2 db 'img_to_rgb2',0
  1296.         aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
  1297.         aimg_encode  db 'img_encode',0
  1298.         aimg_create  db 'img_create',0
  1299.         aimg_destroy db 'img_destroy',0
  1300.         aimg_destroy_layer db 'img_destroy_layer',0
  1301.         aimg_count   db 'img_count',0
  1302.         aimg_lock_bits db 'img_lock_bits',0
  1303.         aimg_unlock_bits db 'img_unlock_bits',0
  1304.         aimg_flip    db 'img_flip',0
  1305.         aimg_flip_layer db 'img_flip_layer',0
  1306.         aimg_rotate  db 'img_rotate',0
  1307.         aimg_rotate_layer db 'img_rotate_layer',0
  1308.         aimg_draw    db 'img_draw',0
  1309.  
  1310. align 4
  1311. proclib_import: ;описание экспортируемых функций
  1312.         OpenDialog_Init dd aOpenDialog_Init
  1313.         OpenDialog_Start dd aOpenDialog_Start
  1314. dd 0,0
  1315.         aOpenDialog_Init db 'OpenDialog_init',0
  1316.         aOpenDialog_Start db 'OpenDialog_start',0
  1317.  
  1318. align 4
  1319. import_buf2d:
  1320.         dd sz_init0
  1321.         buf2d_create dd sz_buf2d_create
  1322.         buf2d_create_f_img dd sz_buf2d_create_f_img
  1323.         buf2d_clear dd sz_buf2d_clear
  1324.         buf2d_draw dd sz_buf2d_draw
  1325.         buf2d_delete dd sz_buf2d_delete
  1326.         buf2d_resize dd sz_buf2d_resize
  1327.         buf2d_line dd sz_buf2d_line
  1328.         buf2d_rect_by_size dd sz_buf2d_rect_by_size
  1329.         buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
  1330.         buf2d_circle dd sz_buf2d_circle
  1331.         buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
  1332.         buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
  1333.         buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
  1334.         buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
  1335.         buf2d_bit_blt dd sz_buf2d_bit_blt
  1336.         buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
  1337.         buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
  1338.         buf2d_curve_bezier dd sz_buf2d_curve_bezier
  1339.         buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
  1340.         buf2d_draw_text dd sz_buf2d_draw_text
  1341.         buf2d_crop_color dd sz_buf2d_crop_color
  1342.         buf2d_offset_h dd sz_buf2d_offset_h
  1343.         buf2d_flood_fill dd sz_buf2d_flood_fill
  1344.         buf2d_set_pixel dd sz_buf2d_set_pixel
  1345.         dd 0,0
  1346.         sz_init0 db 'lib_init',0
  1347.         sz_buf2d_create db 'buf2d_create',0
  1348.         sz_buf2d_create_f_img db 'buf2d_create_f_img',0
  1349.         sz_buf2d_clear db 'buf2d_clear',0
  1350.         sz_buf2d_draw db 'buf2d_draw',0
  1351.         sz_buf2d_delete db 'buf2d_delete',0
  1352.         sz_buf2d_resize db 'buf2d_resize',0
  1353.         sz_buf2d_line db 'buf2d_line',0
  1354.         sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
  1355.         sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
  1356.         sz_buf2d_circle db 'buf2d_circle',0
  1357.         sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
  1358.         sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
  1359.         sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
  1360.         sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
  1361.         sz_buf2d_bit_blt db 'buf2d_bit_blt',0
  1362.         sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
  1363.         sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
  1364.         sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
  1365.         sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
  1366.         sz_buf2d_draw_text db 'buf2d_draw_text',0
  1367.         sz_buf2d_crop_color db 'buf2d_crop_color',0
  1368.         sz_buf2d_offset_h db 'buf2d_offset_h',0
  1369.         sz_buf2d_flood_fill db 'buf2d_flood_fill',0
  1370.         sz_buf2d_set_pixel db 'buf2d_set_pixel',0
  1371.  
  1372. align 4
  1373. import_box_lib:
  1374.         dd sz_init1
  1375.         init_checkbox dd sz_init_checkbox
  1376.         check_box_draw dd sz_check_box_draw
  1377.         edit_box_draw dd sz_edit_box_draw
  1378.         edit_box_key dd sz_edit_box_key
  1379.         edit_box_mouse dd sz_edit_box_mouse
  1380.         edit_box_set_text dd sz_edit_box_set_text
  1381.         scrollbar_ver_draw dd sz_scrollbar_ver_draw
  1382.         scrollbar_hor_draw dd sz_scrollbar_hor_draw
  1383.  
  1384.         tl_data_init dd sz_tl_data_init
  1385.         tl_data_clear dd sz_tl_data_clear
  1386.         tl_info_clear dd sz_tl_info_clear
  1387.         tl_key dd sz_tl_key
  1388.         tl_mouse dd sz_tl_mouse
  1389.         tl_draw dd sz_tl_draw
  1390.         tl_info_undo dd sz_tl_info_undo
  1391.         tl_info_redo dd sz_tl_info_redo
  1392.         tl_node_add dd sz_tl_node_add
  1393.         tl_node_set_data dd sz_tl_node_set_data
  1394.         tl_node_get_data dd sz_tl_node_get_data
  1395.         tl_node_delete dd sz_tl_node_delete
  1396.         tl_node_move_up dd sz_tl_node_move_up
  1397.         tl_node_move_down dd sz_tl_node_move_down
  1398.         tl_cur_beg dd sz_tl_cur_beg
  1399.         tl_cur_next dd sz_tl_cur_next
  1400.         tl_cur_perv dd sz_tl_cur_perv
  1401.         tl_node_close_open dd sz_tl_node_close_open
  1402.         tl_node_lev_inc dd sz_tl_node_lev_inc
  1403.         tl_node_lev_dec dd sz_tl_node_lev_dec
  1404.         tl_node_poi_get_info dd sz_tl_node_poi_get_info
  1405.         tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
  1406.         tl_node_poi_get_data dd sz_tl_node_poi_get_data
  1407.  
  1408.         dd 0,0
  1409.         sz_init1 db 'lib_init',0
  1410.         sz_init_checkbox db 'init_checkbox2',0
  1411.         sz_check_box_draw db 'check_box_draw2',0
  1412.         sz_edit_box_draw db 'edit_box',0
  1413.         sz_edit_box_key db 'edit_box_key',0
  1414.         sz_edit_box_mouse db 'edit_box_mouse',0
  1415.         sz_edit_box_set_text db 'edit_box_set_text',0
  1416.         sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
  1417.         sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
  1418.  
  1419.         sz_tl_data_init db 'tl_data_init',0
  1420.         sz_tl_data_clear db 'tl_data_clear',0
  1421.         sz_tl_info_clear db 'tl_info_clear',0
  1422.         sz_tl_key db 'tl_key',0
  1423.         sz_tl_mouse db 'tl_mouse',0
  1424.         sz_tl_draw db 'tl_draw',0
  1425.         sz_tl_info_undo db 'tl_info_undo',0
  1426.         sz_tl_info_redo db 'tl_info_redo',0
  1427.         sz_tl_node_add db 'tl_node_add',0
  1428.         sz_tl_node_set_data db 'tl_node_set_data',0
  1429.         sz_tl_node_get_data db 'tl_node_get_data',0
  1430.         sz_tl_node_delete db 'tl_node_delete',0
  1431.         sz_tl_node_move_up db 'tl_node_move_up',0
  1432.         sz_tl_node_move_down db 'tl_node_move_down',0
  1433.         sz_tl_cur_beg db 'tl_cur_beg',0
  1434.         sz_tl_cur_next db 'tl_cur_next',0
  1435.         sz_tl_cur_perv db 'tl_cur_perv',0
  1436.         sz_tl_node_close_open db 'tl_node_close_open',0
  1437.         sz_tl_node_lev_inc db 'tl_node_lev_inc',0
  1438.         sz_tl_node_lev_dec db 'tl_node_lev_dec',0
  1439.         sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
  1440.         sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
  1441.         sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
  1442.  
  1443. align 4
  1444. import_libkmenu:
  1445.         kmenu_init                     dd akmenu_init
  1446.         kmainmenu_draw                 dd akmainmenu_draw
  1447.         kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
  1448.         ksubmenu_new                   dd aksubmenu_new
  1449.         ksubmenu_delete                dd aksubmenu_delete
  1450.         ksubmenu_draw                  dd aksubmenu_draw
  1451.         ksubmenu_add                   dd aksubmenu_add
  1452.         kmenuitem_new                  dd akmenuitem_new
  1453.         kmenuitem_delete               dd akmenuitem_delete
  1454.         kmenuitem_draw                 dd akmenuitem_draw
  1455. dd 0,0
  1456.         akmenu_init                     db 'kmenu_init',0
  1457.         akmainmenu_draw                 db 'kmainmenu_draw',0
  1458.         akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
  1459.         aksubmenu_new                   db 'ksubmenu_new',0
  1460.         aksubmenu_delete                db 'ksubmenu_delete',0
  1461.         aksubmenu_draw                  db 'ksubmenu_draw',0
  1462.         aksubmenu_add                   db 'ksubmenu_add',0
  1463.         akmenuitem_new                  db 'kmenuitem_new',0
  1464.         akmenuitem_delete               db 'kmenuitem_delete',0
  1465.         akmenuitem_draw                 db 'kmenuitem_draw',0
  1466.  
  1467. align 4
  1468. import_lib_tinygl:
  1469. macro E_LIB n
  1470. {
  1471.         n dd sz_#n
  1472. }
  1473. include '../../develop/libraries/TinyGL/asm_fork/export.inc'
  1474.         dd 0,0
  1475. macro E_LIB n
  1476. {
  1477.         sz_#n db `n,0
  1478. }
  1479. include '../../develop/libraries/TinyGL/asm_fork/export.inc'
  1480.  
  1481. align 4
  1482. import_libini:
  1483.         dd alib_init0
  1484.         ini_get_str   dd aini_get_str
  1485.         ini_get_int   dd aini_get_int
  1486.         ini_get_color dd aini_get_color
  1487. dd 0,0
  1488.         alib_init0     db 'lib_init',0
  1489.         aini_get_str   db 'ini_get_str',0
  1490.         aini_get_int   db 'ini_get_int',0
  1491.         aini_get_color db 'ini_get_color',0
  1492.  
  1493. align 4
  1494. mouse_dd dd 0x0
  1495. last_time dd 0
  1496.  
  1497. align 4
  1498. buf_0: dd 0 ;указатель на буфер изображения
  1499. .l: dw 205 ;+4 left
  1500. .t: dw 35 ;+6 top
  1501. .w: dd 340 ;+8 w
  1502. .h: dd main_wnd_height-65 ;+12 h
  1503. .color: dd 0xffffd0 ;+16 color
  1504.         db 24 ;+20 bit in pixel
  1505.  
  1506. align 4
  1507. buf_ogl:
  1508.         dd 0 ;указатель на буфер изображения
  1509.         dw 3d_wnd_l,3d_wnd_t ;+4 left,top
  1510.         dd 3d_wnd_w,3d_wnd_h ;+8 w,h
  1511.         dd 0,24 ;+16 color,bit in pixel
  1512.  
  1513. align 4
  1514. buf_1:
  1515.         dd 0 ;указатель на буфер изображения
  1516.         dw 25,25 ;+4 left,top
  1517.         dd 128,144 ;+8 w,h
  1518.         dd 0,24 ;+16 color,bit in pixel
  1519.  
  1520. align 4
  1521. el_focus dd tree1
  1522. tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
  1523.         16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,250, 16,list_offs_text,0, el_focus,\
  1524.         w_scr_t1,0
  1525.  
  1526. align 4
  1527. w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1
  1528.  
  1529. align 4
  1530. ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
  1531. ;sizeof.TinyGLContext = 28
  1532.  
  1533. qObj dd 0
  1534.  
  1535. light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2]
  1536.         ;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
  1537. light_dir dd 0.0,0.0,0.0 ;направление лампы
  1538.  
  1539. mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика
  1540. mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
  1541. white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
  1542. lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения
  1543.  
  1544. if lang eq ru
  1545. capt db 'info 3ds версия 01.01.16',0 ;подпись окна
  1546. else
  1547. capt db 'info 3ds version 01.01.16',0 ;window caption
  1548. end if
  1549.  
  1550. align 16
  1551. i_end:
  1552.         procinfo process_information
  1553.         run_file_70 FileInfoBlock
  1554.         sc system_colors
  1555.                 rb sizeof.sys_colors_new-sizeof.system_colors
  1556.         angle_x rd 1 ;углы поворота сцены
  1557.         angle_y rd 1
  1558.         angle_z rd 1
  1559.         color_ox rd 1
  1560.         color_oy rd 1
  1561.         color_oz rd 1
  1562.         color_bk rd 3
  1563.         color_vert rd 1
  1564.         color_face rd 1
  1565.         color_select rd 1
  1566.         rb 2048
  1567. align 16
  1568. thread_coords:
  1569.         rb 2048
  1570. stacktop:
  1571.         sys_path rb 2048
  1572.         file_name rb 4096
  1573.         library_path rb 2048
  1574.         plugin_path rb 4096
  1575.         openfile_path rb 4096
  1576.         filename_area rb 256
  1577. mem:
  1578.