Deprecated: Function split() is deprecated in /home/wiki/public_html/inc/common.php on line 533

Warning: Cannot modify header information - headers already sent by (output started at /home/wiki/public_html/inc/common.php:533) in /home/wiki/public_html/inc/actions.php on line 71
wiki:ggolemgprjmathy [TV3DWiki]
 
Option Explicit
Public Type FPS_Counter
    Tick                                      As Long
    ElapsedTicks                              As Long
    LastTick                                  As Long
    TickCounter                               As Long
    FrameCounter                              As Long
End Type
Public Type CColor
    R                                         As Single
    G                                         As Single
    B                                         As Single
    A                                         As Single
End Type
Public Type B2E_Pos
    B2E_Start                                 As D3DVECTOR
    B2E_Current                               As D3DVECTOR
    B2E_End                                   As D3DVECTOR
End Type
Public Type B2E_Rot
    B2E_Start                                 As D3DVECTOR
    B2E_Current                               As D3DVECTOR
    B2E_End                                   As D3DVECTOR
End Type
Public Type B2E_Scale
    B2E_Start                                 As D3DVECTOR
    B2E_Current                               As D3DVECTOR
    B2E_End                                   As D3DVECTOR
End Type
Public Type B2E_Sheer
    B2E_Start                                 As D3DVECTOR
    B2E_Current                               As D3DVECTOR
    B2E_End                                   As D3DVECTOR
End Type
Public Type VecB2E
    Pos                                       As B2E_Pos
    Rot                                       As B2E_Rot
    Scale                                     As B2E_Scale
    Sheer                                     As B2E_Sheer
End Type
Public Type D3DMATRIX3
    m11                                       As Single
    m12                                       As Single
    m13                                       As Single
    m21                                       As Single
    m22                                       As Single
    m23                                       As Single
    m31                                       As Single
    m32                                       As Single
    m33                                       As Single
End Type
Public Type Vector2D
    x                                         As Single
    y                                         As Single
End Type
Public Enum OutputType
    RECT = 0
    Polar = 1
End Enum
#If False Then
Private RECT, Polar
#End If
 
Public Type Complex
    Real                                      As Double
    Imag                                      As Double
End Type
Public Type POINT
    x                                         As Single
    y                                         As Single
End Type
Public Type Basic_Player
    Acceleration                              As Single
    RotationRate                              As Single
    BoundingRadius                            As Single
    Facing                                    As Single
    Heading                                   As Single
    Speed                                     As Single
    Pos                                       As D3DVECTOR
    Rot                                       As D3DVECTOR
End Type
Private Const mPI                         As Single = 3.14159265358979
Private Const Inv_PI                      As Single = 0.318309886183791
Private Const g_90d                       As Single = 1.5707963267949
Private Const g_180d                      As Single = 3.14159265358979
Private Const g_270d                      As Single = 4.71238898038469
Private Const g_360d                      As Single = 6.28318530717959
Private Const mRadiant                    As Single = 1.74532925199433E-02
Private Const DegToRad                    As Single = 1.74532925199433E-02
Private Const RadToDeg                    As Single = 57.2957795130823
Private Const mHugeSingle                 As Single = 1E+38
Private Const mEPSILON                    As Single = 0.00001
Private Const EARTHS_GRAVITY              As Double = 9.80665
Private Const FI_POSITIVE_INFINITY_32     As Long = &H807F0000
Private Const FI_NEGATIVE_INFINITY_32     As Long = &H80FF0000
Private Const FI_POSITIVE_NOTANUMB_32     As Long = &H7FFFFFFF
Private Const FI_NEGATIVE_NOTANUMB_32     As Long = &HFFFFFFFF
Private Const ThreePiByTwo                As Single = 4.71238898038469
Private Const TwoPi                       As Single = 6.2831853071795
Private m_fPositiveInfinity               As Single
Private m_fNegativeInfinity               As Single
Private m_fPositiveNotANumber             As Single
Private m_fNegativeNotANumber             As Single
Private m_bCalculatedValues               As Boolean
Private CosTable(1025)                    As Long
Private SinTable(1025)                    As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
                                                                     Source As Any, _
                                                                     ByVal Length As Long)
 
Private Declare Function GetTickCount Lib "kernel32" () As Long
 
Public Sub AddVectors(ByVal sngMag1 As Single, _
                      ByVal sngDir1 As Single, _
                      ByVal sngMag2 As Single, _
                      ByVal sngDir2 As Single, _
                      Optional ByRef sngMagResult As Single, _
                      Optional ByRef sngDirResult As Single)
 
  Dim sngXComp As Single
  Dim sngYComp As Single
 
    sngXComp = sngMag1 * Sin(sngDir1) + sngMag2 * Sin(sngDir2)
    sngYComp = sngMag1 * Cos(sngDir1) + sngMag2 * Cos(sngDir2)
    sngMagResult = Sqr(sngXComp ^ 2 + sngYComp ^ 2)
    If Sgn(sngYComp) > 0 Then
        sngDirResult = Atn(sngXComp / sngYComp)
    End If
    If Sgn(sngYComp) < 0 Then
        sngDirResult = Atn(sngXComp / sngYComp) + Pi
    End If
 
End Sub
 
Private Sub Centripetal_Force(GRAVITY As Single, _
                              ByVal FRICTION As Single, _
                              msngXCoord As Single, _
                              msngYCoord As Single, _
                              msngSpeed As Single, _
                              msngDirection As Single, _
                              ByVal LOOP_RADIUS As Single, _
                              ByVal Object_Radius As Single)
 
  Dim sngMagNormal      As Single
  Dim sngDirNormal      As Single
  Dim sngMagFriction    As Single
  Dim sngDirFriction    As Single
  Dim sngMagCentripetal As Single
  Dim sngDirCentripetal As Single
  Dim sngMagTemp        As Single
  Dim sngDirTemp        As Single
  Dim sngAngle          As Single
 
    If (msngXCoord + msngSpeed * Sin(msngDirection)) ^ 2 + (msngYCoord - msngSpeed * Cos(msngDirection)) ^ 2 > (LOOP_RADIUS - Object_Radius) ^ 2 Then
        sngMagCentripetal = msngSpeed ^ 2 / (LOOP_RADIUS - Object_Radius)
        sngDirCentripetal = FindAngle(msngXCoord, -msngYCoord)
        AddVectors sngMagCentripetal, sngDirCentripetal, GRAVITY, Pi, sngMagNormal, sngDirNormal
        sngMagNormal = sngMagNormal * Cos(sngDirNormal - FindAngle(msngXCoord, -msngYCoord))
        If sngMagNormal < 0 Then
            sngMagNormal = 0
        End If
        sngDirNormal = FindAngle(msngXCoord, -msngYCoord) + Pi
        sngMagFriction = sngMagNormal * FRICTION
        sngDirFriction = msngDirection + Pi
    End If
    AddVectors sngMagNormal, sngDirNormal, sngMagFriction, sngDirFriction, sngMagTemp, sngDirTemp
    AddVectors sngMagTemp, sngDirTemp, GRAVITY, Pi, sngMagTemp, sngDirTemp
    AddVectors sngMagTemp, sngDirTemp, msngSpeed, msngDirection, msngSpeed, msngDirection
    msngXCoord = msngXCoord + msngSpeed * Sin(msngDirection)
    msngYCoord = msngYCoord - msngSpeed * Cos(msngDirection)
    If msngXCoord ^ 2 + msngYCoord ^ 2 > (LOOP_RADIUS - Object_Radius) ^ 2 Then
        sngAngle = FindAngle(msngXCoord, msngYCoord)
        msngXCoord = (LOOP_RADIUS - Object_Radius) * Sin(sngAngle)
        msngYCoord = (LOOP_RADIUS - Object_Radius) * Cos(sngAngle)
    End If
 
End Sub
 
Public Function Color4(ByVal Red As Single, _
                       ByVal Green As Single, _
                       ByVal Blue As Single, _
                       ByVal Alpha As Single) As D3DCOLORVALUE
 
  Dim Color As D3DCOLORVALUE
 
    With Color
        .R = Red
        .G = Green
        .B = Blue
        .A = Alpha
    End With
    Color4 = Color
 
End Function
 
Public Function Complex_Abs(n1 As Complex) As Double
 
    Complex_Abs = Sqr(n1.Real ^ 2 + n1.Imag ^ 2)
 
End Function
 
Public Function Complex_conj(ByRef n1 As Complex) As Complex
 
    Complex_conj.Real = n1.Real
    Complex_conj.Imag = -n1.Imag
 
End Function
 
Public Function Complex_MakeComplex(ByVal NReal As Double, _
                                    Optional ByVal NImag As Double = 0) As Complex
 
    Complex_MakeComplex.Real = NReal
    Complex_MakeComplex.Imag = NImag
 
End Function
 
Public Function Complex_mult(ByRef n1 As Complex, _
                             ByRef N2 As Complex) As Complex
 
    Complex_mult.Real = n1.Real * N2.Real - n1.Imag * N2.Imag
    Complex_mult.Imag = n1.Real * N2.Imag + N2.Real * n1.Imag
 
End Function
 
Private Sub Daniel_CalculateValues()
 
  Dim l_lTemp As Long
 
    If Not m_bCalculatedValues Then
        l_lTemp = FI_POSITIVE_INFINITY_32
        CopyMemory m_fPositiveInfinity, l_lTemp, 4&
        l_lTemp = FI_NEGATIVE_INFINITY_32
        CopyMemory m_fNegativeInfinity, l_lTemp, 4&
        l_lTemp = FI_POSITIVE_NOTANUMB_32
        CopyMemory m_fPositiveNotANumber, l_lTemp, 4&
        l_lTemp = FI_NEGATIVE_NOTANUMB_32
        CopyMemory m_fNegativeNotANumber, l_lTemp, 4&
        m_bCalculatedValues = True
    End If
 
End Sub
 
Public Function Degrees_To_Radian(Degrees As Double) As Double
 
    Degrees_To_Radian = ((Degrees * Pi) / 180)
 
End Function
 
 
Private Function FindAngle(ByRef sngX As Single, _
                           ByRef sngY) As Single
 
    If Sgn(sngY) > 0 Then
        FindAngle = Atn(sngX / sngY)
    End If
    If Sgn(sngY) < 0 Then
        FindAngle = Atn(sngX / sngY) + Pi
    End If
    If sngY = 0 Then
        If Sgn(sngX) < 0 Then
            FindAngle = 3 * Pi / 2
        End If
    End If
    If sngY = 0 Then
        If Sgn(sngX) > 0 Then
            FindAngle = Pi / 2
        End If
    End If
 
End Function
 
Public Sub Fix_Prossesor_Float_Error()
 
  Dim Pro1 As Single
  Dim Pro2 As Single
 
    On Local Error GoTo FixIt
    Pro1 = 1#
    Pro1 = Pro1 / Pro2
FixIt:
    Pro1 = 0
 
End Sub
 
Public Function High_Precision_Cosine(Deg_Arg) As String
 
  Dim x     As Variant
  Dim FactX As Variant
  Dim Term  As Variant
  Dim S     As Variant
  Dim i     As Variant
  Dim Pi    As Variant
  Dim ET    As Variant
 
    On Error GoTo ERROR_HANDLER
    i = -1
    Pi = CDec("3.14159265358979323846264338327950288")
    ET = 1E-29
    x = Trim$(Deg_Arg)
    If LenB(x) = 0 Or x = "-" Then
        High_Precision_Cosine = ""
        Exit Function
    End If
    If Not IsNumeric(x) Then
        High_Precision_Cosine = ""
        Exit Function
    End If
    x = CDec(x)
    x = Abs(x)
    If x >= 360 Then
        x = x - 360
    End If
    If x = 0 Then
        High_Precision_Cosine = 1
        Exit Function
    End If
    If x = 90 Or x = 270 Then
        High_Precision_Cosine = 0
        Exit Function
    End If
    If x = 180 Then
        High_Precision_Cosine = -1
        Exit Function
    End If
    x = x * Pi / 180
    FactX = CDec(2)
    Term = CDec(1)
    S = 1
    Do While Abs(Term) > ET
        Term = Term * x / FactX * x / (FactX - 1)
        S = S + Term * i
        FactX = FactX + 2
        i = -i
    Loop
    High_Precision_Cosine = S
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_Cosine = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Function High_Precision_ExpF(X_Arg) As String
 
  Dim ExpF    As String
 
  Dim x       As Variant
  Dim FactX   As Variant
  Dim Term    As Variant
  Dim PwrX     As Variant
 
  Dim S       As Variant
  Dim NegFlag As Boolean
  Dim ET      As Variant
 
    On Error GoTo ERROR_HANDLER
 
    ET = 1E-29
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        ExpF = ""
        Exit Function
    End If
    If Abs(x) > CDec("65.37052415368304665919611913") Then
        High_Precision_ExpF = ""
        Exit Function
    End If
    NegFlag = x < 0
    x = CDec(x)
    x = Abs(x)
    FactX = CDec(1)
    Term = CDec(1)
    S = CDec(0)
    Do While Term > ET
        Term = Term * x / FactX
        S = S + Term
        FactX = FactX + 1
    Loop
    S = 1 + S
    If NegFlag Then
        High_Precision_ExpF = 1 / S
      Else
        High_Precision_ExpF = S
    End If
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_ExpF = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Function High_Precision_Ln(X_Arg) As String
 
  Dim x       As Variant
  Dim W       As Variant
  Dim Ip      As Variant
  Dim Dp      As Variant
 
  Dim LowFlag As Boolean
  Dim V       As Variant
 
    On Error GoTo ERROR_HANDLER
    V = CDec("2.30258509299404568401799145468")
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        High_Precision_Ln = ""
        Exit Function
    End If
    If Not IsNumeric(x) Then
        High_Precision_Ln = ""
        Exit Function
    End If
    x = CDec(x)
    If x > 0 Then
        If x < 1 Then
            LowFlag = True
            x = 1 / x
        End If
    End If
    Ip = 0
    If x >= 10 Then
        If Right$(x, 1) = "." Then
            x = x & "0"
        End If
        W = InStr(x, ".")
 
        If W = 0 Then
            x = x & ".0"
        End If
        W = InStr(x, ".")
        Ip = Left$(x, W - 1)
        Dp = Mid$(x, W + 1, Len(x))
        x = Left$(Ip, 1) & "." & Mid$(Ip, 2, Len(Ip)) & Dp
        Ip = CDec(Len(Ip)) - 1
    End If
    W = High_Precision_LogE(x)
    If LenB(W) = 0 Then
        High_Precision_Ln = ""
        Exit Function
    End If
    W = Ip * V + W
    If LowFlag Then
        W = -W
    End If
    High_Precision_Ln = W
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_Ln = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Function High_Precision_LogE(X_Arg) As String
 
  Dim x        As Variant
  Dim FactX    As Variant
  Dim Term     As Variant
  Dim PwrX     As Variant
  Dim S        As Variant
  Dim W        As Variant
  Dim FracFlag As Boolean
 
  Dim ET       As Variant
 
    On Error GoTo ERROR_HANDLER
 
    ET = 1E-29
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
        High_Precision_LogE = ""
        Exit Function
    End If
    If Not IsNumeric(x) Then
        High_Precision_LogE = ""
        Exit Function
    End If
    x = CDec(x)
    If x <= 0 Then
        High_Precision_LogE = ""
        Exit Function
    End If
    If x = 1 Then
        High_Precision_LogE = 0
        Exit Function
    End If
    If x < 1 Then
        FracFlag = True
        x = 1 / x
      Else
        FracFlag = False
    End If
    FactX = CDec(1)
    Term = CDec(1)
    PwrX = CDec(1)
    S = CDec(0)
    W = (x - 1) / x
    Do While Abs(Term) > ET
        Term = PwrX * W / FactX
        S = S + Term
        PwrX = PwrX * W
        FactX = FactX + 1
    Loop
    If FracFlag Then
        S = -S
    End If
    High_Precision_LogE = S
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_LogE = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Function High_Precision_Sine(Deg_Arg) As String
 
  Dim x       As Variant
  Dim FactX   As Variant
  Dim Term    As Variant
  Dim S       As Variant
  Dim NegFlag As Boolean
  Dim i       As Variant
  Dim Pi      As Variant
  Dim ET      As Variant
 
    On Error GoTo ERROR_HANDLER
    i = -1
    Pi = CDec("3.14159265358979323846264338327950288")
    ET = 1E-29
    x = Trim$(Deg_Arg)
    If LenB(x) = 0 Or x = "-" Then
        High_Precision_Sine = ""
        Exit Function
    End If
    If Not IsNumeric(x) Then
        High_Precision_Sine = ""
        Exit Function
    End If
    x = CDec(x)
    NegFlag = x < 0
    x = Abs(x)
    If x >= 360 Then
        x = x - 360
    End If
    If x = 0 Then
        High_Precision_Sine = 0
        Exit Function
    End If
    If x = 90 Then
        High_Precision_Sine = 1
        Exit Function
    End If
    If x = 180 Then
        High_Precision_Sine = 0
        Exit Function
    End If
    If x = 270 Then
        High_Precision_Sine = -1
        Exit Function
    End If
    x = x * Pi / 180
    FactX = CDec(3)
    Term = CDec(x)
    S = x
    Do While Abs(Term) > ET
        Term = Term * x / FactX * x / (FactX - 1)
        S = S + Term * i
        FactX = FactX + 2
        i = -i
    Loop
    If NegFlag Then
        S = -S
    End If
    High_Precision_Sine = S
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_Sine = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Function High_Precision_Square_Root(X_Arg) As String
 
  Dim x As Variant
  Dim A As Variant
  Dim B As Variant
  Dim k As Long
 
    On Error GoTo ERROR_HANDLER
    k = 0
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Square_Root = ""
        Exit Function
    End If
    x = CDec(x)
    If x = 0 Then
        High_Precision_Square_Root = 0
        Exit Function
    End If
    If x < 0 Then
        High_Precision_Square_Root = ""
        Exit Function
    End If
    A = Sqr(x)
    A = CDec(A)
    B = CDec(1)
ITERATE:
    B = (A + x / A) / 2
    If (B = A) Or (k >= 20) Then
        High_Precision_Square_Root = B
        Exit Function
    End If
    A = B
    k = k + 1
    GoTo ITERATE
 
Exit Function
 
ERROR_HANDLER:
    High_Precision_Square_Root = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
End Function
 
Public Sub Long_To_RGB(ByVal LongCol As Long, _
                       R As Single, _
                       G As Single, _
                       B As Single)
 
    R = LongCol And 255
    G = (LongCol And 65280) \ 256&
    B = (LongCol And 16711680) \ 65535
 
End Sub
 
Public Sub MakeCosTable()
 
  Dim CntVal As Long
  Dim CntAng As Single
  Dim IncDeg As Single
 
    IncDeg = 2 * Pi / NumSinVal
    CntAng = IncDeg
    CntVal = 0
    Do Until CntVal > 1024
        CosTable(CntVal) = CInt((255 * Cos(CntAng)))
        CntAng = CntAng + IncDeg
        CntVal = CntVal + 1
    Loop
 
End Sub
 
Public Sub MakeSinTable()
 
  Dim CntVal As Long
  Dim CntAng As Single
  Dim IncDeg As Single
 
    IncDeg = 2 * Pi / NumSinVal
    CntAng = IncDeg
    CntVal = 0
    Do Until CntVal > 1024
        SinTable(CntVal) = CInt((255 * Sin(CntAng)))
        CntAng = CntAng + IncDeg
        CntVal = CntVal + 1
    Loop
 
End Sub
 
Public Sub Matrix_Copy(Destination_Matrix As D3DMATRIX, _
                       Source_Matrix As D3DMATRIX)
 
    With Destination_Matrix
        .m11 = Source_Matrix.m11
        .m12 = Source_Matrix.m12
        .m13 = Source_Matrix.m13
        .m14 = Source_Matrix.m14
        .m21 = Source_Matrix.m21
        .m22 = Source_Matrix.m22
        .m23 = Source_Matrix.m23
        .m24 = Source_Matrix.m24
        .m31 = Source_Matrix.m31
        .m32 = Source_Matrix.m32
        .m33 = Source_Matrix.m33
        .m34 = Source_Matrix.m34
        .m41 = Source_Matrix.m41
        .m42 = Source_Matrix.m42
        .m43 = Source_Matrix.m43
        .m44 = Source_Matrix.m44
    End With
 
End Sub
 
Public Sub Matrix_Identity(Matrix As D3DMATRIX)
 
    With Matrix
        .m11 = 1
        .m12 = 0
        .m13 = 0
        .m14 = 0
        .m21 = 0
        .m22 = 1
        .m23 = 0
        .m24 = 0
        .m31 = 0
        .m32 = 0
        .m33 = 1
        .m34 = 0
        .m41 = 0
        .m42 = 0
        .m43 = 0
        .m44 = 1
    End With
 
End Sub
 
Public Sub Matrix_Quaternion(Quaternion As D3DQUATERNION, _
                             Matrix As D3DMATRIX)
 
    With Matrix
        .m11 = 1 - 2 * Quaternion.y * Quaternion.y - 2 * Quaternion.Z * Quaternion.Z
        .m12 = 2 * Quaternion.x * Quaternion.y + 2 * Quaternion.W * Quaternion.Z
        .m13 = 2 * Quaternion.x * Quaternion.Z - 2 * Quaternion.W * Quaternion.y
        .m21 = 2 * Quaternion.x * Quaternion.y - 2 * Quaternion.W * Quaternion.Z
        .m22 = 1# - 2# * Quaternion.x * Quaternion.x - 2# * Quaternion.Z * Quaternion.Z
        .m23 = 2# * Quaternion.y * Quaternion.Z + 2# * Quaternion.W * Quaternion.x
        .m31 = 2# * Quaternion.x * Quaternion.Z + 2# * Quaternion.W * Quaternion.y
        .m32 = 2# * Quaternion.y * Quaternion.Z - 2# * Quaternion.W * Quaternion.x
        .m33 = 1# - 2# * Quaternion.x * Quaternion.x - 2# * Quaternion.y * Quaternion.y
    End With
 
End Sub
 
Public Sub Matrix_Zero(Matrix As D3DMATRIX)
 
    With Matrix
        .m11 = 0
        .m12 = 0
        .m13 = 0
        .m14 = 0
        .m21 = 0
        .m22 = 0
        .m23 = 0
        .m24 = 0
        .m31 = 0
        .m32 = 0
        .m33 = 0
        .m34 = 0
        .m41 = 0
        .m42 = 0
        .m43 = 0
        .m44 = 0
    End With
 
End Sub
 
Private Sub Physics_Orbit(ByVal msngObjX As Single, _
                          ByVal msngObjY As Single, _
                          ByVal msngSpeed As Single, _
                          ByVal msngHeading As Single, _
                          Optional ByVal ORBIT_PLN_X As Single = 200, _
                          Optional ByVal ORBIT_PLN_Y As Single = 200, _
                          Optional ByVal ORBIT_GRAVITY As Single = 1000)
 
  Dim sngXComp   As Single
  Dim sngYComp   As Single
  Dim sngPlnX    As Single
  Dim sngPlnY    As Single
  Dim sngDist    As Single
  Dim sngGravDir As Single
 
    sngPlnX = ORBIT_PLN_X - msngObjX
    sngPlnY = msngObjY - ORBIT_PLN_Y
    sngDist = Sqr(sngPlnX ^ 2 + sngPlnY ^ 2)
 
    If sngPlnY > 0 Then
        sngGravDir = Atn(sngPlnX / sngPlnY)
    End If
    If sngPlnY < 0 Then
        sngGravDir = Atn(sngPlnX / sngPlnY) + Pi
    End If
 
    sngXComp = msngSpeed * Sin(msngHeading) + (ORBIT_GRAVITY / (sngDist ^ 2)) * Sin(sngGravDir)
    sngYComp = msngSpeed * Cos(msngHeading) + (ORBIT_GRAVITY / (sngDist ^ 2)) * Cos(sngGravDir)
 
    msngSpeed = Sqr(sngXComp ^ 2 + sngYComp ^ 2)
 
    If sngYComp > 0 Then
        msngHeading = Atn(sngXComp / sngYComp)
    End If
    If sngYComp < 0 Then
        msngHeading = Atn(sngXComp / sngYComp) + Pi
    End If
 
End Sub
 
Public Function Pi() As Single
 
    Pi = 3.14159265358979
 
End Function
 
Public Function Plane(ByVal A As Single, _
                      ByVal B As Single, _
                      ByVal C As Single, _
                      ByVal D As Single) As D3DPLANE
 
    With Plane
        .A = A
        .B = B
        .C = C
        .D = D
    End With
 
End Function
 
Public Function Quaternion(ByVal x As Single, _
                           ByVal y As Single, _
                           ByVal Z As Single, _
                           ByVal W As Single) As D3DQUATERNION
 
    With Quaternion
        .x = x
        .y = y
        .Z = Z
        .W = W
    End With
 
End Function
 
Public Function Quaternion_Length(Quaternion As D3DQUATERNION) As Single
 
    Quaternion_Length = D3DXQuaternionLength(Quaternion)
 
End Function
 
Public Function Vector2(ByVal x As Single, _
                        ByVal y As Single) As D3DVECTOR2
 
    Vector2.x = x
    Vector2.y = y
 
End Function
 
Public Function Vector2_Add(Vector1 As D3DVECTOR2, _
                            Vector2 As D3DVECTOR2) As D3DVECTOR2
 
    Vector2_Add.x = Vector1.x + Vector2.x
    Vector2_Add.y = Vector1.y + Vector2.y
 
End Function
 
Public Sub Vector2_Add_And_Scale(Destination_Vector As D3DVECTOR2, _
                                 Vector1 As D3DVECTOR2, _
                                 ByVal Scale_Amount1 As Single, _
                                 Vector2 As D3DVECTOR2, _
                                 ByVal Scale_Amount2 As Single)
 
    Destination_Vector.x = Scale_Amount1 * Vector1.x + Scale_Amount2 * Vector2.x
    Destination_Vector.y = Scale_Amount1 * Vector1.y + Scale_Amount2 * Vector2.y
 
End Sub
 
Public Sub Vector2_Copy(Destination_Vector As D3DVECTOR2, _
                        Source_Vector As D3DVECTOR2)
 
    Destination_Vector.x = Source_Vector.x
    Destination_Vector.y = Source_Vector.y
 
End Sub
 
Public Function Vector2_Dot_Product(Vector1 As D3DVECTOR2, _
                                    Vector2 As D3DVECTOR2) As Single
 
    Vector2_Dot_Product = Vector1.x * Vector2.x + Vector1.y * Vector2.y
 
End Function
 
Public Function Vector2_Length(Vector As D3DVECTOR2) As Single
 
    Vector2_Length = D3DXVec2Length(Vector)
 
End Function
 
Public Sub Vector2_Negative(Vector As D3DVECTOR2)
 
    Vector.x = -Vector.x
    Vector.y = -Vector.y
 
End Sub
 
Public Sub Vector2_Normalize(Vector As D3DVECTOR2)
 
  Dim Value As Double
 
    Value = Vector.x * Vector.x + Vector.y * Vector.y
    Value = Sqr(Value)
    If Value = 0 Then
        Vector.x = 0
        Vector.y = 0
        Exit Sub
    End If
    Vector.x = Vector.x / Value
    Vector.y = Vector.y / Value
 
End Sub
 
Public Sub Vector2_Scale(Destination_Vector As D3DVECTOR2, _
                         Source_Vector As D3DVECTOR2, _
                         ByVal Scale_Amount As Single)
 
    Destination_Vector.x = Source_Vector.x * Scale_Amount
    Destination_Vector.y = Source_Vector.y * Scale_Amount
 
End Sub
 
Public Function Vector2_Subtract(Vector1 As D3DVECTOR2, _
                                 Vector2 As D3DVECTOR2) As D3DVECTOR2
 
    Vector2_Subtract.x = Vector1.x - Vector2.x
    Vector2_Subtract.y = Vector1.y - Vector2.y
 
End Function
 
Public Sub Vector2_Subtract_And_Scale(Destination_Vector As D3DVECTOR2, _
                                      Vector1 As D3DVECTOR2, _
                                      ByVal Scale_Amount1 As Single, _
                                      Vector2 As D3DVECTOR2, _
                                      ByVal Scale_Amount2 As Single)
 
    Destination_Vector.x = Scale_Amount1 * Vector1.x - Scale_Amount2 * Vector2.x
    Destination_Vector.y = Scale_Amount1 * Vector1.y - Scale_Amount2 * Vector2.y
 
End Sub
 
Public Function Vector3(ByVal x As Single, _
                        ByVal y As Single, _
                        ByVal Z As Single) As D3DVECTOR
 
    With Vector3
        .x = x
        .y = y
        .Z = Z
    End With
 
End Function
 
Public Function Vector3_Add(Vector1 As D3DVECTOR, _
                            Vector2 As D3DVECTOR) As D3DVECTOR
 
    With Vector3_Add
        .x = Vector1.x + Vector2.x
        .y = Vector1.y + Vector2.y
        .Z = Vector1.Z + Vector2.Z
    End With
 
End Function
 
Public Sub Vector3_Add_And_Scale(Destination_Vector As D3DVECTOR, _
                                 Vector1 As D3DVECTOR, _
                                 ByVal Scale_Amount1 As Single, _
                                 Vector2 As D3DVECTOR, _
                                 ByVal Scale_Amount2 As Single)
 
    With Destination_Vector
        .x = Scale_Amount1 * Vector1.x + Scale_Amount2 * Vector2.x
        .y = Scale_Amount1 * Vector1.y + Scale_Amount2 * Vector2.y
        .Z = Scale_Amount1 * Vector1.Z + Scale_Amount2 * Vector2.Z
    End With
 
End Sub
 
Public Sub Vector3_Copy(Destination_Vector As D3DVECTOR, _
                        Source_Vector As D3DVECTOR)
 
    With Destination_Vector
        .x = Source_Vector.x
        .y = Source_Vector.y
        .Z = Source_Vector.Z
    End With
 
End Sub
 
Public Sub Vector3_Cross_Product(Destination_Vector As D3DVECTOR, _
                                 Vector1 As D3DVECTOR, _
                                 Vector2 As D3DVECTOR)
 
    With Destination_Vector
        .x = Vector1.y * Vector2.Z - Vector1.Z * Vector2.y
        .y = Vector1.Z * Vector2.x - Vector1.x * Vector2.Z
        .Z = Vector1.x * Vector2.y - Vector1.y * Vector2.x
    End With
 
End Sub
 
Public Function Vector3_Dot_Product(Vector1 As D3DVECTOR, _
                                    Vector2 As D3DVECTOR) As Single
 
    Vector3_Dot_Product = Vector1.x * Vector2.x + Vector1.y * Vector2.y + Vector1.Z * Vector2.Z
 
End Function
 
Public Function Vector3_Length(Vector As D3DVECTOR) As Single
 
    Vector3_Length = D3DXVec3Length(Vector)
 
End Function
 
Public Sub Vector3_Negative(Vector As D3DVECTOR)
 
    With Vector
        .x = -.x
        .y = -.y
        .Z = -.Z
    End With
 
End Sub
 
Public Sub Vector3_Normalize(Vector As D3DVECTOR)
 
  Dim Value As Double
 
    Value = Vector.x * Vector.x + Vector.y * Vector.y + Vector.Z * Vector.Z
    Value = Sqr(Value)
    If Value = 0 Then
        Vector.x = 0
        Vector.y = 0
        Vector.Z = 0
        Exit Sub
    End If
    With Vector
        .x = .x / Value
        .y = .y / Value
        .Z = .Z / Value
    End With
 
End Sub
 
Public Sub Vector3_Scale(Destination_Vector As D3DVECTOR, _
                         Source_Vector As D3DVECTOR, _
                         ByVal Scale_Amount As Single)
 
    With Destination_Vector
        .x = Source_Vector.x * Scale_Amount
        .y = Source_Vector.y * Scale_Amount
        .Z = Source_Vector.Z * Scale_Amount
    End With
 
End Sub
 
Public Function Vector3_Subtract(Vector1 As D3DVECTOR, _
                                 Vector2 As D3DVECTOR) As D3DVECTOR
 
    With Vector3_Subtract
        .x = Vector1.x - Vector2.x
        .y = Vector1.y - Vector2.y
        .Z = Vector1.Z - Vector2.Z
    End With
 
End Function
 
Public Sub Vector3_Subtract_And_Scale(Destination_Vector As D3DVECTOR, _
                                      Vector1 As D3DVECTOR, _
                                      ByVal Scale_Amount1 As Single, _
                                      Vector2 As D3DVECTOR, _
                                      ByVal Scale_Amount2 As Single)
 
    With Destination_Vector
        .x = Scale_Amount1 * Vector1.x - Scale_Amount2 * Vector2.x
        .y = Scale_Amount1 * Vector1.y - Scale_Amount2 * Vector2.y
        .Z = Scale_Amount1 * Vector1.Z - Scale_Amount2 * Vector2.Z
    End With
 
End Sub
 
Public Function Vector3_Transform(Destination_Vector As D3DVECTOR4, _
                                  Vector1 As D3DVECTOR, _
                                  Matrix As D3DMATRIX) As Long
 
    Vector3_Transform = D3DXVec3Transform(Destination_Vector, Vector1, Matrix)
 
End Function
 
Public Function Vector4(ByVal x As Single, _
                        ByVal y As Single, _
                        ByVal Z As Single, _
                        ByVal W As Single) As D3DVECTOR4
 
    With Vector4
        .x = x
        .y = y
        .Z = Z
        .W = W
    End With
 
End Function
 
Public Function Vector4_Add(Vector1 As D3DVECTOR4, _
                            Vector2 As D3DVECTOR4) As D3DVECTOR4
 
    With Vector4_Add
        .x = Vector1.x + Vector2.x
        .y = Vector1.y + Vector2.y
        .Z = Vector1.Z + Vector2.Z
        .W = Vector1.W + Vector2.W
    End With
 
End Function
 
Public Sub Vector4_Add_And_Scale(Destination_Vector As D3DVECTOR4, _
                                 Vector1 As D3DVECTOR4, _
                                 ByVal Scale_Amount1 As Single, _
                                 Vector2 As D3DVECTOR4, _
                                 ByVal Scale_Amount2 As Single)
 
    With Destination_Vector
        .x = Scale_Amount1 * Vector1.x + Scale_Amount2 * Vector2.x
        .y = Scale_Amount1 * Vector1.y + Scale_Amount2 * Vector2.y
        .Z = Scale_Amount1 * Vector1.Z + Scale_Amount2 * Vector2.Z
        .W = Scale_Amount1 * Vector1.W + Scale_Amount2 * Vector2.W
    End With
 
End Sub
 
Public Sub Vector4_Copy(Destination_Vector As D3DVECTOR4, _
                        Source_Vector As D3DVECTOR4)
 
    With Destination_Vector
        .x = Source_Vector.x
        .y = Source_Vector.y
        .Z = Source_Vector.Z
        .W = Source_Vector.W
    End With
 
End Sub
 
Public Function Vector4_Dot_Product(Vector1 As D3DVECTOR4, _
                                    Vector2 As D3DVECTOR4) As Single
 
    Vector4_Dot_Product = Vector1.x * Vector2.x + Vector1.y * Vector2.y + Vector1.Z * Vector2.Z + Vector1.W * Vector2.W
 
End Function
 
Public Function Vector4_Length(Vector As D3DVECTOR4) As Single
 
    Vector4_Length = D3DXVec4Length(Vector)
 
End Function
 
Public Sub Vector4_Negative(Vector As D3DVECTOR4)
 
    With Vector
        .x = -.x
        .y = -.y
        .Z = -.Z
        .W = -.W
    End With
 
End Sub
 
Public Sub Vector4_Normalize(Vector As D3DVECTOR4)
 
  Dim Value As Double
 
    Value = Vector.x * Vector.x + Vector.y * Vector.y + Vector.Z * Vector.Z + Vector.W * Vector.W
    Value = Sqr(Value)
    If Value = 0 Then
        Vector.x = 0
        Vector.y = 0
        Vector.Z = 0
        Vector.W = 0
        Exit Sub
    End If
    With Vector
        .x = .x / Value
        .y = .y / Value
        .Z = .Z / Value
        .W = .W / Value
    End With
 
End Sub
 
Public Sub Vector4_Scale(Destination_Vector As D3DVECTOR4, _
                         Source_Vector As D3DVECTOR4, _
                         ByVal Scale_Amount As Single)
 
    With Destination_Vector
        .x = Source_Vector.x * Scale_Amount
        .y = Source_Vector.y * Scale_Amount
        .Z = Source_Vector.Z * Scale_Amount
        .W = Source_Vector.W * Scale_Amount
    End With
 
End Sub
 
Public Function Vector4_Subtract(Vector1 As D3DVECTOR4, _
                                 Vector2 As D3DVECTOR4) As D3DVECTOR4
 
    With Vector4_Subtract
        .x = Vector1.x - Vector2.x
        .y = Vector1.y - Vector2.y
        .Z = Vector1.Z - Vector2.Z
        .W = Vector1.W - Vector2.W
    End With
 
End Function
 
Public Sub Vector4_Subtract_And_Scale(Destination_Vector As D3DVECTOR4, _
                                      Vector1 As D3DVECTOR4, _
                                      ByVal Scale_Amount1 As Single, _
                                      Vector2 As D3DVECTOR4, _
                                      ByVal Scale_Amount2 As Single)
 
    With Destination_Vector
        .x = Scale_Amount1 * Vector1.x - Scale_Amount2 * Vector2.x
        .y = Scale_Amount1 * Vector1.y - Scale_Amount2 * Vector2.y
        .Z = Scale_Amount1 * Vector1.Z - Scale_Amount2 * Vector2.Z
        .W = Scale_Amount1 * Vector1.W - Scale_Amount2 * Vector2.W
    End With
 
End Sub
 
Private Function ArcSine(TheNumber As Double) As Double
 
  Dim N2 As Double
 
    On Error Resume Next
        N2 = Sqr(-TheNumber * TheNumber + 1)
        If Not N2 = 0 Then
            ArcSine = Atn(TheNumber / N2)
        End If
    On Error GoTo 0
 
  End Function
 
Private Function GCD(ByVal Number1 As Long, ByVal Number2 As Long) As Long
 
  Dim TempVal As Long
 
    Do While Not Number2 = 0
        TempVal = Number1 Mod Number2
        Number1 = Number2
        Number2 = TempVal
    Loop
    GCD = Number1
 
  End Function
 
Private Function LCM(ByVal Number1 As Long, ByVal Number2 As Long) As Long
 
  Dim i  As Long
  Dim N3 As Double
  Dim N4 As Double
 
    For i = 1 To Number2
        N3 = Number1 * i
        N4 = N3 / Number2
        If N4 = CLng(N4) Then
            LCM = N3
            Exit For
        End If
    Next i
 
  End Function
 
Public Function vecYposA(posY As Single, ByVal Speed As Single, ByVal Time_Elapsed As Single, ByVal Heading As Single) As Single
 
    posY = posY - (Speed * Time_Elapsed) * Cos(CDbl(Heading))
 
  End Function
 
Public Function Check_3D_Object_To_Object_Collision_XY(Collider_Position As D3DVECTOR, Object_Position As D3DVECTOR, Object_Radius As Single, Optional Radius_OffsetX = 0, Optional Radius_OffsetY = 0) As Boolean
 
    Check_3D_Object_To_Object_Collision_XY = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius
 
  End Function
 
Public Function Check_3D_Object_To_Object_Collision_XYZ(Collider_Position As D3DVECTOR, Object_Position As D3DVECTOR, Object_Radius As Single, Optional Radius_OffsetX = 0, Optional Radius_OffsetY = 0, Optional Radius_OffsetZ = 0) As Boolean
 
    Check_3D_Object_To_Object_Collision_XYZ = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius
    Check_3D_Object_To_Object_Collision_XYZ = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius
 
  End Function
 
Public Function Check_3D_Object_To_Object_Collision_XZ(Collider_Position As D3DVECTOR, Object_Position As D3DVECTOR, Object_Radius As Single, Optional Radius_OffsetX = 0, Optional Radius_OffsetZ = 0) As Boolean
 
    Check_3D_Object_To_Object_Collision_XZ = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius
 
  End Function
 
Public Function Check_3D_Object_To_Object_Collision_YZ(Collider_Position As D3DVECTOR, Object_Position As D3DVECTOR, Object_Radius As Single, Optional Radius_OffsetY = 0, Optional Radius_OffsetZ = 0) As Boolean
 
    Check_3D_Object_To_Object_Collision_YZ = Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius
 
  End Function
 
Public Function Check_4D_Object_To_Object_Collision_XYZW(Collider_Position As D3DVECTOR4, Object_Position As D3DVECTOR4, Object_Radius As Single, Optional Radius_OffsetX = 0, Optional Radius_OffsetY = 0, Optional Radius_OffsetZ = 0, Optional Radius_OffsetW = 0) As Boolean
 
    Check_4D_Object_To_Object_Collision_XYZW = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius And Collider_Position.W > (Object_Position.W + Radius_OffsetW) - Object_Radius And Collider_Position.W < (Object_Position.W + Radius_OffsetW) + Object_Radius
    Check_4D_Object_To_Object_Collision_XYZW = Collider_Position.x > (Object_Position.x + Radius_OffsetX) - Object_Radius And Collider_Position.x < (Object_Position.x + Radius_OffsetX) + Object_Radius And Collider_Position.y > (Object_Position.y + Radius_OffsetY) - Object_Radius And Collider_Position.y < (Object_Position.y + Radius_OffsetY) + Object_Radius And Collider_Position.Z > (Object_Position.Z + Radius_OffsetZ) - Object_Radius And Collider_Position.Z < (Object_Position.Z + Radius_OffsetZ) + Object_Radius And Collider_Position.W > (Object_Position.W + Radius_OffsetW) - Object_Radius And Collider_Position.W < (Object_Position.W + Radius_OffsetW) + Object_Radius
 
  End Function
 
Public Function CLR_Color(ByVal Red As Single, ByVal Green As Single, ByVal Blue As Single, ByVal Alpha As Single) As D3DCOLORVALUE
 
    With CLR_Color
        .R = Red
        .G = Green
        .B = Blue
        .A = Alpha
    End With
 
  End Function
 
Public Function Color4_To_Long(ByVal Red As Single, ByVal Green As Single, ByVal Blue As Single, ByVal Alpha As Single) As Long
 
  Dim R As Long
  Dim G As Long
  Dim B As Long
  Dim A As Long
  Dim C As Long
 
    R = Red * 255
    G = Green * 255
    B = Blue * 255
    A = Alpha * 255
    If A > 127 Then
        A = A - 128
        C = A * 2 ^ 24 Or &H80000000
        C = C Or R * 2 ^ 16
        C = C Or G * 2 ^ 8
        C = C Or B
      Else
        C = A * 2 ^ 24
        C = C Or R * 2 ^ 16
        C = C Or G * 2 ^ 8
        C = C Or B
    End If
    Color4_To_Long = C
 
  End Function
 
Public Function Color_Add(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, Color2 As D3DCOLORVALUE)
 
    D3DXColorAdd Color_Out, Color1, Color2
 
  End Function
 
Public Function Color_Adjust_Contrast(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, ByVal Contrast As Single)
 
    D3DXColorAdjustContrast Color_Out, Color1, Contrast
 
  End Function
 
Public Function Color_Adjust_Saturation(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, ByVal Saturation As Single)
 
    D3DXColorAdjustSaturation Color_Out, Color1, Saturation
 
  End Function
 
Public Function Color_GreyScale(Color As Long) As Single
 
  Dim R As Single
  Dim G As Single
  Dim B As Single
 
    Long_To_RGB Color, R, G, B
    Color_GreyScale = (R + B + G) / 765
 
  End Function
 
Public Function Color_Lerp(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, Color2 As D3DCOLORVALUE, ByVal S As Single)
 
    D3DXColorLerp Color_Out, Color1, Color2, S
 
  End Function
 
Public Function Color_Modulate(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, Color2 As D3DCOLORVALUE)
 
    D3DXColorModulate Color_Out, Color1, Color2
 
  End Function
 
Public Function Color_Negative(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE) As D3DCOLORVALUE
 
    D3DXColorNegative Color_Out, Color1
 
  End Function
 
Public Function Color_Scale(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, ByVal Scale_Value As Single)
 
    D3DXColorScale Color_Out, Color1, Scale_Value
 
  End Function
 
Public Function Color_Subtract(Color_Out As D3DCOLORVALUE, Color1 As D3DCOLORVALUE, Color2 As D3DCOLORVALUE)
 
    D3DXColorSubtract Color_Out, Color1, Color2
 
  End Function
 
Public Function Complex_ADD(ByRef n1 As Complex, ByRef N2 As Complex) As Complex
 
    Complex_ADD.Real = n1.Real + N2.Real
    Complex_ADD.Imag = n1.Imag + N2.Imag
 
  End Function
 
Public Function Complex_angle(n1 As Complex) As Double
 
  Dim Theta As Double
  Dim Temp  As Double
  Dim Q     As Long
 
    Q = 0
 
    If n1.Real <= 0 Then
        Q = 1
    End If
 
    If n1.Imag <= 0 Then
        Q = Q + 2
    End If
    Select Case Q
      Case 1
 
        Temp = -Atn(1) * 4
      Case 0, 2
        Temp = 0
      Case 3
        Temp = Atn(1) * 4
    End Select
    If n1.Real = 0 Then
        Theta = Atn(1) * 2
 
      Else
        Theta = Atn(n1.Imag / n1.Real)
    End If
    Theta = -(Temp - Theta)
 
    If Theta > Atn(1) * 4 Then
        Theta = Theta - Atn(1) * 4
    End If
 
    If Theta < Atn(1) * -4 Then
        Theta = Theta + Atn(1) * 4
    End If
    Complex_angle = Theta
 
  End Function
 
Public Function Complex_Dev(ByRef n1 As Complex, ByRef N2 As Complex) As Complex
 
    With Complex_Dev
        .Real = Complex_mult(Complex_conj(N2), n1).Real / Complex_mult(Complex_conj(N2), N2).Real
        .Imag = Complex_mult(Complex_conj(N2), n1).Imag / Complex_mult(Complex_conj(N2), N2).Real
    End With
 
  End Function
 
Public Function Complex_Power(n1 As Complex, N2 As Complex) As Complex
 
  Dim R     As Double
  Dim S     As Double
  Dim temp1 As Double
  Dim temp2 As Double
 
    R = Complex_Abs(n1)
    S = Angle(n1)
    temp1 = (R ^ N2.Real) * Exp(-S * N2.Imag)
    temp2 = N2.Imag * Log(R) + N2.Real * S
    Complex_Power = Complex_MakeComplex(temp1 * Cos(temp2), temp1 * Sin(temp2))
 
  End Function
 
Public Function Complex_SQR(ByRef n1 As Complex) As Complex
 
    Complex_SQR.Imag = Sqr(-0.5 * n1.Real + 0.5 * Sqr(n1.Imag ^ 2 + n1.Real ^ 2))
    Complex_SQR.Real = Sqr(n1.Real + Complex_SQR.Imag ^ 2)
 
  End Function
 
Public Function Complex_SUB(ByRef n1 As Complex, ByRef N2 As Complex) As Complex
 
    Complex_SUB.Real = n1.Real - N2.Real
    Complex_SUB.Imag = n1.Imag - N2.Imag
 
  End Function
 
Public Function Degrees_180() As Single
 
    Degrees_180 = 3.14159265358979
 
  End Function
 
Public Function Degrees_270() As Single
 
    Degrees_270 = 4.71238898038469
 
  End Function
 
Public Function Degrees_360() As Single
 
    Degrees_360 = 6.28318530717959
 
  End Function
 
Public Function Degrees_90() As Single
 
    Degrees_90 = 1.5707963267949
 
  End Function
 
Public Function Degrees_To_Radian_S(Degrees As Single) As Single
 
    Degrees_To_Radian = ((Degrees * Pi) / 180)
 
  End Function
 
Public Function Epsilon() As Single
 
    Epsilon = 0.0001
 
  End Function
 
Public Function Get_Distance_2D(Position1 As D3DVECTOR2, Position2 As D3DVECTOR2) As Single
 
    Get_Distance_2D = (Position2.x - Position1.x) * (Position2.x - Position1.x) + (Position2.y - Position1.y) * (Position2.y - Position1.y)
 
  End Function
 
Public Function Get_Distance_3D(Position1 As D3DVECTOR, Position2 As D3DVECTOR) As Single
 
    Get_Distance_3D = (Position2.x - Position1.x) * (Position2.x - Position1.x) + (Position2.y - Position1.y) * (Position2.y - Position1.y) + (Position2.Z - Position1.Z) * (Position2.Z - Position1.Z)
 
  End Function
 
Public Function Get_Distance_4D(Position1 As D3DVECTOR4, Position2 As D3DVECTOR4) As Single
 
    Get_Distance_4D = (Position2.x - Position1.x) * (Position2.x - Position1.x) + (Position2.y - Position1.y) * (Position2.y - Position1.y) + (Position2.Z - Position1.Z) * (Position2.Z - Position1.Z) + (Position2.W - Position1.W) * (Position2.W - Position1.W)
 
  End Function
 
Public Function GetNegativeInfinity32() As Single
 
    If Not m_bCalculatedValues Then
        Daniel_CalculateValues
    End If
    GetNegativeInfinity32 = m_fNegativeInfinity
 
  End Function
 
Public Function GetNegativeNotANumber32() As Single
 
    If Not m_bCalculatedValues Then
        Daniel_CalculateValues
    End If
    GetNegativeNotANumber32 = m_fNegativeNotANumber
 
  End Function
 
Public Function GetPositiveInfinity32() As Single
 
    If Not m_bCalculatedValues Then
        Daniel_CalculateValues
    End If
    GetPositiveInfinity32 = m_fPositiveInfinity
 
  End Function
 
Public Function GetPositiveNotANumber32() As Single
 
    If Not m_bCalculatedValues Then
        Daniel_CalculateValues
    End If
    GetPositiveNotANumber32 = m_fPositiveNotANumber
 
  End Function
 
Public Function GetRNDNumberBetween(Min As Variant, Max As Variant) As Single
 
    GetRNDNumberBetween = (Rnd * (Max - Min)) + Min
 
  End Function
 
Public Function High_Precision_AntiLog(X_Arg) As String
 
  Dim x As Variant
  Dim W As Variant
  Dim V As Variant
 
    V = CDec("2.30258509299404568401799145468")
    x = Trim$(X_Arg)
    If LenB(x) = 0 Or x = "-" Then
        High_Precision_AntiLog = ""
        Exit Function
    End If
    If Not IsNumeric(x) Then
        High_Precision_AntiLog = ""
        Exit Function
    End If
    x = CDec(x)
    If Right$(x, 1) = "." Then
        x = Left$(x, Len(x) - 1)
    End If
    If InStr(x, ".") = 0 Then
        If Abs(x) < 29 Then
            W = 1 & String$(Abs(x), "0")
            If x < 0 Then
                High_Precision_AntiLog = 1 / W
              Else
                High_Precision_AntiLog = W
            End If
            Exit Function
        End If
    End If
    W = High_Precision_ExpF(x * V)
    If LenB(W) = 0 Then
        High_Precision_AntiLog = ""
        Exit Function
    End If
    High_Precision_AntiLog = W
 
  End Function
 
Public Function High_Precision_ArcCosh(X_Arg) As String
 
  Dim x As Variant
  Dim W As Variant
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_ArcCosh = ""
        Exit Function
 
    End If
 
    x = CDec(x)
 
    If x < 1 Then
        High_Precision_ArcCosh = ""
        Exit Function
    End If
    W = x + High_Precision_Square_Root(x * x - 1)
    W = High_Precision_Ln(W)
    If Not IsNumeric(W) Then
        High_Precision_ArcCosh = ""
        Exit Function
    End If
    High_Precision_ArcCosh = W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_ArcCosh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_ArcSinh(X_Arg) As String
 
  Dim x As Variant
  Dim W As Variant
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_ArcSinh = ""
        Exit Function
    End If
    x = CDec(x)
    W = x + High_Precision_Square_Root(x * x + 1)
    W = High_Precision_Ln(W)
    If Not IsNumeric(W) Then
        High_Precision_ArcSinh = ""
        Exit Function
    End If
    High_Precision_ArcSinh = W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_ArcSinh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_ArcTanh(X_Arg) As String
 
  Dim x        As Variant
  Dim W        As Variant
  Dim SignFlag As Boolean
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_ArcTanh = ""
        Exit Function
    End If
    x = CDec(x)
    SignFlag = x < 0
    x = Abs(x)
    If Abs(x) >= 1 Then
        High_Precision_ArcTanh = ""
        Exit Function
    End If
    W = (1 + x) / (1 - x)
    W = Ln(W)
    If Not IsNumeric(W) Then
        High_Precision_ArcTanh = ""
        Exit Function
    End If
    W = W / 2
    If SignFlag Then
        W = -W
    End If
 
    High_Precision_ArcTanh = W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_ArcTanh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Cosh(X_Arg) As String
 
  Dim x As Variant
  Dim W As Variant
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Then
 
        x = 0
    End If
    x = Abs(CDec(x))
    If Not IsNumeric(x) Then
        High_Precision_Cosh = ""
        Exit Function
    End If
    If Abs(x) > CDec("65.37052415368304665919611913") Then
        High_Precision_Cosh = ""
        Exit Function
    End If
    W = ExpF(x)
    If Not IsNumeric(W) Then
        High_Precision_Cosh = ""
        Exit Function
    End If
    High_Precision_Cosh = (W + (1 / W)) / 2
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Cosh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Cube_Root(X_Arg) As String
 
  Dim x       As Variant
  Dim A       As Variant
  Dim B       As Variant
  Dim NegFlag As Boolean
  Dim k       As Long
 
    On Error GoTo ERROR_HANDLER
    k = 0
 
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Cube_Root = ""
        Exit Function
 
    End If
 
    x = CDec(x)
 
    If x = 0 Then
        High_Precision_Cube_Root = 0
        Exit Function
    End If
    If x < 0 Then
        NegFlag = True
        x = Abs(x)
      Else
        NegFlag = False
    End If
    A = x ^ (1 / 3)
    A = CDec(A)
    B = CDec(1)
ITERATE:
    B = ((2 * A) + x / (A * A)) / 3
 
    If (B = A) Or (k >= 20) Then
 
        If NegFlag Then
            B = -B
        End If
        High_Precision_Cube_Root = B
        Exit Function
    End If
    A = B
    k = k + 1
    GoTo ITERATE
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Cube_Root = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Log10(X_Arg) As String
 
  Dim x       As Variant
  Dim W       As Variant
  Dim Ip      As Variant
  Dim Dp      As Variant
 
  Dim LowFlag As Boolean
  Dim V       As Variant
 
    On Error GoTo ERROR_HANDLER
    V = CDec("2.30258509299404568401799145468")
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        High_Precision_Log10 = ""
        Exit Function
 
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Log10 = ""
        Exit Function
 
    End If
    x = CDec(x)
 
    If x > 0 Then
        If x < 1 Then
 
            LowFlag = True
            x = 1 / x
        End If
 
    End If
    Ip = 0
 
    If x >= 10 Then
 
        If Right$(x, 1) = "." Then
            x = x & "0"
        End If
        W = InStr(x, ".")
 
        If W = 0 Then
            x = x & ".0"
        End If
        W = InStr(x, ".")
        Ip = Left$(x, W - 1)
        Dp = Mid$(x, W + 1, Len(x))
        x = Left$(Ip, 1) & "." & Mid$(Ip, 2, Len(Ip)) & Dp
        Ip = CDec(Len(Ip)) - 1
    End If
 
    W = High_Precision_LogE(x)
 
    If LenB(W) = 0 Then
 
        High_Precision_Log10 = ""
        Exit Function
 
    End If
 
    W = Ip + (W / V)
 
    If LowFlag Then
        W = -W
    End If
 
    High_Precision_Log10 = W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Log10 = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Sinh(X_Arg) As String
 
  Dim x       As Variant
  Dim W       As Variant
  Dim NegFlag As Boolean
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Sinh = ""
        Exit Function
 
    End If
 
    x = CDec(x)
 
    NegFlag = x < 0
 
    x = Abs(x)
 
    If Abs(x) > CDec("65.37052415368304665919611913") Then
        High_Precision_Sinh = ""
        Exit Function
 
    End If
 
    W = ExpF(x)
 
    If Not IsNumeric(W) Then
        High_Precision_Sinh = ""
        Exit Function
 
    End If
 
    W = (W - (1 / W)) / 2
 
    If NegFlag Then
        W = -W
    End If
 
    High_Precision_Sinh = W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Sinh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Tangent(X_Arg) As String
 
  Dim V As Variant
  Dim W As Variant
  Dim x As Variant
 
    On Error GoTo ERROR_HANDLER
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Or x = "-" Then
 
        High_Precision_Tangent = ""
        Exit Function
 
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Tangent = ""
        Exit Function
 
    End If
 
    V = High_Precision_Sine(x)
    W = High_Precision_Cosine(x)
 
    If LenB(V) = 0 Or LenB(W) = 0 Then
 
        High_Precision_Tangent = ""
        Exit Function
 
    End If
 
    If W = 0 Then
        High_Precision_Tangent = ""
        Exit Function
 
    End If
 
    High_Precision_Tangent = V / W
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Tangent = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function High_Precision_Tanh(X_Arg) As String
 
  Dim x       As Variant
 
    On Error GoTo ERROR_HANDLER
 
    x = Trim$(X_Arg)
 
    If LenB(x) = 0 Then
 
        x = 0
    End If
 
    If Not IsNumeric(x) Then
        High_Precision_Tanh = ""
        Exit Function
 
    End If
 
    x = CDec(x)
 
    If Abs(x) > CDec("65.37052415368304665919611913") Then
        High_Precision_Tanh = ""
        Exit Function
 
    End If
 
    High_Precision_Tanh = Sinh(x) / Cosh(x)
 
  Exit Function
 
ERROR_HANDLER:
    High_Precision_Tanh = ""
    MsgBox Err.Description, vbCritical, " PROGRAM ERROR"
 
  End Function
 
Public Function HugeSingle() As Single
 
    HugeSingle = 1E+38
 
  End Function
 
Public Function Inverse_PI() As Single
 
    Inverse_PI = 0.318309886183791
 
  End Function
 
Public Function IsInTriangle2D(Position As Vector2D, FirstVector As Vector2D, SecondVector As Vector2D, ThirdVector As Vector2D) As Boolean
 
  Dim bc  As Double
  Dim ca  As Double
  Dim ab  As Double
  Dim ap  As Double
  Dim bp  As Double
  Dim cp  As Double
  Dim abc As Double
 
    bc = SecondVector.x * ThirdVector.y - SecondVector.y * ThirdVector.x
    ca = ThirdVector.x * FirstVector.y - ThirdVector.y * FirstVector.x
    ab = FirstVector.x * SecondVector.y - FirstVector.y * SecondVector.x
    ap = FirstVector.x * Position.y - FirstVector.y * Position.x
    bp = SecondVector.x * Position.y - SecondVector.y * Position.x
    cp = ThirdVector.x * Position.y - ThirdVector.y * Position.x
    abc = Sgn(bc + ca + ab)
 
    If (abc * (bc - bp + cp) > 0) Then
        If (abc * (ca - cp + ap) > 0) Then
            If (abc * (ab - ap + bp) > 0) Then
 
                IsInTriangle2D = True
            End If
 
        End If
 
    End If
 
  End Function
 
Public Function Long_To_Color4(ByVal Color As Long) As D3DCOLORVALUE
 
  Dim A As Long
  Dim R As Long
 
  Dim G As Long
 
  Dim B As Long
 
    If Color < 0 Then
        A = ((Color And (&H7F000000)) / (2 ^ 24)) Or &H80&
      Else
        A = Color / (2 ^ 24)
    End If
    R = (Color And &HFF0000) / (2 ^ 16)
    G = (Color And &HFF00&) / (2 ^ 8)
    B = (Color And &HFF&)
 
    With Long_To_Color4
        .A = A / 255
        .R = R / 255
        .G = G / 255
        .B = B / 255
    End With
 
  End Function
 
Public Function M3_Matrix(ByVal m11 As Single, ByVal m12 As Single, ByVal m13 As Single, ByVal m21 As Single, ByVal m22 As Single, ByVal m23 As Single, ByVal m31 As Single, ByVal m32 As Single, ByVal m33 As Single) As D3DMATRIX3
 
    With M3_Matrix
        .m11 = m11
        .m12 = m12
        .m13 = m13
        .m21 = m21
        .m22 = m22
 
        .m23 = m23
        .m31 = m31
        .m32 = m32
        .m33 = m33
    End With
 
  End Function
 
Public Function M4_Matrix(ByVal m11 As Single, ByVal m12 As Single, ByVal m13 As Single, ByVal m14 As Single, ByVal m21 As Single, ByVal m22 As Single, ByVal m23 As Single, ByVal m24 As Single, ByVal m31 As Single, ByVal m32 As Single, ByVal m33 As Single, ByVal m34 As Single, ByVal m41 As Single, ByVal m42 As Single, ByVal m43 As Single, ByVal m44 As Single) As D3DMATRIX
 
    With M4_Matrix
        .m11 = m11
        .m12 = m12
        .m13 = m13
        .m14 = m14
        .m21 = m21
        .m22 = m22
        .m23 = m23
        .m24 = m24
        .m31 = m31
        .m32 = m32
        .m33 = m33
        .m34 = m34
        .m41 = m41
        .m42 = m42
        .m43 = m43
        .m44 = m44
    End With
 
  End Function
 
Public Function Make_D3D_Rect(ByVal X1 As Single, ByVal X2 As Single, ByVal Y1 As Single, ByVal Y2 As Single) As D3DRECT
 
    With Make_D3D_Rect
        .X1 = X1
        .X2 = X2
        .Y1 = Y1
        .Y2 = Y2
    End With
 
  End Function
 
Public Function Make_L_Vertex2(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal tU1 As Single, ByVal tU2 As Single, ByVal tV1 As Single, ByVal tV2 As Single, ByVal Color As Long, ByVal Specular As Single) As D3DLVERTEX2
 
  Dim tmpVert As D3DLVERTEX2
 
    With tmpVert
        .x = x
        .y = y
        .Z = Z
        .tU1 = tU1
        .tV1 = tV1
        .tU2 = tU2
        .tV2 = tV2
        .Color = Color
        .Specular = Specular
    End With
    Make_L_Vertex2 = tmpVert
 
  End Function
 
Public Function Make_L_Vertex3(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal tU As Single, ByVal tV As Single, ByVal Color As Long, ByVal Specular As Single) As D3DLVERTEX
 
  Dim tmpVert As D3DLVERTEX
 
    With tmpVert
        .x = x
        .y = y
        .Z = Z
        .tU = tU
        .tV = tV
        .Color = Color
        .Specular = Specular
    End With
    Make_L_Vertex3 = tmpVert
 
  End Function
 
Public Function Make_TL_Vertex2(ByVal SX As Single, ByVal SY As Single, ByVal SZ As Single, ByVal RHW As Single, ByVal tU1 As Single, ByVal tU2 As Single, ByVal tV1 As Single, ByVal tV2 As Single, ByVal Color As Long, ByVal Specular As Single) As D3DTLVERTEX2
 
  Dim tmpVert As D3DTLVERTEX2
 
    With tmpVert
        .SX = SX
        .SY = SY
        .SZ = SZ
        .tU1 = tU1
        .tV1 = tV1
        .tU2 = tU2
        .tV2 = tV2
        .RHW = RHW
        .Color = Color
        .Specular = Specular
    End With
    Make_TL_Vertex2 = tmpVert
 
  End Function
 
Public Function Make_TL_Vertex3(ByVal SX As Single, ByVal SY As Single, ByVal SZ As Single, ByVal RHW As Single, ByVal tU As Single, ByVal tV As Single, ByVal Color As Long, ByVal Specular As Single) As D3DTLVERTEX
 
  Dim tmpVert As D3DTLVERTEX
 
    With tmpVert
        .SX = SX
        .SY = SY
        .SZ = SZ
        .tU = tU
        .tV = tV
        .RHW = RHW
        .Color = Color
        .Specular = Specular
    End With
    Make_TL_Vertex3 = tmpVert
 
  End Function
 
Public Function Make_Vertex2(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal Normal_X As Single, ByVal Normal_Y As Single, ByVal Normal_Z As Single, ByVal tU1 As Single, ByVal tU2 As Single, ByVal tV1 As Single, ByVal tV2 As Single) As D3DVERTEX2
 
  Dim tmpVert As D3DVERTEX2
 
    With tmpVert
        .x = x
        .y = y
        .Z = Z
        .nx = Normal_X
        .ny = Normal_Y
        .nz = Normal_Z
        .tU1 = tU1
        .tU2 = tU2
        .tV1 = tV1
        .tV2 = tV2
    End With
    Make_Vertex2 = tmpVert
 
  End Function
 
Public Function Make_Vertex3(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal Normal_X As Single, ByVal Normal_Y As Single, ByVal Normal_Z As Single, ByVal tU As Single, ByVal tV As Single) As D3DVERTEX
 
  Dim tmpVert As D3DVERTEX
 
    With tmpVert
        .x = x
        .y = y
        .Z = Z
        .nx = Normal_X
        .ny = Normal_Y
        .nz = Normal_Z
        .tU = tU
        .tV = tV
    End With
    Make_Vertex3 = tmpVert
 
  End Function
 
Public Function Matrix_Affine_Transformation(Destination_Matrix As D3DMATRIX, Scaling As Single, Rotation_Center As D3DVECTOR, Rotation As D3DQUATERNION, Translation As D3DVECTOR) As Long
 
    Matrix_Affine_Transformation = D3DXMatrixAffineTransformation(Destination_Matrix, Scaling, Rotation_Center, Rotation, Translation)
 
  End Function
 
Public Function Matrix_ConcatTransform(Matrix_Input1 As D3DMATRIX, Matrix_Input2 As D3DMATRIX) As D3DMATRIX
 
    With Matrix_ConcatTransform
        .m11 = Matrix_Input1.m11 * Matrix_Input2.m11 + Matrix_Input1.m21 * Matrix_Input2.m12 + Matrix_Input1.m31 * Matrix_Input2.m13
        .m12 = Matrix_Input1.m12 * Matrix_Input2.m11 + Matrix_Input1.m22 * Matrix_Input2.m12 + Matrix_Input1.m32 * Matrix_Input2.m13
        .m13 = Matrix_Input1.m13 * Matrix_Input2.m11 + Matrix_Input1.m23 * Matrix_Input2.m12 + Matrix_Input1.m33 * Matrix_Input2.m13
        .m21 = Matrix_Input1.m11 * Matrix_Input2.m21 + Matrix_Input1.m21 * Matrix_Input2.m22 + Matrix_Input1.m31 * Matrix_Input2.m23
        .m22 = Matrix_Input1.m12 * Matrix_Input2.m21 + Matrix_Input1.m22 * Matrix_Input2.m22 + Matrix_Input1.m32 * Matrix_Input2.m23
        .m23 = Matrix_Input1.m13 * Matrix_Input2.m21 + Matrix_Input1.m23 * Matrix_Input2.m22 + Matrix_Input1.m33 * Matrix_Input2.m23
        .m31 = Matrix_Input1.m11 * Matrix_Input2.m31 + Matrix_Input1.m21 * Matrix_Input2.m32 + Matrix_Input1.m31 * Matrix_Input2.m33
        .m32 = Matrix_Input1.m12 * Matrix_Input2.m31 + Matrix_Input1.m22 * Matrix_Input2.m32 + Matrix_Input1.m32 * Matrix_Input2.m33
        .m33 = Matrix_Input1.m13 * Matrix_Input2.m31 + Matrix_Input1.m23 * Matrix_Input2.m32 + Matrix_Input1.m33 * Matrix_Input2.m33
        .m41 = Matrix_Input1.m11 * Matrix_Input2.m41 + Matrix_Input1.m21 * Matrix_Input2.m42 + Matrix_Input1.m31 * Matrix_Input2.m43 + Matrix_Input1.m41
        .m42 = Matrix_Input1.m12 * Matrix_Input2.m41 + Matrix_Input1.m22 * Matrix_Input2.m42 + Matrix_Input1.m32 * Matrix_Input2.m43 + Matrix_Input1.m42
        .m43 = Matrix_Input1.m13 * Matrix_Input2.m41 + Matrix_Input1.m23 * Matrix_Input2.m42 + Matrix_Input1.m33 * Matrix_Input2.m42 + Matrix_Input1.m43
    End With
 
  End Function
 
Public Function Matrix_Determinant(Matrix As D3DMATRIX) As Single
 
    Matrix_Determinant = D3DXMatrixfDeterminant(Matrix)
 
  End Function
 
Public Function Matrix_Inverse(Destination_Matrix As D3DMATRIX, Determinant As Single, Matrix As D3DMATRIX) As Long
 
    Matrix_Inverse = D3DXMatrixInverse(Destination_Matrix, Determinant, Matrix)
 
  End Function
 
Public Function Matrix_Is_Identity(Matrix As D3DMATRIX) As Long
 
    Matrix_Is_Identity = D3DXMatrixIsIdentity(Matrix)
 
  End Function
 
Public Function Matrix_LookAt_LH(Destination_Matrix As D3DMATRIX, Eye As D3DVECTOR, At As D3DVECTOR, Up As D3DVECTOR) As Long
 
    Matrix_LookAt_LH = D3DXMatrixLookAtLH(Destination_Matrix, Eye, At, Up)
 
  End Function
 
Public Function Matrix_LookAt_RH(Destination_Matrix As D3DMATRIX, Eye As D3DVECTOR, At As D3DVECTOR, Up As D3DVECTOR) As Long
 
    Matrix_LookAt_RH = D3DXMatrixLookAtRH(Destination_Matrix, Eye, At, Up)
 
  End Function
 
Public Function Matrix_Multiply(Destination_Matrix As D3DMATRIX, Matrix1 As D3DMATRIX, Matrix2 As D3DMATRIX) As Long
 
    Matrix_Multiply = D3DXMatrixMultiply(Destination_Matrix, Matrix1, Matrix2)
 
  End Function
 
Public Function Matrix_Ortho_LH(Destination_Matrix As D3DMATRIX, sngWidth As Single, sngHeight As Single, Near As Single, Far As Single) As Long
 
    Matrix_Ortho_LH = D3DXMatrixOrthoLH(Destination_Matrix, sngWidth, sngHeight, Near, Far)
 
  End Function
 
Public Function Matrix_Ortho_OffCenter_LH(Destination_Matrix As D3DMATRIX, XMin As Single, XMax As Single, YMin As Single, YMax As Single, Near As Single, Far As Single) As Long
 
    Matrix_Ortho_OffCenter_LH = D3DXMatrixOrthoOffCenterLH(Destination_Matrix, XMin, XMax, YMax, YMin, Near, Far)
 
  End Function
 
Public Function Matrix_Ortho_OffCenter_RH(Destination_Matrix As D3DMATRIX, XMin As Single, XMax As Single, YMin As Single, YMax As Single, Near As Single, Far As Single) As Long
 
    Matrix_Ortho_OffCenter_RH = D3DXMatrixOrthoOffCenterRH(Destination_Matrix, XMin, XMax, YMax, YMin, Near, Far)
 
  End Function
 
Public Function Matrix_Ortho_RH(Destination_Matrix As D3DMATRIX, sngWidth As Single, sngHeight As Single, Near As Single, Far As Single) As Long
 
    Matrix_Ortho_RH = D3DXMatrixOrthoRH(Destination_Matrix, sngWidth, sngHeight, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_FOV_LH(Destination_Matrix As D3DMATRIX, Feild_Of_View As Single, Aspect As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_FOV_LH = D3DXMatrixPerspectiveFovLH(Destination_Matrix, Feild_Of_View, Aspect, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_FOV_RH(Destination_Matrix As D3DMATRIX, Feild_Of_View As Single, Aspect As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_FOV_RH = D3DXMatrixPerspectiveFovRH(Destination_Matrix, Feild_Of_View, Aspect, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_LH(Destination_Matrix As D3DMATRIX, sngWidth As Single, sngHeight As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_LH = D3DXMatrixPerspectiveLH(Destination_Matrix, sngWidth, sngHeight, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_OffCenter_LH(Destination_Matrix As D3DMATRIX, XMin As Single, XMax As Single, YMin As Single, YMax As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_OffCenter_LH = D3DXMatrixPerspectiveOffCenterLH(Destination_Matrix, XMin, XMax, YMax, YMin, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_OffCenter_RH(Destination_Matrix As D3DMATRIX, XMin As Single, XMax As Single, YMin As Single, YMax As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_OffCenter_RH = D3DXMatrixPerspectiveOffCenterRH(Destination_Matrix, XMin, XMax, YMax, YMin, Near, Far)
 
  End Function
 
Public Function Matrix_Perspective_RH(Destination_Matrix As D3DMATRIX, sngWidth As Single, sngHeight As Single, Near As Single, Far As Single) As Long
 
    Matrix_Perspective_RH = D3DXMatrixPerspectiveRH(Destination_Matrix, sngWidth, sngHeight, Near, Far)
 
  End Function
 
Public Function Matrix_Reflect(Destination_Matrix As D3DMATRIX, Plane As D3DPLANE) As Long
 
    Matrix_Reflect = D3DXMatrixReflect(Destination_Matrix, Plane)
 
  End Function
 
Public Function Matrix_Rotation_Axis(Destination_Matrix As D3DMATRIX, Axis As D3DVECTOR, Angle As Single) As Long
 
    Matrix_Rotation_Axis = D3DXMatrixRotationAxis(Destination_Matrix, Axis, Angle)
 
  End Function
 
Public Function Matrix_Rotation_Quaternion(Destination_Matrix As D3DMATRIX, Quaternion As D3DQUATERNION) As Long
 
    Matrix_Rotation_Quaternion = D3DXMatrixRotationQuaternion(Destination_Matrix, Quaternion)
 
  End Function
 
Public Function Matrix_Rotation_X(Destination_Matrix As D3DMATRIX, Angle As Single) As Long
 
    Matrix_Rotation_X = D3DXMatrixRotationX(Destination_Matrix, Angle)
 
  End Function
 
Public Function Matrix_Rotation_Y(Destination_Matrix As D3DMATRIX, Angle As Single) As Long
 
    Matrix_Rotation_Y = D3DXMatrixRotationY(Destination_Matrix, Angle)
 
  End Function
 
Public Function Matrix_Rotation_Z(Destination_Matrix As D3DMATRIX, Angle As Single) As Long
 
    Matrix_Rotation_Z = D3DXMatrixRotationZ(Destination_Matrix, Angle)
 
  End Function
 
Public Function Matrix_Scale(ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single) As D3DMATRIX
 
    Matrix_Identity Matrix_Scale
 
    With Matrix_Scale
        .m11 = ScaleX
        .m22 = ScaleY
        .m33 = ScaleZ
        .m44 = 1
    End With
 
  End Function
 
Public Function Matrix_Scaling(Destination_Matrix As D3DMATRIX, ScaleX As Single, ScaleY As Single, ScaleZ As Single) As Long
 
    Matrix_Scaling = D3DXMatrixScaling(Destination_Matrix, ScaleX, ScaleY, ScaleZ)
 
  End Function
 
Public Function Matrix_Shadow(Destination_Matrix As D3DMATRIX, Vector_Light As D3DVECTOR4, Plane As D3DPLANE) As Long
 
    Matrix_Shadow = D3DXMatrixShadow(Destination_Matrix, Vector_Light, Plane)
 
  End Function
 
Public Function Matrix_Transformation(Destination_Matrix As D3DMATRIX, Scale_Center As D3DVECTOR, Scale_Rotation As D3DQUATERNION, VScale As D3DVECTOR, Rotation_Center As D3DVECTOR, QRotation As D3DQUATERNION, VTranslation As D3DVECTOR) As Long
 
    Matrix_Transformation = D3DXMatrixTransformation(Destination_Matrix, Scale_Center, Scale_Rotation, VScale, Rotation_Center, QRotation, VTranslation)
 
  End Function
 
Public Function Matrix_Translate(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single) As D3DMATRIX
 
    Matrix_Identity Matrix_Translate
 
    With Matrix_Translate
        .m41 = PositionX
        .m42 = PositionY
        .m43 = PositionZ
        .m44 = 1
    End With
 
  End Function
 
Public Function Matrix_Transpose(Destination_Matrix As D3DMATRIX, Matrix As D3DMATRIX) As Long
 
    Matrix_Transpose = D3DXMatrixTranspose(Destination_Matrix, Matrix)
 
  End Function
 
Public Function Matrix_Yaw_Pitch_Roll(Destination_Matrix As D3DMATRIX, Yaw As Single, Pitch As Single, Roll As Single) As Long
 
    Matrix_Identity Destination_Matrix
    Matrix_Yaw_Pitch_Roll = D3DXMatrixRotationYawPitchRoll(Destination_Matrix, Yaw, Pitch, Roll)
 
  End Function
 
Public Function Plane_Dot_Coord(Plane1 As D3DPLANE, Vector As D3DVECTOR) As Single
 
    Plane_Dot_Coord = D3DXPlaneDotCoord(Plane1, Vector)
 
  End Function
 
Public Function Plane_Dot_Normal(Plane1 As D3DPLANE, Vector As D3DVECTOR) As Single
 
    Plane_Dot_Normal = D3DXPlaneDotNormal(Plane1, Vector)
 
  End Function
 
Public Function Plane_Dot_Product(Plane1 As D3DPLANE, Plane2 As D3DPLANE) As Single
 
    Plane_Dot_Product = D3DXPlaneDot(Plane1, Plane1)
 
  End Function
 
Public Function Plane_From_Point_Normal(Detination_Plane As D3DPLANE, Vector_Point As D3DVECTOR, Vector_Normal As D3DVECTOR) As Long
 
    Plane_From_Point_Normal = D3DXPlaneFromPointNormal(Detination_Plane, Vector_Point, Vector_Normal)
 
  End Function
 
Public Function Plane_From_Points(Detination_Plane As D3DPLANE, Point1 As D3DVECTOR, Point2 As D3DVECTOR, Point3 As D3DVECTOR) As Long
 
    Plane_From_Points = D3DXPlaneFromPoints(Detination_Plane, Point1, Point2, Point3)
 
  End Function
 
Public Function Plane_Intersect_Line(Detination_Plane As D3DPLANE, Plane1 As D3DPLANE, Starting_Point As D3DVECTOR, Ending_Point As D3DVECTOR) As Long
 
    Plane_Intersect_Line = D3DXPlaneIntersectLine(Detination_Plane, Plane1, Starting_Point, Ending_Point)
 
  End Function
 
Public Function Plane_Normalize(Detination_Plane As D3DPLANE, Plane1 As D3DPLANE) As Long
 
    Plane_Normalize = D3DXPlaneNormalize(Detination_Plane, Plane1)
 
  End Function
 
Public Function Plane_Transform(Detination_Plane As D3DPLANE, Plane1 As D3DPLANE, Matrix As D3DMATRIX) As Long
 
    Plane_Transform = D3DXPlaneTransform(Detination_Plane, Plane1, Matrix)
 
  End Function
 
Public Function QT_Quaternion(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal W As Single) As D3DQUATERNION
 
    With QT_Quaternion
        .x = x
        .y = y
        .Z = Z
        .W = W
    End With
 
  End Function
 
Public Function Quaternion_Bary_Centric(Quaternion_Out As D3DQUATERNION, Quaternion1 As D3DQUATERNION, Quaternion2 As D3DQUATERNION, Quaternion3 As D3DQUATERNION, Wieght_Factor_F As Single, Wieght_Factor_G As Single) As Long
 
    Quaternion_Bary_Centric = D3DXQuaternionBaryCentric(Quaternion_Out, Quaternion1, Quaternion2, Quaternion3, Wieght_Factor_F, Wieght_Factor_G)
 
  End Function
 
 
Public Function Quaternion_Conjugate(Quaternion_Out As D3DQUATERNION, Quaternion As D3DQUATERNION) As Long
 
    Quaternion_Conjugate = D3DXQuaternionConjugate(Quaternion_Out, Quaternion)
 
  End Function
 
Public Function Quaternion_Dot_Product(Quaternion1 As D3DQUATERNION, Quaternion2 As D3DQUATERNION) As Single
 
    Quaternion_Dot_Product = D3DXQuaternionDot(Quaternion1, Quaternion2)
 
  End Function
 
Public Function Quaternion_Exp(Quaternion_Out As D3DQUATERNION, Quaternion As D3DQUATERNION) As Long
 
    Quaternion_Exp = D3DXQuaternionExp(Quaternion_Out, Quaternion)
 
  End Function
 
Public Function Quaternion_Identity(Quaternion_Out As D3DQUATERNION) As Long
 
    Quaternion_Identity = D3DXQuaternionIdentity(Quaternion_Out)
 
  End Function
 
Public Function Quaternion_Inverse(Quaternion_Out As D3DQUATERNION, Quaternion As D3DQUATERNION) As Long
 
    Quaternion_Inverse = D3DXQuaternionInverse(Quaternion_Out, Quaternion)
 
  End Function
 
Public Function Quaternion_Is_Identity(Quaternion As D3DQUATERNION) As Long
 
    Quaternion_Is_Identity = D3DXQuaternionIsIdentity(Quaternion)
 
  End Function
 
Public Function Quaternion_Length_Squared(Quaternion As D3DQUATERNION) As Single
 
    Quaternion_Length_Squared = D3DXQuaternionLengthSq(Quaternion)
 
  End Function
 
Public Function Quaternion_LN(Quaternion_Out As D3DQUATERNION, Quaternion As D3DQUATERNION) As Long
 
    Quaternion_LN = D3DXQuaternionLn(Quaternion_Out, Quaternion)
 
  End Function
 
Public Function Quaternion_Multiply(Quaternion_Out As D3DQUATERNION, Quaternion1 As D3DQUATERNION, Quaternion2 As D3DQUATERNION) As Long
 
    Quaternion_Multiply = D3DXQuaternionMultiply(Quaternion_Out, Quaternion1, Quaternion2)
 
  End Function
 
Public Function Quaternion_Normalize(Quaternion_Out As D3DQUATERNION, Quaternion As D3DQUATERNION) As Long
 
    Quaternion_Normalize = D3DXQuaternionNormalize(Quaternion_Out, Quaternion)
 
  End Function
 
Public Function Quaternion_Rotation_Axis(Quaternion_Out As D3DQUATERNION, Axis As D3DVECTOR, Angle As Single) As Long
 
    Quaternion_Rotation_Axis = D3DXQuaternionRotationAxis(Quaternion_Out, Axis, Angle)
 
  End Function
 
Public Function Quaternion_Rotation_Matrix(Quaternion_Out As D3DQUATERNION, Matrix As D3DMATRIX) As Long
 
    Quaternion_Rotation_Matrix = D3DXQuaternionRotationMatrix(Quaternion_Out, Matrix)
 
  End Function
 
Public Function Quaternion_Slerp(Quaternion_Out As D3DQUATERNION, Quaternion1 As D3DQUATERNION, Quaternion2 As D3DQUATERNION, T As Single) As Long
 
    Quaternion_Slerp = D3DXQuaternionSlerp(Quaternion_Out, Quaternion1, Quaternion2, T)
 
  End Function
 
Public Function Quaternion_Squad(Quaternion_Out As D3DQUATERNION, Quaternion1 As D3DQUATERNION, Quaternion2 As D3DQUATERNION, Quaternion3 As D3DQUATERNION, Quaternion4 As D3DQUATERNION, T As Single) As Long
 
    Quaternion_Squad = D3DXQuaternionSquad(Quaternion_Out, Quaternion1, Quaternion2, Quaternion3, Quaternion4, T)
 
  End Function
 
Public Function Quaternion_To_Axis_Angle(Quaternion_Out As D3DQUATERNION, Axis As D3DVECTOR, Angle As Single) As Long
 
    Quaternion_To_Axis_Angle = D3DXQuaternionToAxisAngle(Quaternion_Out, Axis, Angle)
 
  End Function
 
Public Function Quaternion_Yaw_Pitch_Roll(Quaternion_Out As D3DQUATERNION, Yaw As Single, Pitch As Single, Roll As Single) As Long
 
    Quaternion_Yaw_Pitch_Roll = D3DXQuaternionRotationYawPitchRoll(Quaternion_Out, Yaw, Pitch, Roll)
 
  End Function
 
Public Function Radian_to_Degree(Radians As Single) As Single
 
    Radian_to_Degree = ((Radians * 180) / Pi)
 
  End Function
 
Public Function Radiant() As Single
 
    Radiant = 1.74532925199433E-02
 
  End Function
 
Public Function Rotate_LeftA(ByVal Angle As Single, ByVal Rotation_Rate As Single, ByVal Time_Elapsed As Single) As Single
 
    Angle = Angle - (Rotation_Rate * Time_Elapsed) * Pi / 180
 
  End Function
 
Public Function Rotate_RightA(ByVal Angle As Single, ByVal Rotation_Rate As Single, ByVal Time_Elapsed As Single) As Single
 
    Angle = Angle + (Rotation_Rate * Time_Elapsed) * Pi / 180
 
  End Function
 
Public Function Safe_IdMatrix(n As Variant, Optional lb As Variant) As Variant
 
  Dim i
  Dim j
 
    On Error GoTo EH
 
    If IsMissing(lb) Then
        lb = 0
    End If
    ReDim A(lb To n, lb To n)
 
    For i = lb To n
 
        For j = lb To n
            If i = j Then
 
                A(i, j) = 1
              Else
                A(i, j) = 0
            End If
        Next j
    Next i
    Safe_IdMatrix = A
 
  Exit Function
 
EH:
    Safe_IdMatrix = Null
 
End Function
 
Public Function Safe_Matrix(lb As Variant, Cols As Variant, Rows As Variant, ParamArray dat() As Variant)
 
  Dim k As Long
  Dim i
  Dim j
 
    On Error GoTo NotAnArray
    ReDim C(lb To Rows, lb To Cols) As Variant
    k = LBound(dat)
    For i = lb To Rows
        For j = lb To Cols
            If k > UBound(dat) Then
                C(i, j) = 0
              Else
 
                If IsMissing(dat(k)) Then
                    dat(k) = 0
                End If
                C(i, j) = dat(k)
                k = k + 1
            End If
        Next j
    Next i
    Safe_Matrix = C
 
  Exit Function
 
NotAnArray:
    Safe_Matrix = Null
 
End Function
 
Public Function Safe_MatrixAdd(A As Variant, B As Variant) As Variant
 
  Dim ub
  Dim i
  Dim j
 
    On Error GoTo notArr
 
    If Not (IsArray(A)) Then
        GoTo notArr
    End If
 
    If Not (IsArray(B)) Then
        GoTo notArr
    End If
    lb = LBound(A)
    ub = UBound(A)
    ReDim C(lb To ub, lb To ub)
 
    For i = lb To ub
        For j = lb To ub
            C(i, j) = A(i, j) + B(i, j)
        Next j
    Next i
    Safe_MatrixAdd = C
 
  Exit Function
 
 
notArr:
    Safe_MatrixAdd = Null
 
End Function
 
Public Function Safe_MatrixDet(ByVal A As Variant) As Variant
 
  Dim lb
  Dim ub
  Dim i
  Dim FGOS As Long
  Dim L
  Dim M
  Dim Q
  Dim j
  Dim T    As Single
  Dim k
 
    On Error GoTo errH
    lb = LBound(A)
    ub = UBound(A)
    Safe_MatrixDet = 1
    For i = lb To ub - 1
        If A(i, i) = 0 Then
            FGOS = 0
            For L = i + 1 To ub
                If A(L, i) <> 0 Then
                    For M = lb To ub
                        Q = A(L, M)
                        A(L, M) = A(i, M)
                        A(i, M) = Q
                    Next M
                    Safe_MatrixDet = -Safe_MatrixDet
                    FGOS = -1
                    Exit For
                End If
            Next L
 
            If FGOS <> -1 Then
                Safe_MatrixDet = 0
            End If
        End If
 
        If Safe_MatrixDet = 0 Then
            Exit Function
 
        End If
        For j = i + 1 To ub
            T = A(i, j) / A(i, i)
            For k = lb To ub
                A(k, j) = A(k, j) - A(k, i) * T
            Next k
        Next j
    Next i
    For i = lb To ub
        Safe_MatrixDet = Safe_MatrixDet * A(i, i)
    Next i
 
  Exit Function
 
errH:
    Safe_MatrixDet = Null
 
End Function
 
Public Function Safe_MatrixInv(A As Variant) As Variant
 
  Dim S  As Long
  Dim ub
  Dim V
  Dim W
  Dim le As Long
  Dim x
  Dim ce As Long
  Dim y
 
    On Error GoTo errHandler
    S = MatrixDet(A)
 
    If IsNull(S) Then
        GoTo errHandler
    End If
    If S = 0 Then
        Safe_MatrixInv = Null
        Exit Function
 
    End If
    lb = LBound(A)
    ub = UBound(A)
    ReDim IA(lb To ub, lb To ub) As Variant
    ReDim sm(lb To ub - 1, lb To ub - 1) As Variant
    For V = lb To ub
        For W = lb To ub
            le = 0
            For x = lb To ub - 1
                ce = 0
                For y = lb To ub - 1
 
                    If V = x Then
                        le = 1
                    End If
 
                    If y = W Then
                        ce = 1
                    End If
                    sm(x, y) = A(x + le, y + ce)
                Next y
            Next x
            IA(W, V) = (-1) ^ (W + V) * MatrixDet(sm) / S
        Next W
    Next V
    Safe_MatrixInv = IA()
 
  Exit Function
 
errHandler:
    Safe_MatrixInv = Null
 
End Function
 
Public Function Safe_MatrixMul(ByVal M As Variant, B As Variant) As Variant
 
  Dim i
  Dim j
 
    On Error GoTo han
 
    If Not (IsArray(M)) Then
        GoTo han
    End If
 
    If IsArray(B) Then
        GoTo han
    End If
    For i = LBound(M) To UBound(M)
        For j = LBound(M) To UBound(M)
            M(i, j) = M(i, j) * B
        Next j
    Next i
    Safe_MatrixMul = M
 
  Exit Function
 
han:
    Safe_MatrixMul = Null
 
End Function
 
Public Function Safe_MatrixProd(A As Variant, B As Variant) As Variant
 
  Dim c1
  Dim r2
  Dim r1
  Dim c2
  Dim lb1
  Dim lb
  Dim i
  Dim j
  Dim k
 
    On Error GoTo errHa
 
    If Not (IsArray(A)) Then
        GoTo errHa
    End If
 
    If Not (IsArray(B)) Then
        GoTo errHa
    End If
    c1 = UBound(A, 2)
    r2 = UBound(B, 1)
 
    If c1 <> r2 Then
        GoTo errHa
    End If
    r1 = UBound(A, 1)
    c2 = UBound(B, 2)
    lb1 = LBound(A, 1)
    lb2 = LBound(B, 2)
    lb = LBound(A, 2)
    ReDim C(lb1 To r1, lb2 To c2) As Variant
    For i = lb1 To r1
        For j = lb2 To c2
            C(i, j) = 0
            For k = lb To c1
                C(i, j) = C(i, j) + A(i, k) * B(k, j)
            Next k
        Next j
    Next i
    Safe_MatrixProd = C
 
  Exit Function
 
errHa:
    Safe_MatrixProd = Null
 
End Function
 
Public Function Safe_MatrixSubtratct(A As Variant, B As Variant) As Variant
 
  Dim ub
  Dim i
  Dim j
 
    On Error GoTo notArray
 
    If Not (IsArray(A)) Then
        GoTo notArray
    End If
 
    If Not (IsArray(B)) Then
        GoTo notArray
    End If
    lb = LBound(A)
    ub = UBound(A)
    ReDim C(lb To ub, lb To ub)
 
    For i = lb To ub
        For j = lb To ub
            C(i, j) = A(i, j) - B(i, j)
        Next j
    Next i
    Safe_MatrixSubtratct = C
 
  Exit Function
 
notArray:
    Safe_MatrixSubtratct = Null
 
End Function
 
Public Function Safe_ZeroMatrix(n As Variant, Optional lb As Variant) As Variant
 
  Dim i
  Dim j
 
    On Error GoTo EHA
 
    If IsMissing(lb) Then
        lb = 0
    End If
    ReDim A(lb To n, lb To n)
 
    For i = lb To n
        For j = lb To n
            A(i, j) = 0
        Next j
    Next i
    Safe_ZeroMatrix = A
 
  Exit Function
 
EHA:
    Safe_ZeroMatrix = Null
 
End Function
 
Public Function Similar_Vertices(Vertex1 As D3DVERTEX, Vertex2 As D3DVERTEX, ByVal Offset As Single) As Boolean
 
    If Abs(Vertex1.x - Vertex2.x) > Offset Then
        Exit Function
 
    End If
    If Abs(Vertex1.y - Vertex2.y) > Offset Then
        Exit Function
 
    End If
    If Abs(Vertex1.Z - Vertex2.Z) > Offset Then
        Exit Function
 
    End If
    Similar_Vertices = True
 
  End Function
 
Public Function ThrustA(posX As Single, posY As Single, Speed As Single, Heading As Single, Acceleration As Single, TimeElapsed As Single, Facing As Single)
 
    AddVectors Speed, Heading, Acceleration * TimeElapsed, Facing, Speed, Heading
    posX = posX + (Speed * Time_Elapsed) * Sin(CDbl(Heading))
    posY = posY - (Speed * Time_Elapsed) * Cos(CDbl(Heading))
 
  End Function
 
Public Function Trajectory2D_AirTime(ByVal dblVelocity As Double, ByVal dblAngle As Double, ByVal dblGravity As Double) As Double
 
    Trajectory2D_AirTime = CDbl(((2 * dblVelocity) * (Sin(Degrees_To_Radian(dblAngle)))) / dblGravity)
 
  End Function
 
Public Function Trajectory2D_Apex(ByVal dblVelocity As Double, ByVal dblAngle As Double, ByVal dblGravity As Double) As Double
 
    Trajectory2D_Apex = CDbl((dblVelocity ^ 2 * (Sin(Degrees_To_Radian(dblAngle)) ^ 2)) / (2 * dblGravity))
 
  End Function
 
Public Function Trajectory2D_Range(ByVal dblVelocity As Double, ByVal dblAngle As Double, ByVal dblGravity As Double) As Double
 
    Trajectory2D_Range = CDbl((dblVelocity ^ 2 * (Sin(Degrees_To_Radian(2 * dblAngle)))) / dblGravity)
 
  End Function
 
Public Function Trajectory2D_VeloX(ByVal dblVelocity As Double, ByVal dblAngle As Double) As Double
 
    Trajectory2D_VeloX = CDbl(dblVelocity * Cos(Degrees_To_Radian(dblAngle)))
 
  End Function
 
Public Function Trajectory2D_VeloY(ByVal dblVelocity As Double, ByVal dblAngle As Double) As Double
 
    Trajectory2D_VeloY = CDbl(dblVelocity * Sin(Degrees_To_Radian(dblAngle)))
 
  End Function
 
Public Function Trajectory2D_XPosAtTime(ByVal dblVelocity As Double, ByVal dblAngle As Double, ByVal dblTime As Double) As Double
 
    Trajectory2D_XPosAtTime = CDbl(VeloX(dblVelocity, dblAngle) * dblTime)
 
  End Function
 
Public Function Trajectory2D_YPosAtTime(ByVal dblVelocity As Double, ByVal dblAngle As Double, ByVal dblGravity As Double, ByVal dblTime As Double) As Double
 
    Trajectory2D_YPosAtTime = CDbl((VeloY(dblVelocity, dblAngle) * dblTime) - (0.5 * dblGravity * (dblTime ^ 2)))
 
  End Function
 
Public Function V2_Vector(ByVal x As Single, ByVal y As Single) As D3DVECTOR2
 
    V2_Vector.x = x
    V2_Vector.y = y
 
  End Function
 
Public Function V3_Vector(ByVal x As Single, ByVal y As Single, ByVal Z As Single) As D3DVECTOR
 
    With V3_Vector
        .x = x
        .y = y
        .Z = Z
    End With
 
  End Function
 
Public Function V4_Vector(ByVal x As Single, ByVal y As Single, ByVal Z As Single, ByVal W As Single) As D3DVECTOR4
 
    With V4_Vector
        .x = x
        .y = y
        .Z = Z
        .W = W
    End With
 
  End Function
 
Public Function Vector2_Average(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As D3DVECTOR2
 
    Vector2_Average = Vector2_Add(Vector1, Vector2)
    Vector2_Average.x = Vector2_Average.x / 2
    Vector2_Average.y = Vector2_Average.y / 2
 
  End Function
 
Public Function Vector2_Bary_Centric(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2, Vector3 As D3DVECTOR2, Weight_Factor_F As Single, Weight_Factor_G As Single) As Long
 
    Vector2_Bary_Centric = D3DXVec2BaryCentric(Destination_Vector, Vector1, Vector2, Vector3, Weight_Factor_F, Weight_Factor_G)
 
  End Function
 
Public Function Vector2_Catmull_Rom(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2, Vector3 As D3DVECTOR2, Vector4 As D3DVECTOR2, Weight_Factor_S As Single) As Long
 
    Vector2_Catmull_Rom = D3DXVec2CatmullRom(Destination_Vector, Vector1, Vector2, Vector3, Vector4, Weight_Factor_S)
 
  End Function
 
Public Function Vector2_CCW(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As Single
 
    Vector2_CCW = D3DXVec2CCW(Vector1, Vector2)
 
  End Function
 
Public Function Vector2_Divide(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As D3DVECTOR2
 
    Vector2_Divide.x = Vector1.x / Vector2.x
    Vector2_Divide.y = Vector1.y / Vector2.y
 
  End Function
 
Public Function Vector2_Hermit(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Tangent_Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2, Tangent_Vector2 As D3DVECTOR2, Weight_Factor_S As Single) As Long
 
    Vector2_Hermit = D3DXVec2Hermite(Destination_Vector, Vector1, Tangent_Vector1, Vector2, Tangent_Vector2, Weight_Factor_S)
 
  End Function
 
Public Function Vector2_Length_Squared(Vector As D3DVECTOR2) As Single
 
    Vector2_Length_Squared = D3DXVec2LengthSq(Vector)
 
  End Function
 
Public Function Vector2_Lerp(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2, S As Single) As Long
 
    Vector2_Lerp = D3DXVec2Lerp(Destination_Vector, Vector1, Vector2, S)
 
  End Function
 
Public Function Vector2_Maximize(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As Long
 
    Vector2_Maximize = D3DXVec2Maximize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector2_Minimize(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As Long
 
    Vector2_Minimize = D3DXVec2Minimize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector2_Multiply(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2) As D3DVECTOR2
 
    Vector2_Multiply.x = Vector1.x * Vector2.x
    Vector2_Multiply.y = Vector1.y * Vector2.y
 
  End Function
 
Public Function Vector2_Nearly_Equal(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2, Radius As Single) As Boolean
 
  Dim Diff As D3DVECTOR2
 
    Vector2_Nearly_Equal = (Vector2_Dot_Product(Vector1, Vector2) < Radius * Radius)
 
  End Function
 
Public Function Vector2_Swap(Vector1 As D3DVECTOR2, Vector2 As D3DVECTOR2)
 
  Dim tmpVec As D3DVECTOR2
 
    tmpVec = Vector1
    Vector1 = Vector2
    Vector2 = tmpVec
 
  End Function
 
Public Function Vector2_Transform_Coord(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Matrix As D3DMATRIX) As Long
 
    Vector2_Transform_Coord = D3DXVec2TransformCoord(Destination_Vector, Vector1, Matrix)
 
  End Function
 
Public Function Vector2_Transform_Normal(Destination_Vector As D3DVECTOR2, Vector1 As D3DVECTOR2, Matrix As D3DMATRIX) As Long
 
    Vector2_Transform_Normal = D3DXVec2TransformNormal(Destination_Vector, Vector1, Matrix)
 
  End Function
 
Public Function Vector3_Average(Vector1 As D3DVECTOR, Vector2 As D3DVECTOR) As D3DVECTOR
 
    Vector3_Average = Vector3_Add(Vector1, Vector2)
 
    With Vector3_Average
        .x = .x / 2
        .y = .y / 2
        .Z = .Z / 2
    End With
 
  End Function
 
Public Function Vector3_Bary_Centric(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Vector2 As D3DVECTOR, Vector3 As D3DVECTOR, Weight_Factor_F As Single, Weight_Factor_G As Single) As Long
 
    Vector3_Bary_Centric = D3DXVec3BaryCentric(Destination_Vector, Vector1, Vector2, Vector3, Weight_Factor_F, Weight_Factor_G)
 
  End Function
 
Public Function Vector3_Catmull_Rom(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Vector2 As D3DVECTOR, Vector3 As D3DVECTOR, Vector4 As D3DVECTOR, Weight_Factor_S As Single) As Long
 
    Vector3_Catmull_Rom = D3DXVec3CatmullRom(Destination_Vector, Vector1, Vector2, Vector3, Vector4, Weight_Factor_S)
 
  End Function
 
Public Function Vector3_Divide(Vector1 As D3DVECTOR, Vector2 As D3DVECTOR) As D3DVECTOR
 
    With Vector3_Divide
        .x = Vector1.x / Vector2.x
        .y = Vector1.y / Vector2.y
        .Z = Vector1.Z / Vector2.Z
    End With
 
  End Function
 
Public Function Vector3_Hermit(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Tangent_Vector1 As D3DVECTOR, Vector2 As D3DVECTOR, Tangent_Vector2 As D3DVECTOR, Weight_Factor_S As Single) As Long
 
    Vector3_Hermit = D3DXVec3Hermite(Destination_Vector, Vector1, Tangent_Vector1, Vector2, Tangent_Vector2, Weight_Factor_S)
 
  End Function
 
Public Function Vector3_Length_Squared(Vector As D3DVECTOR) As Single
 
    Vector3_Length_Squared = D3DXVec3LengthSq(Vector)
 
  End Function
 
Public Function Vector3_Lerp(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Vector2 As D3DVECTOR, S As Single) As Long
 
    Vector3_Lerp = D3DXVec3Lerp(Destination_Vector, Vector1, Vector2, S)
 
  End Function
 
Public Function Vector3_Maximize(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Vector2 As D3DVECTOR) As Long
 
    Vector3_Maximize = D3DXVec3Maximize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector3_Minimize(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Vector2 As D3DVECTOR) As Long
 
    Vector3_Minimize = D3DXVec3Minimize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector3_Multiply(Vector1 As D3DVECTOR, Vector2 As D3DVECTOR) As D3DVECTOR
 
    With Vector3_Multiply
        .x = Vector1.x * Vector2.x
        .y = Vector1.y * Vector2.y
        .Z = Vector1.Z * Vector2.Z
    End With
 
  End Function
 
Public Function Vector3_Nearly_Equal(Vector1 As D3DVECTOR, Vector2 As D3DVECTOR, Radius As Single) As Boolean
 
  Dim Diff As D3DVECTOR
 
    With Diff
        .x = Vector1.x - Vector2.x
        .y = Vector1.y - Vector2.y
        .Z = Vector1.Z - Vector2.Z
    End With
    Vector3_Nearly_Equal = (Vector3_Dot_Product(Vector1, Vector2) < Radius * Radius)
 
  End Function
 
Public Function Vector3_Project(Destination_Vector As D3DVECTOR, Vector As D3DVECTOR, Viewport As D3DVIEWPORT8, Projection As D3DMATRIX, View As D3DMATRIX, World As D3DMATRIX) As Long
 
    Vector3_Project = D3DXVec3Project(Destination_Vector, Vector, Viewport, Projection, View, World)
 
  End Function
 
Public Function Vector3_Swap(Vector1 As D3DVECTOR, Vector2 As D3DVECTOR)
 
  Dim tmpVec As D3DVECTOR
 
    tmpVec = Vector1
    Vector1 = Vector2
    Vector2 = tmpVec
 
  End Function
 
Public Function Vector3_Transform_Coord(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Matrix As D3DMATRIX) As Long
 
    Vector3_Transform_Coord = D3DXVec3TransformCoord(Destination_Vector, Vector1, Matrix)
 
  End Function
 
Public Function Vector3_Transform_Normal(Destination_Vector As D3DVECTOR, Vector1 As D3DVECTOR, Matrix As D3DMATRIX) As Long
 
    Vector3_Transform_Normal = D3DXVec3TransformNormal(Destination_Vector, Vector1, Matrix)
 
  End Function
 
Public Function Vector3_Unproject(Destination_Vector As D3DVECTOR, Vector As D3DVECTOR, Viewport As D3DVIEWPORT8, Projection As D3DMATRIX, View As D3DMATRIX, World As D3DMATRIX) As Long
 
    Vector3_Unproject = D3DXVec3Unproject(Destination_Vector, Vector, Viewport, Projection, View, World)
 
  End Function
 
Public Function Vector4_Average(Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4) As D3DVECTOR4
 
    Vector4_Average = Vector4_Add(Vector1, Vector2)
 
    With Vector4_Average
        .x = .x / 2
        .y = .y / 2
        .Z = .Z / 2
        .W = .W / 2
    End With
 
  End Function
 
Public Function Vector4_Bary_Centric(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4, Vector3 As D3DVECTOR4, Weight_Factor_F As Single, Weight_Factor_G As Single) As Long
 
    Vector4_Bary_Centric = D3DXVec4BaryCentric(Destination_Vector, Vector1, Vector2, Vector3, Weight_Factor_F, Weight_Factor_G)
 
  End Function
 
Public Function Vector4_Catmull_Rom(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4, Vector3 As D3DVECTOR4, Vector4 As D3DVECTOR4, Weight_Factor_S As Single) As Long
 
    Vector4_Catmull_Rom = D3DXVec4CatmullRom(Destination_Vector, Vector1, Vector2, Vector3, Vector4, Weight_Factor_S)
 
  End Function
 
Public Function Vector4_Cross_Product(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4, Vector3 As D3DVECTOR4) As Long
 
    Vector4_Cross_Product = D3DXVec4Cross(Destination_Vector, Vector1, Vector2, Vector3)
 
  End Function
 
Public Function Vector4_Divide(Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4) As D3DVECTOR4
 
    With Vector4_Divide
        .x = Vector1.x / Vector2.x
        .y = Vector1.y / Vector2.y
        .Z = Vector1.Z / Vector2.Z
        .W = Vector1.W / Vector2.W
    End With
 
  End Function
 
Public Function Vector4_Hermit(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR, Tangent_Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR, Tangent_Vector2 As D3DVECTOR4, Weight_Factor_S As Single) As Long
 
    Vector4_Hermit = D3DXVec4Hermite(Destination_Vector, Vector1, Tangent_Vector1, Vector2, Tangent_Vector2, Weight_Factor_S)
 
  End Function
 
Public Function Vector4_Length_Squared(Vector As D3DVECTOR4) As Single
 
    Vector4_Length_Squared = D3DXVec4LengthSq(Vector)
 
  End Function
 
Public Function Vector4_Lerp(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4, S As Single) As Long
 
    Vector4_Lerp = D3DXVec4Lerp(Destination_Vector, Vector1, Vector2, S)
 
  End Function
 
Public Function Vector4_Maximize(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4) As Long
 
    Vector4_Maximize = D3DXVec4Maximize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector4_Minimize(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4) As Long
 
    Vector4_Minimize = D3DXVec4Minimize(Destination_Vector, Vector1, Vector2)
 
  End Function
 
Public Function Vector4_Multiply(Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4) As D3DVECTOR4
 
    With Vector4_Multiply
        .x = Vector1.x * Vector2.x
        .y = Vector1.y * Vector2.y
        .Z = Vector1.Z * Vector2.Z
        .W = Vector1.W * Vector2.W
    End With
 
  End Function
 
Public Function Vector4_Nearly_Equal(Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4, Radius As Single) As Boolean
 
  Dim Diff As D3DVECTOR4
 
    With Diff
        .x = Vector1.x - Vector2.x
        .y = Vector1.y - Vector2.y
        .Z = Vector1.Z - Vector2.Z
        .W = Vector1.W - Vector2.W
    End With
    Vector4_Nearly_Equal = (Vector4_Dot_Product(Vector1, Vector2) < Radius * Radius)
 
  End Function
 
Public Function Vector4_Swap(Vector1 As D3DVECTOR4, Vector2 As D3DVECTOR4)
 
  Dim tmpVec As D3DVECTOR4
 
    tmpVec = Vector1
    Vector1 = Vector2
    Vector2 = tmpVec
 
  End Function
 
Public Function Vector4_Transform(Destination_Vector As D3DVECTOR4, Vector1 As D3DVECTOR4, Matrix As D3DMATRIX) As Long
 
    Vector4_Transform = D3DXVec4Transform(Destination_Vector, Vector1, Matrix)
 
  End Function
 
Public Function vecXposA(posX As Single, ByVal Speed As Single, ByVal Time_Elapsed As Single, ByVal Heading As Single) As Single
 
    posX = posX + (Speed * Time_Elapsed) * Sin(CDbl(Heading))
 
  End Function
 
wiki/ggolemgprjmathy.txt · Last modified: 2009/02/18 21:11