From 13ee465cef15ec6df051e419d6633f0ede786c19 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 25 Apr 2016 13:39:46 +0300 Subject: [PATCH] fix lighting --- examples/d3d/src/d3d.d | 3 +- examples/dminer/src/dminer/core/blocks.d | 98 ++++++++++++++------- examples/dminer/src/dminer/core/minetypes.d | 36 ++++---- examples/dminer/src/minermain.d | 7 +- src/dlangui/core/math3d.d | 13 +++ src/dlangui/graphics/glsupport.d | 8 +- src/dlangui/graphics/scene/light.d | 4 +- src/dlangui/graphics/scene/mesh.d | 2 +- src/dlangui/graphics/scene/node.d | 19 ++++ 9 files changed, 132 insertions(+), 58 deletions(-) diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index 6f96ec10..ad78d6ca 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -180,6 +180,7 @@ class UiWidget : VerticalLayout, CellVisitor { brickNode.translate(vec3(-2, 2, -3)); Mesh brickMesh = Mesh.createCubeMesh(vec3(0, 0, 0), 0.8, vec4(0.8, 0.8, 0.8, 1)); Material brickMaterial = new Material(EffectId("textured.vert", "textured.frag", null), "brick", "brickn"); // with bump mapping + //brickMaterial.specular = true; brickNode.drawable = new Model(brickMaterial, brickMesh); _scene.addChild(brickNode); @@ -204,7 +205,7 @@ class UiWidget : VerticalLayout, CellVisitor { updateMinerMesh(); Material minerMaterial = new Material(EffectId("textured.vert", "textured.frag", null), "blocks"); - minerMaterial.textureLinear = false; + //minerMaterial.textureLinear = false; Model minerDrawable = new Model(minerMaterial, _minerMesh); Node3d minerNode = new Node3d("miner", minerDrawable); _scene.addChild(minerNode); diff --git a/examples/dminer/src/dminer/core/blocks.d b/examples/dminer/src/dminer/core/blocks.d index d002d16e..c8bb4cb6 100644 --- a/examples/dminer/src/dminer/core/blocks.d +++ b/examples/dminer/src/dminer/core/blocks.d @@ -84,65 +84,103 @@ public: } -/* - 0 1 - 3 2 +// pos, normal, color, tx + + +/* North, z=-1 + Y^ + 0 | 1 +X<-----x----- + 3 | 2 */ -immutable float inv = -1.0f; - -// pos, normal, color, tx static const float[VERTEX_COMPONENTS * 4] face_vertices_north = [ - -0.5, 0.5, -0.5, 0.0, 0.0, -1.0*inv, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, - 0.5, 0.5, -0.5, 0.0, 0.0, -1.0*inv, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, - -0.5, -0.5, -0.5, 0.0, 0.0, -1.0*inv, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - 0.5, -0.5, -0.5, 0.0, 0.0, -1.0*inv, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, + 0.5, 0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + -0.5, 0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + -0.5, -0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 0.5, -0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, ]; +/* South, z=1 + Y^ + 0 | 1 + -----x----->X + 3 | 2 +*/ + static const float[VERTEX_COMPONENTS * 4] face_vertices_south = [ - -0.5, -0.5, 0.5, 0.0, 0.0, 1.0*inv, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, - 0.5, -0.5, 0.5, 0.0, 0.0, 1.0*inv, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - -0.5, 0.5, 0.5, 0.0, 0.0, 1.0*inv, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, - 0.5, 0.5, 0.5, 0.0, 0.0, 1.0*inv, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + -0.5, 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 0.5, 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + -0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, ]; +/* West, x=-1 + Y^ + 0 | 1 + -----x----->Z + 3 | 2 +*/ + static const float[VERTEX_COMPONENTS * 4] face_vertices_west = [ - -0.5, -0.5, -0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, - -0.5, -0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - -0.5, 0.5, -0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, - -0.5, 0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0 + -0.5, 0.5, -0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + -0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + -0.5, -0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + -0.5, -0.5, -0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0 ]; +/* East, x=1 + Y^ + 0 | 1 +Z<-----x----- + 3 | 2 +*/ + static const float[VERTEX_COMPONENTS * 4] face_vertices_east = [ - 0.5, -0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, - 0.5, -0.5, -0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - 0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, - 0.5, 0.5, -0.5, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.5, 0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 0.5, 0.5, -0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.5, -0.5, -0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 0.5, -0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, ]; +/* Up, y=1 + + 0 | 1 + -----x----->X + 3 | 2 + Zv +*/ + static const float[VERTEX_COMPONENTS * 4] face_vertices_up = [ - -0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, - 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, - -0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - 0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, + -0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + -0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, ]; +/* Down, y=-1 + 0 | 1 +X<-----x----- + 3 | 2 + Zv +*/ + static const float[VERTEX_COMPONENTS * 4] face_vertices_down = [ - -0.5, -0.5, -0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, - 0.5, -0.5, -0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + 0.5, -0.5,-0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, + -0.5, -0.5,-0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - 0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, + 0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, ]; static const ushort[6] face_indexes = [ - 0, 1, 2, 2, 1, 3 + 2, 1, 0, 0, 3, 2 // CCW ]; static const ushort[6] face_indexes_back = diff --git a/examples/dminer/src/dminer/core/minetypes.d b/examples/dminer/src/dminer/core/minetypes.d index 6f326f40..1317f566 100644 --- a/examples/dminer/src/dminer/core/minetypes.d +++ b/examples/dminer/src/dminer/core/minetypes.d @@ -404,24 +404,24 @@ struct Position { pos = position; direction = dir; } - Vector2d calcPlaneCoords(Vector3d v) { - v = v - pos; - switch (direction.dir) with(Dir) { - default: - case NORTH: - return Vector2d(v.x, v.y); - case SOUTH: - return Vector2d(-v.x, v.y); - case EAST: - return Vector2d(v.z, v.y); - case WEST: - return Vector2d(-v.z, v.y); - case UP: - return Vector2d(-v.z, v.x); - case DOWN: - return Vector2d(v.z, v.x); - } - } + //Vector2d calcPlaneCoords(Vector3d v) { + // v = v - pos; + // switch (direction.dir) with(Dir) { + // default: + // case NORTH: + // return Vector2d(v.x, v.y); + // case SOUTH: + // return Vector2d(-v.x, v.y); + // case EAST: + // return Vector2d(v.z, v.y); + // case WEST: + // return Vector2d(-v.z, v.y); + // case UP: + // return Vector2d(-v.z, v.x); + // case DOWN: + // return Vector2d(v.z, v.x); + // } + //} void turnLeft() { direction.turnLeft(); } diff --git a/examples/dminer/src/minermain.d b/examples/dminer/src/minermain.d index cb0b58ab..92245b52 100644 --- a/examples/dminer/src/minermain.d +++ b/examples/dminer/src/minermain.d @@ -86,7 +86,8 @@ class UiWidget : VerticalLayout, CellVisitor { dirLightNode.translateX(2); dirLightNode.translateY(3); dirLightNode.translateZ(0); - dirLightNode.light = Light.createPoint(vec3(12, 12, 12), 25); //Light.createDirectional(vec3(1, 0.5, 0.5)); + dirLightNode.light = Light.createPoint(vec3(1.5, 1.5, 1.5), 25); //Light.createDirectional(vec3(1, 0.5, 0.5)); + //dirLightNode.light = Light.createDirectional(vec3(1, 0.5, 0.5)); dirLightNode.light.enabled = true; _scene.addChild(dirLightNode); @@ -134,9 +135,9 @@ class UiWidget : VerticalLayout, CellVisitor { updateMinerMesh(); Material minerMaterial = new Material(EffectId("textured.vert", "textured.frag", null), "blocks"); - minerMaterial.ambientColor = vec3(0.05,0.05,0.05); + minerMaterial.ambientColor = vec3(0.1,0.1,0.1); minerMaterial.textureLinear = false; - minerMaterial.specular = true; + minerMaterial.specular = 10; Model minerDrawable = new Model(minerMaterial, _minerMesh); Node3d minerNode = new Node3d("miner", minerDrawable); _scene.addChild(minerNode); diff --git a/src/dlangui/core/math3d.d b/src/dlangui/core/math3d.d index 30216878..2c979231 100644 --- a/src/dlangui/core/math3d.d +++ b/src/dlangui/core/math3d.d @@ -1616,6 +1616,19 @@ struct mat4 { return vec3(m[8], m[9], m[10]); } + void transformVector(ref vec3 v) const { + transformVector(v.x, v.y, v.z, 0, v); + } + + void transformPoint(ref vec3 v) const { + transformVector(v.x, v.y, v.z, 1, v); + } + + void transformVector(float x, float y, float z, float w, ref vec3 dst) const { + dst.x = x * m[0] + y * m[4] + z * m[8] + w * m[12]; + dst.y = x * m[1] + y * m[5] + z * m[9] + w * m[13]; + dst.z = x * m[2] + y * m[6] + z * m[10] + w * m[14]; + } static __gshared const mat4 IDENTITY; } diff --git a/src/dlangui/graphics/glsupport.d b/src/dlangui/graphics/glsupport.d index 5bbb1dc2..9840a86c 100644 --- a/src/dlangui/graphics/glsupport.d +++ b/src/dlangui/graphics/glsupport.d @@ -487,9 +487,9 @@ class SolidFillProgram : GLProgram { /// get location for vertex attribute override int getVertexElementLocation(VertexElementType type) { switch(type) with(VertexElementType) { - case POSITION: + case POSITION: return vertexLocation; - case COLOR: + case COLOR: return colAttrLocation; default: return VERTEX_ELEMENT_NOT_FOUND; @@ -1314,13 +1314,15 @@ class GLVertexBuffer : VertexBuffer { // specify index buffer checkgl!glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); int offset = 0; + //Log.v("=== enableAttributes for ", _format); for(int i = 0; i < _format.length; i++) { int loc = effect.getVertexElementLocation(_format[i].type); if (loc >= 0) { + //Log.v("setting attrib pointer for type ", _format[i].type, " offset=", offset, " location=", loc); checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, cast(ubyte)GL_FALSE, _format.vertexSize, cast(char*)(offset)); checkgl!glEnableVertexAttribArray(loc); } else { - //Log.d("Attribute location not found for ", _format[i].type); + //Log.v("Attribute location not found for ", _format[i].type); } offset += _format[i].byteSize; } diff --git a/src/dlangui/graphics/scene/light.d b/src/dlangui/graphics/scene/light.d index 7c8b7e8e..4cf0d456 100644 --- a/src/dlangui/graphics/scene/light.d +++ b/src/dlangui/graphics/scene/light.d @@ -44,9 +44,9 @@ class Light : RefCountedObject { @property Light node(Node3d n) { _node = n; return this; } /// direction in world coordinates - @property vec3 direction() { return _node ? _node.forwardVectorWorld : vec3(0, 0, 1); } + @property vec3 direction() { return _node ? _node.forwardVectorView : vec3(0, 0, 1); } /// position in world coordinates - @property vec3 position() { return _node ? _node.translationWorld : vec3(0, 0, 0); } + @property vec3 position() { return _node ? _node.translationView : vec3(0, 0, 0); } @property float range() const { return 1.0; } @property void range(float v) { assert(false); } diff --git a/src/dlangui/graphics/scene/mesh.d b/src/dlangui/graphics/scene/mesh.d index 91146ca9..b3046882 100644 --- a/src/dlangui/graphics/scene/mesh.d +++ b/src/dlangui/graphics/scene/mesh.d @@ -201,7 +201,7 @@ struct VertexElement { /// Vertex format elements list struct VertexFormat { private VertexElement[] _elements; - private byte[VertexElementType.max + 1] _elementOffset = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; + private byte[16] _elementOffset = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; private int _vertexSize; // vertex size in floats /// make using element list this(inout VertexElement[] elems...) { diff --git a/src/dlangui/graphics/scene/node.d b/src/dlangui/graphics/scene/node.d index 23a14176..1566b8a4 100644 --- a/src/dlangui/graphics/scene/node.d +++ b/src/dlangui/graphics/scene/node.d @@ -179,6 +179,14 @@ class Node3d : Transform { return translation; } + /// returns translation vector (position) of this node in view space + @property vec3 translationView() { + vec3 translation; + worldMatrix.getTranslation(translation); + viewMatrix.transformPoint(translation); + return translation; + } + /** * Gets the inverse transpose world matrix corresponding to this node. * @@ -218,4 +226,15 @@ class Node3d : Transform { @property vec3 forwardVectorWorld() { return worldMatrix.forwardVector; } + /** + * Returns the forward vector of the Node in view space. + * + * @return The forward vector in view space. + */ + @property vec3 forwardVectorView() { + return worldMatrix.forwardVector; + vec3 vector = worldMatrix.forwardVector; + viewMatrix.transformVector(vector); + return vector; + } }