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