void DrawGizmo(Boolean selected) { #if UNITY_EDITOR if (Vertices.Length >= 3) { FPMathUtils.LoadLookupTables(); var color = FPVector2.IsPolygonConvex(Vertices) ? ColorRGBA.ColliderGreen : ColorRGBA.Red; var normals = FPVector2.CalculatePolygonNormals(Vertices); UnityEditor.Handles.matrix = transform.localToWorldMatrix; UnityEditor.Handles.color = color.ToColor().Alpha(0.125f); UnityEditor.Handles.DrawAAConvexPolygon(Vertices.Select(x => x.ToUnityVector3()).ToArray()); var cw = FPVector2.IsClockWise(Vertices); Gizmos.color = color.ToColor().Alpha(selected ? 1f : 0.55f); Gizmos.matrix = transform.localToWorldMatrix; for (Int32 i = 0; i < Vertices.Length; ++i) { var v1 = Vertices[i].ToUnityVector3(); var v2 = Vertices[(i + 1) % Vertices.Length].ToUnityVector3(); var n = (cw ? -normals[i] : normals[i]).ToUnityVector3(); var c = Vector3.Lerp(v1, v2, 0.5f); Gizmos.DrawLine(v1, v2); Gizmos.DrawLine(c, c + (n * 0.25f)); } Gizmos.DrawWireSphere(FPVector2.CalculatePolygonCentroid(Vertices).ToUnityVector3(), 0.025f); } //Gizmos.DrawWireSphere(Vector3.zero, FPVector2.CalculatePolygonRadius(Vertices).AsFloat); Gizmos.color = UnityEditor.Handles.color = Color.white; Gizmos.matrix = UnityEditor.Handles.matrix = Matrix4x4.identity; #endif }
static void BakeData(MapData data, Boolean inEditor) { #if UNITY_EDITOR if (inEditor) { if (EditorSceneManager.loadedSceneCount != 1) { Debug.LogErrorFormat("Can't bake map data when more than one scene is open."); return; } // set scene name data.Asset.Settings.Scene = EditorSceneManager.GetActiveScene().name; } #endif // clear existing colliders data.Asset.Settings.StaticColliders = new MapStaticCollider[0]; // circle colliders foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticCircleCollider2D>()) { ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider { Position = collider.transform.position.ToFPVector2(), Rotation = collider.transform.rotation.ToFPRotation2D(), PhysicsMaterial = collider.Settings.PhysicsMaterial, Trigger = collider.Settings.Trigger, StaticData = GetStaticData(collider.gameObject, collider.Settings), Layer = collider.gameObject.layer, // circle ShapeType = Quantum.Core.DynamicShapeType.Circle, CircleRadius = FP.FromFloat_UNSAFE(collider.Radius.AsFloat * collider.transform.localScale.x) }); } // polygon colliders foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticPolygonCollider2D>()) { var s = collider.transform.localScale; var vertices = collider.Vertices.Select(x => { var v = x.ToUnityVector3(); return(new Vector3(v.x * s.x, v.y * s.y, v.z * s.z)); }).Select(x => x.ToFPVector2()).ToArray(); if (FPVector2.IsClockWise(vertices)) { FPVector2.MakeCounterClockWise(vertices); } var normals = FPVector2.CalculatePolygonNormals(vertices); ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider { Position = collider.transform.position.ToFPVector2(), Rotation = collider.transform.rotation.ToFPRotation2D(), PhysicsMaterial = collider.Settings.PhysicsMaterial, Trigger = collider.Settings.Trigger, StaticData = GetStaticData(collider.gameObject, collider.Settings), Layer = collider.gameObject.layer, // polygon ShapeType = Quantum.Core.DynamicShapeType.Polygon, PolygonCollider = new PolygonCollider { Vertices = vertices, Normals = normals } }); } // polygon colliders foreach (var collider in UnityEngine.Object.FindObjectsOfType <QuantumStaticBoxCollider2D>()) { var e = collider.Size.ToUnityVector3(); var s = collider.transform.localScale; e.x *= s.x; e.y *= s.y; e.z *= s.z; ArrayUtils.Add(ref data.Asset.Settings.StaticColliders, new MapStaticCollider { Position = collider.transform.position.ToFPVector2(), Rotation = collider.transform.rotation.ToFPRotation2D(), PhysicsMaterial = collider.Settings.PhysicsMaterial, Trigger = collider.Settings.Trigger, StaticData = GetStaticData(collider.gameObject, collider.Settings), Layer = collider.gameObject.layer, // polygon ShapeType = Quantum.Core.DynamicShapeType.Box, BoxExtents = e.ToFPVector2() * FP._0_50 }); } // invoke callbacks foreach (var callback in Quantum.TypeUtils.GetSubClasses(typeof(MapDataBakerCallback), "Assembly-CSharp", "Assembly-CSharp-firstpass", "Assembly-CSharp-Editor", "Assembly-CSharp-Editor-firstpass")) { if (callback.IsAbstract == false) { try { (Activator.CreateInstance(callback) as MapDataBakerCallback).OnBake(data); } catch (Exception exn) { Debug.LogException(exn); } } } if (inEditor) { Debug.LogFormat("Baked {0} static colliders", data.Asset.Settings.StaticColliders.Length); } }