44 physx::PxTriangleMesh *&triangleMesh,
physx::PxConvexMesh *&convexMesh,
50 QString cacheFilename = getCachedFilename(meshFilename, geom);
51 QFile cacheFile(cacheFilename);
52 QFile meshFile(meshFilename);
53 uchar *cacheData =
nullptr;
54 uchar *meshData =
nullptr;
56 auto cleanup = qScopeGuard([&] {
58 cacheFile.unmap(cacheData);
60 meshFile.unmap(meshData);
61 if (cacheFile.isOpen())
63 if (meshFile.isOpen())
67 if (!cacheFile.open(QIODevice::ReadOnly)) {
70 if (!meshFile.open(QIODevice::ReadOnly)) {
71 qWarning() <<
"Could not open" << meshFilename;
76 if (cacheFile.size() <= qint64(
sizeof(uint64_t))) {
77 qWarning() <<
"Invalid convex mesh from file" << cacheFilename;
81 cacheData = cacheFile.map(0, cacheFile.size());
83 qWarning() <<
"Could not map" << cacheFilename;
86 uint64_t cacheHash = *
reinterpret_cast<uint64_t *>(cacheData);
88 meshData = meshFile.map(0, meshFile.size());
90 qWarning() <<
"Could not map" << meshFilename;
93 uint64_t meshHash = qHash(QByteArrayView(meshData, meshFile.size()));
95 if (cacheHash != meshHash)
98 physx::PxDefaultMemoryInputData input(cacheData +
sizeof(uint64_t),
99 physx::PxU32(cacheFile.size() -
sizeof(uint64_t)));
103 triangleMesh = physics.createTriangleMesh(input);
104 qCDebug(lcQuick3dPhysics) <<
"Read triangle mesh" << triangleMesh <<
"from file"
109 convexMesh = physics.createConvexMesh(input);
110 qCDebug(lcQuick3dPhysics) <<
"Read convex mesh" << convexMesh <<
"from file"
114 case CacheGeometry::HeightField:
115 heightField = physics.createHeightField(input);
116 qCDebug(lcQuick3dPhysics) <<
"Read height field" << heightField <<
"from file"
128 QString cacheFilename = getCachedFilename(meshFilename, geom);
129 QFile cacheFile(cacheFilename);
130 QFile meshFile(meshFilename);
131 uchar *cacheData =
nullptr;
132 uchar *meshData =
nullptr;
134 auto cleanup = qScopeGuard([&] {
136 cacheFile.unmap(cacheData);
138 meshFile.unmap(meshData);
139 if (cacheFile.isOpen())
141 if (meshFile.isOpen())
145 if (!cacheFile.open(QIODevice::WriteOnly)) {
146 qCWarning(lcQuick3dPhysics) <<
"Could not open" << cacheFile.fileName() <<
"for writing.";
149 if (!meshFile.open(QIODevice::ReadOnly)) {
150 qWarning() <<
"Could not open" << meshFilename;
154 meshData = meshFile.map(0, meshFile.size());
156 qWarning() <<
"Could not map" << meshFilename;
159 uint64_t meshHash = qHash(QByteArrayView(meshData, meshFile.size()));
161 cacheFile.write(
reinterpret_cast<
char *>(&meshHash),
sizeof(uint64_t));
162 cacheFile.write(
reinterpret_cast<
char *>(buf.getData()), buf.getSize());
165 qCDebug(lcQuick3dPhysics) <<
"Wrote" << cacheFile.size() <<
"bytes to" << cacheFile.fileName();
184 physx::PxTriangleMesh *&triangleMesh,
physx::PxConvexMesh *&convexMesh,
187 QFile file(meshFilename);
188 uchar *data =
nullptr;
190 auto cleanup = qScopeGuard([&] {
197 if (!file.open(QIODevice::ReadOnly)) {
198 qWarning() <<
"Could not open" << meshFilename;
202 data = file.map(0, file.size());
204 qWarning() <<
"Could not map" << meshFilename;
208 physx::PxDefaultMemoryInputData input(data, physx::PxU32(file.size()));
212 triangleMesh = physics.createTriangleMesh(input);
216 convexMesh = physics.createConvexMesh(input);
219 case CacheGeometry::HeightField:
220 heightField = physics.createHeightField(input);