implement block types
This commit is contained in:
@@ -23,6 +23,10 @@ window.Minecraft = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
// Create all blocks
|
||||||
|
Block.create();
|
||||||
|
|
||||||
|
// Start render loop
|
||||||
this.running = true;
|
this.running = true;
|
||||||
this.requestNextFrame();
|
this.requestNextFrame();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ window.Player = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resetPos() {
|
resetPos() {
|
||||||
this.setPos(0, 2, 0);
|
this.setPos(0, 25, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
setPos(x, y, z) {
|
setPos(x, y, z) {
|
||||||
|
|||||||
@@ -6,18 +6,21 @@ window.BlockRenderer = class {
|
|||||||
this.tessellator.bindTexture(worldRenderer.terrainTexture);
|
this.tessellator.bindTexture(worldRenderer.terrainTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderBlock(world, group, typeId, x, y, z) {
|
renderBlock(world, group, block, x, y, z) {
|
||||||
let boundingBox = new BoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
|
let boundingBox = block.getBoundingBox(world, x, y, z);
|
||||||
|
|
||||||
|
// Render all faces
|
||||||
let values = EnumBlockFace.values();
|
let values = EnumBlockFace.values();
|
||||||
for (let i = 0; i < values.length; i++) {
|
for (let i = 0; i < values.length; i++) {
|
||||||
let face = values[i];
|
let face = values[i];
|
||||||
if (this.shouldRenderFace(world, x, y, z, face)) {
|
|
||||||
|
// Check if face is hidden by other block
|
||||||
|
if (block.shouldRenderFace(world, x, y, z, face)) {
|
||||||
// Start drawing
|
// Start drawing
|
||||||
this.tessellator.startDrawing();
|
this.tessellator.startDrawing();
|
||||||
|
|
||||||
// Render face
|
// Render face
|
||||||
this.renderFace(world, typeId, boundingBox, face, x, y, z);
|
this.renderFace(world, block, boundingBox, face, x, y, z);
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
this.tessellator.draw(group);
|
this.tessellator.draw(group);
|
||||||
@@ -25,12 +28,7 @@ window.BlockRenderer = class {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shouldRenderFace(world, x, y, z, face) {
|
renderFace(world, block, boundingBox, face, x, y, z) {
|
||||||
let typeId = world.getBlockAt(x + face.x, y + face.y, z + face.z);
|
|
||||||
return typeId === 0; /*|| Block.getById(typeId).isTransparent();*/
|
|
||||||
}
|
|
||||||
|
|
||||||
renderFace(world, typeId, boundingBox, face, x, y, z) {
|
|
||||||
// Vertex mappings
|
// Vertex mappings
|
||||||
let minX = x + boundingBox.minX;
|
let minX = x + boundingBox.minX;
|
||||||
let minY = y + boundingBox.minY;
|
let minY = y + boundingBox.minY;
|
||||||
@@ -40,7 +38,7 @@ window.BlockRenderer = class {
|
|||||||
let maxZ = z + boundingBox.maxZ;
|
let maxZ = z + boundingBox.maxZ;
|
||||||
|
|
||||||
// UV Mapping
|
// UV Mapping
|
||||||
let textureIndex = typeId;
|
let textureIndex = block.getTextureForFace(face);
|
||||||
let minU = (textureIndex % 16) / 16.0;
|
let minU = (textureIndex % 16) / 16.0;
|
||||||
let maxU = minU + (16 / 256);
|
let maxU = minU + (16 / 256);
|
||||||
let minV = Math.round(textureIndex / 16);
|
let minV = Math.round(textureIndex / 16);
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ window.ChunkSection = class {
|
|||||||
let absoluteY = this.y * ChunkSection.SIZE + y;
|
let absoluteY = this.y * ChunkSection.SIZE + y;
|
||||||
let absoluteZ = this.z * ChunkSection.SIZE + z;
|
let absoluteZ = this.z * ChunkSection.SIZE + z;
|
||||||
|
|
||||||
renderer.blockRenderer.renderBlock(this.world, this.group, typeId, absoluteX, absoluteY, absoluteZ);
|
let block = Block.getById(typeId);
|
||||||
|
renderer.blockRenderer.renderBlock(this.world, this.group, block, absoluteX, absoluteY, absoluteZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
window.World = class {
|
window.World = class {
|
||||||
|
|
||||||
static get TOTAL_HEIGHT() {
|
static TOTAL_HEIGHT = ChunkSection.SIZE * 16 - 1;
|
||||||
return ChunkSection.SIZE * 16 - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.group = new THREE.Object3D();
|
this.group = new THREE.Object3D();
|
||||||
this.chunks = [];
|
this.chunks = [];
|
||||||
|
|
||||||
|
// Debug world
|
||||||
for (let x = -16; x < 16; x++) {
|
for (let x = -16; x < 16; x++) {
|
||||||
for (let z = -16; z < 16; z++) {
|
for (let y = 0; y < 16; y++) {
|
||||||
this.setBlockAt(x, 0, z, 1);
|
for (let z = -16; z < 16; z++) {
|
||||||
|
this.setBlockAt(x, y, z, y === 15 ? 2 : 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.setBlockAt(0, 16, -2, 17);
|
||||||
this.setBlockAt(0, 1, -2, 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getChunkAtBlock(x, y, z) {
|
getChunkAtBlock(x, y, z) {
|
||||||
@@ -46,7 +46,7 @@ window.World = class {
|
|||||||
|
|
||||||
isSolidBlockAt(x, y, z) {
|
isSolidBlockAt(x, y, z) {
|
||||||
let typeId = this.getBlockAt(x, y, z);
|
let typeId = this.getBlockAt(x, y, z);
|
||||||
return typeId !== 0; /* && Block.getById(typeId).isSolid();*/
|
return typeId !== 0 && Block.getById(typeId).isSolid();
|
||||||
}
|
}
|
||||||
|
|
||||||
setBlockAt(x, y, z, type) {
|
setBlockAt(x, y, z, type) {
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
window.Block = class {
|
||||||
|
|
||||||
|
static blocks = [];
|
||||||
|
|
||||||
|
static create() {
|
||||||
|
Block.STONE = new BlockStone(1, 0);
|
||||||
|
Block.GRASS = new BlockGrass(2, 1);
|
||||||
|
Block.DIRT = new BlockDirt(3, 2);
|
||||||
|
Block.LOG = new BlockLog(17, 4);
|
||||||
|
Block.LEAVE = new BlockLeave(18, 6);
|
||||||
|
Block.WATER = new BlockWater(9, 7);
|
||||||
|
Block.SAND = new BlockSand(12, 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(id, textureSlotId = id) {
|
||||||
|
this.id = id;
|
||||||
|
this.textureSlotId = textureSlotId;
|
||||||
|
|
||||||
|
this.boundingBox = new BoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
// Register block
|
||||||
|
Block.blocks[id] = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
getId() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTextureForFace(face) {
|
||||||
|
return this.textureSlotId;
|
||||||
|
}
|
||||||
|
|
||||||
|
isTransparent() {
|
||||||
|
return this.getOpacity() < 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldRenderFace(world, x, y, z, face) {
|
||||||
|
let typeId = world.getBlockAt(x + face.x, y + face.y, z + face.z);
|
||||||
|
return typeId === 0 || Block.getById(typeId).isTransparent();
|
||||||
|
}
|
||||||
|
|
||||||
|
isSolid() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
getOpacity() {
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
getBoundingBox(world, x, y, z) {
|
||||||
|
return this.boundingBox;
|
||||||
|
}
|
||||||
|
|
||||||
|
static getById(typeId) {
|
||||||
|
return Block.blocks[typeId];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
window.BlockDirt = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
window.BlockGrass = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTextureForFace(face) {
|
||||||
|
switch (face) {
|
||||||
|
case EnumBlockFace.TOP:
|
||||||
|
return this.textureSlotId;
|
||||||
|
case EnumBlockFace.BOTTOM:
|
||||||
|
return this.textureSlotId + 1;
|
||||||
|
default:
|
||||||
|
return this.textureSlotId + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
window.BlockLeave = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
getOpacity() {
|
||||||
|
return 0.3;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
window.BlockLog = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTextureForFace(face) {
|
||||||
|
return this.textureSlotId + (face.isYAxis() ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
window.BlockSand = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
window.BlockStone = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
window.BlockWater = class extends Block {
|
||||||
|
|
||||||
|
constructor(id, textureSlotId) {
|
||||||
|
super(id, textureSlotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getOpacity() {
|
||||||
|
return 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
isSolid() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldRenderFace(world, x, y, z, face) {
|
||||||
|
let typeId = world.getBlockAt(x + face.x, y + face.y, z + face.z);
|
||||||
|
return typeId === 0 || typeId !== this.id && Block.getById(typeId).isTransparent();
|
||||||
|
}
|
||||||
|
|
||||||
|
getBoundingBox(world, x, y, z) {
|
||||||
|
let box = this.boundingBox.clone();
|
||||||
|
if (world.getBlockAt(x, y + 1, z) !== this.id) {
|
||||||
|
box.maxY = 1.0 - 0.12;
|
||||||
|
}
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -53,6 +53,14 @@ loadScripts([
|
|||||||
"src/js/net/minecraft/util/BoundingBox.js",
|
"src/js/net/minecraft/util/BoundingBox.js",
|
||||||
"src/js/net/minecraft/util/Keyboard.js",
|
"src/js/net/minecraft/util/Keyboard.js",
|
||||||
"src/js/net/minecraft/client/GameWindow.js",
|
"src/js/net/minecraft/client/GameWindow.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/Block.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockStone.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockGrass.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockDirt.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockLog.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockLeave.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockWater.js",
|
||||||
|
"src/js/net/minecraft/client/world/block/BlockSand.js",
|
||||||
"src/js/net/minecraft/client/world/ChunkSection.js",
|
"src/js/net/minecraft/client/world/ChunkSection.js",
|
||||||
"src/js/net/minecraft/client/world/Chunk.js",
|
"src/js/net/minecraft/client/world/Chunk.js",
|
||||||
"src/js/net/minecraft/client/world/World.js",
|
"src/js/net/minecraft/client/world/World.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user