Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; в этом файле собраны функции нужные для создания и
  3. ; работы окна с координатами вершин
  4. ;
  5.  
  6. prop_wnd_width equ 340 ;ширина окна со свойствами объекта
  7. prop_wnd_height equ 460 ;высота окна со свойствами объекта
  8. 3d_wnd_l equ   5 ;отступ для tinygl буфера слева
  9. 3d_wnd_t equ  23 ;отступ для tinygl буфера сверху
  10. 3d_wnd_w equ 320
  11. 3d_wnd_h equ 240
  12. SIZE_ONE_FLOAT equ 14
  13. MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
  14.  
  15. prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
  16.  
  17. txt_q db '?',0
  18. txt_space:
  19.         db SIZE_ONE_FLOAT dup(' ')
  20. .end:
  21.         db 0
  22.  
  23. obj_point: ;добавляемый объект
  24.         dd 0   ;указатель
  25. .text:
  26.         rb MAX_OBJECT_SIZE
  27.  
  28. if lang eq ru
  29. txt_select_vert: db 'Выбрано: '
  30. else
  31. txt_select_vert: db 'Select: '
  32. end if
  33. .count:
  34. dq 0,0
  35.  
  36. ;даное окно (процесс) вызываеться функцией but_wnd_coords
  37. align 4
  38. prop_start:
  39. pushad
  40.         mcall SF_SET_EVENTS_MASK,0x27 ;маска ожидаемых событий
  41.         inc byte[prop_wnd_run]
  42.         mov dword[w_scr_t3.type],1
  43.         mov edi,o3d
  44.         stdcall obj_clear_param, edi
  45.         call mnu_reset_settings
  46.  
  47.         stdcall [tl_node_get_data],tree1
  48.         xor edx,edx
  49.         mov dword[capt_p],txt_q
  50.         cmp eax,0
  51.         je .no_points
  52.                 mov ebx,[eax] ;получаем значение сдвига выбранного блока
  53.                 add ebx,[open_file_data]
  54.  
  55.                 cmp word[ebx],CHUNK_OBJBLOCK
  56.                 jne .end_oblo
  57.                         mov dword[capt_p],txt_4000
  58.                         stdcall obj_init,edi
  59.                         jmp .no_points
  60.                 .end_oblo:
  61.                 cmp word[ebx],CHUNK_TRIMESH
  62.                 jne .end_trim
  63.                         mov dword[capt_p],txt_4100
  64.                         stdcall obj_init,edi
  65.                         jmp .no_points
  66.                 .end_trim:
  67.                 cmp word[ebx],CHUNK_VERTLIST
  68.                 jne .end_vlist
  69.                         mov dword[capt_p],txt_4110
  70.                         stdcall obj_init,edi
  71.                         jmp .no_points
  72.                 .end_vlist:
  73.                 cmp word[ebx],CHUNK_TRACKPIVOT
  74.                 jne @f
  75.                         inc edx
  76.                         add ebx,6
  77.                         mov dword[capt_p],txt_b013
  78.                         jmp .set_points
  79.                 @@:
  80.                 cmp word[ebx],0xb014
  81.                 jne @f
  82.                         mov edx,2
  83.                         add ebx,6
  84.                         mov dword[capt_p],txt_b014
  85.                         ;jmp .set_points
  86.                 @@:
  87.                 .set_points:
  88.                 mov [edi+offs_obj_poi_data],ebx
  89.                 mov [edi+offs_obj_poi_count],edx
  90.         .no_points:
  91.  
  92.         ;настройка списка объектов
  93.         mov ebx,[edi+offs_obj_poi_data]
  94.         mov dword[tree3.info_max_count],2
  95.         mov edx,[edi+offs_obj_poi_count]
  96.         add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
  97.         stdcall dword[tl_data_init], tree3
  98.         mov eax,dword[icon_tl_sys]
  99.         mov dword[tree3.data_img_sys],eax
  100.         mov eax,dword[icon_toolbar]
  101.         mov dword[tree3.data_img],eax
  102.  
  103.         cmp edx,0
  104.         je .no_object
  105.                 mov word[NumberSymbolsAD],5
  106.                 finit
  107.                 mov dword[w_scr_t3.redraw],0
  108.                 .new_point:
  109.                         mov dword[obj_point],ebx
  110.                         mov dword[obj_point.text],0
  111.                         cld
  112.                         mov ecx,3
  113.                         @@:
  114.                                 fld dword[ebx]
  115.                                 fstp qword[Data_Double]
  116.                                 call DoubleFloat_to_String
  117.                                 add ebx,4
  118.                                 stdcall str_len, Data_String
  119.                                 mov esi,txt_space
  120.                                 add esi,eax
  121.                                 cmp esi,txt_space.end
  122.                                 jl .normal_size
  123.                                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  124.                                 .normal_size:
  125.                                 stdcall str_cat, obj_point.text,esi
  126.                                 stdcall str_cat, obj_point.text,Data_String
  127.                                 loop @b
  128.                         stdcall dword[tl_node_add], tree3,(ID_ICON_POINT shl 16),obj_point
  129.                         stdcall dword[tl_cur_next], tree3
  130.                         dec edx
  131.                         cmp edx,0
  132.                         jg .new_point
  133.                         mov dword[w_scr_t3.redraw],1
  134.                         stdcall dword[tl_cur_beg], tree3
  135.         .no_object:
  136.         stdcall obj_set_sizes, o3d
  137.         stdcall obj_set_normals, o3d
  138.         edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
  139.         stdcall [edit_box_set_text], edit1, txt_q
  140.         stdcall [edit_box_set_text], edit2, txt_q
  141.         stdcall [edit_box_set_text], edit3, txt_q
  142.         mov eax,0xc0c0c0
  143.         mov ebx,[color_ox]
  144.         shr ebx,2
  145.         and ebx,0x3f3f3f
  146.         add eax,ebx
  147.         mov [edit1.color],eax
  148.         mov eax,0xc0c0c0
  149.         mov ebx,[color_oy]
  150.         shr ebx,2
  151.         and ebx,0x3f3f3f
  152.         add eax,ebx
  153.         mov [edit2.color],eax
  154.         mov eax,0xc0c0c0
  155.         mov ebx,[color_oz]
  156.         shr ebx,2
  157.         and ebx,0x3f3f3f
  158.         add eax,ebx
  159.         mov [edit3.color],eax
  160. popad
  161.         call prop_red_win
  162.  
  163. ;не отрывать эту функцию от предыдущей
  164. align 4
  165. prop_still:
  166.         pushad
  167.  
  168.         mcall SF_WAIT_EVENT_TIMEOUT,10
  169.         or eax,eax
  170.         jnz @f
  171.                 call prop_timer_funct
  172.                 jmp .end
  173.         @@:
  174.  
  175.         cmp al,1 ;изм. положение окна
  176.         jne @f
  177.                 call prop_red_win
  178.                 jmp .end
  179.         @@:
  180.         cmp al,2
  181.         jne @f
  182.                 call prop_key
  183.                 jmp .end
  184.         @@:
  185.         cmp al,3
  186.         jz prop_button
  187.         cmp al,6
  188.         jne @f
  189.                 call prop_mouse
  190.         @@:
  191. .end:
  192.         popad
  193.         jmp prop_still
  194.  
  195. align 4
  196. prop_red_win:
  197. pushad
  198.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  199.  
  200.         xor eax,eax
  201.         mov edi,dword[capt_p] ;children window caption
  202.         mov bx,word[procinfo.box.left]
  203.         add bx,word[buf_0.l]
  204.         add bx,5 ;ширина боковой рамки
  205.         shl ebx,16
  206.         mov bx,prop_wnd_width
  207.         mov cx,word[procinfo.box.top]
  208.         add cx,word[buf_0.t]
  209.         shl ecx,16
  210.         mov cx,prop_wnd_height
  211.         mov edx,[sc.work]
  212.         or  edx,0x33000000
  213.         int 0x40
  214.  
  215.         mov esi,[sc.work_button]
  216.         mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (266 shl 16)+20, 0x40000003
  217.         mcall , (30 shl 16)+20, (266 shl 16)+20, 0x40000004
  218.  
  219.         mov ebx,[image_data_toolbar]
  220.         add ebx,3*IMAGE_TOOLBAR_ICON_SIZE
  221.         mcall SF_PUT_IMAGE, , (21 shl 16)+21, (5 shl 16)+266 ;load
  222.  
  223.         sub ebx,IMAGE_TOOLBAR_ICON_SIZE
  224.         mov edx,(30 shl 16)+266 ;save
  225.         int 0x40
  226.  
  227.         mov dword[w_scr_t3.all_redraw],1
  228.         stdcall [scrollbar_ver_draw],dword w_scr_t3
  229.         stdcall [tl_draw], tree3
  230.         stdcall [edit_box_draw], edit1
  231.         stdcall [edit_box_draw], edit2
  232.         stdcall [edit_box_draw], edit3
  233.  
  234.         stdcall [kmainmenu_draw], [main_menu]
  235.         stdcall draw_3d, o3d
  236.         mcall SF_REDRAW,SSF_END_DRAW
  237. popad
  238.         ret
  239.  
  240. align 4
  241. proc prop_key uses eax ebx
  242.         mcall SF_GET_KEY
  243.  
  244.         test word [edit1.flags],10b ;ed_focus
  245.         je @f
  246.                 stdcall [edit_box_key], edit1
  247.                 jmp .end
  248.         @@:
  249.         test word [edit2.flags],10b
  250.         je @f
  251.                 stdcall [edit_box_key], edit2
  252.                 jmp .end
  253.         @@:
  254.         test word [edit3.flags],10b
  255.         je @f
  256.                 stdcall [edit_box_key], edit3
  257.                 jmp .end
  258.         @@:
  259.         cmp dword[el_focus], tree3
  260.         jne @f
  261.                 stdcall [tl_key], tree3
  262.                 jmp .end
  263.         @@:
  264.  
  265.         cmp ah,178 ;Up
  266.         jne @f
  267.                 fld dword[angle_x]
  268.                 fadd dword[delt_size]
  269.                 fstp dword[angle_x]
  270.                 stdcall draw_3d, o3d
  271.                 jmp .end
  272.         @@:
  273.         cmp ah,177 ;Down
  274.         jne @f
  275.                 fld dword[angle_x]
  276.                 fsub dword[delt_size]
  277.                 fstp dword[angle_x]
  278.                 stdcall draw_3d, o3d
  279.                 jmp .end
  280.         @@:
  281.         cmp ah,176 ;Left
  282.         jne @f
  283.                 fld dword[angle_y]
  284.                 fadd dword[delt_size]
  285.                 fstp dword[angle_y]
  286.                 stdcall draw_3d, o3d
  287.                 jmp .end
  288.         @@:
  289.         cmp ah,179 ;Right
  290.         jne @f
  291.                 fld dword[angle_y]
  292.                 fsub dword[delt_size]
  293.                 fstp dword[angle_y]
  294.                 stdcall draw_3d, o3d
  295.                 ;jmp .end
  296.         @@:
  297.         .end:
  298.         ret
  299. endp
  300.  
  301. align 4
  302. prop_mouse:
  303.         push eax ebx
  304.         mcall SF_MOUSE_GET,SSF_BUTTON_EXT
  305.         bt eax,0
  306.         jnc .end_m
  307.                 ;mouse l. but. move
  308.                 cmp dword[mouse_drag],1
  309.                 jne .end_m
  310.                 mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;get mouse coords
  311.                 mov ebx,eax
  312.                 shr ebx,16 ;mouse.x
  313.                 cmp ebx,3d_wnd_l
  314.                 jg @f
  315.                         mov ebx,3d_wnd_l
  316.                 @@:
  317.                 sub ebx,3d_wnd_l
  318.                 cmp ebx,3d_wnd_w
  319.                 jle @f
  320.                         mov ebx,3d_wnd_w
  321.                 @@:
  322.                 and eax,0xffff ;mouse.y
  323.                 cmp eax,3d_wnd_t
  324.                 jg @f
  325.                         mov eax,3d_wnd_t
  326.                 @@:
  327.                 sub eax,3d_wnd_t
  328.                 cmp eax,3d_wnd_h
  329.                 jle @f
  330.                         mov eax,3d_wnd_h
  331.                 @@:
  332.                 finit
  333.                 fild dword[mouse_y]
  334.                 mov [mouse_y],eax
  335.                 fisub dword[mouse_y]
  336.                 fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
  337.                 fadd dword[angle_x]
  338.                 fstp dword[angle_x]
  339.  
  340.                 fild dword[mouse_x]
  341.                 mov [mouse_x],ebx
  342.                 fisub dword[mouse_x]
  343.                 fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
  344.                 fadd dword[angle_y]
  345.                 fstp dword[angle_y]
  346.  
  347.                 stdcall draw_3d, o3d
  348.                 jmp .end_d
  349.         .end_m:
  350.         bt eax,16
  351.         jnc @f
  352.                 ;mouse l. but. up
  353.                 mov dword[mouse_drag],0
  354.                 jmp .end_d
  355.         @@:
  356.         bt eax,8
  357.         jnc .end_d
  358.                 ;mouse l. but. press
  359.                 mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;get mouse coords
  360.                 mov ebx,eax
  361.                 shr ebx,16 ;mouse.x
  362.                 cmp ebx,3d_wnd_l
  363.                 jl .end_d
  364.                 sub ebx,3d_wnd_l
  365.                 cmp ebx,3d_wnd_w
  366.                 jg .end_d
  367.                 and eax,0xffff ;mouse.y
  368.                 cmp eax,3d_wnd_t
  369.                 jl .end_d
  370.                 sub eax,3d_wnd_t
  371.                 cmp eax,3d_wnd_h
  372.                 jg .end_d
  373.                 mov dword[mouse_drag],1
  374.                 mov dword[mouse_x],ebx
  375.                 mov dword[mouse_y],eax
  376.         .end_d:
  377.  
  378.         stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
  379.         stdcall [tl_mouse], tree3
  380.         stdcall [edit_box_mouse], edit1
  381.         stdcall [edit_box_mouse], edit2
  382.         stdcall [edit_box_mouse], edit3
  383.         pop ebx eax
  384.         ret
  385.  
  386. align 4
  387. prop_button:
  388.         mcall SF_GET_BUTTON
  389.  
  390.         cmp ah,3
  391.         jne @f
  392.                 call get_point_coords
  393.                 stdcall draw_3d, o3d
  394.                 jmp prop_still.end
  395.         @@:
  396.         cmp ah,4
  397.         jne @f
  398.                 push eax ebx ecx edi esi
  399.                 stdcall [tl_node_get_data],tree3
  400.                 cmp eax,0
  401.                 je .no_select_1
  402.                         mov ebx,[eax]
  403.                         finit
  404.  
  405.                         mov esi,string1
  406.                         mov edi,Data_String
  407.                         cld
  408.                         mov ecx,8
  409.                         rep movsd
  410.                         call String_to_DoubleFloat
  411.                         fld  qword[Data_Double] ;считываем как double
  412.                         fstp dword[ebx] ;сохраняем как float
  413.  
  414.                         mov esi,string2
  415.                         mov edi,Data_String
  416.                         cld
  417.                         mov ecx,8
  418.                         rep movsd
  419.                         call String_to_DoubleFloat
  420.                         fld  qword[Data_Double] ;считываем как double
  421.                         fstp dword[ebx+4] ;сохраняем как float
  422.  
  423.                         mov esi,string3
  424.                         mov edi,Data_String
  425.                         cld
  426.                         mov ecx,8
  427.                         rep movsd
  428.                         call String_to_DoubleFloat
  429.                         fld  qword[Data_Double] ;считываем как double
  430.                         fstp dword[ebx+8] ;сохраняем как float
  431.  
  432.                         ;обновление измененного узла в списке tree3 и главного окна (по таймеру)
  433.                         mov word[NumberSymbolsAD],5
  434.                         mov dword[obj_point],ebx
  435.                         mov dword[obj_point.text],0
  436.                         cld
  437.                         mov ecx,3
  438.                         .coord:
  439.                                 fld dword[ebx]
  440.                                 fstp qword[Data_Double]
  441.                                 call DoubleFloat_to_String
  442.                                 add ebx,4
  443.                                 stdcall str_len, Data_String
  444.                                 mov esi,txt_space
  445.                                 add esi,eax
  446.                                 cmp esi,txt_space.end
  447.                                 jl .normal_size
  448.                                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  449.                                 .normal_size:
  450.                                 stdcall str_cat, obj_point.text,esi
  451.                                 stdcall str_cat, obj_point.text,Data_String
  452.                                 loop .coord
  453.                         mov byte[obj_point.text],'*' ;отмечаем что вершина изменялась
  454.                         stdcall dword[tl_node_set_data], tree3,obj_point
  455.                         stdcall dword[tl_draw], tree3
  456.                         mov byte[can_save],1 ;для показа кнопки 'Сохранить'
  457.                         mov dword[offs_last_timer],0 ;для обновления блока в таймере
  458.                         stdcall draw_3d, o3d
  459.                 .no_select_1:
  460.                 pop esi edi ecx ebx eax
  461.                 jmp prop_still.end
  462.         @@:
  463.         cmp ah,5
  464.         jne @f
  465.                 call mnu_vertexes_on
  466.                 jmp prop_still.end
  467.         @@:
  468.         cmp ah,6
  469.         jne @f
  470.                 call mnu_edges_on
  471.                 jmp prop_still.end
  472.         @@:
  473.         cmp ah,7
  474.         jne @f
  475.                 call mnu_faces_on
  476.                 jmp prop_still.end
  477.         @@:
  478.         cmp ah,8
  479.         jne @f
  480.                 call mnu_light_on_off
  481.                 jmp prop_still.end
  482.         @@:
  483.         cmp ah,9
  484.         jne @f
  485.                 call mnu_reset_settings
  486.                 jmp prop_still.end
  487.         @@:
  488.         cmp ah,10
  489.         jne @f
  490.                 call mnu_vertexes_select
  491.                 jmp prop_still.end
  492.         @@:
  493.         cmp ah,11
  494.         jne @f
  495.                 call mnu_vertexes_deselect
  496.                 jmp prop_still.end
  497.         @@:
  498.         cmp ah,12
  499.         jne @f
  500.                 call mnu_reset_average_x
  501.                 jmp prop_still.end
  502.         @@:
  503.         cmp ah,13
  504.         jne @f
  505.                 call mnu_reset_average_y
  506.                 jmp prop_still.end
  507.         @@:
  508.         cmp ah,14
  509.         jne @f
  510.                 call mnu_reset_average_z
  511.                 jmp prop_still.end
  512.         @@:
  513.  
  514.         cmp ah,1
  515.         jne prop_still.end
  516. .exit:
  517.         mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
  518.         mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
  519.         stdcall dword[tl_data_clear], tree3
  520.         mov edi,o3d
  521.         stdcall mem.Free,[edi+offs_obj_normals_tri_data]
  522.         stdcall mem.Free,[edi+offs_obj_normals_poi_data]
  523.         mov dword[edi+offs_obj_normals_tri_data],0
  524.         mov dword[edi+offs_obj_normals_poi_data],0
  525.         mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
  526.         mcall SF_TERMINATE_PROCESS ;выход из программы
  527.  
  528. align 4
  529. get_point_coords:
  530.         ;загрузка координат в editbox-ы
  531.         push eax ebx
  532.         stdcall [tl_node_get_data],tree3
  533.         cmp eax,0
  534.         je @f
  535.                 mov ebx,[eax]
  536.                 mov word[NumberSymbolsAD],8
  537.                 finit
  538.                 fld dword[ebx]
  539.                 fstp qword[Data_Double]
  540.                 call DoubleFloat_to_String
  541.                 stdcall [edit_box_set_text], edit1, Data_String
  542.                 fld dword[ebx+4]
  543.                 fstp qword[Data_Double]
  544.                 call DoubleFloat_to_String
  545.                 stdcall [edit_box_set_text], edit2, Data_String
  546.                 fld dword[ebx+8]
  547.                 fstp qword[Data_Double]
  548.                 call DoubleFloat_to_String
  549.                 stdcall [edit_box_set_text], edit3, Data_String
  550.                 stdcall [edit_box_draw], edit1
  551.                 stdcall [edit_box_draw], edit2
  552.                 stdcall [edit_box_draw], edit3
  553.         @@:
  554.         pop ebx eax
  555.         ret
  556.  
  557. align 4
  558. proc prop_timer_funct uses eax
  559.         ;просматриваем выделенную координату
  560.         stdcall [tl_node_get_data],tree3
  561.         cmp [cursor_last_draw],eax
  562.         je @f
  563.                 mov [cursor_last_draw],eax
  564.                 stdcall draw_3d, o3d
  565.         @@:
  566.         ret
  567. endp
  568.  
  569. align 4
  570. proc mnu_vertexes_select uses eax ebx
  571.         stdcall [tl_node_get_data],tree3
  572.         cmp eax,0
  573.         je .no_points
  574.         stdcall found_block_data,tree3
  575.         cmp eax,0
  576.         je .no_points
  577.                 mov bx,word[eax]
  578.                 cmp bx,ID_ICON_POINT_SEL
  579.                 je @f
  580.                         mov word[eax],ID_ICON_POINT_SEL
  581.                         inc dword[obj_poi_sel_c]
  582.                         jmp .change
  583.                 @@:
  584.                         mov word[eax],ID_ICON_POINT
  585.                         dec dword[obj_poi_sel_c]
  586.                 .change:
  587.                         mov eax,[obj_poi_sel_c]
  588.                         stdcall convert_int_to_str, txt_select_vert.count,16
  589.         .no_points:
  590.         ret
  591. endp
  592.  
  593. align 4
  594. proc mnu_vertexes_deselect uses eax
  595.         cmp dword[obj_poi_sel_c],0
  596.         je .no_points
  597.         mov dword[obj_poi_sel_c],0
  598.         stdcall [tl_node_poi_get_info], tree3,0
  599.         cmp eax,0
  600.         je .no_points
  601.         @@:
  602.                 mov word[eax],ID_ICON_POINT
  603.                 stdcall [tl_node_poi_get_next_info], tree3,eax
  604.                 cmp eax,0
  605.                 jne @b
  606.         .no_points:
  607.         ret
  608. endp
  609.  
  610. align 4
  611. proc mnu_reset_average_x uses eax ebx ecx edx edi
  612.         cmp dword[obj_poi_sel_c],2
  613.         jl .end_select
  614.                 finit
  615.                 fldz
  616.                 mov ecx,dword[obj_poi_sel_c]
  617.                 stdcall dword[tl_node_poi_get_info], tree3,0
  618.                 @@:
  619.                         cmp eax,0
  620.                         je .end_select
  621.                         mov ebx,eax
  622.                         cmp word[ebx],ID_ICON_POINT_SEL
  623.                         jne .next_sel0
  624.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  625.                                 mov eax,[eax]
  626.                                 fadd dword[eax]
  627.                                 dec ecx
  628.                                 jz @f
  629.                         .next_sel0:
  630.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  631.                         jmp @b
  632.                 @@:
  633.                 fidiv dword[obj_poi_sel_c]
  634.                 fstp dword[eax]
  635.                 mov edx,[eax]
  636.                 mov ecx,dword[obj_poi_sel_c]
  637.                 stdcall dword[tl_node_poi_get_info], tree3,0
  638.                 @@:
  639.                         cmp eax,0
  640.                         je .end_select
  641.                         mov ebx,eax
  642.                         cmp word[ebx],ID_ICON_POINT_SEL
  643.                         jne .next_sel1
  644.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  645.                                 mov edi,eax
  646.                                 mov eax,[eax]
  647.                                 mov [eax],edx
  648.                                 stdcall update_tree, edi
  649.                                 dec ecx
  650.                                 jz @f
  651.                         .next_sel1:
  652.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  653.                         jmp @b
  654.                 @@:
  655.     .end_select:
  656.         ret
  657. endp
  658.  
  659. align 4
  660. proc mnu_reset_average_y uses eax ebx ecx edx edi
  661.         cmp dword[obj_poi_sel_c],2
  662.         jl .end_select
  663.                 finit
  664.                 fldz
  665.                 mov ecx,dword[obj_poi_sel_c]
  666.                 stdcall dword[tl_node_poi_get_info], tree3,0
  667.                 @@:
  668.                         cmp eax,0
  669.                         je .end_select
  670.                         mov ebx,eax
  671.                         cmp word[ebx],ID_ICON_POINT_SEL
  672.                         jne .next_sel0
  673.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  674.                                 mov eax,[eax]
  675.                                 fadd dword[eax+4]
  676.                                 dec ecx
  677.                                 jz @f
  678.                         .next_sel0:
  679.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  680.                         jmp @b
  681.                 @@:
  682.                 fidiv dword[obj_poi_sel_c]
  683.                 fstp dword[eax+4]
  684.                 mov edx,[eax+4]
  685.                 mov ecx,dword[obj_poi_sel_c]
  686.                 stdcall dword[tl_node_poi_get_info], tree3,0
  687.                 @@:
  688.                         cmp eax,0
  689.                         je .end_select
  690.                         mov ebx,eax
  691.                         cmp word[ebx],ID_ICON_POINT_SEL
  692.                         jne .next_sel1
  693.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  694.                                 mov edi,eax
  695.                                 mov eax,[eax]
  696.                                 mov [eax+4],edx
  697.                                 stdcall update_tree, edi
  698.                                 dec ecx
  699.                                 jz @f
  700.                         .next_sel1:
  701.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  702.                         jmp @b
  703.                 @@:
  704.     .end_select:
  705.         ret
  706. endp
  707.  
  708. align 4
  709. proc mnu_reset_average_z uses eax ebx ecx edx edi
  710.         cmp dword[obj_poi_sel_c],2
  711.         jl .end_select
  712.                 finit
  713.                 fldz
  714.                 mov ecx,dword[obj_poi_sel_c]
  715.                 stdcall dword[tl_node_poi_get_info], tree3,0
  716.                 @@:
  717.                         cmp eax,0
  718.                         je .end_select
  719.                         mov ebx,eax
  720.                         cmp word[ebx],ID_ICON_POINT_SEL
  721.                         jne .next_sel0
  722.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  723.                                 mov eax,[eax]
  724.                                 fadd dword[eax+8]
  725.                                 dec ecx
  726.                                 jz @f
  727.                         .next_sel0:
  728.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  729.                         jmp @b
  730.                 @@:
  731.                 fidiv dword[obj_poi_sel_c]
  732.                 fstp dword[eax+8]
  733.                 mov edx,[eax+8]
  734.                 mov ecx,dword[obj_poi_sel_c]
  735.                 stdcall dword[tl_node_poi_get_info], tree3,0
  736.                 @@:
  737.                         cmp eax,0
  738.                         je .end_select
  739.                         mov ebx,eax
  740.                         cmp word[ebx],ID_ICON_POINT_SEL
  741.                         jne .next_sel1
  742.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  743.                                 mov edi,eax
  744.                                 mov eax,[eax]
  745.                                 mov [eax+8],edx
  746.                                 stdcall update_tree, edi
  747.                                 dec ecx
  748.                                 jz @f
  749.                         .next_sel1:
  750.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  751.                         jmp @b
  752.                 @@:
  753.     .end_select:
  754.         ret
  755. endp
  756.  
  757. align 4
  758. proc update_tree h_mem:dword
  759. pushad
  760.         mov edi,[h_mem]
  761.         mov ebx,[edi]
  762.         finit
  763.  
  764.         ;обновление измененного узла в списке tree3 и главного окна (по таймеру)
  765.         mov word[NumberSymbolsAD],5
  766.         mov dword[obj_point.text],0
  767.         cld
  768.         mov ecx,3
  769.         .coord:
  770.                 fld dword[ebx]
  771.                 fstp qword[Data_Double]
  772.                 call DoubleFloat_to_String
  773.                 add ebx,4
  774.                 stdcall str_len, Data_String
  775.                 mov esi,txt_space
  776.                 add esi,eax
  777.                 cmp esi,txt_space.end
  778.                 jl .normal_size
  779.                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  780.                 .normal_size:
  781.                 stdcall str_cat, obj_point.text,esi
  782.                 stdcall str_cat, obj_point.text,Data_String
  783.                 loop .coord
  784.         mov esi,obj_point.text
  785.         mov byte[esi],'*' ;отмечаем что вершина изменялась
  786.         mov byte[can_save],1 ;для показа кнопки 'Сохранить'
  787.         add edi,4
  788.         mov ecx,MAX_OBJECT_SIZE-4
  789.         rep movsb
  790. popad
  791.         ret
  792. endp
  793.  
  794. align 4
  795. angle_dxm dd 1.7775 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
  796. angle_dym dd 1.3335 ;~ 3d_wnd_h/180
  797. ratio dd 1.3333 ;~ 3d_wnd_w/3d_wnd_h
  798. cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
  799. capt_p dd 0
  800.  
  801. ;дерево с объектами в пользовательском файле
  802. tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
  803.         16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
  804.         w_scr_t3,get_point_coords
  805.  
  806. edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
  807. edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
  808. edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
  809. editboxes_end:
  810.  
  811. string1 rb 34
  812. string2 rb 34
  813. string3 rb 34
  814.  
  815. align 4
  816. w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1
  817.