diff --git a/configure.py b/configure.py index 9c3f31419..d32de9e3c 100644 --- a/configure.py +++ b/configure.py @@ -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( diff --git a/include/JSystem/JStage/JSGLight.h b/include/JSystem/JStage/JSGLight.h index 77a6193a9..834c1f5c9 100644 --- a/include/JSystem/JStage/JSGLight.h +++ b/include/JSystem/JStage/JSGLight.h @@ -7,6 +7,11 @@ namespace JStage { enum TELight { + TELIGHT_Unk0 = 0, + TELIGHT_Unk1 = 1, + TELIGHT_Unk2 = 2, + TELIGHT_Unk3 = 3, + kLightMax = 0xFFFFFFFF, }; diff --git a/include/JSystem/JStudio/JStudio/jstudio-control.h b/include/JSystem/JStudio/JStudio/jstudio-control.h index 23c622676..2bb666301 100644 --- a/include/JSystem/JStudio/JStudio/jstudio-control.h +++ b/include/JSystem/JStudio/JStudio/jstudio-control.h @@ -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 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(); } diff --git a/include/JSystem/JStudio/JStudio/jstudio-object.h b/include/JSystem/JStudio/JStudio/jstudio-object.h index 906860b77..e1628271d 100644 --- a/include/JSystem/JStudio/JStudio/jstudio-object.h +++ b/include/JSystem/JStudio/JStudio/jstudio-object.h @@ -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]; }; diff --git a/include/JSystem/JStudio/JStudio_JStage/control.h b/include/JSystem/JStudio/JStudio_JStage/control.h index e5f11118e..2503c555b 100644 --- a/include/JSystem/JStudio/JStudio_JStage/control.h +++ b/include/JSystem/JStudio/JStudio_JStage/control.h @@ -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 diff --git a/src/JSystem/JStudio/JStudio_JStage/object-light.cpp b/src/JSystem/JStudio/JStudio_JStage/object-light.cpp index dbbee85da..aed432d00 100644 --- a/src/JSystem/JStudio/JStudio_JStage/object-light.cpp +++ b/src/JSystem/JStudio/JStudio_JStage/object-light.cpp @@ -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 diff --git a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h index 45bafe4f0..a5cb01cbd 100644 --- a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h +++ b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h @@ -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" {