From a8fb74602e0e44f0b7f4fa060fca05a73e28f106 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Tue, 22 Mar 2016 13:06:30 +0300 Subject: [PATCH] d3d dminer fixes --- examples/d3d/dub.json | 2 +- examples/d3d/src/d3d.d | 60 ++++++++++++------- examples/d3d/src/dminer/core/blocks.d | 78 ++++++++++++------------- examples/d3d/views/res/mdpi/blocks.png | Bin 0 -> 22935 bytes examples/d3d/views/resources.list | 1 + 5 files changed, 80 insertions(+), 61 deletions(-) create mode 100644 examples/d3d/views/res/mdpi/blocks.png diff --git a/examples/d3d/dub.json b/examples/d3d/dub.json index 39b6f270..78db38dc 100644 --- a/examples/d3d/dub.json +++ b/examples/d3d/dub.json @@ -12,6 +12,6 @@ "targetType": "executable", "dependencies": { - "dlangui": "*", + "dlangui": {"path": "../../"} } } diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index 51e51c14..b350fd47 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -104,37 +104,42 @@ class UiWidget : VerticalLayout, CellVisitor { _scene = new Scene3d(); _cam = new Camera(); - _cam.translate(vec3(0, 0, -7)); + _cam.translate(vec3(0, 14, -7)); _scene.activeCamera = _cam; - _mesh = Mesh.createCubeMesh(vec3(0, 0, 0), 0.3f); + int x0 = 0; + int y0 = 11; + int z0 = 0; + + _mesh = Mesh.createCubeMesh(vec3(x0+ 0, y0 + 0, z0 + 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)); + _mesh.addCubeMesh(vec3(x0+ 0, y0+0, z0+ i * 2 + 1.0f), 0.2f, vec4(i / 12, 1, 1, 1)); + _mesh.addCubeMesh(vec3(x0+ i * 2 + 1.0f, y0+0, z0+ 0), 0.2f, vec4(1, i / 12, 1, 1)); + _mesh.addCubeMesh(vec3(x0+ -i * 2 - 1.0f, y0+0, z0+ 0), 0.2f, vec4(1, i / 12, 1, 1)); + _mesh.addCubeMesh(vec3(x0+ 0, y0+i * 2 + 1.0f, z0+ 0), 0.2f, vec4(1, 1, i / 12 + 0.1, 1)); + _mesh.addCubeMesh(vec3(x0+ 0, y0+-i * 2 - 1.0f, z0+ 0), 0.2f, vec4(1, 1, i / 12 + 0.1, 1)); + _mesh.addCubeMesh(vec3(x0+ i * 2 + 1.0f, y0+i * 2 + 1.0f, z0+ i * 2 + 1.0f), 0.2f, vec4(i / 12, i / 12, i / 12, 1)); + _mesh.addCubeMesh(vec3(x0+ -i * 2 + 1.0f, y0+i * 2 + 1.0f, z0+ i * 2 + 1.0f), 0.2f, vec4(i / 12, i / 12, 1 - i / 12, 1)); + _mesh.addCubeMesh(vec3(x0+ i * 2 + 1.0f, y0+-i * 2 + 1.0f, z0+ i * 2 + 1.0f), 0.2f, vec4(i / 12, 1 - i / 12, i / 12, 1)); + _mesh.addCubeMesh(vec3(x0+ -i * 2 - 1.0f, y0+-i * 2 - 1.0f, z0+ -i * 2 - 1.0f), 0.2f, vec4(1 - i / 12, i / 12, i / 12, 1)); } _minerMesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.NORMAL, VertexElementType.COLOR, VertexElementType.TEXCOORD0)); - World _world = new World(); + _world = new World(); for (int x = -1000; x < 1000; x++) for (int z = -1000; z < 1000; z++) _world.setCell(x, 10, z, 1); _world.setCell(0, 11, 10, 2); _world.setCell(5, 11, 15, 2); _world.camPosition = Position(Vector3d(0, 13, 0), Vector3d(0, 0, 1)); - CellVisitor visitor = new TestVisitor(); - Log.d("Testing cell visitor"); - long ts = currentTimeMillis; - _world.visitVisibleCells(_world.camPosition, visitor); - long duration = currentTimeMillis - ts; - Log.d("DiamondVisitor finished in ", duration, " ms"); + updateMinerMesh(); + //CellVisitor visitor = new TestVisitor(); + //Log.d("Testing cell visitor"); + //long ts = currentTimeMillis; + //_world.visitVisibleCells(_world.camPosition, visitor); + //long duration = currentTimeMillis - ts; + //Log.d("DiamondVisitor finished in ", duration, " ms"); //destroy(w); } @@ -148,7 +153,7 @@ class UiWidget : VerticalLayout, CellVisitor { long ts = currentTimeMillis; _world.visitVisibleCells(_world.camPosition, this); long duration = currentTimeMillis - ts; - Log.d("DiamondVisitor finished in ", duration, " ms"); + Log.d("DiamondVisitor finished in ", duration, " ms ", "Vertex count: ", _minerMesh.vertexCount); } World _world; @@ -171,6 +176,7 @@ class UiWidget : VerticalLayout, CellVisitor { Mesh _mesh; Mesh _minerMesh; GLTexture _tx; + GLTexture _blockstx; /// this is OpenGLDrawableDelegate implementation @@ -182,13 +188,16 @@ class UiWidget : VerticalLayout, CellVisitor { return; if (!_tx) _tx = new GLTexture("crate"); - if (!_tx.isValid) { + if (!_blockstx) + _blockstx = new GLTexture("blocks"); + if (!_tx.isValid || !_blockstx.isValid) { Log.e("Invalid texture"); return; } _cam.setPerspective(rc.width, rc.height, 45.0f, 0.1f, 100.0f); _cam.setIdentity(); - _cam.translate(vec3(0, 0, -1.1)); // - angle/1000 + //_cam.translate(vec3(0, 14, -1.1)); // - angle/1000 + _cam.translate(vec3(0, 14, - angle/1000)); // _cam.rotateZ(30.0f + angle * 0.3456778); mat4 projectionViewMatrix = _cam.projectionViewMatrix; @@ -207,6 +216,7 @@ class UiWidget : VerticalLayout, CellVisitor { //Log.d("matrix uniform: ", projectionViewModelMatrix.m); checkgl!glEnable(GL_CULL_FACE); + //checkgl!glDisable(GL_CULL_FACE); checkgl!glEnable(GL_DEPTH_TEST); checkgl!glCullFace(GL_BACK); @@ -218,6 +228,14 @@ class UiWidget : VerticalLayout, CellVisitor { _program.draw(_mesh); _tx.texture.unbind(); + + _blockstx.texture.setup(); + _blockstx.texture.setSamplerParams(false); + + _program.draw(_minerMesh); + + _blockstx.texture.unbind(); + _program.unbind(); checkgl!glDisable(GL_DEPTH_TEST); checkgl!glDisable(GL_CULL_FACE); diff --git a/examples/d3d/src/dminer/core/blocks.d b/examples/d3d/src/dminer/core/blocks.d index 052ef691..c8a3270f 100644 --- a/examples/d3d/src/dminer/core/blocks.d +++ b/examples/d3d/src/dminer/core/blocks.d @@ -89,50 +89,50 @@ public: // 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, 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, 0.0, 1.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, 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, 0.0, 1.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, ]; static const float[VERTEX_COMPONENTS * 4] face_vertices_south = [ - -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, 0.0, 1.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, 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, 0.0, 1.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, ]; 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, 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, 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, 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 ]; 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, 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, 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, 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, ]; 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, 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, 0.0, 1.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, 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, 0.0, 1.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, ]; 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, 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, 0.0, 1.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, 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, 0.0, 1.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, ]; static const ushort[6] face_indexes = @@ -146,12 +146,12 @@ static const ushort[6] face_indexes_back = ]; static void fillFaceMesh(float * data, const float * src, float x0, float y0, float z0, int tileX, int tileY) { - for (int i = 0; i < 4; i++) { - const float * srcvertex = src + i * VERTEX_COMPONENTS; - float * dstvertex = data + i * VERTEX_COMPONENTS; - for (int j = 0; j < 11; j++) { - float v = srcvertex[j]; - switch (j) { + for (int i = 0; i < 4; i++) { + const float * srcvertex = src + i * VERTEX_COMPONENTS; + float * dstvertex = data + i * VERTEX_COMPONENTS; + for (int j = 0; j < 11; j++) { + float v = srcvertex[j]; + switch (j) { default: case 0: // x v += x0; @@ -168,18 +168,18 @@ static void fillFaceMesh(float * data, const float * src, float x0, float y0, fl case 10: // tx.v v = (BLOCK_TEXTURE_DY - (tileY + v * BLOCK_SPRITE_SIZE)) / cast(float)BLOCK_TEXTURE_DY; break; - } - dstvertex[j] = v; - } - } + } + dstvertex[j] = v; + } + } } static void createFaceMesh(float * data, Dir face, float x0, float y0, float z0, int tileIndex) { - int tileX = (tileIndex % BLOCK_TEXTURE_SPRITES_PER_LINE) * BLOCK_SPRITE_STEP + BLOCK_SPRITE_OFFSET; - int tileY = (tileIndex / BLOCK_TEXTURE_SPRITES_PER_LINE) * BLOCK_SPRITE_STEP + BLOCK_SPRITE_OFFSET; - // data is 11 comp * 4 vert floats - switch (face) { + int tileX = (tileIndex % BLOCK_TEXTURE_SPRITES_PER_LINE) * BLOCK_SPRITE_STEP + BLOCK_SPRITE_OFFSET; + int tileY = (tileIndex / BLOCK_TEXTURE_SPRITES_PER_LINE) * BLOCK_SPRITE_STEP + BLOCK_SPRITE_OFFSET; + // data is 11 comp * 4 vert floats + switch (face) { default: case NORTH: fillFaceMesh(data, face_vertices_north.ptr, x0, y0, z0, tileX, tileY); @@ -199,7 +199,7 @@ static void createFaceMesh(float * data, Dir face, float x0, float y0, float z0, case DOWN: fillFaceMesh(data, face_vertices_down.ptr, x0, y0, z0, tileX, tileY); break; - } + } } diff --git a/examples/d3d/views/res/mdpi/blocks.png b/examples/d3d/views/res/mdpi/blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6c999b82b9a496cf1f6ff4105e6e0af4ea3a60 GIT binary patch literal 22935 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 literal 0 HcmV?d00001 diff --git a/examples/d3d/views/resources.list b/examples/d3d/views/resources.list index 473da14c..e6dca3c6 100644 --- a/examples/d3d/views/resources.list +++ b/examples/d3d/views/resources.list @@ -3,3 +3,4 @@ res/i18n/ru.ini res/mdpi/cr3_logo.png res/mdpi/tx_fabric.jpg res/mdpi/crate.png +res/mdpi/blocks.png