Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; áâàãªâãàë ¨ ä㭪樨 ¤«ï à¨á®¢ ­¨ï 3d ®¡ê¥ªâ®¢
  3. ;
  4.  
  5. offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc'
  6.  
  7. struct obj_3d
  8.         poi_data dd ? ;㪠§ â¥«ì ­  ª®®à¤¨­ âë ¢¥à設
  9.         poi_count dd ? ;ª®««¨ç¥á⢮ ¢¥à設
  10.         tri_data dd ? ;㪠§ â¥«ì ­  ¤ ­­ë¥ âà¥ã£®«ì­¨ª®¢
  11.         tri_count dd ? ;ª®««¨ç¥á⢮ âà¥ã£®«ì­¨ª®¢
  12.         normals_poi_data dd ? ;¤ ­­ë¥ ­®à¬ «¥© ª â®çª ¬
  13.         normals_poi_count dd ? ;ª®««¨ç¥á⢮ ­®à¬ «¥© ª â®çª ¬
  14.         normals_tri_data dd ? ;¤ ­­ë¥ ­®à¬ «¥© ª £à ­ï¬
  15.         normals_tri_count dd ? ;ª®««¨ç¥á⢮ ­®à¬ «¥© ª £à ­ï¬
  16.         x_max dd ?
  17.         x_min dd ?
  18.         x_centr dd ?
  19.         x_scale dd ?
  20.         y_max dd ?
  21.         y_min dd ?
  22.         y_centr dd ?
  23.         y_scale dd ?
  24.         z_max dd ?
  25.         z_min dd ?
  26.         z_centr dd ?
  27.         z_scale dd ?
  28.         mat1_data dd ? ;¤ ­­ë¥ 1-£® ¬ â¥à¨ «  ¢ ®¡ê¥ªâ¥
  29. ends
  30.  
  31. offs_obj_poi_data equ 0 ;㪠§ â¥«ì ­  ª®®à¤¨­ âë ¢¥à設
  32. offs_obj_poi_count equ 4 ;ª®««¨ç¥á⢮ ¢¥à設
  33. offs_obj_tri_data equ 8 ;㪠§ â¥«ì ­  ¤ ­­ë¥ âà¥ã£®«ì­¨ª®¢
  34. offs_obj_tri_count equ 12 ;ª®««¨ç¥á⢮ âà¥ã£®«ì­¨ª®¢
  35. offs_obj_normals_poi_data equ 16
  36. offs_obj_normals_poi_count equ 20
  37. offs_obj_normals_tri_data equ 24
  38. offs_obj_normals_tri_count equ 28
  39. offs_obj_x_max equ 32
  40. offs_obj_x_min equ 36
  41. offs_obj_x_centr equ 40
  42. offs_obj_x_scale equ 44
  43. offs_obj_y_max equ 48
  44. offs_obj_y_min equ 52
  45. offs_obj_y_centr equ 56
  46. offs_obj_y_scale equ 60
  47. offs_obj_z_max equ 64
  48. offs_obj_z_min equ 68
  49. offs_obj_z_centr equ 72
  50. offs_obj_z_scale equ 76
  51. offs_obj_mat1_data equ 80
  52.  
  53. struct material
  54.         name dd ?
  55.         col_ambient dd ? ;梥⠬ â¥à¨ « 
  56.         col_diffuse dd ?
  57.         col_specular dd ?
  58. ends
  59.  
  60. offs_mat_name equ 0
  61. offs_mat_col_ambient equ 4
  62. offs_mat_col_diffuse equ 8
  63. offs_mat_col_specular equ 12
  64.  
  65. bit_vertexes equ 0
  66. bit_faces equ 1 ;£à ­¨ à¨áãîâáï ª®­âãà ¬¨
  67. bit_faces_fill equ 2 ;£à ­¨ á § «¨¢ª®©
  68. bit_light equ 3
  69. bit_faces_mat equ 4 ;£à ­¨ á 梥⮬ ¬ â¥à¨ « 
  70. bit_smooth equ 5 ;£à ­¨ ᮠᣫ ¦¨¢ ­¨¥¬
  71.  
  72. ini_name db 'info3ds.ini',0
  73. ini_sec_w3d db 'Window 3d',0
  74. key_dv  db 'draw_vertices',0
  75. key_df  db 'draw_faces',0
  76. key_dff db 'draw_faces_fill',0
  77. key_dfm db 'draw_faces_material',0
  78. key_dl  db 'draw_light',0
  79. key_ds  db 'draw_smooth',0
  80. key_ox  db 'col_ox',0
  81. key_oy  db 'col_oy',0
  82. key_oz  db 'col_oz',0
  83. key_bk  db 'col_bkgnd',0
  84. key_vert db 'col_vertices',0
  85. key_face db 'col_faces',0
  86. key_select db 'col_select',0
  87.  
  88.  
  89. rad_c dd 150 ;¤«ï ¢ëç¨á«¥­¨ï à ¤¨ãá 
  90.  
  91. align 4
  92. proc hex_in_str, buf:dword,val:dword,zif:dword
  93. pushad
  94.         mov edi,dword[buf]
  95.         mov ecx,dword[zif]
  96.         add edi,ecx
  97.         dec edi
  98.         mov ebx,dword[val]
  99.  
  100.         .cycle:
  101.                 mov al,bl
  102.                 and al,0xf
  103.                 cmp al,10
  104.                 jl @f
  105.                         add al,'a'-'0'-10
  106.                 @@:
  107.                 add al,'0'
  108.                 mov byte[edi],al
  109.                 dec edi
  110.                 shr ebx,4
  111.         loop .cycle
  112. popad
  113.         ret
  114. endp
  115.  
  116. ;ãáâ ­®¢ª  ¢á¥å ®á­®¢­ëå ¯¥à¥¬¥­­ëå ¯® 㬮«ç ­¨î
  117. align 4
  118. proc obj_clear_param uses edi, o_data:dword
  119.         mov edi,[o_data]
  120.         ;®¡­ã«¥­¨¥ 㪠§ â¥«¥© ­  ¤ ­­ë¥ ®¡ê¥ªâ®¢
  121.         mov dword[edi+offs_obj_poi_data],0
  122.         mov dword[edi+offs_obj_poi_count],0
  123.         mov dword[edi+offs_obj_tri_data],0
  124.         mov dword[edi+offs_obj_tri_count],0
  125.         mov dword[edi+offs_obj_normals_tri_count],0
  126.         mov dword[edi+offs_obj_normals_poi_count],0
  127.         mov dword[edi+offs_obj_mat1_data],0
  128.         cmp dword[edi+offs_obj_normals_tri_data],0
  129.         je @f
  130.                 stdcall mem.Free,[edi+offs_obj_normals_tri_data]
  131.                 mov dword[edi+offs_obj_normals_tri_data],0
  132.         @@:
  133.         cmp dword[edi+offs_obj_normals_poi_data],0
  134.         je @f
  135.                 stdcall mem.Free,[edi+offs_obj_normals_poi_data]
  136.                 mov dword[edi+offs_obj_normals_poi_data],0
  137.         @@:
  138.         ret
  139. endp
  140.  
  141. ;¯®¨áª ¤ ­­ëå
  142. ;input:
  143. ;eax - ⥪ã騩 㧥«
  144. ;output:
  145. ;eax - áâàãªâãà  â¥ªã饣® 㧫  (¨«¨ 0 ¯à¨ ­¥ã¤ ç¥)
  146. align 4
  147. proc found_block_data uses ebx ecx edx, tlist:dword
  148.         mov edx,[tlist]
  149.         mov ecx,eax
  150.         stdcall [tl_node_poi_get_info], edx,0
  151.         @@:
  152.                 mov ebx,eax
  153.                 stdcall [tl_node_poi_get_data], edx,ebx
  154.                 cmp eax,ecx
  155.                 je @f ;¥á«¨ ¯®¯ «¨ ­  ¢ë¡à ­­ë© 㧥«
  156.                 stdcall [tl_node_poi_get_next_info], edx,ebx
  157.                 cmp eax,0
  158.                 jne @b
  159.                 jmp .end
  160.         @@:
  161.                 mov eax,ebx
  162.         .end:
  163.         ret
  164. endp
  165.  
  166. ;ãáâ ­®¢ª  à §¬¥à®¢ ®¡ê¥ªâ 
  167. align 4
  168. proc obj_set_sizes uses eax ebx esi edi, o_data:dword
  169.         mov edi,[o_data]
  170.         cmp dword[edi+offs_obj_poi_count],0
  171.         je .end
  172.                 finit
  173.                 mov eax,[edi+offs_obj_poi_data]
  174.                 mov ebx,dword[eax]
  175.                 mov [edi+offs_obj_x_min],ebx
  176.                 mov [edi+offs_obj_x_max],ebx
  177.                 mov ebx,dword[eax+4]
  178.                 mov [edi+offs_obj_y_min],ebx
  179.                 mov [edi+offs_obj_y_max],ebx
  180.                 mov ebx,dword[eax+8]
  181.                 mov [edi+offs_obj_z_min],ebx
  182.                 mov [edi+offs_obj_z_max],ebx
  183.  
  184.         mov ebx,[edi+offs_obj_poi_data]
  185.         mov esi,[edi+offs_obj_poi_count]
  186. align 4
  187.         .cycle_0: ;à ¡®â  á ª®®à¤¨­ â®© x
  188.                 fld dword[ebx]
  189.                 fld dword[edi+offs_obj_x_min]
  190.                 fcomp
  191.                 fstsw ax
  192.                 sahf
  193.                 jb @f
  194.                         mov eax,[ebx]
  195.                         mov [edi+offs_obj_x_min],eax
  196.                         ffree st0
  197.                         fincstp
  198.                         jmp .next_x
  199.                 @@:
  200.                 fld dword[edi+offs_obj_x_max]
  201.                 fcompp
  202.                 fstsw ax
  203.                 sahf
  204.                 ja .next_x
  205.                         mov eax,[ebx]
  206.                         mov [edi+offs_obj_x_max],eax
  207.                 .next_x:
  208.  
  209.                 add ebx,12
  210.                 dec esi
  211.                 jnz .cycle_0
  212.  
  213.                 fld1
  214.                 fld dword[edi+offs_obj_x_max]
  215.                 fsub dword[edi+offs_obj_x_min]
  216.                 fst dword[edi+offs_obj_x_centr]
  217.                 fdivp ;1/size.x
  218.                 fstp dword[edi+offs_obj_x_scale]
  219.  
  220.                 fld dword[edi+offs_obj_x_centr]
  221.                 fld1
  222.                 fld1
  223.                 faddp
  224.                 fdivp ;centr.x = size.x/2
  225.                 fadd dword[edi+offs_obj_x_min]
  226.                 fchs
  227.                 fstp dword[edi+offs_obj_x_centr]
  228.  
  229.         mov ebx,[edi+offs_obj_poi_data]
  230.         mov esi,[edi+offs_obj_poi_count]
  231. align 4
  232.         .cycle_1: ;à ¡®â  á ª®®à¤¨­ â®© y
  233.                 fld dword[ebx+4]
  234.                 fld dword[edi+offs_obj_y_min]
  235.                 fcomp
  236.                 fstsw ax
  237.                 sahf
  238.                 jb @f
  239.                         mov eax,[ebx+4]
  240.                         mov [edi+offs_obj_y_min],eax
  241.                         ffree st0
  242.                         fincstp
  243.                         jmp .next_y
  244.                 @@:
  245.                 fld dword[edi+offs_obj_y_max]
  246.                 fcompp
  247.                 fstsw ax
  248.                 sahf
  249.                 ja .next_y
  250.                         mov eax,[ebx+4]
  251.                         mov [edi+offs_obj_y_max],eax
  252.                 .next_y:
  253.  
  254.                 add ebx,12
  255.                 dec esi
  256.                 jnz .cycle_1
  257.  
  258.                 fld1
  259.                 fld dword[edi+offs_obj_y_max]
  260.                 fsub dword[edi+offs_obj_y_min]
  261.                 fst dword[edi+offs_obj_y_centr]
  262.                 fdivp ;1/size.y
  263.                 fstp dword[edi+offs_obj_y_scale]
  264.  
  265.                 fld dword[edi+offs_obj_y_centr]
  266.                 fld1
  267.                 fld1
  268.                 faddp
  269.                 fdivp ;centr.y = size.y/2
  270.                 fadd dword[edi+offs_obj_y_min]
  271.                 fchs
  272.                 fstp dword[edi+offs_obj_y_centr]
  273.  
  274.         mov ebx,[edi+offs_obj_poi_data]
  275.         mov esi,[edi+offs_obj_poi_count]
  276. align 4
  277.         .cycle_2: ;à ¡®â  á ª®®à¤¨­ â®© z
  278.                 fld dword[ebx+8]
  279.                 fld dword[edi+offs_obj_z_min]
  280.                 fcomp
  281.                 fstsw ax
  282.                 sahf
  283.                 jb @f
  284.                         mov eax,[ebx+8]
  285.                         mov [edi+offs_obj_z_min],eax
  286.                         ffree st0
  287.                         fincstp
  288.                         jmp .next_z
  289.                 @@:
  290.                 fld dword[edi+offs_obj_z_max]
  291.                 fcompp
  292.                 fstsw ax
  293.                 sahf
  294.                 ja .next_z
  295.                         mov eax,[ebx+8]
  296.                         mov [edi+offs_obj_z_max],eax
  297.                 .next_z:
  298.  
  299.                 add ebx,12
  300.                 dec esi
  301.                 jnz .cycle_2
  302.  
  303.                 fld1
  304.                 fld dword[edi+offs_obj_z_max]
  305.                 fsub dword[edi+offs_obj_z_min]
  306.                 fst dword[edi+offs_obj_z_centr]
  307.                 fdivp ;1/size.z
  308.                 fstp dword[edi+offs_obj_z_scale]
  309.  
  310.                 fld dword[edi+offs_obj_z_centr]
  311.                 fld1
  312.                 fld1
  313.                 faddp
  314.                 fdivp ;centr.z = size.z/2
  315.                 fadd dword[edi+offs_obj_z_min]
  316.                 fchs
  317.                 fstp dword[edi+offs_obj_z_centr]
  318.  
  319.                 ;­ å®¤¨¬ à ¤¨ãá ¤«ï áä¥àë
  320.                 fld dword[edi+offs_obj_x_max]
  321.                 fsub dword[edi+offs_obj_x_min]
  322.                 fld dword[edi+offs_obj_y_max]
  323.                 fsub dword[edi+offs_obj_y_min]
  324.                 faddp
  325.                 fild dword[rad_c]
  326.                 fdivp ;radius=(size.x+size.y)/rad_c
  327.                 fstp dword[sph_radius]
  328.  
  329.         ;¤¥« ¥¬ ®¤¨­ ª®¢ë© ¬ áèâ ¡ ¯® ®áï¬ x ¨ y, çâ®-¡ë ­¥ ­ àãè «¨áì ¯à®¯®à樨 ¨§®¡à ¦¥­¨ï
  330.         fld dword[edi+offs_obj_y_scale]
  331.         fdiv dword[ratio] ;¯à¨¢¥¤¥­¨¥ ¬ áèâ ¡  ¯® ®á¨ y ãç¨â뢠ï çâ® ¯® ¢ëá®â¥ íªà ­ ¬¥­ìè¥
  332.         fcomp dword[edi+offs_obj_x_scale]
  333.         fstsw ax
  334.         sahf
  335.         jb @f
  336.                 ;ᦠ⨥ ¬ áèâ ¡  ¯® y
  337.                 fld dword[edi+offs_obj_x_scale]
  338.                 fmul dword[ratio]
  339.                 fstp dword[edi+offs_obj_y_scale] ;¬ áèâ ¡ ¯® ®á¨ y = ¬ áèâ ¡ ¯® ®á¨ x
  340.                 jmp .end
  341.         @@:
  342.                 ;ᦠ⨥ ¬ áèâ ¡  ¯® x >...<
  343.                 fld     dword[edi+offs_obj_x_scale]
  344.                 fdiv dword[ratio]
  345.                 fstp dword[edi+offs_obj_x_scale]
  346.         .end:
  347.         ret
  348. endp
  349.  
  350. ;description:
  351. ; ¢ëç¨á«¥­¨¥ ­®à¬ «¥© ¤«ï £à ­¥© ¯® 3-¬ ¢¥à設 ¬
  352. ;   â ª¦¥ ­®à¬ «¥© ¤«ï ᣫ ¦¨¢ ­¨ï ª ¢¥à設 ¬
  353. align 4
  354. proc obj_set_normals, o_data:dword
  355. locals
  356.         tbl1 rd 9 ;ebp-72
  357.         tbl2 rd 9 ;ebp-36
  358. endl
  359. pushad
  360.         mov ecx,[o_data]
  361.         cmp dword[ecx+offs_obj_poi_count],0
  362.         je .end
  363.                 mov eax,[ecx+offs_obj_tri_count]
  364.                 mov [ecx+offs_obj_normals_tri_count],eax ;­  ª ¦¤ë© âà¥ã£®«ì­¨ª 1 ­®à¬ «ì
  365.                 cmp eax,0
  366.                 je .end
  367.                 finit
  368.                 imul eax,12
  369.                 stdcall mem.Alloc, eax
  370.                 mov [ecx+offs_obj_normals_tri_data],eax
  371.  
  372.                 mov edx,[ecx+offs_obj_tri_data]
  373.                 mov ebx,[ecx+offs_obj_tri_count]
  374.                 mov ecx,[ecx+offs_obj_poi_data]
  375. align 4
  376.                 @@:
  377.                         mov edi,ebp
  378.                         sub edi,36 ;tbl2
  379.                         movzx esi,word[edx] ;1-ï ¢¥à設 
  380.                         imul esi,12
  381.                         add esi,ecx
  382.                         movsd
  383.                         movsd
  384.                         movsd
  385.                         movzx esi,word[edx+2] ;2-ï ¢¥à設 
  386.                         imul esi,12
  387.                         add esi,ecx
  388.                         movsd
  389.                         movsd
  390.                         movsd
  391.                         movzx esi,word[edx+4] ;3-ï ¢¥à設 
  392.                         imul esi,12
  393.                         add esi,ecx
  394.                         movsd
  395.                         movsd
  396.                         movsd
  397.  
  398.                         mov esi,ebp
  399.                         sub esi,72 ;tbl1
  400.                         sub edi,36 ;tbl2
  401.                         ;v1 <-> v2
  402.                         fld dword[edi+12]
  403.                         fsub dword[edi]
  404.                         fstp dword[esi] ;(x2-x1)
  405.                         fld dword[edi+16]
  406.                         fsub dword[edi+4]
  407.                         fstp dword[esi+4] ;(y2-y1)
  408.                         fld dword[edi+20]
  409.                         fsub dword[edi+8]
  410.                         fstp dword[esi+8] ;(z2-z1)
  411.                         ;v2 <-> v3
  412.                         fld dword[edi+12]
  413.                         fsub dword[edi+24]
  414.                         fstp dword[esi+12] ;(x2-x3)
  415.                         fld dword[edi+16]
  416.                         fsub dword[edi+28]
  417.                         fstp dword[esi+16] ;(y2-y3)
  418.                         fld dword[edi+20]
  419.                         fsub dword[edi+32]
  420.                         fstp dword[esi+20] ;(z2-z3)
  421.                         ;v3 <-> v1
  422.                         fld dword[edi+24]
  423.                         fsub dword[edi]
  424.                         fstp dword[esi+24] ;(x3-x1)
  425.                         fld dword[edi+28]
  426.                         fsub dword[edi+4]
  427.                         fstp dword[esi+28] ;(y3-y1)
  428.                         fld dword[edi+32]
  429.                         fsub dword[edi+8]
  430.                         fstp dword[esi+32] ;(z3-z1)
  431.  
  432.                         ;A = (y2-y1) * (z3-z1) - (z2-z1) * (y3-y1)
  433.                         fld dword[esi+4]
  434.                         fmul dword[esi+32]
  435.                         fld dword[esi+8]
  436.                         fmul dword[esi+28]
  437.                         fsubp
  438.                         fstp dword[eax] ;set normal.a
  439.  
  440.                         ;B = (z2-z1) * (x3-x1) - (x2-x1) * (z3-z1)
  441.                         fld dword[esi+8]
  442.                         fmul dword[esi+24]
  443.                         fld dword[esi]
  444.                         fmul dword[esi+32]
  445.                         fsubp
  446.                         fstp dword[eax+4] ;set normal.b
  447.  
  448.                         ;C = (x2-x1) * (y3-y1) - (y2-y1) * (x3-x1)
  449.                         fld dword[esi]
  450.                         fmul dword[esi+28]
  451.                         fld dword[esi+4]
  452.                         fmul dword[esi+24]
  453.                         fsubp
  454.                         fstp dword[eax+8] ;set normal.c
  455.  
  456.                         stdcall V3_Norm,eax
  457.  
  458.                         add edx,8 ;à §¬¥à âà¥ã£®«ì­¨ª  = (3 ¢¥à設ë (¯® 2¡) + ᢮©á⢠ (2¡))
  459.                         add eax,12
  460.                         dec ebx
  461.                         jnz @b
  462.  
  463.                 ;­®à¬ «¨ ª ¢¥à設 ¬
  464.                 mov ebx,[o_data]
  465.                 mov ecx,[ebx+offs_obj_poi_count]
  466.                 mov [ebx+offs_obj_normals_poi_count],ecx
  467.                 cmp ecx,0
  468.                 je .end
  469.                 imul ecx,12
  470.                 stdcall mem.Alloc,ecx
  471.                 mov [ebx+offs_obj_normals_poi_data],eax
  472.  
  473.                 mov edi,eax
  474.                 mov eax,0.0
  475.                 shr ecx,2
  476.                 rep stosd ;®ç¨á⪠ 0-¬¨ float
  477.  
  478.                 mov edx,[ebx+offs_obj_tri_count]
  479.                 mov edi,[ebx+offs_obj_tri_data]
  480.                 mov eax,[ebx+offs_obj_normals_tri_data]
  481.                 mov ecx,[ebx+offs_obj_poi_data]
  482.                 mov ebx,[ebx+offs_obj_normals_poi_data]
  483. align 4
  484.                 .cycle_0: ;¯® £à ­ï¬
  485.                         movzx esi,word[edi] ;1-ï ¢¥à設 
  486.                         imul esi,12
  487.                         add esi,ecx
  488.                         push esi
  489.                         movzx esi,word[edi+2] ;2-ï ¢¥à設 
  490.                         imul esi,12
  491.                         add esi,ecx
  492.                         push esi
  493.                         movzx esi,word[edi+4] ;3-ï ¢¥à設 
  494.                         imul esi,12
  495.                         add esi,ecx
  496.                         push esi
  497.  
  498.                         movzx esi,word[edi] ;1-ï ¢¥à設 
  499.                         imul esi,12
  500.                         add esi,ebx
  501.                         push esi
  502.                         movzx esi,word[edi+2] ;2-ï ¢¥à設 
  503.                         imul esi,12
  504.                         add esi,ebx
  505.                         push esi
  506.                         movzx esi,word[edi+4] ;3-ï ¢¥à設 
  507.                         imul esi,12
  508.                         add esi,ebx
  509.                         push esi
  510.  
  511.                         stdcall poi_normal_add,eax
  512.  
  513.                         add edi,8
  514.                         add eax,12
  515.                         dec edx
  516.                         jnz .cycle_0
  517.                 .cycle_0_end:
  518.         .end:
  519. popad
  520.         ret
  521. endp
  522.  
  523. ;input:
  524. ; norm_tr - 㪠§ â¥«ì ­  ­®à¬ «ì ª £à ­¨
  525. ; n1, n2, n3 - 㪠§ â¥«¨ ­  ­®à¬ «¨ ¢¥à設
  526. ; c1, c2, c3 - 㪠§ â¥«¨ ­  ª®®à¤¨­ âë ¢¥à設
  527. align 4
  528. proc poi_normal_add uses eax ebx,\
  529.         norm_tr:dword, n1:dword, n2:dword, n3:dword, c1:dword, c2:dword, c3:dword
  530.  
  531.         mov ebx,[norm_tr]
  532.  
  533.         mov eax,[n1]
  534.         fld dword[eax]
  535.         fadd dword[ebx]
  536.         fstp dword[eax]
  537.         fld dword[eax+4]
  538.         fadd dword[ebx+4]
  539.         fstp dword[eax+4]
  540.         fld dword[eax+8]
  541.         fadd dword[ebx+8]
  542.         fstp dword[eax+8]
  543.  
  544.         mov eax,[n2]
  545.         fld dword[eax]
  546.         fadd dword[ebx]
  547.         fstp dword[eax]
  548.         fld dword[eax+4]
  549.         fadd dword[ebx+4]
  550.         fstp dword[eax+4]
  551.         fld dword[eax+8]
  552.         fadd dword[ebx+8]
  553.         fstp dword[eax+8]
  554.  
  555.         mov eax,[n3]
  556.         fld dword[eax]
  557.         fadd dword[ebx]
  558.         fstp dword[eax]
  559.         fld dword[eax+4]
  560.         fadd dword[ebx+4]
  561.         fstp dword[eax+4]
  562.         fld dword[eax+8]
  563.         fadd dword[ebx+8]
  564.         fstp dword[eax+8]
  565.  
  566.         ret
  567. endp
  568.  
  569. ;description:
  570. ; normalize vector
  571. align 4
  572. proc V3_Norm uses eax ebx, a:dword
  573.         mov ebx,[a]
  574.         fld dword[ebx]
  575.         fmul st0,st0
  576.         fld dword[ebx+4]
  577.         fmul st0,st0
  578.         faddp
  579.         fld dword[ebx+8]
  580.         fmul st0,st0
  581.         faddp
  582.         fsqrt ;st0 = sqrt(a.X^2 +a.Y^2 +a.Z^2)
  583.         ftst
  584.         fstsw ax
  585.         sahf
  586.         je .r1 ;if (sqrt(...)==0) return 1
  587.                 fld dword[ebx] ;offs_X = 0
  588.                 fdiv st0,st1
  589.                 fstp dword[ebx] ;a.X/=sqrt(...)
  590.                 fld dword[ebx+4]
  591.                 fdiv st0,st1
  592.                 fstp dword[ebx+4] ;a.Y/=sqrt(...)
  593.                 fld dword[ebx+8]
  594.                 fdiv st0,st1
  595.                 fstp dword[ebx+8] ;a.Z/=sqrt(...)
  596.         .r1:
  597.         ffree st0
  598.         fincstp
  599.         ret
  600. endp
  601.  
  602. ;­ áâனª  áâàãªâãàë 3d ®¡ê¥ªâ 
  603. align 4
  604. proc obj_init, o_data:dword
  605.         pushad
  606.         mov edi,[o_data]
  607.         stdcall obj_clear_param, edi
  608.         stdcall [tl_node_get_data],tree1
  609.         xor edx,edx
  610.         cmp eax,0
  611.         je .no_points
  612.                 mov ebx,[eax] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ë¡à ­­®£® ¡«®ª 
  613.                 add ebx,[open_file_data]
  614.                 xor ecx,ecx
  615.                 cmp word[ebx],CHUNK_OBJBLOCK
  616.                 jne @f
  617.                         mov ecx,ebx
  618.                         add ecx,dword[ecx+2] ;£à ­¨æ  ¡«®ª 
  619.                         push eax edi
  620.                                 mov edi,ebx
  621.                                 add edi,6
  622.                                 cld
  623.                                 xor al,al
  624.                                 repne scasb ;¯à®¯ã᪠¨¬¥­¨ ®¡ê¥ªâ 
  625.                                 mov ebx,edi
  626.                         pop edi eax
  627.                 @@:
  628.                 cmp word[ebx],CHUNK_TRIMESH
  629.                 jne @f
  630.                         mov ecx,ebx
  631.                         add ecx,dword[ecx+2] ;£à ­¨æ  ¡«®ª 
  632.                         add ebx,6
  633.                 @@:
  634.                 cmp word[ebx],CHUNK_VERTLIST
  635.                 jne .no_points
  636.                         mov esi,ebx
  637.                         movzx edx,word[ebx+6] ;ª®««¨ç¥á⢮ â®ç¥ª
  638.                         add ebx,8
  639.                         mov [edi+offs_obj_poi_data],ebx
  640.                         mov [edi+offs_obj_poi_count],edx
  641.  
  642.                         .cycle_0: ;横« ¤«ï ¯®¨áª  âà¥ã£®«ì­¨ª®¢
  643.                                 add esi,dword[esi+2]
  644.                                 cmp word[esi],CHUNK_FACELIST
  645.                                 je @f
  646.                                         cmp ecx,esi
  647.                                         jg .cycle_0 ;¯®ª  ­¥ ¤®á⨣­ãâ  £à­¨æ  áâ à襣® ¡«®ª 
  648.                                         jmp .end_points ;¥á«¨ ­¥ ­ è«¨ âà¥ã£®«ì­¨ª¨
  649.                         @@:
  650.                         ;¥á«¨ ­ è«¨ âà¥ã£®«ì­¨ª¨
  651.                         movzx edx,word[esi+6]
  652.                         mov [edi+offs_obj_tri_count],edx
  653.                         add esi,8 ;2+4+2 (chunk+size+count)
  654.                         mov [edi+offs_obj_tri_data],esi
  655.  
  656.                         ;¯®¨áª ¬ â¥à¨ «®¢ £à ­¥©
  657.                         shl edx,3
  658.                         add esi,edx
  659.                         cmp word[esi],CHUNK_FACEMAT
  660.                         jne .end_points
  661.                                 mov [edi+offs_obj_mat1_data],esi
  662.                 .end_points:
  663.  
  664.                 stdcall obj_set_sizes, edi
  665.                 stdcall obj_set_normals, edi
  666. if version_edit eq 0
  667.                 stdcall draw_3d, edi
  668. end if
  669.         .no_points:
  670.         popad
  671.         ret
  672. endp
  673.  
  674. ;­ áâனª  ¬ â¥à¨ « 
  675. ;input:
  676. ; m_data - 㪠§ â¥«ì ­  § ¯®«­ï¥¬ãî áâàãªâãàã á ¬ â¥à¨ «®¬
  677. ; f_data - 㪠§ â¥«ì­  ­  ¡«®ª CHUNK_MATERIAL ¨§ ä ©«  3ds
  678. align 4
  679. proc mat_init, m_data:dword, f_data:dword
  680.         pushad
  681.         mov edi,[m_data]
  682.  
  683.         ;... clear edi ...
  684.         mov dword[edi+offs_mat_name],0
  685.         mov dword[edi+offs_mat_col_ambient],0
  686.         mov dword[edi+offs_mat_col_diffuse],0
  687.         mov dword[edi+offs_mat_col_specular],0
  688.  
  689.         xor edx,edx
  690.         mov ebx,[f_data]
  691.         xor ecx,ecx
  692.         cmp word[ebx],CHUNK_MATERIAL
  693.         jne .no_material
  694.                 mov ecx,ebx
  695.                 add ecx,dword[ecx+2] ;£à ­¨æ  ¡«®ª 
  696.                 add ebx,6
  697.         cmp word[ebx],CHUNK_MATNAME
  698.         jne .no_material
  699.                 ;*** (0) ***
  700.                 mov esi,ebx
  701.                 add ebx,6
  702.                 mov [edi+offs_mat_name],ebx
  703.                 sub ebx,6
  704.                 ;*** (1) ***
  705.                 .cycle_0: ;横« ¤«ï ¯®¨áª  æ¢¥â  ¬ â¥à¨ « 
  706.                         add esi,dword[esi+2]
  707.                         cmp word[esi],0xa010
  708.                         je @f
  709.                                 cmp ecx,esi
  710.                                 jg .cycle_0 ;¯®ª  ­¥ ¤®á⨣­ãâ  £à­¨æ  áâ à襣® ¡«®ª 
  711.                                 jmp .end_material ;¥á«¨ ­¥ ­ è«¨ 梥⠬ â¥à¨ « 
  712.                 @@:
  713.                 ;¥á«¨ ­ è«¨ 梥⠬ â¥à¨ « 
  714.                 add esi,6
  715.                 cmp word[esi],0x0011
  716.                 jne .end_material
  717.                         add esi,6
  718.                         mov dl,byte[esi]
  719.                         mov [edi+offs_mat_col_ambient+2],dl
  720.                         mov dx,word[esi+1]
  721.                         ror dx,8
  722.                         mov [edi+offs_mat_col_ambient],dx
  723.                 ;*** (2) ***
  724.                 mov esi,ebx
  725.                 .cycle_1: ;横« ¤«ï ¯®¨áª  æ¢¥â  ¬ â¥à¨ « 
  726.                         add esi,dword[esi+2]
  727.                         cmp word[esi],0xa020
  728.                         je @f
  729.                                 cmp ecx,esi
  730.                                 jg .cycle_1 ;¯®ª  ­¥ ¤®á⨣­ãâ  £à­¨æ  áâ à襣® ¡«®ª 
  731.                                 jmp .end_material ;¥á«¨ ­¥ ­ è«¨ 梥⠬ â¥à¨ « 
  732.                 @@:
  733.                 ;¥á«¨ ­ è«¨ 梥⠬ â¥à¨ « 
  734.                 add esi,6
  735.                 cmp word[esi],0x0011
  736.                 jne .end_material
  737.                         add esi,6
  738.                         mov dl,byte[esi]
  739.                         mov [edi+offs_mat_col_diffuse+2],dl
  740.                         mov dx,word[esi+1]
  741.                         ror dx,8
  742.                         mov [edi+offs_mat_col_diffuse],dx
  743.                 ;*** (3) ***
  744.                 mov esi,ebx
  745.                 .cycle_2: ;横« ¤«ï ¯®¨áª  æ¢¥â  ¬ â¥à¨ « 
  746.                         add esi,dword[esi+2]
  747.                         cmp word[esi],0xa030
  748.                         je @f
  749.                                 cmp ecx,esi
  750.                                 jg .cycle_2 ;¯®ª  ­¥ ¤®á⨣­ãâ  £à­¨æ  áâ à襣® ¡«®ª 
  751.                                 jmp .end_material ;¥á«¨ ­¥ ­ è«¨ 梥⠬ â¥à¨ « 
  752.                 @@:
  753.                 ;¥á«¨ ­ è«¨ 梥⠬ â¥à¨ « 
  754.                 add esi,6
  755.                 cmp word[esi],0x0011
  756.                 jne .end_material
  757.                         add esi,6
  758.                         mov dl,byte[esi]
  759.                         mov [edi+offs_mat_col_specular+2],dl
  760.                         mov dx,word[esi+1]
  761.                         ror dx,8
  762.                         mov [edi+offs_mat_col_specular],dx
  763.  
  764.                 .end_material:
  765.         .no_material:
  766.         popad
  767.         ret
  768. endp
  769.  
  770. align 4
  771. proc buf_draw_beg uses eax, buf:dword
  772.         mov eax,[buf]
  773.         stdcall [buf2d_clear], eax, [eax+16] ;ç¨á⨬ ¡ãä¥à
  774.         stdcall [buf2d_draw_text], eax, buf_1,txt_open_3ds,5,5,0xff
  775.         stdcall [buf2d_draw_text], eax, buf_1,openfile_path,5,15,0xff
  776.         cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;¢®§¬®¦­  ®è¨¡ª  ä ©« 
  777.         jne @f
  778.                 stdcall [buf2d_draw_text], eax, buf_1,txt_3ds_err_sizes,5,25,0xff0000
  779.         @@:
  780.         ret
  781. endp
  782.  
  783. ;à¨á®¢ ­¨¥ ¬ â¥à¨ « 
  784. align 4
  785. proc draw_material uses edi, m_data:dword
  786.         mov edi,[m_data]
  787.         stdcall buf_draw_beg, buf_ogl
  788.         stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_afff,5,35,0xff
  789.  
  790.         stdcall [buf2d_draw_text], buf_ogl,buf_1,[edi+offs_mat_name],15,45,0 ;¨¬ï ¬ â¥à¨ « 
  791.         stdcall draw_color, [edi+offs_mat_col_ambient], txt_a010,2,55 ;®ªà㦠î騩 梥â
  792.         stdcall draw_color, [edi+offs_mat_col_diffuse], txt_a020,2,75 ;¤¨äã§­ë© æ¢¥â
  793.         stdcall draw_color, [edi+offs_mat_col_specular],txt_a030,2,95 ;§¥àª «ì­ë© 梥â
  794.  
  795.         stdcall [buf2d_draw], buf_ogl
  796.         ret
  797. endp
  798.  
  799. align 4
  800. proc draw_color uses eax ebx, color:dword, text:dword, c_x:dword, c_y:dword
  801.         mov eax,[c_x]
  802.         mov ebx,[c_y]
  803.         ; ¯àאַ㣮«ì­¨ª
  804.         inc ebx
  805.         stdcall [buf2d_filled_rect_by_size], buf_ogl,eax,ebx,30,17,[color]
  806.         dec ebx
  807.         stdcall [buf2d_rect_by_size], buf_ogl,eax,ebx,30,19, 0
  808.         ; ¯®¤¯¨á¨
  809.         add eax,33
  810.         stdcall [buf2d_draw_text], buf_ogl, buf_1,[text],eax,ebx,0
  811.         add ebx,10
  812.         stdcall hex_in_str, buffer,[color],6
  813.         mov byte[buffer+6],0
  814.         stdcall [buf2d_draw_text], buf_ogl, buf_1,buffer,eax,ebx,0
  815.         ret
  816. endp
  817.  
  818. ;à¨á®¢ ­¨¥ â®ç¥ª ¢ 3d
  819. align 4
  820. proc draw_3d uses eax ebx ecx edi, o_data:dword
  821.         mov edi,[o_data]
  822.         cmp dword[edi+offs_obj_poi_count],2
  823.         jl .end_f
  824.         stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;®ç¨á⨬ ¡ãä¥à æ¢¥â  ¨ £«ã¡¨­ë
  825.         stdcall [glPushMatrix]
  826.         bt dword[draw_mode],bit_light
  827.         jnc @f
  828.                 call SetLight
  829.                 jmp .end_l
  830.         @@:
  831.                 stdcall [glDisable],GL_LIGHTING
  832.         .end_l:
  833.         stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
  834.         stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_obj_z_scale]
  835.         stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
  836.         stdcall [glRotatef], [angle_z],0.0,0.0,1.0
  837.         stdcall [glRotatef], [angle_y],0.0,1.0,0.0
  838.         stdcall [glRotatef], [angle_x],1.0,0.0,0.0
  839.         stdcall [glTranslatef], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
  840.  
  841. if version_edit eq 0
  842.         ;à¨á®¢ ­¨¥ £à ­¥© á ¨á¯®«ì§®¢ ­¨¥¬ 梥⮢ ¬ â¥à¨ «®¢
  843.         bt dword[draw_mode],bit_faces_mat
  844.         jnc @f
  845.                 mov eax,[edi+offs_obj_mat1_data]
  846.                 .b_found:
  847.                 cmp eax,0
  848.                 je .end_points
  849.                         mov ebx,eax
  850.                         stdcall get_mat_color, eax
  851.                         stdcall draw_3d_faces_color, edi,ebx,eax
  852.                         stdcall found_mat_faces, ebx
  853.                 jmp .b_found
  854.         @@:
  855. end if
  856.  
  857.         ;à¨á®¢ ­¨¥ £à ­¥© ¡¥§ 梥⮢ ¬ â¥à¨ «®¢
  858.         bt dword[draw_mode],bit_faces
  859.         jnc .end_triangles
  860.         cmp dword[edi+offs_obj_tri_count],0
  861.         je .end_triangles
  862.         cmp dword[edi+offs_obj_poi_count],0
  863.         je .end_triangles
  864.                 bt dword[draw_mode],bit_faces_fill
  865.                 jc @f
  866.                         push GL_LINE
  867.                         jmp .end_0
  868.                 @@:
  869.                         push GL_FILL
  870.                 .end_0:
  871.                 stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - 㦥 ¢ á⥪¥
  872.                 stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
  873.                
  874.                 bt dword[draw_mode],bit_smooth
  875.                 jnc .triangles_flat
  876.                 bt dword[draw_mode],bit_light
  877.                 jnc .triangles_flat
  878.                         ;triangles smooth
  879.                         stdcall [glBegin],GL_TRIANGLES
  880.                         mov eax,[edi+offs_obj_tri_data]
  881.                         mov ecx,[edi+offs_obj_tri_count]
  882.                         mov edx,[edi+offs_obj_normals_tri_data]
  883. align 4
  884.                         @@:
  885.                                 movzx ebx,word[eax] ;1-ï ¢¥à設 
  886.                                 imul ebx,12
  887.                                         add ebx,[edi+offs_obj_normals_poi_data]
  888.                                         stdcall [glNormal3fv], ebx
  889.                                         sub ebx,[edi+offs_obj_normals_poi_data]
  890.                                 add ebx,[edi+offs_obj_poi_data]
  891.                                 stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  892.                                 movzx ebx,word[eax+2] ;2-ï ¢¥à設 
  893.                                 imul ebx,12
  894.                                         add ebx,[edi+offs_obj_normals_poi_data]
  895.                                         stdcall [glNormal3fv], ebx
  896.                                         sub ebx,[edi+offs_obj_normals_poi_data]
  897.                                 add ebx,[edi+offs_obj_poi_data]
  898.                                 stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  899.                                 movzx ebx,word[eax+4] ;3-ï ¢¥à設 
  900.                                 imul ebx,12
  901.                                         add ebx,[edi+offs_obj_normals_poi_data]
  902.                                         stdcall [glNormal3fv], ebx
  903.                                         sub ebx,[edi+offs_obj_normals_poi_data]
  904.                                 add ebx,[edi+offs_obj_poi_data]
  905.                                 stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  906.                                 add eax,8 ;à §¬¥à âà¥ã£®«ì­¨ª  = (3 ¢¥à設ë (¯® 2¡) + ᢮©á⢠ (2¡))
  907.                                 dec ecx
  908.                                 jnz @b
  909.                         stdcall [glEnd]
  910.                         jmp .end_points
  911.  
  912.                 .triangles_flat:
  913.                 stdcall [glBegin],GL_TRIANGLES
  914.                 mov eax,[edi+offs_obj_tri_data]
  915.                 mov ecx,[edi+offs_obj_tri_count]
  916.                 mov edx,[edi+offs_obj_normals_tri_data]
  917. align 4
  918.                 @@:
  919.                         ;
  920.                         bt dword[draw_mode],bit_light
  921.                         jnc .norm1
  922.                                 stdcall [glNormal3fv], edx
  923.                                 add edx,12
  924.                         .norm1:
  925.                         movzx ebx,word[eax] ;1-ï ¢¥à設 
  926.                         imul ebx,12
  927.                         add ebx,[edi+offs_obj_poi_data]
  928.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  929.                         movzx ebx,word[eax+2] ;2-ï ¢¥à設 
  930.                         imul ebx,12
  931.                         add ebx,[edi+offs_obj_poi_data]
  932.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  933.                         movzx ebx,word[eax+4] ;3-ï ¢¥à設 
  934.                         imul ebx,12
  935.                         add ebx,[edi+offs_obj_poi_data]
  936.                         stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
  937.                         add eax,8 ;à §¬¥à âà¥ã£®«ì­¨ª  = (3 ¢¥à設ë (¯® 2¡) + ᢮©á⢠ (2¡))
  938.                         dec ecx
  939.                         jnz @b
  940.                 stdcall [glEnd]
  941.                 jmp .end_points
  942.         .end_triangles:
  943.  
  944.         ;à¨á®¢ ­¨¥ â®ç¥ª
  945.         bt dword[draw_mode],bit_vertexes
  946.         jnc .end_points
  947.                 stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
  948.                 stdcall [glBegin],GL_POINTS
  949.                 mov eax,[edi+offs_obj_poi_data]
  950.                 mov ebx,[edi+offs_obj_poi_count]
  951.                 mov edx,[edi+offs_obj_normals_poi_data]
  952. align 4
  953.                 @@:
  954.                         bt dword[draw_mode],bit_light
  955.                         jnc .norm0
  956.                                 stdcall [glNormal3fv], edx
  957.                                 add edx,12
  958.                         .norm0:
  959.                         stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  960.                         add eax,12
  961.                         dec ebx
  962.                         jnz @b
  963.                 stdcall [glEnd]
  964.         .end_points:
  965.  
  966. if version_edit eq 1
  967.         ;à¨á®¢ ­¨¥  ªâ¨¢­®© â®çª¨
  968.         stdcall [tl_node_get_data],tree3
  969.         cmp eax,0
  970.         je @f
  971.                 ;¢ë¤¥«¥­¨¥  ªâ¨¢­®© â®çª¨
  972.                 mov eax,[eax]
  973.  
  974.                 stdcall [glBegin],GL_LINES
  975.                 stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
  976.                 stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
  977.                 stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
  978.                 stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
  979.                 stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
  980.                 stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
  981.                 stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
  982.                 stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
  983.                 stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
  984.                 stdcall [glEnd]
  985.  
  986.                 stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
  987.                 stdcall [glPushMatrix]
  988.                         stdcall [glTranslatef], [eax],[eax+4],[eax+8]
  989.                         stdcall [gluSphere], [qObj], [sph_radius], 8,8
  990.                 stdcall [glPopMatrix]
  991.         @@:
  992.  
  993.         ;à¨á®¢ ­¨¥ ¢ë¤¥«¥­­ëå â®ç¥ª
  994.         cmp dword[obj_poi_sel_c],0
  995.         je .end_select
  996.                 mov ecx,dword[obj_poi_sel_c]
  997.                 stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
  998.                 stdcall dword[tl_node_poi_get_info], tree3,0
  999. align 4
  1000.                 @@:
  1001.                         cmp eax,0
  1002.                         je .end_select
  1003.                         mov ebx,eax
  1004.                         cmp word[ebx],ID_ICON_POINT_SEL
  1005.                         jne .next_sel
  1006.                         stdcall [tl_node_poi_get_data], tree3,ebx
  1007.                         mov eax,[eax]
  1008.                         stdcall [glPushMatrix]
  1009.                                 stdcall [glTranslatef], [eax],[eax+4],[eax+8]
  1010.                                 stdcall [gluSphere], [qObj], [sph_radius], 4,4
  1011.                         stdcall [glPopMatrix]
  1012.                         dec ecx
  1013.                         jz .end_select
  1014.                         .next_sel:
  1015.                         stdcall dword[tl_node_poi_get_next_info], tree3,ebx
  1016.                         jmp @b
  1017.     .end_select:
  1018. end if
  1019.  
  1020.         stdcall [glPopMatrix]
  1021. if version_edit eq 1
  1022.         cmp dword[obj_poi_sel_c],0
  1023.         je @f
  1024.                 stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
  1025.         @@:
  1026. end if
  1027.         stdcall [kosglSwapBuffers]
  1028.         .end_f:
  1029.         ret
  1030. endp
  1031.  
  1032. align 4
  1033. SetLight:
  1034.         stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
  1035.         stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
  1036.  
  1037.         stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
  1038.         stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
  1039.  
  1040.         stdcall [glEnable], GL_COLOR_MATERIAL
  1041.         stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
  1042.         stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
  1043.         stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
  1044.         stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
  1045.  
  1046.         stdcall [glEnable],GL_LIGHTING
  1047.         stdcall [glEnable],GL_LIGHT0
  1048.         ret
  1049.  
  1050. ;¢ª«îç ¥¬ ०¨¬ à¨á®¢ ­¨ï ¢¥à設
  1051. align 4
  1052. mnu_vertexes_on:
  1053.         or dword[draw_mode], 1 shl bit_vertexes
  1054.         and dword[draw_mode], not ((1 shl bit_faces)+(1 shl bit_faces_mat)) ;¢ëª«îç ¥¬ ०¨¬ë à¨á®¢ ­¨ï, ª®â®àë¥ ¬®£ãâ ¬¥è âì
  1055.         call update_obj
  1056.         ret
  1057.  
  1058. ;¢ª«îç ¥¬ ०¨¬ à¨á®¢ ­¨ï ª àª á­ëå £à ­¥©
  1059. align 4
  1060. mnu_edges_on:
  1061.         or dword[draw_mode], 1 shl bit_faces
  1062.         and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill)+(1 shl bit_faces_mat))
  1063.         call update_obj
  1064.         ret
  1065.  
  1066. ;¢ª«îç ¥¬ ०¨¬ à¨á®¢ ­¨ï ᯫ®è­ëå £à ­¥©
  1067. align 4
  1068. mnu_faces_on:
  1069.         or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
  1070.         and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_mat))
  1071.         call update_obj
  1072.         ret
  1073.  
  1074. ;¢ª«îç ¥¬ ¨«¨ ®âª«îç ¥¬ ®á¢¥é¥­¨¥
  1075. align 4
  1076. mnu_light_on_off:
  1077.         xor dword[draw_mode], 1 shl bit_light
  1078.         call update_obj
  1079.         ret
  1080.  
  1081. align 4
  1082. mnu_smooth_on_off:
  1083.         xor dword[draw_mode], 1 shl bit_smooth
  1084.         call update_obj
  1085.         ret
  1086.  
  1087. align 4
  1088. mnu_reset_settings:
  1089.         mov dword[angle_x],0.0
  1090.         mov dword[angle_y],0.0
  1091.         mov dword[angle_z],0.0
  1092.         m2m dword[draw_mode],dword[def_dr_mode]
  1093.         call update_obj
  1094.         ret
  1095.  
  1096. if version_edit eq 1
  1097.  
  1098. align 4
  1099. update_obj:
  1100.         stdcall draw_3d, o3d
  1101.         ret
  1102.  
  1103. else
  1104.  
  1105. ;¢ª«îç ¥¬ ०¨¬ à¨á®¢ ­¨ï ᯫ®è­ëå £à ­¥©
  1106. align 4
  1107. mnu_faces_mat:
  1108.         or dword[draw_mode], (1 shl bit_faces_mat)
  1109.         call update_obj
  1110.         ret
  1111.  
  1112. align 4
  1113. update_obj:
  1114. push eax ebx
  1115.         stdcall [tl_node_get_data],tree1
  1116.         cmp eax,0
  1117.         je @f
  1118.                 mov ebx,dword[eax] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ë¡à ­­®£® ¡«®ª  ®â­®á¨â¥«ì­® ­ ç «  ä ©« 
  1119.                 add ebx,dword[open_file_data] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ ¯ ¬ïâ¨
  1120.                 cmp word[ebx],CHUNK_OBJBLOCK
  1121.                 jne @f
  1122.                         add eax,list_offs_obj3d
  1123.                         stdcall draw_3d,eax
  1124.         @@:
  1125. pop ebx eax
  1126.         ret
  1127.  
  1128. ;input:
  1129. ; p_mat - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¯à¥¤ë¤ã饣® ¬ â¥à¨ « 
  1130. align 4
  1131. proc found_mat_faces uses ebx, p_mat:dword
  1132.         mov eax,[p_mat]
  1133.         add eax,[eax+2]
  1134.         cmp word[eax],CHUNK_FACEMAT
  1135.         je @f
  1136.                 xor eax,eax
  1137.         @@:
  1138.         ret
  1139. endp
  1140.  
  1141. align 4
  1142. proc get_mat_color uses ebx ecx edx edi esi, p_mat:dword
  1143.         stdcall [tl_node_poi_get_info], tree1,0
  1144.         mov ecx,eax
  1145.         .cycle_0:
  1146.                 cmp ecx,0
  1147.                 je .cycle_0_end
  1148.                         stdcall [tl_node_poi_get_data], tree1,ecx
  1149.                         mov ebx,[eax] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ë¡à ­­®£® ¡«®ª 
  1150.                         add ebx,[open_file_data]
  1151.                         cmp word[ebx],CHUNK_MATERIAL
  1152.                         jne .end_add_p3
  1153.                         add eax,list_offs_obj3d
  1154.                         mov esi,[eax+offs_mat_name]
  1155.                         cmp esi,0
  1156.                         jne @f
  1157.                                 ;init material
  1158.                                 stdcall mat_init,eax,ebx
  1159.                                 mov esi,[eax+offs_mat_name]
  1160.                         @@:
  1161.                         mov edi,[p_mat]
  1162.                         mov eax,5
  1163.                         add edi,eax
  1164. align 4
  1165.                         @@:
  1166.                                 cmp al,0
  1167.                                 je .found
  1168.                                 lodsb
  1169.                                 inc edi
  1170.                                 cmp byte[edi],al
  1171.                                 je @b
  1172.                 .end_add_p3:
  1173.                 stdcall [tl_node_poi_get_next_info], tree1,ecx
  1174.                 mov ecx,eax ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
  1175.                 jmp .cycle_0
  1176.         .cycle_0_end:
  1177.  
  1178.         .no_found:
  1179.                 xor eax,eax
  1180.                 jmp .end_f
  1181.         .found:
  1182.                 stdcall [tl_node_poi_get_data], tree1,ecx
  1183.                 add eax,list_offs_obj3d
  1184.                 mov eax,[eax+offs_mat_col_diffuse]
  1185.         .end_f:
  1186.         ret
  1187. endp
  1188.  
  1189. align 4
  1190. proc draw_3d_faces_color o_data:dword, p_mat:dword, color:dword
  1191. pushad
  1192.         stdcall [glPolygonMode], GL_FRONT_AND_BACK,GL_FILL
  1193.         stdcall [glColor3ub],[color+2],[color+1],[color]
  1194.         stdcall [glBegin],GL_TRIANGLES
  1195.         mov edi,[o_data]
  1196.         mov esi,[p_mat]
  1197.         add esi,6
  1198.         @@:
  1199.                 lodsb
  1200.                 cmp al,0
  1201.                 jne @b
  1202.         movzx ecx,word[esi] ;ecx - ç¨á«® £à ­¥© á ¤ ­­ë¬ ¬ â¥à¨ «®¬
  1203.         mov edx,[edi+offs_obj_poi_data]
  1204.  
  1205.         bt dword[draw_mode],bit_smooth
  1206.         jnc @f
  1207.         bt dword[draw_mode],bit_light
  1208.         jnc @f
  1209. align 4
  1210.         .cycle_0:
  1211.                 add esi,2
  1212.                 ;word[esi] - ­®¬¥à âà¥ã£®«ì­¨ª 
  1213.                 movzx ebx,word[esi]
  1214.  
  1215.                 shl ebx,3
  1216.                 add ebx,[edi+offs_obj_tri_data]
  1217.        
  1218.                 movzx eax,word[ebx] ;1-ï ¢¥à設 
  1219.                 imul eax,12 ;float(x,y,z)
  1220.                         add eax,[edi+offs_obj_normals_poi_data]
  1221.                         stdcall [glNormal3fv], eax
  1222.                         sub eax,[edi+offs_obj_normals_poi_data]
  1223.                 add eax,edx
  1224.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1225.  
  1226.                 movzx eax,word[ebx+2] ;2-ï ¢¥à設 
  1227.                 imul eax,12 ;float(x,y,z)
  1228.                         add eax,[edi+offs_obj_normals_poi_data]
  1229.                         stdcall [glNormal3fv], eax
  1230.                         sub eax,[edi+offs_obj_normals_poi_data]
  1231.                 add eax,edx
  1232.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1233.  
  1234.                 movzx eax,word[ebx+4] ;3-ï ¢¥à設 
  1235.                 imul eax,12 ;float(x,y,z)
  1236.                         add eax,[edi+offs_obj_normals_poi_data]
  1237.                         stdcall [glNormal3fv], eax
  1238.                         sub eax,[edi+offs_obj_normals_poi_data]
  1239.                 add eax,edx
  1240.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1241.                
  1242.                 dec ecx
  1243.                 jnz .cycle_0
  1244.         stdcall [glEnd]
  1245.         jmp .end_f
  1246.  
  1247. align 4
  1248.         @@:
  1249.                 add esi,2
  1250.                 ;word[esi] - ­®¬¥à âà¥ã£®«ì­¨ª 
  1251.                 movzx ebx,word[esi]
  1252.                 ;­®à¬ «¨ ¤«ï ®á¢¥é¥­¨ï
  1253.                 bt dword[draw_mode],bit_light
  1254.                 jnc .norm
  1255.                         mov eax,ebx
  1256.                         imul eax,12
  1257.                         add eax,[edi+offs_obj_normals_tri_data]
  1258.                         stdcall [glNormal3fv], eax
  1259.                 .norm:
  1260.  
  1261.                 shl ebx,3
  1262.                 add ebx,[edi+offs_obj_tri_data]
  1263.        
  1264.                 movzx eax,word[ebx] ;1-ï ¢¥à設 
  1265.                 imul eax,12 ;float(x,y,z)
  1266.                 add eax,edx
  1267.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1268.  
  1269.                 movzx eax,word[ebx+2] ;2-ï ¢¥à設 
  1270.                 imul eax,12 ;float(x,y,z)
  1271.                 add eax,edx
  1272.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1273.  
  1274.                 movzx eax,word[ebx+4] ;3-ï ¢¥à設 
  1275.                 imul eax,12 ;float(x,y,z)
  1276.                 add eax,edx
  1277.                 stdcall [glVertex3f], [eax],[eax+4],[eax+8]
  1278.                
  1279.                 dec ecx
  1280.                 jnz @b
  1281.         stdcall [glEnd]
  1282.  
  1283. .end_f:
  1284. popad
  1285.         ret
  1286. endp
  1287.  
  1288. end if
  1289.  
  1290. align 4
  1291. draw_mode dd 0 ;०¨¬ à¨á®¢ ­¨ï ®¡ê¥ªâ 
  1292. def_dr_mode dd 0 ;०¨¬ à¨á®¢ ­¨ï ¯® 㬮«ç ­¨î
  1293. delt_size dd 3.0 ;¨§¬¥­¥­¨¥ 㣫®¢ ¯à¨ ¯®¢®à®â å á ª«¨¢¨ âãàë
  1294. mouse_drag dd 0 ;०¨¬ ¯®¢®à®â  áæ¥­ë ®â ¯¥à¥¬¥é¥­¨¨ ªãàá®à  ¬ëè¨
  1295. mouse_x dd 0
  1296. mouse_y dd 0
  1297. sph_radius dd 0 ;à ¤¨ãá áä¥àë ¤«ï ¢ë¤¥«¥­¨ï  ªâ¨¢­®© â®çª¨
  1298.  
  1299.