载入中...
搜索中...
未找到
MeshInstanceRange.cpp
浏览该文件的文档.
2#include <algorithm>
3#include <cmath>
4#include <glm/geometric.hpp>
5#include <glm/vec4.hpp>
6
7namespace eve::graphics {
9 if (range.first > 1048576 || range.count > 1048576 - range.first ||
10 !std::isfinite(range.maximumHorizontalDistance) || range.maximumHorizontalDistance < 0)
12 "Invalid instance range or maximum horizontal distance",
13 "graphics.instances"));
14 for (int i = 0; i < 3; ++i)
15 if (!std::isfinite(range.minimum[i]) || !std::isfinite(range.maximum[i]) || range.minimum[i] > range.maximum[i])
17 Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid instance bounds", "graphics.instances"));
18 return Result<void>::success();
19}
20bool meshInstanceRangeVisible(const MeshInstanceRange& range, const glm::mat4& model, const glm::mat4& vp,
21 const glm::vec3& eye) {
22 if (!range.count) return false;
23 glm::vec3 localCenter, half;
24 for (int i = 0; i < 3; ++i) {
25 localCenter[i] = range.minimum[i] * .5f + range.maximum[i] * .5f;
26 half[i] = range.maximum[i] * .5f - range.minimum[i] * .5f;
27 }
28 const glm::vec3 center(model * glm::vec4(localCenter, 1));
29 const glm::vec3 axes[]{glm::vec3(model[0]) * half.x, glm::vec3(model[1]) * half.y, glm::vec3(model[2]) * half.z};
30 const auto row = [&](int i) { return glm::vec4(vp[0][i], vp[1][i], vp[2][i], vp[3][i]); };
31 const glm::vec4 planes[]{row(3) + row(0), row(3) - row(0), row(3) + row(1),
32 row(3) - row(1), row(2), row(3) - row(2)};
33 for (const auto& p : planes) {
34 const glm::vec3 n(p);
35 const float radius =
36 std::abs(glm::dot(n, axes[0])) + std::abs(glm::dot(n, axes[1])) + std::abs(glm::dot(n, axes[2]));
37 if (glm::dot(n, center) + p.w < -radius) return false;
38 }
39 if (range.maximumHorizontalDistance > 0) {
40 const glm::vec3 extent = glm::abs(axes[0]) + glm::abs(axes[1]) + glm::abs(axes[2]);
41 const double limit = double(range.maximumHorizontalDistance) + std::max(extent.x, extent.z);
42 const double dx = double(center.x) - eye.x, dz = double(center.z) - eye.z;
43 if (dx * dx + dz * dz > limit * limit) return false;
44 }
45 return true;
46}
47} // namespace eve::graphics
float planes[6][4]
glm::vec4 p[6]
glm::vec3 n
Definition Grass.cpp:63
Range range
float radius
glm::vec3 eye
glm::mat4 model
float dz
float dx
int limit
Definition TreeMesh.cpp:164
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
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
bool meshInstanceRangeVisible(const MeshInstanceRange &range, const glm::mat4 &model, const glm::mat4 &vp, const glm::vec3 &eye)
Test transformed bounds against Vulkan clip planes and horizontal distance.
Result< void > validateMeshInstanceRange(const MeshInstanceRange &range)
Worker-safe validation of value-owned range and culling metadata.
Value-owned subset of a resource shader's static instances.