implement toggle perspective

(cherry picked from commit cbfb575b2e418215877cecb89e3b4c47d6f56c8d)
This commit is contained in:
LabyStudio
2022-04-13 14:44:46 +02:00
parent 4644b050c6
commit 8db692083b
9 changed files with 99 additions and 37 deletions
@@ -3,6 +3,8 @@ window.GameSettings = class {
constructor() { constructor() {
this.crouching = 'ShiftLeft'; this.crouching = 'ShiftLeft';
this.sprinting = 'ControlLeft'; this.sprinting = 'ControlLeft';
this.togglePerspective = 'F5';
this.thirdPersonView = 0;
} }
load() { load() {
+4
View File
@@ -195,6 +195,10 @@ window.Minecraft = class {
this.inventory.selectedSlotIndex = i - 1; this.inventory.selectedSlotIndex = i - 1;
} }
} }
if (button === this.settings.togglePerspective) {
this.settings.thirdPersonView = (this.settings.thirdPersonView + 1) % 3;
}
} }
onMouseClicked(button) { onMouseClicked(button) {
@@ -22,6 +22,11 @@ window.GuiControls = class extends GuiScreen {
scope.init(); scope.init();
})); }));
this.buttonList.push(new GuiKeyButton("Toggle Perspective", settings.togglePerspective, this.width / 2 - 100, this.height / 2 + 30, 200, 20, function (key) {
settings.togglePerspective = key;
scope.init();
}));
this.buttonList.push(new GuiButton("Done", this.width / 2 - 100, this.height / 2 + 70, 200, 20, function () { this.buttonList.push(new GuiButton("Done", this.width / 2 - 100, this.height / 2 + 70, 200, 20, function () {
scope.minecraft.displayScreen(scope.previousScreen); scope.minecraft.displayScreen(scope.previousScreen);
})); }));
@@ -1,6 +1,7 @@
window.WorldRenderer = class { window.WorldRenderer = class {
static RENDER_DISTANCE = 4; static RENDER_DISTANCE = 4;
static THIRD_PERSON_DISTANCE = 4;
constructor(minecraft, window) { constructor(minecraft, window) {
this.minecraft = minecraft; this.minecraft = minecraft;
@@ -90,7 +91,10 @@ window.WorldRenderer = class {
// Render entities // Render entities
for (let entity of this.minecraft.world.entities) { for (let entity of this.minecraft.world.entities) {
this.renderEntity(entity); if (entity === player && this.minecraft.settings.thirdPersonView === 0) {
continue;
}
this.renderEntity(entity, partialTicks);
} }
// Render actual scene // Render actual scene
@@ -100,14 +104,37 @@ window.WorldRenderer = class {
orientCamera(partialTicks) { orientCamera(partialTicks) {
let player = this.minecraft.player; let player = this.minecraft.player;
// Rotation let rotationY = -MathHelper.toRadians(player.yaw + 180);
this.camera.rotation.y = -MathHelper.toRadians(player.yaw + 180); let rotationX = -MathHelper.toRadians(player.pitch);
this.camera.rotation.x = -MathHelper.toRadians(player.pitch);
// Position // Position
let x = player.prevX + (player.x - player.prevX) * partialTicks; let x = player.prevX + (player.x - player.prevX) * partialTicks;
let y = player.prevY + (player.y - player.prevY) * partialTicks; let y = player.prevY + (player.y - player.prevY) * partialTicks;
let z = player.prevZ + (player.z - player.prevZ) * partialTicks; let z = player.prevZ + (player.z - player.prevZ) * partialTicks;
// Add camera offset
let mode = this.minecraft.settings.thirdPersonView;
if (mode !== 0) {
// Flip for front view
if (mode === 2) {
rotationY += Math.PI;
}
// Shift camera
let cameraOffsetX = Math.sin(rotationY) * Math.cos(rotationX);
let cameraOffsetY = Math.sin(-rotationX);
let cameraOffsetZ = Math.cos(rotationY) * Math.cos(rotationX);
x += cameraOffsetX * WorldRenderer.THIRD_PERSON_DISTANCE;
y += cameraOffsetY * WorldRenderer.THIRD_PERSON_DISTANCE;
z += cameraOffsetZ * WorldRenderer.THIRD_PERSON_DISTANCE;
}
// Update rotation
this.camera.rotation.y = rotationY;
this.camera.rotation.x = rotationX;
// Update camera positionWC
this.camera.position.set(x, y + player.getEyeHeight(), z); this.camera.position.set(x, y + player.getEyeHeight(), z);
// Update frustum // Update frustum
@@ -296,8 +323,8 @@ window.WorldRenderer = class {
} }
} }
renderEntity(entity) { renderEntity(entity, partialTicks) {
let entityRenderer = this.entityRenderManager.getEntityRendererByEntity(entity); let entityRenderer = this.entityRenderManager.getEntityRendererByEntity(entity);
entityRenderer.render(entity); entityRenderer.render(entity, partialTicks);
} }
} }
@@ -5,11 +5,27 @@ window.EntityRenderer = class {
} }
rebuild(tessellator, entity) { rebuild(tessellator, entity) {
this.model.rebuild(tessellator, entity); this.model.rebuild(tessellator, entity.group);
} }
render(entity) { render(entity, partialTicks) {
this.model.render(0); let group = entity.group;
// Interpolate entity position
let interpolatedX = entity.prevX + (entity.x - entity.prevX) * partialTicks;
let interpolatedY = entity.prevY + (entity.y - entity.prevY) * partialTicks;
let interpolatedZ = entity.prevZ + (entity.z - entity.prevZ) * partialTicks;
// Translate using interpolated position
group.position.setX(interpolatedX);
group.position.setY(interpolatedY);
group.position.setZ(interpolatedZ);
// Actual size of the entity
let scale = 7.0 / 120.0;
group.scale.set(scale, scale, scale);
this.model.render(group, 0);
} }
} }
@@ -14,8 +14,8 @@ window.PlayerRenderer = class extends EntityRenderer {
super.rebuild(tessellator, entity); super.rebuild(tessellator, entity);
} }
render(entity) { render(entity, partialTicks) {
super.render(entity); super.render(entity, partialTicks);
} }
@@ -4,17 +4,19 @@ window.ModelBase = class {
* Rebuild the model * Rebuild the model
* *
* @param tessellator Tessellator to render vertices * @param tessellator Tessellator to render vertices
* @param group Group to attach the built model
*/ */
rebuild(tessellator, entity) { rebuild(tessellator, group) {
} }
/** /**
* Render the model * Render the model
* *
* @param group Group to render
* @param time Animation offset * @param time Animation offset
*/ */
render(time) { render(group, time) {
} }
@@ -35,21 +35,24 @@ window.ModelPlayer = class extends ModelBase {
this.leftLeg.setPosition(2.0, 12.0, 0.0); this.leftLeg.setPosition(2.0, 12.0, 0.0);
} }
rebuild(tessellator, entity) { rebuild(tessellator, group) {
this.head.rebuild(tessellator, entity); super.rebuild(tessellator, group);
this.body.rebuild(tessellator, entity);
this.leftArm.rebuild(tessellator, entity); this.head.rebuild(tessellator, group);
this.rightArm.rebuild(tessellator, entity); this.body.rebuild(tessellator, group);
this.leftLeg.rebuild(tessellator, entity); this.leftArm.rebuild(tessellator, group);
this.rightLeg.rebuild(tessellator, entity); this.rightArm.rebuild(tessellator, group);
this.leftLeg.rebuild(tessellator, group);
this.rightLeg.rebuild(tessellator, group);
} }
/** /**
* Render the model * Render the model
* *
* @param group Group to update position and rotation of
* @param time Animation offset * @param time Animation offset
*/ */
render(entity, time) { render(group, time) {
// Set rotation of cubes // Set rotation of cubes
this.head.yRotation = Math.sin(time * 0.83); this.head.yRotation = Math.sin(time * 0.83);
this.head.xRotation = Math.sin(time) * 0.8; this.head.xRotation = Math.sin(time) * 0.8;
@@ -61,12 +64,12 @@ window.ModelPlayer = class extends ModelBase {
this.leftLeg.xRotation = Math.sin(time * 0.6662 + Math.PI) * 1.4; this.leftLeg.xRotation = Math.sin(time * 0.6662 + Math.PI) * 1.4;
// Render cubes // Render cubes
this.head.render(entity); this.head.render(group);
this.body.render(entity); this.body.render(group);
this.rightArm.render(entity); this.rightArm.render(group);
this.leftArm.render(entity); this.leftArm.render(group);
this.rightLeg.render(entity); this.rightLeg.render(group);
this.leftLeg.render(entity); this.leftLeg.render(group);
} }
} }
@@ -17,6 +17,8 @@ window.ModelRenderer = class {
this.x = 0; this.x = 0;
this.y = 0; this.y = 0;
this.z = 0; this.z = 0;
this.bone = new THREE.Object3D();
} }
/** /**
@@ -128,7 +130,7 @@ window.ModelRenderer = class {
this.z = z; this.z = z;
} }
rebuild(tessellator, entity) { rebuild(tessellator, group) {
// Start drawing // Start drawing
tessellator.startDrawing(); tessellator.startDrawing();
@@ -139,18 +141,19 @@ window.ModelRenderer = class {
} }
// Finish drawing // Finish drawing
tessellator.draw(entity.group); tessellator.draw(this.bone);
group.add(this.bone);
} }
render(entity) { render(group) {
entity.group.position.setX(this.x); this.bone.position.setX(this.x);
entity.group.position.setY(this.y); this.bone.position.setY(this.y);
entity.group.position.setZ(this.z); this.bone.position.setZ(this.z);
entity.group.rotation.order = 'ZYX'; this.bone.rotation.order = 'ZYX';
entity.group.rotation.x = this.xRotation; this.bone.rotation.x = this.xRotation;
entity.group.rotation.y = this.yRotation; this.bone.rotation.y = this.yRotation;
entity.group.rotation.z = this.zRotation; this.bone.rotation.z = this.zRotation;
} }
} }