Beispiel #1
0
        private void OnSimulationPre()
        {
            if (ConstraintGameObject == null && m_lineGeometry.isEnabled())
            {
                var geometryContacts = new agxCollide.GeometryContactPtrVector();
                var numContacts      = GetSimulation().getSpace().getGeometryContacts(geometryContacts, m_lineGeometry);
                if (numContacts > 0)
                {
                    var ray                    = m_camera.ScreenPointToRay(Input.mousePosition);
                    var rayHandedOrigin        = ray.origin.ToHandedVec3();
                    var closestGeometryContact = geometryContacts[0];
                    var closestDistance2       = rayHandedOrigin.distance2(closestGeometryContact.points().at(0).point);
                    for (int i = 1; i < geometryContacts.Count; ++i)
                    {
                        var gc        = geometryContacts[i];
                        var distance2 = rayHandedOrigin.distance2(gc.points().at(0).point);
                        if (distance2 < closestDistance2)
                        {
                            closestDistance2       = distance2;
                            closestGeometryContact = gc;
                        }
                    }

                    var       raycastBody = closestGeometryContact.rigidBody(0);
                    RigidBody body        = null;
                    if (raycastBody != null && raycastBody.getMotionControl() == agx.RigidBody.MotionControl.DYNAMICS)
                    {
                        var bodies = FindObjectsOfType <RigidBody>();
                        for (int i = 0; body == null && i < bodies.Length; ++i)
                        {
                            if (bodies[i].Native != null && bodies[i].Native.getUuid().str() == raycastBody.getUuid().str())
                            {
                                body = bodies[i];
                            }
                        }
                    }

                    ConstraintGameObject = TryCreateConstraint(closestGeometryContact.points().at(0).point.ToHandedVector3(),
                                                               body,
                                                               MouseButtonToDofTypes(m_mouseButtonState.ButtonDown),
                                                               "PickHandlerConstraint");

                    if (ConstraintGameObject != null)
                    {
                        ConstraintGameObject.AddComponent <Rendering.PickHandlerRenderer>();
                        Constraint.DrawGizmosEnable = false;
                        m_distanceFromCamera        = FindDistanceFromCamera(m_camera,
                                                                             Constraint.AttachmentPair.ReferenceFrame.Position);
                    }

                    m_lineGeometry.setEnable(false);
                }
            }
        }
Beispiel #2
0
        private void OnPreStepForwardCallback()
        {
            if (m_camera == null)
            {
                return;
            }

            if (ConstraintGameObject == null && Input.GetKey(TriggerKey) && m_mouseButtonState.ButtonDown != MouseButton.None)
            {
                Ray ray = m_camera.ScreenPointToRay(Input.mousePosition);
                List <BroadPhaseResult> results = FindRayBoundingVolumeOverlaps(ray);
                if (results.Count > 0)
                {
                    ConstraintGameObject = TryCreateConstraint(ray,
                                                               results[0].GameObject,
                                                               MouseButtonToDofTypes(m_mouseButtonState.ButtonDown),
                                                               "PickHandlerConstraint");
                    if (ConstraintGameObject != null)
                    {
                        ConstraintGameObject.AddComponent <Rendering.PickHandlerRenderer>();
                        Constraint.DrawGizmosEnable = false;
                        m_distanceFromCamera        = FindDistanceFromCamera(m_camera,
                                                                             Constraint.AttachmentPair.ReferenceFrame.Position);
                    }
                }

                m_mouseButtonState.Use(m_mouseButtonState.ButtonDown, buttonUp =>
                {
                    if (ConstraintGameObject != null)
                    {
                        DestroyImmediate(ConstraintGameObject);
                        ConstraintGameObject = null;
                        m_distanceFromCamera = -1f;
                    }
                });
            }

            if (ConstraintGameObject != null)
            {
                Constraint.AttachmentPair.ConnectedFrame.Position = m_camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,
                                                                                                            Input.mousePosition.y,
                                                                                                            m_distanceFromCamera));

                SetComplianceDamping(Constraint);

                ConstraintGameObject.GetComponent <Rendering.PickHandlerRenderer>().ThisMethodIsntAllowedToBeNamedUpdateByUnity(Constraint);
            }
        }
Beispiel #3
0
        private void OnPreStepForwardCallback()
        {
            // Trigger key + mouse button down and we enable the line geometry
            // here - similar to preCollide. In pre-step event if the line
            // geometry is enabled, collect geometry contacts with our line
            // and create constraint with the closest point.

            if (m_camera == null)
            {
                return;
            }

            if (ConstraintGameObject == null && Input.GetKey(TriggerKey) && m_mouseButtonState.ButtonDown != MouseButton.None)
            {
                var ray = m_camera.ScreenPointToRay(Input.mousePosition);
                m_lineShape.set(ray.origin.ToHandedVec3(), ray.GetPoint(5000.0f).ToHandedVec3());
                m_lineGeometry.setEnable(true);

                m_mouseButtonState.Use(m_mouseButtonState.ButtonDown, buttonUp =>
                {
                    if (ConstraintGameObject != null)
                    {
                        DestroyImmediate(ConstraintGameObject);
                        ConstraintGameObject = null;
                        m_distanceFromCamera = -1f;
                    }
                    m_lineGeometry.setEnable(false);
                });
            }

            if (ConstraintGameObject != null)
            {
                Constraint.AttachmentPair.ConnectedFrame.Position = m_camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,
                                                                                                            Input.mousePosition.y,
                                                                                                            m_distanceFromCamera));

                SetComplianceDamping(Constraint);

                ConstraintGameObject.GetComponent <Rendering.PickHandlerRenderer>().ThisMethodIsntAllowedToBeNamedUpdateByUnity(Constraint, m_camera);
            }
        }