diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index 2910620b..1b5ef49e 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -103,18 +103,54 @@ class UiWidget : VerticalLayout { _mesh = new Mesh(vfmt); // square - float x0 = 0.3; - float y0 = 0.2; + float x0 = 0; + float y0 = 0; float z0 = -0.9; - _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]); + 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)]); + } + /// returns true is widget is being animated - need to call animate() and redraw @property override bool animating() { return true; } /// animates window; interval is time left from previous draw, in hnsecs (1/10000000 of second) @@ -157,13 +193,14 @@ class UiWidget : VerticalLayout { // ======== View Matrix ================== mat4 viewMatrix; - viewMatrix.translate(0, 0, -6); - viewMatrix.rotatex(-15.0f); + //viewMatrix.translate(0, 0, 1 - angle / 100); // + angle + //viewMatrix.rotatex(-15.0f + angle); + //viewMatrix.rotatez(angle); //viewMatrix.lookAt(vec3(-10, 0, 0), vec3(0, 0, 0), vec3(0, 1, 0));//translation(0.0f, 0.0f, 4.0f).rotatez(angle); // ======== Model Matrix ================== mat4 modelMatrix; - modelMatrix.scale(1.5f); + modelMatrix.scale(0.2f); modelMatrix.rotatez(30.0f + angle * 0.3456778); modelMatrix.rotatey(angle); modelMatrix.rotatez(angle * 1.98765f); @@ -173,9 +210,15 @@ class UiWidget : VerticalLayout { } else { projectionViewModelMatrix = _scene.viewProjectionMatrix; } - projectionViewModelMatrix.setIdentity(); + //projectionViewModelMatrix.setIdentity(); Log.d("matrix uniform: ", projectionViewModelMatrix.m); + glEnable(GL_BLEND); + checkgl!glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + checkgl!glEnable(GL_CULL_FACE); + checkgl!glEnable(GL_DEPTH_TEST); + checkgl!glCullFace(GL_BACK); + _program.bind(); _program.setUniform("matrix", projectionViewModelMatrix); _tx.texture.setup(); @@ -185,6 +228,8 @@ class UiWidget : VerticalLayout { _tx.texture.unbind(); _program.unbind(); + checkgl!glDisable(GL_DEPTH_TEST); + checkgl!glDisable(GL_CULL_FACE); } ~this() { diff --git a/src/dlangui/graphics/scene/mesh.d b/src/dlangui/graphics/scene/mesh.d index f6e00f03..09b0e928 100644 --- a/src/dlangui/graphics/scene/mesh.d +++ b/src/dlangui/graphics/scene/mesh.d @@ -243,8 +243,13 @@ class Mesh { return meshPart; } + /// add new mesh part or append indexes to existing part (if type matches) MeshPart addPart(PrimitiveType type, ushort[] indexes) { - return addPart(new MeshPart(type, indexes)); + MeshPart lastPart = _parts.length > 0 ? _parts[$ - 1] : null; + if (!lastPart || lastPart.type != type) + return addPart(new MeshPart(type, indexes)); + lastPart.add(indexes); + return lastPart; } /// adds single vertex