private void FixedUpdate()
 {
     if (rb && rb.position != lastRbPosition)
     {
         // Some system didnt set position thru FloatingOriginTransform, probably Unity physics, lets compensate for it
         bigPosition    = VisualSceneOrigin + rb.position;
         lastRbPosition = rb.position;
     }
 }
    // mass in g of air/atmosphere per m^3 at position, can be used to calculate drag
    public float GetAirDensityAt(BigPosition position)
    {
        var p = ProceduralPlanets.main.GetClosestPlanet(position);

        if (p == null)
        {
            return(0);
        }

        var d = BigPosition.Distance(position, p.BigPosition);

        return(p.GetGravityAtDistanceFromCenter(d));
    }
    public Vector3 GetGravityAt(BigPosition position)
    {
        var p = ProceduralPlanets.main.GetClosestPlanet(position);

        if (p == null)
        {
            return(Vector3.zero);
        }

        var d = BigPosition.Distance(position, p.BigPosition);
        var v = (p.BigPosition - position).normalized;

        return(p.GetGravityAtDistanceFromCenter(d) * v.ToVector3());
    }
    public Planet GetClosestPlanet(BigPosition position)
    {
        Planet closestPlanet   = null;
        var    closestDistance = double.MaxValue;

        foreach (var p in allPlanets)
        {
            var d = BigPosition.Distance(p.BigPosition, position) - p.planetConfig.radiusStart;
            if (d < closestDistance)
            {
                closestDistance = d;
                closestPlanet   = p;
            }
        }
        return(closestPlanet);
    }
示例#5
0
    private float GetSizeOnScreen(Planet.PointOfInterest data)
    {
        var myPos            = rangePosToCalculateScreenSizeOn_localToPlanet.CenterPos + planet.BigPosition;
        var distanceToCamera = BigPosition.Distance(myPos, data.pos);

        // TODO: this is world space, doesnt take into consideration rotation, not good,
        // but we dont care about rotation, we want to have correct detail even if we are looking at chunk from side?
        var sphere           = rangePosToCalculateScreenSizeOn_localToPlanet.ToBoundingSphere();
        var radiusWorldSpace = sphere.radius;
        var fov = data.fieldOfView;
        var cot = 1.0 / Mathf.Tan(fov / 2f * Mathf.Deg2Rad);
        var radiusCameraSpace = radiusWorldSpace * cot / distanceToCamera;

        lastDistanceToCamera = distanceToCamera;
        lastRadiusWorldSpace = radiusWorldSpace;

        return((float)radiusCameraSpace);
    }
    private void FixedUpdate()
    {
        if (this.transform.position.sqrMagnitude > 1000 * 1000)
        {
            MyProfiler.BeginSample("Floating origin / scene origin changed");

            var worldPosDelta = new BigPosition(transform.position).KeepOnlySectorPos();
            VisualSceneOrigin       += worldPosDelta;
            this.transform.position -= worldPosDelta;

            foreach (var i in floatingTransforms)
            {
                i.SceneOriginChanged(VisualSceneOrigin);
            }

            MyProfiler.EndSample();
        }
    }
示例#7
0
    public void AddCrater(BigPosition bigPosition, float radius)
    {
        var planetLocalPos = this.BigPosition.Towards(bigPosition).ToVector3();

        craters.cpuBuffer[craters.nextIndex] = new Vector4(planetLocalPos.x, planetLocalPos.y, planetLocalPos.z, radius);
        ++craters.nextIndex;
        if (craters.nextIndex >= craters.cpuBuffer.Length)
        {
            craters.nextIndex = 0;
        }
        craters.gpuBuffer.SetData(craters.cpuBuffer);

        foreach (var c in CollectAllChunks())
        {
            var s = c.rangePosToCalculateScreenSizeOn_localToPlanet.ToBoundingSphere();
            if (Vector3.Distance(s.center, planetLocalPos) < s.radius + radius)
            {
                c.MarkForRefresh();
            }
        }
    }
 public void SceneOriginChanged(BigPosition newSceneOrigin)
 {
     transform.position = bigPosition - newSceneOrigin;
 }
示例#9
0
    void UpdatePosition(float deltaTime)
    {
        var rotation = transform.rotation;
        var position = transform.position;
        var rb       = GetComponent <Rigidbody>();

        if (rb)
        {
            rotation = rb.rotation;
            position = rb.position;
        }

        if (Input.GetKeyDown(KeyCode.F5))
        {
            savedPosition1 = position;
            savedRotation1 = rotation;
        }
        if (Input.GetKeyDown(KeyCode.F6))
        {
            position = transform.position = savedPosition1;
            rotation = transform.rotation = savedRotation1;
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            savedPosition2 = position;
            savedRotation2 = rotation;
        }
        if (Input.GetKeyDown(KeyCode.F8))
        {
            position = transform.position = savedPosition2;
            rotation = transform.rotation = savedRotation2;
        }


        if (Input.GetKeyDown(KeyCode.G))
        {
            walkOnPlanet = !walkOnPlanet;
        }

        if (Input.GetKeyDown(KeyCode.T))
        {
            MoveToClosestPlanetSurface();
        }


        var mouseDelta = Vector2.zero;

        if (!Cursor.visible)
        {
            mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        }

        var scrollWheelDelta = Input.mouseScrollDelta.y;

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            /*if (Scene.Engine.WindowState == WindowState.Fullscreen)
             * {
             *      Scene.Engine.WindowState = WindowState.Normal;
             * }
             * else*/
            if (!Cursor.visible)
            {
                Cursor.lockState = CursorLockMode.None;
                Cursor.visible   = true;
            }
            else
            {
                Application.Quit();
            }
        }

        if (Input.GetMouseButtonDown(0))
        {
            if (Cursor.visible)
            {
                Cursor.lockState = CursorLockMode.Locked;
                Cursor.visible   = false;
            }
        }

        var planet = ProceduralPlanets.main.GetClosestPlanet(floatingOrigin.BigPosition);

        if (planet != null)
        {
            if (Input.GetKeyDown(KeyCode.F))
            {
                RaycastHit hit;
                if (Physics.Raycast(this.transform.position + this.transform.forward * 5, this.transform.forward, out hit, 100000.0f))
                {
                    BigPosition bigPosition = hit.point + FloatingOriginCamera.main.VisualSceneOrigin;
                    planet.AddCrater(bigPosition, Random.Range(hit.distance * 0.3f, hit.distance * 0.5f));
                }
            }

            {
                RaycastHit hit;
                if (Physics.Raycast(position, planet.Center - position, out hit, planet.planetConfig.radiusStart, ~LayerMask.GetMask("Ignore Raycast")))
                {
                    distanceToClosestPlanet = Vector3.Distance(hit.point, position);
                }
            }

            if (Input.GetKeyDown(KeyCode.R))
            {
                planet.markedForRegeneration = true;
            }
        }
        else
        {
            distanceToClosestPlanet = float.MaxValue;
        }

        //if (Cursor.lockState)
        {
            if (scrollWheelDelta > 0)
            {
                cameraSpeedModifier *= 1.3f;
            }
            if (scrollWheelDelta < 0)
            {
                cameraSpeedModifier /= 1.3f;
            }
            cameraSpeedModifier = Mathf.Clamp(cameraSpeedModifier, 1, 100000);

            float currentSpeed = cameraSpeedModifier;

            if (!walkOnPlanet && speedBasedOnDistanceToPlanet)
            {
                var s = Mathf.Clamp(distanceToClosestPlanet, 1, 30000);
                var planetSpeedModifier = (1 + (float)s / 5.0f);
                currentSpeed *= planetSpeedModifier;
            }

            if (Input.GetKey(KeyCode.LeftShift))
            {
                currentSpeed *= 5;
            }

            var targetForce = Vector3.zero;
            targetForce += Vector3.forward * Input.GetAxis("Vertical");
            targetForce += Vector3.right * Input.GetAxis("Horizontal");
            if (Input.GetKey(KeyCode.Space))
            {
                targetForce += Vector3.up;
            }
            if (Input.GetKey(KeyCode.LeftControl))
            {
                targetForce -= Vector3.up;
            }

            if (walkOnPlanet && distanceToClosestPlanet > 2.5f)
            {
                currentSpeed *= 0.1f;
            }

            targetForce = targetForce.normalized * currentSpeed;

            float pitchDelta = 0;
            float yawDelta   = 0;
            float rollDelta  = 0;

            float c = mouseSensitivty * (float)deltaTime;
            yawDelta   += mouseDelta.x * c;
            pitchDelta -= mouseDelta.y * c;
            if (Input.GetKey(KeyCode.Q))
            {
                rollDelta += c;
            }
            if (Input.GetKey(KeyCode.E))
            {
                rollDelta -= c;
            }


            if (planet != null && Input.GetKeyDown(KeyCode.C))
            {
                rotation = Quaternion.LookRotation(planet.Center - position);
            }

            if (planet != null && walkOnPlanet)
            {
                var up      = (position - planet.Center).normalized;
                var forward = walkOnPlanet_lastForward;

                if (walkOnPlanet_isFirstRun)
                {
                    walkOnPlanet_lastUp = up;

                    var pointOnPlanet = position - planet.Center;
                    forward = rotation * Vector3.forward;
                }
                else
                {
                    var upDeltaAngle = Vector3.Angle(up, walkOnPlanet_lastUp);
                    var upDeltaRot   = Quaternion.Inverse(Quaternion.AngleAxis(upDeltaAngle, Vector3.Cross(up, walkOnPlanet_lastUp)));

                    forward = upDeltaRot * forward;
                }


                var left = Vector3.Cross(up, forward);

                var rotDelta = Quaternion.identity;

                rotDelta = rotDelta * Quaternion.AngleAxis(pitchDelta, left);
                forward  = Quaternion.AngleAxis(pitchDelta, left) * forward;

                if (walkOnPlanet_clampUpDownRotation)
                {
                    // clamping up down rotation
                    var maxUpDownAngle = 80;
                    var minUp          = 90 - maxUpDownAngle;
                    var maxDown        = 90 + maxUpDownAngle;
                    var angle          = Vector3.Angle(forward, up);
                    if (angle < minUp)
                    {
                        forward = Quaternion.AngleAxis(minUp, left) * up;
                    }
                    else if (angle > maxDown)
                    {
                        forward = Quaternion.AngleAxis(maxDown, left) * up;
                    }
                }

                rotDelta = rotDelta * Quaternion.AngleAxis(yawDelta, up);
                forward  = Quaternion.AngleAxis(yawDelta, up) * forward;

                forward.Normalize();

                rotation = Quaternion.LookRotation(forward, up);

                walkOnPlanet_lastForward = forward;
                walkOnPlanet_lastUp      = up;
                walkOnPlanet_isFirstRun  = false;
            }
            else
            {
                var rotDelta =
                    Quaternion.AngleAxis(pitchDelta, new Vector3(1, 0, 0)) *
                    Quaternion.AngleAxis(yawDelta, new Vector3(0, 1, 0)) *
                    Quaternion.AngleAxis(rollDelta, new Vector3(0, 0, 1));

                rotation = rotation * rotDelta;

                walkOnPlanet_isFirstRun = true;
            }


            targetForce = rotation * targetForce;

            if (rb)
            {
                // change friction based on whether we want to move or not
                var targetFriction = 1;
                if (targetForce.sqrMagnitude > 0)
                {
                    targetFriction = 0;
                }
                physicMaterial.dynamicFriction = targetFriction;
                physicMaterial.staticFriction  = targetFriction;

                rb.AddForce(targetForce * deltaTime, ForceMode.VelocityChange);
                rb.MoveRotation(rotation);

                //rb.drag = Mathf.InverseLerp(100, 10, distanceToClosestPlanet); // change "air density" based on distance to planet
            }
            else             // UNTESTED
            {
                currentVelocity += targetForce * velocityChangeSpeed * (float)deltaTime;
                currentVelocity  = Vector3.Lerp(currentVelocity, Vector3.zero, (float)deltaTime);
                position        += currentVelocity * (float)deltaTime;
                SetPosRot(position, rotation);
            }



            // light toggle
            if (Input.GetKeyDown(KeyCode.L))
            {
                foreach (var l in GetComponentsInChildren <Light>())
                {
                    l.enabled = !l.enabled;
                }
            }
        }
    }