mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-25 01:14:19 +00:00
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:
41
LEGO1/realtime/realtime.cpp
Normal file
41
LEGO1/realtime/realtime.cpp
Normal 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
13
LEGO1/realtime/realtime.h
Normal 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
|
||||
46
LEGO1/realtime/realtimeview.cpp
Normal file
46
LEGO1/realtime/realtimeview.cpp
Normal 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;
|
||||
}
|
||||
14
LEGO1/realtime/realtimeview.h
Normal file
14
LEGO1/realtime/realtimeview.h
Normal 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
|
||||
Reference in New Issue
Block a user