载入中...
搜索中...
未找到
MeshUvProjection.cpp
浏览该文件的文档.
15Result<MeshBuild> projectMeshUvResult(const MeshBuild& input, std::string_view mode, float scale, float offsetU,
17 if (input.empty() || input.positions().size() % 3u != 0u || input.normals().size() != input.positions().size())
18 return Result<MeshBuild>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "UV projection requires a valid non-empty mesh", "mesh", {}, "procgen.meshUvProjection"));
19 if ((mode != "planar" && mode != "box" && mode != "spherical") || !std::isfinite(scale) || scale <= 0.f ||
21 return Result<MeshBuild>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid UV projection parameters", "projection", {}, "procgen.meshUvProjection"));
27 const float x = output.positions()[p], y = output.positions()[p + 1u], z = output.positions()[p + 2u];
31 if (length > 1e-7f) { u = std::atan2(z, x) / (2.f * pi) + 0.5f; v = std::asin(std::clamp(y / length, -1.f, 1.f)) / pi + 0.5f; }
45Result<MeshSurfaceUv> mapMeshSurfacePointToUvResult(const MeshBuild& mesh, int triangleIndex, float x, float y,
47 const std::size_t base = triangleIndex < 0 ? mesh.indices().size() : static_cast<std::size_t>(triangleIndex) * 3u;
48 if (base + 2u >= mesh.indices().size() || mesh.uvs().size() != static_cast<std::size_t>(mesh.getVertexCount()) * 2u)
49 return Result<MeshSurfaceUv>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid dynamic mesh triangle or UV stream", "triangle", {}, "procgen.meshUvProjection"));
50 const auto ia = mesh.indices()[base], ib = mesh.indices()[base + 1u], ic = mesh.indices()[base + 2u];
51 if (ia >= static_cast<std::uint32_t>(mesh.getVertexCount()) || ib >= static_cast<std::uint32_t>(mesh.getVertexCount()) || ic >= static_cast<std::uint32_t>(mesh.getVertexCount()))
52 return Result<MeshSurfaceUv>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "triangle index exceeds dynamic mesh", "triangle", {}, "procgen.meshUvProjection"));
54 const std::array<float,3> v0{b[0]-a[0],b[1]-a[1],b[2]-a[2]}, v1{c[0]-a[0],c[1]-a[1],c[2]-a[2]}, q{x-a[0],y-a[1],z-a[2]};
56 const float d11=v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2], d20=q[0]*v0[0]+q[1]*v0[1]+q[2]*v0[2], d21=q[0]*v1[0]+q[1]*v1[1]+q[2]*v1[2];
58 if (std::abs(denominator) < 1e-12f) return Result<MeshSurfaceUv>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "degenerate dynamic mesh triangle", "triangle", {}, "procgen.meshUvProjection"));
60 const auto uvAt=[&mesh](std::uint32_t i,int c0){return mesh.uvs()[static_cast<std::size_t>(i)*2u+static_cast<std::size_t>(c0)];};
61 return Result<MeshSurfaceUv>::success({wa*uvAt(ia,0)+wb*uvAt(ib,0)+wc*uvAt(ic,0), wa*uvAt(ia,1)+wb*uvAt(ib,1)+wc*uvAt(ic,1)});
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
Definition EvpackPointGraphLoader.h:12
Result< MeshSurfaceUv > mapMeshSurfacePointToUvResult(const MeshBuild &mesh, int triangleIndex, float x, float y, float z)
Map a surface point on a dynamic-mesh triangle to its interpolated UV.
Definition MeshUvProjection.cpp:45
Result< MeshBuild > projectMeshUvResult(const MeshBuild &input, std::string_view mode, float scale, float offsetU, float offsetV)
Generate topology-preserving UVs for a procedural or deformed mesh.
Definition MeshUvProjection.cpp:15
@ InvalidArgument