Пример #1
0
        /// <summary>
        /// Calculate the weights for this ray.
        /// </summary>
        /// <param name="mouseRay">The ray used to calculate weights</param>
        /// <param name="target">The object on which to calculate the weights</param>
        /// <returns>true if mouseRay hits the target, false otherwise</returns>
        bool DoMeshRaycast(Ray mouseRay, BrushTarget target, MirrorSettings mirrorSettings)
        {
            if (!Util.IsValid(target))
            {
                return(false);
            }

            target.ClearRaycasts();

            EditableObject editable = target.editableObject;

            s_Rays.Clear();
            s_Rays.Add(mouseRay);

            if (mirrorSettings.Axes != BrushMirror.None)
            {
                for (int i = 0; i < 3; i++)
                {
                    if (((uint)mirrorSettings.Axes & (1u << i)) < 1)
                    {
                        continue;
                    }

                    int len = s_Rays.Count;

                    for (int n = 0; n < len; n++)
                    {
                        Vector3 flipVec = ((BrushMirror)(1u << i)).ToVector3();

                        if (mirrorSettings.Space == MirrorCoordinateSpace.World)
                        {
                            Vector3 cen = editable.gameObjectAttached.GetComponent <Renderer>().bounds.center;
                            s_Rays.Add(new Ray(Vector3.Scale(s_Rays[n].origin - cen, flipVec) + cen,
                                               Vector3.Scale(s_Rays[n].direction, flipVec)));
                        }
                        else
                        {
                            Transform t = SceneView.lastActiveSceneView.camera.transform;
                            Vector3   o = t.InverseTransformPoint(s_Rays[n].origin);
                            Vector3   d = t.InverseTransformDirection(s_Rays[n].direction);
                            s_Rays.Add(new Ray(t.TransformPoint(Vector3.Scale(o, flipVec)),
                                               t.TransformDirection(Vector3.Scale(d, flipVec))));
                        }
                    }
                }
            }

            bool hitMesh = false;

            int[] triangles = editable.editMesh.GetTriangles();

            foreach (Ray ray in s_Rays)
            {
                PolyRaycastHit hit;

                if (PolySceneUtility.WorldRaycast(ray, editable.transform, editable.visualMesh.vertices, triangles, out hit))
                {
                    target.raycastHits.Add(hit);
                    hitMesh = true;
                }
            }

            PolySceneUtility.CalculateWeightedVertices(target, brushSettings, tool, mode);

            return(hitMesh);
        }
        /// <summary>
        /// Calculate the weights for this ray.
        /// </summary>
        /// <param name="mouseRay">The ray used to calculate weights</param>
        /// <param name="target">The object on which to calculate the weights</param>
        /// <returns>true if mouseRay hits the target, false otherwise</returns>
        bool DoMeshRaycast(Ray mouseRay, BrushTarget target, MirrorSettings mirrorSettings)
        {
            m_SecondaryBrushTargets.Clear();
            if (!Util.IsValid(target))
            {
                return(false);
            }

            target.ClearRaycasts();

            EditableObject editable = target.editableObject;

            s_Rays.Clear();
            s_Rays.Add(mouseRay);

            if (mirrorSettings.Axes != BrushMirror.None)
            {
                for (int i = 0; i < 3; i++)
                {
                    if (((uint)mirrorSettings.Axes & (1u << i)) < 1)
                    {
                        continue;
                    }

                    int len = s_Rays.Count;

                    for (int n = 0; n < len; n++)
                    {
                        Vector3 flipVec = ((BrushMirror)(1u << i)).ToVector3();

                        if (mirrorSettings.Space == MirrorCoordinateSpace.World)
                        {
                            Vector3 cen = editable.gameObjectAttached.GetComponent <Renderer>().bounds.center;
                            s_Rays.Add(new Ray(Vector3.Scale(s_Rays[n].origin - cen, flipVec) + cen,
                                               Vector3.Scale(s_Rays[n].direction, flipVec)));
                        }
                        else
                        {
                            Transform t = SceneView.lastActiveSceneView.camera.transform;
                            Vector3   o = t.InverseTransformPoint(s_Rays[n].origin);
                            Vector3   d = t.InverseTransformDirection(s_Rays[n].direction);
                            s_Rays.Add(new Ray(t.TransformPoint(Vector3.Scale(o, flipVec)),
                                               t.TransformDirection(Vector3.Scale(d, flipVec))));
                        }
                    }
                }
            }

            bool hitMesh = false;

            int[] triangles = editable.editMesh.GetTriangles();
            foreach (Ray ray in s_Rays)
            {
                PolyRaycastHit hit;

                if (PolySceneUtility.WorldRaycast(ray, editable.transform, editable.visualMesh.vertices, triangles,
                                                  out hit))
                {
                    target.raycastHits.Add(hit);
                    hitMesh = true;
                }
            }

            PolySceneUtility.CalculateWeightedVertices(target, brushSettings, tool, mode);

            if (hitMesh && !s_LockBrushToFirst)
            {
                Transform[] trs  = Selection.GetTransforms(SelectionMode.Unfiltered);
                var         hits = target.raycastHits;
                foreach (var selectedTransform in trs)
                {
                    bool isValid = false;
                    if (selectedTransform != editable.transform)
                    {
                        BrushTarget secondaryTarget = GetOrCreateBrushTarget(selectedTransform.gameObject);
                        isValid = Util.IsValid(secondaryTarget);
                        if (isValid)
                        {
                            m_SecondaryBrushTargets.Add(secondaryTarget);
                            secondaryTarget.ClearRaycasts();

                            foreach (var hit in hits)
                            {
                                PolyRaycastHit secondaryHit = new PolyRaycastHit(hit.distance,
                                                                                 secondaryTarget.transform.InverseTransformPoint(editable.transform.TransformPoint(hit.position)),
                                                                                 hit.normal,
                                                                                 -1);
                                secondaryTarget.raycastHits.Add(secondaryHit);
                            }
                        }
                        PolySceneUtility.CalculateWeightedVertices(secondaryTarget, brushSettings, tool, mode);
                    }
                }
            }

            return(hitMesh);
        }