void Update() { // Update weather if context changes if (WeatherType != _currentWeatherType || playerEnterExit.IsPlayerInside != isInside || PlayerGps.ClimateSettings.ClimateType != currentClimateType) { isInside = playerEnterExit.IsPlayerInside; currentClimateType = PlayerGps.ClimateSettings.ClimateType; _currentWeatherType = WeatherType; SetWeather(); } }
private void ApplyMaterials(bool force, int[] dungeonTextureTable = null) { if (Materials == null || Materials.Length == 0) { return; } try { var meshRenderer = GetComponent <MeshRenderer>(); if (!meshRenderer) { Debug.LogErrorFormat("Failed to find MeshRenderer on {0}.", name); return; } DFLocation.ClimateBaseType climateBaseType = GameManager.Instance.PlayerGPS.ClimateSettings.ClimateType; ClimateBases climate = ClimateSwaps.FromAPIClimateBase(climateBaseType); ClimateSeason season = DaggerfallUnity.Instance.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter ? ClimateSeason.Winter : ClimateSeason.Summer; Material[] materials = meshRenderer.sharedMaterials; for (int i = 0; i < Materials.Length; i++) { int index = Materials[i].Index; if (!force && materials[index]) { Debug.LogWarningFormat("A runtime material is being assigned to {0} (index {1}) but current material is not equal to null." + " Make sure you are not including unnecessary auto-generated materials.", meshRenderer.name, i); } materials[index] = GetMaterial(Materials[i], climateBaseType, climate, season, dungeonTextureTable); if (!materials[index]) { Debug.LogErrorFormat("Failed to find material for {0} (index {1}).", meshRenderer.name, i); } } meshRenderer.sharedMaterials = materials; } catch (Exception e) { Debug.LogException(e); } finally { hasAppliedMaterials = true; } }
private Material GetMaterial(RuntimeMaterial runtimeMaterial, DFLocation.ClimateBaseType climateBaseType, ClimateBases climate, ClimateSeason season, int[] dungeonTextureTable) { int archive = runtimeMaterial.Archive; int record = runtimeMaterial.Record; if (dungeonTextureTable != null) { archive = DungeonTextureTables.ApplyTextureTable(archive, dungeonTextureTable, climateBaseType); } else if (runtimeMaterial.ApplyClimate) { archive = ClimateSwaps.ApplyClimate(archive, record, climate, season); } return(DaggerfallUnity.Instance.MaterialReader.GetMaterial(archive, record)); }
/// <summary> /// Gets filename of texture archive for climate texture set. /// </summary> /// <param name="Climate">Climate type.</param> /// <param name="Set">Texture set type.</param> /// <param name="Weather">Weather type.</param> /// <returns>Filename of texture archive.</returns> static public string GetClimateTextureFileName(DFLocation.ClimateBaseType Climate, DFLocation.ClimateTextureSet Set, DFLocation.ClimateWeather Weather) { // Get base int index = (int)Climate; // Adjust for set index += (int)Set; // TODO: Enforce weather constraints against ClimateSet // Adjust for weather index += (int)Weather; // Return filename return(string.Format("TEXTURE.{0:000}", index)); }
/// <summary> /// Convert API climate base over to DaggerfallUnity equivalent. /// </summary> /// <param name="climate">DFLocation.ClimateBaseType.</param> /// <returns>ClimateBases.</returns> public static ClimateBases FromAPIClimateBase(DFLocation.ClimateBaseType climate) { switch (climate) { case DFLocation.ClimateBaseType.Desert: return(ClimateBases.Desert); case DFLocation.ClimateBaseType.Mountain: return(ClimateBases.Mountain); case DFLocation.ClimateBaseType.Temperate: return(ClimateBases.Temperate); case DFLocation.ClimateBaseType.Swamp: return(ClimateBases.Swamp); default: return(ClimateBases.Temperate); } }
void Update() { // Update weather if context changes if (WeatherType != currentWeatherType || playerEnterExit.IsPlayerInside != isInside || playerGPS.ClimateSettings.ClimateType != currentClimateType) { isInside = playerEnterExit.IsPlayerInside; currentClimateType = playerGPS.ClimateSettings.ClimateType; currentWeatherType = WeatherType; SetWeather(); } }