void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        // if we hit something
        if (Physics.Raycast(inputRay, out hit))
        {
            // and that something has a MeshDeformer component, then we can deform that something!
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
Ejemplo n.º 2
0
    private void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();

            if (deformer)
            {
                Vector3 point = hit.point;
                //point += hit.normal * deformRatio;
                //deformer.AddDeformingForce(point, deformRadius, deformPower);
                deformer.SelectClosestVertices(point, digRadius, digLevel);
            }
        }
    }
Ejemplo n.º 3
0
    private void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                // Where the ray hit the object
                Vector3 point = hit.point;
                // Move the "force" point slightly away from impact point
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
Ejemplo n.º 4
0
    void HandleInput2()
    {
        Ray        inputRay = cam.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;

                point -= hit.normal * forceOffset2;

                deformer.AddDeformingForce2(point, force2);
            }
        }
    }
Ejemplo n.º 5
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        Debug.Log(Physics.Raycast(inputRay, out hit));

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
Ejemplo n.º 6
0
        private static Vector3 WrapAroundAxisTransform(MeshDeformer deformer, Vector3 vertex, Vector3 center, float curvature = 0.1f)
        {
            Vector3 result = vertex;

            if (deformer.Axis == Axis.X)
            {
                result.y += Mathf.Pow((vertex.z - center.z), 2) * curvature * 0.01f;
            }
            else if (deformer.Axis == Axis.Y)
            {
                result.z += Mathf.Pow((vertex.x - center.x), 2) * curvature * 0.01f;
            }
            else
            {
                result.y += Mathf.Pow((vertex.x - center.x), 2) * curvature * 0.01f;
            }

            return(result);
        }
Ejemplo n.º 7
0
    void HandleInput()
    {
        //Now we have to figure out where the user is pointing. We do this by casting a ray from the camera into the scene.
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            //We use the physics engine to cast the ray and store information about what it hit. If the ray collided with something, we can retrieve the MeshDeformer component from the object that was hit.
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();

            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
Ejemplo n.º 8
0
        public void SlerpContacts(MeshDeformer deformer, Mesh original, Mesh colliderOriginal, Scaffold prev, Scaffold next, bool isRigid)
        {
            if (isRigid)
            {
                return;
            }

            Mesh prevMesh = null;
            Mesh nextMesh = null;

            if (prev != null)
            {
                prevMesh = prev.m_mesh;
            }

            if (next != null)
            {
                nextMesh = next.m_mesh;
            }
            SlerpContacts(deformer, m_mesh, deformer.Contacts, prev, prevMesh, next, nextMesh);


            if (colliderOriginal == null)
            {
                return;
            }
            if (prev != null)
            {
                prevMesh = prev.m_colliderMesh;
            }

            if (next != null)
            {
                nextMesh = next.m_colliderMesh;
            }
            SlerpContacts(deformer, m_colliderMesh, deformer.ColliderContacts, prev, prevMesh, next, nextMesh);

            if (m_collider != null)
            {
                m_collider.sharedMesh = null;
                m_collider.sharedMesh = m_colliderMesh;
            }
        }
Ejemplo n.º 9
0
    void HandleInput()
    {
        //Cast ray to mousepos
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        //Check for collision
        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                //Apply force to mouse click position
                Vector3 point = hit.point;
                point += hit.point * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
Ejemplo n.º 10
0
        public static void CombineAndSave()
        {
            GameObject   selected = Selection.activeObject as GameObject;
            MeshDeformer deformer = selected.GetComponentInParent <MeshDeformer>();

            GameObject[] gameObjects = deformer.GetComponentsInChildren <Scaffold>().Select(s => s.gameObject).ToArray();

            CombineResult combineResult = MeshUtils.Combine(gameObjects, deformer.gameObject);

            if (combineResult != null)
            {
                CleanupCombined(combineResult.GameObject);
                MeshUtils.SaveMesh(new[] { combineResult.GameObject }, "Battlehub/");
            }
            else
            {
                Debug.LogWarning("Unable to Combine and Save");
            }
        }
Ejemplo n.º 11
0
        public static void RemoveDeformer()
        {
            GameObject   selected = Selection.activeObject as GameObject;
            MeshDeformer deformer = selected.GetComponentInParent <MeshDeformer>();

            ControlPoint[] controlPoints = deformer.GetComponentsInChildren <ControlPoint>(true);
            for (int i = 0; i < controlPoints.Length; ++i)
            {
                Undo.DestroyObjectImmediate(controlPoints[i].gameObject);
            }

            Scaffold[] scaffolds = deformer.GetComponentsInChildren <Scaffold>();
            for (int i = 0; i < scaffolds.Length; ++i)
            {
                Undo.DestroyObjectImmediate(scaffolds[i]);
            }

            Undo.DestroyObjectImmediate(deformer);
        }
Ejemplo n.º 12
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                particlesystem.transform.position = hit.point;
                particlesystem.Play();
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
                //deformer.Addparticles(point);
            }
        }
    }
Ejemplo n.º 13
0
    void Update()
    {
        if (handModel == null)
        {
            return;
        }
        Vector3 palmPos = handModel.GetPalmPosition();

        if (!pickedUp)
        {
            Debug.Log("Picked up !");
            RaycastHit hit;


            Vector3 fwd         = handModel.GetPalmNormal();
            Vector3 destination = tracker.position - palmPos;

            if (Physics.Raycast(palmPos, destination, out hit, Mathf.Infinity))
            {
                float distanceToGround = hit.distance;
                Debug.Log("Hitting " + hit);
                Debug.DrawRay(palmPos, destination, Color.red);

                deformer = hit.collider.GetComponent <MeshDeformer>();
                if (deformer)
                {
                    tracker.SetParent(null);


                    deformPoint  = hit.point;
                    deformPoint += hit.normal * forceOffset;
                    pickedUp     = true;
                    inTransport  = true;
                }
            }
        }

        if (inTransport)
        {
            deformer.AddDeformingForce(deformPoint, force * Vector3.Distance(tracker.transform.position, palmPos));
        }
    }
Ejemplo n.º 14
0
        private Vector3[] Deform(Slice[] slices, Mesh mesh, MeshDeformer deformer, bool isRigid)
        {
            Vector3[] vertices = mesh.vertices;
            for (int s = 0; s < slices.Length; ++s)
            {
                Slice slice = slices[s];

                Vector3 center = deformer.GetPoint(slice.T, slice.CurveIndex);
                center = deformer.transform.InverseTransformPoint(center);

                Vector3 dir = deformer.transform.InverseTransformVector(deformer.GetDirection(slice.T, slice.CurveIndex));
                float   t   = slice.T;
                if (isRigid)
                {
                    t = 1.0f;
                }

                if (dir == Vector3.zero)
                {
                    continue;
                }


                float   twistAngle    = deformer.GetTwist(t, slice.CurveIndex);
                Vector3 thickness     = deformer.GetThickness(t, slice.CurveIndex);
                float   wrapCurvature = deformer.GetWrap(t, slice.CurveIndex);

                Quaternion rotation = Quaternion.AngleAxis(twistAngle, dir) * Quaternion.LookRotation(dir, m_up) * m_axisRotation;
                Matrix4x4  matrix   = Matrix4x4.TRS(center, rotation, Vector3.one);
                int[]      indices  = slice.Indices;
                for (int i = 0; i < indices.Length; ++i)
                {
                    int     index  = indices[i];
                    Vector3 vertex = vertices[index];
                    vertex          = AxisTransform(deformer, vertex, slice.Center, thickness);
                    vertex          = WrapAroundAxisTransform(deformer, vertex, slice.Center, wrapCurvature);
                    vertex          = matrix.MultiplyPoint(vertex);
                    vertices[index] = vertex;
                }
            }
            return(vertices);
        }
Ejemplo n.º 15
0
    void HandleInput()
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.Deform.Fire(new MeshDeformer.Ops.Deform
                {
                    Point = deformer.transform.InverseTransformPoint(point),
                    Force = force
                });
            }
        }
    }
Ejemplo n.º 16
0
        public void Deform(MeshDeformer deformer, Mesh original, Mesh colliderOriginal, bool isRigid)
        {
            if (original != null)
            {
                if (AltMesh)
                {
                    original = AltMesh;
                }
                m_mesh.vertices = Deform(m_slices, original, deformer, isRigid);
                m_mesh.RecalculateBounds();
            }

            if (colliderOriginal != null && m_collider != null)
            {
                m_colliderMesh.vertices = Deform(m_colliderSlices, colliderOriginal, deformer, isRigid);
                m_colliderMesh.RecalculateBounds();
                m_collider.sharedMesh = null;
                m_collider.sharedMesh = m_colliderMesh;
            }
        }
Ejemplo n.º 17
0
        private void Start()
        {
            if (m_deformer == null)
            {
                m_deformer = GetComponentInParent <MeshDeformer>();
            }

            /*
             #if UNITY_EDITOR
             * //Something strange happening when removing MeshDeformerExt obj and then pressing CTRL+Z. (Can't deform recovered object)
             * //And now I am unable to find good solution.
             * //This needed to fix this behavior...
             * ScaffoldWrapper wrapper = m_deformer.Scaffolds.Where(s => s.ObjInstanceId == InstanceId).FirstOrDefault();
             * if (wrapper != null)
             * {
             *  wrapper.Obj = this;
             * }
             #endif
             */
        }
Ejemplo n.º 18
0
    // Use this for initialization
    void Start()
    {
        meshRenderer = GetComponent <Renderer> ();
        meshFilter   = GetComponent <MeshFilter> ();
        meshDeformer = GetComponent <MeshDeformer> ();

        this.gameObject.layer = FromDimension().layer;

        dimension1.connectedPortals.Add(this);
        dimension2.connectedPortals.Add(this);

        dimension1.showChildrenWithTag(this.ignoreRigidbodyTag);
        dimension2.showChildrenWithTag(this.ignoreRigidbodyTag);

        minimumDeformRangeSquared = maximumDeformRange * maximumDeformRange;

        Vector3 convertedPoint = transform.InverseTransformPoint(mainCamera.transform.position);

        triggerZDirection = (convertedPoint.z > 0);
    }
Ejemplo n.º 19
0
    void HandleInput()
    {
        Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);   // Ray 的数据结构是两个 Vec3,分别是 origin, direction
        //  这里是从 camera 到 a screen point.

        RaycastHit hit;

        // hit 是储存Raycast相关信息的数据结构
        if (Physics.Raycast(inputRay, out hit)) // out 可以让函数传递出多个返回值
        {
            Debug.Log("hit");
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();  // 挂载在 与Ray碰撞的 mesh 上的 deformer
            if (deformer)
            {
                Debug.Log("call deformer");
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;        // 偏移到一个很接近表面的位置
                deformer.AddDeformingForce(point, force); // 调用 Ray 接触点物体的 deformer
            }
        }
    }
Ejemplo n.º 20
0
    void HandlePinchInput(Leap.Unity.PinchDetector detector)
    {
        Debug.Log("Hit something");
        RaycastHit hit;

        if (Physics.Raycast(detector.Position, Vector3.down, out hit, .5f))
        {
            deformer = hit.collider.GetComponent <MeshDeformer> ();
        }
        else if (Physics.Raycast(detector.Position, Vector3.down, out hit, .5f))
        {
            deformer = hit.collider.GetComponent <MeshDeformer> ();
        }

        if (deformer)
        {
            deform           = true;
            originalPosition = detector.Position;
            point            = hit.point;
        }
    }
Ejemplo n.º 21
0
        public static void Fit()
        {
            GameObject selected = Selection.activeObject as GameObject;
            SplineBase spline   = selected.GetComponentInParent <SplineBase>();

            if (spline is MeshDeformer)
            {
                MeshDeformer deformer = (MeshDeformer)spline;
                Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Fit");
                MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(deformer);
            }
            else
            {
                Undo.RecordObject(spline, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(spline);
            }


            spline.Smooth();
        }
Ejemplo n.º 22
0
        public static void Remove()
        {
            GameObject   selected  = Selection.activeObject as GameObject;
            ControlPoint ctrlPoint = selected.GetComponent <ControlPoint>();
            MeshDeformer deformer  = selected.GetComponentInParent <MeshDeformer>();

            Selection.activeGameObject = deformer.gameObject;

            Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Remove");
            MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Remove");

            GameObject removeObject;

            deformer.Remove((ctrlPoint.Index - 1) / 3, out removeObject);
            if (removeObject != null)
            {
                Undo.DestroyObjectImmediate(removeObject);
            }

            EditorUtility.SetDirty(deformer);
        }
        private void OnDrawGizmosSelected()
        {
            MeshDeformer deformer = m_spline as MeshDeformer;

            if (deformer == null)
            {
                return;
            }

            if (Selection.activeGameObject != gameObject)
            {
                return;
            }

            if (!deformer.DrawGizmos)
            {
                return;
            }
            // Display the explosion radius when selected
            Gizmos.color = Color.white;

            ScaffoldWrapper scaffold = deformer.Scaffolds.Where(s => s.CurveIndices.Contains((Index - 1) / 3)).FirstOrDefault();

            if (scaffold != null && !scaffold.IsEmptySpace)
            {
                if (scaffold.Obj != null)
                {
                    MeshFilter filter = scaffold.Obj.GetComponent <MeshFilter>();
                    if (filter != null)
                    {
                        Mesh mesh = filter.sharedMesh;
                        if (mesh != null)
                        {
                            Gizmos.matrix = deformer.transform.localToWorldMatrix;
                            Gizmos.DrawWireMesh(mesh);
                        }
                    }
                }
            }
        }
Ejemplo n.º 24
0
        public static void SetMode(MeshDeformer deformer, ControlPointMode mode, bool isRigid)
        {
            ScaffoldWrapper[] scaffolds = deformer.Scaffolds;
            for (int s = 0; s < scaffolds.Length; ++s)
            {
                ScaffoldWrapper scaffold = scaffolds[s];
                for (int i = 0; i < scaffold.CurveIndices.Length; ++i)
                {
                    int curveIndex = scaffold.CurveIndices[i];
                    if (mode == ControlPointMode.Free)
                    {
                        deformer.SetIsRigid(curveIndex * 3, isRigid);
                    }

                    if (!isRigid)
                    {
                        deformer.SetControlPointMode(curveIndex * 3, mode);
                        deformer.SetControlPointMode(curveIndex * 3 + 3, mode);
                    }
                }
            }
        }
Ejemplo n.º 25
0
        private static Vector3 AxisTransform(MeshDeformer deformer, Vector3 vertex, Vector3 center, Vector3 scale)
        {
            Vector3 toVertex = vertex - center;

            if (deformer.Axis == Axis.X)
            {
                toVertex.x = 0;
                center.x   = vertex.x - center.x;
            }
            else if (deformer.Axis == Axis.Y)
            {
                toVertex.y = 0;
                center.y   = vertex.y - center.y;
            }
            else
            {
                toVertex.z = 0;
                center.z   = vertex.z - center.z;
            }

            return(center + Vector3.Scale(toVertex, scale));
        }
Ejemplo n.º 26
0
    void OnCollisionEnter(Collision col)
    {
        Ray        inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
            }
        }

        if (col.gameObject.name == "Plane")
        {
            Debug.Log("Points colliding: " + col.contacts.Length);
            Debug.Log("First point that collided: " + col.contacts[0].point);
        }
    }
Ejemplo n.º 27
0
    void HandleInput()
    {
        Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit hit;

        if (Physics.Raycast(inputRay, out hit))
        {
            MeshDeformer deformer = hit.collider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = hit.point;
                point += hit.normal * forceOffset;
                deformer.AddDeformingForce(point, force);
                Debug.Log("Force is applied ??");
            }
        }
        else
        {
            Debug.Log("Failed to find Ray collider to tooth. WTF ???????");
        }
    }
Ejemplo n.º 28
0
 public override void Insert()
 {
     if (SplineRuntimeEditor.Instance != null)
     {
         MeshDeformer deformer = SplineRuntimeEditor.Instance.SelectedSpline as MeshDeformer;
         if (deformer != null)
         {
             GameObject selection = RuntimeSelection.activeGameObject;
             if (selection != null)
             {
                 ControlPoint ctrlPoint = selection.GetComponent <ControlPoint>();
                 if (ctrlPoint != null)
                 {
                     deformer.Insert((ctrlPoint.Index + 2) / 3);
                 }
             }
         }
         else
         {
             base.Insert();
         }
     }
 }
Ejemplo n.º 29
0
    private void OnCollisionEnter(Collision collision)
    {
        var contact = collision.GetContact(0);

        if (contact.otherCollider.gameObject.tag == "Sword")
        {
            var stats = contact.otherCollider.gameObject.GetComponent <AttackStats>();
            if (stats && TakingDamageEvent != null)
            {
                TakingDamageEvent(stats.damage);
            }
            bloodSpill.transform.position = contact.point;
            bloodSpill.transform.forward  = contact.normal;
            bloodSpill.Play();
            MeshDeformer deformer = contact.thisCollider.GetComponent <MeshDeformer>();
            if (deformer)
            {
                Vector3 point = contact.point;
                point += contact.normal * forceOffset * -1f;
                deformer.AddDeformingForce(point, force);
            }
        }
    }
 public override void Insert()
 {
     RunAction <SplineBase>((spline, go) =>
     {
         MeshDeformer deformer = spline as MeshDeformer;
         if (deformer != null)
         {
             GameObject selection = RuntimeSelection.activeGameObject;
             if (selection != null)
             {
                 ControlPoint ctrlPoint = selection.GetComponent <ControlPoint>();
                 if (ctrlPoint != null)
                 {
                     deformer.Insert((ctrlPoint.Index + 2) / 3);
                 }
             }
         }
         else
         {
             base.Insert();
         }
     });
 }
Ejemplo n.º 31
0
	void GetMesh () {
        MeshDeformer oldMesh = selectedMesh;
        selectedMesh = null;
        meshMover = null;
        selectedVertex = -1;

        Ray inputRay = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
		RaycastHit hit;
		
		if (Physics.Raycast(inputRay, out hit)) {
            grabPos = hit.point;
			MeshDeformer deformer = hit.collider.GetComponent<MeshDeformer>();
            MoveMesh moveMesh = hit.collider.GetComponent<MoveMesh> ();
			if (deformer) {
				selectedMesh = deformer;
                meshMover = moveMesh;

				MeshFilter mesh = hit.collider.GetComponent<MeshFilter>();
				int[] meshTris = mesh.mesh.triangles;

				selectedVertex = meshTris[hit.triangleIndex*3];
            }
            else if (moveMesh)
            {
                meshMover = moveMesh;
            }
        }

        if (zoomed && selectedMesh != oldMesh)
        {
            if(oldMesh != null)
                oldMesh.DeselectMesh();
            if (selectedMesh != null)
                selectedMesh.SelectMesh(selectedMat);
        }
	}