载入中...
搜索中...
未找到
ProceduralBoneOverlay.cpp
浏览该文件的文档.
10editing::GizmoSnapshot ProceduralBoneOverlayBuilder::build(std::string target,editing::Revision revision,const animation::DynamicBoneSolver* dynamicSolver,const animation::FootIKSolver* footSolver,const ProceduralBoneOverlayOptions& options) const {
12 if(result.target.empty()||options.maximumPrimitives==0||(!dynamicSolver&&!footSolver)){result.diagnostics.push_back(editing::ruleDiagnostic(DiagnosticCode::PreconditionViolation,editing::RuleId("editor.procedural-bone.overlay-input"),editing::DiagnosticSeverity::Error,"Procedural bone overlay requires a target, solver and non-zero budget"));return result;}
13 auto append=[&](editing::GizmoPrimitive primitive){if(result.primitives.size()<options.maximumPrimitives)result.primitives.push_back(std::move(primitive));};
14 if(dynamicSolver){const auto snapshot=dynamicSolver->debugSnapshot();if(options.showParticles){std::map<int,animation::DynamicBoneDebugParticle> previous;for(const auto& p:snapshot.particles){const std::array<double,4> color=p.sleeping?std::array<double,4>{0.45,0.45,0.45,1.0}:std::array<double,4>{0.2,0.85,1.0,1.0};append({"dynamic-chain-"+std::to_string(p.chain)+"-particle-"+std::to_string(p.particle),"dynamic-bone-particle",{p.x,p.y,p.z},{},{},color,std::max<double>(p.radius,0.015),0.0,p.sleeping});if(auto found=previous.find(p.chain);found!=previous.end()){const auto& a=found->second;const double dx=p.x-a.x,dy=p.y-a.y,dz=p.z-a.z,length=std::sqrt(dx*dx+dy*dy+dz*dz);if(length>1e-9)append({"dynamic-chain-"+std::to_string(p.chain)+"-segment-"+std::to_string(p.particle),"dynamic-bone-segment",{a.x,a.y,a.z},{},{dx/length,dy/length,dz/length},color,0.0,length,p.sleeping});}previous[p.chain]=p;}}
15 if(options.showColliders)for(size_t i=0;i<snapshot.colliders.size();++i){const auto& c=snapshot.colliders[i];const std::array<double,4> color=!c.enabled?std::array<double,4>{0.4,0.4,0.4,0.7}:c.inside?std::array<double,4>{0.3,1.0,0.45,1.0}:std::array<double,4>{1.0,0.45,0.15,1.0};double dx=c.endX-c.startX,dy=c.endY-c.startY,dz=c.endZ-c.startZ,length=std::sqrt(dx*dx+dy*dy+dz*dz);append({"dynamic-collider-"+std::to_string(i),c.capsule?"dynamic-bone-capsule":"dynamic-bone-sphere",{c.startX,c.startY,c.startZ},{},length>1e-9?std::array<double,3>{dx/length,dy/length,dz/length}:std::array<double,3>{0.0,1.0,0.0},color,c.radius,c.capsule?length:0.0,!c.enabled});}}
16 if(footSolver&&options.showFootIK){const auto snapshot=footSolver->debugSnapshot();auto foot=[&](const char* name,const animation::FootIKDebugFoot& f){if(!f.configured||!f.contact)return;const std::array<double,4> color=f.locked?std::array<double,4>{1.0,0.78,0.1,1.0}:std::array<double,4>{0.25,1.0,0.55,1.0};append({std::string("foot-ik-")+name+"-contact","foot-ik-contact",{f.x,f.y,f.z},{},{},color,0.035,0.0,false});append({std::string("foot-ik-")+name+"-normal","foot-ik-normal",{f.x,f.y,f.z},{},{f.nx,f.ny,f.nz},color,0.0,0.25,false});if(f.toeConfigured)append({std::string("foot-ik-")+name+"-toe","foot-ik-toe",{f.toeX,f.toeY,f.toeZ},{},{},color,0.025,0.0,false});};foot("left",snapshot.left);foot("right",snapshot.right);}
17 if(result.primitives.size()>=options.maximumPrimitives)result.diagnostics.push_back(editing::ruleDiagnostic(DiagnosticCode::PreconditionViolation,editing::RuleId("editor.procedural-bone.overlay-budget"),editing::DiagnosticSeverity::Warning,"Procedural bone overlay reached its primitive budget"));
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
World-space spring-chain solver that writes results as local bone rotations.
Definition DynamicBoneSolver.h:37
DynamicBoneDebugSnapshot debugSnapshot() const
Copy current particles and colliders for tooling visualization.
Definition DynamicBoneSolver.cpp:264
Paired-foot IK with contact smoothing and pelvis compensation.
Definition FootIKSolver.h:32
FootIKDebugSnapshot debugSnapshot() const
Copy smoothed contacts and lock state for tooling visualization.
Definition FootIKSolver.cpp:129
editing::GizmoSnapshot build(std::string target, editing::Revision revision, const animation::DynamicBoneSolver *dynamicSolver, const animation::FootIKSolver *footSolver, const ProceduralBoneOverlayOptions &options={}) const
Build an owning immutable overlay from optional borrowed solvers.
Definition ProceduralBoneOverlay.cpp:10
Definition AnimationClip.cpp:10
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
Definition EditingResult.h:25
@ PreconditionViolation
Immutable model-space state for one foot in a tooling snapshot.
Definition FootIKSolver.h:24
Feature toggles and safety budget for procedural animation overlays.
Definition ProceduralBoneOverlay.h:12
Renderer-neutral wire primitive for authoring viewport overlays.
Definition EditingGizmo.h:12
Immutable revision-tagged overlay snapshot consumed by any viewport renderer.
Definition EditingGizmo.h:27
std::vector< GizmoPrimitive > primitives
Definition EditingGizmo.h:31
std::vector< Diagnostic > diagnostics
Definition EditingGizmo.h:32