7#include <QtQuick3D/QQuick3DGeometry>
8#include <geometry/PxCapsuleGeometry.h>
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
32
33
34
35
36
39
40
41
42
43
45QCapsuleShape::QCapsuleShape() =
default;
47QCapsuleShape::~QCapsuleShape()
49 delete m_physXGeometry;
52physx::PxGeometry *QCapsuleShape::getPhysXGeometry()
54 if (!m_physXGeometry || m_scaleDirty) {
55 updatePhysXGeometry();
58 return m_physXGeometry;
61float QCapsuleShape::diameter()
const
66void QCapsuleShape::setDiameter(
float newDiameter)
68 if (!qIsFinite(newDiameter) || newDiameter <= 0.f) {
69 qWarning() <<
"CapsuleShape: diameter must be finite and greater than zero, ignoring"
74 if (qFuzzyCompare(m_diameter, newDiameter))
76 m_diameter = newDiameter;
77 updatePhysXGeometry();
79 emit needsRebuild(
this);
80 emit diameterChanged();
83float QCapsuleShape::height()
const
88void QCapsuleShape::setHeight(
float newHeight)
90 if (!qIsFinite(newHeight) || newHeight <= 0.f) {
91 qWarning() <<
"CapsuleShape: height must be finite and greater than zero, ignoring"
96 if (qFuzzyCompare(m_height, newHeight))
99 updatePhysXGeometry();
101 emit needsRebuild(
this);
102 emit heightChanged();
105void QCapsuleShape::updatePhysXGeometry()
107 delete m_physXGeometry;
108 m_physXGeometry =
nullptr;
109 m_scaleDirty =
false;
111 QVector3D s = sceneScale();
112 const float radius = s.y() * m_diameter * 0.5f;
113 const float halfHeight = s.x() * m_height * 0.5f;
114 if (!qIsFinite(radius) || radius <= 0.f || !qIsFinite(halfHeight) || halfHeight <= 0.f) {
115 qWarning() <<
"CapsuleShape: scaled radius/height must be finite and greater than "
119 m_physXGeometry =
new physx::PxCapsuleGeometry(radius, halfHeight);
Combined button and popup list for selecting options.