Subversion Repositories Kolibri OS

Rev

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

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