// spherical billboard: per-particle view-facing basis, so no camera right/up uniforms are needed. // requires _graphics_uniforms.glsl vec3 billboardWorld(vec3 center, vec2 quadPos, vec2 cosSin, float size) { vec3 viewDir = normalize(u_cameraPos - center); vec3 right = cross(vec3(0.0, 1.0, 0.0), viewDir); float rlen = length(right); right = (rlen > 0.001) ? (right / rlen) : vec3(1.0, 0.0, 0.0); // degenerate: looking straight up/down vec3 up = cross(viewDir, right); vec2 corner = vec2( (quadPos.x * cosSin.x) - (quadPos.y * cosSin.y), (quadPos.x * cosSin.y) + (quadPos.y * cosSin.x) ); return center + ((right * corner.x) + (up * corner.y)) * size; }