68namespace Subdivision {
103 .
position = (a.position +
b.position) / 2,
104 .uv = {.u =
static_cast<uint8_t
>((
static_cast<unsigned>(a.uv.u) +
b.uv.u) / 2),
105 .v =
static_cast<uint8_t
>((
static_cast<unsigned>(a.uv.v) +
b.uv.v) / 2)},
137template <
typename Dec
ide,
typename EmitQuad,
typename EmitFill>
139 const TexturedVertex& d,
unsigned depth,
unsigned edges, Decide&& decide, EmitQuad&& emitQuad,
140 EmitFill&& emitFill) {
141 if ((depth == 0) || !decide(a,
b,
c, d, depth)) {
142 emitQuad(a,
b,
c, d);
146 const auto ab =
half(a,
b);
148 const auto ac =
half(a,
c);
149 const auto bd =
half(
b, d);
150 const auto center =
half(ab,
cd);
154 if (edges &
EdgeAB) emitFill(a, ab,
b);
155 if (edges &
EdgeBD) emitFill(
b, bd, d);
157 if (edges &
EdgeAC) emitFill(a, ac,
c);
159 const unsigned next = depth - 1;
uint8_t cd
Definition gte-depthcue.c:206
uint8_t b
Definition gte-depthcue.c:39
Edge
Which edges of a quad lie on an outer boundary.
Definition subdivision.hh:89
@ EdgeCD
Definition subdivision.hh:93
@ NoEdges
Definition subdivision.hh:90
@ AllEdges
Definition subdivision.hh:95
@ EdgeBD
Definition subdivision.hh:92
@ EdgeAC
Definition subdivision.hh:94
@ EdgeAB
Definition subdivision.hh:91
void divideQuad(const TexturedVertex &a, const TexturedVertex &b, const TexturedVertex &c, const TexturedVertex &d, unsigned depth, unsigned edges, Decide &&decide, EmitQuad &&emitQuad, EmitFill &&emitFill)
Recursively divide a quad, in three dimensions.
Definition subdivision.hh:138
constexpr TexturedVertex half(const TexturedVertex &a, const TexturedVertex &b)
Midpoint of two vertices, in position and texture coordinates at once.
Definition subdivision.hh:101
A primitive's UV coordinates attribute.
Definition common.hh:284
A model-space vertex and its texture coordinates.
Definition subdivision.hh:75
PrimPieces::UVCoords uv
Definition subdivision.hh:77
Vec3 position
Definition subdivision.hh:76
static int c
Definition syscalls.h:122