object-light OK

This commit is contained in:
LagoLunatic
2024-09-10 02:08:34 -04:00
parent 0bea3955d3
commit a1bd36d0c5
7 changed files with 211 additions and 58 deletions
+1 -1
View File
@@ -694,7 +694,7 @@ config.libs = [
Object(Matching, "JSystem/JStudio/JStudio_JStage/object-ambientlight.cpp"),
Object(NonMatching, "JSystem/JStudio/JStudio_JStage/object-camera.cpp"),
Object(Matching, "JSystem/JStudio/JStudio_JStage/object-fog.cpp"),
Object(NonMatching, "JSystem/JStudio/JStudio_JStage/object-light.cpp"),
Object(Matching, "JSystem/JStudio/JStudio_JStage/object-light.cpp"),
],
),
JSystemLib(
+5
View File
@@ -7,6 +7,11 @@
namespace JStage {
enum TELight {
TELIGHT_Unk0 = 0,
TELIGHT_Unk1 = 1,
TELIGHT_Unk2 = 2,
TELIGHT_Unk3 = 3,
kLightMax = 0xFFFFFFFF,
};
@@ -5,13 +5,14 @@
#include "JSystem/JStudio/JStudio/stb.h"
#include "dolphin/gx/GX.h"
#include "dolphin/mtx/vec.h"
#include "dolphin/mtx/mtxvec.h"
namespace JStudio {
struct TObject;
struct TCreateObject {
TCreateObject() {}
virtual ~TCreateObject() = 0;
virtual bool create(TObject**, JStudio::stb::data::TParse_TBlock_object const&) = 0;
virtual bool create(TObject**, stb::data::TParse_TBlock_object const&) = 0;
/* 0x4 */ JGadget::TLinkListNode mNode;
}; // Size: 0xC
@@ -20,9 +21,9 @@ struct TFactory : public stb::TFactory {
TFactory() {}
virtual ~TFactory();
virtual TObject* create(JStudio::stb::data::TParse_TBlock_object const&);
virtual TObject* create(stb::data::TParse_TBlock_object const&);
void appendCreateObject(JStudio::TCreateObject*);
void appendCreateObject(TCreateObject*);
/* 0x04 */ JGadget::TLinkList<TCreateObject, -4> mList;
/* 0x10 */ fvb::TFactory fvb_Factory;
@@ -33,7 +34,10 @@ public:
struct TTransform_position {
Vec mPosition;
};
struct TTransform_position_direction {};
struct TTransform_position_direction {
Vec mPosition; // _00
Vec mDirection; // _0C
};
struct TTransform_translation_rotation {};
struct TTransform_translation_rotation_scaling {};
@@ -42,7 +46,7 @@ public:
void transformOnSet_setOrigin(const Vec&, f32);
void transformOnGet_setOrigin(const Vec&, f32);
void setFactory(JStudio::TFactory* factory) {
void setFactory(TFactory* factory) {
stb::TFactory* stb_factory = factory;
fvb::TFactory* fvb_factory = factory == NULL ? NULL : &factory->fvb_Factory;
stb::TControl::setFactory(stb_factory);
@@ -104,31 +108,47 @@ public:
return obj->referFunctionValue();
}
const TTransform_position_direction* transformOnGet_transform_ifEnabled(const TTransform_position_direction& posDir, TTransform_position_direction* transformedPosDir) const {
if (!transformOnGet_isEnabled()) {
return &posDir;
} else {
transformOnGet_transform(posDir, transformedPosDir);
return transformedPosDir;
}
}
void transformOnGet_transform(const TTransform_position_direction& posDir, TTransform_position_direction* transformedPosDir) const {
transformOnGet_transformTranslation(posDir.mPosition, &transformedPosDir->mPosition);
transformOnGet_transformDirection(posDir.mDirection, &transformedPosDir->mDirection);
}
void transformOnGet_transformTranslation(const Vec& pos, Vec* transformedPos) const {
MTXMultVec(transformOnGet_getMatrix(), &pos, transformedPos);
}
void transformOnGet_transformDirection(const Vec& dir, Vec* transformedDir) const {
MTXMultVecSR(transformOnGet_getMatrix(), &dir, transformedDir);
}
// TODO
void fvb_getObjectContainer() const {}
void fvb_referControl() {}
void fvb_removeObject_all() {}
void stb_getObjectContainer() const {}
void stb_referObjectContainer() {}
void stb_removeObject(JStudio::TObject*) {}
void transformOnGet_transform(const JStudio::TControl::TTransform_position&, JStudio::TControl::TTransform_position*) const {}
void transformOnGet_transform(const JStudio::TControl::TTransform_position_direction&, JStudio::TControl::TTransform_position_direction*) const {}
void transformOnGet_transform(const JStudio::TControl::TTransform_translation_rotation&, JStudio::TControl::TTransform_translation_rotation*) const {}
void transformOnGet_transformDirection(const Vec&, Vec*) const {}
void stb_removeObject(TObject*) {}
void transformOnGet_transform(const TTransform_position&, TTransform_position*) const {}
void transformOnGet_transform(const TTransform_translation_rotation&, TTransform_translation_rotation*) const {}
void transformOnGet_transformRotation(const Vec&, Vec*) const {}
void transformOnGet_transformTranslation(const Vec&, Vec*) const {}
void transformOnGet_transform_ifEnabled(const JStudio::TControl::TTransform_position_direction&, JStudio::TControl::TTransform_position_direction*) const {}
void transformOnGet_transform_ifEnabled(const JStudio::TControl::TTransform_translation_rotation&, JStudio::TControl::TTransform_translation_rotation*) const {}
void transformOnSet_transform(const JStudio::TControl::TTransform_position&, JStudio::TControl::TTransform_position*) const {}
void transformOnSet_transform(const JStudio::TControl::TTransform_position_direction&, JStudio::TControl::TTransform_position_direction*) const {}
void transformOnSet_transform(const JStudio::TControl::TTransform_translation_rotation&, JStudio::TControl::TTransform_translation_rotation*) const {}
void transformOnGet_transform_ifEnabled(const TTransform_translation_rotation&, TTransform_translation_rotation*) const {}
void transformOnSet_transform(const TTransform_position&, TTransform_position*) const {}
void transformOnSet_transform(const TTransform_position_direction&, TTransform_position_direction*) const {}
void transformOnSet_transform(const TTransform_translation_rotation&, TTransform_translation_rotation*) const {}
void transformOnSet_transform(CMtxP, MtxP) const {}
void transformOnSet_transformDirection(const Vec&, Vec*) const {}
void transformOnSet_transformDirection_ifEnabled(const Vec&, Vec*) const {}
void transformOnSet_transformRotation(const Vec&, Vec*) const {}
void transformOnSet_transformTranslation(const Vec&, Vec*) const {}
void transformOnSet_transformTranslation_ifEnabled(const Vec&, Vec*) const {}
void transformOnSet_transform_ifEnabled(const JStudio::TControl::TTransform_position_direction&, JStudio::TControl::TTransform_position_direction*) const {}
void transformOnSet_transform_ifEnabled(const JStudio::TControl::TTransform_translation_rotation&, JStudio::TControl::TTransform_translation_rotation*) const {}
void transformOnSet_transform_ifEnabled(const TTransform_position_direction&, TTransform_position_direction*) const {}
void transformOnSet_transform_ifEnabled(const TTransform_translation_rotation&, TTransform_translation_rotation*) const {}
void transformOnSet_transform_ifEnabled(CMtxP, MtxP) const {}
/* 0x58 */ f64 mSecondPerFrame;
@@ -144,12 +164,12 @@ public:
};
struct TParse : public stb::TParse {
TParse(JStudio::TControl*);
bool parseBlock_block_fvb_(JStudio::stb::data::TParse_TBlock const&, u32);
TParse(TControl*);
bool parseBlock_block_fvb_(stb::data::TParse_TBlock const&, u32);
virtual ~TParse();
virtual bool parseHeader(JStudio::stb::data::TParse_THeader const&, u32);
virtual bool parseBlock_block(JStudio::stb::data::TParse_TBlock const&, u32);
virtual bool parseHeader(stb::data::TParse_THeader const&, u32);
virtual bool parseBlock_block(stb::data::TParse_TBlock const&, u32);
TControl* getControl() { return (TControl*)stb::TParse::getControl(); }
@@ -339,6 +339,20 @@ struct TObject_fog : public TObject {
};
struct TAdaptor_light : public TAdaptor {
enum TEVariableValue {
TE_VALUE_NONE = -1,
TE_VALUE_7 = 7,
TE_VALUE_8 = 8,
TE_VALUE_9 = 9,
TE_VALUE_10 = 10,
TE_VALUE_11 = 11,
};
enum TEDirection_ {
DIRECTION_0,
DIRECTION_1,
DIRECTION_2,
};
TAdaptor_light()
: TAdaptor(mValue, ARRAY_SIZE(mValue))
, mValue()
@@ -356,9 +370,9 @@ struct TAdaptor_light : public TAdaptor {
/* 0x10 */ TVariableValue mValue[13];
static u8 const sauVariableValue_3_COLOR_RGB[12];
static u8 const sauVariableValue_4_COLOR_RGBA[16];
static u8 const sauVariableValue_3_POSITION_XYZ[12];
static u8 const sauVariableValue_3_TARGET_POSITION_XYZ[12];
static u32 const sauVariableValue_4_COLOR_RGBA[4];
static u32 const sauVariableValue_3_POSITION_XYZ[3];
static u32 const sauVariableValue_3_TARGET_POSITION_XYZ[3];
static u8 sauVariableValue_2_DIRECTION_THETA_PHI[8];
};
@@ -175,9 +175,23 @@ struct TAdaptor_fog : public JStudio::TAdaptor_fog {
}; // Size: 0x8C
struct TAdaptor_light : public JStudio::TAdaptor_light {
struct TVVOutput_direction_ {
void operator()(f32, JStudio::TAdaptor*) const;
~TVVOutput_direction_();
struct TVVOutput_direction_ : public JStudio::TVariableValue::TOutput {
TVVOutput_direction_(JStudio::TAdaptor_light::TEVariableValue val, JStudio_JStage::TAdaptor_light::TEDirection_ dir)
{
mValueIndex = val;
_08 = dir;
}
virtual void operator()(f32, JStudio::TAdaptor*) const;
virtual ~TVVOutput_direction_() {}
void adaptor_setOutput_(JStudio::TAdaptor* adaptor) const {
adaptor->adaptor_referVariableValue(mValueIndex)->setOutput(this);
}
bool isEnd_() const { return mValueIndex != -1; }
/* 0x04 */ int mValueIndex;
/* 0x08 */ int _08;
};
TAdaptor_light(JStage::TSystem const*, JStage::TLight*);
@@ -190,9 +204,11 @@ struct TAdaptor_light : public JStudio::TAdaptor_light {
virtual void adaptor_do_ENABLE(JStudio::data::TEOperationData, void const*, u32);
virtual void adaptor_do_FACULTY(JStudio::data::TEOperationData, void const*, u32);
static u8 saoVVOutput_direction_[72];
static TVVOutput_direction_ saoVVOutput_direction_[6];
/* 0x110 */ u8 field_0x110[0x11C - 0x110];
/* 0x110 */ const JStage::TSystem* mSystem;
/* 0x114 */ JStage::TLight* mObject;
/* 0x118 */ int _118;
}; // Size: 0x11C
void
@@ -4,60 +4,158 @@
//
#include "JSystem/JStudio/JStudio_JStage/object-light.h"
#include "dolphin/types.h"
#include "math.h"
namespace JStudio_JStage {
TAdaptor_light::TVVOutput_direction_ TAdaptor_light::saoVVOutput_direction_[6] = {
TAdaptor_light::TVVOutput_direction_(TE_VALUE_10, DIRECTION_1),
TAdaptor_light::TVVOutput_direction_(TE_VALUE_11, DIRECTION_1),
TAdaptor_light::TVVOutput_direction_(TE_VALUE_7, DIRECTION_2),
TAdaptor_light::TVVOutput_direction_(TE_VALUE_8, DIRECTION_2),
TAdaptor_light::TVVOutput_direction_(TE_VALUE_9, DIRECTION_2),
TAdaptor_light::TVVOutput_direction_(TE_VALUE_NONE, DIRECTION_0)
};
/* 80278228-802782C4 .text __ct__Q214JStudio_JStage14TAdaptor_lightFPCQ26JStage7TSystemPQ26JStage6TLight */
JStudio_JStage::TAdaptor_light::TAdaptor_light(const JStage::TSystem*, JStage::TLight*) {
/* Nonmatching */
TAdaptor_light::TAdaptor_light(const JStage::TSystem* system, JStage::TLight* light)
: mSystem(system)
, mObject(light)
, _118(0)
{
}
/* 802782C4-8027833C .text __dt__Q214JStudio_JStage14TAdaptor_lightFv */
JStudio_JStage::TAdaptor_light::~TAdaptor_light() {
/* Nonmatching */
TAdaptor_light::~TAdaptor_light() {
adaptor_do_end(NULL);
}
/* 8027833C-80278384 .text adaptor_do_prepare__Q214JStudio_JStage14TAdaptor_lightFPCQ27JStudio7TObject */
void JStudio_JStage::TAdaptor_light::adaptor_do_prepare(const JStudio::TObject*) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_prepare(const JStudio::TObject* object) {
for (const TVVOutput_direction_* output = saoVVOutput_direction_; output->isEnd_(); output++) {
output->adaptor_setOutput_(this);
}
}
/* 80278384-802785BC .text adaptor_do_begin__Q214JStudio_JStage14TAdaptor_lightFPCQ27JStudio7TObject */
void JStudio_JStage::TAdaptor_light::adaptor_do_begin(const JStudio::TObject*) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_begin(const JStudio::TObject* object) {
mObject->JSGFEnableFlag(1);
const JStudio::TControl* control = (JStudio::TControl*)object->getControl();
GXColor color = mObject->JSGGetColor();
adaptor_setVariableValue_GXColor(sauVariableValue_4_COLOR_RGBA, color);
JStudio::TControl::TTransform_position_direction posDir;
JStudio::TControl::TTransform_position_direction transformedPosDir;
const JStudio::TControl::TTransform_position_direction* vvVec;
mObject->JSGGetPosition(&posDir.mPosition);
mObject->JSGGetDirection(&posDir.mDirection);
vvVec = (JStudio::TControl::TTransform_position_direction*)control->transformOnGet_transform_ifEnabled(posDir, &transformedPosDir);
adaptor_setVariableValue_Vec(sauVariableValue_3_POSITION_XYZ, vvVec->mPosition);
f32 x = vvVec->mDirection.x;
f32 y = vvVec->mDirection.y;
f32 z = vvVec->mDirection.z;
f32 dist = std::sqrtf(x * x + z * z);
f32 atanVal1 = std::atan2f(x, z);
f32 atanVal2 = std::atan2f(y, dist);
adaptor_setVariableValue_immediate(10, RAD_TO_DEG(atanVal1));
adaptor_setVariableValue_immediate(11, RAD_TO_DEG(atanVal2));
Vec targetPos;
VECAdd(&vvVec->mPosition, &vvVec->mDirection, &targetPos);
adaptor_setVariableValue_Vec(sauVariableValue_3_TARGET_POSITION_XYZ, targetPos);
}
/* 802785BC-80278610 .text adaptor_do_end__Q214JStudio_JStage14TAdaptor_lightFPCQ27JStudio7TObject */
void JStudio_JStage::TAdaptor_light::adaptor_do_end(const JStudio::TObject*) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_end(const JStudio::TObject* object) {
mObject->JSGFDisableFlag(1);
}
/* 80278610-802787C4 .text adaptor_do_update__Q214JStudio_JStage14TAdaptor_lightFPCQ27JStudio7TObjectUl */
void JStudio_JStage::TAdaptor_light::adaptor_do_update(const JStudio::TObject*, u32) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_update(const JStudio::TObject* object, u32 p2) {
const JStudio::TControl* control = object->getControl();
GXColor color;
adaptor_getVariableValue_GXColor(&color, sauVariableValue_4_COLOR_RGBA);
mObject->JSGSetColor(color);
JStudio::TControl::TTransform_position_direction posDir1;
adaptor_getVariableValue_Vec(&posDir1.mPosition, sauVariableValue_3_POSITION_XYZ);
switch (_118) {
case 1:
f32 val10 = adaptor_getVariableValue(10)->getValue();
f32 val11 = adaptor_getVariableValue(11)->getValue();
f32 cosX = std::cosf(DEG_TO_RAD(val11));
f32 sinX = std::sinf(DEG_TO_RAD(val11));
posDir1.mDirection.x = cosX * std::sinf(DEG_TO_RAD(val10));
posDir1.mDirection.y = sinX;
posDir1.mDirection.z = cosX * std::cosf(DEG_TO_RAD(val10));
break;
case 2:
Vec target;
adaptor_getVariableValue_Vec(&target, sauVariableValue_3_TARGET_POSITION_XYZ);
VECSubtract(&target, &posDir1.mPosition, &posDir1.mDirection);
break;
}
JStudio::TControl::TTransform_position_direction* posDir;
if (!control->mTransformOnSet) {
posDir = &posDir1;
} else {
JStudio::TControl::TTransform_position_direction posDir2;
MTXMultVec(control->transformOnSet_getMatrix(), &posDir1.mPosition, &posDir2.mPosition);
MTXMultVecSR(control->transformOnSet_getMatrix(), &posDir1.mDirection, &posDir2.mDirection);
posDir = &posDir2;
}
mObject->JSGSetPosition(posDir->mPosition);
mObject->JSGSetDirection(posDir->mDirection);
}
/* 802787C4-802787F8 .text adaptor_do_data__Q214JStudio_JStage14TAdaptor_lightFPCQ27JStudio7TObjectPCvUlPCvUl */
void JStudio_JStage::TAdaptor_light::adaptor_do_data(const JStudio::TObject*, const void*, u32, const void*, u32) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_data(const JStudio::TObject* object, const void* p2, u32 p3, const void* p4, u32 p5) {
TAdaptor_object_::adaptor_data_(mObject, p2, p3, p4, p5);
}
/* 802787F8-80278870 .text adaptor_do_FACULTY__Q214JStudio_JStage14TAdaptor_lightFQ37JStudio4data15TEOperationDataPCvUl */
void JStudio_JStage::TAdaptor_light::adaptor_do_FACULTY(JStudio::data::TEOperationData, const void*, u32) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_FACULTY(JStudio::data::TEOperationData op, const void* data, u32 flag) {
switch (op) {
case JStudio::data::TEOD_Unknown_02:
JStage::TELight lightType;
switch (((int*)data)[0]) {
case 0x301:
lightType = JStage::TELIGHT_Unk1;
break;
case 0x302:
lightType = JStage::TELIGHT_Unk2;
break;
case 0x303:
lightType = JStage::TELIGHT_Unk3;
break;
default:
goto break_outer_switch;
break;
}
mObject->JSGSetLightType(lightType);
break_outer_switch:
break;
}
}
/* 80278870-80278894 .text adaptor_do_ENABLE__Q214JStudio_JStage14TAdaptor_lightFQ37JStudio4data15TEOperationDataPCvUl */
void JStudio_JStage::TAdaptor_light::adaptor_do_ENABLE(JStudio::data::TEOperationData, const void*, u32) {
/* Nonmatching */
void TAdaptor_light::adaptor_do_ENABLE(JStudio::data::TEOperationData op, const void* data, u32 flag) {
TAdaptor_object_::adaptor_ENABLE_(mObject, op, data, flag);
}
/* 80278894-802788A0 .text __cl__Q314JStudio_JStage14TAdaptor_light20TVVOutput_direction_CFfPQ27JStudio8TAdaptor */
void JStudio_JStage::TAdaptor_light::TVVOutput_direction_::operator()(f32, JStudio::TAdaptor*) const {
/* Nonmatching */
}
/* 802788A0-80278900 .text __dt__Q314JStudio_JStage14TAdaptor_light20TVVOutput_direction_Fv */
JStudio_JStage::TAdaptor_light::TVVOutput_direction_::~TVVOutput_direction_() {
/* Nonmatching */
void TAdaptor_light::TVVOutput_direction_::operator()(f32, JStudio::TAdaptor* adaptor) const {
((TAdaptor_light*)adaptor)->_118 = _08;
}
} // namespace JStudio_JStage
@@ -10,7 +10,7 @@
#define M_SQRT3 1.73205f
#define DEG_TO_RAD(degrees) (degrees * (M_PI / 180.0f))
#define RAD_TO_DEG(radians) (radians / (180.0f / M_PI))
#define RAD_TO_DEG(radians) (radians * (180.0f / M_PI + 0.000005f)) // the 0.000005f is probably a fakematch
#ifdef __cplusplus
extern "C" {