mirror of https://github.com/zeldaret/botw.git
Havok: Add hkpSimulation
This commit is contained in:
parent
820dc02de1
commit
88d2bc5942
|
@ -128,6 +128,7 @@ add_library(hkStubs OBJECT
|
||||||
Havok/Physics2012/Dynamics/World/hkpWorldObject.h
|
Havok/Physics2012/Dynamics/World/hkpWorldObject.h
|
||||||
Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h
|
Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h
|
||||||
Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h
|
Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h
|
||||||
|
Havok/Physics2012/Dynamics/World/Simulation/hkpSimulation.h
|
||||||
|
|
||||||
Havok/Physics2012/Utilities/Serialize/hkpPhysicsData.h
|
Havok/Physics2012/Utilities/Serialize/hkpPhysicsData.h
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Havok/Common/Base/hkBase.h>
|
||||||
|
#include <Havok/Physics2012/Dynamics/World/hkpWorld.h>
|
||||||
|
|
||||||
|
class hkpAgentNnEntry;
|
||||||
|
class hkpConstraintQueryIn;
|
||||||
|
class hkpProcessCollisionOutput;
|
||||||
|
class hkpWorld;
|
||||||
|
|
||||||
|
class hkpSimulation : public hkReferencedObject {
|
||||||
|
public:
|
||||||
|
HK_DECLARE_CLASS_ALLOCATOR(hkpSimulation)
|
||||||
|
HK_DECLARE_REFLECTION()
|
||||||
|
|
||||||
|
enum FindContacts {
|
||||||
|
FIND_CONTACTS_DEFAULT = 0,
|
||||||
|
FIND_CONTACTS_EXTRA,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ResetCollisionInformation {
|
||||||
|
RESET_TOI = 1,
|
||||||
|
RESET_TIM = 2,
|
||||||
|
RESET_AABB = 4,
|
||||||
|
RESET_ALL = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
using AgentEntryProcessFunction = void (hkpSimulation::*)(hkpAgentNnEntry*,
|
||||||
|
const hkpProcessCollisionInput&,
|
||||||
|
hkpProcessCollisionOutput&);
|
||||||
|
|
||||||
|
explicit hkpSimulation(hkpWorld* world);
|
||||||
|
explicit hkpSimulation(hkFinishLoadedObjectFlag flag) : hkReferencedObject(flag) {}
|
||||||
|
~hkpSimulation() override;
|
||||||
|
|
||||||
|
virtual hkpStepResult stepDeltaTime(hkReal physicsDeltaTime);
|
||||||
|
virtual hkpStepResult integrate(hkReal physicsDeltaTime);
|
||||||
|
virtual hkpStepResult collide();
|
||||||
|
virtual hkpStepResult advanceTime();
|
||||||
|
|
||||||
|
void setFrameTimeMarker(hkReal frameDeltaTime);
|
||||||
|
bool isSimulationAtMarker();
|
||||||
|
bool isSimulationAtPsi() const;
|
||||||
|
|
||||||
|
virtual hkpStepResult stepBeginSt(hkJobQueue* queue, hkReal physicsDeltaTime) {
|
||||||
|
return HK_STEP_RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual hkpStepResult finishMtStep(hkJobQueue* queue, hkThreadPool* threadPool) {
|
||||||
|
return HK_STEP_RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void getMultithreadConfig(hkpMultithreadConfig& config) {}
|
||||||
|
virtual void setMultithreadConfig(const hkpMultithreadConfig& config, hkJobQueue* queue) {}
|
||||||
|
|
||||||
|
hkpWorld* getWorld() const { return m_world; }
|
||||||
|
|
||||||
|
hkReal getCurrentTime() const { return m_currentTime; }
|
||||||
|
hkReal getCurrentPsiTime() const { return m_currentPsiTime; }
|
||||||
|
hkReal getSimulateUntilTime() const { return m_simulateUntilTime; }
|
||||||
|
hkReal getPhysicsDeltaTime() const { return m_physicsDeltaTime; }
|
||||||
|
hkReal getFrameMarkerPsiSnap() const { return m_frameMarkerPsiSnap; }
|
||||||
|
|
||||||
|
virtual void collideEntitiesDiscrete(hkpEntity** entities, int numEntities, hkpWorld* world,
|
||||||
|
const hkStepInfo& stepInfo,
|
||||||
|
FindContacts findExtraContacts);
|
||||||
|
|
||||||
|
static void collideEntitiesBroadPhaseDiscrete(hkpEntity** entities, int numEntities,
|
||||||
|
hkpWorld* world);
|
||||||
|
|
||||||
|
void collideEntitiesNarrowPhaseDiscrete(hkpEntity** entities, int numEntities,
|
||||||
|
const hkpProcessCollisionInput& input,
|
||||||
|
FindContacts findExtraContacts);
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
resetCollisionInformationForEntities(hkpEntity** entities, int numEntities, hkpWorld* world,
|
||||||
|
enum ResetCollisionInformation resetInfo = RESET_ALL);
|
||||||
|
|
||||||
|
virtual void assertThereIsNoCollisionInformationForEntities(hkpEntity** entities,
|
||||||
|
int numEntities, hkpWorld* world) {}
|
||||||
|
|
||||||
|
virtual void removeCollisionInformationForAgent(hkpAgentNnEntry* agent) {}
|
||||||
|
|
||||||
|
virtual void assertThereIsNoCollisionInformationForAgent(hkpAgentNnEntry* agent) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend class hkpWorld;
|
||||||
|
friend class hkpWorldOperationQueue;
|
||||||
|
friend class hkpWorldMemoryUtil;
|
||||||
|
|
||||||
|
virtual void reintegrateAndRecollideEntities(hkpEntity** entityBatch, int numEntities,
|
||||||
|
hkpWorld* world, int reintegrateRecollideMode);
|
||||||
|
|
||||||
|
void checkDeltaTimeIsOk(hkReal deltaTime);
|
||||||
|
hkpStepResult reCollideAfterStepFailure();
|
||||||
|
virtual void collideInternal(const hkStepInfo& stepInfoIn);
|
||||||
|
hkpStepResult integrateInternal(const hkStepInfo& stepInfoIn);
|
||||||
|
void applyActions();
|
||||||
|
|
||||||
|
static void integrateIsland(hkpSimulationIsland* isle, const hkpWorldDynamicsStepInfo& stepInfo,
|
||||||
|
hkpConstraintQueryIn& constraintQueryIn);
|
||||||
|
|
||||||
|
static void collideIslandNarrowPhaseDiscrete(hkpSimulationIsland* isle,
|
||||||
|
const hkpProcessCollisionInput& input);
|
||||||
|
|
||||||
|
hkReal snapSimulateTimeAndGetTimeToAdvanceTo();
|
||||||
|
|
||||||
|
void processAgentsOfEntities(hkpEntity** entities, int numEntities,
|
||||||
|
const hkpProcessCollisionInput& input,
|
||||||
|
AgentEntryProcessFunction processingFunction,
|
||||||
|
FindContacts findExtraContacts);
|
||||||
|
|
||||||
|
void processAgentCollideDiscrete(hkpAgentNnEntry* entry,
|
||||||
|
const hkpProcessCollisionInput& processInput,
|
||||||
|
hkpProcessCollisionOutput& processOutput);
|
||||||
|
|
||||||
|
void processAgentResetCollisionInformation(hkpAgentNnEntry* entry,
|
||||||
|
const hkpProcessCollisionInput& processInput,
|
||||||
|
hkpProcessCollisionOutput& processOutput);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void warpTime(hkReal deltaTime) {}
|
||||||
|
|
||||||
|
void setCurrentTime(hkTime time) { m_currentTime = time; }
|
||||||
|
void setCurrentPsiTime(hkTime time) { m_currentPsiTime = time; }
|
||||||
|
void setSimulateUntilTime(hkTime time) { m_simulateUntilTime = time; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum LastProcessingStep { INTEGRATE, COLLIDE };
|
||||||
|
|
||||||
|
hkUint32 m_determinismCheckFrameCounter;
|
||||||
|
hkpWorld* m_world;
|
||||||
|
hkEnum<LastProcessingStep, hkUint8> m_lastProcessingStep;
|
||||||
|
hkTime m_currentTime;
|
||||||
|
hkTime m_currentPsiTime;
|
||||||
|
hkReal m_physicsDeltaTime;
|
||||||
|
hkTime m_simulateUntilTime;
|
||||||
|
hkReal m_frameMarkerPsiSnap;
|
||||||
|
hkUint32 m_previousStepResult;
|
||||||
|
};
|
Loading…
Reference in New Issue