UNPKG

replay-viewer

Version:

Rocket League replay viewer React component and tooling

76 lines 3.48 kB
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