From 671f0910bf7630708aabef48264892d96e9ff145 Mon Sep 17 00:00:00 2001 From: FreezeDriedMangoes Date: Thu, 12 May 2022 17:45:05 -0400 Subject: [PATCH] feat: placed props now initially rotate to face player --- NewHorizons/Utility/DebugPropPlacer.cs | 44 ++++++++++++++++++++++---- NewHorizons/Utility/DebugRaycaster.cs | 2 +- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/NewHorizons/Utility/DebugPropPlacer.cs b/NewHorizons/Utility/DebugPropPlacer.cs index 97141b3a..9fdb6e52 100644 --- a/NewHorizons/Utility/DebugPropPlacer.cs +++ b/NewHorizons/Utility/DebugPropPlacer.cs @@ -13,8 +13,6 @@ namespace NewHorizons.Utility { private struct PropPlacementData { - public Vector3 initial_pos; - public Vector3 initial_rotation; public string body; public string propPath; @@ -33,7 +31,7 @@ namespace NewHorizons.Utility // TODO: RegisterProp function, call it in DetailBuilder.MakeDetail // TODO: Add default rotation and position offsets - public static void PlaceObject(DebugRaycastData data) + public static void PlaceObject(DebugRaycastData data, Vector3 playerAbsolutePosition) { if (!data.hitObject.name.EndsWith("_Body")) { @@ -51,12 +49,44 @@ namespace NewHorizons.Utility GameObject prop = DetailBuilder.MakeDetail(data.hitObject, data.hitObject.GetComponentInChildren(), currentObject, data.pos, data.norm, 1, false); PropPlacementData propData = RegisterProp_WithReturn(data.bodyName, prop); - propData.initial_pos = data.pos; - propData.initial_rotation = data.norm; // TODO: rotate around vertical axis to face player - string origEul = prop.transform.localEulerAngles.ToString(); - prop.transform.localRotation = Quaternion.LookRotation(data.norm) * Quaternion.FromToRotation(Vector3.up, Vector3.forward); + //var dirTowardsPlayer = playerAbsolutePosition - prop.transform.position; + //dirTowardsPlayer.y = 0; + + // align with surface normal + Vector3 alignToSurface = (Quaternion.LookRotation(data.norm) * Quaternion.FromToRotation(Vector3.up, Vector3.forward)).eulerAngles; + prop.transform.localEulerAngles = alignToSurface; + + // rotate facing dir + GameObject g = new GameObject(); + g.transform.parent = prop.transform.parent; + g.transform.localPosition = prop.transform.localPosition; + g.transform.localRotation = prop.transform.localRotation; + + System.Random r = new System.Random(); + prop.transform.parent = g.transform; + + var dirTowardsPlayer = prop.transform.parent.transform.InverseTransformPoint(playerAbsolutePosition) - prop.transform.localPosition; + dirTowardsPlayer.y = 0; + float rotation = Quaternion.LookRotation(dirTowardsPlayer).eulerAngles.y; + prop.transform.localEulerAngles = new Vector3(0, rotation, 0); + + prop.transform.parent = g.transform.parent; + GameObject.Destroy(g); + + //// rotate to face player + //var dirTowardsPlayer = prop.transform.parent.transform.InverseTransformPoint(playerAbsolutePosition) - prop.transform.localPosition; + //dirTowardsPlayer.z = 0; + //float rotation = Quaternion.LookRotation(dirTowardsPlayer).eulerAngles.z; + + //Logger.Log("==="); + //Logger.Log(dirTowardsPlayer.ToString()); + //Logger.Log(Quaternion.LookRotation(dirTowardsPlayer).eulerAngles.ToString()); + //Logger.Log(alignToSurface.ToString()); + //prop.transform.localEulerAngles = new Vector3(0, alignToSurface.y, alignToSurface.z); + + } catch (Exception e) { diff --git a/NewHorizons/Utility/DebugRaycaster.cs b/NewHorizons/Utility/DebugRaycaster.cs index 4a7f4947..685129d5 100644 --- a/NewHorizons/Utility/DebugRaycaster.cs +++ b/NewHorizons/Utility/DebugRaycaster.cs @@ -67,7 +67,7 @@ namespace NewHorizons.Utility internal void PlaceObject() { DebugRaycastData data = Raycast(); - DebugPropPlacer.PlaceObject(data); + DebugPropPlacer.PlaceObject(data, this.gameObject.transform.position); } internal void PrintRaycast()