implement block in hand
(cherry picked from commit 75fd4edd9f67b2cbf5abffc1ea417920106b1353)
This commit is contained in:
@@ -165,19 +165,21 @@ window.BlockRenderer = class {
|
||||
let distortZ = 0;
|
||||
|
||||
// Attach torch at wall
|
||||
switch (world.getBlockDataAt(x, y, z)) {
|
||||
case 1:
|
||||
distortX = -0.2;
|
||||
break;
|
||||
case 2:
|
||||
distortX = 0.2;
|
||||
break;
|
||||
case 3:
|
||||
distortZ = -0.2;
|
||||
break;
|
||||
case 4:
|
||||
distortZ = 0.2;
|
||||
break;
|
||||
if (world != null) {
|
||||
switch (world.getBlockDataAt(x, y, z)) {
|
||||
case 1:
|
||||
distortX = -0.2;
|
||||
break;
|
||||
case 2:
|
||||
distortX = 0.2;
|
||||
break;
|
||||
case 3:
|
||||
distortZ = -0.2;
|
||||
break;
|
||||
case 4:
|
||||
distortZ = 0.2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Model type
|
||||
@@ -252,6 +254,33 @@ window.BlockRenderer = class {
|
||||
}
|
||||
}
|
||||
|
||||
renderBlockInHand(group, block, brightness) {
|
||||
this.tessellator.startDrawing();
|
||||
|
||||
// Change brightness
|
||||
this.tessellator.transformBrightness(brightness);
|
||||
|
||||
// Render block
|
||||
this.renderBlock(null, block, 0, 0, 0);
|
||||
|
||||
// Create mesh
|
||||
let mesh = this.tessellator.draw(group);
|
||||
mesh.geometry.center();
|
||||
|
||||
// Relative position
|
||||
mesh.position.x = 0;
|
||||
mesh.position.y = 9;
|
||||
mesh.position.z = -5;
|
||||
|
||||
// Rotation
|
||||
mesh.rotation.y = Math.PI / 4;
|
||||
|
||||
// Scale
|
||||
mesh.scale.x = 6;
|
||||
mesh.scale.y = -6;
|
||||
mesh.scale.z = 6;
|
||||
}
|
||||
|
||||
renderGuiBlock(group, block, x, y, size, brightness) {
|
||||
this.tessellator.startDrawing();
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ window.WorldRenderer = class {
|
||||
this.blockRenderer = new BlockRenderer(this);
|
||||
|
||||
// Entity render manager
|
||||
this.entityRenderManager = new EntityRenderManager();
|
||||
this.entityRenderManager = new EntityRenderManager(this);
|
||||
|
||||
this.initialize();
|
||||
}
|
||||
@@ -92,8 +92,8 @@ window.WorldRenderer = class {
|
||||
// Render entities
|
||||
for (let entity of this.minecraft.world.entities) {
|
||||
if (entity === player && this.minecraft.settings.thirdPersonView === 0) {
|
||||
entity.group.clear();
|
||||
entity.lastRenderedBrightness = -1; // TODO: Find a better way to trigger this
|
||||
entity.group.clear(); // Remove entity from scene
|
||||
delete entity.group.buildMeta; // To trigger a rebuild on the next render
|
||||
continue;
|
||||
}
|
||||
this.renderEntity(entity, partialTicks);
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
window.EntityRenderManager = class {
|
||||
|
||||
constructor() {
|
||||
constructor(worldRenderer) {
|
||||
this.worldRenderer = worldRenderer;
|
||||
|
||||
this.renderers = [];
|
||||
this.push(PlayerEntity, new PlayerRenderer());
|
||||
this.push(PlayerEntity, new PlayerRenderer(worldRenderer));
|
||||
}
|
||||
|
||||
push(entityType, entityRenderer) {
|
||||
|
||||
@@ -6,19 +6,41 @@ window.EntityRenderer = class {
|
||||
}
|
||||
|
||||
rebuild(entity) {
|
||||
let brightness = entity.getEntityBrightness();
|
||||
entity.lastRenderedBrightness = brightness;
|
||||
// Create meta for group
|
||||
let group = entity.group;
|
||||
let meta = {};
|
||||
this.fillMeta(entity, meta);
|
||||
group.buildMeta = meta;
|
||||
|
||||
// Apply brightness
|
||||
// Clear meshes
|
||||
group.clear();
|
||||
|
||||
// Apply brightness and rebuild
|
||||
let brightness = group.buildMeta.brightness;
|
||||
this.tessellator.setColor(brightness, brightness, brightness);
|
||||
this.model.rebuild(this.tessellator, group);
|
||||
}
|
||||
|
||||
// Rebuild
|
||||
this.model.rebuild(this.tessellator, entity.group);
|
||||
fillMeta(entity, meta) {
|
||||
meta.brightness = entity.getEntityBrightness();
|
||||
meta.itemInHand = entity.inventory.getItemInSelectedSlot();
|
||||
}
|
||||
|
||||
isRebuildRequired(entity) {
|
||||
let group = entity.group;
|
||||
if (typeof group.buildMeta === "undefined") {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Compare meta of group
|
||||
let currentMeta = {};
|
||||
this.fillMeta(entity, currentMeta);
|
||||
let previousMeta = group.buildMeta;
|
||||
return JSON.stringify(currentMeta) !== JSON.stringify(previousMeta);
|
||||
}
|
||||
|
||||
render(entity, partialTicks) {
|
||||
let brightness = entity.getEntityBrightness();
|
||||
if (entity.lastRenderedBrightness !== brightness) {
|
||||
if (this.isRebuildRequired(entity)) {
|
||||
this.rebuild(entity);
|
||||
}
|
||||
|
||||
@@ -45,7 +67,7 @@ window.EntityRenderer = class {
|
||||
|
||||
// Actual size of the entity
|
||||
let scale = 7.0 / 120.0;
|
||||
group.scale.set(-scale,- scale, scale);
|
||||
group.scale.set(-scale, -scale, scale);
|
||||
|
||||
// Rotate entity model
|
||||
group.rotation.y = MathHelper.toRadians(-rotationBody + 180);
|
||||
|
||||
@@ -1,21 +1,36 @@
|
||||
window.PlayerRenderer = class extends EntityRenderer {
|
||||
|
||||
constructor() {
|
||||
constructor(worldRenderer) {
|
||||
super(new ModelPlayer());
|
||||
|
||||
this.worldRenderer = worldRenderer;
|
||||
|
||||
// Load character texture
|
||||
this.textureCharacter = new THREE.TextureLoader().load('src/resources/char.png');
|
||||
this.textureCharacter.magFilter = THREE.NearestFilter;
|
||||
this.textureCharacter.minFilter = THREE.NearestFilter;
|
||||
}
|
||||
|
||||
rebuild(tessellator, entity) {
|
||||
rebuild(entity) {
|
||||
this.tessellator.bindTexture(this.textureCharacter);
|
||||
super.rebuild(tessellator, entity);
|
||||
super.rebuild(entity);
|
||||
|
||||
// Render item in hand
|
||||
let group = this.model.rightArm.bone;
|
||||
let id = entity.inventory.getItemInSelectedSlot();
|
||||
if (id !== 0) {
|
||||
let block = Block.getById(id);
|
||||
this.worldRenderer.blockRenderer.renderBlockInHand(group, block, 1);
|
||||
}
|
||||
}
|
||||
|
||||
render(entity, partialTicks) {
|
||||
super.render(entity, partialTicks);
|
||||
}
|
||||
|
||||
fillMeta(entity, meta) {
|
||||
super.fillMeta(entity, meta);
|
||||
meta.itemInHand = entity.inventory.getItemInSelectedSlot();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -58,8 +58,11 @@ window.ModelPlayer = class extends ModelBase {
|
||||
render(entity, limbSwingAmount, limbSwing, timeAlive, yaw, pitch, partialTicks) {
|
||||
let group = entity.group;
|
||||
|
||||
// Head rotation
|
||||
this.head.rotateAngleY = MathHelper.toRadians(yaw);
|
||||
this.head.rotateAngleX = MathHelper.toRadians(pitch);
|
||||
|
||||
// Limb swing leg animation
|
||||
this.rightArm.rotateAngleX = Math.cos(limbSwingAmount * 0.6662 + Math.PI) * 2.0 * limbSwing * 0.5;
|
||||
this.leftArm.rotateAngleX = Math.cos(limbSwingAmount * 0.6662) * 2.0 * limbSwing * 0.5;
|
||||
this.rightArm.rotateAngleZ = 0.0;
|
||||
@@ -69,10 +72,16 @@ window.ModelPlayer = class extends ModelBase {
|
||||
this.rightLeg.rotateAngleY = 0.0;
|
||||
this.leftLeg.rotateAngleY = 0.0;
|
||||
|
||||
// Reset arms for swing progress
|
||||
this.rightArm.rotateAngleY = 0.0;
|
||||
this.rightArm.rotateAngleZ = 0.0;
|
||||
this.leftArm.rotateAngleY = 0.0;
|
||||
|
||||
// Held item animation
|
||||
if (entity.inventory.getItemInSelectedSlot() !== 0) {
|
||||
this.rightArm.rotateAngleX = this.rightArm.rotateAngleX * 0.5 - (Math.PI / 10);
|
||||
}
|
||||
|
||||
// Swing progress
|
||||
let swingProgress = entity.swingProgress - entity.prevSwingProgress;
|
||||
if (swingProgress < 0.0) {
|
||||
@@ -106,6 +115,7 @@ window.ModelPlayer = class extends ModelBase {
|
||||
this.rightArm.rotateAngleZ += Math.sin(interpolatedSwingProgress * Math.PI) * -0.4;
|
||||
}
|
||||
|
||||
// Sneaking animation
|
||||
if (entity.sneaking) {
|
||||
this.body.rotateAngleX = 0.5;
|
||||
this.rightArm.rotateAngleX += 0.4;
|
||||
@@ -126,6 +136,7 @@ window.ModelPlayer = class extends ModelBase {
|
||||
this.head.rotationPointY = 0.0;
|
||||
}
|
||||
|
||||
// Limb swing arm animation
|
||||
this.rightArm.rotateAngleZ += Math.cos(timeAlive * 0.09) * 0.05 + 0.05;
|
||||
this.leftArm.rotateAngleZ -= Math.cos(timeAlive * 0.09) * 0.05 + 0.05;
|
||||
this.rightArm.rotateAngleX += Math.sin(timeAlive * 0.067) * 0.05;
|
||||
|
||||
@@ -136,6 +136,8 @@ window.ModelRenderer = class {
|
||||
}
|
||||
|
||||
rebuild(tessellator, group) {
|
||||
this.bone.clear();
|
||||
|
||||
// Start drawing
|
||||
tessellator.startDrawing();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user