From b8cadad8fb988438995ce4e9cab1af8b07ff74ac Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 10 Mar 2016 16:15:31 +0300 Subject: [PATCH] 3d scene - better scene for testing - #183 --- examples/d3d/src/d3d.d | 45 ++++++++++++++---- src/dlangui/core/math3d.d | 76 ++++++++++++++++++++++++------- src/dlangui/graphics/glsupport.d | 1 - src/dlangui/graphics/scene/mesh.d | 20 ++++---- 4 files changed, 108 insertions(+), 34 deletions(-) diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index a16dece2..5ab4e78f 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -41,11 +41,15 @@ class UiWidget : VerticalLayout { margins: 10 padding: 10 backgroundImageId: "tx_fabric.tiled" + layoutWidth: fill + layoutHeight: fill VerticalLayout { id: glView margins: 10 padding: 10 + layoutWidth: fill + layoutHeight: fill TextWidget { text: "There should be OpenGL animation on background"; textColor: "red"; fontSize: 150%; fontWeight: 800; fontFace: "Arial" } TextWidget { text: "Do you see it? If no, there is some bug in Mesh rendering code..."; fontSize: 120% } HorizontalLayout { @@ -80,6 +84,7 @@ class UiWidget : VerticalLayout { CheckBox { id: cb2; text: "checkbox 2" } } } + VSpacer { layoutWeight: 30 } HorizontalLayout { TextWidget { text: "Some buttons:" } Button { id: btnOk; text: "Ok"; fontSize: 27px } @@ -99,7 +104,18 @@ class UiWidget : VerticalLayout { _scene.activeCamera = _cam; - _mesh = Mesh.createCubeMesh(vec3(0, 0, -0.9)); + _mesh = Mesh.createCubeMesh(vec3(0, 0, 0), 0.3f); + for (int i = 0; i < 10; i++) { + _mesh.addCubeMesh(vec3(0, 0, i * 2 + 1.0f), 0.2f, vec4(i / 12, 1, 1, 1)); + _mesh.addCubeMesh(vec3(i * 2 + 1.0f, 0, 0), 0.2f, vec4(1, i / 12, 1, 1)); + _mesh.addCubeMesh(vec3(-i * 2 - 1.0f, 0, 0), 0.2f, vec4(1, i / 12, 1, 1)); + _mesh.addCubeMesh(vec3(0, i * 2 + 1.0f, 0), 0.2f, vec4(1, 1, i / 12 + 0.1, 1)); + _mesh.addCubeMesh(vec3(0, -i * 2 - 1.0f, 0), 0.2f, vec4(1, 1, i / 12 + 0.1, 1)); + _mesh.addCubeMesh(vec3(i * 2 + 1.0f, i * 2 + 1.0f, i * 2 + 1.0f), 0.2f, vec4(i / 12, i / 12, i / 12, 1)); + _mesh.addCubeMesh(vec3(-i * 2 + 1.0f, i * 2 + 1.0f, i * 2 + 1.0f), 0.2f, vec4(i / 12, i / 12, 1 - i / 12, 1)); + _mesh.addCubeMesh(vec3( i * 2 + 1.0f, -i * 2 + 1.0f, i * 2 + 1.0f), 0.2f, vec4(i / 12, 1 - i / 12, i / 12, 1)); + _mesh.addCubeMesh(vec3(-i * 2 - 1.0f, -i * 2 - 1.0f, -i * 2 - 1.0f), 0.2f, vec4(1 - i / 12, i / 12, i / 12, 1)); + } } /// returns true is widget is being animated - need to call animate() and redraw @@ -134,27 +150,37 @@ class UiWidget : VerticalLayout { Log.e("Invalid texture"); return; } - _cam.setPerspective(4.0f, 3.0f, 45.0f, 0.1f, 100.0f); + _cam.setPerspective(4.0f, 3.0f, 45.0f, 1.1f, 100.0f); mat4 projectionViewModelMatrix; if (true) { // ======== Projection Matrix ================== mat4 projectionMatrix; float aspectRatio = cast(float)rc.width / cast(float)rc.height; - projectionMatrix.setPerspective(45.0f, aspectRatio, 0.1f, 100.0f); + projectionMatrix.setPerspective( + 45.0f, //angle + aspectRatio, // aspect + 1.1f, // near + 1000.0f // far + ); // ======== View Matrix ================== mat4 viewMatrix; - //viewMatrix.translate(0, 0, 1 - angle / 100); // + angle - //viewMatrix.rotatex(-15.0f + angle); + //viewMatrix.translate(0, 0, -1 + angle / 100); // + angle + //viewMatrix.translate(0, 0, -4); // + angle + //viewMatrix.rotatez(-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); + //viewMatrix.lookAt(vec3(0, 0, -1 + angle / 100), vec3(0, 0, 0), vec3(0, 1, 0));//translation(0.0f, 0.0f, 4.0f).rotatez(angle); + //viewMatrix.lookAt(vec3(0, angle / 1000, -2 - angle / 100), vec3(0, 0, 0), vec3(0, 1, 0));//translation(0.0f, 0.0f, 4.0f).rotatez(angle); + viewMatrix.lookAt(vec3(0, 1, -3), vec3(0, 0, 0), vec3(0, 1, 0));//translation(0.0f, 0.0f, 4.0f).rotatez(angle); // ======== Model Matrix ================== mat4 modelMatrix; - modelMatrix.scale(0.2f); + //modelMatrix.scale(0.1f); modelMatrix.rotatez(30.0f + angle * 0.3456778); + //modelMatrix.rotatey(25); + //modelMatrix.rotatex(15); modelMatrix.rotatey(angle); - modelMatrix.rotatez(angle * 1.98765f); + modelMatrix.rotatex(angle * 1.98765f); // ======= PMV matrix ===================== projectionViewModelMatrix = projectionMatrix * viewMatrix * modelMatrix; @@ -162,11 +188,12 @@ class UiWidget : VerticalLayout { projectionViewModelMatrix = _scene.viewProjectionMatrix; } //projectionViewModelMatrix.setIdentity(); - Log.d("matrix uniform: ", projectionViewModelMatrix.m); + //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!glDisable(GL_CULL_FACE); checkgl!glEnable(GL_DEPTH_TEST); checkgl!glCullFace(GL_BACK); diff --git a/src/dlangui/core/math3d.d b/src/dlangui/core/math3d.d index f07996b5..64041e39 100644 --- a/src/dlangui/core/math3d.d +++ b/src/dlangui/core/math3d.d @@ -924,6 +924,34 @@ struct mat4 { } void setPerspective(float angle, float aspect, float nearPlane, float farPlane) + { + // Bail out if the projection volume is zero-sized. + float radians = (angle / 2.0f) * PI / 180.0f; + if (nearPlane == farPlane || aspect == 0.0f || radians < 0.0001f) + return; + float f = 1 / tan(radians); + float d = 1 / (nearPlane - farPlane); + + // Construct the projection. + m[0*4 + 0] = f / aspect; + m[1*4 + 0] = 0.0f; + m[2*4 + 0] = 0.0f; + m[3*4 + 0] = 0.0f; + m[0*4 + 1] = 0.0f; + m[1*4 + 1] = f; + m[2*4 + 1] = 0.0f; + m[3*4 + 1] = 0.0f; + m[0*4 + 2] = 0.0f; + m[1*4 + 2] = 0.0f; + m[2*4 + 2] = (nearPlane + farPlane) * d; + m[3*4 + 2] = 2.0f * nearPlane * farPlane * d; + m[0*4 + 3] = 0.0f; + m[1*4 + 3] = 0.0f; + m[2*4 + 3] = -1.0f; + m[3*4 + 3] = 0.0f; + } + + void setPerspective2(float angle, float aspect, float nearPlane, float farPlane) { // Bail out if the projection volume is zero-sized. if (nearPlane == farPlane || aspect == 0.0f) @@ -1043,67 +1071,83 @@ struct mat4 { /// multiply two matrices static mat4 mul(const ref mat4 m1, const ref mat4 m2) { mat4 m; - m.m[0*4 + 0] = m1.m[0*4 + 0] * m2.m[0*4 + 0] + + m.m[0*4 + 0] = + m1.m[0*4 + 0] * m2.m[0*4 + 0] + m1.m[1*4 + 0] * m2.m[0*4 + 1] + m1.m[2*4 + 0] * m2.m[0*4 + 2] + m1.m[3*4 + 0] * m2.m[0*4 + 3]; - m.m[0*4 + 1] = m1.m[0*4 + 1] * m2.m[0*4 + 0] + + m.m[0*4 + 1] = + m1.m[0*4 + 1] * m2.m[0*4 + 0] + m1.m[1*4 + 1] * m2.m[0*4 + 1] + m1.m[2*4 + 1] * m2.m[0*4 + 2] + m1.m[3*4 + 1] * m2.m[0*4 + 3]; - m.m[0*4 + 2] = m1.m[0*4 + 2] * m2.m[0*4 + 0] + + m.m[0*4 + 2] = + m1.m[0*4 + 2] * m2.m[0*4 + 0] + m1.m[1*4 + 2] * m2.m[0*4 + 1] + m1.m[2*4 + 2] * m2.m[0*4 + 2] + m1.m[3*4 + 2] * m2.m[0*4 + 3]; - m.m[0*4 + 3] = m1.m[0*4 + 3] * m2.m[0*4 + 0] + + m.m[0*4 + 3] = + m1.m[0*4 + 3] * m2.m[0*4 + 0] + m1.m[1*4 + 3] * m2.m[0*4 + 1] + m1.m[2*4 + 3] * m2.m[0*4 + 2] + m1.m[3*4 + 3] * m2.m[0*4 + 3]; - m.m[1*4 + 0] = m1.m[0*4 + 0] * m2.m[1*4 + 0] + + m.m[1*4 + 0] = + m1.m[0*4 + 0] * m2.m[1*4 + 0] + m1.m[1*4 + 0] * m2.m[1*4 + 1] + m1.m[2*4 + 0] * m2.m[1*4 + 2] + m1.m[3*4 + 0] * m2.m[1*4 + 3]; - m.m[1*4 + 1] = m1.m[0*4 + 1] * m2.m[1*4 + 0] + + m.m[1*4 + 1] = + m1.m[0*4 + 1] * m2.m[1*4 + 0] + m1.m[1*4 + 1] * m2.m[1*4 + 1] + m1.m[2*4 + 1] * m2.m[1*4 + 2] + m1.m[3*4 + 1] * m2.m[1*4 + 3]; - m.m[1*4 + 2] = m1.m[0*4 + 2] * m2.m[1*4 + 0] + + m.m[1*4 + 2] = + m1.m[0*4 + 2] * m2.m[1*4 + 0] + m1.m[1*4 + 2] * m2.m[1*4 + 1] + m1.m[2*4 + 2] * m2.m[1*4 + 2] + m1.m[3*4 + 2] * m2.m[1*4 + 3]; - m.m[1*4 + 3] = m1.m[0*4 + 3] * m2.m[1*4 + 0] + + m.m[1*4 + 3] = + m1.m[0*4 + 3] * m2.m[1*4 + 0] + m1.m[1*4 + 3] * m2.m[1*4 + 1] + m1.m[2*4 + 3] * m2.m[1*4 + 2] + m1.m[3*4 + 3] * m2.m[1*4 + 3]; - m.m[2*4 + 0] = m1.m[0*4 + 0] * m2.m[2*4 + 0] + + m.m[2*4 + 0] = + m1.m[0*4 + 0] * m2.m[2*4 + 0] + m1.m[1*4 + 0] * m2.m[2*4 + 1] + m1.m[2*4 + 0] * m2.m[2*4 + 2] + m1.m[3*4 + 0] * m2.m[2*4 + 3]; - m.m[2*4 + 1] = m1.m[0*4 + 1] * m2.m[2*4 + 0] + + m.m[2*4 + 1] = + m1.m[0*4 + 1] * m2.m[2*4 + 0] + m1.m[1*4 + 1] * m2.m[2*4 + 1] + m1.m[2*4 + 1] * m2.m[2*4 + 2] + m1.m[3*4 + 1] * m2.m[2*4 + 3]; - m.m[2*4 + 2] = m1.m[0*4 + 2] * m2.m[2*4 + 0] + + m.m[2*4 + 2] = + m1.m[0*4 + 2] * m2.m[2*4 + 0] + m1.m[1*4 + 2] * m2.m[2*4 + 1] + m1.m[2*4 + 2] * m2.m[2*4 + 2] + m1.m[3*4 + 2] * m2.m[2*4 + 3]; - m.m[2*4 + 3] = m1.m[0*4 + 3] * m2.m[2*4 + 0] + + m.m[2*4 + 3] = + m1.m[0*4 + 3] * m2.m[2*4 + 0] + m1.m[1*4 + 3] * m2.m[2*4 + 1] + m1.m[2*4 + 3] * m2.m[2*4 + 2] + m1.m[3*4 + 3] * m2.m[2*4 + 3]; - m.m[3*4 + 0] = m1.m[0*4 + 0] * m2.m[3*4 + 0] + + m.m[3*4 + 0] = + m1.m[0*4 + 0] * m2.m[3*4 + 0] + m1.m[1*4 + 0] * m2.m[3*4 + 1] + m1.m[2*4 + 0] * m2.m[3*4 + 2] + m1.m[3*4 + 0] * m2.m[3*4 + 3]; - m.m[3*4 + 1] = m1.m[0*4 + 1] * m2.m[3*4 + 0] + + m.m[3*4 + 1] = + m1.m[0*4 + 1] * m2.m[3*4 + 0] + m1.m[1*4 + 1] * m2.m[3*4 + 1] + m1.m[2*4 + 1] * m2.m[3*4 + 2] + m1.m[3*4 + 1] * m2.m[3*4 + 3]; - m.m[3*4 + 2] = m1.m[0*4 + 2] * m2.m[3*4 + 0] + + m.m[3*4 + 2] = + m1.m[0*4 + 2] * m2.m[3*4 + 0] + m1.m[1*4 + 2] * m2.m[3*4 + 1] + m1.m[2*4 + 2] * m2.m[3*4 + 2] + m1.m[3*4 + 2] * m2.m[3*4 + 3]; - m.m[3*4 + 3] = m1.m[0*4 + 3] * m2.m[3*4 + 0] + + m.m[3*4 + 3] = + m1.m[0*4 + 3] * m2.m[3*4 + 0] + m1.m[1*4 + 3] * m2.m[3*4 + 1] + m1.m[2*4 + 3] * m2.m[3*4 + 2] + m1.m[3*4 + 3] * m2.m[3*4 + 3]; diff --git a/src/dlangui/graphics/glsupport.d b/src/dlangui/graphics/glsupport.d index 41d8f9e9..be74b18f 100644 --- a/src/dlangui/graphics/glsupport.d +++ b/src/dlangui/graphics/glsupport.d @@ -1165,7 +1165,6 @@ class GLVertexBuffer : VertexBuffer { override void draw(GraphicsEffect effect) { //bind(); enableAttributes(effect); - Log.d("draw ", _indexFragments); foreach (fragment; _indexFragments) { checkgl!glDrawRangeElements(primitiveTypeToGL(fragment.type), 0, _vertexCount - 1, // The first to last vertex diff --git a/src/dlangui/graphics/scene/mesh.d b/src/dlangui/graphics/scene/mesh.d index aa00139e..952fc072 100644 --- a/src/dlangui/graphics/scene/mesh.d +++ b/src/dlangui/graphics/scene/mesh.d @@ -304,8 +304,7 @@ class Mesh { 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)); + void addCubeMesh(vec3 pos, float d=1, vec4 color = vec4(1,1,1,1)) { 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); @@ -314,12 +313,17 @@ class Mesh { 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 + addQuad(p000, p010, p110, p100, color); // front face + addQuad(p101, p111, p011, p001, color); // back face + addQuad(p100, p110, p111, p101, color); // right face + addQuad(p001, p011, p010, p000, color); // left face + addQuad(p010, p011, p111, p110, color); // top face + addQuad(p001, p000, p100, p101, color); // bottom face + } + + 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)); + mesh.addCubeMesh(pos, d, color); return mesh; } }