载入中...
搜索中...
未找到
AreaIndicatorEffect.cpp
浏览该文件的文档.
2
3#include <glm/gtc/constants.hpp>
4
5#include <algorithm>
6#include <cmath>
7
8namespace eve::stylize {
9namespace {
10
11TrailVertex vertex(float x, float z, float u, float v, float alpha) {
12 return {{x, 0.f, z}, {u, v}, alpha};
13}
14
15void appendFan(TrailMeshSnapshot& mesh, float radius, float startAngle, float angle,
16 std::uint32_t segments, float centerAlpha, float edgeAlpha) {
17 mesh.vertices.reserve(static_cast<std::size_t>(segments) + 2u);
18 mesh.indices.reserve(static_cast<std::size_t>(segments) * 3u);
19 mesh.vertices.push_back(vertex(0.f, 0.f, 0.5f, 0.5f, centerAlpha));
20 for (std::uint32_t i = 0; i <= segments; ++i) {
21 const float t = static_cast<float>(i) / static_cast<float>(segments);
22 const float radians = startAngle + angle * t;
23 const float x = std::cos(radians) * radius;
24 const float z = std::sin(radians) * radius;
25 mesh.vertices.push_back(vertex(x, z, x / (2.f * radius) + 0.5f,
26 z / (2.f * radius) + 0.5f, edgeAlpha));
27 if (i > 0) mesh.indices.insert(mesh.indices.end(), {0u, i, i + 1u});
28 }
29}
30
31void appendRing(TrailMeshSnapshot& mesh, float innerRadius, float outerRadius,
32 std::uint32_t segments, float innerAlpha, float outerAlpha) {
33 mesh.vertices.reserve((static_cast<std::size_t>(segments) + 1u) * 2u);
34 mesh.indices.reserve(static_cast<std::size_t>(segments) * 6u);
35 for (std::uint32_t i = 0; i <= segments; ++i) {
36 const float t = static_cast<float>(i) / static_cast<float>(segments);
37 const float radians = glm::two_pi<float>() * t;
38 const float c = std::cos(radians);
39 const float s = std::sin(radians);
40 mesh.vertices.push_back(vertex(c * innerRadius, s * innerRadius, t, 0.f, innerAlpha));
41 mesh.vertices.push_back(vertex(c * outerRadius, s * outerRadius, t, 1.f, outerAlpha));
42 if (i == 0) continue;
43 const std::uint32_t inner0 = (i - 1u) * 2u;
44 const std::uint32_t outer0 = inner0 + 1u;
45 const std::uint32_t inner1 = i * 2u;
46 const std::uint32_t outer1 = inner1 + 1u;
47 mesh.indices.insert(mesh.indices.end(),
48 {inner0, outer0, inner1, inner1, outer0, outer1});
49 }
50}
51
52} // namespace
53
56 const bool commonValid = config.segments >= 3u && std::isfinite(config.innerAlpha) &&
57 std::isfinite(config.outerAlpha);
58 if (!commonValid) return result;
59
60 switch (config.shape) {
62 if (!std::isfinite(config.radius) || config.radius <= 0.f) return result;
63 appendFan(result.mesh, config.radius, 0.f, glm::two_pi<float>(),
64 config.segments, config.innerAlpha, config.outerAlpha);
65 break;
67 if (!std::isfinite(config.radius) || !std::isfinite(config.innerRadius) ||
68 config.radius <= 0.f || config.innerRadius < 0.f ||
69 config.innerRadius >= config.radius)
70 return result;
71 appendRing(result.mesh, config.innerRadius, config.radius, config.segments,
72 config.innerAlpha, config.outerAlpha);
73 break;
75 if (!std::isfinite(config.radius) || !std::isfinite(config.sectorAngleRadians) ||
76 config.radius <= 0.f || config.sectorAngleRadians <= 0.f ||
77 config.sectorAngleRadians > glm::two_pi<float>())
78 return result;
79 appendFan(result.mesh, config.radius, -config.sectorAngleRadians * 0.5f,
80 config.sectorAngleRadians, config.segments,
81 config.innerAlpha, config.outerAlpha);
82 break;
84 if (!std::isfinite(config.width) || !std::isfinite(config.length) ||
85 config.width <= 0.f || config.length <= 0.f)
86 return result;
87 const float halfWidth = config.width * 0.5f;
88 result.mesh.vertices = {
89 vertex(-halfWidth, 0.f, 0.f, 0.f, config.innerAlpha),
90 vertex(halfWidth, 0.f, 1.f, 0.f, config.innerAlpha),
91 vertex(-halfWidth, config.length, 0.f, 1.f, config.outerAlpha),
92 vertex(halfWidth, config.length, 1.f, 1.f, config.outerAlpha),
93 };
94 result.mesh.indices = {0, 1, 2, 2, 1, 3};
95 break;
96 }
97 }
99 return result;
100}
101
102} // namespace eve::stylize
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
const std::string & s
float u
Definition Grass.cpp:233
float v
std::int32_t c
float radius
float halfWidth
float t
Mesh * mesh
float angle
AreaIndicatorBuildResult buildAreaIndicator(const AreaIndicatorConfig &config)
Generate a local-XZ area indicator compatible with dynamic mesh submission.
Owning local-space mesh and terminal build status.
Geometry and edge-fade controls for one local-XZ area indicator.
std::vector< std::uint32_t > indices
Definition TrailEffect.h:44
std::vector< TrailVertex > vertices
Definition TrailEffect.h:43