File size: 4,128 Bytes
b6a38d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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