Beispiel #1
0
    void Awake()
    {
        mesh  = meshFilter.sharedMesh;
        dataA = new SpringData[mesh.vertices.Length];
        for (int i = 0; i < dataA.Length; i++)
        {
            dataA[i].cachedWorldPos = meshFilter.transform.TransformPoint(mesh.vertices[i]);
            dataA[i].cachedVelocity = Vector3.zero;
        }
        dataB = new SpringData[mesh.vertices.Length];
        for (int i = 0; i < dataB.Length; i++)
        {
            dataB[i].cachedWorldPos = meshFilter.transform.TransformPoint(mesh.vertices[i]);
            dataB[i].cachedVelocity = Vector3.zero;
        }
        Graphics.ClearRandomWriteTargets();
        compute_buffer_Alpha = new ComputeBuffer(dataA.Length, sizeof(float) * 6, ComputeBufferType.Default);

        Graphics.SetRandomWriteTarget(1, compute_buffer_Alpha, false);
        material.SetBuffer("_myWriteBuffer", compute_buffer_Alpha);
        compute_buffer_Alpha.SetData(dataA);

        compute_buffer_Beta = new ComputeBuffer(dataB.Length, sizeof(float) * 6, ComputeBufferType.Default);
        Graphics.SetRandomWriteTarget(2, compute_buffer_Beta, false);
        material.SetBuffer("_myReadBuffer", compute_buffer_Beta);
        compute_buffer_Beta.SetData(dataB);
        tempData1 = new SpringData[mesh.vertices.Length];
    }
            public void Execute()
            {
                var mousePickCollector = new MousePickCollector(1.0f, CollisionWorld.Bodies, NumDynamicBodies);

                mousePickCollector.IgnoreTriggers = IgnoreTriggers;

                CollisionWorld.CastRay(RayInput, ref mousePickCollector);
                if (mousePickCollector.MaxFraction < 1.0f)
                {
                    float     fraction = mousePickCollector.Hit.Fraction;
                    RigidBody hitBody  = CollisionWorld.Bodies[mousePickCollector.Hit.RigidBodyIndex];

                    MTransform bodyFromWorld = Inverse(new MTransform(hitBody.WorldFromBody));
                    float3     pointOnBody   = Mul(bodyFromWorld, mousePickCollector.Hit.Position);

                    SpringData[0] = new SpringData
                    {
                        Entity      = hitBody.Entity,
                        Dragging    = 1,
                        PointOnBody = pointOnBody,
                        MouseDepth  = Near + math.dot(math.normalize(RayInput.End - RayInput.Start), Forward) * fraction * k_MaxDistance,
                    };
                }
                else
                {
                    SpringData[0] = new SpringData
                    {
                        Dragging = 0
                    };
                }
            }
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_MouseGroup.CalculateEntityCount() == 0)
            {
                return(inputDeps);
            }

            var handle = JobHandle.CombineDependencies(inputDeps, m_BuildPhysicsWorldSystem.FinalJobHandle);

            if (Input.GetMouseButtonDown(0) && (Camera.main != null))
            {
                Vector2         mousePosition = Input.mousePosition;
                UnityEngine.Ray unityRay      = Camera.main.ScreenPointToRay(mousePosition);

                var mice           = m_MouseGroup.ToComponentDataArray <MousePick>(Allocator.TempJob);
                var IgnoreTriggers = mice[0].IgnoreTriggers != 0;
                mice.Dispose();

                // Schedule picking job, after the collision world has been built
                handle = new Pick
                {
                    CollisionWorld   = m_BuildPhysicsWorldSystem.PhysicsWorld.CollisionWorld,
                    NumDynamicBodies = m_BuildPhysicsWorldSystem.PhysicsWorld.NumDynamicBodies,
                    SpringData       = SpringDatas,
                    RayInput         = new RaycastInput
                    {
                        Start  = unityRay.origin,
                        End    = unityRay.origin + unityRay.direction * k_MaxDistance,
                        Filter = CollisionFilter.Default,
                    },
                    Near           = Camera.main.nearClipPlane,
                    Forward        = Camera.main.transform.forward,
                    IgnoreTriggers = IgnoreTriggers,
                }.Schedule(JobHandle.CombineDependencies(handle, m_BuildPhysicsWorldSystem.FinalJobHandle));

                PickJobHandle = handle;

                handle.Complete(); // TODO.ma figure out how to do this properly...we need a way to make physics sync wait for
                // any user jobs that touch the component data, maybe a JobHandle LastUserJob or something that the user has to set
            }

            if (Input.GetMouseButtonUp(0))
            {
                SpringDatas[0] = new SpringData();
            }

            return(handle);
        }
Beispiel #4
0
    // Start is called before the first frame update
    void Start()
    {
        SpringJoint curSpring = GetComponent <SpringJoint>();

        _spring = new SpringData()
        {
            anchor          = curSpring.anchor,
            connectedAnchor = curSpring.connectedAnchor,
            spring          = curSpring.spring,
            damper          = curSpring.damper
        };
        Destroy(curSpring);
        _trans             = gameObject.transform;
        _rigid             = GetComponent <Rigidbody>();
        _prevConstraints   = _rigid.constraints; // Should be freeze X and Z movement and all rotation
        _rigid.constraints = RigidbodyConstraints.FreezeAll;
        _startingY         = _trans.position.y;
        _bottomY           = _startingY - DownDist;
    }
Beispiel #5
0
            public void Execute()
            {
                float     fraction = 1.0f;
                RigidBody?hitBody  = null;

                var rayCastInput = new RaycastInput {
                    Ray = Ray, Filter = CollisionFilter.Default
                };

                if (CollisionWorld.CastRay(rayCastInput, out RaycastHit hit))
                {
                    if (hit.RigidBodyIndex < NumDynamicBodies)
                    {
                        hitBody  = CollisionWorld.Bodies[hit.RigidBodyIndex];
                        fraction = hit.Fraction;
                    }
                }

                // If there was a hit, set up the spring
                if (hitBody != null)
                {
                    float3     pointInWorld  = (Ray.Origin + Ray.Direction * fraction);
                    MTransform bodyFromWorld = Inverse(new MTransform(hitBody.Value.WorldFromBody));
                    float3     pointOnBody   = Mul(bodyFromWorld, pointInWorld);

                    SpringData[0] = new SpringData
                    {
                        Entity      = hitBody.Value.Entity,
                        Dragging    = 1,
                        PointOnBody = pointOnBody,
                        MouseDepth  = Near + math.dot(math.normalize(Ray.Direction), Forward) * fraction * k_MaxDistance
                    };
                }
                else
                {
                    SpringData[0] = new SpringData
                    {
                        Dragging = 0
                    };
                }
            }
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_MouseGroup.CalculateLength() == 0)
            {
                return(inputDeps);
            }

            var handle = JobHandle.CombineDependencies(inputDeps, m_BuildPhysicsWorldSystem.FinalJobHandle);

            if (Input.GetMouseButtonDown(0) && (Camera.main != null))
            {
                var mice           = m_MouseGroup.ToComponentDataArray <MousePick>(Allocator.TempJob);
                var IgnoreTriggers = mice[0].IgnoreTriggers != 0;
                mice.Dispose();

                // Schedule picking job, after the collision world has been built
                handle = new Pick
                {
                    CollisionWorld   = m_BuildPhysicsWorldSystem.PhysicsWorld.CollisionWorld,
                    NumDynamicBodies = m_BuildPhysicsWorldSystem.PhysicsWorld.NumDynamicBodies,
                    SpringData       = SpringDatas,
                    RayInput         = MousePickBehaviour.CreateRayCastFromMouse(),
                    Near             = Camera.main.nearClipPlane,
                    Forward          = Camera.main.transform.forward,
                    IgnoreTriggers   = IgnoreTriggers,
                }.Schedule(JobHandle.CombineDependencies(handle, m_BuildPhysicsWorldSystem.FinalJobHandle));

                PickJobHandle = handle;

                handle.Complete(); // TODO.ma figure out how to do this properly...we need a way to make physics sync wait for
                // any user jobs that touch the component data, maybe a JobHandle LastUserJob or something that the user has to set
            }

            if (Input.GetMouseButtonUp(0))
            {
                SpringDatas[0] = new SpringData();
            }

            return(handle);
        }
 public MousePickSystem()
 {
     SpringDatas    = new NativeArray <SpringData>(1, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
     SpringDatas[0] = new SpringData();
 }
Beispiel #8
0
            public static bool Prefix(PolyPhysics.SpringAudioListener __instance, FastList <SpringData> ___springDatas)
            {
                int progress = 0;

                try {
                    progress = 1;
                    //if (!shouldRun()) return true;
                    if (___springDatas == null)
                    {
                        return(false);
                    }
                    float fixedDeltaTime = Time.fixedDeltaTime;
                    float b = 0f;
                    progress = 2;
                    if (0 < ___springDatas.Count)
                    {
                        progress = 3;
                        if (___springDatas[0].edge == null || ___springDatas[0].edge?.world?.settings?.deltaTimeForVelocityEdge == null)
                        {
                            return(false);
                        }
                        progress = 4;
                        float deltaTimeForVelocityEdge = ___springDatas[0].edge.world.settings.deltaTimeForVelocityEdge;
                        if (1E-06f < deltaTimeForVelocityEdge)
                        {
                            b = 1f / deltaTimeForVelocityEdge;
                        }
                        progress = 5;
                    }
                    for (int i = 0; i < ___springDatas.Count; i++)
                    {
                        ref SpringData ptr = ref ___springDatas.array[i];
                        progress = 6;
                        //Debug.Log(ptr.edge?.material == null);
                        //if (ptr.edge.material.isRope && ptr.edge.material.isSpring) continue;
                        ptr.timeSinceCompressionLastTriggered += fixedDeltaTime;
                        ptr.timeSinceExpansionLastTriggered   += fixedDeltaTime;
                        progress = 7;
                        Vec2 a = ptr.edge.node1.solverNode.vel - ptr.edge.node0.solverNode.vel;
                        a *= b;
                        Vec2 vec = ptr.edge.node1.solverNode.pos - ptr.edge.node0.solverNode.pos;
                        vec.Normalize();
                        progress = 8;
                        float num = Vec2.Dot(a, vec);
                        if (__instance.ExpandVelocityThresholdToTriggerSound < num && __instance.soundCooldownTime <= ptr.timeSinceExpansionLastTriggered)
                        {
                            ptr.timeSinceExpansionLastTriggered = 0f;
                            Vec2 vec2 = 0.5f * (ptr.edge.node1.solverNode.pos + ptr.edge.node0.solverNode.pos);
                            if (num > 4f)
                            {
                                MasterAudio.PlaySound3DAtVector3AndForget(__instance.expandBig, vec2, 1f, null, 0f, null, null);
                            }
                            else
                            {
                                MasterAudio.PlaySound3DAtVector3AndForget(__instance.expandSmall, vec2, 1f, null, 0f, null, null);
                            }
                            if (__instance.debugLogSounds)
                            {
                                Debug.Log(string.Concat(new object[]
                                {
                                    "Spring Expansion at ",
                                    vec2,
                                    ", speed: ",
                                    num
                                }));
                            }
                            progress = 9;
                        }
                        else if (num < __instance.CompressVelocityThresholdToTriggerSound && __instance.soundCooldownTime <= ptr.timeSinceCompressionLastTriggered)
                        {
                            ptr.timeSinceCompressionLastTriggered = 0f;
                            Vec2 vec3 = 0.5f * (ptr.edge.node1.solverNode.pos + ptr.edge.node0.solverNode.pos);
                            if (num < -4.5f)
                            {
                                MasterAudio.PlaySound3DAtVector3AndForget(__instance.compressBig, vec3, 1f, null, 0f, null, null);
                            }
                            else
                            {
                                MasterAudio.PlaySound3DAtVector3AndForget(__instance.compressSmall, vec3, 1f, null, 0f, null, null);
                            }
                            if (__instance.debugLogSounds)
                            {
                                Debug.Log(string.Concat(new object[]
                                {
                                    "Spring Compression at ",
                                    vec3,
                                    ", speed: ",
                                    num
                                }));
                            }
                        }
                        progress = 10;
                    }
                }
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Vector3 screenPoint = Input.mousePosition;
            screenPoint.z = _camera.transform.position.z;
            Ray        ray = _camera.ScreenPointToRay(screenPoint);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, _camera.focalLength, _mask))
            {
                if (_currentManipulator == null && _releasedManipulators.Count + 1 < ManipulatorManager.MAX_MANIPULATORS)
                {
                    Vector3    pos = _camera.ScreenToWorldPoint(screenPoint);
                    Quaternion rot = Quaternion.LookRotation(Vector3.forward, hit.normal);
                    _currentManipulator = Instantiate <Manipulator>(_moveManipulator, pos, rot);
                    _currentManipulator.gameObject.SetActive(true);
                }
            }

            Debug.DrawRay(ray.origin, ray.direction * 100.0f, hit.transform ? Color.green : Color.red);

            if (_currentManipulator)
            {
                _currentManipulator.handle.position = _camera.ScreenToWorldPoint(screenPoint);

                //scale down handle as you pull farther away
                float maxDistance = _scalePullMaxDistance;
                float t           = math.clamp(math.distancesq(_currentManipulator.handle.position, _currentManipulator.transform.position) / (maxDistance * maxDistance), 0.0f, 1.0f);

                _currentManipulator.handle.localScale = Vector3.one + (Vector3.one * t * _scalePullMultipler);
            }
        }

        if (Input.GetMouseButtonUp(0) && _currentManipulator)
        {
            SpringData springData = new SpringData
            {
                handle         = _currentManipulator.handle,
                origin         = _currentManipulator.transform,
                linearVelocity = Vector3.zero,
                scaleVelocity  = Vector3.zero,
                startTime      = Time.time
            };

            _releasedManipulators.Add(springData);
            _currentManipulator = null;
        }

        for (int i = _releasedManipulators.Count - 1; i >= 0; i--)
        {
            SpringData springData = _releasedManipulators[i];
            if (Time.time > springData.startTime + _springDuration)
            {
                Destroy(_releasedManipulators[i].origin.gameObject);
                _releasedManipulators.RemoveAt(i);
                break;
            }

            _releasedManipulators[i].handle.position   += springData.linearVelocity * Time.deltaTime;
            _releasedManipulators[i].handle.localScale += springData.scaleVelocity * Time.deltaTime;

            Vector3 linearAcceleration = (-_springStrength * (_releasedManipulators[i].handle.position - _releasedManipulators[i].origin.position)) * Time.deltaTime;
            springData.linearVelocity += linearAcceleration;
            springData.linearVelocity *= _springDampening;

            Vector3 scaleAcceleration = (-_springStrength * (_releasedManipulators[i].handle.localScale - Vector3.one)) * Time.deltaTime;
            springData.scaleVelocity += scaleAcceleration;
            springData.scaleVelocity *= _springDampening;

            _releasedManipulators[i] = springData;
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            float slowMotionTime = 0.2f;
            Time.timeScale      = Time.timeScale == slowMotionTime ? 1.0f : slowMotionTime;
            Time.fixedDeltaTime = 0.02F * Time.timeScale;
        }
    }