implement/match CalcLocalTransform (#241)

* implement/match CalcLocalTransform

* fix odd build error

* address feedback

move vec.h to thirdparty folder
update vec.h
move all realtime code to realtime folder
move calclocaltransform out of legoutil and into realtime
cast shift to MxS32
add additional unroll hack to CalcLocalTransform to prevent msvc entropy
This commit is contained in:
Ramen2X
2023-10-24 08:27:24 -04:00
committed by GitHub
parent 1ab29590ee
commit 74329d681b
9 changed files with 1150 additions and 4 deletions

View File

@@ -0,0 +1,41 @@
#include "realtime.h"
// OFFSET: LEGO1 0x100a5b40
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
const MxVector3 &p_upVec, MxMatrix &p_outMatrix)
{
MxFloat x_axis[3], y_axis[3], z_axis[3];
// This is an unrolled version of the "NORMVEC3" macro,
// used here to apply a silly hack to get a 100% match
{
const MxFloat dirVec1Operation = (p_dirVec)[1] * (p_dirVec)[1];
MxDouble len = sqrt(((p_dirVec)[0] * (p_dirVec)[0] + dirVec1Operation + (p_dirVec)[2] * (p_dirVec)[2]));
((z_axis)[0] = (p_dirVec)[0] / (len), (z_axis)[1] = (p_dirVec)[1] / (len), (z_axis)[2] = (p_dirVec)[2] / (len));
}
NORMVEC3(y_axis, p_upVec)
VXV3(x_axis, y_axis, z_axis);
// Exact same thing as pointed out by the above comment
{
const MxFloat axis2Operation = (x_axis)[2] * (x_axis)[2];
MxDouble len = sqrt(((x_axis)[0] * (x_axis)[0] + axis2Operation + (x_axis)[1] * (x_axis)[1]));
((x_axis)[0] = (x_axis)[0] / (len), (x_axis)[1] = (x_axis)[1] / (len), (x_axis)[2] = (x_axis)[2] / (len));
}
VXV3(y_axis, z_axis, x_axis);
// Again, the same thing
{
const MxFloat axis2Operation = (y_axis)[2] * (y_axis)[2];
MxDouble len = sqrt(((y_axis)[0] * (y_axis)[0] + axis2Operation + (y_axis)[1] * (y_axis)[1]));
((y_axis)[0] = (y_axis)[0] / (len), (y_axis)[1] = (y_axis)[1] / (len), (y_axis)[2] = (y_axis)[2] / (len));
}
SET4from3(&p_outMatrix[0], x_axis, 0);
SET4from3(&p_outMatrix[4], y_axis, 0);
SET4from3(&p_outMatrix[8], z_axis, 0);
SET4from3(&p_outMatrix[12], p_posVec, 1);
}

13
LEGO1/realtime/realtime.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef REALTIME_H
#define REALTIME_H
#include "../mxmatrix.h"
#define NORMVEC3(dst, src) { \
MxDouble len = sqrt(NORMSQRD3(src)); \
VDS3(dst, src, len); }
void CalcLocalTransform(const MxVector3 &p_posVec, const MxVector3 &p_dirVec,
const MxVector3 &p_upVec, MxMatrix &p_outMatrix);
#endif // REALTIME_H

View File

@@ -0,0 +1,46 @@
#include "realtimeview.h"
#include <math.h>
// 0x10109598
float g_userMaxLodPower;
// 0x10101044
float g_userMaxBase = 4.0f;
// 0x10101048
float g_userMaxLod = 3.6f;
// 0x1010104c
float g_partsThreshold = 1000.0f;
// OFFSET: LEGO1 0x100a5e00
float RealtimeView::GetUserMaxLOD()
{
// TODO
return 0;
}
// OFFSET: LEGO1 0x100a5e10
float RealtimeView::GetPartsThreshold()
{
return g_partsThreshold;
}
// OFFSET: LEGO1 100a5e20
void RealtimeView::UpdateMaxLOD()
{
g_userMaxLodPower = pow(g_userMaxBase, -g_userMaxLod);
}
// OFFSET: LEGO1 0x100a5de0
void RealtimeView::SetUserMaxLOD(float p_lod)
{
g_userMaxLod = p_lod;
UpdateMaxLOD();
}
// OFFSET: LEGO1 0x100a5df0
void RealtimeView::SetPartsThreshold(float p_threshold)
{
g_partsThreshold = p_threshold;
}

View File

@@ -0,0 +1,14 @@
#ifndef REALTIMEVIEW_H
#define REALTIMEVIEW_H
class RealtimeView
{
public:
__declspec(dllexport) static float GetPartsThreshold();
__declspec(dllexport) static float GetUserMaxLOD();
__declspec(dllexport) static void SetPartsThreshold(float);
static void UpdateMaxLOD();
__declspec(dllexport) static void SetUserMaxLOD(float);
};
#endif // REALTIMEVIEW_H