mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 04:49:39 -10:00
Two related fixes flagged by an audit of vm_vector_2_matrix_norm callers: ParticleEffectAction: locals.direction defaulted to vmd_zero_vector, which would trip vm_vector_2_matrix_norm's unit-length assertion (and divide by zero in release) when an action program emitted a particle effect without first running a Set Direction action. Default to vmd_z_vector so the unset-direction path always feeds a unit vector. matrix_h / Lua orientation type: the element indexer (m[1..9] = x) wrote arbitrary floats straight into mtx.a1d[idx] and the resulting non-orthonormal matrix could flow into obj->orient via the Orientation virt-vars on object/modelinstance/subsystem, breaking downstream engine code that assumes the basis vectors are unit length. getInterpolated had the same problem by design (pure linear interp, no normalization). Adds a fourth MatrixState, NeedsOrthonormalize, which the indexer setter and getInterpolated use to flag their output. ValidateMatrix and ValidateAngles now call vm_orthogonalize_matrix when they observe that state, so any consumer that reads through GetMatrix/GetAngles gets a valid orientation without each call site needing its own guard. getInterpolated is also marked ADE_FUNC_DEPRECATED at FSO 26.0 in favor of rotationalInterpolate; mods targeting older versions keep the legacy linear blend (now safely orthonormalized on use).
59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
//
|
|
//
|
|
|
|
#ifndef FS2_OPEN_VECMATH_H
|
|
#define FS2_OPEN_VECMATH_H
|
|
|
|
#include "globalincs/pstypes.h"
|
|
#include "scripting/ade.h"
|
|
#include "scripting/ade_api.h"
|
|
#include "math/vecmat.h"
|
|
|
|
namespace scripting {
|
|
namespace api {
|
|
|
|
DECLARE_ADE_OBJ(l_Vector, vec3d);
|
|
|
|
//WMC - Due to the exorbitant times required to store matrix data,
|
|
//I initially store the matrix in this struct.
|
|
enum class MatrixState {
|
|
Fine,
|
|
MatrixOutOfDate,
|
|
AnglesOutOfDate,
|
|
NeedsOrthonormalize // matrix is not orthonormal; orthogonalize before use; angles are also stale
|
|
};
|
|
struct matrix_h {
|
|
private:
|
|
MatrixState status;
|
|
|
|
matrix mtx;
|
|
angles ang;
|
|
|
|
//WMC - Call these to make sure what you want
|
|
//is up to date
|
|
void ValidateAngles();
|
|
|
|
void ValidateMatrix();
|
|
public:
|
|
matrix_h();
|
|
explicit matrix_h(const matrix* in);
|
|
explicit matrix_h(const angles* in);
|
|
explicit matrix_h(const vec3d *fvec, const vec3d *uvec = nullptr, const vec3d *rvec = nullptr);
|
|
|
|
angles* GetAngles();
|
|
|
|
matrix* GetMatrix();
|
|
|
|
void SetStatus(MatrixState n_status);
|
|
|
|
static void serialize(lua_State* /*L*/, const scripting::ade_table_entry& /*tableEntry*/, const luacpp::LuaValue& value, ubyte* data, int& packet_size);
|
|
static void deserialize(lua_State* /*L*/, const scripting::ade_table_entry& /*tableEntry*/, char* data_ptr, ubyte* data, int& offset);
|
|
};
|
|
|
|
DECLARE_ADE_OBJ(l_Matrix, matrix_h);
|
|
|
|
}
|
|
}
|
|
|
|
#endif //FS2_OPEN_VECMATH_H
|