Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; Ôóíêöèè íóæíûå äëÿ îòîáðàæåíèÿ âîêñåëüíîãî îáúåêòà ÷åðåç áèáëèîòåêó tinygl
  3. ;
  4.  
  5. normal_gran_z1 equ -1.0
  6. normal_gran_z0 equ  1.0
  7. normal_gran_y1 equ -1.0
  8. normal_gran_y0 equ  1.0
  9. normal_gran_x1 equ -1.0
  10. normal_gran_x0 equ  1.0
  11.  
  12. ;ìàðîñ êîðåêòèðîâêè âåêòîðà íîðìàëè äëÿ çàêðóãëåíèÿ êðàéíèõ âîêñåëåé
  13. macro normal_gran param, gran
  14. {
  15.     mov dword[param],0.0
  16.     bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran
  17.     jnc @f
  18.         mov dword[param],normal_gran_#gran
  19.     @@:
  20. }
  21.  
  22. ;ìàðîñ êîðåêòèðîâêè âåêòîðà íîðìàëè äëÿ äèàãîíàëüíîãî ñãëàæèâàíèÿ âîêñåëåé
  23. ;äèàãîíàëüíûå âîêñåëè ïîñëå ýòîãî ñãëàæèâàíèÿ ñìîòðÿòñÿ íå ñòåïåíüêàìè à ñïëîøíîé ïëîñêîñòüþ
  24. macro normal_gran_2 param, gran2, gran1
  25. {
  26.     bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran2
  27.     jnc @f
  28.         mov dword[param],normal_gran_#gran1 ;ïîñòàâèòü 0.0 â dword[param] åñëè íóæíî íå ñèëüíîå ñãëàæèâàíèå
  29.     @@:
  30. }
  31.  
  32. vox_ogl_x0 equ 0
  33. vox_ogl_y0 equ 4
  34. vox_ogl_z0 equ 8
  35. vox_ogl_x1 equ 12
  36. vox_ogl_y1 equ 16
  37. vox_ogl_z1 equ 20
  38. vox_ogl_color equ 24
  39. vox_ogl_zoom equ 28
  40. vox_ogl_planes equ 30
  41. vox_ogl_size equ 34
  42.  
  43. def_del_planes equ 63
  44.  
  45. ;íîìåðà áèòîâ, êîòîðûå óêàçûâàþò íà òî êàêèå åñòü ñîñåäíèå âîêñåëè
  46. ;íóæíî äëÿ îòñå÷åíèÿ âíóòðåííèõ ãðàíåé ìåæäó ñîñåäíèìè âîêñåëÿìè
  47. ;à åùå íóæíî äëÿ çàäàíèÿ âåêòîðîâ íîðìàëåé, ÷òî-áû âîêñåëè áûëè ñãëàæåííûìè (çàêðóãëåííûìè)
  48. vox_ogl_gran_z1 equ 1
  49. vox_ogl_gran_z0 equ 0
  50. vox_ogl_gran_y1 equ 3
  51. vox_ogl_gran_y0 equ 2
  52. vox_ogl_gran_x1 equ 5
  53. vox_ogl_gran_x0 equ 4
  54. vox_ogl_gran_y1z1 equ 7
  55. vox_ogl_gran_y0z0 equ 6
  56. vox_ogl_gran_x1z1 equ 9
  57. vox_ogl_gran_x0z0 equ 8
  58. vox_ogl_gran_y0z1 equ 11
  59. vox_ogl_gran_y1z0 equ 10
  60. vox_ogl_gran_x0z1 equ 13
  61. vox_ogl_gran_x1z0 equ 12
  62. vox_ogl_gran_x1y1 equ 15
  63. vox_ogl_gran_x0y0 equ 14
  64. vox_ogl_gran_x0y1 equ 17
  65. vox_ogl_gran_x1y0 equ 16
  66.  
  67.  
  68. vox_offs_tree_table equ 4
  69. vox_offs_data equ 12
  70.  
  71.  
  72. ;description:
  73. ; ñîçäàíèå âîêñåëüíîãî îáúåêòà äëÿ ïîêàçà â 3d ãðàôèêå
  74. ;input:
  75. align 4
  76. proc buf_vox_obj_create_3d, v_obj:dword, p_mem:dword, coord_x:dword,\
  77. coord_y:dword, k_scale:dword
  78.         cmp [k_scale],0
  79.         jl .end_f
  80. pushad
  81.         mov edi,[p_mem]
  82.     mov dword[edi],0 ;count voxels
  83.  
  84.         mov ecx,[k_scale]
  85.         mov ebx,[coord_x]
  86.         mov edx,[coord_y]
  87.         mov edi,[v_obj]
  88.         add edi,vox_offs_data
  89.         xor esi,esi
  90.         stdcall create_sub_vox_obj_3d, [v_obj],[p_mem],[k_scale]
  91.  
  92.     ; (1)
  93.     ; ñîðòèðîâêà âîêñåëåé ïî êîîðäèíàòàì x,y,z
  94.     ;
  95.     mov edi,[p_mem]
  96.     mov ecx,dword[edi]
  97.     ;inc ecx
  98.     add edi,4
  99.     sub edi,vox_ogl_size
  100.     stdcall pole_fl_sort, edi, ecx
  101.  
  102.     ;îòñå÷åíèå ñîñåäíèõ ãðàíåé äëÿ óñêîðåíèÿ îòðèñîâêè
  103.     mov edi,[p_mem]
  104.     mov ecx,dword[edi]
  105.     dec ecx
  106.     add edi,4
  107.  
  108. align 4
  109.     .cycle_0:
  110.         mov ax,word[edi+vox_ogl_zoom]
  111.         cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
  112.         jne @f
  113.         mov eax,dword[edi+vox_ogl_x0]
  114.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
  115.         jne @f
  116.         mov eax,dword[edi+vox_ogl_y0]
  117.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
  118.         jne @f
  119.         mov eax,dword[edi+vox_ogl_z0]
  120.         inc eax ;óâåëè÷èâàåì âûñîòó, äëÿ áóäóùåãî ñðàâíåíèÿ
  121.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
  122.         jne @f
  123.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó, òî ñîñåäíèå âûñîòó è íèç îòñåêàåì
  124.         btr dword[edi+vox_ogl_planes],vox_ogl_gran_z1 ;âåðõ îòñåêàåì
  125.         btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_z0 ;íèç îòñåêàåì
  126.     @@:
  127.         add edi,vox_ogl_size
  128.         loop .cycle_0
  129.  
  130. push ebx edx esi
  131.     ;äèàãîíàëüíûå ñîñåäíèå âîêñåëè
  132.     mov edi,[p_mem]
  133.     mov ecx,dword[edi]
  134.     dec ecx
  135.     add edi,4
  136.  
  137.     mov ebx,ecx
  138.     ;inc ebx ;??? cmp esi,ebx -> jge @f
  139.     imul ebx,vox_ogl_size
  140.     add ebx,edi
  141.  
  142. align 4
  143.     .cycle_3:
  144.         mov dx,word[edi+vox_ogl_zoom]
  145.         mov esi,edi
  146. align 4
  147.         .cycle_4:
  148.         add esi,vox_ogl_size
  149.         cmp esi,ebx
  150.         jg @f
  151.         cmp dx,word[esi+vox_ogl_zoom]
  152.         jne .cycle_4
  153.        
  154.         mov eax,dword[edi+vox_ogl_x0]
  155.         cmp eax,dword[esi+vox_ogl_x0]
  156.         jne @f
  157.         mov eax,dword[edi+vox_ogl_y0]
  158.         inc eax ; y+
  159.         cmp eax,dword[esi+vox_ogl_y0]
  160.         jl @f
  161.         jne .cycle_4
  162.         mov eax,dword[edi+vox_ogl_z0]
  163.         inc eax ; z+
  164.         cmp eax,dword[esi+vox_ogl_z0]
  165.         jne .cycle_4
  166.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  167.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z1 ;
  168.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z0 ;
  169.     @@:
  170.         add edi,vox_ogl_size
  171.         loop .cycle_3
  172.  
  173. ; ***
  174.     mov edi,[p_mem]
  175.     mov ecx,dword[edi]
  176.     dec ecx
  177.     add edi,4
  178.  
  179. align 4
  180.     .cycle_7:
  181.         mov dx,word[edi+vox_ogl_zoom]
  182.         mov esi,edi
  183. align 4
  184.         .cycle_8:
  185.         add esi,vox_ogl_size
  186.         cmp esi,ebx
  187.         jg @f
  188.         cmp dx,word[esi+vox_ogl_zoom]
  189.         jne .cycle_8
  190.        
  191.         mov eax,dword[edi+vox_ogl_x0]
  192.         cmp eax,dword[esi+vox_ogl_x0]
  193.         jne @f
  194.         mov eax,dword[edi+vox_ogl_y0]
  195.         inc eax ; y+
  196.         cmp eax,dword[esi+vox_ogl_y0]
  197.         jl @f
  198.         jne .cycle_8
  199.         mov eax,dword[edi+vox_ogl_z0]
  200.         dec eax ; z-
  201.         cmp eax,dword[esi+vox_ogl_z0]
  202.         jne .cycle_8
  203.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  204.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z0 ;
  205.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z1 ;
  206.     @@:
  207.         add edi,vox_ogl_size
  208.         loop .cycle_7
  209. pop esi edx ebx
  210.  
  211.     ; (2)
  212.     ; ñîðòèðîâêà âîêñåëåé ïî êîîðäèíàòàì x,z,y
  213.     ;
  214.     mov edi,[p_mem]
  215.     mov ecx,dword[edi]
  216.     add edi,4
  217.     sub edi,vox_ogl_size
  218.     stdcall pole_fl_sort_zxy, edi, ecx
  219.  
  220.     ;îòñå÷åíèå ñîñåäíèõ ãðàíåé äëÿ óñêîðåíèÿ îòðèñîâêè
  221.     mov edi,[p_mem]
  222.     mov ecx,dword[edi]
  223.     dec ecx
  224.     add edi,4
  225.  
  226. align 4
  227.     .cycle_1:
  228.         mov ax,word[edi+vox_ogl_zoom]
  229.         cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
  230.         jne @f
  231.         mov eax,dword[edi+vox_ogl_z0]
  232.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
  233.         jne @f
  234.         mov eax,dword[edi+vox_ogl_x0]
  235.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
  236.         jne @f
  237.         mov eax,dword[edi+vox_ogl_y0]
  238.         inc eax ;óâåëè÷èâàåì âûñîòó, äëÿ áóäóùåãî ñðàâíåíèÿ
  239.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
  240.         jne @f
  241.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó, òî ñîñåäíèå âûñîòó è íèç îòñåêàåì
  242.         btr dword[edi+vox_ogl_planes],vox_ogl_gran_y1 ;âåðõ îòñåêàåì
  243.         btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_y0 ;íèç îòñåêàåì
  244.     @@:
  245.         add edi,vox_ogl_size
  246.         loop .cycle_1
  247.  
  248. push ebx edx esi
  249.     ;äèàãîíàëüíûå ñîñåäíèå âîêñåëè
  250.     mov edi,[p_mem]
  251.     mov ecx,dword[edi]
  252.     dec ecx
  253.     add edi,4
  254.  
  255.     mov ebx,ecx
  256.     ;inc ebx ;??? cmp esi,ebx -> jge @f
  257.     imul ebx,vox_ogl_size
  258.     add ebx,edi
  259.  
  260. align 4
  261.     .cycle_11:
  262.         mov dx,word[edi+vox_ogl_zoom]
  263.         mov esi,edi
  264. align 4
  265.         .cycle_12:
  266.         add esi,vox_ogl_size
  267.         cmp esi,ebx
  268.         jg @f
  269.         cmp dx,word[esi+vox_ogl_zoom]
  270.         jne .cycle_12
  271.        
  272.         mov eax,dword[edi+vox_ogl_z0]
  273.         cmp eax,dword[esi+vox_ogl_z0]
  274.         jne @f
  275.         mov eax,dword[edi+vox_ogl_x0]
  276.         inc eax ; x+
  277.         cmp eax,dword[esi+vox_ogl_x0]
  278.         jl @f
  279.         jne .cycle_12
  280.         mov eax,dword[edi+vox_ogl_y0]
  281.         inc eax ; y+
  282.         cmp eax,dword[esi+vox_ogl_y0]
  283.         jne .cycle_12
  284.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  285.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y1 ;
  286.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y0 ;
  287.     @@:
  288.         add edi,vox_ogl_size
  289.         loop .cycle_11
  290.  
  291. ; ***
  292.     mov edi,[p_mem]
  293.     mov ecx,dword[edi]
  294.     dec ecx
  295.     add edi,4
  296.  
  297. align 4
  298.     .cycle_15:
  299.         mov dx,word[edi+vox_ogl_zoom]
  300.         mov esi,edi
  301. align 4
  302.         .cycle_16:
  303.         add esi,vox_ogl_size
  304.         cmp esi,ebx
  305.         jg @f
  306.         cmp dx,word[esi+vox_ogl_zoom]
  307.         jne .cycle_16
  308.        
  309.         mov eax,dword[edi+vox_ogl_z0]
  310.         cmp eax,dword[esi+vox_ogl_z0]
  311.         jne @f
  312.         mov eax,dword[edi+vox_ogl_x0]
  313.         inc eax ; x+
  314.         cmp eax,dword[esi+vox_ogl_x0]
  315.         jl @f
  316.         jne .cycle_16
  317.         mov eax,dword[edi+vox_ogl_y0]
  318.         dec eax ; y-
  319.         cmp eax,dword[esi+vox_ogl_y0]
  320.         jne .cycle_16
  321.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  322.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y0 ;
  323.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y1 ;
  324.     @@:
  325.         add edi,vox_ogl_size
  326.         loop .cycle_15
  327.  
  328. pop esi edx ebx
  329.  
  330.     ; (3)
  331.     ; ñîðòèðîâêà âîêñåëåé ïî êîîðäèíàòàì y,z,x
  332.     ;
  333.     mov edi,[p_mem]
  334.     mov ecx,dword[edi]
  335.     add edi,4
  336.     sub edi,vox_ogl_size
  337.     stdcall pole_fl_sort_yzx, edi, ecx
  338.  
  339.     ;îòñå÷åíèå ñîñåäíèõ ãðàíåé äëÿ óñêîðåíèÿ îòðèñîâêè
  340.     mov edi,[p_mem]
  341.     mov ecx,dword[edi]
  342.     dec ecx
  343.     add edi,4
  344.  
  345. align 4
  346.     .cycle_2:
  347.         mov ax,word[edi+vox_ogl_zoom]
  348.         cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
  349.         jne @f
  350.         mov eax,dword[edi+vox_ogl_y0]
  351.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
  352.         jne @f
  353.         mov eax,dword[edi+vox_ogl_z0]
  354.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
  355.         jne @f
  356.         mov eax,dword[edi+vox_ogl_x0]
  357.         inc eax ;óâåëè÷èâàåì âûñîòó, äëÿ áóäóùåãî ñðàâíåíèÿ
  358.         cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
  359.         jne @f
  360.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó, òî ñîñåäíèå âûñîòó è íèç îòñåêàåì
  361.         btr dword[edi+vox_ogl_planes],vox_ogl_gran_x1 ;âåðõ îòñåêàåì
  362.         btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_x0 ;íèç îòñåêàåì
  363.     @@:
  364.         add edi,vox_ogl_size
  365.         loop .cycle_2
  366.  
  367. push ebx edx esi
  368.     ;äèàãîíàëüíûå ñîñåäíèå âîêñåëè
  369.     mov edi,[p_mem]
  370.     mov ecx,dword[edi]
  371.     dec ecx
  372.     add edi,4
  373.  
  374.     mov ebx,ecx
  375.     ;inc ebx ;??? cmp esi,ebx -> jge @f
  376.     imul ebx,vox_ogl_size
  377.     add ebx,edi
  378.  
  379. align 4
  380.     .cycle_5:
  381.         mov dx,word[edi+vox_ogl_zoom]
  382.         mov esi,edi
  383. align 4
  384.         .cycle_6:
  385.         add esi,vox_ogl_size
  386.         cmp esi,ebx
  387.         jg @f
  388.         cmp dx,word[esi+vox_ogl_zoom]
  389.         jne .cycle_6
  390.        
  391.         mov eax,dword[edi+vox_ogl_y0]
  392.         cmp eax,dword[esi+vox_ogl_y0]
  393.         jne @f
  394.         mov eax,dword[edi+vox_ogl_z0]
  395.         inc eax ; z+
  396.         cmp eax,dword[esi+vox_ogl_z0]
  397.         jl @f
  398.         jne .cycle_6
  399.         mov eax,dword[edi+vox_ogl_x0]
  400.         inc eax ; x+
  401.         cmp eax,dword[esi+vox_ogl_x0]
  402.         jne .cycle_6
  403.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  404.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1z1 ;
  405.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0z0 ;
  406.     @@:
  407.         add edi,vox_ogl_size
  408.         loop .cycle_5
  409.  
  410. ; ***
  411.     mov edi,[p_mem]
  412.     mov ecx,dword[edi]
  413.     dec ecx
  414.     add edi,4
  415.  
  416. align 4
  417.     .cycle_9:
  418.         mov dx,word[edi+vox_ogl_zoom]
  419.         mov esi,edi
  420. align 4
  421.         .cycle_10:
  422.         add esi,vox_ogl_size
  423.         cmp esi,ebx
  424.         jg @f
  425.         cmp dx,word[esi+vox_ogl_zoom]
  426.         jne .cycle_10
  427.        
  428.         mov eax,dword[edi+vox_ogl_y0]
  429.         cmp eax,dword[esi+vox_ogl_y0]
  430.         jne @f
  431.         mov eax,dword[edi+vox_ogl_z0]
  432.         inc eax ; z+
  433.         cmp eax,dword[esi+vox_ogl_z0]
  434.         jl @f
  435.         jne .cycle_10
  436.         mov eax,dword[edi+vox_ogl_x0]
  437.         dec eax ; x-
  438.         cmp eax,dword[esi+vox_ogl_x0]
  439.         jne .cycle_10
  440.         ;åñëè ïî âûñîòå âîêñåëè ðàçëè÷àåòñÿ íà 1 êîîðäèíàòó
  441.         bts dword[edi+vox_ogl_planes],vox_ogl_gran_x0z1 ;
  442.         bts dword[esi+vox_ogl_planes],vox_ogl_gran_x1z0 ;
  443.     @@:
  444.         add edi,vox_ogl_size
  445.         loop .cycle_9
  446.  
  447. pop esi edx ebx
  448.  
  449.     ;ïðåîáðàçîâàíèå êîîðäèíàò âî float
  450.     stdcall vox_obj_3d_recalc, [p_mem]
  451. popad
  452.         .end_f:
  453.         ret
  454. endp
  455.  
  456. ;input:
  457. ; ebx - coord_x
  458. ; edx - coord_y
  459. ; esi - coord_z
  460. ; ecx - óðîâåíü òåêóøåãî óçëà 
  461. ; edi - óêàçàòåëü íà äàííûå âîêñåëüíîãî îáúåêòà
  462. align 4
  463. proc create_sub_vox_obj_3d, v_obj:dword, p_mem:dword, k_scale:dword
  464.         cmp byte[edi+3],0 ;ñìîòðèì åñòü ëè ïîääåðåâüÿ
  465.         je .sub_trees
  466.  
  467.                 ;äîáàâëÿåì óçåë, êîòîðûé ñîäåðæèò äî÷åðíèå óçëû, ïðè ýòîì äî÷åðíèå ìåëêèå è íå ïîïàäàþò íà âûâîä
  468.                 cmp ecx,0
  469.                 jne @f
  470.                         push ecx
  471.                 mov eax,[p_mem]
  472.                 inc dword[eax] ;óâåëè÷èâàåì ñ÷åò÷èê âîêñåëåé íà 1
  473.                 mov eax,[eax]
  474.                 imul eax,vox_ogl_size ;óìíîæàåì íà ðàçìåð äàííûõ î âîêñåëå
  475.                 add eax,4-vox_ogl_size ;÷èñëî âîêñåëåé 4 áàéòà
  476.                 add eax,[p_mem]
  477.                 mov [eax+vox_ogl_x0],ebx
  478.                 mov [eax+vox_ogl_y0],edx
  479.                 mov [eax+vox_ogl_z0],esi
  480.                 sub ecx,[k_scale]
  481.                 mov word[eax+vox_ogl_zoom],cx
  482.                 mov dword[eax+vox_ogl_planes],def_del_planes
  483.                                 mov ecx,dword[edi]
  484.                                 and ecx,0xffffff
  485.                 mov [eax+vox_ogl_color],ecx
  486.                         pop ecx
  487.                 @@:
  488.  
  489.                 ;ðåêóðñèâíûé ïåðåáîð ïîääåðåâüåâ
  490.                 push edx
  491.                 ;âõîä âíóòðü óçëà
  492.                 dec ecx
  493.  
  494.                 mov eax,1
  495.                 cmp ecx,1
  496.                 jl @f
  497.                         shl eax,cl
  498.                 @@:
  499.  
  500.                 add edx,eax ;êîðåêòèðîâêà âûñîòû ïîä âîêñåëü íèæíåãî óðîâíÿ
  501.  
  502.                 mov ah,byte[edi+3]
  503.                 add edi,4
  504.                 mov al,8
  505.                 .cycle:
  506.                         bt ax,8 ;òåñòèðóåì òîëüêî ah
  507.                         jnc .c_next
  508.                                 push eax ebx edx esi
  509.                                 stdcall vox_corect_coords_pl, [v_obj],1
  510.                                 stdcall create_sub_vox_obj_3d, [v_obj], [p_mem],[k_scale]
  511.                                 pop esi edx ebx eax
  512.                         .c_next:
  513.                         shr ah,1
  514.                         dec al
  515.                         jnz .cycle
  516.                 ;âûõîä èç óçëà
  517.                 inc ecx
  518.                 pop edx
  519.                 jmp .end_f
  520.         .sub_trees:
  521.                 cmp ecx,0
  522.                 jl .end_0 ;íå ðèñóåì î÷åíü ìàëåíüêèå âîêñåëè
  523.  
  524.                         ;cmp ecx,1
  525.                         ;jl @f
  526.                                 ;êâàäðàò áîëüøå òåêóùåãî ìàñøòàáà
  527.                                 ;stdcall vox_draw_square_1g, [buf_i],[buf_z],eax
  528.                                 ;jmp .end_0
  529.                         ;@@:
  530.                                 ;êâàäðàò òåêóùåãî ìàñøòàáà
  531.                                 push ecx
  532.                 mov eax,[p_mem]
  533.                 inc dword[eax] ;óâåëè÷èâàåì ñ÷åò÷èê âîêñåëåé íà 1
  534.                 mov eax,[eax]
  535.                 imul eax,vox_ogl_size ;óìíîæàåì íà ðàçìåð äàííûõ î âîêñåëå
  536.                 add eax,4-vox_ogl_size ;÷èñëî âîêñåëåé 4 áàéòà
  537.                 add eax,[p_mem]
  538.                 mov [eax+vox_ogl_x0],ebx
  539.                 mov [eax+vox_ogl_y0],edx
  540.                 mov [eax+vox_ogl_z0],esi
  541.                 cmp ecx,1
  542.                 jl @f
  543.                     ;êâàäðàò áîëüøå òåêóùåãî ìàñøòàáà
  544.                     shr dword[eax+vox_ogl_x0],cl
  545.                     shr dword[eax+vox_ogl_y0],cl
  546.                     shr dword[eax+vox_ogl_z0],cl
  547.                 @@:
  548.                 sub ecx,[k_scale]
  549.                 mov word[eax+vox_ogl_zoom],cx
  550.                 mov dword[eax+vox_ogl_planes],def_del_planes
  551.                                 mov ecx,dword[edi]
  552.                                 and ecx,0xffffff
  553.                 mov [eax+vox_ogl_color],ecx
  554.                                 pop ecx
  555.                 .end_0:
  556.                 add edi,4
  557.         .end_f:
  558.         ret
  559. endp
  560.  
  561. ;description:
  562. ; â OpenGL òðåáóþòñÿ êîîðäèíàòû float
  563. ; ïðåîáðàçîâàíèå êîîðäèíàò èç int âî float,
  564. align 4
  565. proc vox_obj_3d_recalc uses eax ebx ecx, p_mem:dword
  566.  
  567. ;ïîëó÷àåì êîîðäèíàòû â ïðåäåëàõ îò 0 äî 1 â äðîáíîì âèäå
  568.         mov eax,[p_mem]
  569.         mov ecx,dword[eax]
  570.         add eax,4
  571.  
  572.         finit
  573. align 4
  574.         @@:
  575.                 fild word[eax+vox_ogl_zoom]
  576.                 fld1 ; ðàçìåð êóáè÷åñêîé ãðàíè áåç ó÷åòà ìàñøòàáà
  577.                 fscale ; st0=1*2^st1 èëè ðàçìåð êóáè÷åñêîé ãðàíè ñ ó÷åòîì ìàñøòàáà
  578.                 fxch
  579.  
  580.                 ;coord x
  581.                 fild dword[eax+vox_ogl_x0]
  582.                 fscale
  583.                 fst dword[eax+vox_ogl_x0]
  584.                 fadd st0,st2 ;äîáàâëÿåì êî âòîðîé òî÷êå ðàçìåð ìàñøòàáèðîâàííîé êóáè÷åñêîé ãðàíè
  585.                 fstp dword[eax+vox_ogl_x1]
  586.                 ;coord y
  587.                 fild dword[eax+vox_ogl_y0]
  588.                 fscale
  589.                 fst dword[eax+vox_ogl_y0]
  590.                 fadd st0,st2
  591.                 fstp dword[eax+vox_ogl_y1]
  592.                 ;coord z
  593.                 fild dword[eax+vox_ogl_z0]
  594.                 fscale
  595.                 fst dword[eax+vox_ogl_z0]
  596.                 fadd st0,st2
  597.                 fstp dword[eax+vox_ogl_z1]
  598.  
  599.                 ;goto next voxel
  600.                 add eax,vox_ogl_size
  601.                 ffree st0
  602.                 fincstp
  603.                 ffree st0
  604.                 fincstp
  605.                 loop @b
  606.  
  607. ;îòíèìàåì îò êàæäîé êîîðäèíàòû ïî 0.5 äëÿ öåíòðîâêè îáúåêòà ïî öåíòðó ýêðàíà
  608.         mov eax,[p_mem]
  609.         mov ecx,dword[eax]
  610.         add eax,4
  611.         fld1 ;st0=1
  612.         fchs ;st0=-1
  613.         fld1 ;st0=1 st1=-1
  614.         fscale ;st0=1*2^st1 èëè 1*2^-1=1/2=0.5
  615. align 4
  616.         @@:
  617.                 ;coord x
  618.                 fld dword[eax+vox_ogl_x0]
  619.                 fsub st0,st1 ;-0.5
  620.                 fstp dword[eax+vox_ogl_x0]
  621.                 fld dword[eax+vox_ogl_x1]
  622.                 fsub st0,st1 ;-0.5
  623.                 fstp dword[eax+vox_ogl_x1]
  624.                 ;coord y
  625.                 fld dword[eax+vox_ogl_y0]
  626.                 fsub st0,st1 ;-0.5
  627.                 fstp dword[eax+vox_ogl_y0]
  628.                 fld dword[eax+vox_ogl_y1]
  629.                 fsub st0,st1 ;-0.5
  630.                 fstp dword[eax+vox_ogl_y1]
  631.                 ;coord z
  632.                 fld dword[eax+vox_ogl_z0]
  633.                 fsub st0,st1 ;-0.5
  634.                 fstp dword[eax+vox_ogl_z0]
  635.                 fld dword[eax+vox_ogl_z1]
  636.                 fsub st0,st1 ;-0.5
  637.                 fstp dword[eax+vox_ogl_z1]
  638.  
  639.                 ;goto next voxel
  640.                 add eax,vox_ogl_size
  641.                 loop @b
  642.         ffree st0
  643.         fincstp
  644.         ffree st0
  645.         fincstp
  646.         ret
  647. endp
  648.  
  649. ;Ñîðòèðîâêà âåêòîðà a[1..n] ìåòîäîì Ôëîéäà
  650. align 4
  651. proc pole_fl_sort, a:dword, n:dword
  652.         pushad
  653.         mov ecx,dword[a]
  654.         ;Ôîðìèðîâàòü èñõîäíîå ÷àñòè÷íî óïîðÿäî÷åííîå äåðåâî
  655.         mov eax,dword[n]
  656.         shr eax,1
  657.         @@: ;for(i=n/2; i>=2; i--)
  658.                 stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n)
  659.                 dec eax
  660.                 cmp eax,2
  661.                 jge @b
  662.         ;Âûïîëíèòü ïðîöåäóðó âñïëûòèÿ Ôëîéäà äëÿ êàæäîãî ïîääåðåâà
  663.         mov eax,dword[n]
  664.         @@: ;for(i=n; i>=2; i--){
  665.                 stdcall pole_fl_surface, ecx,1,eax ;(a,1,i)
  666.                 ;Ïîìåñòèòü íàéäåííûé ìàêñèìàëüíûé ýëåìåíò â êîíåö ñïèñêà
  667.         stdcall swap_cell, ecx,1,eax ;ìåíÿåì ìåñòàìè a[1] <-> a[i]
  668.                 dec eax
  669.                 cmp eax,2
  670.                 jge @b
  671.         popad
  672.         ret
  673. endp
  674.  
  675. ;Ïðîöåäóðà âñïëûòèÿ Ôëîéäà ïî äåðåâó a[1..k]
  676. align 4
  677. proc pole_fl_surface, a:dword, i:dword, k:dword
  678.         pushad
  679.         ;edx -> ...
  680.         ;edi -> m
  681.         ;esi -> j
  682.         mov eax,dword[a]
  683.         mov ebx,dword[i]
  684.         mov ecx,dword[k]
  685.  
  686.         stdcall copy_cell, eax, -1,ebx ;copy=a[i];
  687.         mov edi,ebx
  688.         shl edi,1 ;m=2*i ãäå edi=m
  689.         .cycle_b: ;while (m<=k) {
  690.                 cmp edi,ecx
  691.                 jg .cycle_e
  692.                 jne @f ;if (m==k) j=m;
  693.                         mov esi,edi
  694.                         jmp .else_e
  695.                 @@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m;
  696.                 mov edx,edi
  697.         inc edx
  698.                 stdcall pole_compare_cells_bm, eax, edi,edx
  699.                 cmp dl,0
  700.                 je @f
  701.                         mov esi,edi
  702.                         jmp .else_e
  703.                 @@: ;else j=m+1;
  704.                         mov esi,edi
  705.                         inc esi
  706.                 .else_e:
  707.  
  708.                 ;if (pole_compare_cells_bm(a[j],copy)) {
  709.                 stdcall pole_compare_cells_bm, eax, esi,-1
  710.                 cmp dl,0
  711.                 je .cycle_e ;} else break; //âûõîä èç öèêëà
  712.  
  713.                 stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
  714.                 mov ebx,esi ;i=j;
  715.                 mov edi,ebx
  716.                 shl edi,1 ;m=2*i;
  717.  
  718.                 jmp .cycle_b
  719.         .cycle_e:
  720.  
  721.         ;çíà÷åíèÿ ìíîãèõ ðåãèñòðîâ óæå íå âàæíû ò. ê. êîíåö ôóíêöèè
  722.         stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
  723.  
  724.         popad
  725.         ret
  726. endp
  727.  
  728. ;output:
  729. ; dl
  730. align 4
  731. proc pole_compare_cells_bm uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
  732.  
  733.         mov eax,[i0] ;eax -> cell[i0]
  734.     imul eax,vox_ogl_size
  735.     add eax,[p_mem]
  736.  
  737.         mov ebx,[i1] ;ebx -> cell[i1]
  738.     cmp ebx,0
  739.     jl .copy
  740.     imul ebx,vox_ogl_size
  741.     add ebx,[p_mem]
  742.     jmp @f
  743.     .copy:
  744.         mov ebx,mem_copy_32
  745.     @@:
  746.  
  747.         mov cx,word[ebx+vox_ogl_zoom] ;zoom
  748.         cmp word[eax+vox_ogl_zoom],cx
  749.         jle @f ;zoom0>zoom1
  750.                 mov dl,1
  751.                 jmp .fun_e
  752.         @@:
  753.         jne .r_0 ;if zoom0<zoom1 return 0
  754.  
  755.         mov ecx,dword[ebx+vox_ogl_x0] ;coord x
  756.         cmp dword[eax+vox_ogl_x0],ecx
  757.         jle @f ;x0>x1
  758.                 mov dl,1
  759.                 jmp .fun_e
  760.         @@:
  761.         jne .r_0 ;if x0<x1 return 0
  762.  
  763.         mov ecx,dword[ebx+vox_ogl_y0] ;coord y
  764.         cmp dword[eax+vox_ogl_y0],ecx
  765.         jle @f ;y0>y1
  766.                 mov dl,1
  767.                 jmp .fun_e
  768.         @@:
  769.         jne .r_0 ;if y0<y1 return 0
  770.  
  771.         mov ecx,dword[ebx+vox_ogl_z0] ;coord z
  772.         cmp dword[eax+vox_ogl_z0],ecx
  773.         jle @f ;z0>z1
  774.                 mov dl,1
  775.                 jmp .fun_e
  776.         @@:
  777.  
  778.     .r_0:
  779.         xor dl,dl
  780.         .fun_e:
  781.         ret
  782. endp
  783.  
  784. if 0 ;ïîêà íå íóæíî, íî ðàáîòàëî ïðàâèëüíî
  785. ;Ñîðòèðîâêà âåêòîðà a[1..n] ìåòîäîì Ôëîéäà
  786. align 4
  787. proc pole_fl_sort_xzy, a:dword, n:dword
  788.         pushad
  789.         mov ecx,dword[a]
  790.         ;Ôîðìèðîâàòü èñõîäíîå ÷àñòè÷íî óïîðÿäî÷åííîå äåðåâî
  791.         mov eax,dword[n]
  792.         shr eax,1
  793.         @@: ;for(i=n/2; i>=2; i--)
  794.                 stdcall pole_fl_surface_xzy, ecx,eax,[n] ;(a,i,n)
  795.                 dec eax
  796.                 cmp eax,2
  797.                 jge @b
  798.         ;Âûïîëíèòü ïðîöåäóðó âñïëûòèÿ Ôëîéäà äëÿ êàæäîãî ïîääåðåâà
  799.         mov eax,dword[n]
  800.         @@: ;for(i=n; i>=2; i--){
  801.                 stdcall pole_fl_surface_xzy, ecx,1,eax ;(a,1,i)
  802.                 ;Ïîìåñòèòü íàéäåííûé ìàêñèìàëüíûé ýëåìåíò â êîíåö ñïèñêà
  803.         stdcall swap_cell, ecx,1,eax ;ìåíÿåì ìåñòàìè a[1] <-> a[i]
  804.                 dec eax
  805.                 cmp eax,2
  806.                 jge @b
  807.         popad
  808.         ret
  809. endp
  810.  
  811. ;Ïðîöåäóðà âñïëûòèÿ Ôëîéäà ïî äåðåâó a[1..k]
  812. align 4
  813. proc pole_fl_surface_xzy, a:dword, i:dword, k:dword
  814.         pushad
  815.         ;edx -> ...
  816.         ;edi -> m
  817.         ;esi -> j
  818.         mov eax,dword[a]
  819.         mov ebx,dword[i]
  820.         mov ecx,dword[k]
  821.  
  822.         stdcall copy_cell, eax, -1,ebx ;copy=a[i];
  823.         mov edi,ebx
  824.         shl edi,1 ;m=2*i ãäå edi=m
  825.         .cycle_b: ;while (m<=k) {
  826.                 cmp edi,ecx
  827.                 jg .cycle_e
  828.                 jne @f ;if (m==k) j=m;
  829.                         mov esi,edi
  830.                         jmp .else_e
  831.                 @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m;
  832.                 mov edx,edi
  833.         inc edx
  834.                 stdcall pole_compare_bm_xzy, eax, edi,edx
  835.                 cmp dl,0
  836.                 je @f
  837.                         mov esi,edi
  838.                         jmp .else_e
  839.                 @@: ;else j=m+1;
  840.                         mov esi,edi
  841.                         inc esi
  842.                 .else_e:
  843.  
  844.                 ;if (pole_compare_bm_xzy(a[j],copy)) {
  845.                 stdcall pole_compare_bm_xzy, eax, esi,-1
  846.                 cmp dl,0
  847.                 je .cycle_e ;} else break; //âûõîä èç öèêëà
  848.  
  849.                 stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
  850.                 mov ebx,esi ;i=j;
  851.                 mov edi,ebx
  852.                 shl edi,1 ;m=2*i;
  853.  
  854.                 jmp .cycle_b
  855.         .cycle_e:
  856.  
  857.         ;çíà÷åíèÿ ìíîãèõ ðåãèñòðîâ óæå íå âàæíû ò. ê. êîíåö ôóíêöèè
  858.         stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
  859.  
  860.         popad
  861.         ret
  862. endp
  863.  
  864. ;output:
  865. ; dl
  866. align 4
  867. proc pole_compare_bm_xzy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
  868.  
  869.         mov eax,[i0] ;eax -> cell[i0]
  870.     imul eax,vox_ogl_size
  871.     add eax,[p_mem]
  872.  
  873.         mov ebx,[i1] ;ebx -> cell[i1]
  874.     cmp ebx,0
  875.     jl .copy
  876.     imul ebx,vox_ogl_size
  877.     add ebx,[p_mem]
  878.     jmp @f
  879.     .copy:
  880.         mov ebx,mem_copy_32
  881.     @@:
  882.  
  883.         mov cx,word[ebx+vox_ogl_zoom] ;zoom
  884.         cmp word[eax+vox_ogl_zoom],cx
  885.         jle @f ;zoom0>zoom1
  886.                 mov dl,1
  887.                 jmp .fun_e
  888.         @@:
  889.         jne .r_0 ;if zoom0<zoom1 return 0
  890.  
  891.         mov ecx,dword[ebx+vox_ogl_x0] ;coord x
  892.         cmp dword[eax+vox_ogl_x0],ecx
  893.         jle @f ;x0>x1
  894.                 mov dl,1
  895.                 jmp .fun_e
  896.         @@:
  897.         jne .r_0 ;if x0<x1 return 0
  898.  
  899.         mov ecx,dword[ebx+vox_ogl_z0] ;coord z
  900.         cmp dword[eax+vox_ogl_z0],ecx
  901.         jle @f ;z0>z1
  902.                 mov dl,1
  903.                 jmp .fun_e
  904.         @@:
  905.         jne .r_0 ;if z0<z1 return 0
  906.  
  907.         mov ecx,dword[ebx+vox_ogl_y0] ;coord y
  908.         cmp dword[eax+vox_ogl_y0],ecx
  909.         jle @f ;y0>y1
  910.                 mov dl,1
  911.                 jmp .fun_e
  912.         @@:
  913.  
  914.     .r_0:
  915.         xor dl,dl
  916.         .fun_e:
  917.         ret
  918. endp
  919. end if
  920.  
  921. ;Ñîðòèðîâêà âåêòîðà a[1..n] ìåòîäîì Ôëîéäà
  922. align 4
  923. proc pole_fl_sort_zxy, a:dword, n:dword
  924.         pushad
  925.         mov ecx,dword[a]
  926.         ;Ôîðìèðîâàòü èñõîäíîå ÷àñòè÷íî óïîðÿäî÷åííîå äåðåâî
  927.         mov eax,dword[n]
  928.         shr eax,1
  929.         @@: ;for(i=n/2; i>=2; i--)
  930.                 stdcall pole_fl_surface_zxy, ecx,eax,[n] ;(a,i,n)
  931.                 dec eax
  932.                 cmp eax,2
  933.                 jge @b
  934.         ;Âûïîëíèòü ïðîöåäóðó âñïëûòèÿ Ôëîéäà äëÿ êàæäîãî ïîääåðåâà
  935.         mov eax,dword[n]
  936.         @@: ;for(i=n; i>=2; i--){
  937.                 stdcall pole_fl_surface_zxy, ecx,1,eax ;(a,1,i)
  938.                 ;Ïîìåñòèòü íàéäåííûé ìàêñèìàëüíûé ýëåìåíò â êîíåö ñïèñêà
  939.         stdcall swap_cell, ecx,1,eax ;ìåíÿåì ìåñòàìè a[1] <-> a[i]
  940.                 dec eax
  941.                 cmp eax,2
  942.                 jge @b
  943.         popad
  944.         ret
  945. endp
  946.  
  947. ;Ïðîöåäóðà âñïëûòèÿ Ôëîéäà ïî äåðåâó a[1..k]
  948. align 4
  949. proc pole_fl_surface_zxy, a:dword, i:dword, k:dword
  950.         pushad
  951.         ;edx -> ...
  952.         ;edi -> m
  953.         ;esi -> j
  954.         mov eax,dword[a]
  955.         mov ebx,dword[i]
  956.         mov ecx,dword[k]
  957.  
  958.         stdcall copy_cell, eax, -1,ebx ;copy=a[i];
  959.         mov edi,ebx
  960.         shl edi,1 ;m=2*i ãäå edi=m
  961.         .cycle_b: ;while (m<=k) {
  962.                 cmp edi,ecx
  963.                 jg .cycle_e
  964.                 jne @f ;if (m==k) j=m;
  965.                         mov esi,edi
  966.                         jmp .else_e
  967.                 @@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m;
  968.                 mov edx,edi
  969.         inc edx
  970.                 stdcall pole_compare_bm_zxy, eax, edi,edx
  971.                 cmp dl,0
  972.                 je @f
  973.                         mov esi,edi
  974.                         jmp .else_e
  975.                 @@: ;else j=m+1;
  976.                         mov esi,edi
  977.                         inc esi
  978.                 .else_e:
  979.  
  980.                 ;if (pole_compare_bm_xzy(a[j],copy)) {
  981.                 stdcall pole_compare_bm_zxy, eax, esi,-1
  982.                 cmp dl,0
  983.                 je .cycle_e ;} else break; //âûõîä èç öèêëà
  984.  
  985.                 stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
  986.                 mov ebx,esi ;i=j;
  987.                 mov edi,ebx
  988.                 shl edi,1 ;m=2*i;
  989.  
  990.                 jmp .cycle_b
  991.         .cycle_e:
  992.  
  993.         ;çíà÷åíèÿ ìíîãèõ ðåãèñòðîâ óæå íå âàæíû ò. ê. êîíåö ôóíêöèè
  994.         stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
  995.  
  996.         popad
  997.         ret
  998. endp
  999.  
  1000. ;output:
  1001. ; dl
  1002. align 4
  1003. proc pole_compare_bm_zxy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
  1004.  
  1005.         mov eax,[i0] ;eax -> cell[i0]
  1006.     imul eax,vox_ogl_size
  1007.     add eax,[p_mem]
  1008.  
  1009.         mov ebx,[i1] ;ebx -> cell[i1]
  1010.     cmp ebx,0
  1011.     jl .copy
  1012.     imul ebx,vox_ogl_size
  1013.     add ebx,[p_mem]
  1014.     jmp @f
  1015.     .copy:
  1016.         mov ebx,mem_copy_32
  1017.     @@:
  1018.  
  1019.         mov cx,word[ebx+vox_ogl_zoom] ;zoom
  1020.         cmp word[eax+vox_ogl_zoom],cx
  1021.         jle @f ;zoom0>zoom1
  1022.                 mov dl,1
  1023.                 jmp .fun_e
  1024.         @@:
  1025.         jne .r_0 ;if zoom0<zoom1 return 0
  1026.  
  1027.         mov ecx,dword[ebx+vox_ogl_z0] ;coord z
  1028.         cmp dword[eax+vox_ogl_z0],ecx
  1029.         jle @f ;z0>z1
  1030.                 mov dl,1
  1031.                 jmp .fun_e
  1032.         @@:
  1033.         jne .r_0 ;if z0<z1 return 0
  1034.  
  1035.         mov ecx,dword[ebx+vox_ogl_x0] ;coord x
  1036.         cmp dword[eax+vox_ogl_x0],ecx
  1037.         jle @f ;x0>x1
  1038.                 mov dl,1
  1039.                 jmp .fun_e
  1040.         @@:
  1041.         jne .r_0 ;if x0<x1 return 0
  1042.  
  1043.         mov ecx,dword[ebx+vox_ogl_y0] ;coord y
  1044.         cmp dword[eax+vox_ogl_y0],ecx
  1045.         jle @f ;y0>y1
  1046.                 mov dl,1
  1047.                 jmp .fun_e
  1048.         @@:
  1049.  
  1050.     .r_0:
  1051.         xor dl,dl
  1052.         .fun_e:
  1053.         ret
  1054. endp
  1055.  
  1056. ;Ñîðòèðîâêà âåêòîðà a[1..n] ìåòîäîì Ôëîéäà
  1057. align 4
  1058. proc pole_fl_sort_yzx, a:dword, n:dword
  1059.         pushad
  1060.         mov ecx,dword[a]
  1061.         ;Ôîðìèðîâàòü èñõîäíîå ÷àñòè÷íî óïîðÿäî÷åííîå äåðåâî
  1062.         mov eax,dword[n]
  1063.         shr eax,1
  1064.         @@: ;for(i=n/2; i>=2; i--)
  1065.                 stdcall pole_fl_surface_yzx, ecx,eax,[n] ;(a,i,n)
  1066.                 dec eax
  1067.                 cmp eax,2
  1068.                 jge @b
  1069.         ;Âûïîëíèòü ïðîöåäóðó âñïëûòèÿ Ôëîéäà äëÿ êàæäîãî ïîääåðåâà
  1070.         mov eax,dword[n]
  1071.         @@: ;for(i=n; i>=2; i--){
  1072.                 stdcall pole_fl_surface_yzx, ecx,1,eax ;(a,1,i)
  1073.                 ;Ïîìåñòèòü íàéäåííûé ìàêñèìàëüíûé ýëåìåíò â êîíåö ñïèñêà
  1074.         stdcall swap_cell, ecx,1,eax ;ìåíÿåì ìåñòàìè a[1] <-> a[i]
  1075.                 dec eax
  1076.                 cmp eax,2
  1077.                 jge @b
  1078.         popad
  1079.         ret
  1080. endp
  1081.  
  1082. ;Ïðîöåäóðà âñïëûòèÿ Ôëîéäà ïî äåðåâó a[1..k]
  1083. align 4
  1084. proc pole_fl_surface_yzx, a:dword, i:dword, k:dword
  1085.         pushad
  1086.         ;edx -> ...
  1087.         ;edi -> m
  1088.         ;esi -> j
  1089.         mov eax,dword[a]
  1090.         mov ebx,dword[i]
  1091.         mov ecx,dword[k]
  1092.  
  1093.         stdcall copy_cell, eax, -1,ebx ;copy=a[i];
  1094.         mov edi,ebx
  1095.         shl edi,1 ;m=2*i ãäå edi=m
  1096.         .cycle_b: ;while (m<=k) {
  1097.                 cmp edi,ecx
  1098.                 jg .cycle_e
  1099.                 jne @f ;if (m==k) j=m;
  1100.                         mov esi,edi
  1101.                         jmp .else_e
  1102.                 @@: ;else if (pole_compare_bm_yzx(a[m],a[m+1])) j=m;
  1103.                 mov edx,edi
  1104.         inc edx
  1105.                 stdcall pole_compare_bm_yzx, eax, edi,edx
  1106.                 cmp dl,0
  1107.                 je @f
  1108.                         mov esi,edi
  1109.                         jmp .else_e
  1110.                 @@: ;else j=m+1;
  1111.                         mov esi,edi
  1112.                         inc esi
  1113.                 .else_e:
  1114.  
  1115.                 ;if (pole_compare_bm_yzx(a[j],copy)) {
  1116.                 stdcall pole_compare_bm_yzx, eax, esi,-1
  1117.                 cmp dl,0
  1118.                 je .cycle_e ;} else break; //âûõîä èç öèêëà
  1119.  
  1120.                 stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
  1121.                 mov ebx,esi ;i=j;
  1122.                 mov edi,ebx
  1123.                 shl edi,1 ;m=2*i;
  1124.  
  1125.                 jmp .cycle_b
  1126.         .cycle_e:
  1127.  
  1128.         ;çíà÷åíèÿ ìíîãèõ ðåãèñòðîâ óæå íå âàæíû ò. ê. êîíåö ôóíêöèè
  1129.         stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
  1130.  
  1131.         popad
  1132.         ret
  1133. endp
  1134.  
  1135. ;output:
  1136. ; dl
  1137. align 4
  1138. proc pole_compare_bm_yzx uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
  1139.  
  1140.         mov eax,[i0] ;eax -> cell[i0]
  1141.     imul eax,vox_ogl_size
  1142.     add eax,[p_mem]
  1143.  
  1144.         mov ebx,[i1] ;ebx -> cell[i1]
  1145.     cmp ebx,0
  1146.     jl .copy
  1147.     imul ebx,vox_ogl_size
  1148.     add ebx,[p_mem]
  1149.     jmp @f
  1150.     .copy:
  1151.         mov ebx,mem_copy_32
  1152.     @@:
  1153.  
  1154.         mov cx,word[ebx+vox_ogl_zoom] ;zoom
  1155.         cmp word[eax+vox_ogl_zoom],cx
  1156.         jle @f ;zoom0>zoom1
  1157.                 mov dl,1
  1158.                 jmp .fun_e
  1159.         @@:
  1160.         jne .r_0 ;if zoom0<zoom1 return 0
  1161.  
  1162.         mov ecx,dword[ebx+vox_ogl_y0] ;coord y
  1163.         cmp dword[eax+vox_ogl_y0],ecx
  1164.         jle @f ;y0>y1
  1165.                 mov dl,1
  1166.                 jmp .fun_e
  1167.         @@:
  1168.         jne .r_0 ;if y0<y1 return 0
  1169.  
  1170.         mov ecx,dword[ebx+vox_ogl_z0] ;coord z
  1171.         cmp dword[eax+vox_ogl_z0],ecx
  1172.         jle @f ;z0>z1
  1173.                 mov dl,1
  1174.                 jmp .fun_e
  1175.         @@:
  1176.         jne .r_0 ;if z0<z1 return 0
  1177.  
  1178.         mov ecx,dword[ebx+vox_ogl_x0] ;coord x
  1179.         cmp dword[eax+vox_ogl_x0],ecx
  1180.         jle @f ;x0>x1
  1181.                 mov dl,1
  1182.                 jmp .fun_e
  1183.         @@:
  1184.  
  1185.     .r_0:
  1186.         xor dl,dl
  1187.         .fun_e:
  1188.         ret
  1189. endp
  1190.  
  1191. align 4
  1192. proc copy_cell uses ecx edi esi, p_mem:dword, i0:dword, i1:dword
  1193.  
  1194.     mov esi,[i1]
  1195.     cmp esi,0
  1196.     jl .copy_0
  1197.     imul esi,vox_ogl_size
  1198.     add esi,[p_mem]
  1199.     jmp @f
  1200.     .copy_0:
  1201.         mov esi,mem_copy_32
  1202.     @@:
  1203.  
  1204.     mov edi,[i0]
  1205.     cmp edi,0
  1206.     jl .copy_1
  1207.     imul edi,vox_ogl_size
  1208.     add edi,[p_mem]
  1209.     jmp @f
  1210.     .copy_1:
  1211.         mov edi,mem_copy_32
  1212.     @@:
  1213.  
  1214. if vox_ogl_size eq 34
  1215.     mov ecx,8 ;ecx=32/4
  1216.     cld
  1217.     rep movsd
  1218.     movsw
  1219. else
  1220.     vox_ogl_size íå ðàâíî 34 !
  1221. end if
  1222.     ret
  1223. endp
  1224.  
  1225. align 4
  1226. proc swap_cell uses eax ebx ecx edi esi, p_mem:dword, i0:dword, i1:dword
  1227.     mov esi,[i0]
  1228.     imul esi,vox_ogl_size
  1229.     add esi,[p_mem]
  1230.     mov edi,[i1]
  1231.     imul edi,vox_ogl_size
  1232.     add edi,[p_mem]
  1233. if vox_ogl_size eq 34
  1234.     ;vox_ogl_size = 34 = 32 + 2
  1235.     mov ecx,8 ;ecx=32/4
  1236.     cld
  1237.     @@:
  1238.         mov eax,dword[edi]
  1239.         mov ebx,dword[esi]
  1240.         mov dword[edi],ebx
  1241.         mov dword[esi],eax
  1242.         add esi,4
  1243.         add edi,4
  1244.         loop @b
  1245.     mov ax,word[edi]
  1246.     mov bx,word[esi]
  1247.     mov word[edi],bx
  1248.     mov word[esi],ax
  1249. else
  1250.     vox_ogl_size íå ðàâíî 34 !
  1251. end if
  1252.     ret
  1253. endp
  1254.  
  1255. align 4
  1256. mem_copy_32 rb vox_ogl_size
  1257.  
  1258. ;ôóíêöèÿ äëÿ êîðåêòèðîâêè êîîðäèíàò
  1259. ;íàïðàâëåíèÿ îñåé êîîðäèíàò â âîêñåëå:
  1260. ;*z
  1261. ;|
  1262. ;+-* x
  1263. ;input:
  1264. ;  al - íîìåð óçëà â äåðåâå (îò 1 äî 8)
  1265. ; ebx - êîîðäèíàòà x
  1266. ; edx - êîîðäèíàòà y
  1267. ; esi - êîîðäèíàòà z
  1268. ; ecx - óðîâåíü òåêóøåãî óçëà
  1269. ;output:
  1270. ; ebx - íîâàÿ êîîðäèíàòà x
  1271. ; edx - íîâàÿ êîîðäèíàòà y
  1272. ; esi - íîâàÿ êîîðäèíàòà z
  1273. align 4
  1274. proc vox_corect_coords_pl, v_obj:dword, v_size:dword
  1275.         cmp ecx,0
  1276.         jl .end_f ;äëÿ óñêîðåíèÿ îòðèñîâêè
  1277.  
  1278.         push eax edi
  1279.         and eax,15 ;âûäåëÿåì íîìåð óçëà â äåðåâå
  1280.         mov edi,[v_obj]
  1281.         add edi,vox_offs_tree_table
  1282.         add edi,8
  1283.         sub edi,eax
  1284.  
  1285.         mov eax,[v_size]
  1286.         cmp ecx,1
  1287.         jl @f
  1288.                 shl eax,cl
  1289.         @@:
  1290.  
  1291.         bt word[edi],0 ;test voxel coord x
  1292.         jnc @f
  1293.                 add ebx,eax
  1294.         @@:
  1295.         bt word[edi],2 ;test voxel coord z
  1296.         jnc @f
  1297.                 sub edx,eax
  1298.         @@:
  1299.         bt word[edi],1 ;test voxel coord y
  1300.         jc @f
  1301.                 mov eax,1
  1302.                 cmp ecx,1
  1303.                 jl .end_0
  1304.                         shl eax,cl
  1305.                 .end_0:
  1306.                 add esi,eax ;ìåíÿåì ãëóáèíó äëÿ áóôåðà z
  1307.         @@:
  1308.         pop edi eax
  1309.         .end_f:
  1310.         ret
  1311. endp
  1312.  
  1313. align 4
  1314. p1 dd ?
  1315. p2 dd ?
  1316.  
  1317. align 4
  1318. proc draw_voxels_3d uses ebx ecx edx edi, p_mem:dword
  1319. locals
  1320.     v_count dd ?
  1321. endl
  1322.     mov edi,[p_mem]
  1323.     cmp edi,0
  1324.     je .end_f
  1325.     mov eax,dword[edi]
  1326.     mov dword[v_count],eax
  1327.     add edi,4
  1328.  
  1329. bt word[opt_cube_box],0
  1330. jnc @f
  1331. ;ðèñîâàíèå ðàìêè
  1332. stdcall [glColor3ub],128,128,128
  1333. stdcall [glBegin],GL_LINE_STRIP
  1334.     stdcall [glVertex3f], -0.5, -0.5, -0.5
  1335.     stdcall [glVertex3f], -0.5,  0.5, -0.5
  1336.     stdcall [glVertex3f],  0.5,  0.5, -0.5
  1337.     stdcall [glVertex3f],  0.5, -0.5, -0.5
  1338.     stdcall [glVertex3f], -0.5, -0.5, -0.5
  1339.     stdcall [glVertex3f], -0.5, -0.5,  0.5
  1340.     stdcall [glVertex3f], -0.5,  0.5,  0.5
  1341.     stdcall [glVertex3f],  0.5,  0.5,  0.5
  1342.     stdcall [glVertex3f],  0.5, -0.5,  0.5
  1343.     stdcall [glVertex3f], -0.5, -0.5,  0.5
  1344. stdcall [glEnd]
  1345. stdcall [glBegin],GL_LINES
  1346.     stdcall [glVertex3f], -0.5,  0.5, -0.5
  1347.     stdcall [glVertex3f], -0.5,  0.5,  0.5
  1348.     stdcall [glVertex3f],  0.5,  0.5, -0.5
  1349.     stdcall [glVertex3f],  0.5,  0.5,  0.5
  1350.     stdcall [glVertex3f],  0.5, -0.5, -0.5
  1351.     stdcall [glVertex3f],  0.5, -0.5,  0.5
  1352. stdcall [glEnd]
  1353. @@:
  1354.  
  1355. ;ðèñîâàíèå îáúåêòà
  1356.     stdcall [glBegin],GL_QUADS
  1357.     .cycle_0:
  1358.         cmp dword[v_count],1
  1359.         jl .cycle_1
  1360.         stdcall [glColor3ub],[edi+vox_ogl_color+2],[edi+vox_ogl_color+1],[edi+vox_ogl_color]
  1361.  
  1362.         bt word[edi+vox_ogl_planes],vox_ogl_gran_z1
  1363.         jnc .e_gran_z1
  1364.         ;ïåðåäíÿÿ ãðàíü Normal(0.0,0.0,normal_gran_z1)
  1365.             normal_gran p1,x0
  1366.             normal_gran_2 p1,x0z1,x1
  1367.             normal_gran p2,y0
  1368.             normal_gran_2 p2,y0z1,y1
  1369.             stdcall [glNormal3f], [p1],[p2],normal_gran_z1
  1370.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1371.             normal_gran p1,x1
  1372.             normal_gran_2 p1,x1z1,x0
  1373.             ;normal_gran p2,y0
  1374.             ;normal_gran_2 p2,y0z1,y1
  1375.             stdcall [glNormal3f], [p1],[p2],normal_gran_z1
  1376.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1377.             ;normal_gran p1,x1
  1378.             ;normal_gran_2 p1,x1z1,x0
  1379.             normal_gran p2,y1
  1380.             normal_gran_2 p2,y1z1,y0
  1381.             stdcall [glNormal3f], [p1],[p2],normal_gran_z1
  1382.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1383.             normal_gran p1,x0
  1384.             normal_gran_2 p1,x0z1,x1
  1385.             ;normal_gran p2,y1
  1386.             ;normal_gran_2 p2,y1z1,y0            
  1387.             stdcall [glNormal3f], [p1],[p2],normal_gran_z1
  1388.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1389.         .e_gran_z1:
  1390.  
  1391.         bt word[edi+vox_ogl_planes],vox_ogl_gran_y0
  1392.         jnc .e_gran_y0
  1393.         ;âåðõíÿÿ ãðàíü Normal(0.0,normal_gran_y0,0.0)
  1394.             normal_gran p1,x0
  1395.             normal_gran_2 p1,x0y0,x1
  1396.             normal_gran p2,z0
  1397.             normal_gran_2 p2,y0z0,z1
  1398.             stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
  1399.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1400.             normal_gran p1,x1
  1401.             normal_gran_2 p1,x1y0,x0
  1402.             ;normal_gran p2,z0
  1403.             ;normal_gran_2 p2,y0z0,z1
  1404.             stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
  1405.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1406.             ;normal_gran p1,x1
  1407.             ;normal_gran_2 p1,x1y0,x0
  1408.             normal_gran p2,z1
  1409.             normal_gran_2 p2,y0z1,z0
  1410.             stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
  1411.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1412.             normal_gran p1,x0
  1413.             normal_gran_2 p1,x0y0,x1
  1414.             ;normal_gran p2,z1
  1415.             ;normal_gran_2 p2,y0z1,z0
  1416.             stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
  1417.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1418.         .e_gran_y0:
  1419.  
  1420.         bt word[edi+vox_ogl_planes],vox_ogl_gran_y1
  1421.         jnc .e_gran_y1
  1422.         ;íèæíÿÿ ãðàíü Normal(0.0,normal_gran_y1,0.0)
  1423.             normal_gran p1,x0
  1424.             normal_gran_2 p1,x0y1,x1
  1425.             normal_gran p2,z1
  1426.             normal_gran_2 p2,y1z1,z0
  1427.             stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
  1428.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1429.             normal_gran p1,x1
  1430.             normal_gran_2 p1,x1y1,x0
  1431.             ;normal_gran p2,z1
  1432.             ;normal_gran_2 p2,y1z1,z0
  1433.             stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
  1434.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1435.             ;normal_gran p1,x1
  1436.             ;normal_gran_2 p1,x1y1,x0
  1437.             normal_gran p2,z0
  1438.             normal_gran_2 p2,y1z0,z1
  1439.             stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
  1440.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1441.             normal_gran p1,x0
  1442.             normal_gran_2 p1,x0y1,x1
  1443.             ;normal_gran p2,z0
  1444.             ;normal_gran_2 p2,y1z0,z1
  1445.             stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
  1446.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1447.         .e_gran_y1:
  1448.  
  1449.         bt word[edi+vox_ogl_planes],vox_ogl_gran_x0
  1450.         jnc .e_gran_x0
  1451.         ;ëåâàÿ ãðàíü Normal(normal_gran_x0,0.0,0.0)
  1452.             normal_gran p1,y0
  1453.             normal_gran_2 p1,x0y0,y1
  1454.             normal_gran p2,z1
  1455.             normal_gran_2 p2,x0z1,z0
  1456.             stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
  1457.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1458.             normal_gran p1,y1
  1459.             normal_gran_2 p1,x0y1,y0
  1460.             ;normal_gran p2,z1
  1461.             ;normal_gran_2 p2,x0z1,z0
  1462.             stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
  1463.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1464.             ;normal_gran p1,y1
  1465.             ;normal_gran_2 p1,x0y1,y0
  1466.             normal_gran p2,z0
  1467.             normal_gran_2 p2,x0z0,z1
  1468.             stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
  1469.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1470.             normal_gran p1,y0
  1471.             normal_gran_2 p1,x0y0,y1
  1472.             ;normal_gran p2,z0
  1473.             ;normal_gran_2 p2,x0z0,z1
  1474.             stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
  1475.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1476.         .e_gran_x0:
  1477.  
  1478.         bt word[edi+vox_ogl_planes],vox_ogl_gran_x1
  1479.         jnc .e_gran_x1
  1480.         ;ïðàâàÿ ãðàíü Normal(normal_gran_x1,0.0,0.0)
  1481.             normal_gran p1,y0
  1482.             normal_gran_2 p1,x1y0,y1
  1483.             normal_gran p2,z1
  1484.             normal_gran_2 p2,x1z1,z0
  1485.             stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
  1486.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
  1487.             ;normal_gran p1,y0
  1488.             ;normal_gran_2 p1,x1y0,y1
  1489.             normal_gran p2,z0
  1490.             normal_gran_2 p2,x1z0,z1
  1491.             stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
  1492.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1493.             normal_gran p1,y1
  1494.             normal_gran_2 p1,x1y1,y0
  1495.             ;normal_gran p2,z0
  1496.             ;normal_gran_2 p2,x1z0,z1
  1497.             stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
  1498.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1499.             ;normal_gran p1,y1
  1500.             ;normal_gran_2 p1,x1y1,y0
  1501.             normal_gran p2,z1
  1502.             normal_gran_2 p2,x1z1,z0
  1503.             stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
  1504.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
  1505.         .e_gran_x1:
  1506.  
  1507.         bt word[edi+vox_ogl_planes],vox_ogl_gran_z0
  1508.         jnc .e_gran_z0
  1509.         ;çàäíÿÿ ãðàíü Normal(0.0,0.0,normal_gran_z0)
  1510.             normal_gran p1,x0
  1511.             normal_gran_2 p1,x0z0,x1
  1512.             normal_gran p2,y1
  1513.             normal_gran_2 p2,y1z0,y0
  1514.             stdcall [glNormal3f], [p1],[p2],normal_gran_z0
  1515.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1516.             normal_gran p1,x1
  1517.             normal_gran_2 p1,x1z0,x0
  1518.             ;normal_gran p2,y1
  1519.             ;normal_gran_2 p2,y1z0,y0
  1520.             stdcall [glNormal3f], [p1],[p2],normal_gran_z0
  1521.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
  1522.             ;normal_gran p1,x1
  1523.             ;normal_gran_2 p1,x1z0,x0
  1524.             normal_gran p2,y0
  1525.             normal_gran_2 p2,y0z0,y1
  1526.             stdcall [glNormal3f], [p1],[p2],normal_gran_z0
  1527.         stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1528.             normal_gran p1,x0
  1529.             normal_gran_2 p1,x0z0,x1
  1530.             ;normal_gran p2,y0
  1531.             ;normal_gran_2 p2,y0z0,y1
  1532.             stdcall [glNormal3f], [p1],[p2],normal_gran_z0
  1533.         stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
  1534.         .e_gran_z0:
  1535.  
  1536.         ;goto next voxel
  1537.         add edi,vox_ogl_size
  1538.         dec dword[v_count]
  1539.         jmp .cycle_0
  1540.     .cycle_1:
  1541.  
  1542.     stdcall [glEnd]
  1543.  
  1544.     .end_f:
  1545.     ret
  1546. endp
  1547.