mirror of https://github.com/buggins/dlangui.git
d3d example: continue porting dminer - minecraft like engine
This commit is contained in:
parent
a7f485555a
commit
944d5158c5
|
@ -411,6 +411,7 @@
|
||||||
<Folder name="d3d">
|
<Folder name="d3d">
|
||||||
<Folder name="dminer">
|
<Folder name="dminer">
|
||||||
<Folder name="core">
|
<Folder name="core">
|
||||||
|
<File path="src\dminer\core\blocks.d" />
|
||||||
<File path="src\dminer\core\minetypes.d" />
|
<File path="src\dminer\core\minetypes.d" />
|
||||||
<File path="src\dminer\core\world.d" />
|
<File path="src\dminer\core\world.d" />
|
||||||
</Folder>
|
</Folder>
|
||||||
|
|
|
@ -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(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(-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
|
/// returns true is widget is being animated - need to call animate() and redraw
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
module dminer.core.world;
|
module dminer.core.world;
|
||||||
|
|
||||||
import dminer.core.minetypes;
|
import dminer.core.minetypes;
|
||||||
|
import dminer.core.blocks;
|
||||||
|
|
||||||
const int MAX_VIEW_DISTANCE_BITS = 7;
|
const int MAX_VIEW_DISTANCE_BITS = 7;
|
||||||
const int MAX_VIEW_DISTANCE = (1 << MAX_VIEW_DISTANCE_BITS);
|
const int MAX_VIEW_DISTANCE = (1 << MAX_VIEW_DISTANCE_BITS);
|
||||||
|
@ -104,3 +105,73 @@ public:
|
||||||
maxx = x + 1;
|
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) {
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
|
@ -16,3 +16,4 @@ res/mdpi/edit-undo.png
|
||||||
res/mdpi/edit-unindent.png
|
res/mdpi/edit-unindent.png
|
||||||
res/mdpi/tx_fabric.jpg
|
res/mdpi/tx_fabric.jpg
|
||||||
res/theme_custom1.xml
|
res/theme_custom1.xml
|
||||||
|
res/blocks.png
|
||||||
|
|
Loading…
Reference in New Issue