From 3413ab04f9fb58bf7f8c417f4cab5c814742da90 Mon Sep 17 00:00:00 2001 From: chwan1 Date: Wed, 27 Nov 2019 19:20:59 +0800 Subject: [PATCH] refactor in progress --- .../Assets/Frozen/Frozen.unity | 379 +++++++++--------- .../Frozen/Script/FrozenPointerEventFilter.cs | 187 ++++++++- 2 files changed, 376 insertions(+), 190 deletions(-) diff --git a/Unity-19050-05-BallPool/Assets/Frozen/Frozen.unity b/Unity-19050-05-BallPool/Assets/Frozen/Frozen.unity index 93cbb11..5c98f8c 100644 --- a/Unity-19050-05-BallPool/Assets/Frozen/Frozen.unity +++ b/Unity-19050-05-BallPool/Assets/Frozen/Frozen.unity @@ -1075,7 +1075,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &199010598 Transform: m_ObjectHideFlags: 0 @@ -3804,6 +3804,166 @@ MonoBehaviour: PlayOnStart: 1 Looping: 1 AudioVolume: 1 +--- !u!43 &956046139 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 'Space Ground Mesh: (8x5x3)' + serializedVersion: 9 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 24 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 16 + localAABB: + m_Center: {x: 0, y: 1.5, z: 0} + m_Extent: {x: 4, y: 1.5, z: 2.5} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_MeshCompression: 0 + m_IsReadable: 0 + m_KeepVertices: 1 + m_KeepIndices: 1 + m_IndexFormat: 0 + m_IndexBuffer: 000001000200010003000200040005000600050007000600080009000a0009000b000a000c000d000e000d000f000e00 + m_VertexData: + serializedVersion: 2 + m_VertexCount: 16 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 12 + format: 0 + dimension: 3 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 24 + format: 0 + dimension: 2 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 512 + _typelessdata: 000080c000000000000020c0000000000000803f00000000e4388e3e00000000000080c00000000000002040000000000000803f00000000e4388e3e0000203f0000804000000000000020c0000000000000803f000000008ee3383f00000000000080400000000000002040000000000000803f000000008ee3383f0000203f000080c000000000000020400000000000000000000080bfe4388e3e0000203f000080c000004040000020400000000000000000000080bfe4388e3e0000803f0000804000000000000020400000000000000000000080bf8ee3383f0000203f0000804000004040000020400000000000000000000080bf8ee3383f0000803f000080c000000000000020c00000803f0000000000000000000000000000203f000080c000004040000020c00000803f0000000000000000000000000000803f000080c000000000000020400000803f0000000000000000e4388e3e0000203f000080c000004040000020400000803f0000000000000000e4388e3e0000803f000080400000000000002040000080bf00000000000000008ee3383f0000203f000080400000404000002040000080bf00000000000000008ee3383f0000803f0000804000000000000020c0000080bf00000000000000000000803f0000203f0000804000004040000020c0000080bf00000000000000000000803f0000803f + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 1.5, z: 0} + m_Extent: {x: 4, y: 1.5, z: 2.5} + m_MeshUsageFlags: 0 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + m_MeshMetrics[0]: 1 + m_MeshMetrics[1]: 1 + m_MeshOptimized: 0 + m_StreamData: + offset: 0 + size: 0 + path: --- !u!1 &1000268178 GameObject: m_ObjectHideFlags: 0 @@ -5590,7 +5750,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1379541361} - m_Mesh: {fileID: 1694833583} + m_Mesh: {fileID: 956046139} --- !u!114 &1379541365 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5885,7 +6045,6 @@ GameObject: - component: {fileID: 1451842900} - component: {fileID: 1451842899} - component: {fileID: 1451842901} - - component: {fileID: 1451842902} m_Layer: 10 m_Name: Scene Camera m_TagString: Untagged @@ -6042,31 +6201,7 @@ MonoBehaviour: serializedVersion: 2 m_Bits: 4294967295 m_MaxRayIntersections: 0 - pointerEventFilter: {fileID: 1451842902} ---- !u!114 &1451842902 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1451842896} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: adfcbd7a73e557e4aa57c51c4b86a917, type: 3} - m_Name: - m_EditorClassIdentifier: - roi: - serializedVersion: 2 - x: 370 - y: 0 - width: 1260 - height: 800 - roiDst: - serializedVersion: 2 - x: 0 - y: 1840 - width: 5040 - height: 3200 + pointerEventFilter: {fileID: 1817143151} --- !u!1 &1470412008 GameObject: m_ObjectHideFlags: 0 @@ -6313,7 +6448,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1640244023 RectTransform: m_ObjectHideFlags: 0 @@ -6830,166 +6965,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: area: 2 ---- !u!43 &1694833583 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'Space Ground Mesh: (8x5x3)' - serializedVersion: 9 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 24 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 16 - localAABB: - m_Center: {x: 0, y: 1.5, z: 0} - m_Extent: {x: 4, y: 1.5, z: 2.5} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: [] - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_MeshCompression: 0 - m_IsReadable: 0 - m_KeepVertices: 1 - m_KeepIndices: 1 - m_IndexFormat: 0 - m_IndexBuffer: 000001000200010003000200040005000600050007000600080009000a0009000b000a000c000d000e000d000f000e00 - m_VertexData: - serializedVersion: 2 - m_VertexCount: 16 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 24 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - m_DataSize: 512 - _typelessdata: 000080c000000000000020c0000000000000803f00000000e4388e3e00000000000080c00000000000002040000000000000803f00000000e4388e3e0000203f0000804000000000000020c0000000000000803f000000008ee3383f00000000000080400000000000002040000000000000803f000000008ee3383f0000203f000080c000000000000020400000000000000000000080bfe4388e3e0000203f000080c000004040000020400000000000000000000080bfe4388e3e0000803f0000804000000000000020400000000000000000000080bf8ee3383f0000203f0000804000004040000020400000000000000000000080bf8ee3383f0000803f000080c000000000000020c00000803f0000000000000000000000000000203f000080c000004040000020c00000803f0000000000000000000000000000803f000080c000000000000020400000803f0000000000000000e4388e3e0000203f000080c000004040000020400000803f0000000000000000e4388e3e0000803f000080400000000000002040000080bf00000000000000008ee3383f0000203f000080400000404000002040000080bf00000000000000008ee3383f0000803f0000804000000000000020c0000080bf00000000000000000000803f0000203f0000804000004040000020c0000080bf00000000000000000000803f0000803f - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0, y: 1.5, z: 0} - m_Extent: {x: 4, y: 1.5, z: 2.5} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimized: 0 - m_StreamData: - offset: 0 - size: 0 - path: --- !u!1 &1718259912 GameObject: m_ObjectHideFlags: 0 @@ -7578,6 +7553,7 @@ GameObject: - component: {fileID: 1817143148} - component: {fileID: 1817143150} - component: {fileID: 1817143147} + - component: {fileID: 1817143151} m_Layer: 0 m_Name: Spout Camera m_TagString: Untagged @@ -7668,6 +7644,31 @@ MonoBehaviour: m_EditorClassIdentifier: space: {x: 2880, y: 1800, z: 1080} material: {fileID: 2100000, guid: f05d2e0d0f372ae48998e59e3d376a63, type: 2} +--- !u!114 &1817143151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1817143146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: adfcbd7a73e557e4aa57c51c4b86a917, type: 3} + m_Name: + m_EditorClassIdentifier: + roi: + serializedVersion: 2 + x: 370 + y: 0 + width: 1260 + height: 800 + roiDst: + serializedVersion: 2 + x: 0 + y: 1840 + width: 5040 + height: 3200 + space: {x: 2880, y: 1800, z: 1080} --- !u!1 &1858061292 GameObject: m_ObjectHideFlags: 0 diff --git a/Unity-19050-05-BallPool/Assets/Frozen/Script/FrozenPointerEventFilter.cs b/Unity-19050-05-BallPool/Assets/Frozen/Script/FrozenPointerEventFilter.cs index dc7ea20..654ba10 100644 --- a/Unity-19050-05-BallPool/Assets/Frozen/Script/FrozenPointerEventFilter.cs +++ b/Unity-19050-05-BallPool/Assets/Frozen/Script/FrozenPointerEventFilter.cs @@ -13,13 +13,198 @@ namespace UltraCombos [Header("Event Target")] public Rect roiDst = new Rect(0, 0, 1920, 1080); + public Vector3 space; + + List homos = new List(); + Rect LeftWall; + Rect TopWall; + Rect RightWall; + // Rect Floor; + + + private void Start() + { + float dim = space.x + space.z * 2.0f; + + float offset = 0.5f; + var src = new List(); + var dst = new List(); + + // front + { + src.Clear(); + src.Add(new Vector2(0, dim - 0)); + src.Add(new Vector2(dim, dim - 0)); + src.Add(new Vector2(space.z, dim - space.z)); + src.Add(new Vector2(space.z + space.x, dim - space.z)); + + TopWall = new Rect(space.z, dim - space.z, space.x, space.z); + dst.Clear(); + dst.Add(new Vector2(TopWall.xMin, TopWall.yMax)); + dst.Add(new Vector2(TopWall.xMax, TopWall.yMax)); + dst.Add(new Vector2(TopWall.xMin, TopWall.yMin)); + dst.Add(new Vector2(TopWall.xMax, TopWall.yMin)); + + var matrix = Matrix4x4.identity; + FindHomography(dst.ToArray(), src.ToArray(), ref matrix); + homos.Add(matrix); + } + + // left + { + src.Clear(); + src.Add(new Vector2(0, dim - 0)); + src.Add(new Vector2(0, dim - dim)); + src.Add(new Vector2(space.z, dim - space.z)); + src.Add(new Vector2(space.z, dim - (space.z + space.x))); + + dst.Clear(); + dst.Add(new Vector2(0, dim - space.z)); + dst.Add(new Vector2(0, dim - (space.z + space.x))); + dst.Add(new Vector2(space.z, dim - space.z)); + dst.Add(new Vector2(space.z, dim - (space.z + space.x))); + LeftWall = new Rect(0, dim - (space.z + space.x), space.z, space.x); + + var matrix = Matrix4x4.identity; + FindHomography(dst.ToArray(), src.ToArray(), ref matrix); + homos.Add(matrix); + } + + // right + { + src.Clear(); + src.Add(new Vector2(dim, dim - 0)); + src.Add(new Vector2(dim, dim - dim)); + src.Add(new Vector2(space.z + space.x, dim - space.z)); + src.Add(new Vector2(space.z + space.x, dim - (space.z + space.x))); + + dst.Clear(); + dst.Add(new Vector2(dim, dim - space.z)); + dst.Add(new Vector2(dim, dim - (space.z + space.x))); + dst.Add(new Vector2(space.z + space.x, dim - space.z)); + dst.Add(new Vector2(space.z + space.x, dim - (space.z + space.x))); + + var matrix = Matrix4x4.identity; + FindHomography(dst.ToArray(), src.ToArray(), ref matrix); + homos.Add(matrix); + } + } + public override void Filter(PointerEventData eventData) { Vector2 position = eventData.position; position = Rect.PointToNormalized(roi, position); position = Rect.NormalizedToPoint(roiDst, position); - // Debug.Log(position); + Debug.Log(position); + if (homos.Count == 0) + { + eventData.position = Vector2.negativeInfinity; + return; + } + + if (TopWall.Contains(position)) + { + position = homos[0].MultiplyPoint(position); + Debug.Log("inside top wall"); + } + else + { + position = Vector2.negativeInfinity; + Debug.Log("outside"); + } + Debug.Log(position); eventData.position = position; } + + + + + + private void FindHomography(Vector2[] src, Vector2[] dest, ref Matrix4x4 homography) + { + + float[,] P = new float[,]{ + {-src[0].x, -src[0].y, -1, 0, 0, 0, src[0].x*dest[0].x, src[0].y*dest[0].x, -dest[0].x }, // h11 + { 0, 0, 0, -src[0].x, -src[0].y, -1, src[0].x*dest[0].y, src[0].y*dest[0].y, -dest[0].y }, // h12 + + {-src[1].x, -src[1].y, -1, 0, 0, 0, src[1].x*dest[1].x, src[1].y*dest[1].x, -dest[1].x }, // h13 + { 0, 0, 0, -src[1].x, -src[1].y, -1, src[1].x*dest[1].y, src[1].y*dest[1].y, -dest[1].y }, // h21 + + {-src[2].x, -src[2].y, -1, 0, 0, 0, src[2].x*dest[2].x, src[2].y*dest[2].x, -dest[2].x }, // h22 + { 0, 0, 0, -src[2].x, -src[2].y, -1, src[2].x*dest[2].y, src[2].y*dest[2].y, -dest[2].y }, // h23 + + {-src[3].x, -src[3].y, -1, 0, 0, 0, src[3].x*dest[3].x, src[3].y*dest[3].x, -dest[3].x }, // h31 + { 0, 0, 0, -src[3].x, -src[3].y, -1, src[3].x*dest[3].y, src[3].y*dest[3].y, -dest[3].y }, // h32 + }; + + GaussianElimination(ref P, 9); + + float[] aux_H ={ P[0,8],P[3,8],0,P[6,8], // h11 h21 0 h31 + P[1,8],P[4,8],0,P[7,8], // h12 h22 0 h32 + 0 , 0,1,0, // 0 0 0 0 + P[2,8],P[5,8],0,1}; // h13 h23 0 h33 + + for (int i = 0; i < 16; i++) homography[i] = aux_H[i]; + + } + + private void GaussianElimination(ref float[,] A, int n) + { + + int i = 0; + int j = 0; + int m = n - 1; + while (i < m && j < n) + { + + int maxi = i; + for (int k = i + 1; k < m; k++) + { + if (Mathf.Abs(A[k, j]) > Mathf.Abs(A[maxi, j])) + { + maxi = k; + } + } + if (A[maxi, j] != 0) + { + + if (i != maxi) + for (int k = 0; k < n; k++) + { + float aux = A[i, k]; + A[i, k] = A[maxi, k]; + A[maxi, k] = aux; + } + + float A_ij = A[i, j]; + for (int k = 0; k < n; k++) + { + A[i, k] /= A_ij; + } + + for (int u = i + 1; u < m; u++) + { + + float A_uj = A[u, j]; + for (int k = 0; k < n; k++) + { + A[u, k] -= A_uj * A[i, k]; + } + + } + + i++; + } + j++; + } + for (int k = m - 2; k >= 0; k--) + { + for (int l = k + 1; l < n - 1; l++) + { + A[k, m] -= A[k, l] * A[l, m]; + + } + } + } } } \ No newline at end of file