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(); } }
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(); }