载入中...
搜索中...
未找到
SoftBodyModel.cpp
浏览该文件的文档.
2
3#include <cmath>
4
5namespace eve::physics {
6 // namespace
7
9 if (sourceMesh.empty()) return eve::Result<void>::failure(
10 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "sourceMesh must not be empty", "sourceMesh"));
11 if (particles.empty()) return eve::Result<void>::failure(
12 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "model must contain particles", "particles"));
13 for (std::size_t index = 0; index < particles.size(); ++index) {
14 const auto& particle = particles[index];
15 if (!std::isfinite(particle.x) || !std::isfinite(particle.y) || !std::isfinite(particle.z))
17 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "particle position must be finite", "particles[" + std::to_string(index) + "]"));
18 }
19 if (surfaceIndices.empty() || surfaceIndices.size() % 3 != 0)
21 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "surface indices must contain complete triangles", "surfaceIndices"));
22 for (const auto index : surfaceIndices)
24 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "surface index is out of range", "surfaceIndices"));
26 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "surface bindings must not be empty", "surfaceBindings"));
27 for (const auto& binding : surfaceBindings)
28 if (binding.particleIndex >= particles.size())
30 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "surface binding particle is out of range", "surfaceBindings"));
31 if (clusters.empty()) return eve::Result<void>::failure(
32 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "model must contain shape clusters", "clusters"));
33 for (const auto& cluster : clusters) {
34 if (cluster.particleIndices.size() < 3)
36 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "shape cluster must contain at least three particles", "clusters"));
37 for (const auto index : cluster.particleIndices)
38 if (index >= particles.size()) return eve::Result<void>::failure(
39 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "cluster particle is out of range", "clusters"));
40 }
42}
43
44} // namespace eve::physics
eve::action::ActionVfxBinding binding
uint32_t index
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
eve::Result< void > validate() const
Validate all finite values, topology indices, bindings and clusters.
std::vector< std::uint32_t > surfaceIndices
std::vector< SoftBodyModelCluster > clusters
std::vector< SoftBodyModelParticle > particles
std::vector< SoftBodyModelSurfaceBinding > surfaceBindings