Exemplo n.º 1
0
    private Gradient GetGradient(string section, string key)
    {
        var gradient  = new Gradient();
        var colorKeys = new List <GradientColorKey>();

        // All times are normalized from 0-1, where 0 = midnight, 0.5 = midday, then 1 = midnight again
        var transitionDelta = IniManager.GetFloat(section, "Transition Delta");

        // Transition delta is said to be in realtime, but lets make it independant of current time scale
        var secondsPerDay = (60 * 60 * 24) / 30;         // 2880, number of realtime seconds in a MW day

        transitionDelta = (1f / transitionDelta) / secondsPerDay;

        var sunriseColor = IniManager.GetColor(section, $"{key} Sunrise Color");
        var dayColor     = IniManager.GetColor(section, $"{key} Day Color");
        var nightColor   = IniManager.GetColor(section, $"{key} Night Color");
        var sunsetColor  = IniManager.GetColor(section, $"{key} Sunset Color");

        // Sunrise
        var sunriseTime     = IniManager.GetFloat("Weather", "Sunrise Time") / 24;
        var sunriseDuration = IniManager.GetFloat("Weather", "Sunrise Duration") / 24;
        var preSunriseTime  = IniManager.GetFloat("Weather", $"{key} Pre-Sunrise Time") / 24;
        var postSunriseTime = IniManager.GetFloat("Weather", $"{key} Post-Sunrise Time") / 24;

        // Night/Sunrise/Day transition
        var sunriseStart = sunriseTime - preSunriseTime;
        var sunriseStop  = sunriseTime + sunriseDuration + postSunriseTime;

        colorKeys.Add(new GradientColorKey(nightColor, sunriseStart));
        colorKeys.Add(new GradientColorKey(sunriseColor, sunriseStart + transitionDelta));

        colorKeys.Add(new GradientColorKey(sunriseColor, sunriseStop));
        colorKeys.Add(new GradientColorKey(dayColor, sunriseStop + transitionDelta));

        // Day/sunset/night transition
        var sunsetTime     = IniManager.GetFloat("Weather", "Sunset Time") / 24;
        var sunsetDuration = IniManager.GetFloat("Weather", "Sunset Duration") / 24;
        var preSunsetTime  = IniManager.GetFloat("Weather", $"{key} Pre-Sunset Time") / 24;
        var postSunsetTime = IniManager.GetFloat("Weather", $"{key} Post-Sunset Time") / 24;

        var sunsetStart = sunsetTime - preSunsetTime;
        var sunsetStop  = sunsetTime + sunsetDuration + postSunsetTime;

        colorKeys.Add(new GradientColorKey(dayColor, sunsetStart));
        colorKeys.Add(new GradientColorKey(sunsetColor, sunsetStart + transitionDelta));

        colorKeys.Add(new GradientColorKey(sunsetColor, sunsetStop));
        colorKeys.Add(new GradientColorKey(nightColor, sunsetStop + transitionDelta));

        gradient.colorKeys = colorKeys.ToArray();
        return(gradient);
    }
Exemplo n.º 2
0
    private void Awake()
    {
        Camera.onPreCull += OnCameraPreCull;
        CellManager.OnFinishedLoadingCells += SwitchCell;

        // Night Sky
        //var nightNif = new Nif.NiFile(nightSkyPath);
        //var nightGo = nightNif.CreateGameObject();

        //nightCommandBuffer = new CommandBuffer();
        //var nightMeshes = nightGo.GetComponentsInChildren<MeshFilter>();
        //var nightMeshRenderers = nightGo.GetComponentsInChildren<MeshRenderer>();
        //for (var i = 0; i < nightMeshes.Length; i++)
        //{
        //	if (i > 3)
        //		continue;

        //	var material = nightMeshRenderers[i].sharedMaterial;
        //	material.shader = MaterialManager.Instance.NightSkyShader;

        //	var mesh = nightMeshes[i].sharedMesh;
        //	nightCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material);
        //}

        //Camera.main.AddCommandBuffer(CameraEvent.AfterForwardOpaque, nightCommandBuffer);
        //Destroy(nightGo);

        // Load skybox
        var reader = BsaFileReader.LoadArchiveFileData($"meshes\\{skyboxPath}");
        var nif    = new Nif.NiFile(reader);
        var go     = nif.CreateGameObject(Camera.main.transform);

        var renderer = go.GetComponentInChildren <Renderer>();

        skyboxMaterial = new Material(MaterialManager.Instance.SkyShader);
        //var skyCommandBuffer = new CommandBuffer();
        skyboxMesh = go.GetComponentInChildren <MeshFilter>().sharedMesh;
        //skyCommandBuffer.DrawMesh(skyboxMesh, Matrix4x4.TRS(new Vector3(0, -15, 0), Quaternion.identity, Vector3.one), skyboxMaterial);

        //Camera.main.AddCommandBuffer(CameraEvent.BeforeSkybox, skyCommandBuffer);
        if (!Application.isPlaying)
        {
            DestroyImmediate(go);
        }
        else
        {
            Destroy(go);
        }

        minimumTimeBetweenEnvironmentalSounds = IniManager.GetFloat("Weather", "Minimum Time Between Environmental Sounds");
        maximumTimeBetweenEnvironmentalSounds = IniManager.GetFloat("Weather", "Maximum Time Between Environmental Sounds");
    }
Exemplo n.º 3
0
    public void Create(WeatherType weatherType, Material material)
    {
        var section = $"Weather {weatherType}";

        // Create the gradients
        skyGradient     = GetGradient(section, "Sky");
        fogGradient     = GetGradient(section, "Fog");
        ambientGradient = GetGradient(section, "Ambient");
        sunGradient     = GetGradient(section, "Sun");

        // Sky needs alpha keys for fading to night sky too
        skyGradient.alphaKeys = new GradientAlphaKey[]
        {
            new GradientAlphaKey(1, 19f / 24f),
            new GradientAlphaKey(0, 21f / 24f),
            new GradientAlphaKey(0, 4f / 24f),
            new GradientAlphaKey(1, 6f / 24f)
        };

        // Based on the following settings, plus sunrise/sunset times
        //Stars Post - Sunset Start = 1
        //Stars Pre-Sunrise Finish = 2
        //Stars Fading Duration = 2

        // Initializing some settings
        cloudTexture         = BsaFileReader.LoadTexture("textures/" + IniManager.GetString(section, "Cloud Texture")) as Texture2D;
        material.mainTexture = cloudTexture;

        RenderSettings.sun.transform.eulerAngles = new Vector3(90, 270, 0);
        RenderSettings.sun.shadows = LightShadows.Soft;

        RenderSettings.ambientMode = AmbientMode.Flat;

        RenderSettings.fog     = true;
        RenderSettings.fogMode = FogMode.Linear;

        RenderSettings.fogEndDistance   = Camera.main.farClipPlane;
        RenderSettings.fogStartDistance = RenderSettings.fogEndDistance * (1 - IniManager.GetFloat(section, $"Land Fog Day Depth"));
    }