| DefineClass.EnrichBrushObjectSet = { | |
| __parents = { "PropertyObject", }, | |
| properties = { | |
| { id = "Name", editor = "text", default = "", translate = false, }, | |
| { id = "Objects", editor = "string_list", default = {}, items = ClassDescendantsCombo("CObject"), }, | |
| { id = "Weight", editor = "number", default = 100, min = 1, max = 1000, step = 1, slider = true, }, | |
| { id = "AngleDeviation", name = "Angle deviation", editor = "number", default = 0, min = 0, max = 180, step = 1, slider = true, }, | |
| { id = "Scale", editor = "number", default = 100, min = 10, max = 250, step = 1, slider = true, }, | |
| { id = "ScaleDeviation", name = "Scale deviation", editor = "number", default = 0, min = 0, max = 100, step = 1, slider = true, }, | |
| { id = "ColorMin", name = "Color min", editor = "color", default = RGB(100, 100, 100), }, | |
| { id = "ColorMax", name = "Color max", editor = "color", default = RGB(100, 100, 100), }, | |
| }, | |
| EditorName = "Object Set", | |
| } | |
| function EnrichBrushObjectSet:GetEditorView() | |
| local name = self.Name | |
| local count = #self.Objects | |
| local weight = self.Weight | |
| return string.format("%s (%s objects, weight %s)", name, count, weight) | |
| end | |
| DefineClass.EnrichBrushRule = { | |
| __parents = { "PropertyObject" }, | |
| properties = { | |
| { id = "Terrains", editor = "texture_picker", default = {}, thumb_size = 100, small_font = true, max_rows = 3, multiple = true, | |
| items = GetTerrainTexturesItems, }, | |
| { id = "ObjectSets", name = "Object Sets", editor = "nested_list", base_class = "EnrichBrushObjectSet", default = {}, inclusive = true, }, | |
| }, | |
| } | |
| function EnrichBrushRule:GetEditorView() | |
| local objects = {} | |
| for _, set in ipairs(self.ObjectSets) do objects = table.union(objects, set.Objects) end | |
| if #objects ~= 0 then table.sort(objects) end | |
| return string.format("Terrains: %s\nObjects: %s", table.concat(self.Terrains, ", "), table.concat(objects, ", ")) | |
| end | |
| DefineClass.EnrichTerrainPreset = { | |
| __parents = { "Preset" }, | |
| EditorMenubarName = "Enrich Terrain Presets", | |
| EditorMenubar = "Map", | |
| ContainerClass = "EnrichBrushRule", | |
| GlobalMap = "EnrichTerrainPresets", | |
| PresetClass = "EnrichTerrainPreset", | |
| } | |
| function EnrichTerrainPreset:GetError() | |
| local terrains = {} | |
| for _, rule in ipairs(self or empty_table) do | |
| for i, ter in ipairs(rule.Terrains) do | |
| if terrains[ter] then | |
| return string.format("Terrain '%s' is already used by another rule.", ter) | |
| else | |
| terrains[ter] = true | |
| end | |
| end | |
| end | |
| end | |
| DefineClass.XEnrichTerrainTool = { | |
| __parents = { "XPlaceMultipleObjectsToolBase" }, | |
| properties = { | |
| { id = "Preset", name = "Enrich preset", editor = "preset_id", default = "", preset_class = "EnrichTerrainPreset", }, | |
| }, | |
| ToolTitle = "Enrich terrain", | |
| Description = { | |
| "Adds randomized objects according to predefined presets.", | |
| }, | |
| classes = false, | |
| terrains = false, | |
| ToolSection = "Terrain", | |
| ActionIcon = "CommonAssets/UI/Editor/Tools/EnrichTerrain.tga", | |
| ActionShortcut = "Ctrl-T", | |
| } | |
| function XEnrichTerrainTool:OnEditorSetProperty(prop_id) | |
| if prop_id == "Preset" then | |
| local preset = EnrichTerrainPresets[self:GetPreset()] | |
| self.classes, self.terrains = {}, {} | |
| if not preset then return end | |
| for _, rule in ipairs(preset) do | |
| local terrains = rule.Terrains | |
| local sets = rule.ObjectSets | |
| for _, ter in ipairs(terrains) do | |
| if not self.terrains[ter] then self.terrains[ter] = sets end | |
| end | |
| for _, set in ipairs(sets) do self.classes = table.union(self.classes, set.Objects) end | |
| end | |
| end | |
| end | |
| function XEnrichTerrainTool:GetObjSet(pt) | |
| if not self:GetPreset() or self:GetPreset() == "" then return end | |
| local ter = pt and TerrainTextures[terrain.GetTerrainType(pt)] | |
| return self.terrains[ter.id] and table.weighted_rand(self.terrains[ter.id], "Weight") | |
| end | |
| function XEnrichTerrainTool:GetParams(pt) | |
| local set = self:GetObjSet(pt) | |
| if set then return self.terrain_normal, set.Scale, set.ScaleDeviation, set.AngleDeviation, set.ColorMin, set.ColorMax end | |
| end | |
| function XEnrichTerrainTool:GetClassesForPlace(pt) | |
| local set = self:GetObjSet(pt) | |
| return set and set.Objects | |
| end | |
| function XEnrichTerrainTool:GetClassesForDelete() | |
| return self.classes | |
| end | |