home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / SpotLight31863223102005.psc / SpotLight3D / Common.bas next >
BASIC Source File  |  2005-03-09  |  5KB  |  193 lines

  1. Attribute VB_Name = "BasMaths"
  2. Option Explicit
  3.  
  4. Public Const Pi = 3.141549265
  5. Public Const Deg = (Pi / 180)
  6.  
  7. Public Declare Function Polygon Lib "Gdi32.dll" (ByVal hDC As Long, lpPoint As Point2D, ByVal nCount As Long) As Long
  8.  
  9. Public Type Point2D
  10.  X As Long
  11.  Y As Long
  12. End Type
  13.  
  14. Public Type Vector
  15.  X As Single
  16.  Y As Single
  17.  Z As Single
  18. End Type
  19.  
  20. Public Type ColRGB
  21.  R As Integer
  22.  G As Integer
  23.  B As Integer
  24. End Type
  25.  
  26. '############################
  27.  
  28. Public Type Face
  29.  A As Integer
  30.  B As Integer
  31.  C As Integer
  32.  Normal As Vector
  33.  Center As Vector
  34.  Col As ColRGB
  35.  TCol As ColRGB
  36.  Visible As Boolean
  37. End Type
  38.  
  39. Public Type SpotLight3D
  40.  Origin As Vector
  41.  Direction As Vector
  42.  Color As ColRGB
  43.  Falloff As Single
  44.  Hotspot As Single
  45.  BrightRange As Single
  46.  DarkRange As Single
  47.  Enabled As Boolean
  48. End Type
  49. Function ColorInterpolate(A As ColRGB, B As ColRGB, Alpha As Single) As ColRGB
  50.  ColorInterpolate.R = A.R + Alpha * (B.R - A.R)
  51.  ColorInterpolate.G = A.G + Alpha * (B.G - A.G)
  52.  ColorInterpolate.B = A.B + Alpha * (B.B - A.B)
  53. End Function
  54. Function ColorAdd(A As ColRGB, B As ColRGB) As ColRGB
  55.  ColorAdd.R = A.R + B.R
  56.  ColorAdd.G = A.G + B.G
  57.  ColorAdd.B = A.B + B.B
  58. End Function
  59. Function ColorScale(A As ColRGB, B As Single) As ColRGB
  60.  ColorScale.R = A.R * B
  61.  ColorScale.G = A.G * B
  62.  ColorScale.B = A.B * B
  63. End Function
  64. Function CrossProduct(V1 As Vector, V2 As Vector) As Vector
  65.  
  66.  CrossProduct.X = (V1.Y * V2.Z) - (V1.Z * V2.Y)
  67.  CrossProduct.Y = (V1.Z * V2.X) - (V1.X * V2.Z)
  68.  CrossProduct.Z = (V1.X * V2.Y) - (V1.Y * V2.X)
  69.  
  70. End Function
  71. Function DotProduct(V1 As Vector, V2 As Vector) As Single
  72.  
  73.  DotProduct = (V1.X * V2.X) + (V1.Y * V2.Y) + (V1.Z * V2.Z)
  74.  
  75. End Function
  76. Function GetCenter(V1 As Vector, V2 As Vector, V3 As Vector) As Vector
  77.  
  78.  GetCenter.X = (V1.X + V2.X + V3.X) / 3
  79.  GetCenter.Y = (V1.Y + V2.Y + V3.Y) / 3
  80.  GetCenter.Z = (V1.Z + V2.Z + V3.Z) / 3
  81.  
  82. End Function
  83. Function GetNormal(V1 As Vector, V2 As Vector, V3 As Vector) As Vector
  84.  
  85.  GetNormal = CrossProduct(VectorSubtract(V1, V2), VectorSubtract(V3, V2))
  86.  
  87. End Function
  88. Function Normalize(V As Vector) As Vector
  89.  
  90.  Dim L As Single
  91.  
  92.  L = VectorLength(V)
  93.  
  94.  If L <> 0 Then
  95.   Normalize.X = (V.X / L)
  96.   Normalize.Y = (V.Y / L)
  97.   Normalize.Z = (V.Z / L)
  98.  End If
  99.  
  100. End Function
  101. Function Rotate(SrcVec As Vector, Axis As Byte, Angle As Single) As Vector
  102.  
  103.  Select Case Axis
  104.   Case 0:
  105.    Rotate.X = SrcVec.X
  106.    Rotate.Y = (Cos(Angle) * SrcVec.Y) - (Sin(Angle) * SrcVec.Z)
  107.    Rotate.Z = (Sin(Angle) * SrcVec.Y) + (Cos(Angle) * SrcVec.Z)
  108.   Case 1:
  109.    Rotate.X = (Cos(Angle) * SrcVec.X) + (Sin(Angle) * SrcVec.Z)
  110.    Rotate.Y = SrcVec.Y
  111.    Rotate.Z = -(Sin(Angle) * SrcVec.X) + (Cos(Angle) * SrcVec.Z)
  112.   Case 2:
  113.    Rotate.X = (Cos(Angle) * SrcVec.X) - (Sin(Angle) * SrcVec.Y)
  114.    Rotate.Y = (Sin(Angle) * SrcVec.X) + (Cos(Angle) * SrcVec.Y)
  115.    Rotate.Z = SrcVec.Z
  116.  End Select
  117.  
  118. End Function
  119. Function VectorAdd(VecA As Vector, VecB As Vector) As Vector
  120.  
  121.  VectorAdd.X = VecA.X + VecB.X
  122.  VectorAdd.Y = VecA.Y + VecB.Y
  123.  VectorAdd.Z = VecA.Z + VecB.Z
  124.  
  125. End Function
  126. Function VectorAngle(VecA As Vector, VecB As Vector) As Single
  127.  
  128.  If VectorCompare(VecA, VectorNull) = False And VectorCompare(VecB, VectorNull) = False Then
  129.   VectorAngle = DotProduct(Normalize(VecA), Normalize(VecB))
  130.  End If
  131.  
  132. End Function
  133. Function VectorCompare(VecA As Vector, VecB As Vector) As Boolean
  134.  
  135.  If VecA.X = VecB.X And VecA.Y = VecB.Y And VecA.Z = VecB.Z Then VectorCompare = True
  136.  
  137. End Function
  138. Function VectorDistance(VecA As Vector, VecB As Vector) As Single
  139.  
  140.  VectorDistance = VectorLength(VectorSubtract(VecB, VecA))
  141.  
  142. End Function
  143. Function VectorGetXPitch(V1 As Vector, V2 As Vector) As Single
  144.  
  145.  If VectorCompare(V1, VectorNull) = False And VectorCompare(V2, VectorNull) = False Then
  146.   VectorGetXPitch = VectorAngle(VectorInput(V1.X, 0, V1.Z), VectorInput(V2.X, 0, V2.Z))
  147.  End If
  148.  
  149. End Function
  150. Function VectorGetYYaw(V1 As Vector, V2 As Vector) As Single
  151.  
  152.  If VectorCompare(V1, VectorNull) = False And VectorCompare(V2, VectorNull) = False Then
  153.   VectorGetYYaw = VectorAngle(VectorInput(0, V1.Y, V1.Z), VectorInput(0, V2.Y, V2.Z))
  154.  End If
  155.  
  156. End Function
  157. Function VectorInput(X!, Y!, Z!) As Vector
  158.  
  159.  VectorInput.X = X
  160.  VectorInput.Y = Y
  161.  VectorInput.Z = Z
  162.  
  163. End Function
  164. Function VectorLength(V As Vector) As Single
  165.  
  166.  VectorLength = Sqr((V.X * V.X) + (V.Y * V.Y) + (V.Z * V.Z))
  167.  
  168. End Function
  169. Function VectorNull() As Vector
  170.  
  171. End Function
  172. Function VectorReflect(VecA As Vector, VecB As Vector) As Vector
  173.  
  174.  If VectorAngle(VecA, VecB) < 0 Then
  175.   VectorReflect = VectorAdd(VecA, VectorScale(VectorScale(Normalize(VecB), DotProduct(VecA, Normalize(VecB))), -2))
  176.  End If
  177.  
  178. End Function
  179. Function VectorScale(Vec As Vector, S As Single) As Vector
  180.  
  181.  VectorScale.X = Vec.X * S
  182.  VectorScale.Y = Vec.Y * S
  183.  VectorScale.Z = Vec.Z * S
  184.  
  185. End Function
  186. Function VectorSubtract(V1 As Vector, V2 As Vector) As Vector
  187.  
  188.  VectorSubtract.X = V1.X - V2.X
  189.  VectorSubtract.Y = V1.Y - V2.Y
  190.  VectorSubtract.Z = V1.Z - V2.Z
  191.  
  192. End Function
  193.