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
|