Subversion Repositories Kolibri OS

Rev

Rev 8083 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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