Revision control

Copy as Markdown

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef STATICPHYSXOBJECTS_H
#define STATICPHYSXOBJECTS_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qtconfigmacros.h"
#include <QtCore/qhash.h>
#include "extensions/PxDefaultAllocator.h"
#include "extensions/PxDefaultErrorCallback.h"
namespace physx {
class PxFoundation;
class PxPhysics;
class PxDefaultCpuDispatcher;
class PxMaterial;
}
QT_BEGIN_NAMESPACE
// The properties of a physics material. PhysX allows at most 64K materials, so instead of
// creating one per node, all nodes needing the same properties share a single PxMaterial. This
// means the materials must be treated as immutable: a node whose properties change is moved to
// the material with the new properties instead.
struct PhysicsMaterialProperties
{
float staticFriction = 0.f;
float dynamicFriction = 0.f;
float restitution = 0.f;
// Properties that no material can have, since friction and restitution are never negative.
// Used by the nodes to tell that they have not picked up a material yet.
static constexpr PhysicsMaterialProperties none() { return { -1.f, -1.f, -1.f }; }
friend bool operator==(const PhysicsMaterialProperties &lhs,
const PhysicsMaterialProperties &rhs) noexcept
{
return lhs.staticFriction == rhs.staticFriction
&& lhs.dynamicFriction == rhs.dynamicFriction
&& lhs.restitution == rhs.restitution;
}
friend size_t qHash(const PhysicsMaterialProperties &properties, size_t seed = 0) noexcept
{
return qHashMulti(seed, properties.staticFriction, properties.dynamicFriction,
properties.restitution);
}
};
struct SharedPhysicsMaterial
{
physx::PxMaterial *material = nullptr;
int nodeCount = 0;
};
struct StaticPhysXObjects
{
physx::PxDefaultErrorCallback defaultErrorCallback;
physx::PxDefaultAllocator defaultAllocatorCallback;
physx::PxFoundation *foundation = nullptr;
physx::PxPhysics *physics = nullptr;
physx::PxDefaultCpuDispatcher *dispatcher = nullptr;
// The materials in use, one per distinct set of properties, and how many nodes use each.
// They belong to 'physics' and are destroyed together with it.
QHash<PhysicsMaterialProperties, SharedPhysicsMaterial> materials;
unsigned int foundationRefCount = 0;
bool foundationCreated = false;
bool physicsCreated = false;
static StaticPhysXObjects &getReference();
};
QT_END_NAMESPACE
#endif