From 3c7741b3487427536beec14a88866ad8ee38ae86 Mon Sep 17 00:00:00 2001 From: Stentorious <124759154+Stentorious@users.noreply.github.com> Date: Sat, 23 May 2026 19:13:54 -0400 Subject: [PATCH] Add dot product functions --- nvse/Algohol/algMath.cpp | 7 ++++++- nvse/Algohol/algMath.h | 2 ++ nvse/Algohol/paramTypes.cpp | 23 +++++++++++++++++++++++ nvse/Algohol/paramTypes.h | 4 +++- nvse/nvse/CommandTable.cpp | 2 ++ nvse/nvse/commands_Algohol.cpp | 26 ++++++++++++++++++++++++++ nvse/nvse/commands_Algohol.h | 2 ++ 7 files changed, 64 insertions(+), 2 deletions(-) diff --git a/nvse/Algohol/algMath.cpp b/nvse/Algohol/algMath.cpp index ab8bc17d..34a233df 100644 --- a/nvse/Algohol/algMath.cpp +++ b/nvse/Algohol/algMath.cpp @@ -15,6 +15,11 @@ void V3Normalize( Vector3 &v ) v.z *= len; } +float V3Dotproduct( Vector3 va, Vector3 vb ) +{ + return va.x * vb.x + va.y * vb.y + va.z * vb.z; +} + Vector3 V3Crossproduct( Vector3 va, Vector3 vb ) { Vector3 out; @@ -119,7 +124,7 @@ Quat slerp( Quat q1, Quat q2, float t ) return q1 * 0.5f + q2 * 0.5f; float ratioA = sinf( ( 1.0f - t ) * halfTheta ) / sinHalfTheta; - float ratioB = sinf( t * halfTheta ) / sinHalfTheta; + float ratioB = sinf( t * halfTheta ) / sinHalfTheta; return q1 * ratioA + q2 * ratioB; } diff --git a/nvse/Algohol/algMath.h b/nvse/Algohol/algMath.h index bd0291ae..9a94df72 100644 --- a/nvse/Algohol/algMath.h +++ b/nvse/Algohol/algMath.h @@ -3,10 +3,12 @@ void V3Normalize( Vector3 &v ); Vector3 V3Crossproduct( Vector3 va, Vector3 vb ); +float V3Dotproduct( Vector3 va, Vector3 vb ); Quat fromEuler( Euler e, int flag ); Quat fromAxisAngle( Vector3 axis, float angle ); Quat nlerp( Quat q1, Quat q2, float t ); Quat slerp( Quat q1, Quat q2, float t ); +float QDotproduct( Quat q1, Quat q2 ); Euler fromQuat( Quat q, int flag ); \ No newline at end of file diff --git a/nvse/Algohol/paramTypes.cpp b/nvse/Algohol/paramTypes.cpp index e80c6869..54dfbeaa 100644 --- a/nvse/Algohol/paramTypes.cpp +++ b/nvse/Algohol/paramTypes.cpp @@ -233,3 +233,26 @@ ParamInfo kParams_ThreeScriptVars_FourFloats_OneOptionalInt[8] = { "Float", kParamType_Float, 0 }, { "flag", kParamType_Integer, 1 } }; + + +ParamInfo kParams_SixFloats[6] = +{ + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 } +}; + +ParamInfo kParams_EightFloats[8] = +{ + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 }, + { "Float", kParamType_Float, 0 } +}; \ No newline at end of file diff --git a/nvse/Algohol/paramTypes.h b/nvse/Algohol/paramTypes.h index 2e5f88df..306b6837 100644 --- a/nvse/Algohol/paramTypes.h +++ b/nvse/Algohol/paramTypes.h @@ -18,4 +18,6 @@ extern ParamInfo kParams_FourScriptVars_FourFloats[8]; extern ParamInfo kParams_FourScriptVars_EightFloats[12]; extern ParamInfo kParams_ThreeScriptVars_SevenFloats[10]; extern ParamInfo kParams_FourScriptVars_NineFloats_OneOptionalInt[14]; -extern ParamInfo kParams_ThreeScriptVars_FourFloats_OneOptionalInt[8]; \ No newline at end of file +extern ParamInfo kParams_ThreeScriptVars_FourFloats_OneOptionalInt[8]; +extern ParamInfo kParams_SixFloats[6]; +extern ParamInfo kParams_EightFloats[8]; \ No newline at end of file diff --git a/nvse/nvse/CommandTable.cpp b/nvse/nvse/CommandTable.cpp index fd7f4d62..44594be0 100644 --- a/nvse/nvse/CommandTable.cpp +++ b/nvse/nvse/CommandTable.cpp @@ -2305,6 +2305,8 @@ void CommandTable::AddCommandsV6() ADD_CMD(QInterpolateEx); ADD_CMD(QToEulerEx); ADD_CMD(GetUIFloatInherited); + ADD_CMD(V3DotproductEx); + ADD_CMD(QDotproductEx); } namespace PluginAPI diff --git a/nvse/nvse/commands_Algohol.cpp b/nvse/nvse/commands_Algohol.cpp index c3091935..0c9f4943 100644 --- a/nvse/nvse/commands_Algohol.cpp +++ b/nvse/nvse/commands_Algohol.cpp @@ -87,6 +87,19 @@ bool Cmd_V3NormalizeEx_Execute( COMMAND_ARGS ) return true; }*/ +bool Cmd_V3DotproductEx_Execute( COMMAND_ARGS ) +{ + *result = 0; + Vector3 v1, v2; + + if (ExtractArgsEx(EXTRACT_ARGS_EX, &v1.x, &v1.y, &v1.z, &v2.x, &v2.y, &v2.z)) + { + *result = V3Dotproduct( v1, v2 ); + } + + return true; +} + bool Cmd_V3Crossproduct_Execute( COMMAND_ARGS ) { char vector_x_name[VBUFSIZ], vector_y_name[VBUFSIZ], vector_z_name[VBUFSIZ]; @@ -406,3 +419,16 @@ bool Cmd_QToEulerEx_Execute( COMMAND_ARGS ) } return true; } + +bool Cmd_QDotproductEx_Execute( COMMAND_ARGS ) +{ + *result = 0; + Quat q1, q2; + + if (ExtractArgsEx(EXTRACT_ARGS_EX, &q1.w, &q1.x, &q1.y, &q1.z, &q2.w, &q2.x, &q2.y, &q2.z)) + { + *result = QDotproduct( q1, q2 ); + } + + return true; +} \ No newline at end of file diff --git a/nvse/nvse/commands_Algohol.h b/nvse/nvse/commands_Algohol.h index f82400f7..8a0b7c8b 100644 --- a/nvse/nvse/commands_Algohol.h +++ b/nvse/nvse/commands_Algohol.h @@ -25,3 +25,5 @@ DEFINE_CMD_ALT(QMultQuatQuatEx, QMultQEx, Multiplies two quaternions, 0, 12, kPa DEFINE_CMD_ALT(QMultQuatVector3Ex, QMultV3Ex, Multiplies vector3 by quaternion, 0, 10, kParams_ThreeScriptVars_SevenFloats); DEFINE_CMD_ALT(QInterpolateEx, QIntEx, Interpolates between two quaternions, 0, 14, kParams_FourScriptVars_NineFloats_OneOptionalInt); DEFINE_CMD_ALT(QToEulerEx, QToEEx, Converts quaternion to euler angles, 0, 8, kParams_ThreeScriptVars_FourFloats_OneOptionalInt); +DEFINE_CMD_ALT(V3DotproductEx, V3DotEx, Returns dotproduct of two vectors, 0, 6, kParams_SixFloats); +DEFINE_CMD_ALT(QDotproductEx, QDotEx, Returns dotproduct of two quaternions, 0, 8, kParams_EightFloats);