feat(physics): add runtime physics scaffolding
This commit is contained in:
76
engine/src/Components/CapsuleColliderComponent.cpp
Normal file
76
engine/src/Components/CapsuleColliderComponent.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
#include "Components/CapsuleColliderComponent.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <sstream>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Components {
|
||||
|
||||
namespace {
|
||||
|
||||
float SanitizePositive(float value, float fallback) {
|
||||
return std::isfinite(value) && value > 0.0f ? value : fallback;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void CapsuleColliderComponent::SetRadius(float value) {
|
||||
m_radius = SanitizePositive(value, 0.5f);
|
||||
m_height = std::max(m_height, m_radius * 2.0f);
|
||||
}
|
||||
|
||||
void CapsuleColliderComponent::SetHeight(float value) {
|
||||
m_height = std::max(SanitizePositive(value, 2.0f), m_radius * 2.0f);
|
||||
}
|
||||
|
||||
void CapsuleColliderComponent::SetAxis(ColliderAxis value) {
|
||||
switch (value) {
|
||||
case ColliderAxis::X:
|
||||
case ColliderAxis::Y:
|
||||
case ColliderAxis::Z:
|
||||
m_axis = value;
|
||||
break;
|
||||
default:
|
||||
m_axis = ColliderAxis::Y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CapsuleColliderComponent::Serialize(std::ostream& os) const {
|
||||
SerializeBase(os);
|
||||
os << "radius=" << m_radius << ";";
|
||||
os << "height=" << m_height << ";";
|
||||
os << "axis=" << static_cast<int>(m_axis) << ";";
|
||||
}
|
||||
|
||||
void CapsuleColliderComponent::Deserialize(std::istream& is) {
|
||||
std::string token;
|
||||
while (std::getline(is, token, ';')) {
|
||||
if (token.empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const size_t eqPos = token.find('=');
|
||||
if (eqPos == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const std::string key = token.substr(0, eqPos);
|
||||
const std::string value = token.substr(eqPos + 1);
|
||||
if (DeserializeBaseField(key, value)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key == "radius") {
|
||||
SetRadius(std::stof(value));
|
||||
} else if (key == "height") {
|
||||
SetHeight(std::stof(value));
|
||||
} else if (key == "axis") {
|
||||
SetAxis(static_cast<ColliderAxis>(std::stoi(value)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Components
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user