Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
pxShapeScaling.cpp
Go to the documentation of this file.
1
2
4
5using namespace physx;
6
7namespace Divide {
8
9// Scales the given shape as precisely as possible.
10void Scale(PxShape&shape, const PxVec3&scaling) {
11 PxTransform pose = shape.getLocalPose();
12
13 PxGeometryHolder shapeGeom(shape.getGeometry());
14
15 switch ( shapeGeom.getType() ) {
16 case PxGeometryType::eBOX: {
17 PxBoxGeometry geom = shapeGeom.box();
18 Scale(geom, pose, scaling);
19 shape.setGeometry(geom);
20 } break;
21 case PxGeometryType::eSPHERE: {
22 PxSphereGeometry geom = shapeGeom.sphere();
23 Scale(geom, pose, scaling);
24 shape.setGeometry(geom);
25 } break;
26 case PxGeometryType::ePLANE: {
27 PxPlaneGeometry geom = shapeGeom.plane();
28 Scale(geom, pose, scaling);
29 shape.setGeometry(geom);
30 } break;
31 case PxGeometryType::eCAPSULE: {
32 PxCapsuleGeometry geom = shapeGeom.capsule();
33 Scale(geom, pose, scaling);
34 shape.setGeometry(geom);
35 } break;
36 case PxGeometryType::eCONVEXMESH: {
37 PxConvexMeshGeometry geom = shapeGeom.convexMesh();
38 Scale(geom, pose, scaling);
39 shape.setGeometry(geom);
40 } break;
41 case PxGeometryType::eTRIANGLEMESH: {
42 PxTriangleMeshGeometry geom = shapeGeom.triangleMesh();
43 Scale(geom, pose, scaling);
44 shape.setGeometry(geom);
45 } break;
46 default:
47 case PxGeometryType::eHEIGHTFIELD:
48 case PxGeometryType::eGEOMETRY_COUNT: break;
49 }
50
51 shape.setLocalPose(pose);
52}
53
54// Scales the given shape as precisely as possible.
55void Scale(PxGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
56 switch (geometry.getType()) {
57 case PxGeometryType::eBOX: Scale(static_cast<PxBoxGeometry&>(geometry), pose, scaling); break;
58 case PxGeometryType::eSPHERE: Scale(static_cast<PxSphereGeometry&>(geometry), pose, scaling); break;
59 case PxGeometryType::ePLANE: Scale(static_cast<PxPlaneGeometry&>(geometry), pose, scaling); break;
60 case PxGeometryType::eCAPSULE: Scale(static_cast<PxCapsuleGeometry&>(geometry), pose, scaling); break;
61 case PxGeometryType::eCONVEXMESH: Scale(static_cast<PxConvexMeshGeometry&>(geometry), pose, scaling); break;
62 case PxGeometryType::eTRIANGLEMESH: Scale(static_cast<PxTriangleMeshGeometry&>(geometry), pose, scaling); break;
63 default: break;
64 }
65}
66
67// Scales the given shape as precisely as possible.
68void Scale(PxBoxGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
69 // Shape-space approximation
70 const PxMat33 scaleMat =
71 PxMat33::createDiagonal(scaling) *
72 PxMat33(pose.q); // == (pose^-1 * scaling)^T
73 geometry.halfExtents.x *= scaleMat.column0.magnitude();
74 geometry.halfExtents.y *= scaleMat.column1.magnitude();
75 geometry.halfExtents.z *= scaleMat.column2.magnitude();
76
77 pose.p = pose.p.multiply(scaling);
78}
79
80// Scales the given shape as precisely as possible.
81void Scale(PxSphereGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
82 // Omnidirectional approximation
83 geometry.radius *= std::pow(std::abs(scaling.x * scaling.y * scaling.z), 1.0f / 3.0f);
84
85 pose.p = pose.p.multiply(scaling);
86}
87
88// Scales the given shape as precisely as possible.
89void Scale([[maybe_unused]] PxPlaneGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
90 pose.p = pose.p.multiply(scaling);
91}
92
93// Scales the given shape as precisely as possible.
94void Scale(PxCapsuleGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
95 // Shape-space approximation
96 const PxMat33 scaleMat =
97 PxMat33::createDiagonal(scaling) *
98 PxMat33(pose.q); // == (pose^-1 * scaling)^T
99 geometry.halfHeight *= scaleMat.column0.magnitude();
100 // Bi-directional shape-space approximation
101 geometry.radius *=
102 Sqrt(scaleMat.column1.magnitude() * scaleMat.column2.magnitude());
103
104 pose.p = pose.p.multiply(scaling);
105}
106
107// Scales the given shape as precisely as possible.
108void Scale(PxConvexMeshGeometry& geometry, PxTransform& pose, const PxVec3& scaling) {
109 // TODO: Remove WORKAROUND as soon as possible
110
111 // Shape-space approximation
112 const PxMat33 scaleMat =
113 PxMat33::createDiagonal(scaling) *
114 PxMat33(pose.q); // == (pose^-1 * scaling)^T
115 geometry.scale.scale.x *= scaleMat.column0.magnitude();
116 geometry.scale.scale.y *= scaleMat.column1.magnitude();
117 geometry.scale.scale.z *= scaleMat.column2.magnitude();
118
119 /* // MONITOR: only allows for one kind of scaling
120 geometry.scale.rotation = pose.q.getConjugate();
121 geometry.scale.scale = geometry.scale.scale.multiply(scaling);
122 */
123 pose.p = pose.p.multiply(scaling);
124}
125
126// Scales the given shape as precisely as possible.
127void Scale(PxTriangleMeshGeometry&geometry, PxTransform&pose, const PxVec3&scaling) {
128 // TODO: Remove WORKAROUND as soon as possible
129
130 // Shape-space approximation
131 const PxMat33 scaleMat =
132 PxMat33::createDiagonal(scaling) *
133 PxMat33(pose.q); // == (pose^-1 * scaling)^T
134 geometry.scale.scale.x *= scaleMat.column0.magnitude();
135 geometry.scale.scale.y *= scaleMat.column1.magnitude();
136 geometry.scale.scale.z *= scaleMat.column2.magnitude();
137
138 /* // MONITOR: only allows for one kind of scaling
139 geometry.scale.rotation = pose.q.getConjugate();
140 geometry.scale.scale = geometry.scale.scale.multiply(scaling);
141 */
142 pose.p = pose.p.multiply(scaling);
143}
144};
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
void Scale(physx::PxShape &shape, const physx::PxVec3 &scaling)
Scales the given shape as precisely as possible.
T Sqrt(T input) noexcept
Definition: MathHelper.inl:252
Definition: PhysX.h:45