From ff078faeb5e5df42738112dea660c04e0739e1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 5 Mar 2014 12:57:09 +0200 Subject: [PATCH] libgui|VertexBuilder: Added cube and 3D quad methods with indirect UV The indirect UV means that texture coordinates are mapped into a UV rectangle specified with the aBounds attribute. --- .../libgui/include/de/gui/vertexbuilder.h | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/doomsday/libgui/include/de/gui/vertexbuilder.h b/doomsday/libgui/include/de/gui/vertexbuilder.h index bb60fdada4..75808fd3f3 100644 --- a/doomsday/libgui/include/de/gui/vertexbuilder.h +++ b/doomsday/libgui/include/de/gui/vertexbuilder.h @@ -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 ¢er, float outerRadius, float innerRadius, int divisions, Vector4f const &color, Rectanglef const &uv, float innerTexRadius = -1) { @@ -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 ¢er, float outerRadius, float innerRadius, int divisions, Vector4f const &color, Vector2f const &uv) { return makeRing(center, outerRadius, innerRadius, divisions, color, Rectanglef(uv, uv));