diff --git a/include/d/a/obj/d_a_obj_flag.h b/include/d/a/obj/d_a_obj_flag.h index a021f691..88ac57f8 100644 --- a/include/d/a/obj/d_a_obj_flag.h +++ b/include/d/a/obj/d_a_obj_flag.h @@ -1,18 +1,58 @@ #ifndef D_A_OBJ_FLAG_H #define D_A_OBJ_FLAG_H +#include "common.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/cc/d_cc_d.h" +#include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/g3d_scnobj.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +#include "toBeSorted/stage_render_stuff.h" class dAcOFlag_c : public dAcObjBase_c { public: - dAcOFlag_c() : mStateMgr(*this) {} + class callback_c : public nw4r::g3d::IScnObjCallback { + public: + callback_c(dAcObjBase_c *arg) : mpActor(arg) {} + /* 0x04 */ dAcObjBase_c *mpActor; + }; + dAcOFlag_c() : mResFile(nullptr), mStateMgr(*this), mCallback(this) {} virtual ~dAcOFlag_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcOFlag_c, Wait); + bool isSail(); + bool isPurpleFlag(); + const char *getArcName(); + const char *getMdlName(); + const char *getAnmTexSrtName(); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOFlag_c); + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ m3d::anmTexSrt_c mAnmTexSrt; + /* 0x37C */ dCcD_Cps mCps; + /* 0x4EC */ STATE_MGR_DECLARE(dAcOFlag_c); + /* 0x528 */ callback_c mCallback; + /* 0x530 */ s32 field_0x530; + /* 0x534 */ s32 mNumJoints; + /* 0x538 */ mVec3_c *mpJoints; + /* 0x53C */ u8 _0x538[0x548 - 0x53C]; + /* 0x548 */ s32 field_0x548; + /* 0x54C */ u8 _0x54C[0x56C - 0x54C]; + /* 0x56C */ mVec3_c *mpJoints1; // Size 15 + /* 0x570 */ mVec3_c *mpJoints2; // Size 15 + /* 0x574 */ mVec3_c *mpJoints3; // Size 15 }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_flag.cpp b/src/REL/d/a/obj/d_a_obj_flag.cpp index ad08d1c6..78049595 100644 --- a/src/REL/d/a/obj/d_a_obj_flag.cpp +++ b/src/REL/d/a/obj/d_a_obj_flag.cpp @@ -1,9 +1,143 @@ #include "d/a/obj/d_a_obj_flag.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/cc/d_cc_d.h" +#include "f/f_base.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmtexsrt.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" + SPECIAL_ACTOR_PROFILE(OBJ_FLAG, dAcOFlag_c, fProfile::OBJ_FLAG, 0x14E, 0, 3); STATE_DEFINE(dAcOFlag_c, Wait); +static dCcD_SrcCps sSrcCps = { + // TODO +}; + +bool dAcOFlag_c::createHeap() { + const char *arcName = getArcName(); + const char *mdlName = getMdlName(); + const char *anmName = getAnmTexSrtName(); + + mResFile = nw4r::g3d::ResFile(getOarcResFile(arcName)); + nw4r::g3d::ResMdl resMdl = mResFile.GetResMdl(mdlName); + u32 bufferOption = 0x1003120; + if (anmName) { + bufferOption = 0x1003324; + } + if (!mMdl.create(resMdl, &mAllocator, bufferOption, 1, nullptr)) { + return false; + } + + s32 type = getFromParams(0, 0xF); + if (anmName) { + nw4r::g3d::ResAnmTexSrt texSrt = mResFile.GetResAnmTexSrt(anmName); + if (!mAnmTexSrt.create(resMdl, texSrt, &mAllocator, nullptr, 1)) { + return false; + } + mMdl.setAnm(mAnmTexSrt); + if (type == 2) { + mAnmTexSrt.setFrame(0.f, 0); + } else if (type == 3) { + mAnmTexSrt.setFrame(1.f, 0); + } + mAnmTexSrt.setRate(0.f, 0); + } + + mpJoints = new mVec3_c[mNumJoints]; + if (!mpJoints) { + return false; + } + + for (s32 i = 0; i < mNumJoints; ++i) { + mpJoints[i] = mVec3_c::Zero; + } + + if (type == 1 || type == 2 || type == 3) { + mpJoints1 = new mVec3_c[15]; + if (!mpJoints1) { + return false; + } + mpJoints2 = new mVec3_c[15]; + if (!mpJoints2) { + return false; + } + mpJoints3 = new mVec3_c[15]; + if (!mpJoints3) { + return false; + } + for (int i = 0; i < 15; ++i) { + mpJoints2[i] = mVec3_c::Zero; + mpJoints3[i] = mVec3_c::Zero; + } + } + mMdl.setCallback(&mCallback); + mMdl.enableCallbackOp(nw4r::g3d::ScnObj::EXECOP_CALC_MAT); + mMdl.enableCallbackTiming(nw4r::g3d::ScnObj::CALLBACK_TIMING_C); + + return true; +} + +int dAcOFlag_c::actorCreate() { + s32 type = getFromParams(0, 0xF); + if (isSail()) { + mNumJoints = 104; + } else { + mNumJoints = 21; + } + + CREATE_ALLOCATOR_SIZE(dAcOFlag_c, 0x4000); + + mStts.SetRank(0); + mCps.Set(sSrcCps); + mCps.SetR(sSrcCps.mCpsInf.mRadius * mScale.x); + mCps.SetStts(mStts); + + mAcceleration = -9.8f; + mMaxSpeed = 0.f; + mStateMgr.changeState(StateID_Wait); + + if (type == 1) { + mBoundingBox.Set(mVec3_c(-800.f, -100.f, -800.f), mVec3_c(800.f, 410.f, 800.f)); + } else if (isPurpleFlag()) { + mBoundingBox.Set(mVec3_c(-250.f, -500.f, -250.f), mVec3_c(250.f, 500.f, 250.f)); + } + + mWorldMtx.transS(mPosition); + mWorldMtx.YrotM(mRotation.y); + field_0x530 = cM::rndInt(100); + + switch (type) { + case 1: { + field_0x548 = 0; + if (mScale.x < 0.5f) { + mCullingDistance += 6000.f; + } else { + mCullingDistance += 3000.f; + } + } break; + case 2: + case 3: { + field_0x548 = 1; + } break; + case 4: { + if (mScale.x < 1.f) { + mCullingDistance *= 100.f; + } + mMdl.setPriorityDraw(0x1C, -1); + } break; + case 5: { + mCullingDistance *= 5.f; + mMdl.setPriorityDraw(0x1C, -1); + } + } + return SUCCEEDED; +} + void dAcOFlag_c::initializeState_Wait() {} void dAcOFlag_c::executeState_Wait() {} void dAcOFlag_c::finalizeState_Wait() {}