summaryrefslogtreecommitdiff
path: root/Runtime/Dynamics/PhysicsTest.cpp
blob: aa5575e3a76135f873087447150d91659212636c (plain)
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
#include "UnityPrefix.h"
#include "Configuration/UnityConfigure.h"

#if ENABLE_UNIT_TESTS

#include "Runtime/Dynamics/BoxCollider.h"
#include "Runtime/Dynamics/RigidBody.h"
#include "Runtime/Misc/GameObjectUtility.h"
#include "Runtime/Graphics/Transform.h"
#include "External/PhysX/builds/SDKs/Physics/include/NxPhysics.h"


void RunPhysicsTests ();

void SetParentAttachesColliderToRigidbody ();
void RemovingRididbodyComponentReattachesStaticCollider ();
void RemovingRididbodyComponentReattachesColliderToNextRigidbody ();

///@TODO: Tests for Joints losing connectiong with rigidbody etc. There seems to be no C++ code handling this properly???


void RunPhysicsTests ()
{
	SetParentAttachesColliderToRigidbody ();
	RemovingRididbodyComponentReattachesStaticCollider ();
	RemovingRididbodyComponentReattachesColliderToNextRigidbody ();
}


// Changing parent of collider will reattach collider to rigidbody and deatch it.
void SetParentAttachesColliderToRigidbody ()
{
	GameObject& root = CreateGameObject("Root", "Transform", "Rigidbody", NULL);
	GameObject& colliderChild = CreateGameObject("Child", "Transform", "BoxCollider", NULL);
	colliderChild.GetComponent(Transform).SetParent(root.QueryComponent(Transform));
	
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData != root.QueryComponent(Rigidbody));
	Assert(&colliderChild.GetComponent(BoxCollider).GetShape()->getActor() == root.GetComponent(Rigidbody).GetActor());
	
	colliderChild.GetComponent(Transform).SetParent(NULL);
	
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData == NULL);
	
	colliderChild.GetComponent(Transform).SetParent(root.QueryComponent(Transform));
	
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData != root.QueryComponent(Rigidbody));
	Assert(&colliderChild.GetComponent(BoxCollider).GetShape()->getActor() == root.GetComponent(Rigidbody).GetActor());
}

/// @TODO: Test Modify hierarchy through prefab instantiate change. For example parenting change. Does it set up shapes correctly.
/// Manually verify that we dont call Recreate too often, especially when destroying a whole hierarchy.

void RemovingRididbodyComponentReattachesStaticCollider ()
{
	// Rigidbody
	// - Collider
	// 1) Remove Rigidbody component
	// -> Rigidbody Cleanup is called once. No create is called.
	// -> Collider becomes static collider
	
	GameObject& root = CreateGameObject("Root", "Transform", "Rigidbody", NULL);
	GameObject& colliderChild = CreateGameObject("Child", "Transform", "BoxCollider", NULL);
	colliderChild.GetComponent(Transform).SetParent(root.QueryComponent(Transform));
	
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData != root.QueryComponent(Rigidbody));
	Assert(&colliderChild.GetComponent(BoxCollider).GetShape()->getActor() == root.GetComponent(Rigidbody).GetActor());
	DestroyObjectHighLevel(root.QueryComponent(Rigidbody));
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData == NULL);
}

void RemovingRididbodyComponentReattachesColliderToNextRigidbody ()
{
	// Rigidbody
	// - Rigidbody
	//   - Collider
	// 1) Remove Rigidbody component
	// -> Rigidbody Cleanup is called once. No create is called.
	// -> Collider 
	
	GameObject& root = CreateGameObject("Root", "Transform", "Rigidbody", NULL);
	GameObject& rbChild = CreateGameObject("Root", "Transform", "Rigidbody", NULL);
	GameObject& colliderChild = CreateGameObject("Child", "Transform", "BoxCollider", NULL);
	rbChild.GetComponent(Transform).SetParent(root.QueryComponent(Transform));
	colliderChild.GetComponent(Transform).SetParent(rbChild.QueryComponent(Transform));
	
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData != NULL);
	Assert(&colliderChild.GetComponent(BoxCollider).GetShape()->getActor() == rbChild.GetComponent(Rigidbody).GetActor());
	
	DestroyObjectHighLevel(root.QueryComponent(Rigidbody));
	Assert(colliderChild.GetComponent(BoxCollider).GetShape()->getActor().userData == root.GetComponent(Rigidbody).GetActor());
}

#endif