载入中...
搜索中...
未找到
BeamSkillEffect.cpp
浏览该文件的文档.
2
3#include "common/Diagnostic.h"
4
5#include <cstdint>
6#include <string>
7#include <utility>
8
9namespace eve::stylize {
10
12 MeshEffectPlayback playback;
13 switch (preset_) {
15 geometry_.segments = 8;
16 geometry_.widthStart = 0.08f;
17 geometry_.widthEnd = 0.08f;
18 geometry_.alphaStart = 1.f;
19 geometry_.alphaEnd = 1.f;
20 geometry_.noiseAmplitude = 0.f;
21 playback.fadeIn = 0.03f;
22 playback.duration = 0.2f;
23 playback.fadeOut = 0.06f;
24 playback.loop = true;
25 effect_.style().setFloat("refractionStrength", 0.12f);
26 effect_.style().setFloat("flowWarp", 0.f);
27 effect_.style().setFloat("edgeDistortion", 0.f);
28 break;
30 geometry_.segments = 16;
31 geometry_.widthStart = 0.11f;
32 geometry_.widthEnd = 0.02f;
33 geometry_.noiseAmplitude = 0.18f;
34 geometry_.noiseCycles = 5.f;
35 geometry_.branchCount = 3;
36 playback.fadeIn = 0.01f;
37 playback.duration = 0.12f;
38 playback.fadeOut = 0.18f;
39 effect_.style().setFloat("refractionStrength", 0.08f);
40 effect_.style().setFloat("flowWarp", 0.35f);
41 effect_.style().setFloat("edgeDistortion", 0.25f);
42 break;
44 geometry_.segments = 10;
45 geometry_.widthStart = 0.09f;
46 geometry_.widthEnd = 0.025f;
47 geometry_.noiseAmplitude = 0.13f;
48 geometry_.noiseCycles = 4.f;
49 geometry_.branchCount = 1;
50 playback.fadeIn = 0.01f;
51 playback.duration = 0.18f;
52 playback.fadeOut = 0.2f;
53 effect_.style().setFloat("refractionStrength", 0.06f);
54 effect_.style().setFloat("flowWarp", 0.3f);
55 effect_.style().setFloat("edgeDistortion", 0.2f);
56 break;
57 }
58 effect_.setPlayback(playback);
59}
60
61void BeamSkillEffect::setPath(std::span<const glm::vec3> points) {
62 path_.assign(points.begin(), points.end());
63}
64
65void BeamSkillEffect::setEndpoints(const glm::vec3& start, const glm::vec3& end) {
66 path_ = {start, end};
67}
68
69BeamBuildResult BeamSkillEffect::build(const glm::vec3& cameraForward) const {
70 BeamBuildResult merged;
71 if (path_.size() < 2) {
73 return merged;
74 }
75 for (std::size_t segment = 1; segment < path_.size(); ++segment) {
76 BeamEffectConfig segmentConfig = geometry_;
77 segmentConfig.randomSeed = geometry_.randomSeed ^
78 static_cast<std::uint32_t>(segment * 0x9e3779b9u);
79 auto built = buildBeamEffect(path_[segment - 1u], path_[segment], cameraForward,
80 segmentConfig);
81 if (built.status != BeamBuildStatus::Built) return built;
82 const std::uint32_t base = static_cast<std::uint32_t>(merged.mesh.vertices.size());
83 merged.mesh.vertices.insert(merged.mesh.vertices.end(), built.mesh.vertices.begin(),
84 built.mesh.vertices.end());
85 merged.mesh.indices.reserve(merged.mesh.indices.size() + built.mesh.indices.size());
86 for (const auto index : built.mesh.indices) merged.mesh.indices.push_back(base + index);
87 }
89 return merged;
90}
91
93 MeshEffectRenderer& renderer, const glm::vec3& cameraForward,
94 const graphics::Color& tint) {
95 auto built = build(cameraForward);
96 if (built.status != BeamBuildStatus::Built) {
97 const auto code = built.status == BeamBuildStatus::DegenerateInput
101 code, "beam skill path could not produce renderable geometry", {}, {},
102 "stylize.beam-skill"));
103 }
104 return renderer.submitTrail(effect_, built.mesh, glm::mat4(1.f), tint);
105}
106
107} // namespace eve::stylize
Duration start
Stable, structured diagnostics shared by engine modules.
DiagnosticCode code
glm::vec4 tint
std::shared_ptr< const std::vector< glm::vec2 > > points
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 failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
BeamSkillEffect(BeamSkillPreset preset)
Construct one recipe and apply preset geometry/style defaults.
eve::Result< MeshEffectSubmitStatus > submit(MeshEffectRenderer &renderer, const glm::vec3 &cameraForward, const graphics::Color &tint=graphics::Color(1.f))
Build and submit the current path through the shared Trail renderer.
void setPath(std::span< const glm::vec3 > points)
Replace the owning world-space path; at least two points are required to build.
void setEndpoints(const glm::vec3 &start, const glm::vec3 &end)
Convenience two-point path assignment.
BeamBuildResult build(const glm::vec3 &cameraForward) const
Build and merge every path segment into one owning ribbon snapshot.
void setPlayback(MeshEffectPlayback playback)
Replace timing after validating finite non-negative durations.
StyleInstance & style() noexcept
Access the owned mutable style parameter instance.
Definition MeshEffect.h:77
Render-thread adapter from stylize runtime state to Graphics mesh draws.
eve::Result< MeshEffectSubmitStatus > submitTrail(MeshEffectInstance &effect, const TrailMeshSnapshot &snapshot, const glm::mat4 &model=glm::mat4(1.f), const graphics::Color &tint=graphics::Color(1.f))
Upload and draw one dynamic ribbon using an active mesh effect.
void setFloat(const std::string &name, float value)
Sets the float.
eve::Color Color
RGBA color used by every graphics draw call. Lives inside eve::graphics so including a graphics heade...
Definition Color.h:13
BeamBuildResult buildBeamEffect(const glm::vec3 &start, const glm::vec3 &end, const glm::vec3 &cameraForward, const BeamEffectConfig &config)
Generate a camera-facing beam or branched lightning ribbon.
BeamSkillPreset
Production-oriented beam behavior preset.
Owning beam generation result suitable for MeshEffectRenderer::submitTrail.
Definition BeamEffect.h:33
Shape and deterministic noise controls for one 3D beam or lightning arc.
Definition BeamEffect.h:14
Deterministic timing configuration for one mesh effect playback.
Definition MeshEffect.h:24
std::vector< std::uint32_t > indices
Definition TrailEffect.h:44
std::vector< TrailVertex > vertices
Definition TrailEffect.h:43