PlacementMap: Add x_0, x_4(); change u16 mStaticCompoundId to s16 mStaticCompundActorId (#85)

This commit is contained in:
savage13 2022-02-20 17:50:28 -05:00 committed by GitHub
parent 4e21ee7613
commit c804527d7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 103 additions and 19 deletions

View File

@ -73767,9 +73767,9 @@ Address,Quality,Size,Name
0x0000007100d43280,O,000588,_ZN4ksys3map12PlacementMap14cleanupPhysicsEv
0x0000007100d434cc,O,000424,_ZN4ksys3map12PlacementMap18loadStaticCompoundEibb
0x0000007100d43674,O,000400,_ZN4ksys3map12PlacementMap3x_2Ei
0x0000007100d43804,U,000552,PlacementMap::x_0
0x0000007100d43804,O,000552,_ZN4ksys3map12PlacementMap26updateObjectCollisionAndIdEiPNS0_6ObjectE
0x0000007100d43a2c,O,000028,_ZN4ksys3map12PlacementMap10unloadHkscEi
0x0000007100d43a48,U,000620,PlacementMap::x_4
0x0000007100d43a48,O,000620,_ZN4ksys3map12PlacementMap26clearStaticCompoundActorIdEi
0x0000007100d43cb4,U,000172,PlacementMap::x_1
0x0000007100d43d60,U,000248,PlacementMap::staticCompoundStuff
0x0000007100d43e58,O,000192,_ZN4ksys3map12PlacementMap25doSomethingStaticCompoundEi

Can't render this file because it is too large.

View File

@ -61,7 +61,7 @@ void Object::initData(MubinIter* iter, u8 idx, u32 actor_data_idx, ActorData* da
mFlags.makeAllZero();
mIdx = 0;
mNumLinksPointingToMe = 0;
mStaticCompoundId = 0xFFFF;
mStaticCompoundActorId = -1;
_18 = nullptr;
_20 = nullptr;
_10 = nullptr;
@ -88,7 +88,7 @@ void Object::initData(MubinIter* iter, u8 idx, u32 actor_data_idx, ActorData* da
_10 = nullptr;
_18 = nullptr;
_20 = nullptr;
mStaticCompoundId = 0xFFFF;
mStaticCompoundActorId = -1;
mActorDataIdx = actor_data_idx;
mProc = nullptr;
mLinkData = nullptr;

View File

@ -40,6 +40,7 @@ public:
_100 = 0x100,
ActorCreated = 0x200,
_400 = 0x400,
_800 = 0x800,
_2000 = 0x2000,
_4000 = 0x4000,
_8000 = 0x8000,
@ -187,7 +188,8 @@ public:
auto getActorDataIdx() const { return mActorDataIdx; }
auto getIdx() const { return mIdx; }
auto getId() const { return mId; }
auto getStaticCompoundId() const { return mStaticCompoundId; }
auto getStaticCompoundActorId() const { return mStaticCompoundActorId; }
void setStaticCompoundActorId(s16 id) { mStaticCompoundActorId = id; }
const ActorData& getActorData() const {
return PlacementMgr::instance()->mPlacementActors->mActorData[mActorDataIdx];
@ -215,7 +217,7 @@ private:
sead::TypedBitFlag<ActorFlag8, u8> mActorFlags8;
u8 _b = 0xff;
u16 mId = 0;
u16 mStaticCompoundId = 0xffff;
s16 mStaticCompoundActorId = -1;
void* _10 = nullptr;
void* _18 = nullptr;
void* _20 = nullptr;

View File

@ -40,6 +40,73 @@ PlacementMap::~PlacementMap() {
r.cleanup();
}
}
bool PlacementMap::clearStaticCompoundActorId(int idx) {
const auto lock = sead::makeScopedLock(mCs);
const auto& resource = mRes[idx].mRes.getResource();
if (auto* sc = sead::DynamicCast<phys::StaticCompound>(resource)) {
if (sc->calledFromMapDtor()) {
return false;
}
mRes[idx].mRes.requestUnload();
}
for (int i = mParsedNumStaticObjs; i <= mNumStaticObjs; i++) {
auto* obj = mPa->getStaticObj_2(i);
if (getStaticCompoundIdFromPosition(*obj) == idx) {
obj->setStaticCompoundActorId(-1);
}
}
int gid = mDynamicGroupIdx;
if (gid >= 0) {
int num_objs = mPa->getNumObjs(gid);
for (int i = 0; i < num_objs; i++) {
auto* obj = mPa->getObj(gid, i);
if (getStaticCompoundIdFromPosition(*obj) == idx) {
obj->setStaticCompoundActorId(-1);
}
}
}
return true;
}
void PlacementMap::updateObjectCollisionAndId(int index, Object* obj) {
if (PlacementMgr::instance()->auto17(obj)) {
return;
}
if (getStaticCompoundIdFromPosition(*obj) != index) {
return;
}
auto& rsrc = mRes[index];
obj->setStaticCompoundActorId(-1);
const auto lock = sead::makeScopedLock(mCs);
auto* sc = sead::DynamicCast<phys::StaticCompound>(rsrc.mRes.getResource());
if (!sc) {
return;
}
u32 hash_id = obj->getHashId();
int srt_hash = 0;
obj->getMubinIter().tryGetParamIntByKey(&srt_hash, "SRTHash");
int idx = sc->setMapObject(hash_id, static_cast<u32>(srt_hash), obj);
obj->setStaticCompoundActorId(idx);
if (obj->getStaticCompoundActorId() < 0) {
return;
}
bool disable = false;
if (obj->shouldSkipSpawn() ||
(obj->checkActorDataFlag(mPa, map::ActorData::Flag::MapConstPassive) &&
obj->getFlags0().isOn(Object::Flag0::_800))) {
obj->resetFlags0(Object::Flag0::_200000);
disable = false;
} else {
obj->setFlags0(Object::Flag0::_200000);
disable = true;
}
sc->disableCollision(idx, disable);
}
bool PlacementMap::parseStaticMap_(sead::Heap* heap, u8* data) {
if (!mMubinPath.isEmpty()) {
if (!mSkipLoadStaticMap) {
@ -52,14 +119,25 @@ bool PlacementMap::parseStaticMap_(sead::Heap* heap, u8* data) {
mStaticMapLoaded = true;
return false;
}
int PlacementMap::getStaticCompoundIdFromPosition(const Object& object) const {
if (mMgr->isShrineOrDivineBeast()) {
return 0;
}
return getStaticCompoundIdFromPosition(object.getTranslate().x, object.getTranslate().z);
}
int PlacementMap::getStaticCompoundIdFromPosition(float x, float z) const {
if (mMgr->isShrineOrDivineBeast()) {
return 0;
}
return getStaticCompoundIdFromPosition(sead::Vector3f(x, 0, z));
}
int PlacementMap::getStaticCompoundIdFromPosition(const sead::Vector3f& pos) const {
if (mMgr->isShrineOrDivineBeast()) {
return 0;
}
float dx = (pos.x - (1000 * mCol - 5000));
float dz = (pos.z - (1000 * mRow - 4000));
return (2 * (dz > 500.0)) + (dx > 500.0);
return (2 * (dz > 500.0f)) + (dx > 500.0f);
}
bool PlacementMap::isDynamicLoaded(const sead::Vector3f& pos) {
@ -144,20 +222,20 @@ PlacementMap::MapObjStatus PlacementMap::x_2(int hksc_idx) {
sc->sub_7100FCAD0C(mMat);
for (int i = mParsedNumStaticObjs; i <= mNumStaticObjs; i++) {
x_0(hksc_idx, mPa->getStaticObj_0(i));
updateObjectCollisionAndId(hksc_idx, mPa->getStaticObj_0(i));
}
const int gid = mDynamicGroupIdx;
if (gid >= 0) {
int n = mPa->getNumObjs(gid);
for (int i = 0; i < n; i++) {
x_0(hksc_idx, mPa->getObj(gid, i));
updateObjectCollisionAndId(hksc_idx, mPa->getObj(gid, i));
}
}
return MapObjStatus::Loading;
}
void PlacementMap::doDisableObjStaticCompound(Object* obj, bool disable) {
if ((s16)obj->getStaticCompoundId() < 0) {
if ((s16)obj->getStaticCompoundActorId() < 0) {
return;
}
const auto lock = sead::makeScopedLock(mCs);
@ -175,7 +253,7 @@ void PlacementMap::doDisableObjStaticCompound(Object* obj, bool disable) {
int idx = getStaticCompoundIdFromPosition(obj->getTranslate());
auto* resource = mRes[idx].mRes.getResource();
if (auto* sc = sead::DynamicCast<ksys::phys::StaticCompound>(resource)) {
s16 sc_id = obj->getStaticCompoundId();
s16 sc_id = obj->getStaticCompoundActorId();
sc->disableCollision(sc_id, disable);
}
}

View File

@ -92,9 +92,9 @@ private:
void cleanupPhysics();
bool loadStaticCompound(int hksc_idx, bool is_auto_gen_mu, bool req_arg_8);
MapObjStatus x_2(int hksc_idx);
void x_0(int id, Object* obj);
void updateObjectCollisionAndId(int id, Object* obj);
void unloadHksc(int hksc_idx);
int x_4(int id);
bool clearStaticCompoundActorId(int id);
int x_1(int id);
bool staticCompoundStuff(int sc_id, bool cleanup);
int doSomethingStaticCompound(int hksc_idx);
@ -106,6 +106,8 @@ private:
const sead::SafeString& folder_and_file, int map_id_maybe, bool skip_load_static_map);
int getStaticCompoundIdFromPosition(const sead::Vector3f& pos) const;
int getStaticCompoundIdFromPosition(float x, float z) const;
int getStaticCompoundIdFromPosition(const Object& object) const;
u8 _0;
u8 mSkipLoadStaticMap;

View File

@ -55,6 +55,8 @@ public:
bool someFlagCheck() const;
void threadFn(sead::Thread* thread, sead::MessageQueue::Element msg);
// 0x00000071011eb4dc
bool auto17(Object* obj);
enum class MgrFlag {
_1 = 0x1,

View File

@ -62,11 +62,11 @@ void StaticCompound::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* parent_h
mHeap->adjust();
}
void StaticCompound::setMapObject(u32 hash_id, u32 srt_hash, map::Object* object) {
int StaticCompound::setMapObject(u32 hash_id, u32 srt_hash, map::Object* object) {
int idx = mStaticCompoundInfo->getActorIdx(hash_id, srt_hash);
if (idx < 0 || idx >= mMapObjects.size())
return;
mMapObjects[idx] = object;
if (idx >= 0 && idx < mMapObjects.size())
mMapObjects[idx] = object;
return idx;
}
map::Object* StaticCompound::getMapObject(int shape_idx) const {

View File

@ -27,7 +27,7 @@ public:
StaticCompound();
~StaticCompound() override;
void setMapObject(u32 hash_id, u32 srt_hash, map::Object* object);
int setMapObject(u32 hash_id, u32 srt_hash, map::Object* object);
map::Object* getMapObject(int shape_idx) const;
bool disableCollision(int actor_idx, bool x);