public void Calculate_frame_instance_for_square_rotated_45_degrees_clockwise()
        {
            var startMesh = JMeshPhysicsMeshes.squareMeshIdentity;
            var jMesh     = JMesh.FromMeshAndTransform(startMesh, Matrix4x4.TRS(
                                                           new Vector3(1, 0, 1),
                                                           Quaternion.Euler(Vector3.up * 45),
                                                           Vector3.one * 2
                                                           ));

            var halfHeight       = Mathf.Sqrt(2);
            var upRightDirection = new Vector3(1, 0, 1).normalized;

            var vcs = jMesh.EdgeVertices;

            TestMethods.AreEqualIsh(new Vector3(1, 0, 1), vcs[0], "v0");
            TestMethods.AreEqualIsh(new Vector3(1 + halfHeight, 0, 1 - halfHeight), vcs[1], "v1");
            TestMethods.AreEqualIsh(new Vector3(1 + 2 * halfHeight, 0, 1), vcs[2], "v2");
            TestMethods.AreEqualIsh(new Vector3(1 + halfHeight, 0, 1 + halfHeight), vcs[3], "v3");

            var ns = jMesh.EdgeOutwardNormals;

            TestMethods.AreEqualIsh(-upRightDirection, ns[0], "ns0");
            TestMethods.AreEqualIsh(new Vector3(upRightDirection.x, 0, -upRightDirection.z), ns[1], "ns1");
            TestMethods.AreEqualIsh(upRightDirection, ns[2], "ns2");
            TestMethods.AreEqualIsh(new Vector3(-upRightDirection.x, 0, upRightDirection.z), ns[3], "ns3");
        }
Пример #2
0
        public void Calculate_AABB()
        {
            var bounds = JMesh.CalculateBounds(JMeshPhysicsMeshes.triangle);

            TestMethods.AreEqualIsh(bounds.center, new Vector3(0.5f, 0, 0.5f));
            TestMethods.AreEqualIsh(bounds.size, new Vector3(1f, 0, 1f));
        }
        public void Calculate_frame_instance_for_triangle_rotated_90_degrees_anti_clockwise_with_translation()
        {
            var startMesh = JMeshPhysicsMeshes.triangleMeshIdentity;
            var jMesh     = JMesh.FromMeshAndTransform(startMesh, Matrix4x4.TRS(
                                                           new Vector3(1, 0, 1),
                                                           Quaternion.Euler(Vector3.up * -90),
                                                           Vector3.one
                                                           ));

            TestMethods.AreEqualIsh(Vector3.right, startMesh.EdgeOutwardNormals[1], "bc normal");

            var vcs = jMesh.EdgeVertices;

            TestMethods.AreEqualIsh(new Vector3(1, 0, 1), vcs[0], "v0");
            TestMethods.AreEqualIsh(new Vector3(1, 0, 2), vcs[1], "v1");
            TestMethods.AreEqualIsh(new Vector3(0, 0, 2), vcs[2], "v2");

            var ns = jMesh.EdgeOutwardNormals;

            TestMethods.AreEqualIsh(Vector3.right, ns[0], "ns0");
            TestMethods.AreEqualIsh(Vector3.forward, ns[1], "ns1");
            TestMethods.AreEqualIsh(new Vector3(-1, 0, -1).normalized, ns[2], "ns2");

            var bounds = jMesh.AABB;
            var center = bounds.center;
            var min    = bounds.min;
            var max    = bounds.max;

            TestMethods.AreEqualIsh(new Vector3(0.5f, 0, 1.5f), center, "center");
            TestMethods.AreEqualIsh(0f, min.x, TestMethods.VECTOR_DIFF);
            TestMethods.AreEqualIsh(1f, min.z, TestMethods.VECTOR_DIFF);
            TestMethods.AreEqualIsh(1f, max.x, TestMethods.VECTOR_DIFF);
            TestMethods.AreEqualIsh(2f, max.z, TestMethods.VECTOR_DIFF);
        }
Пример #4
0
        public void Extract_triangle_edge_vertices_test()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.triangle, JMeshPhysicsMeshes.triangleTriangles);

            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangle[0], vertices[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangle[1], vertices[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangle[2], vertices[2]);
        }
Пример #5
0
 public PushResult(bool canPush, Push push, JMesh pusher, JMesh pushee)
 {
     CanPush   = canPush;
     this.push = push;
     APushB    = false;
     Pusher    = pusher;
     Pushee    = pushee;
 }
Пример #6
0
 public PushResult(bool canPush, Push push, bool aPushB, JMesh pusher, JMesh pushee)
 {
     CanPush   = canPush;
     this.push = push;
     APushB    = aPushB;
     Pusher    = pusher;
     Pushee    = pushee;
 }
Пример #7
0
 public PushResult(bool canPush, Push push, bool aPushB)
 {
     CanPush   = canPush;
     this.push = push;
     APushB    = aPushB;
     Pusher    = default(JMesh);
     Pushee    = default(JMesh);
 }
Пример #8
0
        public void Extract_square_five_edge_vertices_test()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.squareFive, JMeshPhysicsMeshes.squareFiveTriangles);

            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFive[0], vertices[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFive[1], vertices[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFive[3], vertices[2]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFive[4], vertices[3]);
        }
Пример #9
0
        public void Extract_square_edge_vertices_for_reversed_triangle_faces_test()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.square, JMeshPhysicsMeshes.squareTrianglesDifferentTriangles);

            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.square[0], vertices[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.square[1], vertices[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.square[2], vertices[2]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.square[3], vertices[3]);
        }
Пример #10
0
        public void Calculate_outward_normals_of_square_different_triangles_should_give_same_as_normal_since_vertex_order_is_the_same()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.square, JMeshPhysicsMeshes.squareTrianglesDifferentTriangles);
            var normals  = JMesh.CalculateOutwardNormals(vertices);

            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFiveNormals[0], normals[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFiveNormals[1], normals[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFiveNormals[2], normals[2]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareFiveNormals[3], normals[3]);
        }
Пример #11
0
        public void Calculate_outwards_normals_of_tall_triangle()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.triangleTall, JMeshPhysicsMeshes.triangleTallTriangles);
            var normals  = JMesh.CalculateOutwardNormals(vertices);

            Assert.AreEqual(3, normals.Length);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangleTallNormals[0], normals[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangleTallNormals[1], normals[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.triangleTallNormals[2], normals[2]);
        }
Пример #12
0
        public void Calculate_minmumPushDistance_should_push_b_down_even_when_argument_order_is_reversed()
        {
            var meshA = JMeshPhysicsMeshes.squareMeshIdentity;
            var meshB = JMesh.FromMeshAndTransform(JMeshPhysicsMeshes.triangleMeshIdentity, Matrix4x4.Translate(new Vector3(0, 0, -0.5f)));

            var pushResult = JMeshOverlapPushUtil.CalculateMinimumPush(meshB, meshA);

            TestMethods.AreEqualIshOrOppositeIsh(new Vector3(-1, 0, 1).normalized, pushResult.Direction);
            TestMethods.AreEqualIsh(Mathf.Sin(45 * Mathf.Deg2Rad) / 2f, pushResult.Magnitude, TestMethods.VECTOR_DIFF);
        }
Пример #13
0
        public void Calculate_minmumPushDistance_should_push_b_left()
        {
            var meshA = JMeshPhysicsMeshes.squareMeshIdentity;
            var meshB = JMesh.FromMeshAndTransform(JMeshPhysicsMeshes.triangleMeshIdentity, Matrix4x4.Translate(new Vector3(-0.8f, 0, 0.25f)));

            var pushResult = JMeshOverlapPushUtil.CalculateMinimumPush(meshA, meshB);

            TestMethods.AreEqualIshOrOppositeIsh(new Vector3(-1, 0, 0), pushResult.Direction);
            TestMethods.AreEqualIsh(0.2f, pushResult.Magnitude, TestMethods.VECTOR_DIFF);
        }
Пример #14
0
        public void Calculate_outward_normals_of_square()
        {
            var vertices = JMesh.ExtractEdgeVertices(JMeshPhysicsMeshes.square, JMeshPhysicsMeshes.squareTriangles);
            var normals  = JMesh.CalculateOutwardNormals(vertices);

            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareNormals[0], normals[0]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareNormals[1], normals[1]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareNormals[2], normals[2]);
            TestMethods.AreEqualIsh(JMeshPhysicsMeshes.squareNormals[3], normals[3]);
        }
Пример #15
0
        public void Point_should_be_inside_the_transformed_square_mesh()
        {
            var mesh = JMeshPhysicsMeshes.squareMeshIdentity;
            var meshFrameInstance = JMesh.FromMeshAndTransform(mesh, Matrix4x4.TRS(
                                                                   new Vector3(1, 0, 1),
                                                                   Quaternion.Euler(Vector3.up * 45),
                                                                   Vector3.one * 2
                                                                   ));

            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(new Vector3(1.001f, 0, 1f), meshFrameInstance));
            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(new Vector3(1f, 0, 1f), meshFrameInstance));
        }
        public void Calculate_frame_instance_for_nonunformly_scaled_triangle()
        {
            var transformed = JMesh.FromMeshAndTransform(JMeshPhysicsMeshes.triangleMeshIdentity, Matrix4x4.Scale(new Vector3(1, 1, 2)));
            var expected    = JMeshPhysicsMeshes.triangleTallMeshIdentity;

            var tMesh = transformed;

            TestMethods.AreEqualIsh(expected.AABB.size, tMesh.AABB.size);
            TestMethods.AreEqualIsh(expected.EdgeOutwardNormals[0], tMesh.EdgeOutwardNormals[0]);
            TestMethods.AreEqualIsh(expected.EdgeOutwardNormals[1], tMesh.EdgeOutwardNormals[1]);
            TestMethods.AreEqualIsh(expected.EdgeOutwardNormals[2], tMesh.EdgeOutwardNormals[2]);

            TestMethods.AreEqualIsh(expected.EdgeVertices[0], tMesh.EdgeVertices[0]);
            TestMethods.AreEqualIsh(expected.EdgeVertices[1], tMesh.EdgeVertices[1]);
            TestMethods.AreEqualIsh(expected.EdgeVertices[2], tMesh.EdgeVertices[2]);
        }
Пример #17
0
        public void Point_shold_be_inside_mesh_when_point_is_exactly_on_a_mesh_edge_vertex()
        {
            var mesh = JMeshPhysicsMeshes.squareMeshIdentity;
            var meshFrameInstance = JMesh.FromMeshAndTransform(mesh, Matrix4x4.TRS(
                                                                   new Vector3(1, 0, 1),
                                                                   Quaternion.Euler(Vector3.up * 45),
                                                                   Vector3.one * 2
                                                                   ));

            var instanceMesh = meshFrameInstance;

            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(instanceMesh.EdgeVertices[0], meshFrameInstance));
            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(instanceMesh.EdgeVertices[1], meshFrameInstance));
            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(instanceMesh.EdgeVertices[2], meshFrameInstance));
            Assert.IsTrue(JMeshOverlap.IsPointInsideMesh(instanceMesh.EdgeVertices[3], meshFrameInstance));
        }
Пример #18
0
    void Setup()
    {
        /// set position
        GameObject gObj = gameObject;
        JMesh      jMsh = m_jRoom.boundary;

        // Vector2 pos = Utils.Rvt2CamCoord(jMsh.BD.min, m_floor.FloorBDs, true, m_floor.PixelPerUnit);
        gObj.transform.position = new Vector3(0, 0, 5);

        /// calculate mesh

        /// reshape
        List <Vector3> v2ds = Utils.Rvt2CamCoord(jMsh.Vct2ds, m_floor.FloorBDs, true, m_floor.PixelPerUnit);
        List <Vector2> uv   = new List <Vector2>();

        for (int i = 0; i < v2ds.Count; i++)
        {
            uv.Add(new Vector2((float)i / (float)v2ds.Count * jMsh.BD.size.x, (float)i / (float)v2ds.Count * jMsh.BD.size.y));
        }
        MeshFilter mFilter = gObj.GetComponent <MeshFilter>();
        Mesh       oldMesh = mFilter.mesh;

        Mesh msh = new Mesh();

        mFilter.mesh = msh;

        msh.vertices = v2ds.ToArray();
        jMsh.Triangles.Reverse();
        msh.triangles = jMsh.Triangles.ToArray();
        msh.uv        = uv.ToArray();

        MeshCollider msCll = gObj.GetComponent <MeshCollider>();

        msCll.sharedMesh = msh;

        MeshRenderer mshRender = GetComponent <MeshRenderer>();

        mshRender.material.color = RoomUtils.GetColor(m_jRoom.program_type);

        foreach (JFurniture fn in m_jRoom.furniture)
        {
            GameObject dskObj = GameObject.Instantiate(m_floor.m_desk);
            Desk       dsk    = dskObj.GetComponent <Desk>();
            dsk.m_furniture = fn;
            dsk.m_rm        = this;
        }
    }
Пример #19
0
        public static float[] CalculatePushLengthsForPoint(JMesh meshA, Vector3 vertex)
        {
            var aVertices      = meshA.EdgeVertices;
            var aNormals       = meshA.EdgeOutwardNormals;
            var aNormalsLength = aNormals.Length;
            var pushLengths    = new float[aNormalsLength];

            for (var a = 0; a < aNormalsLength; a++)
            {
                var PAVector = (aVertices[a] - vertex);
                var normal   = aNormals[a];
                var distance = Vector3.Dot(normal, PAVector);
                pushLengths[a] = distance;
                //Debug.Log("vertex: " + vertex + ", PAVector: " + PAVector + ", normal: " + normal + ", distance: " + distance);
            }

            return(pushLengths);
        }
Пример #20
0
        public static Push CalculatePushForPoints(Vector3[] points, JMesh mesh)
        {
            var vertices   = points;
            var end        = points.Length - 1;
            var normals    = mesh.EdgeOutwardNormals.Length;
            var distancesA = new List <float[]>(normals);

            for (var i = 0; i < end; i++)
            {
                distancesA.Add(CalculatePushLengthsForPoint(mesh, vertices[i]));
            }

            var maxValues            = FindMaxesForEachValue(distancesA);
            var indexOfFirstMinValue = IndexOfSmallestValue(maxValues);
            var minPushDistance      = maxValues[indexOfFirstMinValue];
            var pushDirection        = mesh.EdgeOutwardNormals[indexOfFirstMinValue];

            return(new Push(pushDirection, minPushDistance));
        }
Пример #21
0
        public void AABB_should_not_overlap_for_squares()
        {
            var mesh       = squareMesh;
            var rightOf    = JMesh.FromMeshAndTransform(mesh, Matrix4x4.Translate(new Vector3(2, 0, 0)));
            var above      = JMesh.FromMeshAndTransform(mesh, Matrix4x4.Translate(new Vector3(0, 0, 2)));
            var upperRight = JMesh.FromMeshAndTransform(mesh, Matrix4x4.Translate(new Vector3(2, 0, 2)));
            var lowerRight = JMesh.FromMeshAndTransform(mesh, Matrix4x4.Translate(new Vector3(2, 0, -2)));

            Assert.IsFalse(JMeshOverlap.AABBOverlap(mesh.AABB, rightOf.AABB));
            Assert.IsFalse(JMeshOverlap.AABBOverlap(rightOf.AABB, mesh.AABB));

            Assert.IsFalse(JMeshOverlap.AABBOverlap(mesh.AABB, above.AABB));
            Assert.IsFalse(JMeshOverlap.AABBOverlap(above.AABB, mesh.AABB));

            Assert.IsFalse(JMeshOverlap.AABBOverlap(mesh.AABB, upperRight.AABB));
            Assert.IsFalse(JMeshOverlap.AABBOverlap(upperRight.AABB, mesh.AABB));

            Assert.IsFalse(JMeshOverlap.AABBOverlap(mesh.AABB, lowerRight.AABB));
            Assert.IsFalse(JMeshOverlap.AABBOverlap(lowerRight.AABB, mesh.AABB));
        }
Пример #22
0
        public static Push CalculateMinimumPush(JMesh meshA, JMesh meshB)
        {
            // Mulig metoden bør utbedres med sjekk i alle normalretningene for alle vertices, men dette kan være dyrt?

            var pushA = CalculatePushForPoints(meshA.EdgeVertices, meshB);
            var pushB = CalculatePushForPoints(meshB.EdgeVertices, meshA);

            if (pushA.Magnitude <= pushB.Magnitude)
            {
                return(pushA);
            }
            return(pushB);
            //var verticesA = meshA.EdgeVertices;
            //var endA = verticesA.Length - 1;
            //var normalsEndB = meshB.EdgeOutwardNormals.Length;
            //var distancesA = new List<float[]>(normalsEndB);
            //for (var i = 0; i < endA; i++)
            //{
            //    distancesA.Add(CalculatePushLengthsForPoint(meshB, verticesA[i]));
            //}

            //var maxValuesA = FindMaxesForEachValue(distancesA);
            //foreach (var v in distancesA)
            //{
            //    Debug.Log(Logging.AsString(v));
            //}
            //var indexOfMin = IndexOfSmallestValue(maxValuesA);
            //var minDistanceA = maxValuesA[indexOfMin];
            //var directionA = meshB.EdgeOutwardNormals[indexOfMin];


            //var verticesB = meshB.EdgeVertices;
            //var endB = verticesB.Length - 1;
            //var normalsEndA = meshA.EdgeOutwardNormals.Length;
            //var distancesB = new List<float[]>(normalsEndA);
            //for (var i = 0; i < endB; i++)
            //{
            //    distancesB.Add(CalculatePushLengthsForPoint(meshA, verticesB[i]));
            //}

            //Debug.Log("B");
            //foreach (var v in distancesB)
            //{
            //    Debug.Log(Logging.AsString(v));
            //}
            //var maxValuesB = FindMaxesForEachValue(distancesB);
            //var indexOfMinB = IndexOfSmallestValue(maxValuesB);
            //var minDistanceB = maxValuesB[indexOfMinB];
            //var directionB = meshB.EdgeOutwardNormals[indexOfMinB];

            //Debug.Log("maxValuesA: " + Logging.AsString(maxValuesA));
            //Debug.Log("maxValuesB: " + Logging.AsString(maxValuesB));
            //Debug.Log("minDistanceA: " + minDistanceA + ", directionA: " + directionA + ": minDistanceB: " + minDistanceB + ", directionB: " + directionB);
            //Debug.Log("verticesA: " + verticesA.Length + ", verticesB: " + verticesB.Length);

            //if (minDistanceA <= minDistanceB)
            //{
            //    return new Push(directionA, minDistanceA);
            //}
            //return new Push(directionB, minDistanceB);



            // FV (fevest vertices), MV (most vertices)
            // Velg mesh med færrest vertices, FV
            // For hver vertex i FV, beregn dytte-avstand i retningene til hver av normalene på MV. Dersom en vertex allerede er utenfor, gi negativ dyttestørrelse
            // Lagre avstander og retninger i FV-pushes for alle vertex i FV
            // Velg så maks-avstand i hver av retningene, og lagre i en FVMax array
            // Velg så minste verdi for hver av retningene, lagre resultatet av retning og størrelse i FVBest

            // Velg mesh med flest vertices, MV
            // For hver vertex i MV, beregn dytte-avstand i retningene til hver av normalene på FV. Dersom en vertex allerede er utenfor, gi negativ dyttestørrelse
            // Lagre avstander og retninger i MV-pushes for alle vertex i MV
            // Velg så maks-avstand i hver av retningene, og lagre i en MVMax array
            // Velg så minste verdi for hver av retningene, lagre resultatet av retning og størrelse i MVBest

            // Velg så minste avstand av FVBest og MVBest
        }
Пример #23
0
 public void Meshes_should_not_overlap()
 {
     Assert.IsFalse(JMeshOverlap.MeshesOverlap(meshA, JMesh.FromMeshAndTransform(meshB, Matrix4x4.Translate(new Vector3(10, 0, 0)))));
     Assert.IsFalse(JMeshOverlap.MeshesOverlap(meshA, JMesh.FromMeshAndTransform(meshB, Matrix4x4.Translate(new Vector3(4, 0, 0)))));
 }