From 944d5158c56f48c74bc32759c911daee3d140d69 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 21 Mar 2016 15:48:01 +0300 Subject: [PATCH] d3d example: continue porting dminer - minecraft like engine --- examples/d3d/d3d-msvc.visualdproj | 1 + examples/d3d/src/d3d.d | 6 ++ examples/d3d/src/dminer/core/blocks.d | 109 +++++++++++++++++++++++++ examples/d3d/src/dminer/core/world.d | 71 ++++++++++++++++ examples/example1/views/res/blocks.png | Bin 0 -> 22935 bytes examples/example1/views/resources.list | 1 + 6 files changed, 188 insertions(+) create mode 100644 examples/d3d/src/dminer/core/blocks.d create mode 100644 examples/example1/views/res/blocks.png diff --git a/examples/d3d/d3d-msvc.visualdproj b/examples/d3d/d3d-msvc.visualdproj index a80d15b0..ed3b2e9b 100644 --- a/examples/d3d/d3d-msvc.visualdproj +++ b/examples/d3d/d3d-msvc.visualdproj @@ -411,6 +411,7 @@ + diff --git a/examples/d3d/src/d3d.d b/examples/d3d/src/d3d.d index cf216325..ca7934ef 100644 --- a/examples/d3d/src/d3d.d +++ b/examples/d3d/src/d3d.d @@ -116,6 +116,12 @@ class UiWidget : VerticalLayout { _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)); } + + import dminer.core.world; + World w = new World(); + for (int x = -100; x < 100; x++) + for (int z = -100; z < 100; z++) + w.setCell(x, 10, z, 1); } /// returns true is widget is being animated - need to call animate() and redraw diff --git a/examples/d3d/src/dminer/core/blocks.d b/examples/d3d/src/dminer/core/blocks.d new file mode 100644 index 00000000..7a438ba3 --- /dev/null +++ b/examples/d3d/src/dminer/core/blocks.d @@ -0,0 +1,109 @@ +module dminer.core.blocks; + +import dminer.core.minetypes; + +/* +#define BLOCK_TEXTURE_FILENAME "res/png/blocks.png" +#define BLOCK_TEXTURE_DX 1024 +#define BLOCK_TEXTURE_DY 1024 +#define BLOCK_SPRITE_SIZE 16 +#define BLOCK_SPRITE_STEP 20 +#define BLOCK_SPRITE_OFFSET 21 +#define BLOCK_TEXTURE_SPRITES_PER_LINE 50 + +*/ +enum BlockVisibility { + INVISIBLE, + OPAQUE, // completely opaque (cells covered by this block are invisible) + OPAQUE_SEPARATE_TX, + HALF_OPAQUE, // partially paque, cells covered by this block can be visible, render as normal block + HALF_OPAQUE_SEPARATE_TX, + HALF_TRANSPARENT, // should be rendered last (semi transparent texture) +}; + +class BlockDef { +public: + cell_t id; + string name; + BlockVisibility visibility = BlockVisibility.INVISIBLE; + int txIndex; + this() { + } + this(cell_t blockId, string blockName, BlockVisibility v, int tx) { + id = blockId; + name = blockName; + visibility = v; + txIndex = tx; + } + ~this() { + } + // blocks behind this block can be visible + @property bool canPass() { + return visibility == BlockVisibility.INVISIBLE + || visibility == BlockVisibility.HALF_OPAQUE + || visibility == BlockVisibility.HALF_OPAQUE_SEPARATE_TX + || visibility == BlockVisibility.HALF_TRANSPARENT; + } + // block is fully opaque (all blocks behind are invisible) + @property bool isOpaque() { + return visibility == BlockVisibility.OPAQUE + || visibility == BlockVisibility.OPAQUE_SEPARATE_TX; + } + // block is visible + @property bool isVisible() { + return visibility != BlockVisibility.INVISIBLE; + } + + @property bool terrainSmoothing() { + return false; + } + + /// create cube face + //void createFace(World * world, Position & camPosition, Vector3d pos, Dir face, FloatArray & vertices, IntArray & indexes) { + //} + /// create faces + //void createFaces(World * world, Position & camPosition, Vector3d pos, int visibleFaces, FloatArray & vertices, IntArray & indexes) { + //} +} + + +// block type definitions +__gshared BlockDef BLOCK_DEFS[256]; +// faster check for block->canPass() +__gshared bool BLOCK_TYPE_CAN_PASS[256]; +// faster check for block->isOpaque() +__gshared bool BLOCK_TYPE_OPAQUE[256]; +// faster check for block->isVisible() +__gshared bool BLOCK_TYPE_VISIBLE[256]; +// faster check for block->isVisible() +__gshared bool BLOCK_TERRAIN_SMOOTHING[256]; + +/// registers new block type +void registerBlockType(BlockDef def) { + if (BLOCK_DEFS[def.id]) { + if (BLOCK_DEFS[def.id] is def) + return; + destroy(BLOCK_DEFS[def.id]); + } + BLOCK_DEFS[def.id] = def; + // init property shortcuts + BLOCK_TYPE_CAN_PASS[def.id] = def.canPass; + BLOCK_TYPE_OPAQUE[def.id] = def.isOpaque; + BLOCK_TYPE_VISIBLE[def.id] = def.isVisible; + BLOCK_TERRAIN_SMOOTHING[def.id] = def.terrainSmoothing; +} + +/// init block types array +__gshared static this() { + import std.string; + for (int i = 0; i < 256; i++) { + if (!BLOCK_DEFS[i]) { + registerBlockType(new BlockDef(cast(cell_t)i, "undef%d".format(i), BlockVisibility.INVISIBLE, 0)); + } + } + BLOCK_TYPE_CAN_PASS[BOUND_SKY] = false; + BLOCK_TYPE_VISIBLE[BOUND_SKY] = false; + BLOCK_TYPE_CAN_PASS[BOUND_BOTTOM] = false; + BLOCK_TYPE_VISIBLE[BOUND_BOTTOM] = true; +} + diff --git a/examples/d3d/src/dminer/core/world.d b/examples/d3d/src/dminer/core/world.d index e62781cc..f6ad3cb9 100644 --- a/examples/d3d/src/dminer/core/world.d +++ b/examples/d3d/src/dminer/core/world.d @@ -1,6 +1,7 @@ module dminer.core.world; import dminer.core.minetypes; +import dminer.core.blocks; const int MAX_VIEW_DISTANCE_BITS = 7; const int MAX_VIEW_DISTANCE = (1 << MAX_VIEW_DISTANCE_BITS); @@ -104,3 +105,73 @@ public: maxx = x + 1; } } + +/// Voxel World +class World { +private: + //Position camPosition; + int maxVisibleRange = MAX_VIEW_DISTANCE; + int lastChunkX = 1000000; + int lastChunkZ = 1000000; + Chunk * lastChunk; + ChunkMatrix chunks; + //DiamondVisitor visitorHelper; +public: + this() + { + } + ~this() { + + } + //void visitVisibleCellsAllDirectionsFast(Position & position, CellVisitor * visitor); + //Position & getCamPosition() { return camPosition; } + cell_t getCell(Vector3d v) { + return getCell(v.x, v.y, v.z); + } + cell_t getCell(int x, int y, int z) { + if (y < 0) + return 3; + int chunkx = x >> CHUNK_DX_SHIFT; + int chunkz = z >> CHUNK_DX_SHIFT; + Chunk * p; + if (lastChunkX == chunkx && lastChunkZ == chunkz) { + p = lastChunk; + } else { + p = chunks.get(chunkx, chunkz); + lastChunkX = chunkx; + lastChunkZ = chunkz; + lastChunk = p; + } + if (!p) + return NO_CELL; + return p.get(x & CHUNK_DX_MASK, y, z & CHUNK_DX_MASK); + } + bool isOpaque(Vector3d v) { + cell_t cell = getCell(v); + return BLOCK_TYPE_OPAQUE[cell] && cell != BOUND_SKY; + } + void setCell(int x, int y, int z, cell_t value) { + int chunkx = x >> CHUNK_DX_SHIFT; + int chunkz = z >> CHUNK_DX_SHIFT; + Chunk * p; + if (lastChunkX == chunkx && lastChunkZ == chunkz) { + p = lastChunk; + } + else { + p = chunks.get(chunkx, chunkz); + lastChunkX = chunkx; + lastChunkZ = chunkz; + lastChunk = p; + } + if (!p) { + p = new Chunk(); + chunks.set(chunkx, chunkz, p); + lastChunkX = chunkx; + lastChunkZ = chunkz; + lastChunk = p; + } + p.set(x & CHUNK_DX_MASK, y, z & CHUNK_DX_MASK, value); + } + //bool canPass(Vector3d pos, Vector3d size) { + //} +} diff --git a/examples/example1/views/res/blocks.png b/examples/example1/views/res/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/example1/views/resources.list b/examples/example1/views/resources.list index c767a4fe..d05c5428 100644 --- a/examples/example1/views/resources.list +++ b/examples/example1/views/resources.list @@ -16,3 +16,4 @@ res/mdpi/edit-undo.png res/mdpi/edit-unindent.png res/mdpi/tx_fabric.jpg res/theme_custom1.xml +res/blocks.png