Esempio n. 1
0
        public DetailPrototypesManager(Mod mod, Transform parent, RealGrassOptions options, PrototypesProperties properties)
        {
            Color healthyColor = new Color(0.70f, 0.70f, 0.70f);
            Color dryColor     = new Color(0.40f, 0.40f, 0.40f);

            this.mod        = mod;
            this.parent     = parent;
            this.options    = options;
            textureOverride = properties.TextureOverride;
            float noiseSpread = properties.NoiseSpread;

            useGrassShader = properties.UseGrassShader;

            List <DetailPrototype> detailPrototypes = new List <DetailPrototype>();
            int index = 0;

            var grassPrototypes = new DetailPrototype()
            {
                minWidth         = properties.GrassWidth.Min,
                maxWidth         = properties.GrassWidth.Max,
                noiseSpread      = properties.NoiseSpread,
                renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                usePrototypeMesh = useGrassShader
            };

            detailPrototypes.Add(grassPrototypes);
            Grass = index;

            if ((options.GrassStyle & GrassStyle.Mixed) == GrassStyle.Mixed)
            {
                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassDetails = ++index;

                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassAccents = ++index;
            }

            if (options.WaterPlants)
            {
                var waterPlantsNear = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.6f,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.Grass
                };
                detailPrototypes.Add(waterPlantsNear);
                WaterPlants = ++index;
            }

            if (options.TerrainStones)
            {
                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = 0.4f,
                    maxWidth         = 1,
                    minHeight        = 0.25f,
                    maxHeight        = 1.5f,
                    usePrototypeMesh = true,
                    noiseSpread      = 1,
                    renderMode       = DetailRenderMode.VertexLit
                });
                Rocks = ++index;
            }

            DetailPrototypes = detailPrototypes.ToArray();

            GrassColors   grassColors = properties.GrassColors;
            Range <float> grassHeight = properties.GrassHeight;

            sizeColor = grassColors.SeasonInterpolation ?
                        new InterpolatedSizeColor(options.GrassStyle, grassColors, grassHeight, noiseSpread, detailPrototypes[Grass], detailPrototypes[GrassDetails], detailPrototypes[GrassAccents]) :
                        new SizeColor(options.GrassStyle, grassColors, grassHeight, noiseSpread, detailPrototypes[Grass], detailPrototypes[GrassDetails], detailPrototypes[GrassAccents]);
        }
        private void LoadSettings(ModSettings settings, ModSettingsChange change)
        {
            const string
                style = "Style",
                waterPlantsSection = "WaterPlants",
                grassSection       = "Grass",
                advancedSection    = "Advanced";

            options.WaterPlants = settings.GetBool(waterPlantsSection, "Enabled");
            var properties = new PrototypesProperties()
            {
                GrassHeight = settings.GetTupleFloat(grassSection, "Height"),
                GrassWidth  = settings.GetTupleFloat(grassSection, "Width"),
                NoiseSpread = settings.GetFloat(grassSection, "NoiseSpread"),
                GrassColors = new GrassColors()
                {
                    SpringHealthy       = settings.GetColor(grassSection, "SpringHealthy"),
                    SpringDry           = settings.GetColor(grassSection, "SpringDry"),
                    SummerHealty        = settings.GetColor(grassSection, "SummerHealty"),
                    SummerDry           = settings.GetColor(grassSection, "SummerDry"),
                    FallHealty          = settings.GetColor(grassSection, "FallHealty"),
                    FallDry             = settings.GetColor(grassSection, "FallDry"),
                    SeasonInterpolation = settings.GetBool(grassSection, "SeasonInterpolation")
                },
                UseGrassShader  = !settings.GetBool(style, "Billboard"),
                TextureOverride = settings.GetBool(advancedSection, "TextureOverride")
            };

            var density = new Density()
            {
                GrassThick   = settings.GetTupleInt(grassSection, "ThickDensity"),
                GrassThin    = settings.GetTupleInt(grassSection, "ThinDensity"),
                WaterPlants  = settings.GetTupleInt(waterPlantsSection, "Density"),
                DesertPlants = settings.GetTupleInt(waterPlantsSection, "DesertDensity"),
            };

            switch (settings.GetInt(style, "Stones"))
            {
            case 0:
                options.TerrainStones = false;
                break;

            case 1:
                options.TerrainStones = true;
                density.Rocks         = 2;
                break;

            case 2:
                options.TerrainStones = true;
                density.Rocks         = 4;
                break;
            }

            if (change.HasChanged(style, "Style"))
            {
                switch (settings.GetValue <int>(style, "Style"))
                {
                case 0:
                default:
                    options.GrassStyle = GrassStyle.Classic;
                    break;

                case 1:
                    options.GrassStyle = GrassStyle.Mixed;
                    break;

                case 2:
                    options.GrassStyle = GrassStyle.Full;
                    break;
                }
            }

            if (change.HasChanged(advancedSection))
            {
                options.DetailObjectDistance = settings.GetValue <int>(advancedSection, "DetailDistance");
                string detailDistanceOverride = settings.GetValue <string>(advancedSection, "DetailDistanceOverride");
                if (!string.IsNullOrWhiteSpace(detailDistanceOverride) && int.TryParse(detailDistanceOverride, out int value))
                {
                    options.DetailObjectDistance = value;
                    Debug.Log($"{this}: override detail distance with {value}", this);
                }

                options.DetailObjectDensity = settings.GetValue <float>(advancedSection, "DetailDensity");
                options.FlyingInsects       = settings.GetValue <bool>(advancedSection, "FlyingInsects");
            }

            detailPrototypesManager = new DetailPrototypesManager(mod, transform, options, properties);
            densityManager          = new DensityManager(mod, options, density);

            if (isEnabled)
            {
                RefreshTerrainDetailsAsync();
            }
        }
Esempio n. 3
0
        private void LoadSettings()
        {
            const string
                waterPlantsSection = "WaterPlants",
                grassSection       = "Grass",
                othersSection      = "Others",
                advancedSection    = "Advanced";

            // Load settings
            var settings = Mod.GetSettings();

            // Optional details
            int waterPlantsMode = settings.GetInt(waterPlantsSection, "Mode");

            WaterPlants  = waterPlantsMode != 0;
            WinterPlants = waterPlantsMode == 2;

            // Detail prototypes settings
            var properties = new PrototypesProperties()
            {
                GrassHeight = settings.GetTupleFloat(grassSection, "Height"),
                GrassWidth  = settings.GetTupleFloat(grassSection, "Width"),
                NoiseSpread = settings.GetFloat(grassSection, "NoiseSpread"),
                GrassColors = new GrassColors()
                {
                    SpringHealthy = settings.GetColor(grassSection, "SpringHealthy"),
                    SpringDry     = settings.GetColor(grassSection, "SpringDry"),
                    SummerHealty  = settings.GetColor(grassSection, "SummerHealty"),
                    SummerDry     = settings.GetColor(grassSection, "SummerDry"),
                    FallHealty    = settings.GetColor(grassSection, "FallHealty"),
                    FallDry       = settings.GetColor(grassSection, "FallDry"),
                },
                UseGrassShader    = settings.GetInt(grassSection, "Shader") == 1,
                NoiseSpreadPlants = settings.GetFloat(waterPlantsSection, "NoiseSpread"),
                TextureOverride   = settings.GetBool(advancedSection, "TextureOverride")
            };

            // Detail prototypes density
            var density = new Density()
            {
                GrassThick   = settings.GetTupleInt(grassSection, "ThickDensity"),
                GrassThin    = settings.GetTupleInt(grassSection, "ThinDensity"),
                WaterPlants  = settings.GetTupleInt(waterPlantsSection, "Density"),
                DesertPlants = settings.GetTupleInt(waterPlantsSection, "DesertDensity"),
            };

            switch (settings.GetInt(othersSection, "Flowers"))
            {
            case 0:
                Flowers = false;
                break;

            case 1:
                Flowers         = true;
                density.Flowers = 5;
                density.Bushes  = 2;
                break;

            case 2:
                Flowers         = true;
                density.Flowers = 25;
                density.Bushes  = 7;
                break;

            case 3:
                Flowers         = true;
                density.Flowers = 50;
                density.Bushes  = 15;
                break;
            }

            switch (settings.GetInt(othersSection, "Stones"))
            {
            case 0:
                TerrainStones = false;
                break;

            case 1:
                TerrainStones  = true;
                density.Stones = new Range <int>(2, 6);
                density.Rocks  = 2;
                break;

            case 2:
                TerrainStones  = true;
                density.Stones = new Range <int>(4, 12);
                density.Rocks  = 4;
                break;
            }

            RealisticGrass = settings.GetValue <bool>(grassSection, "Realistic");
            FlyingInsects  = settings.GetValue <bool>(othersSection, "FlyingInsects");

            DetailObjectDistance = settings.GetValue <int>(advancedSection, "DetailDistance");
            DetailObjectDensity  = settings.GetValue <float>(advancedSection, "DetailDensity");

            detailPrototypesManager = new DetailPrototypesManager(properties);
            densityManager          = new DensityManager(density);
        }
        /// <summary>
        /// Initialize detail protoypes.
        /// </summary>
        public DetailPrototypesManager(PrototypesProperties properties)
        {
            Color healthyColor = new Color(0.70f, 0.70f, 0.70f);
            Color dryColor     = new Color(0.40f, 0.40f, 0.40f);

            this.textureOverride = properties.TextureOverride;

            // Create a holder for our grass and plants
            List <DetailPrototype> detailPrototypes = new List <DetailPrototype>();
            int index = 0;

            // Grass settings
            grassHeight    = properties.GrassHeight;
            grassColors    = properties.GrassColors;
            useGrassShader = properties.UseGrassShader;

            // We use GrassBillboard or Grass rendermode
            var grassPrototypes = new DetailPrototype()
            {
                minWidth         = properties.GrassWidth.Min,
                maxWidth         = properties.GrassWidth.Max,
                noiseSpread      = properties.NoiseSpread,
                renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                usePrototypeMesh = useGrassShader
            };

            detailPrototypes.Add(grassPrototypes);
            Grass = index;

            if (RealGrass.Instance.RealisticGrass)
            {
                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassDetails = ++index;

                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassAccents = ++index;
            }

            if (RealGrass.Instance.WaterPlants)
            {
                // Near-water plants settings
                // Here we use the Grass shader which support meshes, and textures with transparency.
                // This allow us to have more realistic plants which still bend in the wind.
                var waterPlantsNear = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = properties.NoiseSpreadPlants,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.Grass
                };
                detailPrototypes.Add(waterPlantsNear);
                WaterPlants = ++index;
            }

            if (RealGrass.Instance.TerrainStones)
            {
                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = 0.4f,
                    maxWidth         = 1,
                    minHeight        = 0.25f,
                    maxHeight        = 1.5f,
                    usePrototypeMesh = true,
                    noiseSpread      = 1,
                    renderMode       = DetailRenderMode.VertexLit
                });
                Rocks = ++index;
            }

            if (RealGrass.Instance.Flowers)
            {
                var flowerPrototypes = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.4f,
                    healthyColor     = healthyColor,
                    dryColor         = healthyColor,
                    renderMode       = DetailRenderMode.Grass
                };
                detailPrototypes.Add(flowerPrototypes);
                Flowers = ++index;
            }

            this.detailPrototypes = detailPrototypes.ToArray();
        }
        /// <summary>
        /// Initialize detail protoypes.
        /// </summary>
        public DetailPrototypesManager(PrototypesProperties properties)
        {
            Color healthyColor = new Color(0.70f, 0.70f, 0.70f);
            Color dryColor     = new Color(0.40f, 0.40f, 0.40f);

            this.textureOverride = properties.TextureOverride;

            // Create a holder for our grass and plants
            List <DetailPrototype> detailPrototypes = new List <DetailPrototype>();
            int index = 0;

            // Grass settings
            grassHeight    = properties.GrassHeight;
            grassColors    = properties.GrassColors;
            useGrassShader = properties.UseGrassShader;

            // We use GrassBillboard or Grass rendermode
            var grassPrototypes = new DetailPrototype()
            {
                minWidth         = properties.GrassWidth.Min,
                maxWidth         = properties.GrassWidth.Max,
                noiseSpread      = properties.NoiseSpread,
                renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                usePrototypeMesh = useGrassShader
            };

            detailPrototypes.Add(grassPrototypes);
            Grass = index;

            if (RealGrass.Instance.RealisticGrass)
            {
                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassDetails = ++index;

                detailPrototypes.Add(new DetailPrototype()
                {
                    minWidth         = properties.GrassWidth.Min,
                    maxWidth         = properties.GrassWidth.Max,
                    noiseSpread      = properties.NoiseSpread,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = useGrassShader ? DetailRenderMode.Grass : DetailRenderMode.GrassBillboard,
                    usePrototypeMesh = useGrassShader
                });
                GrassAccents = ++index;
            }

            if (RealGrass.Instance.WaterPlants)
            {
                // Near-water plants settings
                // Here we use the Grass shader which support meshes, and textures with transparency.
                // This allow us to have more realistic plants which still bend in the wind.
                var waterPlantsNear = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = properties.NoiseSpreadPlants,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.Grass
                };
                detailPrototypes.Add(waterPlantsNear);
                WaterPlants = ++index;

                // In-water plants settings
                // We use Grass as above
                var waterPlantsInside = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = properties.NoiseSpreadPlants,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.Grass
                };
                detailPrototypes.Add(waterPlantsInside);
                WaterPlantsAlt = ++index;
            }

            if (RealGrass.Instance.TerrainStones)
            {
                // Little stones
                // For stones we use VertexLit as we are placing 3d static models.
                var stonesPrototypes = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.4f,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.VertexLit,
                    prototype        = LoadGameObject(stone)
                };
                detailPrototypes.Add(stonesPrototypes);
                Stones = ++index;

                var rocksPrototypes = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.4f,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.VertexLit,
                };
                detailPrototypes.Add(rocksPrototypes);
                Rocks = ++index;
            }

            if (RealGrass.Instance.Flowers)
            {
                // Medium-sized vegetation
                var bushesPrototypes = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.4f,
                    healthyColor     = healthyColor,
                    dryColor         = dryColor,
                    renderMode       = DetailRenderMode.Grass,
                };
                detailPrototypes.Add(bushesPrototypes);
                Bushes = ++index;

                // Little flowers
                var flowerPrototypes = new DetailPrototype()
                {
                    usePrototypeMesh = true,
                    noiseSpread      = 0.4f,
                    healthyColor     = healthyColor,
                    dryColor         = healthyColor,
                    renderMode       = DetailRenderMode.Grass,
                };
                detailPrototypes.Add(flowerPrototypes);
                Flowers = ++index;
            }

            this.detailPrototypes = detailPrototypes.ToArray();
        }