Ooops
November 25, 2020, 08:10:34 AM

Author Topic: [bb] Area Collision Lib by David Bird(Birdie) [ 1+ years ago ]  (Read 629 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Area Collision Lib
Author : David Bird(Birdie)
Posted : 1+ years ago

Description : As the title says..

Code :
Code: BlitzBasic
  1. ;
  2. ;       Area Collision Library
  3. ;       David Bird
  4. ;       enquire@davebird.fsnet.co.uk
  5. ;
  6. ;syntax
  7.  
  8. ;SetSphereRegion(posx,posy,posz,radius)
  9. ;SetCubeRegion(posx,posy,posz,size)
  10. ;SetRectRegion(posx,posy,posz,width,height,depth)
  11. ;PointInRegion(regType,checkx,checky,checkz)
  12. ;SphereInRegion(regType,checkx,checky,checkz,radius to check)
  13. ;EntityInRegion(regType,Entity,Radius) Problem No way of obtaining entity radius
  14. ;FreeAllRegions()
  15. ;FreeRegion(r.reg)
  16. ;GetEntityRegion.reg(ent,x#,y#,z#,rd#=1)
  17. ;GetSphereRegion.reg(x#,y#,z#,rad#)
  18. ;GetPointRegion.reg(x#,y#,z#)
  19.  
  20. Global AC_DEBUG=False ;set this this to true to show regions
  21. Type reg
  22.         Field typ       ;0-sphere 1-cube 2-rect
  23.         Field piv
  24.         Field rad#
  25.         Field sx#
  26.         Field sy#
  27.         Field sz#
  28.         Field lpiv
  29.         Field tx#
  30.         Field ty#
  31.         Field tz#
  32.         Field debugent
  33. End Type
  34. Function SetAC_DEBUG(d=False)
  35.         AC_DEBUG=d
  36. End Function
  37.  
  38. Function MoveRegion(r.reg,x#,y#,z#)
  39.         MoveEntity rpiv,x,y,z
  40. End Function
  41.  
  42. Function TurnRegion(r.reg,x#,y#,z#,Glob=0)
  43.         TurnEntity rpiv,x,y,z,glob
  44. End Function
  45.  
  46. Function PositionRegion(r.reg,x#,y#,z#,Glob=0)
  47.         PositionEntity rpiv,x,y,z,Glob
  48. End Function
  49.  
  50. Function TranslateRegion(r.reg,x#,y#,z#,Glob=0)
  51.         TranslateEntity rpiv,x,y,z,Glob
  52. End Function
  53.  
  54. Function SetSphereRegion.reg(x#,y#,z#,rad#,parent=0)
  55.         r.reg=New reg
  56.         rpiv=CreatePivot(parent)
  57.         rlpiv=CreatePivot()
  58.         PositionEntity rpiv,x,y,z
  59.         r
  60. ad=rad
  61.         r       yp=0                    ;only spheres unto now
  62.         If AC_DEBUG=True Then
  63.                 t=CreateSphere(10,rpiv)
  64.                 EntityAlpha t,.25
  65.                 EntityFX t,16
  66.                 ScaleEntity t,rad,rad,rad
  67.                 rdebugent=t
  68.         End If
  69.         Return r
  70. End Function
  71.  
  72. Function SetCubeRegion.reg(x#,y#,z#,size#,parent=0)
  73.         r.reg=New reg
  74.         rpiv=CreatePivot(parent)
  75.         rlpiv=CreatePivot()
  76.         PositionEntity rpiv,x,y,z
  77.         rsx=size
  78.         rsy=size
  79.         rsz=size
  80.         r       yp=1            ;only spheres unto now
  81.         If AC_DEBUG=True Then
  82.                 t=CreateCube(rpiv)
  83.                 EntityAlpha t,.25
  84.                 EntityFX t,16
  85.                 ScaleEntity t,size,size,size
  86.                 rdebugent=t
  87.         End If
  88.  
  89.         Return r
  90. End Function
  91.  
  92. Function SetRectRegion.reg(x#,y#,z#,w#,h#,d#,parent=0)
  93.         r.reg=New reg
  94.         rpiv=CreatePivot(parent)
  95.         rlpiv=CreatePivot()
  96.         PositionEntity rpiv,x,y,z
  97.         rsx=w
  98.         rsy=h
  99.         rsz=d
  100.         r       yp=1
  101.         If AC_DEBUG=True Then
  102.                 t=CreateCube(rpiv)
  103.                 EntityAlpha t,.25
  104.                 EntityFX t,16
  105.                 ScaleEntity t,w,h,d
  106.                 rdebugent=t
  107.         End If
  108.         Return r
  109. End Function
  110.  
  111. Function PointInRegion(r.reg,x#,y#,z#)
  112.         typ=r   yp
  113.         If typ=2 Then t=1
  114.         Select typ
  115.                 Case 0                                                          ;-point in sphere
  116.                         dx#=EntityX(rpiv,True)-x
  117.                         dy#=EntityY(rpiv,True)-y
  118.                         dz#=EntityZ(rpiv,True)-z
  119.                         rad#=Sqr(dx^2+dy^2+dz^2)
  120.                         If rad<r
  121. ad Then Return True
  122.                 Case 1                                                          ;- point in cube or rectangle
  123.                         If x<EntityX(rpiv,True)+rsx And x>EntityX(rpiv,True)-rsx
  124.                                 If y<EntityY(rpiv,True)+rsy And y>EntityY(rpiv,True)-rsy
  125.                                         If z<EntityZ(rpiv,True)+rsz And z>EntityZ(rpiv,True)-rsz
  126.                                                 Return True
  127.                                         End If
  128.                                 End If
  129.                         End If                 
  130.         End Select
  131.         Return False
  132. End Function
  133.  
  134. Function EntityInRegion(ent,r.reg,rd#=1)
  135.         Return SphereInRegion(r,EntityX(ent,True),EntityY(ent,True),EntityZ(ent,True),rd);??? radius
  136. End Function
  137.  
  138. Function SphereInRegion(r.reg,x#,y#,z#,rd#)
  139.         typ=r   yp
  140.         If typ=2 Then t=1
  141.         Select typ
  142.                 Case 0                                                          ;-Sphere in sphere
  143.                         dx#=EntityX(rpiv,True)-x
  144.                         dy#=EntityY(rpiv,True)-y
  145.                         dz#=EntityZ(rpiv,True)-z
  146.                         rad#=Sqr(dx^2+dy^2+dz^2)-rd
  147.                         If rad<r
  148. ad Then Return True
  149.                 Case 1                                                          ;-Sphere in cube
  150.                         dx#=EntityX(rpiv,True)-x
  151.                         dy#=EntityY(rpiv,True)-y
  152.                         dz#=EntityZ(rpiv,True)-z
  153.                         rad#=Sqr(dx^2+dy^2+dz^2)
  154.                         dx=dx/rad
  155.                         dy=dy/rad
  156.                         dz=dz/rad
  157.                         dx=EntityX(rpiv,True)-(dx*(rad-rd))
  158.                         dy=EntityY(rpiv,True)-(dy*(rad-rd))
  159.                         dz=EntityZ(rpiv,True)-(dz*(rad-rd))
  160.                         If dx<EntityX(rpiv,True)+rsx And dx>EntityX(rpiv,True)-rsx
  161.                                 If dy<EntityY(rpiv,True)+rsy And dy>EntityY(rpiv,True)-rsy
  162.                                         If dz<EntityZ(rpiv,True)+rsz And dz>EntityZ(rpiv,True)-rsz
  163.                                                 Return True
  164.                                         End If
  165.                                 End If
  166.                         End If                 
  167.         End Select
  168.         Return False
  169. End Function
  170.  
  171. Function GetPointRegion.reg(x#,y#,z#)
  172.         ;returns the first region that a point is within
  173.         For r.reg=Each reg
  174.                 If PointInRegion(r,x,y,z)=True Then Return r
  175.         Next
  176.         Return Null
  177. End Function
  178.  
  179. Function GetSphereRegion.reg(x#,y#,z#,rad#)
  180.         ;returns the first region that a point is within
  181.         For r.reg=Each reg
  182.                 If SphereInRegion(r,x,y,z,rad)=True Then Return r
  183.         Next
  184.         Return Null
  185. End Function
  186.  
  187. Function GetEntityRegion.reg(ent,rd#=1)
  188.         ;returns the first region that a point is within
  189.         For r.reg=Each reg
  190.                 If EntityInRegion(ent,r,rd)=True Then Return r
  191.         Next
  192.         Return Null
  193. End Function
  194.  
  195. Function FreeAllRegions()
  196.         For r.reg=Each reg
  197.                 If rpiv<>0 Then FreeEntity rpiv
  198.                 If rlpiv<>0 Then FreeEntity rlpiv
  199.                 Delete r
  200.         Next
  201. End Function
  202.  
  203. Function FreeRegion(r.reg)
  204.                 If rpiv<>0 Then FreeEntity rpiv
  205.                 If rlpiv<>0 Then FreeEntity rlpiv
  206.                 Delete r
  207. End Function
  208.  
  209. Function UpdateRegions()
  210.         For r.reg=Each reg
  211.                 r       x=EntityX(rpiv,True)-EntityX(rlpiv,True)
  212.                 r       y=EntityY(rpiv,True)-EntityY(rlpiv,True)
  213.                 r       z=EntityZ(rpiv,True)-EntityZ(rlpiv,True)
  214.                 PositionEntity rlpiv,EntityX(rpiv,True),EntityY(rpiv,True),EntityZ(rpiv,True)
  215.         Next
  216. End Function
  217.  
  218. ;only used in debug
  219. Function HideRegions()
  220.         For r.reg=Each reg
  221.                 HideEntity rdebugent
  222.         Next
  223. End Function
  224.  
  225. Function ShowRegions()
  226.         For r.reg=Each reg
  227.                 ShowEntity rdebugent
  228.         Next
  229. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal