aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/framework/include/ApexSceneUserNotify.h
blob: c203087cd19df74f38abe3157b138e89dce9615f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Copyright (c) 2008-2017, NVIDIA CORPORATION.  All rights reserved.
 *
 * NVIDIA CORPORATION and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an express
 * license agreement from NVIDIA CORPORATION is strictly prohibited.
 */


#ifndef APEX_SCENE_USER_NOTIFY_H
#define APEX_SCENE_USER_NOTIFY_H

#include "ApexDefs.h"

#if PX_PHYSICS_VERSION_MAJOR == 3

#include <ApexUsingNamespace.h>

#include <PxSimulationEventCallback.h>
#include <PxContactModifyCallback.h>

#include "PxSimpleTypes.h"
#include <PsArray.h>
#include <PsAllocator.h>


namespace nvidia
{
namespace apex
{

class ApexSceneUserNotify : public physx::PxSimulationEventCallback
{
public:
	ApexSceneUserNotify() : mAppNotify(NULL), mBatchAppNotify(false) {}
	virtual ~ApexSceneUserNotify();

	void addModuleNotifier(physx::PxSimulationEventCallback& notify);
	void removeModuleNotifier(physx::PxSimulationEventCallback& notify);

	void setApplicationNotifier(physx::PxSimulationEventCallback* notify)
	{
		mAppNotify = notify;
	}
	PxSimulationEventCallback* getApplicationNotifier() const
	{
		return mAppNotify;
	}

	void setBatchAppNotify(bool enable)
	{
		mBatchAppNotify = enable;
	}
	void playBatchedNotifications();

private:
	// from PxSimulationEventCallback
	virtual void onConstraintBreak(physx::PxConstraintInfo* constraints, uint32_t count);
	virtual void onWake(PxActor** actors, uint32_t count);
	virtual void onSleep(PxActor** actors, uint32_t count);
	virtual void onContact(const physx::PxContactPairHeader& pairHeader, const physx::PxContactPair* pairs, uint32_t nbPairs);
	virtual void onTrigger(physx::PxTriggerPair* pairs, uint32_t count);
	virtual void onAdvance(const PxRigidBody*const* bodyBuffer, const PxTransform* poseBuffer, const PxU32 count);

private:
	Array<physx::PxSimulationEventCallback*>	mModuleNotifiers;
	PxSimulationEventCallback*			mAppNotify;


	// for batch notification
	bool								mBatchAppNotify;

	// onConstraintBreak
	Array<physx::PxConstraintInfo>		mBatchedBreakNotifications;

	// onContact
	struct BatchedContactNotification
	{
		BatchedContactNotification(const physx::PxContactPairHeader& _pairHeader, const physx::PxContactPair* _pairs, uint32_t _nbPairs)
		{
			pairHeader			= _pairHeader;
			nbPairs				= _nbPairs;

			pairs = (physx::PxContactPair *)PX_ALLOC(sizeof(physx::PxContactPair) * nbPairs, PX_DEBUG_EXP("BatchedContactNotifications"));
			PX_ASSERT(pairs != NULL);
			for (uint32_t i=0; i<nbPairs; i++)
			{
				pairs[i] = _pairs[i];
			}
		}

		~BatchedContactNotification()
		{
			if (pairs)
			{
				PX_FREE(pairs);
				pairs = NULL;
			}
		}

		physx::PxContactPairHeader pairHeader;
		physx::PxContactPair *		pairs;
		uint32_t				nbPairs;
	};
	Array<BatchedContactNotification>		mBatchedContactNotifications;
	Array<uint32_t>							mBatchedContactStreams;

	// onWake/onSleep
	struct SleepWakeBorders
	{
		SleepWakeBorders(uint32_t s, uint32_t c, bool sleep) : start(s), count(c), sleepEvents(sleep) {}
		uint32_t start;
		uint32_t count;
		bool sleepEvents;
	};
	Array<SleepWakeBorders>				mBatchedSleepWakeEventBorders;
	Array<PxActor*>						mBatchedSleepEvents;
	Array<PxActor*>						mBatchedWakeEvents;

	// onTrigger
	Array<physx::PxTriggerPair> mBatchedTriggerReports;
};


class ApexSceneUserContactModify : public PxContactModifyCallback
{
public:
	ApexSceneUserContactModify();
	virtual ~ApexSceneUserContactModify();

	void addModuleContactModify(physx::PxContactModifyCallback& contactModify);
	void removeModuleContactModify(physx::PxContactModifyCallback& contactModify);

	void setApplicationContactModify(physx::PxContactModifyCallback* contactModify);
	PxContactModifyCallback* getApplicationContactModify() const
	{
		return mAppContactModify;
	}

private:
	// from PxContactModifyCallback
	virtual void onContactModify(physx::PxContactModifyPair* const pairs, uint32_t count);

private:
	Array<physx::PxContactModifyCallback*>	mModuleContactModify;
	PxContactModifyCallback*	   	mAppContactModify;
};

}
} // namespace nvidia::apex

#endif // PX_PHYSICS_VERSION_MAJOR == 3

#endif