Ooops
November 25, 2020, 08:08:19 AM

Author Topic: [bb] Vertex Ambient Occlusion by DareDevil [ 1+ years ago ]  (Read 720 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Vertex Ambient Occlusion
Author : DareDevil
Posted : 1+ years ago

Description : this code is a pubblic domain, pleace specify the my name in the credits or regards this string "System Ambient Occlusion Vertex by Vincenzo Caldarulo Italy-Bari (Vincentx)"

<a href="http://www.blitzitalia.altervista.org/modules/xcgal/displayimage.php?pid=38&fullsize=1" target="_blank">http://www.blitzitalia.altervista.org/modules/xcgal/displayimage.php?pid=38&fullsize=1[/url]

Excuse for my english


Code :
Code: BlitzBasic
  1. ;===>O=========================o<=================================================================
  2. ;===>O=========================o<=================================================================
  3. ;===>   Name file:
  4. ;===>
  5. ;===>   Programmatore:
  6. ;===>     Caldarulo Vincenzo (Vision&Design Software)
  7. ;===>   Descrizione:
  8. ;===>
  9. ;===>O=========================o<=================================================================
  10. ;===>O=========================o<=================================================================
  11. ;
  12. ;
  13. AppTitle("Ambient Occlusion Vertex by Vincentx (Vincenzo Caldarulo Italy-Bari)")
  14. ;=====================================================
  15. ;===>
  16. Type AO_vertex
  17.         Field Vx#
  18.         Field Vy#
  19.         Field Vz#
  20.         Field Vc%
  21. End Type
  22.  
  23. ;=====================================================
  24. ;===>
  25. Type AO_receiver
  26.         ;===>
  27.         Field ObjOrig%
  28.         Field Obj%
  29.         ;===>
  30. End Type
  31.  
  32. ;====>
  33. ;=====================================================
  34. ;===>
  35. Const AO_Method%                                = 0 ; 0 = LinePick B3D  // 1 = LinePick SW  // 2 = Octree
  36. Const AO_Ray#                                   = 100
  37. Const AO_DetBase#                       = 4;    Level of precision AO 3 is a good result
  38. Const AO_Detail#                                = (AO_DetBase+1) ;;3=4 INTERAZIONI
  39. Const AO_TotRay#                                = ((4*(AO_DetBase-1)) * (AO_DetBase-1))+1
  40. Const AO_Attenuation#   = (255.0 - 64 )/AO_TotRay
  41.  
  42.  
  43. ;=====================================================
  44. ;===>
  45. Dim AO_Vertex.AO_vertex(65535)
  46. For id=0 To 65535
  47.         AO_Vertex(id) = New AO_vertex
  48. Next
  49. ;=====================================================
  50. ;===>
  51. Global dlr.AO_receiver
  52.  
  53. Global AO_TimeCollision=0
  54. ;Global AO_InterCollision=0
  55.  
  56. Const AO_LevelAlpha#  = 0.8
  57. ;=====================================================
  58. ;===>
  59.  
  60. Dim RayList.Point3D(AO_TotRay)
  61. Global NSphere% = 0
  62.  
  63. ;=====================================================
  64. ;===>
  65. Precalcolo();
  66.  
  67.  
  68.  
  69. Graphics3D 800,600,32,2
  70.  
  71. Global Camera = CreateCamera()
  72.  
  73.  
  74. LoadScene()
  75.  
  76. ; =================================================================================================
  77. ; ===>
  78. Cls
  79. Print ">===================================================="
  80. Print ">"
  81. Print "> Numero di interazioni oggetto: "+AO_TotRay
  82. Print ">"
  83. Print ">===================================================="
  84. Print ">"
  85. ;Stop
  86. Local TimeAO% = AO_Update()
  87. Global spd# = 0.5
  88. Local l_OldTime,l_CurTime
  89. ; =================================================================================================
  90. ; ===>
  91. Repeat
  92.        
  93.         MoveEntity Camera,(KeyDown(205)-KeyDown(203))*spd,0,(MouseDown(1)-MouseDown(2))*spd
  94.         TurnEntity Camera,-MouseYSpeed()*0.1,-MouseXSpeed()*0.1,0
  95.         RotateEntity Camera,EntityPitch(Camera,True),EntityYaw(Camera,True),0
  96.        
  97.         MoveMouse GraphicsWidth()*.5,GraphicsHeight()*.5
  98.        
  99.         ; ===========================================================================
  100.         If KeyHit(2) Then  AO_Show()
  101.         If KeyHit(3) Then  AO_Hide()
  102.        
  103.        
  104.         If KeyHit(24) Then  WireFrame True
  105.         If KeyHit(25) Then  WireFrame False
  106.        
  107.        
  108.         If (KeyDown(46)) Then
  109.                 PositionEntity Camera,60,60,-60
  110.                 RotateEntity Camera,30,45,0
  111.         EndIf
  112.        
  113.         ; ===========================================================================
  114.         ; ===>
  115.         UpdateWorld()
  116.         RenderWorld()
  117.         ;===>
  118.         Local Riga=0
  119.         ;====>
  120.         Color 255,0,0
  121.         l_CurTime=MilliSecs()-l_OldTime
  122.         l_OldTime=MilliSecs()
  123.         Text(0,Riga,"Ms: "+l_CurTime+" AO Time: "+ TimeAO) : Riga = Riga + 10
  124.         Riga = Riga + 10 : Riga = Riga + 10
  125.         Text(0,Riga," 1 - Enable Ambient occlusion")    : Riga = Riga + 10
  126.         Text(0,Riga," 2 - Disable Ambient occlusion")   : Riga = Riga + 10
  127.         ;===>
  128.         Flip(False)
  129.        
  130.         ;===>
  131. Until KeyHit(1)
  132.  
  133. End
  134.  
  135.  
  136. Function LoadScene()
  137.         ;===>
  138.         Local Obj;
  139.         Local R = 20
  140.         Local R2 = 20
  141.         Local x,z
  142.         Local Segment=50
  143.         ;===>
  144.         Obj = CPlane(Segment*2)
  145.         PositionEntity Obj,0,-5,0
  146.         ScaleEntity Obj, 2, 1, 2
  147.         AO_SetReceiver(Obj)
  148.         ;===>
  149.         Local a#;
  150.         For a=0 To 100
  151.                 ;Obj = CreateSphere(16)
  152.                 Obj = CreateCube()
  153.                 ang     = a*25.0
  154.                 d0      = R2-(a/10.0)
  155.                 d1      = a/3.0
  156.                 PositionEntity Obj, d0*Cos(ang), d1, d0*Sin(ang)
  157.                 RotateEntity Obj, 0, ang, 0
  158.                 ScaleEntity Obj, 2, 2, 2
  159.                
  160.                 AO_SetReceiver(Obj)
  161.                
  162.         Next
  163.         ;===>
  164.        
  165. End Function
  166.  
  167.  
  168.  
  169. Function CPlane%(Number#)
  170.         ;===>
  171.         If(Number>150) Then Number=150
  172.         ;===>
  173.         Local mesh = CreateMesh()
  174.         Local surf = CreateSurface(mesh)
  175.         Local center#= (Number/2.0)
  176.         ;===>
  177.        
  178.         For pz# = 0 To Number
  179.                 For px# = 0 To Number
  180.                         k = AddVertex(surf, px-center, 0, pz-center, px/Number, pz/Number )
  181.                 Next
  182.         Next
  183.         ;===>
  184.        
  185.         For pz=0 To Number-1
  186.                 For px=0 To Number-1
  187.                         ;===>
  188.                         p0 = px+((pz+0)*(Number+1))
  189.                         p1 = px+((pz+0)*(Number+1))+1
  190.                         p2 = px+((pz+1)*(Number+1))
  191.                         p3 = px+((pz+1)*(Number+1))+1
  192.                         ;===>
  193.                         AddTriangle(surf,p2,p1,p0)
  194.                         AddTriangle(surf,p2,p3,p1)
  195.                         ;===>
  196.                 Next
  197.         Next
  198.         ;===>
  199.         Return mesh
  200.         ;===>
  201. End Function
  202.  
  203.  
  204.  
  205. ; ==================================================
  206. ; -----------------------------------------------
  207. ; Punto 3D
  208. ;---------------------------------------
  209. ;=======================================
  210. Type Point3D
  211.         Field x#
  212.         Field y#
  213.         Field z#
  214. End Type
  215.  
  216. ; ==================================================
  217. ; -----------------------------------------------
  218.  
  219. Function Point3DSet( Dst.Point3D, x#, y#, z#)
  220.         ;---->
  221.         Dstx = x ;
  222.         Dsty = y ;
  223.         Dstz = z ;
  224.         ;---->
  225. End Function
  226.  
  227. ; ==================================================
  228. ; -----------------------------------------------
  229. ; Rotazione Asse X Y
  230. ;--------------------------
  231. ;================================
  232. Function RotateXY( Rtn.Point3D, P.Point3D, RotX%, RotY% )
  233.         ; ===>
  234.         Local l_c# = Cos(RotX);
  235.         Local l_s# = Sin(RotX);
  236.         ; ===>
  237.         ;Rotazione Asse X
  238.         Local RX_x# =  Px
  239.         Local RX_y# = (Py * l_c)-(Pz * l_s);
  240.         Local RX_z# = (Pz * l_c)+(Py * l_s);
  241.         ; ===>
  242.         l_c# = Cos(RotY);
  243.         l_s# = Sin(RotY);
  244.         ; ===>
  245.         ;Rotazione Asse Y
  246.         Local RY_x# = (RX_x * l_c)+(RX_z * l_s);
  247.         Local RY_y# =  RX_y
  248.         Local RY_z# = (RX_z * l_c)-(RX_x * l_s)
  249.         ; ===>
  250.         Rtnx# = RY_x
  251.         Rtny# = RY_y
  252.         Rtnz# = RY_z
  253.         ; ===>
  254. End Function
  255.  
  256. ; ==================================================
  257. ; -----------------------------------------------
  258. ; Calcolo della normale
  259. ;--------------------------
  260. ;================================
  261. ;
  262. Function CalcNormalFast( Rtn.Point3D, A.Point3D, B.Point3D, C.Point3D)
  263.         ; ===>
  264.         Local K1x# = Ax - Bx
  265.         Local K1y# = Ay - By
  266.         Local K1z# = Az - Bz
  267.         ; ===>
  268.         Local K2x# = Bx - Cx
  269.         Local K2y# = By - Cy
  270.         Local K2z# = Bz - Cz
  271.         ; ===>
  272.         ; Compute their cross product.
  273.         Local Rx# = K1y#*K2z# - K1z#*K2y#
  274.         Local Ry# = K1z#*K2x# - K1x#*K2z#
  275.         Local Rz# = K1x#*K2y# - K1y#*K2x#
  276.         ; ===>
  277.         Local do# = 1.0 / Sqr( (Rx*Rx) + (Ry*Ry) + (Rz*Rz) )
  278.   ; ===>
  279.         Rtnx = Rx*do;
  280.         Rtny = Ry*do;
  281.         Rtnz = Rz*do;
  282.         ;===>
  283. End Function
  284.  
  285.  
  286. ; ==================================================
  287. ; -----------------------------------------------
  288. ; Vector To Angle
  289. ;--------------------------
  290. ;================================
  291. ;
  292. Function VectorToAngle( dst.Point3D, Vect.Point3D )
  293.         ;===>
  294.         Local dist1  = Sqr( (Vectx*Vectx)+(Vectz*Vectz)) ;
  295.         dstx = ATan2( Vecty ,dist1);
  296.         dsty = ATan2( Vectx ,Vectz);
  297.         ;===>
  298. End Function
  299.  
  300. ;===>O=========================o<=================================================================
  301. ;===>O=========================o<=================================================================
  302. ;===>   Name file:
  303. ;===>
  304. ;===>   Programmatore:
  305. ;===>     Caldarulo Vincenzo (Vision&Design Software)
  306. ;===>   Descrizione:
  307. ;===>
  308. ;===>O=========================o<=================================================================
  309. ;===>O=========================o<=================================================================
  310. ;
  311.  
  312.  
  313.  
  314.  
  315. ;;=====================================================
  316. ;;===>
  317. ;Type AO_vertex
  318. ;       Field Vx#
  319. ;       Field Vy#
  320. ;       Field Vz#
  321. ;       Field Vc%
  322. ;End Type
  323. ;
  324. ;;=====================================================
  325. ;;===>
  326. ;Type AO_receiver
  327. ;       ;===>
  328. ;       Field ObjOrig%
  329. ;       Field Obj%
  330. ;       ;===>
  331. ;End Type
  332. ;
  333. ;;====>
  334. ;;=====================================================
  335. ;;===>
  336. ;Const AO_Method%                               = 0 ; 0 = LinePick B3D  // 1 = LinePick SW  // 2 = Octree
  337. ;Const AO_Ray#                                  = 100
  338. ;Const AO_DetBase#                      = 2;
  339. ;Const AO_Detail#                               = (AO_DetBase+1) ;;3=4 INTERAZIONI
  340. ;Const AO_TotRay#                               = ((4*(AO_DetBase-1)) * (AO_DetBase-1))+1
  341. ;Const AO_Attenuation#  = (255.0 - 64 )/AO_TotRay
  342. ;
  343. ;
  344. ;;=====================================================
  345. ;;===>
  346. ;Dim AO_Vertex.AO_vertex(65535)
  347. ;For id=0 To 65535
  348. ;       AO_Vertex(id) = New AO_vertex
  349. ;Next
  350. ;;=====================================================
  351. ;;===>
  352. ;Global dlr.AO_receiver
  353. ;
  354. ;Global AO_TimeCollision=0
  355. ;;Global AO_InterCollision=0
  356. ;
  357. ;Const AO_LevelAlpha#  = 0.8
  358. ;;=====================================================
  359. ;;===>
  360. ;
  361. ;Dim RayList.Point3D(AO_TotRay)
  362. ;Global NSphere% = 0
  363. ;
  364. ;;=====================================================
  365. ;;===>
  366. ;Precalcolo();
  367.  
  368. ;=====================================================
  369. ;--------------------------------------------------
  370. ;===>
  371. ;
  372. ;===>
  373. ;
  374. Function Precalcolo()
  375.         ;===>
  376.         If (AO_DetBase<=1) Then Return
  377.         ;===>
  378.         NSphere%=0
  379.         Local RX#,RY#,RXa#,RYa#
  380.         Local l_Normal.Point3D  = New Point3D : Point3DSet(l_Normal, 0, AO_Ray, 0)
  381.         Local l_PartRY# = ((AO_DetBase-1)*4)
  382.         Local l_AngS# = 360 / l_PartRY ;
  383.         Local l_AngT# = 90.0 / AO_DetBase
  384.         ;===>
  385.         For RY=0 To l_PartRY-1
  386.                 ;===>
  387.                 RYa# = l_AngS*RY
  388.                 ;===>
  389.                 For RX=1 To AO_DetBase-1
  390.                         ;===>
  391.                         RXa# = RX*l_AngT
  392.                         ;===>
  393.                         RayList.Point3D(NSphere) = New Point3D
  394.                         ;===>
  395.                         RotateXY(RayList(NSphere),l_Normal, RXa, RYa)
  396.                         ;===>
  397.                         NSphere = NSphere+1
  398.                         ;===>
  399.                 Next
  400.                 ;===>
  401.         Next
  402.         ;===>
  403.         Delete l_Normal
  404.         ;===>
  405. End Function
  406.  
  407. ;=====================================================
  408. ;--------------------------------------------------
  409. ;===>
  410. ;
  411. ;===>
  412. ;
  413. Function AO_Free()
  414.         Local l_AO_Recived.AO_receiver
  415.         For l_AO_Recived.AO_receiver = Each AO_receiver
  416.                 FreeEntity l_AO_RecivedObj
  417.                 Delete l_AO_Recived
  418.         Next
  419.        
  420. End Function
  421.  
  422. ;=====================================================
  423. ;--------------------------------------------------
  424. ;===>
  425. ;
  426. ;===>
  427. ;
  428. Function AO_SetReceiver(mesh, ShadowEnable=True, TexAlpha=0)
  429.         ;===>
  430.         Local l_AO_Recived.AO_receiver = New AO_receiver
  431.         ;===>
  432.         l_AO_RecivedObjOrig = mesh
  433.         l_AO_RecivedObj = CopyMesh(l_AO_RecivedObjOrig,l_AO_RecivedObjOrig)
  434.         NameEntity( l_AO_RecivedObj, EntityName(l_AO_RecivedObjOrig))
  435.         EntityAlpha l_AO_RecivedObj, AO_LevelAlpha
  436.         EntityBlend l_AO_RecivedObj, 2
  437.        
  438.         ;
  439.         EntityPickMode(l_AO_RecivedObj,2)
  440.         ;===>
  441.         EntityFX l_AO_RecivedObj,2+1
  442.         UpdateNormals l_AO_RecivedObj
  443.         ;===>
  444. End Function
  445.  
  446.  
  447. ;=====================================================
  448. ;--------------------------------------------------
  449. ;===>
  450. ;
  451. ;===>
  452. ;
  453. Function AO_Update()
  454.         ;===>
  455.         Local l_total_tris%,l_total_vert%
  456.         Local Total_ColliTime = 0
  457.         ;===>
  458.         Local Start_Time=MilliSecs()
  459.         ;===>
  460.         Local l_IdV0c%, l_IdV0x#, l_IdV0y#, l_IdV0z#, l_IdV0.AO_vertex
  461.         Local l_IdV1c%, l_IdV1x#, l_IdV1y#, l_IdV1z#, l_IdV1.AO_vertex
  462.         Local l_IdV2c%, l_IdV2x#, l_IdV2y#, l_IdV2z#, l_IdV2.AO_vertex
  463.         ;===>
  464.         Local l_Point0.Point3D  = New Point3D
  465.         Local l_Point1.Point3D  = New Point3D
  466.         Local l_Point2.Point3D  = New Point3D
  467.         ;===>
  468.         Local l_Normal.Point3D  = New Point3D : Point3DSet(l_Normal, 0, AO_Ray, 0)
  469.         Local l_NorMod.Point3D  = New Point3D
  470.         Local l_Angles.Point3D  = New Point3D
  471.         ;===>
  472.         Local SphereList=0
  473.         Local v%, s%
  474.         ;===>
  475.         Local l_CurObj;
  476.         Local n_surfs
  477.         Local surf, n_tris
  478.         Local Px#,Py#,Pz#;
  479.         ;===>
  480.         Local Color_a# = 0
  481.         Local l_rX#,l_rY#
  482.         ;===>
  483.         Local cnt=0
  484.         Local l_AO_Recived.AO_receiver
  485.         Local Riga$
  486.         ;===>
  487.         Local RYa#,RXa#
  488.         Start_Time=MilliSecs()
  489.         Local Start_ms=Start_Time
  490.        
  491.         Local l_CurVert.AO_vertex
  492.         Local aamod
  493.         ;===>
  494.         For l_AO_Recived = Each AO_receiver
  495.                 ; ===>
  496.                 l_CurObj        = l_AO_RecivedObj
  497.                 ; ===>
  498.                 n_surfs= CountSurfaces(l_CurObj)
  499.                 Local l_NewId%=0;
  500.                 Print "> Oggetto: "+cnt+" Name: "+EntityName(l_CurObj)
  501.                
  502.                 cnt=cnt+1
  503.                 ;===>
  504.                 For s = 1 To n_surfs
  505.                         ;===>
  506.                         surf = GetSurface(l_CurObj,s)
  507.                         n_tris = CountTriangles(surf)-1
  508.                         aamod = n_tris * .2
  509.                         If aamod=0 Then aamod=1
  510.                         ;===>
  511.                         If (n_tris>0) Then
  512.                                 ;===>
  513.                                 Local l_NVert = CountVertices(surf)-1
  514.                                 ;===>
  515.                                 l_total_vert = l_total_vert+l_NVert
  516.                                 l_total_tris = l_total_tris+n_tris
  517.                                 ;===>
  518.                                 For v = 0 To l_NVert
  519.                                         ;===>
  520.                                         l_CurVert = AO_Vertex(v)
  521.                                         TFormPoint VertexX( surf, v ), VertexY( surf, v ), VertexZ( surf, v ), l_CurObj, 0
  522.                                         l_CurVertVx = TFormedX()
  523.                                         l_CurVertVy = TFormedY()
  524.                                         l_CurVertVz = TFormedZ()
  525.                                         l_CurVertVc = 255;
  526.                                 Next
  527.                                 ;===>
  528.                                 For v = 0 To n_tris
  529.                                         ; ===>
  530.                                         l_IdV0 = AO_Vertex(TriangleVertex ( surf, v, 0 ))
  531.                                         l_IdV1 = AO_Vertex(TriangleVertex ( surf, v, 1 ))
  532.                                         l_IdV2 = AO_Vertex(TriangleVertex ( surf, v, 2 ))
  533.                                         ; ===>
  534.                                         l_IdV0x = l_IdV0Vx ; Vertexx            (surf,l_IdV0)
  535.                                         l_IdV0y = l_IdV0Vy ; VertexY            (surf,l_IdV0)
  536.                                         l_IdV0z = l_IdV0Vz ; VertexZ            (surf,l_IdV0)
  537.                                         l_IdV0c = l_IdV0Vc ; VertexRed  (surf,l_IdV0)
  538.                                         ;===>
  539.                                         l_IdV1x = l_IdV1Vx ;
  540.                                         l_IdV1y = l_IdV1Vy ;
  541.                                         l_IdV1z = l_IdV1Vz ;
  542.                                         l_IdV1c = l_IdV1Vc ;
  543.                                         ;===>
  544.                                         l_IdV2x = l_IdV2Vx ;
  545.                                         l_IdV2y = l_IdV2Vy ;
  546.                                         l_IdV2z = l_IdV2Vz ;
  547.                                         l_IdV2c = l_IdV2Vc ;
  548.                                         ;===>
  549.                                         Px = (l_IdV0x + l_IdV1x + l_IdV2x) * .3333333
  550.                                         Py = (l_IdV0y + l_IdV1y + l_IdV2y) * .3333333
  551.                                         Pz = (l_IdV0z + l_IdV1z + l_IdV2z) * .3333333
  552.                                         ;===>
  553.                                         l_Point0x = l_IdV0x : l_Point0y = l_IdV0y : l_Point0z = l_IdV0z;
  554.                                         l_Point1x = l_IdV1x : l_Point1y = l_IdV1y : l_Point1z = l_IdV1z;
  555.                                         l_Point2x = l_IdV2x : l_Point2y = l_IdV2y : l_Point2z = l_IdV2z;
  556.                                         ;===>
  557.                                        
  558.                                         l_NorModx = VertexNX(surf,TriangleVertex ( surf, v, 0 ))
  559.                                         l_NorMody = VertexNY(surf,TriangleVertex ( surf, v, 0 ))
  560.                                         l_NorModz = VertexNZ(surf,TriangleVertex ( surf, v, 0 ))
  561.                                         CalcNormalFast(l_NorMod, l_Point0, l_Point1, l_Point2);
  562.                                         VectorToAngle(l_Angles,l_NorMod)
  563.                                         ;===>
  564.                                         l_rX# = l_Anglesx + 270 ;
  565.                                         l_rY# = l_Anglesy + 180 ;
  566.                                         ;===>
  567.                                         Color_a = 255
  568.                                         ; =========================================================================================================
  569.                                         ; ----------------------------------------------------------------------------------------------------
  570.                                         ; Solution 2  
  571.                                         ; ===>
  572.                                         ;
  573.                                         ; ===>
  574.                                         ; Asse perpedicolare al piano
  575.                                         l_NorModx = l_NorModx*AO_Ray : l_NorMody = l_NorMody*AO_Ray : l_NorModz = l_NorModz*AO_Ray
  576.                                         ; ===>
  577.                                        
  578.                                         LinePick(Px, Py, Pz, l_NorModx, l_NorMody, l_NorModz);
  579.                                         If (PickedEntity()<>0) Then Color_a = Color_a - AO_Attenuation
  580.                                         ; ===>
  581.                                         Total_ColliTime = Total_ColliTime + AO_TimeCollision
  582.                                         ; ===>
  583.                                         If (AO_DetBase>1) Then
  584.                                                 ;===>
  585.                                                 For SphereList=0 To NSphere-1
  586.                                                         ;===>
  587.                                                         RotateXY(l_NorMod, RayList(SphereList), l_rX, l_rY)
  588.                                                         ;===>
  589.                                                         LinePick(Px, Py, Pz, l_NorModx, l_NorMody, l_NorModz);
  590.                                                         If (PickedEntity()<>0) Then Color_a = Color_a - AO_Attenuation
  591.                                                         ;===>
  592.                                                 Next
  593.                                                 ; ===>
  594.                                         EndIf
  595.                                         ;===>
  596.                                         Total_ColliTime = Total_ColliTime + AO_TimeCollision
  597.                                         ;===>
  598.                                         ;----------------------------------------------------------------------------------------------------
  599.                                         ;=========================================================================================================
  600.                                         ;===>
  601.                                        
  602.                                         If ( Color_a < l_IdV0c) Then l_IdV0Vc = Color_a
  603.                                         If ( Color_a < l_IdV1c) Then l_IdV1Vc = Color_a
  604.                                         If ( Color_a < l_IdV2c) Then l_IdV2Vc = Color_a
  605.                                         ;===>
  606.                                         If ((v Mod aamod)=0) Then
  607.                                                 ;===>
  608.                                                 Riga$ =         "> Surfaces:    " + Float(Int((Float(s)/Float(n_surfs))*10000))/100.0
  609.                                                 Riga$ = Riga$ + "% Complete:    " + Float(Int((Float(v)/Float(n_tris ))*10000))/100.0
  610.                                                 Riga$ = Riga$ + "  TimeCol:     " + Total_ColliTime
  611.                                                 Riga$ = Riga$ + "  TotalTime:   " + (MilliSecs()-Start_ms)
  612.                                                 Print Riga$
  613.                                                 ;===>
  614.                                                 Total_ColliTime = 0
  615.                                                 Start_ms=MilliSecs()
  616.                                                 ;===>
  617.                                         EndIf
  618.                                         ;===>
  619.                                 Next
  620.                                 ;===>
  621.                                 For v = 0 To l_NVert
  622.                                         ;===>
  623.                                         Color_a = AO_Vertex(v)Vc
  624.                                         VertexColor surf, v, Color_a, Color_a, Color_a;
  625.                                         ;===>
  626.                                 Next
  627.                                 ;===>
  628.                                 Riga$ =         "> Surfaces:    " + Float(Int((Float(s)/Float(n_surfs))*10000))/100.0
  629.                                 Riga$ = Riga$ + "% Complete:    " + 100.0
  630.                                 Riga$ = Riga$ + "  TimeCol:     " + Total_ColliTime
  631.                                 Riga$ = Riga$ + "  TotalTime:   " + (MilliSecs()-Start_ms)
  632.                                 Print Riga$
  633.                                 ;===>
  634.                                 Total_ColliTime = 0
  635.                                 Start_ms=MilliSecs()
  636.                                 ;===>
  637.                         EndIf
  638.                         ;===>
  639.                         Print " "
  640.                         l_NewId = l_NewId + CountVertices(surf)
  641.                         ;===>
  642.                 Next           
  643.         Next
  644.         ;===>
  645.         Delete l_Point0
  646.         Delete l_Point1
  647.         Delete l_Point2
  648.        
  649.         Delete l_Normal;
  650.         Delete l_NorMod;
  651.         Delete l_Angles;
  652.         ;===>
  653.         Local Stop_Time% = MilliSecs()-Start_Time
  654.         ;===>
  655.         Print "->"
  656.         Print "-> Total Time collision: "+Stop_Time
  657.         Print "->"
  658.         Print " Total Tris: "+l_total_tris
  659.         Print " Total Vert: "+l_total_vert
  660.         Print "->"
  661.         Print " "
  662.         Print "Press any Key"
  663.         WaitKey()
  664.         ;===>
  665.         Return Stop_Time
  666.         ;===>
  667. End Function
  668.  
  669.  
  670.  
  671. ;=====================================================
  672. ;--------------------------------------------------
  673. ;===>
  674. ;
  675. ;===>
  676. ;
  677. Function AO_Show()
  678.         ;===>
  679.         Local l_AO_Recived.AO_receiver
  680.         ;===>
  681.         For l_AO_Recived.AO_receiver = Each AO_receiver
  682.                 ; ===>
  683.                 ShowEntity l_AO_RecivedObj
  684.                 ; ===>
  685.         Next
  686.         ;===>
  687. End Function
  688.  
  689. ;=====================================================
  690. ;--------------------------------------------------
  691. ;===>
  692. ;
  693. ;===>
  694. ;
  695. Function AO_Hide()
  696.         ;===>
  697.         Local l_AO_Recived.AO_receiver
  698.         ;===>
  699.         For l_AO_Recived.AO_receiver = Each AO_receiver
  700.                 ; ===>
  701.                 HideEntity l_AO_RecivedObj
  702.                 ; ===>
  703.         Next
  704.         ;===>
  705. End Function
  706.  
  707.  
  708. ;~IDEal Editor Parameters:
  709. ;~C#Blitz3D


Comments :


N(Posted 1+ years ago)

 <div class="quote"> this code is a pubblic domain if specify the my name in the credits the string to be included is "System Ambient Occlusion Vertex by Vincenzo Caldarulo Italy-Bari (Vincentx)" </div>Unfortunately, you've already made it public domain, so it's that way regardless of whether or not you're credited.  I suspect most people would be happy to do that though (otherwise there are plenty of four-letter words to describe those individuals).


DareDevil(Posted 1+ years ago)

 ok tnk ;)


Matty(Posted 1+ years ago)

 I must be missing something but that code does not look complete?


DareDevil(Posted 1+ years ago)

 .....


Matty(Posted 1+ years ago)

 eh?


DareDevil(Posted 1+ years ago)

 Ok i have update the codebye


Matty(Posted 1+ years ago)

 Ahh I see, thanks.


DareDevil(Posted 1+ years ago)

 The new Update whitc load and save automatic the ambent vertex occlusion. the best regards RifRaf for wirite function Load and Write
Code: [Select]
;===>O=========================o<=================================================================
;===>O=========================o<=================================================================
;===> Name file:
;===>
;===> Programmatore:
;===>  Caldarulo Vincenzo (Vision&Design Software)
;===> Descrizione:
;===>
;===>O=========================o<=================================================================
;===>O=========================o<=================================================================
;
;
AppTitle("Ambient Occlusion Vertex by Vincentx (Vincenzo Caldarulo Italy-Bari)")
;=====================================================
;===>
Type AO_vertex
Field Vx#
Field Vy#
Field Vz#
Field Vc%
End Type

;=====================================================
;===>
Type AO_receiver
;===>
Field ObjOrig%
Field Obj%
Field FileName$
;===>
End Type

;====>
;=====================================================
;===>
Const AO_Method% = 0 ; 0 = LinePick B3D  // 1 = LinePick SW  // 2 = Octree
Const AO_Ray# =120 ; Lenght of ray
Const AO_DetBase# = 4; Level of precision AO 3 is a good result
Const AO_Detail# = (AO_DetBase+1) ;;3=4 INTERAZIONI
Const AO_TotRay# = ((4*(AO_DetBase-1)) * (AO_DetBase-1))+1
Const AO_Attenuation# = (255.0 - 1 )/AO_TotRay


;=====================================================
;===>
Dim AO_Vertex.AO_vertex(65535)
For id=0 To 65535
AO_Vertex(id) = New AO_vertex
Next
;=====================================================
;===>
Global dlr.AO_receiver

Global AO_TimeCollision=0
;Global AO_InterCollision=0

Const AO_LevelAlpha#  = 0.8
;=====================================================
;===>

Dim RayList.Point3D(AO_TotRay)
Global NSphere% = 0

;=====================================================
;===>
Precalcolo();


Global spd# = 0.5

Graphics3D 800,600,32,2
;AmbientLight 255,255,255
; GameLight=CreateLight():RotateEntity gamelight,0,0,35
; LightColor gamelight,200,200,200
ClearTextureFilters()
Global Camera = CreateCamera()


LoadScene()

; =================================================================================================
; ===>
Cls
Print ">===================================================="
Print ">"
Print "> Numero di interazioni oggetto: "+AO_TotRay
Print ">"
Print ">===================================================="
Print ">"
;Stop
Local TimeAO% = AO_Update()
spd# = 0.5
Local l_OldTime,l_CurTime
; =================================================================================================
; ===>


Repeat
MoveEntity Camera,(KeyDown(205)-KeyDown(203))*spd,0,(MouseDown(1)-MouseDown(2))*spd
TurnEntity Camera,-MouseYSpeed()*0.1,-MouseXSpeed()*0.1,0
RotateEntity Camera,EntityPitch(Camera,True),EntityYaw(Camera,True),0

MoveMouse GraphicsWidth()*.5,GraphicsHeight()*.5

; ===========================================================================
If KeyHit(2) Then  AO_Show()
If KeyHit(3) Then  AO_Hide()

If KeyHit(24) Then  WireFrame True
If KeyHit(25) Then  WireFrame False


If (KeyDown(46)) Then
PositionEntity Camera,60,60,-60
RotateEntity Camera,30,45,0
EndIf

; ===========================================================================
; ===>
UpdateWorld()
RenderWorld()
;===>
Local Riga=0
;====>
Color 255,0,0
l_CurTime=MilliSecs()-l_OldTime
l_OldTime=MilliSecs()
Text(0,Riga,"Ms: "+l_CurTime+" AO Time: "+ TimeAO) : Riga = Riga + 10
Riga = Riga + 10 : Riga = Riga + 10
Text(0,Riga," 1 - Enable Ambient occlusion") : Riga = Riga + 10
Text(0,Riga," 2 - Disable Ambient occlusion") : Riga = Riga + 10
;===>
Flip(False)

;===>
Until KeyHit(1)

End


Function LoadScene()
;===>
Local Obj;
Local R = 20
Local R2 = 20
Local x,z
Local Segment=50
;===>
Obj = CPlane(Segment*2)
PositionEntity Obj,0,-5,0
ScaleEntity Obj, 2, 1, 2
        CreateDir("AO_DIR");
AO_SetReceiver(Obj,"AO_DIRAO_plane.aof") ; .aof ambient occlusion file
;===>
Local a#;
For a=0 To 100
;Obj = CreateSphere(16)
Obj = CreateCube()
ang = a*25.0
d0 = R2-(a/10.0)
d1 = a/3.0
PositionEntity Obj, d0*Cos(ang), d1, d0*Sin(ang)
RotateEntity Obj, 0, ang, 0
ScaleEntity Obj, 2, 2, 2

AO_SetReceiver(Obj,"AO_DIRAO_cube"+a+".aof")

Next
;===>


End Function



Function CPlane%(Number#)
;===>
If(Number>150) Then Number=150
;===>
Local mesh = CreateMesh()
Local surf = CreateSurface(mesh)
Local center#= (Number/2.0)
;===>

For pz# = 0 To Number
For px# = 0 To Number
k = AddVertex(surf, px-center, 0, pz-center, px/Number, pz/Number )
Next
Next
;===>

For pz=0 To Number-1
For px=0 To Number-1
;===>
p0 = px+((pz+0)*(Number+1))
p1 = px+((pz+0)*(Number+1))+1
p2 = px+((pz+1)*(Number+1))
p3 = px+((pz+1)*(Number+1))+1
;===>
AddTriangle(surf,p2,p1,p0)
AddTriangle(surf,p2,p3,p1)
;===>
Next
Next
;===>
Return mesh
;===>
End Function



; ==================================================
; -----------------------------------------------
; Punto 3D
;---------------------------------------
;=======================================
Type Point3D
Field x#
Field y#
Field z#
End Type

; ==================================================
; -----------------------------------------------

Function Point3DSet( Dst.Point3D, x#, y#, z#)
;---->
Dstx = x ;
Dsty = y ;
Dstz = z ;
;---->
End Function

; ==================================================
; -----------------------------------------------
; Rotazione Asse X Y
;--------------------------
;================================
Function RotateXY( Rtn.Point3D, P.Point3D, RotX%, RotY% )
; ===>
Local l_c# = Cos(RotX);
Local l_s# = Sin(RotX);
; ===>
;Rotazione Asse X
Local RX_x# =  Px
Local RX_y# = (Py * l_c)-(Pz * l_s);
Local RX_z# = (Pz * l_c)+(Py * l_s);
; ===>
l_c# = Cos(RotY);
l_s# = Sin(RotY);
; ===>
;Rotazione Asse Y
Local RY_x# = (RX_x * l_c)+(RX_z * l_s);
Local RY_y# =  RX_y
Local RY_z# = (RX_z * l_c)-(RX_x * l_s)
; ===>
Rtnx# = RY_x
Rtny# = RY_y
Rtnz# = RY_z
; ===>
End Function

; ==================================================
; -----------------------------------------------
; Calcolo della normale
;--------------------------
;================================
;
Function CalcNormalFast( Rtn.Point3D, A.Point3D, B.Point3D, C.Point3D)
; ===>
Local K1x# = Ax - Bx
Local K1y# = Ay - By
Local K1z# = Az - Bz
; ===>
Local K2x# = Bx - Cx
Local K2y# = By - Cy
Local K2z# = Bz - Cz
; ===>
; Compute their cross product.
Local Rx# = K1y#*K2z# - K1z#*K2y#
Local Ry# = K1z#*K2x# - K1x#*K2z#
Local Rz# = K1x#*K2y# - K1y#*K2x#
; ===>
Local do# = 1.0 / Sqr( (Rx*Rx) + (Ry*Ry) + (Rz*Rz) )
  ; ===>
Rtnx = Rx*do;
Rtny = Ry*do;
Rtnz = Rz*do;
;===>
End Function


; ==================================================
; -----------------------------------------------
; Vector To Angle
;--------------------------
;================================
;
Function VectorToAngle( dst.Point3D, Vect.Point3D )
  ;===>
Local dist1  = Sqr( (Vectx*Vectx)+(Vectz*Vectz)) ;
dstx = ATan2( Vecty ,dist1);
dsty = ATan2( Vectx ,Vectz);
;===>
End Function

;===>O=========================o<=================================================================
;===>O=========================o<=================================================================
;===> Name file:
;===>
;===> Programmatore:
;===>  Caldarulo Vincenzo (Vision&Design Software)
;===> Descrizione:
;===>
;===>O=========================o<=================================================================
;===>O=========================o<=================================================================
;




;;=====================================================
;;===>
;Type AO_vertex
; Field Vx#
; Field Vy#
; Field Vz#
; Field Vc%
;End Type
;
;;=====================================================
;;===>
;Type AO_receiver
; ;===>
; Field ObjOrig%
; Field Obj%
; ;===>
;End Type
;
;;====>
;;=====================================================
;;===>
;Const AO_Method% = 0 ; 0 = LinePick B3D  // 1 = LinePick SW  // 2 = Octree
;Const AO_Ray# = 100
;Const AO_DetBase# = 2;
;Const AO_Detail# = (AO_DetBase+1) ;;3=4 INTERAZIONI
;Const AO_TotRay# = ((4*(AO_DetBase-1)) * (AO_DetBase-1))+1
;Const AO_Attenuation# = (255.0 - 64 )/AO_TotRay
;
;
;;=====================================================
;;===>
;Dim AO_Vertex.AO_vertex(65535)
;For id=0 To 65535
; AO_Vertex(id) = New AO_vertex
;Next
;;=====================================================
;;===>
;Global dlr.AO_receiver
;
;Global AO_TimeCollision=0
;;Global AO_InterCollision=0
;
;Const AO_LevelAlpha#  = 0.8
;;=====================================================
;;===>
;
;Dim RayList.Point3D(AO_TotRay)
;Global NSphere% = 0
;
;;=====================================================
;;===>
;Precalcolo();

;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function Precalcolo()
;===>
If (AO_DetBase<=1) Then Return
;===>
NSphere%=0
Local RX#,RY#,RXa#,RYa#
Local l_Normal.Point3D = New Point3D : Point3DSet(l_Normal, 0, AO_Ray, 0)
Local l_PartRY# = ((AO_DetBase-1)*4)
Local l_AngS# = 360 / l_PartRY ;
Local l_AngT# = 90.0 / AO_DetBase
;===>
For RY=0 To l_PartRY-1
;===>
RYa# = l_AngS*RY
;===>
For RX=1 To AO_DetBase-1
;===>
RXa# = RX*l_AngT
;===>
RayList.Point3D(NSphere) = New Point3D
;===>
RotateXY(RayList(NSphere),l_Normal, RXa, RYa)
;===>
NSphere = NSphere+1
;===>
Next
;===>
Next
;===>
Delete l_Normal
;===>
End Function

;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function AO_Free()
Local l_AO_Recived.AO_receiver
For l_AO_Recived.AO_receiver = Each AO_receiver
FreeEntity l_AO_RecivedObj
Delete l_AO_Recived
Next

End Function

;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function AO_SetReceiver(mesh, AO_FileName$)
;===>
Local l_AO_Recived.AO_receiver = New AO_receiver
;===>

l_AO_RecivedFileName = AO_FileName;
l_AO_RecivedObjOrig = mesh
l_AO_RecivedObj = CopyMesh(l_AO_RecivedObjOrig,l_AO_RecivedObjOrig)
NameEntity( l_AO_RecivedObj, EntityName(l_AO_RecivedObjOrig))
EntityAlpha l_AO_RecivedObj, AO_LevelAlpha
EntityBlend l_AO_RecivedObj, 1
;
EntityPickMode(l_AO_RecivedObj,2)
;===>
EntityFX l_AO_RecivedObj,2+1+32
UpdateNormals l_AO_RecivedObj
;===>
Return l_AO_RecivedObj
End Function


;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function AO_Update()
;===>
Local l_total_tris%,l_total_vert%
Local Total_ColliTime = 0
;===>
Local Start_Time=MilliSecs()
;===>
Local l_IdV0c%, l_IdV0x#, l_IdV0y#, l_IdV0z#, l_IdV0.AO_vertex
Local l_IdV1c%, l_IdV1x#, l_IdV1y#, l_IdV1z#, l_IdV1.AO_vertex
Local l_IdV2c%, l_IdV2x#, l_IdV2y#, l_IdV2z#, l_IdV2.AO_vertex
;===>
Local l_Point0.Point3D = New Point3D
Local l_Point1.Point3D = New Point3D
Local l_Point2.Point3D = New Point3D
;===>
Local l_Normal.Point3D = New Point3D : Point3DSet(l_Normal, 0, AO_Ray, 0)
Local l_NorMod.Point3D = New Point3D
Local l_Angles.Point3D = New Point3D
;===>
Local SphereList=0
Local v%, s%
;===>
Local l_CurObj;
Local n_surfs
Local surf, n_tris
Local Px#,Py#,Pz#;
;===>
Local Color_a# = 0
Local l_rX#,l_rY#
;===>
Local cnt=0
Local l_AO_Recived.AO_receiver
Local Riga$
;===>
Local RYa#,RXa#
Start_Time=MilliSecs()
Local Start_ms=Start_Time

Local l_CurVert.AO_vertex
Local aamod
;===>
For l_AO_Recived = Each AO_receiver
; ===>
l_CurObj = l_AO_RecivedObj
;exsist the file AO for object
If FileType(l_AO_RecivedFileName)=1 Then
;===>
AO_LoadFile(l_CurObj,l_AO_RecivedFileName);
;===>
Else
; ===>
n_surfs= CountSurfaces(l_CurObj)
Local l_NewId%=0;
Print "> Oggetto: "+cnt+" Name: "+EntityName(l_CurObj)

cnt=cnt+1
;===>
For s = 1 To n_surfs
;===>
surf = GetSurface(l_CurObj,s)
n_tris = CountTriangles(surf)-1
aamod = n_tris * .2
If aamod=0 Then aamod=1
;===>
If (n_tris>0) Then
;===>
Local l_NVert = CountVertices(surf)-1
;===>
l_total_vert = l_total_vert+l_NVert
l_total_tris = l_total_tris+n_tris
;===>
For v = 0 To l_NVert
;===>
l_CurVert = AO_Vertex(v)
TFormPoint VertexX( surf, v ), VertexY( surf, v ), VertexZ( surf, v ), l_CurObj, 0
l_CurVertVx = TFormedX()
l_CurVertVy = TFormedY()
l_CurVertVz = TFormedZ()
l_CurVertVc = 255;
Next
;===>
For v = 0 To n_tris
; ===>
l_IdV0 = AO_Vertex(TriangleVertex ( surf, v, 0 ))
l_IdV1 = AO_Vertex(TriangleVertex ( surf, v, 1 ))
l_IdV2 = AO_Vertex(TriangleVertex ( surf, v, 2 ))
; ===>
l_IdV0x = l_IdV0Vx ; Vertexx (surf,l_IdV0)
l_IdV0y = l_IdV0Vy ; VertexY (surf,l_IdV0)
l_IdV0z = l_IdV0Vz ; VertexZ (surf,l_IdV0)
l_IdV0c = l_IdV0Vc ; VertexRed (surf,l_IdV0)
;===>
l_IdV1x = l_IdV1Vx ;
l_IdV1y = l_IdV1Vy ;
l_IdV1z = l_IdV1Vz ;
l_IdV1c = l_IdV1Vc ;
;===>
l_IdV2x = l_IdV2Vx ;
l_IdV2y = l_IdV2Vy ;
l_IdV2z = l_IdV2Vz ;
l_IdV2c = l_IdV2Vc ;
;===>
Px = (l_IdV0x + l_IdV1x + l_IdV2x) * .3333333
Py = (l_IdV0y + l_IdV1y + l_IdV2y) * .3333333
Pz = (l_IdV0z + l_IdV1z + l_IdV2z) * .3333333
;===>
l_Point0x = l_IdV0x : l_Point0y = l_IdV0y : l_Point0z = l_IdV0z;
l_Point1x = l_IdV1x : l_Point1y = l_IdV1y : l_Point1z = l_IdV1z;
l_Point2x = l_IdV2x : l_Point2y = l_IdV2y : l_Point2z = l_IdV2z;
;===>

l_NorModx = VertexNX(surf,TriangleVertex ( surf, v, 0 ))
l_NorMody = VertexNY(surf,TriangleVertex ( surf, v, 0 ))
l_NorModz = VertexNZ(surf,TriangleVertex ( surf, v, 0 ))
CalcNormalFast(l_NorMod, l_Point0, l_Point1, l_Point2);
VectorToAngle(l_Angles,l_NorMod)
;===>
l_rX# = l_Anglesx + 270 ;
l_rY# = l_Anglesy + 180 ;
;===>
Color_a = 255
; =========================================================================================================
; ----------------------------------------------------------------------------------------------------
; Solution 2  
; ===>
;
; ===>
; Asse perpedicolare al piano
l_NorModx = l_NorModx*AO_Ray : l_NorMody = l_NorMody*AO_Ray : l_NorModz = l_NorModz*AO_Ray
; ===>

LinePick(Px, Py, Pz, l_NorModx, l_NorMody, l_NorModz);
If (PickedEntity()<>0) Then Color_a = Color_a - AO_Attenuation
; ===>
Total_ColliTime = Total_ColliTime + AO_TimeCollision
; ===>
If (AO_DetBase>1) Then
;===>
For SphereList=0 To NSphere-1
;===>
RotateXY(l_NorMod, RayList(SphereList), l_rX, l_rY)
;===>
LinePick(Px, Py, Pz, l_NorModx, l_NorMody, l_NorModz);
If (PickedEntity()<>0) Then Color_a = Color_a - AO_Attenuation
;===>
Next
; ===>
EndIf
;===>
Total_ColliTime = Total_ColliTime + AO_TimeCollision
;===>
;----------------------------------------------------------------------------------------------------
;=========================================================================================================
;===>

If ( Color_a < l_IdV0c) Then l_IdV0Vc = Color_a
If ( Color_a < l_IdV1c) Then l_IdV1Vc = Color_a
If ( Color_a < l_IdV2c) Then l_IdV2Vc = Color_a
;===>
If ((v Mod aamod)=0) Then
;===>
Riga$ =         "> Surfaces:    " + Float(Int((Float(s)/Float(n_surfs))*10000))/100.0
Riga$ = Riga$ + "% Complete:    " + Float(Int((Float(v)/Float(n_tris ))*10000))/100.0
Riga$ = Riga$ + "  TimeCol:     " + Total_ColliTime
Riga$ = Riga$ + "  TotalTime:   " + (MilliSecs()-Start_ms)
Print Riga$
;===>
Total_ColliTime = 0
Start_ms=MilliSecs()
;===>
EndIf
;===>
Next
;===>
For v = 0 To l_NVert
;===>
Color_a = AO_Vertex(v)Vc
VertexColor surf, v, Color_a, Color_a, Color_a;
;===>
Next
;===>
Riga$ =         "> Surfaces:    " + Float(Int((Float(s)/Float(n_surfs))*10000))/100.0
Riga$ = Riga$ + "% Complete:    " + 100.0
Riga$ = Riga$ + "  TimeCol:     " + Total_ColliTime
Riga$ = Riga$ + "  TotalTime:   " + (MilliSecs()-Start_ms)
Print Riga$
;===>
Total_ColliTime = 0
Start_ms=MilliSecs()
;===>
EndIf
;===>
Print " "
l_NewId = l_NewId + CountVertices(surf)
;===>
Next
;===>
AO_SaveFile(l_CurObj, l_AO_RecivedFileName);
;===>
EndIf
;===>
Next
;===>
Delete l_Point0
Delete l_Point1
Delete l_Point2

Delete l_Normal;
Delete l_NorMod;
Delete l_Angles;
;===>
Local Stop_Time% = MilliSecs()-Start_Time
;===>
Print "->"
Print "-> Total Time collision: "+Stop_Time
Print "->"
Print " Total Tris: "+l_total_tris
Print " Total Vert: "+l_total_vert
Print "->"
Print " "
Print "Press any Key"
WaitKey()
;===>
Return Stop_Time
;===>
End Function



;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function AO_Show()
;===>
Local l_AO_Recived.AO_receiver
;===>
For l_AO_Recived.AO_receiver = Each AO_receiver
; ===>
ShowEntity l_AO_RecivedObj
; ===>
Next
;===>
End Function

;=====================================================
;--------------------------------------------------
;===>
;
;===>
;
Function AO_Hide()
;===>
Local l_AO_Recived.AO_receiver
;===>
For l_AO_Recived.AO_receiver = Each AO_receiver
; ===>
HideEntity l_AO_RecivedObj
; ===>
Next
;===>
End Function


Function AO_SaveFile( Mesh, AO_FileName$)
;===>
EntityFX Mesh,2+1
;===>
;first record the surface count
Local scount=CountSurfaces(Mesh)
Local F=WriteFile(AO_FileName$)
WriteInt F,scount
;===>
  For s=1 To scount
;===>
    Local surf=GetSurface(Mesh,s)
    Local vcount=CountVertices(surf)-1
  ;===>
; surfaces can get rearranged if the model is reexported via differnt modelling apps.. so lets
    ; record the surface info here so we can find the matching surface when we reload the map
WriteInt F,s
WriteInt F,vcount
WriteInt F,CountTriangles(surf) ; just here to help make a surface match in the loader
For v=0 To vcount
; Now save the vertex data
; since we are not using colored lights, we need only save the red channel
; on reload we apply the red channel to all r,g and b  
WriteFloat F,VertexRed(surf,v)
WriteFloat F,VertexGreen(surf,v)
WriteFloat F,VertexBlue(surf,v)
Next
  Next
CloseFile F
End Function                    

Function AO_LoadFile( Mesh, AO_FileName$)
EntityBlend Mesh, 1
EntityFX Mesh,2+1

If FileType(AO_FileName$)<>1 Then Return -1
Local f=OpenFile(AO_FileName$)
Local scount=ReadInt(f)
Local surfcount=CountSurfaces(Mesh)
;===>
;make sure we have at least the needed suface count
If scount<>surfcount Then
CloseFile f
Return -1
EndIf
;===>
For i=1 To scount
;read vert count and tri count
Local SurfID=ReadInt(f)
Local vcount=ReadInt(f)
Local tricount=ReadInt(f)
;find a matching surface
Local match=0
;===>
;first lets try the surface stored in the save. but because surfaces can get rearranged if a model is reexported
    ;we wont assume its in the same order it was in when we saved the ambient map
    Local s=GetSurface(Mesh,SurfID)
If vcount=(CountVertices(s)-1) And tricount=CountTriangles(s) Then
match=1
For Vert=0 To vcount
vr=ReadFloat(f)
vg=ReadFloat(f)
vb=ReadFloat(f)
VertexColor s,vert,vr,vg,vb
Next
EndIf
;===>
; if its not in the right order then match may = 0, if it does
    ; then we want to search though all the surfaces and find the right one    
    If match=0 Then
For getsurf=1 To scount
s=GetSurface(Mesh,getsurf)
If vcount=(CountVertices(s)-1) And tricount=CountTriangles(s) Then
match=1
For Vert=0 To vcount
vr=ReadFloat(f)
vg=ReadFloat(f)
vb=ReadFloat(f)
VertexColor s,vert,vr,vg,vb,VertexAlpha(s,vert)
Next
EndIf
Next
    EndIf
;===>
    ;if match still is 0, it means there was no matching surface and the model has changed its gemoetric properties
If match=0 Then
   CloseFile f
Return -1 ; did not find a matching surface for this data
EndIf
;===>
Next
;===>
CloseFile f
UpdateNormals Mesh
Return 1
;===>

End Function

;~IDEal Editor Parameters:
;~F#2B6#2C8
;~C#Blitz3D



RifRaf(Posted 1+ years ago)

 just a few things In your new example you included a folder name in the save and load filepath.   This will mav on anyone else because the folder does not exist.You left the AO_DetBase# = 2, people should crank it to at least 4 to see some detail in the results.


DareDevil(Posted 1+ years ago)

 ok ! have update the codebye


Oiduts Studios(Posted 1+ years ago)

 Is it possible to have a texture on the mesh and ambient occlusion? I can't seem to find a free method to pre-bake ao maps. [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal