示例#1
0
        public static void PostRaycast(List <Tuple <GameObject, RaycastHit> > results)
        {
            var resultsToRemove = new List <Tuple <GameObject, RaycastHit> >();

            foreach (var tuple in results)
            {
                var          hit          = tuple.Item2;
                MeshCollider meshCollider = hit.collider as MeshCollider;
                if (meshCollider == null || meshCollider.sharedMesh == null)
                {
                    resultsToRemove.Add(tuple);
                    continue;
                }

                Mesh mesh   = meshCollider.sharedMesh;
                var  point  = hit.point;
                var  normal = hit.normal;
                // Vertex snapping requires a readable mesh
                if (mesh.isReadable)
                {
                    int[]          triangles        = mesh.triangles;
                    Vector3[]      normals          = mesh.normals;
                    Vector3[]      vertices         = mesh.vertices;
                    List <Vector3> triangleVertices = new List <Vector3> {
                        vertices[triangles[hit.triangleIndex * 3 + 0]], vertices[triangles[hit.triangleIndex * 3 + 1]], vertices[triangles[hit.triangleIndex * 3 + 2]]
                    };

                    Vector3 N0 = normals[triangles[hit.triangleIndex * 3 + 0]];
                    Vector3 N1 = normals[triangles[hit.triangleIndex * 3 + 1]];
                    Vector3 N2 = normals[triangles[hit.triangleIndex * 3 + 2]];
                    normal = meshCollider.transform.rotation * ((N0 + N1 + N2) / 3.0f);

                    point = DetectBestPointSelection(hit.point, triangleVertices);
                }

                SelectObjectDragToolAction.IAnchor anchor = new MarkerAnchor(tuple.Item1.GetInstanceID(), point, normal);

                //TODO This will keep adding AnchorSelectionContext on every selected object, need to remove them at some point
                var selectionContext = tuple.Item1.GetComponent <MarkerAnchorSelectionContext>();
                if (selectionContext == null)
                {
                    selectionContext = tuple.Item1.AddComponent <MarkerAnchorSelectionContext>();
                }

                //TODO This will keep adding SelectionContext every time there is a selection, the list needs to be cleared up at some point or moved somewhere else
                selectionContext.SelectionContextList.Add(new MarkerAnchorSelectionContext.SelectionContext {
                    selectedAnchor = anchor
                });
            }

            foreach (var tuple in resultsToRemove)
            {
                results.Remove(tuple);
            }

            results.Sort((a, b) => a.Item2.distance.CompareTo(b.Item2.distance));
        }
        public static void Should_ReturnDefaultMarkerAnchor_IfStringDoesNotMatch()
        {
            var markerAnchorType = "obviouslyNotAValidOne";
            var markerAnchor     = MarkerAnchor.FromString(markerAnchorType);

            Assert.Equal(default, markerAnchor);
        public static void Should_ReturnMarkerAnchorFromString(string markerAnchorType)
        {
            var markerAnchor = MarkerAnchor.FromString(markerAnchorType);

            Assert.Equal(markerAnchorType, markerAnchor.ToString());
        }