From 9661eb12dd98554b9e7d8eef1cc1d7a72ebf07de Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 10 Mar 2016 14:20:53 +0300 Subject: [PATCH] Move cube mesh creation to Mesh static method - #183 --- examples/d3d/src/d3d.d | 51 +------------------------------ src/dlangui/graphics/scene/mesh.d | 35 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index 1b5ef49e..a16dece2 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -99,56 +99,7 @@ class UiWidget : VerticalLayout { _scene.activeCamera = _cam; - VertexFormat vfmt = VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0); - _mesh = new Mesh(vfmt); - // square - - float x0 = 0; - float y0 = 0; - float z0 = -0.9; - - addCube(x0, y0, z0, 1); - //_mesh.addVertex([x0-1,y0-1,z0+0, 1,0,1,1, 0,0]); - //_mesh.addVertex([x0-1,y0+1,z0+0, 1,1,1,1, 1,0]); - //_mesh.addVertex([x0+1,y0+1,z0+0, 0,1,1,1, 1,1]); - //_mesh.addVertex([x0+1,y0-1,z0+0, 1,1,0,1, 0,1]); - //_mesh.addPart(PrimitiveType.triangles, [0, 1, 2, 2, 3, 0]); - - } - - void addCube(float x0, float y0, float z0, float d) { - auto p000 = [x0-d, y0-d, z0-d]; - auto p100 = [x0+d, y0-d, z0-d]; - auto p010 = [x0-d, y0+d, z0-d]; - auto p110 = [x0+d, y0+d, z0-d]; - auto p001 = [x0-d, y0-d, z0+d]; - auto p101 = [x0+d, y0-d, z0+d]; - auto p011 = [x0-d, y0+d, z0+d]; - auto p111 = [x0+d, y0+d, z0+d]; - addQuad(p000 ~ p010 ~ p110 ~ p100); // front face - addQuad(p101 ~ p111 ~ p011 ~ p001); // back face - addQuad(p100 ~ p110 ~ p111 ~ p101); // right face - addQuad(p001 ~ p011 ~ p010 ~ p000); // left face - addQuad(p010 ~ p011 ~ p111 ~ p110); // top face - addQuad(p001 ~ p000 ~ p100 ~ p101); // bottom face - } - - void addQuad(float[] vertexes) { - static float[] txcoords = [0, 0, 1, 0, 1, 1, 0, 1]; - ushort startVertex = cast(ushort)_mesh.vertexCount; - for (int i = 0; i < 4; i++) { - _mesh.addVertex([ - vertexes[i*3 + 0], vertexes[i*3 + 1], vertexes[i*3 + 2], - 1,1,1,1, - txcoords[i*2 + 0], txcoords[i*2 + 1]]); - } - _mesh.addPart(PrimitiveType.triangles, [ - cast(ushort)(startVertex + 0), - cast(ushort)(startVertex + 1), - cast(ushort)(startVertex + 2), - cast(ushort)(startVertex + 2), - cast(ushort)(startVertex + 3), - cast(ushort)(startVertex + 0)]); + _mesh = Mesh.createCubeMesh(vec3(0, 0, -0.9)); } /// returns true is widget is being animated - need to call animate() and redraw diff --git a/src/dlangui/graphics/scene/mesh.d b/src/dlangui/graphics/scene/mesh.d index 09b0e928..aa00139e 100644 --- a/src/dlangui/graphics/scene/mesh.d +++ b/src/dlangui/graphics/scene/mesh.d @@ -287,6 +287,41 @@ class Mesh { _vertexBuffer = null; } } + + + private void addQuad(ref vec3 v0, ref vec3 v1, ref vec3 v2, ref vec3 v3, ref vec4 color) { + ushort startVertex = cast(ushort)vertexCount; + addVertex([v0.x, v0.y, v0.z, color.r, color.g, color.b, color.a, 0, 0]); + addVertex([v1.x, v1.y, v1.z, color.r, color.g, color.b, color.a, 1, 0]); + addVertex([v2.x, v2.y, v2.z, color.r, color.g, color.b, color.a, 1, 1]); + addVertex([v3.x, v3.y, v3.z, color.r, color.g, color.b, color.a, 0, 1]); + addPart(PrimitiveType.triangles, [ + cast(ushort)(startVertex + 0), + cast(ushort)(startVertex + 1), + cast(ushort)(startVertex + 2), + cast(ushort)(startVertex + 2), + cast(ushort)(startVertex + 3), + cast(ushort)(startVertex + 0)]); + } + + static Mesh createCubeMesh(vec3 pos, float d=1, vec4 color = vec4(1,1,1,1)) { + Mesh mesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0)); + auto p000 = vec3(pos.x-d, pos.y-d, pos.z-d); + auto p100 = vec3(pos.x+d, pos.y-d, pos.z-d); + auto p010 = vec3(pos.x-d, pos.y+d, pos.z-d); + auto p110 = vec3(pos.x+d, pos.y+d, pos.z-d); + auto p001 = vec3(pos.x-d, pos.y-d, pos.z+d); + auto p101 = vec3(pos.x+d, pos.y-d, pos.z+d); + auto p011 = vec3(pos.x-d, pos.y+d, pos.z+d); + auto p111 = vec3(pos.x+d, pos.y+d, pos.z+d); + mesh.addQuad(p000, p010, p110, p100, color); // front face + mesh.addQuad(p101, p111, p011, p001, color); // back face + mesh.addQuad(p100, p110, p111, p101, color); // right face + mesh.addQuad(p001, p011, p010, p000, color); // left face + mesh.addQuad(p010, p011, p111, p110, color); // top face + mesh.addQuad(p001, p000, p100, p101, color); // bottom face + return mesh; + } } /// Mesh part - set of vertex indexes with graphics primitive type