diff --git a/Assets/Scripts/Game/Automap.cs b/Assets/Scripts/Game/Automap.cs index a757a91905..a1f53367f1 100644 --- a/Assets/Scripts/Game/Automap.cs +++ b/Assets/Scripts/Game/Automap.cs @@ -168,6 +168,7 @@ public override string ToString() const float raycastDistanceDown = 3.0f; // 3 meters should be enough (note: flying too high will result in geometry not being revealed by this raycast const float raycastDistanceViewDirection = 30.0f; // don't want to make it too easy to discover big halls - although it shouldn't be to small as well const float raycastDistanceEntranceMarkerReveal = 100.0f; + static readonly Vector3 automapOffset = new Vector3(0, -10000.0f, 0); // positional offset of the automap geometry, so that it does not overlap real geo const float scanRateGeometryDiscoveryInHertz = 5.0f; // n times per second the discovery of new geometry/meshes is checked @@ -389,6 +390,22 @@ public void SetState(Dictionary savedDictAutomapDun dictAutomapDungeonsDiscoveryState = savedDictAutomapDungeonsDiscoveryState; } + /// + /// Conversion of real game world position to automap position + /// + public Vector3 ToAutomapPosition(Vector3 realPosition) + { + return realPosition + automapOffset; + } + + /// + /// Conversion of automap position to real game world position + /// + public Vector3 FromAutomapPosition(Vector3 automapPosition) + { + return automapPosition - automapOffset; + } + /// /// sets the number of dungeons that are memorized /// @@ -406,12 +423,10 @@ public void UpdateAutomapStateOnWindowPush() // since new teleporters could have been discovered by pc since last time map was open this must be checked here CreateTeleporterMarkers(); - SetActivationStateOfMapObjects(true); - - gameobjectPlayerMarkerArrow.transform.position = gameObjectPlayerAdvanced.transform.position; + gameobjectPlayerMarkerArrow.transform.position = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); gameobjectPlayerMarkerArrow.transform.rotation = gameObjectPlayerAdvanced.transform.rotation; - gameobjectBeaconPlayerPosition.transform.position = gameObjectPlayerAdvanced.transform.position + rayPlayerPosOffset; + gameobjectBeaconPlayerPosition.transform.position = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position + rayPlayerPosOffset); // create camera (if not present) that will render automap level geometry CreateAutomapCamera(); @@ -429,12 +444,6 @@ public void UpdateAutomapStateOnWindowPush() /// public void UpdateAutomapStateOnWindowPop() { - // about SetActivationStateOfMapObjects(false): - // this will not be enough if we will eventually allow gui windows to be opened while exploring the world - // then it will be necessary to either only disable the colliders on the automap level geometry or - // make player collision ignore colliders of objects in automap layer - I would clearly prefer this option - SetActivationStateOfMapObjects(false); - if ((GameManager.Instance.PlayerEnterExit.IsPlayerInside) && ((GameManager.Instance.PlayerEnterExit.IsPlayerInsideBuilding) || (GameManager.Instance.PlayerEnterExit.IsPlayerInsideDungeon) || (GameManager.Instance.PlayerEnterExit.IsPlayerInsideDungeonCastle))) { // and get rid of lights used to light the automap level geometry @@ -661,7 +670,7 @@ public bool UpdateMouseHoverOverGameObjects(Vector2 screenPosition) } } - gameobjectTeleporterConnection.transform.position = (connection.teleporterEntrance.position + connection.teleporterExit.position) * 0.5f; + gameobjectTeleporterConnection.transform.position = ToAutomapPosition((connection.teleporterEntrance.position + connection.teleporterExit.position) * 0.5f); gameobjectTeleporterConnection.transform.localScale = new Vector3(0.2f, (connection.teleporterEntrance.position - connection.teleporterExit.position).magnitude * 0.5f, 0.2f); gameobjectTeleporterConnection.transform.rotation = Quaternion.FromToRotation(Vector3.up, (connection.teleporterEntrance.position - connection.teleporterExit.position)); @@ -771,7 +780,7 @@ public void TryToAddOrEditUserNoteMarkerOnDungeonSegmentAtScreenPosition(Vector2 if (!nearestHit.Value.transform.name.StartsWith(NameGameobjectUserNoteMarkerSubStringStart)) { // add a new user note marker - Vector3 spawningPosition = (nearestHit.Value.point) + nearestHit.Value.normal * 0.7f; + Vector3 spawningPosition = FromAutomapPosition(nearestHit.Value.point + nearestHit.Value.normal * 0.7f); // test if there is already a user note marker near to the requested spawning position var enumerator = listUserNoteMarkers.GetEnumerator(); @@ -833,7 +842,7 @@ public void TryCenterAutomapCameraOnDungeonSegmentAtScreenPosition(Vector2 scree if (nearestHit.HasValue) { - float distance = (cameraAutomap.transform.position - gameObjectPlayerAdvanced.transform.position).magnitude; + float distance = (cameraAutomap.transform.position - ToAutomapPosition(gameObjectPlayerAdvanced.transform.position)).magnitude; cameraAutomap.transform.position = (nearestHit.Value.point); cameraAutomap.transform.position -= cameraAutomap.transform.forward * distance; } @@ -866,9 +875,10 @@ public void TryTeleportPlayerToDungeonSegmentAtScreenPosition(Vector2 screenPosi if (nearestHit.HasValue) { - gameObjectPlayerAdvanced.transform.position = nearestHit.Value.point + Vector3.up * 0.1f; - gameobjectBeaconPlayerPosition.transform.position = nearestHit.Value.point + rayPlayerPosOffset; - gameobjectPlayerMarkerArrow.transform.position = nearestHit.Value.point + rayPlayerPosOffset; + Vector3 realHitPoint = FromAutomapPosition(nearestHit.Value.point); + gameObjectPlayerAdvanced.transform.position = realHitPoint + Vector3.up * 0.1f; + gameobjectBeaconPlayerPosition.transform.position = ToAutomapPosition(realHitPoint + rayPlayerPosOffset); + gameobjectPlayerMarkerArrow.transform.position = ToAutomapPosition(realHitPoint + rayPlayerPosOffset); } // don't forget to update micro map texture, so new player position is visualized correctly on micro map @@ -1088,11 +1098,12 @@ void Update() #endif // main raycast (on Colliders in layer "Automap") - bool didHit1 = Physics.Raycast(rayStartPos, rayDirection, out hit1, rayDistance, 1 << layerAutomap); + Vector3 automapRayStartPos = ToAutomapPosition(rayStartPos); + bool didHit1 = Physics.Raycast(automapRayStartPos, rayDirection, out hit1, rayDistance, 1 << layerAutomap); // 2nd (protection) raycast (on Colliders in layer "Automap") with offset (protection against hole in daggerfall geometry prevention) - bool didHit2 = Physics.Raycast(rayStartPos + offsetSecondProtectionRaycast, rayDirection, out hit2, rayDistance, 1 << layerAutomap); + bool didHit2 = Physics.Raycast(automapRayStartPos + offsetSecondProtectionRaycast, rayDirection, out hit2, rayDistance, 1 << layerAutomap); // 3rd (protection) raycast (on Colliders in layer "Automap") with offset (protection against hole in daggerfall geometry prevention) - bool didHit3 = Physics.Raycast(rayStartPos + offsetThirdProtectionRaycast, rayDirection, out hit3, rayDistance, 1 << layerAutomap); + bool didHit3 = Physics.Raycast(automapRayStartPos + offsetThirdProtectionRaycast, rayDirection, out hit3, rayDistance, 1 << layerAutomap); #if DEBUG_RAYCASTS //Debug.Log(String.Format("hitTG1: {0}, hitTG2: {1}, hitTG3: {2}, hit1: {3}, hit2: {4}, hit3: {5}", didHitTrueLevelGeometry1, didHitTrueLevelGeometry2, didHitTrueLevelGeometry3, didHit1, didHit2, didHit3)); @@ -1154,9 +1165,6 @@ void CheckForNewlyDiscoveredMeshes() if ((gameobjectGeometry != null) && ((GameManager.Instance.IsPlayerInsideBuilding) || (GameManager.Instance.IsPlayerInsideDungeon) || (GameManager.Instance.IsPlayerInsideCastle))) { - // enable automap level geometry for revealing (so raycasts can hit colliders of automap level geometry) - gameobjectGeometry.SetActive(true); - // reveal geometry right below player - raycast down from player head position Vector3 rayStartPos = gameObjectPlayerAdvanced.transform.position + Camera.main.transform.localPosition; Vector3 rayDirection = Vector3.down; @@ -1189,9 +1197,6 @@ void CheckForNewlyDiscoveredMeshes() ScanWithRaycastInDirectionAndUpdateMeshesAndMaterials(rayStartPos + stepVector, rayDirection, rayDistance, offsetSecondProtectionRaycast); } } - - // disable gameobjectGeometry so player movement won't be affected by geometry colliders of automap level geometry - gameobjectGeometry.SetActive(false); } // entrance marker discovery check - only do as long as undiscovered @@ -1211,7 +1216,7 @@ void CheckForNewlyDiscoveredMeshes() int layerMask = (1 << layerPlayer) + 1; // test against player and level geometry (+1... == 1 << 1 == "Default" layer == level geometry) - Vector3 entranceMarkerPos = gameObjectEntrancePositionCubeMarker.transform.position; + Vector3 entranceMarkerPos = FromAutomapPosition(gameObjectEntrancePositionCubeMarker.transform.position); Vector3 playerColliderPos = playerCollider.transform.position; //GameManager.Instance.PlayerGPS.transform.position; //Camera.main.transform.position; // raycast 1 Vector3 rayStartPos = entranceMarkerPos; @@ -1281,7 +1286,7 @@ IEnumerator CoroutineCheckForNewlyDiscoveredMeshes() { while (true) { - // only proceed if automap is not opened (otherwise command gameobjectGeometry.SetActive(false); will mess with automap rendering when scheduling is a bitch and overwrites changes from UpdateAutomapStateOnWindowPush() + // only update discovery while automap is closed if (!isOpenAutomap) { CheckForNewlyDiscoveredMeshes(); @@ -1297,7 +1302,7 @@ private void UpdateSlicingPositionY() { float slicingPositionY; if (!DaggerfallUnity.Settings.AutomapAlwaysMaxOutSliceLevel) - slicingPositionY = gameObjectPlayerAdvanced.transform.position.y + Camera.main.transform.localPosition.y + slicingBiasY; + slicingPositionY = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position + Camera.main.transform.localPosition).y + slicingBiasY; else slicingPositionY = float.MaxValue; Shader.SetGlobalFloat("_SclicingPositionY", slicingPositionY); @@ -1315,25 +1320,6 @@ private void UpdateSlicingPositionY() // material.renderQueue = 3000; //} - /// - /// sets active state of map GameObjects like geometry, beacons, user note markers and teleporter markers - /// used on automap open to enable (show) objects and hide them on automap close - /// it is important to set them inactive when closing the map - so that ingame raycasts won't hit colliders of map objects - /// - /// the desired activation state for the map objects to be set - private void SetActivationStateOfMapObjects(bool active) - { - gameobjectGeometry.SetActive(active); - - gameobjectBeacons.SetActive(active); - - if (gameObjectUserNoteMarkers != null) - gameObjectUserNoteMarkers.SetActive(active); - - if (gameobjectTeleporterMarkers != null) - gameobjectTeleporterMarkers.SetActive(active); - } - /// /// setup beacons: lazy creation of player marker arrow and beacons including /// player position beacon, dungeon entrance position beacon and rotation pivot axis position beacon @@ -1357,7 +1343,7 @@ private void SetupBeacons(StaticDoor ?entranceDoor = null) gameobjectPlayerMarkerArrow.layer = layerAutomap; gameobjectPlayerMarkerArrow.AddComponent(); } - gameobjectPlayerMarkerArrow.transform.position = gameObjectPlayerAdvanced.transform.position; + gameobjectPlayerMarkerArrow.transform.position = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); gameobjectPlayerMarkerArrow.transform.rotation = gameObjectPlayerAdvanced.transform.rotation; if (!gameobjectBeaconPlayerPosition) @@ -1373,7 +1359,7 @@ private void SetupBeacons(StaticDoor ?entranceDoor = null) //SetMaterialTransparency(material); gameobjectBeaconPlayerPosition.GetComponent().material = material; } - gameobjectBeaconPlayerPosition.transform.position = gameObjectPlayerAdvanced.transform.position + rayPlayerPosOffset; + gameobjectBeaconPlayerPosition.transform.position = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position + rayPlayerPosOffset); if (!gameobjectBeaconRotationPivotAxis) { @@ -1444,17 +1430,19 @@ private void SetupBeacons(StaticDoor ?entranceDoor = null) { // entrance marker to dungeon start marker DaggerfallDungeon dungeon = GameManager.Instance.DungeonParent.GetComponentInChildren(); - gameobjectBeaconEntrancePosition.transform.position = dungeon.StartMarker.transform.position + rayEntrancePosOffset; + gameobjectBeaconEntrancePosition.transform.position = ToAutomapPosition(dungeon.StartMarker.transform.position + rayEntrancePosOffset); gameobjectBeaconEntrancePosition.SetActive(false); // set do undiscovered } else { // entrance marker to current position (position player entered) StaticDoor door = entranceDoor.Value; - gameobjectBeaconEntrancePosition.transform.position = door.ownerRotation * door.buildingMatrix.MultiplyPoint3x4(door.centre); - gameobjectBeaconEntrancePosition.transform.position += door.ownerPosition; + Vector3 entrancePosition = door.ownerRotation * door.buildingMatrix.MultiplyPoint3x4(door.centre); + entrancePosition += door.ownerPosition; + gameobjectBeaconEntrancePosition.transform.position = ToAutomapPosition(entrancePosition); gameobjectBeaconEntrancePosition.SetActive(true); // set do discovered } + } private void DestroyBeacons() @@ -1576,7 +1564,7 @@ private GameObject CreateUserMarker(int id, Vector3 spawningPosition) } GameObject gameObjectUserNoteMarker = CreateDiamondShapePrimitive(); gameObjectUserNoteMarker.transform.SetParent(gameObjectUserNoteMarkers.transform); - gameObjectUserNoteMarker.transform.position = spawningPosition; + gameObjectUserNoteMarker.transform.position = ToAutomapPosition(spawningPosition); gameObjectUserNoteMarker.name = NameGameobjectUserNoteMarkerSubStringStart + id; Material materialUserNoteMarker = new Material(Shader.Find("Standard")); materialUserNoteMarker.color = new Color(1.0f, 0.55f, 0.0f); @@ -1622,14 +1610,12 @@ private void AddTeleporterMarkerOnMap(TeleporterTransform startPoint, Teleporter gameobjectTeleporterMarkers.layer = layerAutomap; } - gameobjectTeleporterMarkers.SetActive(false); - string teleporterEntranceName = NameGameobjectTeleporterSubStringStart + dictkey + NameGameobjectTeleporterEntranceSubStringEnd; if (gameobjectTeleporterMarkers.transform.Find(teleporterEntranceName) == null) { GameObject gameObjectTeleporterEntrance = new GameObject(teleporterEntranceName); gameObjectTeleporterEntrance.transform.SetParent(gameobjectTeleporterMarkers.transform); - gameObjectTeleporterEntrance.transform.position = startPoint.position; // + Vector3.up * 1.0f; + gameObjectTeleporterEntrance.transform.position = ToAutomapPosition(startPoint.position); // + Vector3.up * 1.0f; gameObjectTeleporterEntrance.transform.rotation = startPoint.rotation; gameObjectTeleporterEntrance.transform.Rotate(0.0f, 90.0f, 0.0f); gameObjectTeleporterEntrance.layer = layerAutomap; @@ -1653,7 +1639,7 @@ private void AddTeleporterMarkerOnMap(TeleporterTransform startPoint, Teleporter { GameObject gameObjectTeleporterExit = new GameObject(teleporterExitName); gameObjectTeleporterExit.transform.SetParent(gameobjectTeleporterMarkers.transform); - gameObjectTeleporterExit.transform.position = endPoint.position; // + Vector3.up * 0.2f; + gameObjectTeleporterExit.transform.position = ToAutomapPosition(endPoint.position); // + Vector3.up * 0.2f; //gameObjectTeleporterExit.transform.rotation = endPoint.rotation; //gameObjectTeleporterExit.transform.Rotate(0.0f, 180.0f, 0.0f); gameObjectTeleporterExit.transform.rotation = startPoint.rotation; // take rotation from portal entrance @@ -1847,7 +1833,7 @@ private void GetRayCastNearestHitOnAutomapLayer(Vector2 screenPosition, out Rayc float nearestDistance = float.MaxValue; foreach (RaycastHit hit in hits) { - if ((hit.distance < nearestDistance) && (hit.collider.gameObject.GetComponent().enabled)) + if ((hit.distance < nearestDistance) && hit.collider.gameObject.TryGetComponent(out MeshRenderer meshRend) && meshRend.enabled) { nearestHit = hit; nearestDistance = hit.distance; @@ -1891,7 +1877,7 @@ private void CreateIndoorGeometryForAutomap(StaticDoor door) gameobjectInterior.transform.SetParent(gameobjectGeometry.transform); // copy position and rotation from real level geometry - gameobjectGeometry.transform.position = elem.transform.position; + gameobjectGeometry.transform.position = ToAutomapPosition(elem.transform.position); gameobjectGeometry.transform.rotation = elem.transform.rotation; // do this (here in createIndoorGeometryForAutomap()) analog in the same way and the same place like in createDungeonGeometryForAutomap() @@ -1955,7 +1941,7 @@ private void CreateDungeonGeometryForAutomap() gameobjectDungeon.transform.SetParent(gameobjectGeometry.transform); // copy position and rotation from real level geometry - gameobjectGeometry.transform.position = elem.transform.position; + gameobjectGeometry.transform.position = ToAutomapPosition(elem.transform.position); gameobjectGeometry.transform.rotation = elem.transform.rotation; // do this here when DaggerfallDungeon GameObject is present, so that a call to SetupBeacons() will not fail (it needs the DaggerfallDungeon component of this GameObject) @@ -1985,7 +1971,7 @@ private void AddWater(GameObject parent, short nativeBlockWaterLevel) if (nativeBlockWaterLevel == 10000) return; - float waterLevel = nativeBlockWaterLevel * -1 * MeshReader.GlobalScale; + float waterLevel = ToAutomapPosition(new Vector3(0, nativeBlockWaterLevel * -1 * MeshReader.GlobalScale, 0)).y; MeshRenderer[] renderers = parent.GetComponentsInChildren(); if (renderers != null) @@ -2484,16 +2470,12 @@ void InitWhenInInteriorOrDungeon(StaticDoor? door = null, bool initFromLoadingSa CreateIndoorGeometryForAutomap(door.Value); RestoreStateAutomapDungeon(true); resetAutomapSettingsFromExternalScript = true; // set flag so external script (DaggerfallAutomapWindow) can pull flag and reset automap values on next window push - - SetActivationStateOfMapObjects(false); } else if ((GameManager.Instance.IsPlayerInsideDungeon) || (GameManager.Instance.IsPlayerInsideCastle)) { CreateDungeonGeometryForAutomap(); RestoreStateAutomapDungeon(!initFromLoadingSave); // if a save game was loaded, do not reset the revisited state (don't set parameter forceNotVisitedInThisRun to true) resetAutomapSettingsFromExternalScript = true; // set flag so external script (DaggerfallAutomapWindow) can pull flag and reset automap values on next window push - - SetActivationStateOfMapObjects(false); } else { @@ -2525,12 +2507,22 @@ private void OnTransitionToExterior(PlayerEnterExit.TransitionEventArgs args) { SaveStateAutomapInterior(); DestroyBeacons(); + if (gameobjectGeometry != null) + { + UnityEngine.Object.Destroy(gameobjectGeometry); + gameobjectGeometry = null; + } } private void OnTransitionToDungeonExterior(PlayerEnterExit.TransitionEventArgs args) { SaveStateAutomapDungeon(true); DestroyBeacons(); + if (gameobjectGeometry != null) + { + UnityEngine.Object.Destroy(gameobjectGeometry); + gameobjectGeometry = null; + } } void OnLoadEvent(SaveData_v1 saveData) @@ -2585,7 +2577,7 @@ private void RaiseOnInjectMeshAndMaterialPropertiesEvent(bool resetDiscoveryStat if (GameManager.Instance.IsPlayerInsideBuilding) playerIsInsideBuilding = true; - Vector3 playerAdvancedPos = gameObjectPlayerAdvanced.transform.position; + Vector3 playerAdvancedPos = ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); Material automapMaterial = new Material(Shader.Find("Daggerfall/Automap")); automapMaterial.SetColor("_WaterColor", GameManager.Instance.PlayerEnterExit.UnderwaterFog.waterMapColor); @@ -2731,4 +2723,4 @@ public static int AddNext(this SortedList sortedList, T item) } #endregion -} \ No newline at end of file +} diff --git a/Assets/Scripts/Game/UserInterfaceWindows/DaggerfallAutomapWindow.cs b/Assets/Scripts/Game/UserInterfaceWindows/DaggerfallAutomapWindow.cs index 96ce3fb761..bd19a74279 100644 --- a/Assets/Scripts/Game/UserInterfaceWindows/DaggerfallAutomapWindow.cs +++ b/Assets/Scripts/Game/UserInterfaceWindows/DaggerfallAutomapWindow.cs @@ -880,10 +880,10 @@ public override void Update() { case AutomapViewMode.View2D: default: - dragSpeedCompensated = dragSpeedInTopView * Vector3.Magnitude(Camera.main.transform.position - cameraAutomap.transform.position); + dragSpeedCompensated = dragSpeedInTopView * Vector3.Magnitude(automap.ToAutomapPosition(Camera.main.transform.position) - cameraAutomap.transform.position); break; case AutomapViewMode.View3D: - dragSpeedCompensated = dragSpeedInView3D * Vector3.Magnitude(Camera.main.transform.position - cameraAutomap.transform.position); + dragSpeedCompensated = dragSpeedInView3D * Vector3.Magnitude(automap.ToAutomapPosition(Camera.main.transform.position) - cameraAutomap.transform.position); break; } @@ -1159,8 +1159,9 @@ private void ResetCameraPosition() /// private void ResetCameraTransformViewFromTop() { - cameraAutomap.transform.position = Camera.main.transform.position + Vector3.up * cameraHeightViewFromTop; - cameraAutomap.transform.LookAt(Camera.main.transform.position); + Vector3 automapPlayerPosition = automap.ToAutomapPosition(Camera.main.transform.position); + cameraAutomap.transform.position = automapPlayerPosition + Vector3.up * cameraHeightViewFromTop; + cameraAutomap.transform.LookAt(automapPlayerPosition); SaveCameraTransformViewFromTop(); } @@ -1170,8 +1171,9 @@ private void ResetCameraTransformViewFromTop() private void ResetCameraTransformView3D() { Vector3 viewDirectionInXZ = Vector3.forward; - cameraAutomap.transform.position = Camera.main.transform.position - viewDirectionInXZ * cameraBackwardDistance + Vector3.up * cameraHeightView3D; - cameraAutomap.transform.LookAt(Camera.main.transform.position); + Vector3 automapPlayerPosition = automap.ToAutomapPosition(Camera.main.transform.position); + cameraAutomap.transform.position = automapPlayerPosition - viewDirectionInXZ * cameraBackwardDistance + Vector3.up * cameraHeightView3D; + cameraAutomap.transform.LookAt(automapPlayerPosition); SaveCameraTransformView3D(); } @@ -1216,7 +1218,7 @@ private void RestoreOldCameraTransformView3D() /// private void ResetRotationPivotAxisPositionViewFromTop() { - rotationPivotAxisPositionViewFromTop = gameObjectPlayerAdvanced.transform.position; + rotationPivotAxisPositionViewFromTop = automap.ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); automap.RotationPivotAxisPosition = rotationPivotAxisPositionViewFromTop; } @@ -1225,7 +1227,7 @@ private void ResetRotationPivotAxisPositionViewFromTop() /// private void ResetRotationPivotAxisPositionView3D() { - rotationPivotAxisPositionView3D = gameObjectPlayerAdvanced.transform.position; + rotationPivotAxisPositionView3D = automap.ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); automap.RotationPivotAxisPosition = rotationPivotAxisPositionView3D; } @@ -1275,7 +1277,7 @@ private Vector3 GetRotationPivotAxisPosition() rotationPivotAxisPosition = rotationPivotAxisPositionView3D; break; default: - rotationPivotAxisPosition = gameObjectPlayerAdvanced.transform.position; + rotationPivotAxisPosition = automap.ToAutomapPosition(gameObjectPlayerAdvanced.transform.position); break; } return (rotationPivotAxisPosition); @@ -1615,7 +1617,7 @@ private void ActionMoveSliceLevel(float bias) /// private void ActionZoomIn(float zoomSpeed) { - float zoomSpeedCompensated = zoomSpeed * Vector3.Magnitude(Camera.main.transform.position - cameraAutomap.transform.position); + float zoomSpeedCompensated = zoomSpeed * Vector3.Magnitude(automap.ToAutomapPosition(Camera.main.transform.position) - cameraAutomap.transform.position); Vector3 translation = cameraAutomap.transform.forward * zoomSpeedCompensated; cameraAutomap.transform.position += translation; UpdateAutomapView(); @@ -1626,7 +1628,7 @@ private void ActionZoomIn(float zoomSpeed) /// private void ActionZoomOut(float zoomSpeed) { - float zoomSpeedCompensated = zoomSpeed * Vector3.Magnitude(Camera.main.transform.position - cameraAutomap.transform.position); + float zoomSpeedCompensated = zoomSpeed * Vector3.Magnitude(automap.ToAutomapPosition(Camera.main.transform.position) - cameraAutomap.transform.position); Vector3 translation = -cameraAutomap.transform.forward * zoomSpeedCompensated; cameraAutomap.transform.position += translation; UpdateAutomapView(); @@ -1829,19 +1831,20 @@ private void ActionSwitchFocusToNextBeaconObject() /// the GameObject to focus at private void SwitchFocusToGameObject(GameObject gameobjectInFocus) { + Vector3 focusPosition = (gameobjectInFocus == gameObjectPlayerAdvanced) ? automap.ToAutomapPosition(gameobjectInFocus.transform.position) : gameobjectInFocus.transform.position; Vector3 newPosition; switch (automapViewMode) { case AutomapViewMode.View2D: newPosition = cameraAutomap.transform.position; - newPosition.x = gameobjectInFocus.transform.position.x; - newPosition.z = gameobjectInFocus.transform.position.z; + newPosition.x = focusPosition.x; + newPosition.z = focusPosition.z; cameraAutomap.transform.position = newPosition; UpdateAutomapView(); break; case AutomapViewMode.View3D: - float computedCameraBackwardDistance = Vector3.Magnitude(cameraAutomap.transform.position - gameobjectInFocus.transform.position); - newPosition = gameobjectInFocus.transform.position - cameraAutomap.transform.forward * computedCameraBackwardDistance; + float computedCameraBackwardDistance = Vector3.Magnitude(cameraAutomap.transform.position - focusPosition); + newPosition = focusPosition - cameraAutomap.transform.forward * computedCameraBackwardDistance; cameraAutomap.transform.position = newPosition; UpdateAutomapView(); break; diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset index 072072799c..5a17e6497b 100644 --- a/ProjectSettings/DynamicsManager.asset +++ b/ProjectSettings/DynamicsManager.asset @@ -17,7 +17,7 @@ PhysicsManager: m_ClothInterCollisionDistance: 0 m_ClothInterCollisionStiffness: 0 m_ContactsGeneration: 1 - m_LayerCollisionMatrix: fffffefffffffeffffbffefffffffffffffffefffffffefffffffffffffffffffffffefffffffefffffffefffffffefffffffefffffffefffbbffefffffffeffc800fe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffefffffffefffffffeff + m_LayerCollisionMatrix: fffbfefffffbfeffffbbfefffffffffffffbfefffffbfefffffffffffffffffffffbfefffffbfeffc804fe0ffffbfefffffbfefffffbfefffbbbfefffffbfeffc800fe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfefffffbfefffffbfefffffbfeff m_AutoSimulation: 1 m_AutoSyncTransforms: 1 m_ReuseCollisionCallbacks: 0