Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

phys::Constraint work #119

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 27 additions & 27 deletions data/uking_functions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -74001,20 +74001,20 @@ Address,Quality,Size,Name
0x0000007100d4e32c,O,000024,_ZN4ksys3map10ObjectLink27isPlacementLODOrForSaleLinkENS0_14MapLinkDefTypeE
0x0000007100d4e344,O,000044,_ZN4ksys3map14ObjectLinkDataC1Ev
0x0000007100d4e370,m,000136,_ZN4ksys3map14ObjectLinkData12deleteArraysEv
0x0000007100d4e3f8,U,000556,PlacementLinkData::allocLinks
0x0000007100d4e3f8,O,000556,_ZN4ksys3map14ObjectLinkData10allocLinksEiiiPN4sead4HeapE
0x0000007100d4e624,O,000212,_ZN4ksys3map14ObjectLinkData16allocLinksToSelfEiPN4sead4HeapE
0x0000007100d4e6f8,U,000292,PlacementLinkData::dtor
0x0000007100d4e81c,U,000256,PlacementObj::x
0x0000007100d4e91c,U,000440,PlacementLinkData::addLink
0x0000007100d4e91c,M,000440,_ZN4ksys3map14ObjectLinkData7addLinkEPNS0_6ObjectERKN4sead14SafeStringBaseIcEEbS3_PNS0_9MubinIterE
0x0000007100d4ead4,U,000364,PlacementLinkData::setupLinks
0x0000007100d4ec40,U,000328,
0x0000007100d4ec40,O,000328,_ZN4ksys3map14ObjectLinkData14sub_7100D4EC40EPNS0_6ObjectEPNS0_10ObjectLinkES3_
0x0000007100d4ed88,O,000016,_ZN4ksys3map14ObjectLinkData11setGenGroupEPNS0_8GenGroupE
0x0000007100d4ed98,U,000052,PlacementLinkData::checkCreateLinkObjRevival
0x0000007100d4edcc,U,000020,PlacementLinkData::checkDeleteLinkObjRevival
0x0000007100d4ed98,O,000052,_ZNK4ksys3map14ObjectLinkData25checkCreateLinkObjRevivalEv
0x0000007100d4edcc,O,000020,_ZNK4ksys3map14ObjectLinkData25checkDeleteLinkObjRevivalEv
0x0000007100d4ede0,M,000280,_ZN4ksys3map15ObjectLinkArray9checkLinkENS0_14MapLinkDefTypeEb
0x0000007100d4eef8,O,000056,_ZN4ksys3map15ObjectLinkArray16findLinkWithTypeENS0_14MapLinkDefTypeE
0x0000007100d4ef30,U,000116,
0x0000007100d4efa4,U,000332,PlacementLinkData::x_2
0x0000007100d4ef30,O,000116,_ZN4ksys3map14ObjectLinkData14sub_7100D4EF30ERNS_3act20ActorConstDataAccessE
0x0000007100d4efa4,m,000332,_ZN4ksys3map14ObjectLinkData21findObjectByActorNameERKN4sead14SafeStringBaseIcEE
0x0000007100d4f0f0,U,000224,
0x0000007100d4f1d0,U,000532,
0x0000007100d4f3e4,U,000496,
Expand Down Expand Up @@ -82486,32 +82486,32 @@ Address,Quality,Size,Name
0x0000007100f69d2c,U,000004,nullsub_4196
0x0000007100f69d30,U,000004,nullsub_4197
0x0000007100f69d34,U,000004,nullsub_4198
0x0000007100f69d38,U,000180,Constraint::ctor
0x0000007100f69d38,M,000180,_ZN4ksys4phys10ConstraintC1EP21hkpConstraintInstancePNS0_9RigidBodyES5_P13hkQuaternionfPv
0x0000007100f69dec,U,000376,Constraint::dtor
0x0000007100f69f64,U,000036,Constraint::dtorDelete
0x0000007100f69f88,U,000036,getPhysicsMemSysField190Or
0x0000007100f69fac,U,000044,
0x0000007100f69fd8,U,000024,
0x0000007100f69ff0,U,000132,
0x0000007100f6a074,U,000136,
0x0000007100f6a0fc,U,000132,
0x0000007100f6a180,U,000088,Constraint::x
0x0000007100f6a1d8,U,000068,
0x0000007100f6a21c,U,000012,
0x0000007100f6a228,U,000184,
0x0000007100f6a2e0,U,000032,
0x0000007100f6a300,U,000372,
0x0000007100f6a474,U,000340,
0x0000007100f6a5c8,U,000212,
0x0000007100f6a69c,U,000092,
0x0000007100f6a6f8,U,000372,
0x0000007100f69ff0,O,000132,_ZN4ksys4phys10Constraint14sub_7100F69FF0Ev
0x0000007100f6a074,O,000136,_ZN4ksys4phys10Constraint14sub_7100F6A074Ev
0x0000007100f6a0fc,O,000132,_ZN4ksys4phys10Constraint20setConstraintWeightsEff
0x0000007100f6a180,O,000088,_ZN4ksys4phys10Constraint23allocConstraintListenerEPN4sead4HeapE
0x0000007100f6a1d8,O,000068,_ZN4ksys4phys10Constraint12unlinkIf2SetEv
0x0000007100f6a21c,O,000012,_ZN4ksys4phys10Constraint6unlinkEv
0x0000007100f6a228,m,000184,_ZN4ksys4phys10Constraint4wakeEv
0x0000007100f6a2e0,O,000032,_ZNK4ksys4phys10Constraint15checkIsSleepingEv
0x0000007100f6a300,O,000372,_ZN4ksys4phys10Constraint12setRigidBodyEPNS0_9RigidBodyES3_
0x0000007100f6a474,m,000340,_ZN4ksys4phys10Constraint10addToWorldEb
0x0000007100f6a5c8,m,000212,_ZN4ksys4phys10Constraint8calcMassEv
0x0000007100f6a69c,O,000092,_ZN4ksys4phys10Constraint14clearRigidBodyENS1_15ConstrainedTypeE
0x0000007100f6a6f8,m,000372,_ZN4ksys4phys10Constraint23unlinkConstrainedBodiesEbb
0x0000007100f6a86c,O,000020,_ZN4ksys4phys10Constraint7destroyEPS1_
0x0000007100f6a880,U,000012,
0x0000007100f6a88c,U,000160,
0x0000007100f6a92c,U,000168,
0x0000007100f6a9d4,U,000208,
0x0000007100f6aaa4,U,000308,
0x0000007100f6abd8,U,000044,Constraint::x_0
0x0000007100f6a880,O,000012,_ZNK4ksys4phys10Constraint10isFlag2SetEv
0x0000007100f6a88c,O,000160,_ZN4ksys4phys10Constraint10initParentEPNS0_9RigidBodyE
0x0000007100f6a92c,O,000168,_ZN4ksys4phys10Constraint9initChildEPNS0_9RigidBodyE
0x0000007100f6a9d4,O,000208,_ZN4ksys4phys10Constraint13initWithGroupEPNS0_28StaticCompoundRigidBodyGroupE
0x0000007100f6aaa4,m,000308,_ZN4ksys4phys10Constraint10initBodiesEPNS0_9RigidBodyES3_
0x0000007100f6abd8,W,000044,_ZNK4ksys4phys10Constraint12getRigidBodyEi
0x0000007100f6ac04,U,000092,
0x0000007100f6ac60,U,000008,
0x0000007100f6ac68,U,000064,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

#include <Havok/Common/Base/Types/hkBaseTypes.h>

class hkpConstraintInstance;
class hkpWorld;

struct hkpConstraintBrokenEvent {
enum EventSource {
EVENT_SOURCE_UNKNOWN,
EVENT_SOURCE_BREAKABLE_CONSTRAINT,
EVENT_SOURCE_FLEXIBLE_JOINT,
};

hkpConstraintBrokenEvent(hkpWorld* world, hkpConstraintInstance* i, EventSource es)
: m_world(world), m_constraintInstance(i), m_eventSource(es), m_eventSourceDetails(0),
m_constraintBroken(true), m_actualImpulse(0.0f), m_impulseLimit(0.0f) {}

hkpWorld* m_world;
hkpConstraintInstance* m_constraintInstance;

hkEnum<EventSource, hkUint8> m_eventSource;
hkUint8 m_eventSourceDetails;
hkBool m_constraintBroken;
hkReal m_actualImpulse;
hkReal m_impulseLimit;
};

class hkpConstraintListener {
public:
virtual ~hkpConstraintListener() {}

virtual void constraintAddedCallback(hkpConstraintInstance* constraint) {}

virtual void constraintRemovedCallback(hkpConstraintInstance* constraint) {}

virtual void constraintDeletedCallback(hkpConstraintInstance* constraint) {}

virtual void constraintBreakingCallback(const hkpConstraintBrokenEvent& event) {}
};
2 changes: 2 additions & 0 deletions src/KingSystem/ActorSystem/actActorConstDataAccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ class ActorConstDataAccess : public ActorLinkConstDataAccess {
f32 getHorseAvoidOffset() const;
bool horseTargetedIsCircularMoveAlways() const;

void setActor687();

private:
Actor* getActor() const;

Expand Down
12 changes: 12 additions & 0 deletions src/KingSystem/Map/mapObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ class Object {
void setRevivalFlagValue(bool value);
void setFieldATrue();

bool checkRevivalMaybe(bool a1);

sead::Vector3f getScale() const;
sead::Vector3f getRotate() const;
void setTranslate(const sead::Vector3f& translate);
Expand Down Expand Up @@ -185,6 +187,12 @@ class Object {
const auto& getActorFlags8() const { return mActorFlags8; }
const auto& getHardModeFlags() const { return mHardModeFlags; }

bool isLinkTag() const { return mFlags.isOn(Flag::IsLinkTag); }
bool isSetFlag8() const { return mFlags.isOn(Flag::_8); }
bool isIncrementSave() const { return mFlags.isOn(Flag::IncrementSave); }

void setFlag8() { mFlags.set(Flag::_8); }

auto getActorDataIdx() const { return mActorDataIdx; }
auto getIdx() const { return mIdx; }
auto getId() const { return mId; }
Expand All @@ -202,6 +210,10 @@ class Object {
ObjectLinkData* getLinkData() const { return mLinkData; }

gdt::FlagHandle getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; }
void setRevivalGameDataFlagHash(const gdt::FlagHandle& value) {
mRevivalGameDataFlagHash = value;
}

u32 getHashId() const { return mHashId; }

const sead::Vector3f& getTranslate() const { return mTranslate; }
Expand Down
180 changes: 180 additions & 0 deletions src/KingSystem/Map/mapObjectLink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,27 @@ void ObjectLinkData::deleteArrays() {
mLinksToSelf.links.freeBuffer();
}

bool ObjectLinkData::allocLinks(s32 num_links_ref, s32 num_links_other, s32 num_links_cs,
sead::Heap* heap) {
if (num_links_ref > 0) {
if (!mObjects.allocBufferAssert(num_links_ref, heap)) {
return false;
}
mObjects.fill(nullptr);
}
if (num_links_other > 0) {
if (!mLinksOther.links.allocBufferAssert(num_links_other, heap)) {
return false;
}
}
if (num_links_cs > 0) {
if (!mLinksCs.links.allocBufferAssert(num_links_cs, heap)) {
return false;
}
}
return true;
}

bool ObjectLinkData::allocLinksToSelf(s32 num_links, sead::Heap* heap) {
if (num_links >= 1) {
mLinksToSelf.links.tryAllocBuffer(num_links, heap);
Expand All @@ -159,6 +180,88 @@ bool ObjectLinkData::allocLinksToSelf(s32 num_links, sead::Heap* heap) {
return true;
}

// NON_MATCHING
bool ObjectLinkData::addLink(Object* dest, const sead::SafeString& definition_name, bool passive,
Object* src, MubinIter* iter) {
MapLinkDefType type = ObjectLink::getTypeForName(definition_name);
if (type == MapLinkDefType::Invalid) {
return false;
}
if (type == MapLinkDefType::SyncLink && passive) {
return false;
}

if (type == MapLinkDefType::Reference) {
for (int i = 0; i < mObjects.size(); i++) {
if (mObjects[i] == nullptr) {
mObjects[i] = dest;
return false;
}
}
}

if (dest != nullptr && passive) {
switch (type) {
case MapLinkDefType::Create:
case MapLinkDefType::Delete:
case MapLinkDefType::MtxCopyCreate:
case MapLinkDefType::SyncLink:
case MapLinkDefType::PlacementLOD:
case MapLinkDefType::Reference:
break;
case MapLinkDefType::BasicSig:
case MapLinkDefType::AxisX:
case MapLinkDefType::AxisY:
case MapLinkDefType::AxisZ:
case MapLinkDefType::NAxisX:
case MapLinkDefType::NAxisY:
case MapLinkDefType::NAxisZ:
case MapLinkDefType::GimmickSuccess:
case MapLinkDefType::VelocityControl:
case MapLinkDefType::BasicSigOnOnly:
case MapLinkDefType::Remains:
case MapLinkDefType::DeadUp:
case MapLinkDefType::LifeZero:
case MapLinkDefType::Stable:
case MapLinkDefType::ChangeAtnSig:
dest = nullptr;
break;
default:
dest = nullptr;
break;
}
}

ObjectLinkArray* arr = &mLinksCs;
if (type == MapLinkDefType::Reference || type == MapLinkDefType::Invalid) {
arr = &mLinksOther;
}

if (type == MapLinkDefType::CopyWaitRevival) {
if (dest != nullptr) {
if (src->isLinkTag() && !src->isSetFlag8() && !src->isIncrementSave() &&
!dest->isIncrementSave()) {
src->setFlag8();
src->setRevivalGameDataFlagHash(dest->getRevivalGameDataFlagHash());
}
}
}

auto& links = arr->links;
for (auto& link : links) {
if (link.other_obj == dest && link.type == type) {
return false;
}
if (link.other_obj == nullptr && link.type == MapLinkDefType::Invalid) {
link.type = type;
link.other_obj = dest;
link.iter = *iter;
return type != MapLinkDefType::Invalid;
}
}
return true;
}

ObjectLink* ObjectLinkData::findLinkWithType(MapLinkDefType t) {
return findLinkWithType_0(t);
}
Expand All @@ -180,11 +283,70 @@ ObjectLink* ObjectLinkData::findLinkWithType_0(MapLinkDefType t) {
}
}

bool ObjectLinkData::sub_7100D4EC40(Object* obj, ObjectLink* link, Object* dest) {
for (auto& l : mLinksToSelf.links) {
auto type = link->type;
if (l.other_obj == obj && l.type == link->type) {
return true;
}
if (l.other_obj == nullptr) {
l.other_obj = obj;
l.type = type;
l.iter = link->iter;

auto& iter = link->iter;
switch (type) {
default:
break;
case MapLinkDefType::BasicSig:
case MapLinkDefType::BasicSigOnOnly: {
bool no_auto_demo_member = false;
if (iter.tryGetParamBoolByKey(&no_auto_demo_member, "NoAutoDemoMember")) {
mNoAutoDemoMember = no_auto_demo_member;
}
break;
}
case MapLinkDefType::Create:
case MapLinkDefType::MtxCopyCreate:
if (obj->isLinkTag()) {
bool appear_fade = false;
if (iter.tryGetParamBoolByKey(&appear_fade, "AppearFade")) {
mAppearFade = appear_fade;
}
mCreateLinksSrcObj = obj;
}
break;
case MapLinkDefType::Delete:
if (obj->isLinkTag()) {
mDeleteLinksSrcObj = obj;
}
break;
}
return true;
}
}
return false;
}

void ObjectLinkData::setGenGroup(GenGroup* group) {
if (mGenGroup == nullptr)
mGenGroup = group;
}

bool ObjectLinkData::checkCreateLinkObjRevival() const {
if (mCreateLinksSrcObj != nullptr) {
return !mCreateLinksSrcObj->checkRevivalMaybe(false);
}
return false;
}

bool ObjectLinkData::checkDeleteLinkObjRevival() const {
if (mDeleteLinksSrcObj != nullptr) {
return mDeleteLinksSrcObj->checkRevivalMaybe(true);
}
return false;
}

// NON_MATCHING
bool ObjectLinkArray::checkLink(MapLinkDefType t, bool b) {
bool x_exists;
Expand Down Expand Up @@ -217,6 +379,24 @@ bool ObjectLinkArray::checkLink(MapLinkDefType t, bool b) {
return acc.checkLinkTagActivated(b, x_exists);
}

bool ObjectLinkData::sub_7100D4EF30(act::ActorConstDataAccess& accessor) {
for (auto& link : mLinksOther.links) {
if (link.type == MapLinkDefType::Recreate && link.other_obj == accessor.getMapObject()) {
accessor.setActor687();
return true;
}
}
return false;
}

Object* ObjectLinkData::findObjectByActorName(const sead::SafeString& name) {
for (auto obj : mObjects) {
if (obj->getActorData().mActorName == name)
return obj;
}
return nullptr;
}

ObjectLink* ObjectLinkArray::findLinkWithType(MapLinkDefType type) {
return findLinkWithType_0(type);
}
Expand Down
Loading
Loading