Beispiel #1
0
        private void ApplyTimeAndSpace()
        {
            // Get season and weather
            if (dfUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter)
            {
                CurrentSeason = ClimateSeason.Winter;
            }
            else
            {
                CurrentSeason = ClimateSeason.Summer;
            }

            // Set windows
            if (dfUnity.WorldTime.Now.IsCityLightsOn)
            {
                WindowTextureStyle = WindowStyle.Night;
            }
            else
            {
                WindowTextureStyle = WindowStyle.Day;
            }

            // Apply changes
            ApplyClimateSettings();
        }
Beispiel #2
0
        /// <summary>
        /// Set ground climate.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="climate">Climate to set.</param>
        /// <param name="season">Season to set.</param>
        public void SetClimate(DaggerfallUnity dfUnity, ClimateBases climate, ClimateSeason season)
        {
            int archive = ClimateSwaps.GetGroundArchive(climate, season);

            SetClimate(dfUnity, archive, season);
            summary.climate = climate;
        }
        public static void AddNatureFlats(
            DaggerfallUnity dfUnity,
            ref DFBlock blockData,
            Transform parent = null,
            ClimateNatureSets climateNature = ClimateNatureSets.SubTropical,
            ClimateSeason climateSeason     = ClimateSeason.Summer)
        {
            int archive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);

            // Add block scenery
            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    // Get scenery item
                    DFBlock.RmbGroundScenery scenery = blockData.RmbBlock.FldHeader.GroundData.GroundScenery[x, 15 - y];

                    // Ignore 0 as this appears to be a marker/waypoint of some kind
                    if (scenery.TextureRecord > 0)
                    {
                        // Spawn billboard gameobject
                        GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(archive, scenery.TextureRecord, parent);
                        Vector3    billboardPosition = new Vector3(
                            x * BlocksFile.TileDimension,
                            NatureFlatsOffsetY,
                            y * BlocksFile.TileDimension + BlocksFile.TileDimension) * MeshReader.GlobalScale;

                        // Set transform
                        go.transform.position = billboardPosition;
                    }
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Get a new Material based on climate.
        /// </summary>
        /// <param name="key">Material key.</param>
        /// <param name="climate">New climate base.</param>
        /// <param name="season">New season.</param>
        /// <param name="windowStyle">New window style.</param>
        /// <returns>New material.</returns>
        public Material ChangeClimate(int key, ClimateBases climate, ClimateSeason season, WindowStyle windowStyle)
        {
            // Ready check
            if (!IsReady)
            {
                return(null);
            }

            // Reverse key and apply climate
            int archive, record, frame;

            ReverseTextureKey(key, out archive, out record, out frame);
            archive = ClimateSwaps.ApplyClimate(archive, record, climate, season);

            // Get new material
            Material       material;
            CachedMaterial cm = GetMaterialFromCache(archive, record, out material);

            // Handle windows
            if (cm.isWindow)
            {
                ChangeWindowEmissionColor(material, windowStyle);
            }

            return(material);
        }
Beispiel #5
0
        public void SetLocation(DFLocation location, bool performLayout = true)
        {
            if (!ReadyCheck())
            {
                return;
            }

            // Validate
            if (this.isSet)
            {
                throw new Exception("This location has already been set.");
            }
            if (!location.Loaded)
            {
                throw new Exception("DFLocation not loaded.");
            }

            // Set summary
            summary           = new LocationSummary();
            summary.MapID     = location.MapTableData.MapId;
            summary.Longitude = (int)location.MapTableData.Longitude;
            summary.Latitude  = (int)location.MapTableData.Latitude;
            DFPosition mapPixel   = MapsFile.LongitudeLatitudeToMapPixel(summary.Longitude, summary.Latitude);
            DFPosition worldCoord = MapsFile.MapPixelToWorldCoord(mapPixel.X, mapPixel.Y);

            summary.MapPixelX      = mapPixel.X;
            summary.MapPixelY      = mapPixel.Y;
            summary.WorldCoordX    = worldCoord.X;
            summary.WorldCoordZ    = worldCoord.Y;
            summary.RegionName     = location.RegionName;
            summary.LocationName   = location.Name;
            summary.WorldClimate   = (MapsFile.Climates)location.Climate.WorldClimate;
            summary.LocationType   = location.MapTableData.LocationType;
            summary.DungeonType    = location.MapTableData.DungeonType;
            summary.HasDungeon     = location.HasDungeon;
            summary.Climate        = ClimateSwaps.FromAPIClimateBase(location.Climate.ClimateType);
            summary.Nature         = ClimateSwaps.FromAPITextureSet(location.Climate.NatureSet);
            summary.SkyBase        = location.Climate.SkyBase;
            summary.BlockWidth     = location.Exterior.ExteriorData.Width;
            summary.BlockHeight    = location.Exterior.ExteriorData.Height;
            summary.LegacyLocation = location;

            // Assign starting climate
            CurrentSeason    = ClimateSeason.Summer;
            CurrentClimate   = summary.Climate;
            CurrentNatureSet = summary.Nature;

            // Perform layout
            if (performLayout)
            {
                LayoutLocation(ref location);
                ApplyClimateSettings();
            }

            // Set location rect
            SetLocationRect();

            // Seal location
            isSet = true;
        }
        /// <summary>
        /// Rebuild materials back to default with no climate modifier.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="climate">Climate to set.</param>
        /// <param name="season">Season to set.</param>
        /// <param name="windowStyle">Style of window to set.</param>
        public void SetClimate(ClimateBases climate, ClimateSeason season, WindowStyle windowStyle)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (defaultTextures.Count == 0)
            {
                return;
            }

            // Get new material array
            Material[] materials = new Material[defaultTextures.Count];
            for (int i = 0; i < defaultTextures.Count; i++)
            {
                materials[i] = dfUnity.MaterialReader.ChangeClimate(defaultTextures[i], climate, season, windowStyle);
            }

            // Assign material array
            if (materials != null)
            {
                GetComponent <MeshRenderer>().sharedMaterials = materials;
            }

            // Store climate settings
            currentClimate     = climate;
            currentSeason      = season;
            currentWindowStyle = windowStyle;
        }
        private void ApplyTimeAndSpace()
        {
            // TODO: Handle setting appropriate textures for weather

            // Get season and weather
            if (dfUnity.WorldTime.SeasonValue == WorldTime.Seasons.Winter)
            {
                CurrentSeason = ClimateSeason.Winter;
            }
            else
            {
                CurrentSeason = ClimateSeason.Summer;
            }

            // Set windows
            if (dfUnity.WorldTime.CityLightsOn)
            {
                WindowTextureStyle = WindowStyle.Night;
            }
            else
            {
                WindowTextureStyle = WindowStyle.Day;
            }

            // Apply changes
            ApplyClimateSettings();
        }
Beispiel #8
0
        /// <summary>
        /// Add simple ground plane to block layout.
        /// </summary>
        public static GameObject AddGroundPlane(
            ref DFBlock blockData,
            Transform parent            = null,
            ClimateBases climateBase    = ClimateBases.Temperate,
            ClimateSeason climateSeason = ClimateSeason.Summer)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (!dfUnity.IsReady)
            {
                return(null);
            }

            GameObject go = new GameObject("Ground");

            if (parent != null)
            {
                go.transform.parent = parent;
            }

            // Assign components
            DaggerfallGroundPlane dfGround   = go.AddComponent <DaggerfallGroundPlane>();
            MeshFilter            meshFilter = go.GetComponent <MeshFilter>();

            // Assign climate and mesh
            Color32[] tileMap;
            Mesh      mesh = dfUnity.MeshReader.GetSimpleGroundPlaneMesh(
                ref blockData,
                out tileMap,
                dfUnity.MeshReader.AddMeshTangents,
                dfUnity.MeshReader.AddMeshLightmapUVs);

            if (mesh)
            {
                meshFilter.sharedMesh = mesh;
            }

            // Assign tileMap and climate
            dfGround.tileMap = tileMap;
            dfGround.SetClimate(dfUnity, climateBase, climateSeason);

            // Assign collider
            if (dfUnity.Option_AddMeshColliders)
            {
                go.AddComponent <BoxCollider>();
            }

            // Assign static
            if (dfUnity.Option_SetStaticFlags)
            {
                go.isStatic = true;
            }

            return(go);
        }
Beispiel #9
0
        /// <summary>
        /// Add nature billboards.
        /// </summary>
        public static void AddNatureFlats(
            ref DFBlock blockData,
            Transform flatsParent,
            DaggerfallBillboardBatch billboardBatch = null,
            ClimateNatureSets climateNature         = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason             = ClimateSeason.Summer)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (!dfUnity.IsReady)
            {
                return;
            }

            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    // Get scenery item - ignore indices -1 (empty) and 0 (marker/waypoint of some kind)
                    DFBlock.RmbGroundScenery scenery = blockData.RmbBlock.FldHeader.GroundData.GroundScenery[x, 15 - y];
                    if (scenery.TextureRecord < 1)
                    {
                        continue;
                    }

                    // Calculate position
                    Vector3 billboardPosition = new Vector3(
                        x * BlocksFile.TileDimension,
                        natureFlatsOffsetY,
                        y * BlocksFile.TileDimension + BlocksFile.TileDimension) * MeshReader.GlobalScale;

                    // Get Archive
                    int natureArchive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);

                    // Import custom 3d gameobject instead of flat
                    if (MeshReplacement.ImportCustomFlatGameobject(natureArchive, scenery.TextureRecord, billboardPosition, flatsParent) != null)
                    {
                        continue;
                    }

                    // Add billboard to batch or standalone
                    if (billboardBatch != null)
                    {
                        billboardBatch.AddItem(scenery.TextureRecord, billboardPosition);
                    }
                    else
                    {
                        GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(natureArchive, scenery.TextureRecord, flatsParent);
                        go.transform.position = billboardPosition;
                        AlignBillboardToBase(go);
                    }
                }
            }
        }
        private void ApplyMaterials(bool force, int[] dungeonTextureTable = null)
        {
            if (Materials == null || Materials.Length == 0)
            {
                return;
            }

            if (UseDungeonTextureTable && dungeonTextureTable == null)
            {
                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;
            }
        }
        public static int GetNatureArchive(DFLocation.ClimateTextureSet climateTextureSet, DaggerfallDateTime.Seasons worldSeason)
        {
            ClimateNatureSets natureSet     = FromAPITextureSet(climateTextureSet);
            ClimateSeason     climateSeason = ClimateSeason.Summer;

            if (worldSeason == DaggerfallDateTime.Seasons.Winter)
            {
                climateSeason = ClimateSeason.Winter;
            }

            return(GetNatureArchive(natureSet, climateSeason));
        }
Beispiel #12
0
        /// <summary>
        /// Add simple ground plane to block layout.
        /// </summary>
        public static GameObject AddGroundPlane(
            ref DFBlock blockData,
            Transform parent = null,
            ClimateBases climateBase = ClimateBases.Temperate,
            ClimateSeason climateSeason = ClimateSeason.Summer)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;
            if (!dfUnity.IsReady)
                return null;

            GameObject go = new GameObject("Ground");
            if (parent != null)
                go.transform.parent = parent;

            // Assign components
            DaggerfallGroundPlane dfGround = go.AddComponent<DaggerfallGroundPlane>();
            MeshFilter meshFilter = go.GetComponent<MeshFilter>();

            // Assign climate and mesh
            Color32[] tileMap;
            Mesh mesh = dfUnity.MeshReader.GetSimpleGroundPlaneMesh(
                ref blockData,
                out tileMap,
                dfUnity.MeshReader.AddMeshTangents,
                dfUnity.MeshReader.AddMeshLightmapUVs);
            if (mesh)
            {
                meshFilter.sharedMesh = mesh;
            }

            // Assign tileMap and climate
            dfGround.tileMap = tileMap;
            dfGround.SetClimate(dfUnity, climateBase, climateSeason);

            // Assign collider
            if (dfUnity.Option_AddMeshColliders)
                go.AddComponent<BoxCollider>();

            // Assign static
            if (dfUnity.Option_SetStaticFlags)
                go.isStatic = true;

            return go;
        }
        /// <summary>
        /// Set ground climate by texture archive index.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="archive">Texture archive index.</param>
        /// <param name="season">Season to set.</param>
        public void SetClimate(DaggerfallUnity dfUnity, int archive, ClimateSeason season)
        {
            // Create tileMap texture
            Texture2D tileMapTexture = new Texture2D(tileMapDim, tileMapDim, TextureFormat.RGB24, false);
            tileMapTexture.SetPixels32(tileMap);
            tileMapTexture.Apply(false, true);
            tileMapTexture.filterMode = FilterMode.Point;
            tileMapTexture.wrapMode = TextureWrapMode.Clamp;

            // Get tileMap material
            Material material = Instantiate(dfUnity.MaterialReader.GetTerrainTilesetMaterial(archive)) as Material;
            material.SetTexture("_TilemapTex", tileMapTexture);
            material.SetInt("_TilemapDim", tileMapDim);

            // Assign new season
            summary.archive = archive;
            summary.season = season;
            GetComponent<MeshRenderer>().material = material;
        }
        /// <summary>
        /// Get ground archive based on climate.
        /// </summary>
        /// <param name="climateBase">Climate base.</param>
        /// <param name="climateSeason">Season.</param>
        /// <returns>Ground archive matching climate and season.</returns>
        public static int GetGroundArchive(ClimateBases climateBase, ClimateSeason climateSeason)
        {
            // Apply climate
            int archive;

            switch (climateBase)
            {
            case ClimateBases.Desert:
                archive = 2;
                break;

            case ClimateBases.Mountain:
                archive = 102;
                break;

            case ClimateBases.Temperate:
                archive = 302;
                break;

            case ClimateBases.Swamp:
                archive = 402;
                break;

            default:
                archive = 302;
                break;
            }

            // Modify for season
            switch (climateSeason)
            {
            case ClimateSeason.Winter:
                archive += 1;
                break;

            case ClimateSeason.Rain:
                archive += 2;
                break;
            }

            return(archive);
        }
        /// <summary>
        /// Rebuild materials back to default with no climate modifier.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="climate">Climate to set.</param>
        /// <param name="season">Season to set.</param>
        /// <param name="windowStyle">Style of window to set.</param>
        public void SetClimate(DaggerfallUnity dfUnity, ClimateBases climate, ClimateSeason season, WindowStyle windowStyle)
        {
            if (defaultTextures.Count == 0)
            {
                return;
            }

            // Get new material array
            Material[] materials = new Material[defaultTextures.Count];
            for (int i = 0; i < defaultTextures.Count; i++)
            {
                materials[i] = dfUnity.MaterialReader.ChangeClimate(defaultTextures[i], climate, season, windowStyle);
            }

            // Assign material array
            if (materials != null)
            {
                GetComponent <MeshRenderer>().sharedMaterials = materials;
            }
        }
Beispiel #16
0
        /// <summary>
        /// Set ground climate by texture archive index.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="archive">Texture archive index.</param>
        /// <param name="season">Season to set.</param>
        public void SetClimate(DaggerfallUnity dfUnity, int archive, ClimateSeason season)
        {
            // Create tileMap texture
            Texture2D tileMapTexture = new Texture2D(tileMapDim, tileMapDim, TextureFormat.RGB24, false);

            tileMapTexture.SetPixels32(tileMap);
            tileMapTexture.Apply(false, true);
            tileMapTexture.filterMode = FilterMode.Point;
            tileMapTexture.wrapMode   = TextureWrapMode.Clamp;

            // Get tileMap material
            Material material = Instantiate(dfUnity.MaterialReader.GetTerrainTilesetMaterial(archive)) as Material;

            material.SetTexture("_TilemapTex", tileMapTexture);
            material.SetInt("_TilemapDim", tileMapDim);

            // Assign new season
            summary.archive = archive;
            summary.season  = season;
            GetComponent <Renderer>().material = material;
        }
        private void Display3dModelSelection(int selectedIdx)
        {
            if (goModel)
            {
                Object.Destroy(goModel);
                goModel = null;
            }

            // Position camera and set model id
            uint modelId = 0;

            if (housesForSale == null)
            {
                camera.transform.position = new Vector3(0, 12, DaggerfallBankManager.GetShipCameraDist((ShipType)selectedIdx));
                modelId = DaggerfallBankManager.GetShipModelId((ShipType)selectedIdx);
            }
            else
            {
                camera.transform.position = new Vector3(0, 3, -20);
                BuildingSummary house = housesForSale[selectedIdx];
                modelId = house.ModelID;
            }

            // Inject custom GameObject if available else create standard mesh game object for the model
            goModel = MeshReplacement.ImportCustomGameobject(modelId, goBankPurchase.transform, new Matrix4x4());
            if (goModel == null)
            {
                goModel = GameObjectHelper.CreateDaggerfallMeshGameObject(modelId, goBankPurchase.transform);
            }

            goModel.layer = layer;

            // Apply current climate
            ClimateBases   climateBase = ClimateSwaps.FromAPIClimateBase(GameManager.Instance.PlayerGPS.ClimateSettings.ClimateType);
            ClimateSeason  season      = (DaggerfallUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter) ? ClimateSeason.Winter : ClimateSeason.Summer;
            DaggerfallMesh dfMesh      = goModel.GetComponent <DaggerfallMesh>();

            dfMesh.SetClimate(climateBase, season, WindowStyle.Day);
        }
        /// <summary>
        /// Layout RMB block gamne object from name only.
        /// This will be missing information like building data and should only be used standalone.
        /// </summary>
        public static GameObject CreateRMBBlockGameObject(
            string blockName,
            int layoutX,
            int layoutY,
            bool addGroundPlane          = true,
            DaggerfallRMBBlock cloneFrom = null,
            DaggerfallBillboardBatch natureBillboardBatch  = null,
            DaggerfallBillboardBatch lightsBillboardBatch  = null,
            DaggerfallBillboardBatch animalsBillboardBatch = null,
            TextureAtlasBuilder miscBillboardAtlas         = null,
            DaggerfallBillboardBatch miscBillboardBatch    = null,
            ClimateNatureSets climateNature = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason     = ClimateSeason.Summer)
        {
            // Get block data from name
            DFBlock blockData;

            if (!RMBLayout.GetBlockData(blockName, out blockData))
            {
                return(null);
            }

            // Create base object from block data
            GameObject go = CreateRMBBlockGameObject(
                blockData,
                layoutX,
                layoutY,
                addGroundPlane,
                cloneFrom,
                natureBillboardBatch,
                lightsBillboardBatch,
                animalsBillboardBatch,
                miscBillboardAtlas,
                miscBillboardBatch,
                climateNature,
                climateSeason);

            return(go);
        }
        private void updateMaterialSeasonalTextures(ref Material terrainMaterial, ClimateSeason currentSeason)
        {

            switch (currentSeason)
            {
                case ClimateSeason.Summer:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                    break;
                case ClimateSeason.Winter:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampWinter);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 1);
                    break;
                case ClimateSeason.Rain:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertRain);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandRain);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainRain);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampRain);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 2);
                    break;
                default:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                    break;
            }
        }
Beispiel #20
0
        /// <summary>
        /// Layout a complete RMB block game object.
        /// Can be used standalone or as part of a city build.
        /// </summary>
        public static GameObject CreateRMBBlockGameObject(
            string blockName,
            bool addGroundPlane          = true,
            DaggerfallRMBBlock cloneFrom = null,
            DaggerfallBillboardBatch natureBillboardBatch  = null,
            DaggerfallBillboardBatch lightsBillboardBatch  = null,
            DaggerfallBillboardBatch animalsBillboardBatch = null,
            TextureAtlasBuilder miscBillboardAtlas         = null,
            DaggerfallBillboardBatch miscBillboardBatch    = null,
            ClimateNatureSets climateNature = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason     = ClimateSeason.Summer)
        {
            // Get DaggerfallUnity
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (!dfUnity.IsReady)
            {
                return(null);
            }

            // Create base object
            DFBlock    blockData;
            GameObject go = RMBLayout.CreateBaseGameObject(blockName, out blockData, cloneFrom);

            // Create flats node
            GameObject flatsNode = new GameObject("Flats");

            flatsNode.transform.parent = go.transform;

            // Create lights node
            GameObject lightsNode = new GameObject("Lights");

            lightsNode.transform.parent = go.transform;

            // If billboard batching is enabled but user has not specified
            // a batch, then make our own auto batch for this block
            bool autoLightsBatch  = false;
            bool autoNatureBatch  = false;
            bool autoAnimalsBatch = false;

            if (dfUnity.Option_BatchBillboards)
            {
                if (natureBillboardBatch == null)
                {
                    autoNatureBatch = true;
                    int natureArchive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);
                    natureBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(natureArchive, flatsNode.transform);
                }
                if (lightsBillboardBatch == null)
                {
                    autoLightsBatch      = true;
                    lightsBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(TextureReader.LightsTextureArchive, flatsNode.transform);
                }
                if (animalsBillboardBatch == null)
                {
                    autoAnimalsBatch      = true;
                    animalsBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(TextureReader.AnimalsTextureArchive, flatsNode.transform);
                }
            }

            // Layout light billboards and gameobjects
            RMBLayout.AddLights(ref blockData, flatsNode.transform, lightsNode.transform, lightsBillboardBatch);

            // Layout nature billboards
            RMBLayout.AddNatureFlats(ref blockData, flatsNode.transform, natureBillboardBatch, climateNature, climateSeason);

            // Layout all other flats
            RMBLayout.AddMiscBlockFlats(ref blockData, flatsNode.transform, animalsBillboardBatch, miscBillboardAtlas, miscBillboardBatch);

            // Add ground plane
            if (addGroundPlane)
            {
                RMBLayout.AddGroundPlane(ref blockData, go.transform);
            }

            // Apply auto batches
            if (autoNatureBatch)
            {
                natureBillboardBatch.Apply();
            }
            if (autoLightsBatch)
            {
                lightsBillboardBatch.Apply();
            }
            if (autoAnimalsBatch)
            {
                animalsBillboardBatch.Apply();
            }

            return(go);
        }
        private bool shouldUpdateSeasonalTextures()
        {
            if (!weatherManager)
                return false;

            ClimateSeason newSeason;

            // Get season and weather
            if (dfUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter)
            {
                newSeason = ClimateSeason.Winter;
            }
            else
            {
                newSeason = ClimateSeason.Summer;

                if (weatherManager.IsRaining)
                {
                    newSeason = ClimateSeason.Rain;
                }
                else if (weatherManager.IsSnowing) // should not happen (snow in summer would be weird...)
                {
                    newSeason = ClimateSeason.Winter;
                }
            }

            if (newSeason != currentSeason)
            {
                currentSeason = newSeason;
                return true;
            }
            else
            {
                return false;
            }
        }
        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>
 /// Set ground climate.
 /// </summary>
 /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
 /// <param name="climate">Climate to set.</param>
 /// <param name="season">Season to set.</param>
 public void SetClimate(DaggerfallUnity dfUnity, ClimateBases climate, ClimateSeason season)
 {
     int archive = ClimateSwaps.GetGroundArchive(climate, season);
     SetClimate(dfUnity, archive, season);
     summary.climate = climate;
 }
Beispiel #24
0
        /// <summary>
        /// Add subrecord (building) exterior block flats.
        /// </summary>
        public static void AddExteriorBlockFlats(
            ref DFBlock blockData,
            Transform flatsParent,
            Transform lightsParent,
            int mapId,
            int locationIndex,
            ClimateNatureSets climateNature = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason     = ClimateSeason.Summer)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (!dfUnity.IsReady)
            {
                return;
            }

            // Get Nature Archive
            int natureArchive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);

            foreach (DFBlock.RmbSubRecord subRecord in blockData.RmbBlock.SubRecords)
            {
                Vector3 subRecordPosition = new Vector3(subRecord.XPos, 0, -subRecord.ZPos) * MeshReader.GlobalScale;

                foreach (DFBlock.RmbBlockFlatObjectRecord obj in subRecord.Exterior.BlockFlatObjectRecords)
                {
                    // Don't add building exterior editor flats since they can't be used by any DFU systems
                    int archive = obj.TextureArchive;
                    if (archive == TextureReader.EditorFlatsTextureArchive)
                    {
                        continue;
                    }

                    // Calculate position
                    Vector3 billboardPosition = new Vector3(
                        obj.XPos,
                        -obj.YPos + blockFlatsOffsetY,
                        obj.ZPos + BlocksFile.RMBDimension) * MeshReader.GlobalScale;

                    billboardPosition += subRecordPosition;

                    // Add natures using correct climate set archive
                    if (archive >= (int)DFLocation.ClimateTextureSet.Nature_RainForest && archive <= (int)DFLocation.ClimateTextureSet.Nature_Mountains_Snow)
                    {
                        archive             = natureArchive;
                        billboardPosition.z = natureFlatsOffsetY;
                    }

                    GameObject go         = MeshReplacement.ImportCustomFlatGameobject(archive, obj.TextureRecord, billboardPosition, flatsParent);
                    bool       isImported = go != null;
                    if (!isImported)
                    {
                        // Add standalone billboard gameobject
                        go = GameObjectHelper.CreateDaggerfallBillboardGameObject(archive, obj.TextureRecord, flatsParent);
                        go.transform.position = billboardPosition;
                        AlignBillboardToBase(go);
                    }

                    // Add animal sound
                    if (archive == TextureReader.AnimalsTextureArchive)
                    {
                        AddAnimalAudioSource(go, obj.TextureRecord);
                    }

                    // If flat record has a non-zero faction id, then it's an exterior NPC
                    if (obj.FactionID != 0)
                    {
                        // Add RMB data to billboard
                        Billboard dfBillboard = go.GetComponent <Billboard>();
                        if (dfBillboard != null)
                        {
                            dfBillboard.SetRMBPeopleData(obj.FactionID, obj.Flags, obj.Position);
                        }

                        // Add StaticNPC behaviour
                        StaticNPC npc = go.AddComponent <StaticNPC>();
                        npc.SetLayoutData(obj, mapId, locationIndex);
                    }

                    // If this is a light flat, import light prefab
                    if (archive == TextureReader.LightsTextureArchive && !isImported)
                    {
                        if (dfUnity.Option_CityLightPrefab == null)
                        {
                            return;
                        }

                        Vector2 size     = dfUnity.MeshReader.GetScaledBillboardSize(210, obj.TextureRecord);
                        Vector3 position = new Vector3(
                            obj.XPos,
                            -obj.YPos + size.y,
                            obj.ZPos + BlocksFile.RMBDimension) * MeshReader.GlobalScale;
                        position += subRecordPosition;

                        GameObjectHelper.InstantiatePrefab(dfUnity.Option_CityLightPrefab.gameObject, string.Empty, lightsParent, position);
                    }
                }
            }
        }
        private void ApplyTimeAndSpace()
        {
            // Get season and weather
            if (dfUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter)
                CurrentSeason = ClimateSeason.Winter;
            else
                CurrentSeason = ClimateSeason.Summer;

            // Set windows
            if (dfUnity.WorldTime.Now.IsCityLightsOn)
                WindowTextureStyle = WindowStyle.Night;
            else
                WindowTextureStyle = WindowStyle.Day;

            // Apply changes
            ApplyClimateSettings();
        }
        public void SetLocation(DFLocation location, bool performLayout = true)
        {
            if (!ReadyCheck())
                return;

            // Validate
            if (this.isSet)
                throw new Exception("This location has already been set.");
            if (!location.Loaded)
                throw new Exception("DFLocation not loaded.");

            // Set summary
            summary = new LocationSummary();
            summary.ID = location.MapTableData.MapId;
            summary.Longitude = (int)location.MapTableData.Longitude;
            summary.Latitude = (int)location.MapTableData.Latitude;
            DFPosition mapPixel = MapsFile.LongitudeLatitudeToMapPixel(summary.Longitude, summary.Latitude);
            DFPosition worldCoord = MapsFile.MapPixelToWorldCoord(mapPixel.X, mapPixel.Y);
            summary.MapPixelX = mapPixel.X;
            summary.MapPixelY = mapPixel.Y;
            summary.WorldCoordX = worldCoord.X;
            summary.WorldCoordZ = worldCoord.Y;
            summary.RegionName = location.RegionName;
            summary.LocationName = location.Name;
            summary.WorldClimate = location.Climate.WorldClimate;
            summary.LocationType = location.MapTableData.LocationType;
            summary.DungeonType = location.MapTableData.DungeonType;
            summary.HasDungeon = location.HasDungeon;
            summary.Climate = ClimateSwaps.FromAPIClimateBase(location.Climate.ClimateType);
            summary.Nature = ClimateSwaps.FromAPITextureSet(location.Climate.NatureSet);
            summary.SkyBase = location.Climate.SkyBase;
            summary.BlockWidth = location.Exterior.ExteriorData.Width;
            summary.BlockHeight = location.Exterior.ExteriorData.Height;

            // Assign starting climate
            CurrentSeason = ClimateSeason.Summer;
            CurrentClimate = summary.Climate;
            CurrentNatureSet = summary.Nature;

            // Perform layout
            if (performLayout)
            {
                LayoutLocation(ref location);
                ApplyClimateSettings();
            }

            // Seal location
            isSet = true;
        }
        /// <summary>
        /// Rebuild materials back to default with no climate modifier.
        /// </summary>
        /// <param name="dfUnity">DaggerfallUnity singleton. Required for content readers and settings.</param>
        /// <param name="climate">Climate to set.</param>
        /// <param name="season">Season to set.</param>
        /// <param name="windowStyle">Style of window to set.</param>
        public void SetClimate(ClimateBases climate, ClimateSeason season, WindowStyle windowStyle)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;

            if (defaultTextures.Count == 0)
                return;

            // Get new material array
            Material[] materials = new Material[defaultTextures.Count];
            for (int i = 0; i < defaultTextures.Count; i++)
            {
                materials[i] = dfUnity.MaterialReader.ChangeClimate(defaultTextures[i], climate, season, windowStyle);
            }

            // Assign material array
            if (materials != null)
                GetComponent<MeshRenderer>().sharedMaterials = materials;

            // Store climate settings
            currentClimate = climate;
            currentSeason = season;
            currentWindowStyle = windowStyle;
        }
        /// <summary>
        /// Converts an archive index to new climate and season.
        /// Will return same index if climate or season not supported.
        /// </summary>
        /// <param name="archive">Archive index of starting texture.</param>
        /// <param name="climate">Climate base to apply.</param>
        /// <param name="season">Climate season to apply</param>
        /// <returns>Archive index of new texture.</returns>
        public static int ApplyClimate(int archive, int record, ClimateBases climate, ClimateSeason season)
        {
            // Get climate texture info
            ClimateTextureInfo ci = ClimateSwaps.GetClimateTextureInfo(archive);

            // Ignore non-climate textures
            if (ci.textureSet == DFLocation.ClimateTextureSet.None)
            {
                return(archive);
            }

            // Handle missing Swamp textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                case DFLocation.ClimateTextureSet.Interior_TempleInt:
                case DFLocation.ClimateTextureSet.Interior_MarbleFloors:
                    return(archive);
                }
            }

            // Bypass winter swaps in desert climates entirely
            // There are too many bad swaps, and you never see this variant in game
            if (climate == ClimateBases.Desert)
            {
                ci.supportsWinter = false;
            }

            // Handle swamp climate sets with missing winter textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                case DFLocation.ClimateTextureSet.Exterior_Castle:
                case DFLocation.ClimateTextureSet.Exterior_MagesGuild:
                    ci.supportsWinter = false;
                    break;
                }
            }

            // Handle archives with missing winter textures
            if (archive == 82 && record > 1 ||
                archive == 77)
            {
                ci.supportsWinter = false;
            }

            // Flag to suppress climate index
            // Certain textures have a winter variant but are climate-specific
            bool suppressClimateIndex = false;

            switch (archive)
            {
            case 75:
            case 76:
            case 77:
            case 79:
            case 80:
            case 82:
            case 83:
                suppressClimateIndex = true;
                break;
            }

            // Calculate new index
            int climateIndex = 0;

            if (archive < 500 && !suppressClimateIndex)
            {
                climateIndex = (int)FromUnityClimateBase(climate) + (int)ci.textureSet;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
                }
                else if (season == ClimateSeason.Rain && ci.supportsRain)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Rain;
                }
            }
            else
            {
                climateIndex = archive;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                {
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
                }
            }

            return(climateIndex);
        }
        private Material GetMaterial(RuntimeMaterial runtimeMaterial, ClimateBases climate, ClimateSeason season)
        {
            int archive = runtimeMaterial.Archive;
            int record  = runtimeMaterial.Record;

            if (runtimeMaterial.ApplyClimate)
            {
                archive = ClimateSwaps.ApplyClimate(archive, record, climate, season);
            }

            return(DaggerfallUnity.Instance.MaterialReader.GetMaterial(archive, record));
        }
        /// <summary>
        /// Converts an archive index to new climate and season.
        /// Will return same index if climate or season not supported.
        /// </summary>
        /// <param name="archive">Archive index of starting texture.</param>
        /// <param name="climate">Climate base to apply.</param>
        /// <param name="season">Climate season to apply</param>
        /// <returns>Archive index of new texture.</returns>
        public static int ApplyClimate(int archive, int record, ClimateBases climate, ClimateSeason season)
        {
            // Get climate texture info
            ClimateTextureInfo ci = ClimateSwaps.GetClimateTextureInfo(archive);

            // Ignore non-climate textures
            if (ci.textureSet == DFLocation.ClimateTextureSet.None)
                return archive;

            // Handle missing Swamp textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                    case DFLocation.ClimateTextureSet.Interior_TempleInt:
                    case DFLocation.ClimateTextureSet.Interior_MarbleFloors:
                        return archive;
                }
            }

            // Bypass winter swaps in desert climates entirely
            // There are too many bad swaps, and you never see this variant in game
            if (climate == ClimateBases.Desert)
                ci.supportsWinter = false;

            // Handle swamp climate sets with missing winter textures
            if (climate == ClimateBases.Swamp)
            {
                switch (ci.textureSet)
                {
                    case DFLocation.ClimateTextureSet.Exterior_Castle:
                    case DFLocation.ClimateTextureSet.Exterior_MagesGuild:
                        ci.supportsWinter = false;
                        break;
                }
            }

            // Handle archives with missing winter textures
            if (archive == 82 && record > 1 ||
                archive == 77)
            {
                ci.supportsWinter = false;
            }

            // Flag to suppress climate index
            // Certain textures have a winter variant but are climate-specific
            bool suppressClimateIndex = false;
            switch (archive)
            {
                case 75:
                case 76:
                case 77:
                case 79:
                case 80:
                case 82:
                case 83:
                    suppressClimateIndex = true;
                    break;
            }

            // Calculate new index
            int climateIndex = 0;
            if (archive < 500 && !suppressClimateIndex)
            {
                climateIndex = (int)FromUnityClimateBase(climate) + (int)ci.textureSet;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
                else if (season == ClimateSeason.Rain && ci.supportsRain)
                    climateIndex += (int)DFLocation.ClimateWeather.Rain;
            }
            else
            {
                climateIndex = archive;
                if (season == ClimateSeason.Winter && ci.supportsWinter)
                    climateIndex += (int)DFLocation.ClimateWeather.Winter;
            }

            return climateIndex;
        }
        public static int GetNatureArchive(ClimateNatureSets natureSet, ClimateSeason climateSeason)
        {
            // Get base set
            int archive;
            switch (natureSet)
            {
                case ClimateNatureSets.RainForest:
                    archive = 500;
                    break;
                case ClimateNatureSets.SubTropical:
                    archive = 501;
                    break;
                case ClimateNatureSets.Swamp:
                    archive = 502;
                    break;
                case ClimateNatureSets.Desert:
                    archive = 503;
                    break;
                case ClimateNatureSets.TemperateWoodland:
                    archive = 504;
                    break;
                case ClimateNatureSets.WoodlandHills:
                    archive = 506;
                    break;
                case ClimateNatureSets.HauntedWoodlands:
                    archive = 508;
                    break;
                case ClimateNatureSets.Mountains:
                    archive = 510;
                    break;
                default:
                    archive = 504;
                    break;
            }

            // Winter modifier
            if (climateSeason == ClimateSeason.Winter)
            {
                // Only certain sets have a winter archive
                switch (natureSet)
                {
                    case ClimateNatureSets.TemperateWoodland:
                    case ClimateNatureSets.WoodlandHills:
                    case ClimateNatureSets.HauntedWoodlands:
                    case ClimateNatureSets.Mountains:
                        archive += 1;
                        break;
                }
            }

            return archive;
        }
Beispiel #32
0
        private void updateSeasonalTextures()
        {
            if (!weatherManager)
            {
                return;
            }

            ClimateSeason currentSeason;

            // Get season and weather
            if (dfUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter)
            {
                currentSeason = ClimateSeason.Winter;
            }
            else
            {
                currentSeason = ClimateSeason.Summer;

                if (weatherManager.IsRaining)
                {
                    currentSeason = ClimateSeason.Rain;
                }
                else if (weatherManager.IsSnowing) // should not happen (snow in summer would be weird...)
                {
                    currentSeason = ClimateSeason.Winter;
                }
            }

            if (currentSeason != oldSeason)
            {
                switch (currentSeason)
                {
                case ClimateSeason.Summer:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                    break;

                case ClimateSeason.Winter:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainWinter);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampWinter);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 1);
                    break;

                case ClimateSeason.Rain:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertRain);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandRain);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainRain);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampRain);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 2);
                    break;

                default:
                    terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                    terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                    terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                    break;
                }
                oldSeason = currentSeason;
            }
        }
        public static int GetNatureArchive(ClimateNatureSets natureSet, ClimateSeason climateSeason)
        {
            // Get base set
            DFLocation.ClimateTextureSet textureSet;
            switch (natureSet)
            {
            case ClimateNatureSets.RainForest:
                textureSet = DFLocation.ClimateTextureSet.Nature_RainForest;
                break;

            case ClimateNatureSets.SubTropical:
                textureSet = DFLocation.ClimateTextureSet.Nature_SubTropical;
                break;

            case ClimateNatureSets.Swamp:
                textureSet = DFLocation.ClimateTextureSet.Nature_Swamp;
                break;

            case ClimateNatureSets.Desert:
                textureSet = DFLocation.ClimateTextureSet.Nature_Desert;
                break;

            case ClimateNatureSets.TemperateWoodland:
                textureSet = DFLocation.ClimateTextureSet.Nature_TemperateWoodland;
                break;

            case ClimateNatureSets.WoodlandHills:
                textureSet = DFLocation.ClimateTextureSet.Nature_WoodlandHills;
                break;

            case ClimateNatureSets.HauntedWoodlands:
                textureSet = DFLocation.ClimateTextureSet.Nature_HauntedWoodlands;
                break;

            case ClimateNatureSets.Mountains:
                textureSet = DFLocation.ClimateTextureSet.Nature_Mountains;
                break;

            default:
                textureSet = DFLocation.ClimateTextureSet.Nature_TemperateWoodland;
                break;
            }

            var archive = (int)textureSet;

            // Winter modifier
            if (climateSeason == ClimateSeason.Winter)
            {
                // Only certain sets have a winter archive
                switch (natureSet)
                {
                case ClimateNatureSets.TemperateWoodland:
                case ClimateNatureSets.WoodlandHills:
                case ClimateNatureSets.HauntedWoodlands:
                case ClimateNatureSets.Mountains:
                    archive += 1;
                    break;
                }
            }

            return(archive);
        }
        /// <summary>
        /// Get a new Material based on climate.
        /// </summary>
        /// <param name="key">Material key.</param>
        /// <param name="climate">New climate base.</param>
        /// <param name="season">New season.</param>
        /// <param name="windowStyle">New window style.</param>
        /// <returns>New material.</returns>
        public Material ChangeClimate(int key, ClimateBases climate, ClimateSeason season, WindowStyle windowStyle)
        {
            // Ready check
            if (!IsReady)
                return null;

            // Reverse key and apply climate
            int archive, record, frame;
            ReverseTextureKey(key, out archive, out record, out frame);
            archive = ClimateSwaps.ApplyClimate(archive, record, climate, season);

            // Get new material
            Material material;
            CachedMaterial cm = GetMaterialFromCache(archive, record, out material);

            // Handle windows
            if (cm.isWindow)
            {
                ChangeWindowEmissionColor(material, windowStyle);
            }

            return material;
        }
        public static int GetNatureArchive(ClimateNatureSets natureSet, ClimateSeason climateSeason)
        {
            // Get base set
            int archive;

            switch (natureSet)
            {
            case ClimateNatureSets.RainForest:
                archive = 500;
                break;

            case ClimateNatureSets.SubTropical:
                archive = 501;
                break;

            case ClimateNatureSets.Swamp:
                archive = 502;
                break;

            case ClimateNatureSets.Desert:
                archive = 503;
                break;

            case ClimateNatureSets.TemperateWoodland:
                archive = 504;
                break;

            case ClimateNatureSets.WoodlandHills:
                archive = 506;
                break;

            case ClimateNatureSets.HauntedWoodlands:
                archive = 508;
                break;

            case ClimateNatureSets.Mountains:
                archive = 510;
                break;

            default:
                archive = 504;
                break;
            }

            // Winter modifier
            if (climateSeason == ClimateSeason.Winter)
            {
                // Only certain sets have a winter archive
                switch (natureSet)
                {
                case ClimateNatureSets.TemperateWoodland:
                case ClimateNatureSets.WoodlandHills:
                case ClimateNatureSets.HauntedWoodlands:
                case ClimateNatureSets.Mountains:
                    archive += 1;
                    break;
                }
            }

            return(archive);
        }
        /// <summary>
        /// Layout a complete RMB block game object.
        /// Can be used standalone or as part of a city build.
        /// </summary>
        public static GameObject CreateRMBBlockGameObject(
            string blockName,
            bool addGroundPlane = true,
            DaggerfallRMBBlock cloneFrom = null,
            DaggerfallBillboardBatch natureBillboardBatch = null,
            DaggerfallBillboardBatch lightsBillboardBatch = null,
            DaggerfallBillboardBatch animalsBillboardBatch = null,
            TextureAtlasBuilder miscBillboardAtlas = null,
            DaggerfallBillboardBatch miscBillboardBatch = null,
            ClimateNatureSets climateNature = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason = ClimateSeason.Summer)
        {
            // Get DaggerfallUnity
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;
            if (!dfUnity.IsReady)
                return null;

            // Create base object
            DFBlock blockData;
            GameObject go = RMBLayout.CreateBaseGameObject(blockName, out blockData, cloneFrom);

            // Create flats node
            GameObject flatsNode = new GameObject("Flats");
            flatsNode.transform.parent = go.transform;

            // Create lights node
            GameObject lightsNode = new GameObject("Lights");
            lightsNode.transform.parent = go.transform;

            // If billboard batching is enabled but user has not specified
            // a batch, then make our own auto batch for this block
            bool autoLightsBatch = false;
            bool autoNatureBatch = false;
            bool autoAnimalsBatch = false;
            if (dfUnity.Option_BatchBillboards)
            {
                if (natureBillboardBatch == null)
                {
                    autoNatureBatch = true;
                    int natureArchive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);
                    natureBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(natureArchive, flatsNode.transform);
                }
                if (lightsBillboardBatch == null)
                {
                    autoLightsBatch = true;
                    lightsBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(TextureReader.LightsTextureArchive, flatsNode.transform);
                }
                if (animalsBillboardBatch == null)
                {
                    autoAnimalsBatch = true;
                    animalsBillboardBatch = GameObjectHelper.CreateBillboardBatchGameObject(TextureReader.AnimalsTextureArchive, flatsNode.transform);
                }
            }

            // Layout light billboards and gameobjects
            RMBLayout.AddLights(ref blockData, flatsNode.transform, lightsNode.transform, lightsBillboardBatch);

            // Layout nature billboards
            RMBLayout.AddNatureFlats(ref blockData, flatsNode.transform, natureBillboardBatch, climateNature, climateSeason);

            // Layout all other flats
            RMBLayout.AddMiscBlockFlats(ref blockData, flatsNode.transform, animalsBillboardBatch, miscBillboardAtlas, miscBillboardBatch);

            // Add ground plane
            if (addGroundPlane)
                RMBLayout.AddGroundPlane(ref blockData, go.transform);

            // Apply auto batches
            if (autoNatureBatch) natureBillboardBatch.Apply();
            if (autoLightsBatch) lightsBillboardBatch.Apply();
            if (autoAnimalsBatch) animalsBillboardBatch.Apply();

            return go;
        }
Beispiel #37
0
        /// <summary>
        /// Add nature billboards.
        /// </summary>
        public static void AddNatureFlats(
            ref DFBlock blockData,
            Transform flatsParent,
            DaggerfallBillboardBatch billboardBatch = null,
            ClimateNatureSets climateNature = ClimateNatureSets.TemperateWoodland,
            ClimateSeason climateSeason = ClimateSeason.Summer)
        {
            DaggerfallUnity dfUnity = DaggerfallUnity.Instance;
            if (!dfUnity.IsReady)
                return;

            for (int y = 0; y < 16; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    // Get scenery item - ignore indices -1 (empty) and 0 (marker/waypoint of some kind)
                    DFBlock.RmbGroundScenery scenery = blockData.RmbBlock.FldHeader.GroundData.GroundScenery[x, 15 - y];
                    if (scenery.TextureRecord < 1)
                        continue;

                    // Calculate position
                    Vector3 billboardPosition = new Vector3(
                        x * BlocksFile.TileDimension,
                        natureFlatsOffsetY,
                        y * BlocksFile.TileDimension + BlocksFile.TileDimension) * MeshReader.GlobalScale;

                    // Add billboard to batch or standalone
                    if (billboardBatch != null)
                    {
                        billboardBatch.AddItem(scenery.TextureRecord, billboardPosition);
                    }
                    else
                    {
                        int natureArchive = ClimateSwaps.GetNatureArchive(climateNature, climateSeason);
                        GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(natureArchive, scenery.TextureRecord, flatsParent);
                        go.transform.position = billboardPosition;
                    }
                }
            }
        }
        /// <summary>
        /// Get ground archive based on climate.
        /// </summary>
        /// <param name="climateBase">Climate base.</param>
        /// <param name="climateSeason">Season.</param>
        /// <returns>Ground archive matching climate and season.</returns>
        public static int GetGroundArchive(ClimateBases climateBase, ClimateSeason climateSeason)
        {
            // Apply climate
            int archive;
            switch (climateBase)
            {
                case ClimateBases.Desert:
                    archive = 2;
                    break;
                case ClimateBases.Mountain:
                    archive = 102;
                    break;
                case ClimateBases.Temperate:
                    archive = 302;
                    break;
                case ClimateBases.Swamp:
                    archive = 402;
                    break;
                default:
                    archive = 302;
                    break;
            }

            // Modify for season
            switch (climateSeason)
            {
                case ClimateSeason.Winter:
                    archive += 1;
                    break;
                case ClimateSeason.Rain:
                    archive += 2;
                    break;
            }

            return archive;
        }
        private void updateSeasonalTextures()
        {
            if (!weatherManager)
                return;

            ClimateSeason currentSeason;

            // Get season and weather
            if (dfUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter)
            {
                currentSeason = ClimateSeason.Winter;
            }
            else
            {
                currentSeason = ClimateSeason.Summer;

                if (weatherManager.IsRaining)
                {
                    currentSeason = ClimateSeason.Rain;
                }
                else if (weatherManager.IsSnowing) // should not happen (snow in summer would be weird...)
                {
                    currentSeason = ClimateSeason.Winter;
                }
            }
                
            if (currentSeason != oldSeason)
               {
                switch (currentSeason)
                {
                    case ClimateSeason.Summer:
                        terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                        terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                        break;
                    case ClimateSeason.Winter:
                        terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertWinter);
                        terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandWinter);
                        terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainWinter);
                        terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampWinter);
                        terrainMaterial.SetInt("_TextureSetSeasonCode", 1);
                        break;
                    case ClimateSeason.Rain:
                        terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertRain);
                        terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandRain);
                        terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainRain);
                        terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampRain);
                        terrainMaterial.SetInt("_TextureSetSeasonCode", 2);
                        break;
                    default:
                        terrainMaterial.SetTexture("_TileAtlasTexDesert", textureAtlasDesertSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexWoodland", textureAtlasWoodlandSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexMountain", textureAtlasMountainSummer);
                        terrainMaterial.SetTexture("_TileAtlasTexSwamp", textureAtlasSwampSummer);
                        terrainMaterial.SetInt("_TextureSetSeasonCode", 0);
                        break;
                }
                oldSeason = currentSeason;                
            }
        }