Skip to content

Commit

Permalink
libgui|VertexBuilder: Added cube and 3D quad methods with indirect UV
Browse files Browse the repository at this point in the history
The indirect UV means that texture coordinates are mapped into a UV
rectangle specified with the aBounds attribute.
  • Loading branch information
skyjake committed Mar 5, 2014
1 parent 2b031a4 commit ff078fa
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions doomsday/libgui/include/de/gui/vertexbuilder.h
Expand Up @@ -70,6 +70,22 @@ struct VertexBuilder
v.pos = rect.bottomRight; v.texCoord = uv.bottomRight; quad << v;
return *this += quad;
}
/// Makes a 3D quad with indirect UV coords. The points p1...p4 are specified
/// with a clockwise winding.
Vertices &makeQuadIndirect(Vector3f const &p1, Vector3f const &p2,
Vector3f const &p3, Vector3f const &p4,
Vector4f const &color, Rectanglef const &uv,
Vector4f const &uvBounds) {
Vertices quad;
VertexType v;
v.rgba = color;
v.texBounds = uvBounds;
v.pos = p1; v.texCoord = uv.topLeft; quad << v;
v.pos = p2; v.texCoord = uv.topRight(); quad << v;
v.pos = p4; v.texCoord = uv.bottomLeft(); quad << v;
v.pos = p3; v.texCoord = uv.bottomRight; quad << v;
return *this += quad;
}
Vertices &makeRing(Vector2f const &center, float outerRadius, float innerRadius,
int divisions, Vector4f const &color, Rectanglef const &uv,
float innerTexRadius = -1) {
Expand All @@ -91,6 +107,55 @@ struct VertexBuilder
}
return *this += ring;
}
Vertices &makeCubeIndirect(Vector3f const &minPoint,
Vector3f const &maxPoint,
Rectanglef const &uv,
Vector4f const &uvBounds,
Vector4f const faceColors[6]) {
// Back.
makeQuadIndirect(minPoint,
Vector3f(maxPoint.x, minPoint.y, minPoint.z),
Vector3f(maxPoint.x, maxPoint.y, minPoint.z),
Vector3f(minPoint.x, maxPoint.y, minPoint.z),
faceColors[0], uv, uvBounds);

// Front.
makeQuadIndirect(Vector3f(minPoint.x, minPoint.y, maxPoint.z),
Vector3f(maxPoint.x, minPoint.y, maxPoint.z),
maxPoint,
Vector3f(minPoint.x, maxPoint.y, maxPoint.z),
faceColors[1], uv, uvBounds);

// Left.
makeQuadIndirect(Vector3f(minPoint.x, minPoint.y, maxPoint.z),
minPoint,
Vector3f(minPoint.x, maxPoint.y, minPoint.z),
Vector3f(minPoint.x, maxPoint.y, maxPoint.z),
faceColors[2], uv, uvBounds);

// Right.
makeQuadIndirect(Vector3f(maxPoint.x, minPoint.y, minPoint.z),
Vector3f(maxPoint.x, minPoint.y, maxPoint.z),
maxPoint,
Vector3f(maxPoint.x, maxPoint.y, minPoint.z),
faceColors[3], uv, uvBounds);

// Floor.
makeQuadIndirect(Vector3f(minPoint.x, maxPoint.y, minPoint.z),
Vector3f(maxPoint.x, maxPoint.y, minPoint.z),
maxPoint,
Vector3f(minPoint.x, maxPoint.y, maxPoint.z),
faceColors[4], uv, uvBounds);

// Ceiling.
makeQuadIndirect(Vector3f(minPoint.x, minPoint.y, maxPoint.z),
Vector3f(maxPoint.x, minPoint.y, maxPoint.z),
Vector3f(maxPoint.x, minPoint.y, minPoint.z),
minPoint,
faceColors[5], uv, uvBounds);

return *this;
}
Vertices &makeRing(Vector2f const &center, float outerRadius, float innerRadius,
int divisions, Vector4f const &color, Vector2f const &uv) {
return makeRing(center, outerRadius, innerRadius, divisions, color, Rectanglef(uv, uv));
Expand Down

0 comments on commit ff078fa

Please sign in to comment.