replay-viewer
Version:
Rocket League replay viewer React component and tooling
76 lines • 3.48 kB
JavaScript
import { OrthographicCamera, PerspectiveCamera, Vector3, } from "three";
import { SPRITE } from "../../constants/gameObjectNames";
import { addCameraChangeListener, } from "../../eventbus/events/cameraChange";
import { addCameraFrameUpdateListener, } from "../../eventbus/events/cameraFrameUpdate";
import { SPRITE_ORTHO_SCALE } from "../../builders/player/generateSprite";
var CAMERA_ABOVE_PLAYER = 200;
var PlayerManager = /** @class */ (function () {
function PlayerManager(playerName, isOrangeTeam, carGroup) {
var _this = this;
this.onCameraChange = function (_a) {
var camera = _a.camera;
var isActiveCamera = camera === _this.camera;
_this.toggleSprite(!isActiveCamera);
_this.activeCamera = isActiveCamera;
_this.updateSprite(camera);
};
this.onCameraFrameUpdate = function (_a) {
var ballPosition = _a.ballPosition, activeCamera = _a.activeCamera;
// Ignore frame updates if we aren't the active camera
if (!_this.activeCamera) {
_this.updateSprite(activeCamera);
return;
}
// Compute the position where the camera should sit on opposite side of player from ball
var vectorToBall = new Vector3();
var scaleFromPlayer = 300;
vectorToBall.subVectors(_this.carGroup.position, ballPosition);
vectorToBall.setLength(scaleFromPlayer);
vectorToBall.y += CAMERA_ABOVE_PLAYER;
// Correct for camera going beneath the map
if (vectorToBall.y < 0) {
var lowYFactor = 15;
vectorToBall.setLength(lowYFactor / -vectorToBall.y + (scaleFromPlayer - lowYFactor));
vectorToBall.y = 0;
}
var camera = _this.camera;
// TODO: Tween FOV
// if (isUsingBoost && camera.fov === 80) {
// camera.fov = 85
// camera.updateProjectionMatrix()
// } else if (camera.fov === 85) {
// camera.fov = 80
// camera.updateProjectionMatrix()
// }
camera.position.copy(vectorToBall);
};
this.playerName = playerName;
this.carGroup = carGroup;
this.isOrangeTeam = isOrangeTeam;
this.sprite = this.carGroup.children.find(function (child) { return child.name === SPRITE; });
this.camera = new PerspectiveCamera(80, 2, 0.1, 20000);
this.activeCamera = false;
this.carGroup.add(this.camera);
addCameraChangeListener(this.onCameraChange);
addCameraFrameUpdateListener(this.onCameraFrameUpdate);
}
PlayerManager.prototype.updateSprite = function (activeCamera) {
if (!this.activeCamera) {
if (activeCamera instanceof OrthographicCamera) {
this.sprite.scale.setScalar(SPRITE_ORTHO_SCALE);
}
else {
var spritePos = this.sprite.localToWorld(new Vector3());
var camPos = activeCamera.localToWorld(new Vector3());
var scale = spritePos.distanceTo(camPos) / 3;
this.sprite.scale.setScalar(scale);
}
}
};
PlayerManager.prototype.toggleSprite = function (display) {
this.sprite.visible = display;
};
return PlayerManager;
}());
export default PlayerManager;
//# sourceMappingURL=PlayerManager.js.map