Files
godot/thirdparty/jolt_physics/Jolt/Physics/StateRecorderImpl.cpp
noahbackus 9d30169a8d
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
initial commit, 4.5 stable
2025-09-16 20:46:46 -04:00

91 lines
2.1 KiB
C++

// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#include <Jolt/Jolt.h>
#include <Jolt/Physics/StateRecorderImpl.h>
JPH_NAMESPACE_BEGIN
void StateRecorderImpl::WriteBytes(const void *inData, size_t inNumBytes)
{
mStream.write((const char *)inData, inNumBytes);
}
void StateRecorderImpl::Rewind()
{
mStream.seekg(0, std::stringstream::beg);
}
void StateRecorderImpl::Clear()
{
mStream.clear();
mStream.str({});
}
void StateRecorderImpl::ReadBytes(void *outData, size_t inNumBytes)
{
if (IsValidating())
{
// Read data in temporary buffer to compare with current value
void *data = JPH_STACK_ALLOC(inNumBytes);
mStream.read((char *)data, inNumBytes);
if (memcmp(data, outData, inNumBytes) != 0)
{
// Mismatch, print error
Trace("Mismatch reading %u bytes", (uint)inNumBytes);
for (size_t i = 0; i < inNumBytes; ++i)
{
int b1 = reinterpret_cast<uint8 *>(outData)[i];
int b2 = reinterpret_cast<uint8 *>(data)[i];
if (b1 != b2)
Trace("Offset %d: %02X -> %02X", i, b1, b2);
}
JPH_BREAKPOINT;
}
// Copy the temporary data to the final destination
memcpy(outData, data, inNumBytes);
return;
}
mStream.read((char *)outData, inNumBytes);
}
bool StateRecorderImpl::IsEqual(StateRecorderImpl &inReference)
{
// Get length of new state
mStream.seekg(0, std::stringstream::end);
std::streamoff this_len = mStream.tellg();
mStream.seekg(0, std::stringstream::beg);
// Get length of old state
inReference.mStream.seekg(0, std::stringstream::end);
std::streamoff reference_len = inReference.mStream.tellg();
inReference.mStream.seekg(0, std::stringstream::beg);
// Compare size
bool fail = reference_len != this_len;
if (fail)
{
Trace("Failed to properly recover state, different stream length!");
return false;
}
// Compare byte by byte
for (std::streamoff i = 0, l = this_len; !fail && i < l; ++i)
{
fail = inReference.mStream.get() != mStream.get();
if (fail)
{
Trace("Failed to properly recover state, different at offset %d!", (int)i);
return false;
}
}
return true;
}
JPH_NAMESPACE_END