Subversion Repositories Kolibri OS

Rev

Rev 5948 | Rev 6046 | 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. bit_vertexes equ 0
  16. bit_faces equ 1
  17. bit_faces_fill equ 2
  18. bit_light equ 3
  19.  
  20. ini_name db 'info3ds.ini',0
  21. ini_sec_w3d db 'Window 3d',0
  22. key_dv  db 'draw_vertices',0
  23. key_df  db 'draw_faces',0
  24. key_dff db 'draw_faces_fill',0
  25. key_dl  db 'draw_light',0
  26. key_ox  db 'col_ox',0
  27. key_oy  db 'col_oy',0
  28. key_oz  db 'col_oz',0
  29. key_bk  db 'col_bkgnd',0
  30. key_vert db 'col_vertices',0
  31. key_face db 'col_faces',0
  32. key_select db 'col_select',0
  33.  
  34. prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
  35.  
  36. txt_q db '?',0
  37. txt_space:
  38.         db SIZE_ONE_FLOAT dup(' ')
  39. .end:
  40.         db 0
  41.  
  42. rad_c dd 150 ;для вычисления радиуса
  43.  
  44. obj_point: ;добавляемый объект
  45.         dd 0   ;указатель
  46. .text:
  47.         rb MAX_OBJECT_SIZE
  48.  
  49. if lang eq ru
  50. txt_select_vert: db 'Выбрано: '
  51. else
  52. txt_select_vert: db 'Select: '
  53. end if
  54. .count:
  55. dq 0,0
  56.  
  57. ;даное окно (процесс) вызываеться функцией but_wnd_coords
  58. align 4
  59. prop_start:
  60. pushad
  61.         mcall 40,0x27 ;маска ожидаемых событий
  62.         inc byte[prop_wnd_run]
  63.         mov dword[w_scr_t3.type],1
  64.         call prop_wnd_clear_param
  65.  
  66.         stdcall [tl_node_get_data],tree1
  67.         xor edx,edx
  68.         mov dword[capt_p],txt_q
  69.         cmp eax,0
  70.         je .no_points
  71.                 mov ebx,[eax] ;получаем значение сдвига выбранного блока
  72.                 add ebx,[open_file_data]
  73.  
  74.                 cmp word[ebx],CHUNK_OBJBLOCK
  75.                 jne .end_oblo
  76.                         mov dword[capt_p],txt_4000
  77.                         stdcall found_block_data, tree1
  78.                         cmp eax,0
  79.                         je .no_points
  80.                         mov esi,eax
  81.                         movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
  82.                         .cycle_0:
  83.                                 stdcall [tl_node_poi_get_next_info], tree1,esi
  84.                                 cmp eax,0
  85.                                 je .no_points
  86.                                 cmp byte[eax+2],cl
  87.                                 jle .no_points
  88.                                 mov esi,eax
  89.                                 stdcall [tl_node_poi_get_data], tree1,esi
  90.                                 mov ebx,[eax]
  91.                                 add ebx,[open_file_data]
  92.                                 cmp word[ebx],CHUNK_VERTLIST
  93.                                 je .ini_vlist
  94.                                 jmp .cycle_0
  95.                         jmp .no_points
  96.                 .end_oblo:
  97.                 cmp word[ebx],CHUNK_TRIMESH
  98.                 jne .end_trim
  99.                         mov dword[capt_p],txt_4100
  100.                         stdcall found_block_data, tree1
  101.                         cmp eax,0
  102.                         je .no_points
  103.                         mov esi,eax
  104.                         movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
  105.                         .cycle_1:
  106.                                 stdcall [tl_node_poi_get_next_info], tree1,esi
  107.                                 cmp eax,0
  108.                                 je .no_points
  109.                                 cmp byte[eax+2],cl
  110.                                 jle .no_points
  111.                                 mov esi,eax
  112.                                 stdcall [tl_node_poi_get_data], tree1,esi
  113.                                 mov ebx,[eax]
  114.                                 add ebx,[open_file_data]
  115.                                 cmp word[ebx],CHUNK_VERTLIST
  116.                                 je .ini_vlist
  117.                                 jmp .cycle_1
  118.                         jmp .no_points
  119.                 .end_trim:
  120.                 cmp word[ebx],CHUNK_VERTLIST
  121.                 jne .end_vlist
  122.                         mov dword[capt_p],txt_4110
  123.                         .ini_vlist:
  124.                         movzx edx,word[ebx+6] ;колличество точек
  125.                         add ebx,8
  126.                         ;поиск данных для треугольков
  127.                         stdcall found_block_data, tree1
  128.                         cmp eax,0
  129.                         je .set_points
  130.                         mov esi,eax
  131.                         ;если нашли выбранный узел, то далее пытаемся найти узел с треугольниками
  132.                         movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
  133.                         .cycle_2:
  134.                                 stdcall [tl_node_poi_get_next_info], tree1,esi
  135.                                 cmp eax,0
  136.                                 je .set_points
  137.                                 mov esi,eax
  138.                                 stdcall [tl_node_poi_get_data], tree1,esi
  139.                                 cmp byte[esi+2],cl
  140.                                 jl .set_points
  141.                                 je .found
  142.                                 jmp .cycle_2
  143.                         .found: ;если нашли узел тогоже уровня что и выбранный узел
  144.                                 cmp eax,0
  145.                                 je .set_points
  146.                                 mov eax,[eax]
  147.                                 add eax,[open_file_data]
  148.                                 cmp word[eax],CHUNK_FACELIST
  149.                                 jne .cycle_2
  150.                                 movzx ecx,word[eax+6]
  151.                                 mov [obj_tri_count],ecx
  152.                                 add eax,8 ;2+4+2 (chunk+size+count)
  153.                                 mov [obj_tri_data],eax
  154.                         jmp .set_points
  155.                 .end_vlist:
  156.                 cmp word[ebx],CHUNK_TRACKPIVOT
  157.                 jne @f
  158.                         inc edx
  159.                         add ebx,6
  160.                         mov dword[capt_p],txt_b013
  161.                         jmp .set_points
  162.                 @@:
  163.                 cmp word[ebx],0xb014
  164.                 jne @f
  165.                         mov edx,2
  166.                         add ebx,6
  167.                         mov dword[capt_p],txt_b014
  168.                         ;jmp .set_points
  169.                 @@:
  170.                 .set_points:
  171.                 mov [obj_poi_data],ebx
  172.                 mov [obj_poi_count],edx
  173.         .no_points:
  174.  
  175.         ;настройка списка объектов
  176.         mov dword[tree3.info_max_count],2
  177.         add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
  178.         stdcall dword[tl_data_init], tree3
  179.         mov eax,dword[icon_tl_sys]
  180.         mov dword[tree3.data_img_sys],eax
  181.         mov eax,dword[icon_toolbar]
  182.         mov dword[tree3.data_img],eax
  183.  
  184.         cmp edx,0
  185.         je .no_object
  186.                 mov word[NumberSymbolsAD],5
  187.                 finit
  188.                 .new_point:
  189.                         mov dword[obj_point],ebx
  190.                         mov dword[obj_point.text],0
  191.                         cld
  192.                         mov ecx,3
  193.                         @@:
  194.                                 fld dword[ebx]
  195.                                 fstp qword[Data_Double]
  196.                                 call DoubleFloat_to_String
  197.                                 add ebx,4
  198.                                 stdcall str_len, Data_String
  199.                                 mov esi,txt_space
  200.                                 add esi,eax
  201.                                 cmp esi,txt_space.end
  202.                                 jl .normal_size
  203.                                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  204.                                 .normal_size:
  205.                                 stdcall str_cat, obj_point.text,esi
  206.                                 stdcall str_cat, obj_point.text,Data_String
  207.                                 loop @b
  208.                         stdcall dword[tl_node_add], tree3,(ID_ICON_POINT shl 16),obj_point
  209.                         stdcall dword[tl_cur_next], tree3
  210.                         dec edx
  211.                         cmp edx,0
  212.                         jg .new_point
  213.                         stdcall dword[tl_cur_beg], tree3
  214.         .no_object:
  215.         call obj_set_sizes
  216.         call obj_set_normals
  217.         edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
  218.         stdcall [edit_box_set_text], edit1, txt_q
  219.         stdcall [edit_box_set_text], edit2, txt_q
  220.         stdcall [edit_box_set_text], edit3, txt_q
  221.         mov eax,0xc0c0c0
  222.         mov ebx,[color_ox]
  223.         shr ebx,2
  224.         and ebx,0x3f3f3f
  225.         add eax,ebx
  226.         mov [edit1.color],eax
  227.         mov eax,0xc0c0c0
  228.         mov ebx,[color_oy]
  229.         shr ebx,2
  230.         and ebx,0x3f3f3f
  231.         add eax,ebx
  232.         mov [edit2.color],eax
  233.         mov eax,0xc0c0c0
  234.         mov ebx,[color_oz]
  235.         shr ebx,2
  236.         and ebx,0x3f3f3f
  237.         add eax,ebx
  238.         mov [edit3.color],eax
  239.  
  240.         mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
  241.         mov eax,[eax] ;eax -> ZBuffer
  242.         mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
  243.         mov dword[buf_ogl],eax
  244. popad
  245.  
  246.         call prop_red_win
  247.  
  248. ;не отрывать эту функцию от предыдущей
  249. align 4
  250. prop_still:
  251.         pushad
  252.  
  253.         mcall 23,10
  254.         or eax,eax
  255.         jnz @f
  256.                 call prop_timer_funct
  257.                 jmp .end
  258.         @@:
  259.  
  260.         cmp al,1 ;изм. положение окна
  261.         jne @f
  262.                 call prop_red_win
  263.                 jmp .end
  264.         @@:
  265.         cmp al,2
  266.         jne @f
  267.                 call prop_key
  268.                 jmp .end
  269.         @@:
  270.         cmp al,3
  271.         jz prop_button
  272.         cmp al,6
  273.         jne @f
  274.                 call prop_mouse
  275.         @@:
  276. .end:
  277.         popad
  278.         jmp prop_still
  279.  
  280. align 4
  281. prop_red_win:
  282. pushad
  283.         mcall 12,1
  284.  
  285.         xor eax,eax
  286.         mov edi,dword[capt_p] ;children window caption
  287.         mov bx,word[procinfo.box.left]
  288.         add bx,word[buf_0.l]
  289.         add bx,5 ;ширина боковой рамки
  290.         shl ebx,16
  291.         mov bx,prop_wnd_width
  292.         mov cx,word[procinfo.box.top]
  293.         add cx,word[buf_0.t]
  294.         shl ecx,16
  295.         mov cx,prop_wnd_height
  296.         mov edx,[sc.work]
  297.         or  edx,0x33000000
  298.         int 0x40
  299.  
  300.         mov esi,[sc.work_button]
  301.         mcall 8, (5 shl 16)+20, (266 shl 16)+20, 3
  302.         mcall , (30 shl 16)+20, (266 shl 16)+20, 4
  303.  
  304.         mov ebx,[image_data_toolbar]
  305.         add ebx,3*IMAGE_TOOLBAR_ICON_SIZE
  306.         mcall 7, , (16 shl 16)+16, (7 shl 16)+268 ;load
  307.  
  308.         sub ebx,IMAGE_TOOLBAR_ICON_SIZE
  309.         mov edx,(32 shl 16)+268 ;save
  310.         int 0x40
  311.  
  312.         mov dword[w_scr_t3.all_redraw],1
  313.         stdcall [scrollbar_ver_draw],dword w_scr_t3
  314.         stdcall [tl_draw], tree3
  315.         stdcall [edit_box_draw], edit1
  316.         stdcall [edit_box_draw], edit2
  317.         stdcall [edit_box_draw], edit3
  318.  
  319.         stdcall [kmainmenu_draw], [main_menu]
  320.         call draw_3d
  321.         mcall 12,2
  322. popad
  323.         ret
  324.  
  325. ;установка всех основных переменных по умолчанию
  326. align 4
  327. prop_wnd_clear_param:
  328.         ;установка параметров отображения
  329.         call mnu_reset_settings
  330.  
  331.         ;обнуление указателей на данные объектов
  332.         mov dword[obj_poi_data],0
  333.         mov dword[obj_poi_count],0
  334.         mov dword[obj_poi_sel_c],0
  335.         mov dword[obj_tri_data],0
  336.         mov dword[obj_tri_count],0
  337.         mov dword[obj_normals_tri_count],0
  338.         mov dword[obj_normals_poi_count],0
  339.         stdcall mem.Free,[obj_normals_tri_data]
  340.         stdcall mem.Free,[obj_normals_poi_data]
  341.         mov dword[obj_normals_tri_data],0
  342.         mov dword[obj_normals_poi_data],0
  343.         ret
  344.  
  345. ;поиск данных
  346. ;input:
  347. ;eax - текущий узел
  348. ;output:
  349. ;eax - структура текущего узла (или 0 при неудаче)
  350. align 4
  351. proc found_block_data uses ebx ecx edx, tlist:dword
  352.         mov edx,[tlist]
  353.         mov ecx,eax
  354.         stdcall [tl_node_poi_get_info], edx,0
  355.         @@:
  356.                 mov ebx,eax
  357.                 stdcall [tl_node_poi_get_data], edx,ebx
  358.                 cmp eax,ecx
  359.                 je @f ;если попали на выбранный узел
  360.                 stdcall [tl_node_poi_get_next_info], edx,ebx
  361.                 cmp eax,0
  362.                 jne @b
  363.                 jmp .end
  364.         @@:
  365.                 mov eax,ebx
  366.         .end:
  367.         ret
  368. endp
  369.  
  370. ;установка размеров объекта
  371. align 4
  372. proc obj_set_sizes uses eax ebx esi
  373.         cmp dword[obj_poi_count],0
  374.         je .end
  375.                 finit
  376.                 mov eax,[obj_poi_data]
  377.                 mov ebx,dword[eax]
  378.                 mov [obj_x_min],ebx
  379.                 mov [obj_x_max],ebx
  380.                 mov ebx,dword[eax+4]
  381.                 mov [obj_y_min],ebx
  382.                 mov [obj_y_max],ebx
  383.                 mov ebx,dword[eax+8]
  384.                 mov [obj_z_min],ebx
  385.                 mov [obj_z_max],ebx
  386.  
  387.         mov ebx,[obj_poi_data]
  388.         mov esi,[obj_poi_count]
  389. align 4
  390.         .cycle_0: ;работа с координатой x
  391.                 fld dword[ebx]
  392.                 fld dword[obj_x_min]
  393.                 fcomp
  394.                 fstsw ax
  395.                 sahf
  396.                 jb @f
  397.                         mov eax,[ebx]
  398.                         mov [obj_x_min],eax
  399.                         ffree st0
  400.                         fincstp
  401.                         jmp .next_x
  402.                 @@:
  403.                 fld dword[obj_x_max]
  404.                 fcompp
  405.                 fstsw ax
  406.                 sahf
  407.                 ja .next_x
  408.                         mov eax,[ebx]
  409.                         mov [obj_x_max],eax
  410.                 .next_x:
  411.  
  412.                 add ebx,12
  413.                 dec esi
  414.                 jnz .cycle_0
  415.  
  416.                 fld1
  417.                 fld dword[obj_x_max]
  418.                 fsub dword[obj_x_min]
  419.                 fst dword[obj_x_centr]
  420.                 fdivp ;1/size.x
  421.                 fstp dword[obj_x_scale]
  422.  
  423.                 fld dword[obj_x_centr]
  424.                 fld1
  425.                 fld1
  426.                 faddp
  427.                 fdivp ;centr.x = size.x/2
  428.                 fadd dword[obj_x_min]
  429.                 fchs
  430.                 fstp dword[obj_x_centr]
  431.  
  432.         mov ebx,[obj_poi_data]
  433.         mov esi,[obj_poi_count]
  434. align 4
  435.         .cycle_1: ;работа с координатой y
  436.                 fld dword[ebx+4]
  437.                 fld dword[obj_y_min]
  438.                 fcomp
  439.                 fstsw ax
  440.                 sahf
  441.                 jb @f
  442.                         mov eax,[ebx+4]
  443.                         mov [obj_y_min],eax
  444.                         ffree st0
  445.                         fincstp
  446.                         jmp .next_y
  447.                 @@:
  448.                 fld dword[obj_y_max]
  449.                 fcompp
  450.                 fstsw ax
  451.                 sahf
  452.                 ja .next_y
  453.                         mov eax,[ebx+4]
  454.                         mov [obj_y_max],eax
  455.                 .next_y:
  456.  
  457.                 add ebx,12
  458.                 dec esi
  459.                 jnz .cycle_1
  460.  
  461.                 fld1
  462.                 fld dword[obj_y_max]
  463.                 fsub dword[obj_y_min]
  464.                 fst dword[obj_y_centr]
  465.                 fdivp ;1/size.y
  466.                 fstp dword[obj_y_scale]
  467.  
  468.                 fld dword[obj_y_centr]
  469.                 fld1
  470.                 fld1
  471.                 faddp
  472.                 fdivp ;centr.y = size.y/2
  473.                 fadd dword[obj_y_min]
  474.                 fchs
  475.                 fstp dword[obj_y_centr]
  476.  
  477.         mov ebx,[obj_poi_data]
  478.         mov esi,[obj_poi_count]
  479. align 4
  480.         .cycle_2: ;работа с координатой z
  481.                 fld dword[ebx+8]
  482.                 fld dword[obj_z_min]
  483.                 fcomp
  484.                 fstsw ax
  485.                 sahf
  486.                 jb @f
  487.                         mov eax,[ebx+8]
  488.                         mov [obj_z_min],eax
  489.                         ffree st0
  490.                         fincstp
  491.                         jmp .next_z
  492.                 @@:
  493.                 fld dword[obj_z_max]
  494.                 fcompp
  495.                 fstsw ax
  496.                 sahf
  497.                 ja .next_z
  498.                         mov eax,[ebx+8]
  499.                         mov [obj_z_max],eax
  500.                 .next_z:
  501.  
  502.                 add ebx,12
  503.                 dec esi
  504.                 jnz .cycle_2
  505.  
  506.                 fld1
  507.                 fld dword[obj_z_max]
  508.                 fsub dword[obj_z_min]
  509.                 fst dword[obj_z_centr]
  510.                 fdivp ;1/size.z
  511.                 fstp dword[obj_z_scale]
  512.  
  513.                 fld dword[obj_z_centr]
  514.                 fld1
  515.                 fld1
  516.                 faddp
  517.                 fdivp ;centr.z = size.z/2
  518.                 fadd dword[obj_z_min]
  519.                 fchs
  520.                 fstp dword[obj_z_centr]
  521.  
  522.                 ;находим радиус для сферы
  523.                 fld dword[obj_x_max]
  524.                 fsub dword[obj_x_min]
  525.                 fld dword[obj_y_max]
  526.                 fsub dword[obj_y_min]
  527.                 faddp
  528.                 fild dword[rad_c]
  529.                 fdivp ;radius=(size.x+size.y)/rad_c
  530.                 fstp dword[sph_radius]
  531.  
  532.         ;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
  533.         fld dword[obj_y_scale]
  534.         fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
  535.         fcomp dword[obj_x_scale]
  536.         fstsw ax
  537.         sahf
  538.         jb @f
  539.                 ;сжатие масштаба по y
  540.                 fld dword[obj_x_scale]
  541.                 fmul dword[ratio]
  542.                 fstp dword[obj_y_scale] ;масштаб по оси y = масштаб по оси x
  543.                 jmp .end
  544.         @@:
  545.                 ;сжатие масштаба по x >...<
  546.                 fld     dword[obj_x_scale]
  547.                 fdiv dword[ratio]
  548.                 fstp dword[obj_x_scale]
  549.         .end:
  550.         ret
  551. endp
  552.  
  553. ;установка нормалей для граней
  554. align 4
  555. proc obj_set_normals
  556. locals
  557.         tbl1 rd 9 ;ebp-72
  558.         tbl2 rd 9 ;ebp-36
  559. endl
  560. pushad
  561.         cmp dword[obj_poi_count],0
  562.         je .end
  563.                 finit
  564.                 mov ecx,[obj_tri_count]
  565.                 mov [obj_normals_tri_count],ecx ;на каждый треугольник 1 нармаль
  566.                 cmp ecx,0
  567.                 je .end
  568.                 imul ecx,12
  569.                 stdcall mem.Alloc, ecx
  570.                 mov [obj_normals_tri_data],eax
  571.  
  572.                 mov edx,[obj_tri_data]
  573.                 mov ebx,[obj_tri_count]
  574. align 4
  575.                 @@:
  576.                         mov edi,ebp
  577.                         sub edi,36 ;tbl2
  578.                         movzx esi,word[edx] ;1-я вершина
  579.                         imul esi,12
  580.                         add esi,[obj_poi_data]
  581.                         mov ecx,3
  582.                         rep movsd
  583.                         movzx esi,word[edx+2] ;2-я вершина
  584.                         imul esi,12
  585.                         add esi,[obj_poi_data]
  586.                         mov ecx,3
  587.                         rep movsd
  588.                         movzx esi,word[edx+4] ;3-я вершина
  589.                         imul esi,12
  590.                         add esi,[obj_poi_data]
  591.                         mov ecx,3
  592.                         rep movsd
  593.  
  594.                         mov esi,ebp
  595.                         sub esi,72 ;tbl1
  596.                         sub edi,36 ;tbl2
  597.                         ;v1 <-> v2
  598.                         fld dword[edi+12]
  599.                         fsub dword[edi]
  600.                         fstp dword[esi] ;(x1-x2)
  601.                         fld dword[edi+16]
  602.                         fsub dword[edi+4]
  603.                         fstp dword[esi+4] ;(y1-y2)
  604.                         fld dword[edi+20]
  605.                         fsub dword[edi+8]
  606.                         fstp dword[esi+8] ;(z1-z2)
  607.                         ;v2 <-> v3
  608.                         fld dword[edi+24]
  609.                         fsub dword[edi+12]
  610.                         fstp dword[esi+12] ;(x2-x3)
  611.                         fld dword[edi+28]
  612.                         fsub dword[edi+16]
  613.                         fstp dword[esi+16] ;(y2-y3)
  614.                         fld dword[edi+32]
  615.                         fsub dword[edi+20]
  616.                         fstp dword[esi+20] ;(z2-z3)
  617.                         ;v3 <-> v1
  618.                         fld dword[edi]
  619.                         fsub dword[edi+24]
  620.                         fstp dword[esi+24] ;(x3-x1)
  621.                         fld dword[edi+4]
  622.                         fsub dword[edi+28]
  623.                         fstp dword[esi+28] ;(y3-y1)
  624.                         fld dword[edi+8]
  625.                         fsub dword[edi+32]
  626.                         fstp dword[esi+32] ;(z3-z1)
  627.  
  628.                         ;a1,a2,a3
  629.                         fld dword[esi+4]
  630.                         fmul dword[esi+8]
  631.                         fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
  632.                         fld dword[esi+16]
  633.                         fmul dword[esi+20]
  634.                         fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
  635.                         fld dword[esi+28]
  636.                         fmul dword[esi+32]
  637.                         fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
  638.                         ;b1,b2,b3
  639.                         fld dword[esi]
  640.                         fmul dword[esi+8]
  641.                         fstp dword[edi] ;b1=(x1-x2)*(z1-z2)
  642.                         fld dword[esi+12]
  643.                         fmul dword[esi+20]
  644.                         fstp dword[edi+4] ;b2=(x2-x3)*(z2-z3)
  645.                         fld dword[esi+24]
  646.                         fmul dword[esi+32]
  647.                         fstp dword[edi+8] ;b3=(x3-x1)*(z3-z1)
  648.                         ;c1,с2,с3
  649.                         fld dword[esi]
  650.                         fmul dword[esi+4]
  651.                         fstp dword[edi] ;c1=(x1-x2)*(y1-y2)
  652.                         fld dword[esi+12]
  653.                         fmul dword[esi+16]
  654.                         fstp dword[edi+4] ;c2=(x2-x3)*(y2-y3)
  655.                         fld dword[esi+24]
  656.                         fmul dword[esi+28]
  657.                         fstp dword[edi+8] ;c3=(x3-x1)*(y3-y1)
  658.                        
  659.                         fld dword[edi]
  660.                         fadd dword[edi+4]
  661.                         fadd dword[edi+8]
  662.                         fstp dword[eax] ;set normal.a
  663.                         fld dword[edi+12]
  664.                         fadd dword[edi+16]
  665.                         fadd dword[edi+20]
  666.                         fstp dword[eax+4] ;set normal.b
  667.                         fld dword[edi+24]
  668.                         fadd dword[edi+28]
  669.                         fadd dword[edi+32]
  670.                         fstp dword[eax+8] ;set normal.c
  671.                        
  672.                         add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
  673.                         add eax,12
  674.                         dec ebx
  675.                         jnz @b
  676.         .end:
  677. popad
  678.         ret
  679. endp
  680.  
  681. ;рисование точек в 3d
  682. align 4
  683. draw_3d:
  684.         cmp dword[obj_poi_count],2
  685.         jl .end_f
  686.         stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
  687.         stdcall [glPushMatrix]
  688.         bt dword[draw_mode],bit_light
  689.         jnc @f
  690.                 call SetLight
  691.                 jmp .end_l
  692.         @@:
  693.                 stdcall [glDisable],GL_LIGHTING
  694.         .end_l:
  695.         stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
  696.         stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
  697.         stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
  698.         stdcall [glRotatef], [angle_z],0.0,0.0,1.0
  699.         stdcall [glRotatef], [angle_y],0.0,1.0,0.0
  700.         stdcall [glRotatef], [angle_x],1.0,0.0,0.0
  701.         stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
  702.  
  703.         ;рисование точек
  704.         bt dword[draw_mode],bit_vertexes
  705.         jnc .end_points
  706.                 stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
  707.                 stdcall [glBegin],GL_POINTS
  708.                 mov eax,[obj_poi_data]
  709.                 mov ebx,[obj_poi_count]
  710.                 @@:
  711.                         stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  712.                         add eax,12
  713.                         dec ebx
  714.                         jnz @b
  715.                 stdcall [glEnd]
  716.         .end_points:
  717.  
  718.         ;рисование активной точки
  719.         stdcall [tl_node_get_data],tree3
  720.         cmp eax,0
  721.         je @f
  722.                 ;выделение активной точки
  723.                 mov eax,[eax]
  724.  
  725.                 stdcall [glBegin],GL_LINES
  726.                 stdcall [glColor3ub],[color_ox+2],[color_ox+1],[color_ox]
  727.                 stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
  728.                 stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
  729.                 stdcall [glColor3ub],[color_oy+2],[color_oy+1],[color_oy]
  730.                 stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
  731.                 stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
  732.                 stdcall [glColor3ub],[color_oz+2],[color_oz+1],[color_oz]
  733.                 stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
  734.                 stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
  735.                 stdcall [glEnd]
  736.  
  737.                 stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
  738.                 stdcall [glPushMatrix]
  739.                         stdcall [glTranslatef], [eax],[eax+4],[eax+8]
  740.                         stdcall [gluSphere], [qObj], [sph_radius], 8,8
  741.                 stdcall [glPopMatrix]
  742.         @@:
  743.  
  744.         ;рисование выделенных точек
  745.         cmp dword[obj_poi_sel_c],0
  746.         je .end_select
  747.                 mov ecx,dword[obj_poi_sel_c]
  748.                 stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
  749.                 stdcall dword[tl_node_poi_get_info], tree3,0
  750.                 @@:
  751.                         cmp eax,0
  752.                         je .end_select
  753.                         mov ebx,eax
  754.                         cmp word[ebx],ID_ICON_POINT_SEL
  755.                         jne .next_sel
  756.                         stdcall [tl_node_poi_get_data], tree3,ebx
  757.                         mov eax,[eax]
  758.                         stdcall [glPushMatrix]
  759.                                 stdcall [glTranslatef], [eax],[eax+4],[eax+8]
  760.                                 stdcall [gluSphere], [qObj], [sph_radius], 4,4
  761.                         stdcall [glPopMatrix]
  762.                         dec ecx
  763.                         jz .end_select
  764.                         .next_sel:
  765.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  766.                         jmp @b
  767.     .end_select:
  768.  
  769.         ;рисование граней
  770.         bt dword[draw_mode],bit_faces
  771.         jnc .end_triangles
  772.         cmp dword[obj_tri_count],0
  773.         je .end_triangles
  774.         cmp dword[obj_poi_count],0
  775.         je .end_triangles
  776.                 bt dword[draw_mode],bit_faces_fill
  777.                 jc @f
  778.                         push GL_LINE
  779.                         jmp .end_0
  780.                 @@:
  781.                         push GL_FILL
  782.                 .end_0:
  783.                 stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
  784.                 stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
  785.                 stdcall [glBegin],GL_TRIANGLES
  786.                 mov eax,[obj_tri_data]
  787.                 mov ecx,[obj_tri_count]
  788.                 mov edx,[obj_normals_tri_data]
  789.                 @@:
  790.                         ;
  791.                         bt dword[draw_mode],bit_light
  792.                         jnc .norm
  793.                                 ;[obj_normals_tri_count]
  794.                                 stdcall [glNormal3fv], edx
  795.                                 add edx,12
  796.                         .norm:
  797.                         ;
  798.                         movzx ebx,word[eax] ;1-я вершина
  799.                         imul ebx,12
  800.                         add ebx,[obj_poi_data]
  801.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  802.                         movzx ebx,word[eax+2] ;2-я вершина
  803.                         imul ebx,12
  804.                         add ebx,[obj_poi_data]
  805.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  806.                         movzx ebx,word[eax+4] ;3-я вершина
  807.                         imul ebx,12
  808.                         add ebx,[obj_poi_data]
  809.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  810.                         add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
  811.                         dec ecx
  812.                         jnz @b
  813.                 stdcall [glEnd]
  814.         .end_triangles:
  815.  
  816.         stdcall [glPopMatrix]
  817.         cmp dword[obj_poi_sel_c],0
  818.         je @f
  819.                 stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
  820.         @@:
  821.         stdcall [kosglSwapBuffers]
  822.         .end_f:
  823.         ret
  824.  
  825. align 4
  826. SetLight:
  827.         stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
  828.         stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
  829.  
  830.         stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
  831.         stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
  832.  
  833.         stdcall [glEnable], GL_COLOR_MATERIAL
  834.         stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
  835.         stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
  836.         stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
  837.         stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
  838.  
  839.         stdcall [glEnable],GL_LIGHTING
  840.         stdcall [glEnable],GL_LIGHT0
  841.         ret
  842.  
  843. align 4
  844. proc prop_key uses eax ebx
  845.         mcall 2
  846.  
  847.         test word [edit1.flags],10b ;ed_focus
  848.         je @f
  849.                 stdcall [edit_box_key], edit1
  850.                 jmp .end
  851.         @@:
  852.         test word [edit2.flags],10b
  853.         je @f
  854.                 stdcall [edit_box_key], edit2
  855.                 jmp .end
  856.         @@:
  857.         test word [edit3.flags],10b
  858.         je @f
  859.                 stdcall [edit_box_key], edit3
  860.                 jmp .end
  861.         @@:
  862.         cmp dword[el_focus], tree3
  863.         jne @f
  864.                 stdcall [tl_key], tree3
  865.                 jmp .end
  866.         @@:
  867.  
  868.         cmp ah,178 ;Up
  869.         jne @f
  870.                 fld dword[angle_x]
  871.                 fadd dword[delt_size]
  872.                 fstp dword[angle_x]
  873.                 call draw_3d
  874.                 jmp .end
  875.         @@:
  876.         cmp ah,177 ;Down
  877.         jne @f
  878.                 fld dword[angle_x]
  879.                 fsub dword[delt_size]
  880.                 fstp dword[angle_x]
  881.                 call draw_3d
  882.                 jmp .end
  883.         @@:
  884.         cmp ah,176 ;Left
  885.         jne @f
  886.                 fld dword[angle_y]
  887.                 fadd dword[delt_size]
  888.                 fstp dword[angle_y]
  889.                 call draw_3d
  890.                 jmp .end
  891.         @@:
  892.         cmp ah,179 ;Right
  893.         jne @f
  894.                 fld dword[angle_y]
  895.                 fsub dword[delt_size]
  896.                 fstp dword[angle_y]
  897.                 call draw_3d
  898.                 ;jmp .end
  899.         @@:
  900.         .end:
  901.         ret
  902. endp
  903.  
  904. align 4
  905. prop_mouse:
  906.         push eax ebx
  907.         mcall 37,3
  908.         bt eax,0
  909.         jnc .end_m
  910.                 ;mouse l. but. move
  911.                 cmp dword[mouse_drag],1
  912.                 jne .end_m
  913.                 mcall 37,1 ;get mouse coords
  914.                 mov ebx,eax
  915.                 shr ebx,16 ;mouse.x
  916.                 cmp ebx,3d_wnd_l
  917.                 jg @f
  918.                         mov ebx,3d_wnd_l
  919.                 @@:
  920.                 sub ebx,3d_wnd_l
  921.                 cmp ebx,3d_wnd_w
  922.                 jle @f
  923.                         mov ebx,3d_wnd_w
  924.                 @@:
  925.                 and eax,0xffff ;mouse.y
  926.                 cmp eax,3d_wnd_t
  927.                 jg @f
  928.                         mov eax,3d_wnd_t
  929.                 @@:
  930.                 sub eax,3d_wnd_t
  931.                 cmp eax,3d_wnd_h
  932.                 jle @f
  933.                         mov eax,3d_wnd_h
  934.                 @@:
  935.                 finit
  936.                 fild dword[mouse_y]
  937.                 mov [mouse_y],eax
  938.                 fisub dword[mouse_y]
  939.                 fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
  940.                 fadd dword[angle_x]
  941.                 fstp dword[angle_x]
  942.  
  943.                 fild dword[mouse_x]
  944.                 mov [mouse_x],ebx
  945.                 fisub dword[mouse_x]
  946.                 fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
  947.                 fadd dword[angle_y]
  948.                 fstp dword[angle_y]
  949.  
  950.                 call draw_3d
  951.                 jmp .end_d
  952.         .end_m:
  953.         bt eax,16
  954.         jnc @f
  955.                 ;mouse l. but. up
  956.                 mov dword[mouse_drag],0
  957.                 jmp .end_d
  958.         @@:
  959.         bt eax,8
  960.         jnc .end_d
  961.                 ;mouse l. but. press
  962.                 mcall 37,1 ;get mouse coords
  963.                 mov ebx,eax
  964.                 shr ebx,16 ;mouse.x
  965.                 cmp ebx,3d_wnd_l
  966.                 jl .end_d
  967.                 sub ebx,3d_wnd_l
  968.                 cmp ebx,3d_wnd_w
  969.                 jg .end_d
  970.                 and eax,0xffff ;mouse.y
  971.                 cmp eax,3d_wnd_t
  972.                 jl .end_d
  973.                 sub eax,3d_wnd_t
  974.                 cmp eax,3d_wnd_h
  975.                 jg .end_d
  976.                 mov dword[mouse_drag],1
  977.                 mov dword[mouse_x],ebx
  978.                 mov dword[mouse_y],eax
  979.         .end_d:
  980.  
  981.         stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
  982.         stdcall [tl_mouse], tree3
  983.         stdcall [edit_box_mouse], edit1
  984.         stdcall [edit_box_mouse], edit2
  985.         stdcall [edit_box_mouse], edit3
  986.         pop ebx eax
  987.         ret
  988.  
  989. align 4
  990. prop_button:
  991.         mcall 17 ;получить код нажатой кнопки
  992.  
  993.         cmp ah,3
  994.         jne @f
  995.                 call get_point_coords
  996.                 call draw_3d
  997.                 jmp prop_still.end
  998.         @@:
  999.         cmp ah,4
  1000.         jne @f
  1001.                 push eax ebx ecx edi esi
  1002.                 stdcall [tl_node_get_data],tree3
  1003.                 cmp eax,0
  1004.                 je .no_select_1
  1005.                         mov ebx,[eax]
  1006.                         finit
  1007.  
  1008.                         mov esi,string1
  1009.                         mov edi,Data_String
  1010.                         cld
  1011.                         mov ecx,8
  1012.                         rep movsd
  1013.                         call String_to_DoubleFloat
  1014.                         fld  qword[Data_Double] ;считываем как double
  1015.                         fstp dword[ebx] ;сохраняем как float
  1016.  
  1017.                         mov esi,string2
  1018.                         mov edi,Data_String
  1019.                         cld
  1020.                         mov ecx,8
  1021.                         rep movsd
  1022.                         call String_to_DoubleFloat
  1023.                         fld  qword[Data_Double] ;считываем как double
  1024.                         fstp dword[ebx+4] ;сохраняем как float
  1025.  
  1026.                         mov esi,string3
  1027.                         mov edi,Data_String
  1028.                         cld
  1029.                         mov ecx,8
  1030.                         rep movsd
  1031.                         call String_to_DoubleFloat
  1032.                         fld  qword[Data_Double] ;считываем как double
  1033.                         fstp dword[ebx+8] ;сохраняем как float
  1034.  
  1035.                         ;обновление измененного узла в списке tree3 и главного окна (по таймеру)
  1036.                         mov word[NumberSymbolsAD],5
  1037.                         mov dword[obj_point],ebx
  1038.                         mov dword[obj_point.text],0
  1039.                         cld
  1040.                         mov ecx,3
  1041.                         .coord:
  1042.                                 fld dword[ebx]
  1043.                                 fstp qword[Data_Double]
  1044.                                 call DoubleFloat_to_String
  1045.                                 add ebx,4
  1046.                                 stdcall str_len, Data_String
  1047.                                 mov esi,txt_space
  1048.                                 add esi,eax
  1049.                                 cmp esi,txt_space.end
  1050.                                 jl .normal_size
  1051.                                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  1052.                                 .normal_size:
  1053.                                 stdcall str_cat, obj_point.text,esi
  1054.                                 stdcall str_cat, obj_point.text,Data_String
  1055.                                 loop .coord
  1056.                         mov byte[obj_point.text],'*' ;отмечаем что вершина изменялась
  1057.                         stdcall dword[tl_node_set_data], tree3,obj_point
  1058.                         stdcall dword[tl_draw], tree3
  1059.                         mov byte[can_save],1 ;для показа кнопки 'Сохранить'
  1060.                         mov dword[offs_last_timer],0 ;для обновления блока в таймере
  1061.                         call draw_3d
  1062.                 .no_select_1:
  1063.                 pop esi edi ecx ebx eax
  1064.                 jmp prop_still.end
  1065.         @@:
  1066.         cmp ah,5
  1067.         jne @f
  1068.                 call mnu_vertexes_on_off
  1069.                 jmp prop_still.end
  1070.         @@:
  1071.         cmp ah,6
  1072.         jne @f
  1073.                 call mnu_faces_on_off
  1074.                 jmp prop_still.end
  1075.         @@:
  1076.         cmp ah,7
  1077.         jne @f
  1078.                 call mnu_faces_fill_on_off
  1079.                 jmp prop_still.end
  1080.         @@:
  1081.         cmp ah,8
  1082.         jne @f
  1083.                 call mnu_light_on_off
  1084.                 jmp prop_still.end
  1085.         @@:
  1086.         cmp ah,9
  1087.         jne @f
  1088.                 call mnu_reset_settings
  1089.                 jmp prop_still.end
  1090.         @@:
  1091.         cmp ah,10
  1092.         jne @f
  1093.                 call mnu_vertexes_select
  1094.                 jmp prop_still.end
  1095.         @@:
  1096.         cmp ah,11
  1097.         jne @f
  1098.                 call mnu_vertexes_deselect
  1099.                 jmp prop_still.end
  1100.         @@:
  1101.         cmp ah,12
  1102.         jne @f
  1103.                 call mnu_reset_average_x
  1104.                 jmp prop_still.end
  1105.         @@:
  1106.         cmp ah,13
  1107.         jne @f
  1108.                 call mnu_reset_average_y
  1109.                 jmp prop_still.end
  1110.         @@:
  1111.         cmp ah,14
  1112.         jne @f
  1113.                 call mnu_reset_average_z
  1114.                 jmp prop_still.end
  1115.         @@:
  1116.  
  1117.         cmp ah,1
  1118.         jne prop_still.end
  1119. .exit:
  1120.         mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
  1121.         mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
  1122.         stdcall dword[tl_data_clear], tree3
  1123.         stdcall mem.Free,[obj_normals_tri_data]
  1124.         stdcall mem.Free,[obj_normals_poi_data]
  1125.         mov dword[obj_normals_tri_data],0
  1126.         mov dword[obj_normals_poi_data],0
  1127.         mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
  1128.         mcall -1 ;выход из программы
  1129.  
  1130. align 4
  1131. get_point_coords:
  1132.         ;загрузка координат в editbox-ы
  1133.         push eax ebx
  1134.         stdcall [tl_node_get_data],tree3
  1135.         cmp eax,0
  1136.         je @f
  1137.                 mov ebx,[eax]
  1138.                 mov word[NumberSymbolsAD],8
  1139.                 finit
  1140.                 fld dword[ebx]
  1141.                 fstp qword[Data_Double]
  1142.                 call DoubleFloat_to_String
  1143.                 stdcall [edit_box_set_text], edit1, Data_String
  1144.                 fld dword[ebx+4]
  1145.                 fstp qword[Data_Double]
  1146.                 call DoubleFloat_to_String
  1147.                 stdcall [edit_box_set_text], edit2, Data_String
  1148.                 fld dword[ebx+8]
  1149.                 fstp qword[Data_Double]
  1150.                 call DoubleFloat_to_String
  1151.                 stdcall [edit_box_set_text], edit3, Data_String
  1152.                 stdcall [edit_box_draw], edit1
  1153.                 stdcall [edit_box_draw], edit2
  1154.                 stdcall [edit_box_draw], edit3
  1155.         @@:
  1156.         pop ebx eax
  1157.         ret
  1158.  
  1159. align 4
  1160. proc prop_timer_funct uses eax
  1161.         ;просматриваем выделенную координату
  1162.         stdcall [tl_node_get_data],tree3
  1163.         cmp [cursor_last_draw],eax
  1164.         je @f
  1165.                 mov [cursor_last_draw],eax
  1166.                 call draw_3d
  1167.         @@:
  1168.         ret
  1169. endp
  1170.  
  1171. ;изменяем режим рисования вершин
  1172. align 4
  1173. mnu_vertexes_on_off:
  1174.         xor dword[draw_mode], 1 shl bit_vertexes
  1175.         ret
  1176.  
  1177. ;изменяем режим рисования граней
  1178. align 4
  1179. mnu_faces_on_off:
  1180.         xor dword[draw_mode], 1 shl bit_faces
  1181.         ret
  1182.  
  1183. ;изменяем каркасные или сплошные грани
  1184. align 4
  1185. mnu_faces_fill_on_off:
  1186.         xor dword[draw_mode], 1 shl bit_faces_fill
  1187.         or  dword[draw_mode], 1 shl bit_faces ;включаем режим рисования граней (если вдруг был отключен)
  1188.         ret
  1189.  
  1190. ;включаем или отключаем освещение
  1191. align 4
  1192. mnu_light_on_off:
  1193.         xor dword[draw_mode], 1 shl bit_light
  1194.         ret
  1195.  
  1196. align 4
  1197. mnu_reset_settings:
  1198.         mov dword[angle_x],0.0
  1199.         mov dword[angle_y],0.0
  1200.         mov dword[angle_z],0.0
  1201.         m2m dword[draw_mode],dword[def_dr_mode]
  1202.         ret
  1203.  
  1204. align 4
  1205. proc mnu_vertexes_select uses eax ebx
  1206.         stdcall [tl_node_get_data],tree3
  1207.         cmp eax,0
  1208.         je .no_points
  1209.         stdcall found_block_data,tree3
  1210.         cmp eax,0
  1211.         je .no_points
  1212.                 mov bx,word[eax]
  1213.                 cmp bx,ID_ICON_POINT_SEL
  1214.                 je @f
  1215.                         mov word[eax],ID_ICON_POINT_SEL
  1216.                         inc dword[obj_poi_sel_c]
  1217.                         jmp .change
  1218.                 @@:
  1219.                         mov word[eax],ID_ICON_POINT
  1220.                         dec dword[obj_poi_sel_c]
  1221.                 .change:
  1222.                         mov eax,[obj_poi_sel_c]
  1223.                         stdcall convert_int_to_str, txt_select_vert.count,16
  1224.         .no_points:
  1225.         ret
  1226. endp
  1227.  
  1228. align 4
  1229. proc mnu_vertexes_deselect uses eax
  1230.         cmp dword[obj_poi_sel_c],0
  1231.         je .no_points
  1232.         mov dword[obj_poi_sel_c],0
  1233.         stdcall [tl_node_poi_get_info], tree3,0
  1234.         cmp eax,0
  1235.         je .no_points
  1236.         @@:
  1237.                 mov word[eax],ID_ICON_POINT
  1238.                 stdcall [tl_node_poi_get_next_info], tree3,eax
  1239.                 cmp eax,0
  1240.                 jne @b
  1241.         .no_points:
  1242.         ret
  1243. endp
  1244.  
  1245. align 4
  1246. proc mnu_reset_average_x uses eax ebx ecx edx edi
  1247.         cmp dword[obj_poi_sel_c],2
  1248.         jl .end_select
  1249.                 finit
  1250.                 fldz
  1251.                 mov ecx,dword[obj_poi_sel_c]
  1252.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1253.                 @@:
  1254.                         cmp eax,0
  1255.                         je .end_select
  1256.                         mov ebx,eax
  1257.                         cmp word[ebx],ID_ICON_POINT_SEL
  1258.                         jne .next_sel0
  1259.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1260.                                 mov eax,[eax]
  1261.                                 fadd dword[eax]
  1262.                                 dec ecx
  1263.                                 jz @f
  1264.                         .next_sel0:
  1265.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1266.                         jmp @b
  1267.                 @@:
  1268.                 fidiv dword[obj_poi_sel_c]
  1269.                 fstp dword[eax]
  1270.                 mov edx,[eax]
  1271.                 mov ecx,dword[obj_poi_sel_c]
  1272.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1273.                 @@:
  1274.                         cmp eax,0
  1275.                         je .end_select
  1276.                         mov ebx,eax
  1277.                         cmp word[ebx],ID_ICON_POINT_SEL
  1278.                         jne .next_sel1
  1279.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1280.                                 mov edi,eax
  1281.                                 mov eax,[eax]
  1282.                                 mov [eax],edx
  1283.                                 stdcall update_tree, edi
  1284.                                 dec ecx
  1285.                                 jz @f
  1286.                         .next_sel1:
  1287.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1288.                         jmp @b
  1289.                 @@:
  1290.     .end_select:
  1291.         ret
  1292. endp
  1293.  
  1294. align 4
  1295. proc mnu_reset_average_y uses eax ebx ecx edx edi
  1296.         cmp dword[obj_poi_sel_c],2
  1297.         jl .end_select
  1298.                 finit
  1299.                 fldz
  1300.                 mov ecx,dword[obj_poi_sel_c]
  1301.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1302.                 @@:
  1303.                         cmp eax,0
  1304.                         je .end_select
  1305.                         mov ebx,eax
  1306.                         cmp word[ebx],ID_ICON_POINT_SEL
  1307.                         jne .next_sel0
  1308.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1309.                                 mov eax,[eax]
  1310.                                 fadd dword[eax+4]
  1311.                                 dec ecx
  1312.                                 jz @f
  1313.                         .next_sel0:
  1314.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1315.                         jmp @b
  1316.                 @@:
  1317.                 fidiv dword[obj_poi_sel_c]
  1318.                 fstp dword[eax+4]
  1319.                 mov edx,[eax+4]
  1320.                 mov ecx,dword[obj_poi_sel_c]
  1321.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1322.                 @@:
  1323.                         cmp eax,0
  1324.                         je .end_select
  1325.                         mov ebx,eax
  1326.                         cmp word[ebx],ID_ICON_POINT_SEL
  1327.                         jne .next_sel1
  1328.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1329.                                 mov edi,eax
  1330.                                 mov eax,[eax]
  1331.                                 mov [eax+4],edx
  1332.                                 stdcall update_tree, edi
  1333.                                 dec ecx
  1334.                                 jz @f
  1335.                         .next_sel1:
  1336.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1337.                         jmp @b
  1338.                 @@:
  1339.     .end_select:
  1340.         ret
  1341. endp
  1342.  
  1343. align 4
  1344. proc mnu_reset_average_z uses eax ebx ecx edx edi
  1345.         cmp dword[obj_poi_sel_c],2
  1346.         jl .end_select
  1347.                 finit
  1348.                 fldz
  1349.                 mov ecx,dword[obj_poi_sel_c]
  1350.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1351.                 @@:
  1352.                         cmp eax,0
  1353.                         je .end_select
  1354.                         mov ebx,eax
  1355.                         cmp word[ebx],ID_ICON_POINT_SEL
  1356.                         jne .next_sel0
  1357.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1358.                                 mov eax,[eax]
  1359.                                 fadd dword[eax+8]
  1360.                                 dec ecx
  1361.                                 jz @f
  1362.                         .next_sel0:
  1363.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1364.                         jmp @b
  1365.                 @@:
  1366.                 fidiv dword[obj_poi_sel_c]
  1367.                 fstp dword[eax+8]
  1368.                 mov edx,[eax+8]
  1369.                 mov ecx,dword[obj_poi_sel_c]
  1370.                 stdcall dword[tl_node_poi_get_info], tree3,0
  1371.                 @@:
  1372.                         cmp eax,0
  1373.                         je .end_select
  1374.                         mov ebx,eax
  1375.                         cmp word[ebx],ID_ICON_POINT_SEL
  1376.                         jne .next_sel1
  1377.                                 stdcall [tl_node_poi_get_data], tree3,ebx
  1378.                                 mov edi,eax
  1379.                                 mov eax,[eax]
  1380.                                 mov [eax+8],edx
  1381.                                 stdcall update_tree, edi
  1382.                                 dec ecx
  1383.                                 jz @f
  1384.                         .next_sel1:
  1385.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1386.                         jmp @b
  1387.                 @@:
  1388.     .end_select:
  1389.         ret
  1390. endp
  1391.  
  1392. align 4
  1393. proc update_tree h_mem:dword
  1394. pushad
  1395.         mov edi,[h_mem]
  1396.         mov ebx,[edi]
  1397.         finit
  1398.  
  1399.         ;обновление измененного узла в списке tree3 и главного окна (по таймеру)
  1400.         mov word[NumberSymbolsAD],5
  1401.         mov dword[obj_point.text],0
  1402.         cld
  1403.         mov ecx,3
  1404.         .coord:
  1405.                 fld dword[ebx]
  1406.                 fstp qword[Data_Double]
  1407.                 call DoubleFloat_to_String
  1408.                 add ebx,4
  1409.                 stdcall str_len, Data_String
  1410.                 mov esi,txt_space
  1411.                 add esi,eax
  1412.                 cmp esi,txt_space.end
  1413.                 jl .normal_size
  1414.                         mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
  1415.                 .normal_size:
  1416.                 stdcall str_cat, obj_point.text,esi
  1417.                 stdcall str_cat, obj_point.text,Data_String
  1418.                 loop .coord
  1419.         mov esi,obj_point.text
  1420.         mov byte[esi],'*' ;отмечаем что вершина изменялась
  1421.         mov byte[can_save],1 ;для показа кнопки 'Сохранить'
  1422.         add edi,4
  1423.         mov ecx,MAX_OBJECT_SIZE-4
  1424.         rep movsb
  1425. popad
  1426.         ret
  1427. endp
  1428.  
  1429. align 4
  1430. def_dr_mode dd 0 ;режим рисования по умолчанию
  1431. delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
  1432. mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
  1433. mouse_x dd 0
  1434. mouse_y dd 0
  1435. angle_dxm dd 1.7775 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
  1436. angle_dym dd 1.3335 ;~ 3d_wnd_h/180
  1437. ratio dd 1.3333 ;~ 3d_wnd_w/3d_wnd_h
  1438. ;angle_dzm dd ?
  1439. draw_mode dd 0 ;режим рисования объекта
  1440. obj_poi_data dd 0 ;указатель на координаты вершин
  1441. obj_poi_count dd 0 ;колличество вершин
  1442. obj_poi_sel_c dd 0 ;колличество выделенных вершин
  1443. obj_tri_data dd 0 ;указатель на данные треугольников
  1444. obj_tri_count dd 0 ;колличество треугольников
  1445. cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
  1446. sph_radius dd 0 ;радиус сферы для выделения активной точки
  1447.  
  1448. obj_normals_poi_data dd 0
  1449. obj_normals_poi_count dd 0
  1450. obj_normals_tri_data dd 0
  1451. obj_normals_tri_count dd 0
  1452.  
  1453. obj_x_max dd 0
  1454. obj_x_min dd 0
  1455. obj_x_centr dd 0
  1456. obj_x_scale dd 1.0
  1457. obj_y_max dd 0
  1458. obj_y_min dd 0
  1459. obj_y_centr dd 0
  1460. obj_y_scale dd 1.0
  1461. obj_z_max dd 0
  1462. obj_z_min dd 0
  1463. obj_z_centr dd 0
  1464. obj_z_scale dd 1.0
  1465.  
  1466. capt_p dd 0
  1467.  
  1468. ;дерево с объектами в пользовательском файле
  1469. tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
  1470.         16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
  1471.         w_scr_t3,get_point_coords
  1472.  
  1473. edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
  1474. edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
  1475. edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
  1476. editboxes_end:
  1477.  
  1478. string1 rb 34
  1479. string2 rb 34
  1480. string3 rb 34
  1481.  
  1482. align 4
  1483. w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1
  1484.