24 const glm::vec3& axis = glm::vec3(0.0F, 0.0F, 1.0F),
25 const glm::vec3& origin = glm::vec3(0.0F),
28 const glm::vec3 n = glm::normalize(axis);
30 const glm::vec3 tangent = (std::abs(n.y) <= std::abs(n.x) && std::abs(n.y) <= std::abs(n.z))
31 ? glm::normalize(glm::cross(n, glm::vec3(0.0F, 1.0F, 0.0F)))
32 : glm::normalize(glm::cross(n, glm::vec3(1.0F, 0.0F, 0.0F)));
34 const glm::vec3 bitangent = glm::cross(n, tangent);
36 return { .fn = [tangent, bitangent, origin,
scale](
const glm::vec3& p) -> glm::vec2 {
37 const glm::vec3 d = p - origin;
38 return glm::vec2(glm::dot(d, tangent), glm::dot(d, bitangent)) *
scale;
58 const glm::vec3& axis = glm::vec3(0.0F, 1.0F, 0.0F),
59 const glm::vec3& origin = glm::vec3(0.0F),
63 const glm::vec3 n = glm::normalize(axis);
65 const glm::vec3 tangent = (std::abs(n.y) <= std::abs(n.x) && std::abs(n.y) <= std::abs(n.z))
66 ? glm::normalize(glm::cross(n, glm::vec3(0.0F, 1.0F, 0.0F)))
67 : glm::normalize(glm::cross(n, glm::vec3(1.0F, 0.0F, 0.0F)));
69 const glm::vec3 bitangent = glm::cross(n, tangent);
71 const float inv_radius = (
radius > 1e-6F) ? (1.0F /
radius) : 1.0F;
72 const float inv_height = (height > 1e-6F) ? (1.0F / height) : 1.0F;
74 return { .fn = [n, tangent, bitangent, origin, inv_radius, inv_height](
const glm::vec3& p) -> glm::vec2 {
75 const glm::vec3 d = p - origin;
76 const float axial = glm::dot(d, n);
77 const float radial_x = glm::dot(d, tangent) * inv_radius;
78 const float radial_y = glm::dot(d, bitangent) * inv_radius;
79 const float u = (glm::atan(radial_y, radial_x) /
static_cast<float>(std::numbers::pi) + 1.0F) * 0.5F;
80 const float v = axial * inv_height;
98 return { .
fn = [centre](
const glm::vec3& p) -> glm::vec2 {
99 const glm::vec3 d = p - centre;
100 const float len = glm::length(d);
102 return glm::vec2(0.0F);
104 const glm::vec3 n = d / len;
105 const float u = (glm::atan(n.z, n.x) /
static_cast<float>(std::numbers::pi) + 1.0F) * 0.5F;
106 const float v = n.y * 0.5F + 0.5F;
130 const glm::vec3& origin = glm::vec3(0.0F),
134 return { .
fn = [origin,
scale, blend](
const glm::vec3& p) -> glm::vec2 {
135 const glm::vec3 d = (p - origin) *
scale;
137 glm::vec3 w = glm::pow(glm::abs(d), glm::vec3(blend));
138 const float wsum = w.x + w.y + w.z;
140 return glm::vec2(0.0F);
143 const glm::vec2 uv_xz(d.x, d.z);
144 const glm::vec2 uv_xy(d.x, d.y);
145 const glm::vec2 uv_yz(d.y, d.z);
147 return uv_xz * w.y + uv_xy * w.z + uv_yz * w.x;
Tendency< D, float > scale(const Tendency< D, float > &t, float factor)
Uniform scaling of a scalar-output tendency.
UVField cartesian(const glm::vec3 &axis=glm::vec3(0.0F, 0.0F, 1.0F), const glm::vec3 &origin=glm::vec3(0.0F), float scale=1.0F)
cartesian projection along a chosen axis
UVField cylindrical(const glm::vec3 &axis=glm::vec3(0.0F, 1.0F, 0.0F), const glm::vec3 &origin=glm::vec3(0.0F), float radius=1.0F, float height=1.0F)
Cylindrical projection around a world axis.