Skip to content

Commit 7d87dab

Browse files
committed
Implement RmlUi versions for all map editors using shared models
- RmlUiTextureEditor: Full implementation with tool modes and field visibility - RmlUiWaterEditor: Water rendering parameters from shared model - RmlUiMetalEditor: Metal map editing using shared model - RmlUiGrassEditor: Grass detail and brush fields - RmlUiSkyEditor: Sky/fog/atmosphere parameters - RmlUiLightingEditor: Sun direction and lighting controls - RmlUiTerrainSettingsEditor: Map rendering and texture management All 7 new RmlUi editors use the same models as Chili versions Zero code duplication - complete MVC separation achieved
1 parent 7961063 commit 7d87dab

File tree

8 files changed

+615
-10
lines changed

8 files changed

+615
-10
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
--- RmlUi Grass Editor
2+
3+
RmlUiGrassEditor = RmlUiEditorBase:extends{}
4+
5+
function RmlUiGrassEditor:init(model)
6+
self:super("init")
7+
self.model = model or GrassEditorModel()
8+
self.editorTitle = "Grass Editor"
9+
10+
local fieldDefs = self.model:GetFieldDefinitions()
11+
for _, fieldDef in ipairs(fieldDefs) do
12+
if fieldDef.type == "asset" then
13+
self:AddField(AssetField({
14+
name = fieldDef.name,
15+
title = fieldDef.title,
16+
rootDir = fieldDef.rootDir,
17+
expand = fieldDef.expand,
18+
itemWidth = fieldDef.itemWidth,
19+
itemHeight = fieldDef.itemHeight,
20+
}))
21+
elseif fieldDef.type == "numeric" then
22+
self:AddField(NumericField({
23+
name = fieldDef.name,
24+
value = fieldDef.value,
25+
min = fieldDef.min,
26+
max = fieldDef.max,
27+
step = fieldDef.step,
28+
title = fieldDef.title,
29+
tooltip = fieldDef.tooltip,
30+
width = 200,
31+
}))
32+
end
33+
end
34+
end
35+
36+
function RmlUiGrassEditor:OnFieldChange(name, value)
37+
local fieldDefs = self.model:GetFieldDefinitions()
38+
for _, fieldDef in ipairs(fieldDefs) do
39+
if fieldDef.name == name and fieldDef.updateFunc then
40+
fieldDef.updateFunc(value)
41+
end
42+
end
43+
self.model:OnFieldChange(name, value)
44+
end
45+
46+
function RmlUiGrassEditor:IsValidState(state)
47+
return self.model:IsValidState(state)
48+
end
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
--- RmlUi Lighting Editor
2+
3+
RmlUiLightingEditor = RmlUiEditorBase:extends{}
4+
5+
function RmlUiLightingEditor:init(model)
6+
self:super("init")
7+
self.model = model or LightingEditorModel()
8+
self.editorTitle = "Lighting Editor"
9+
10+
local fieldDefs = self.model:GetFieldDefinitions()
11+
for _, fieldDef in ipairs(fieldDefs) do
12+
self:AddFieldFromDef(fieldDef)
13+
end
14+
15+
self:SetFieldValue("shadowMode", self.model:GetInitialShadowMode())
16+
self:UpdateLighting()
17+
SB.commandManager:addListener(self)
18+
end
19+
20+
function RmlUiLightingEditor:AddFieldFromDef(fieldDef)
21+
if fieldDef.type == "choice" then
22+
self:AddField(ChoiceField({
23+
name = fieldDef.name,
24+
title = fieldDef.title,
25+
tooltip = fieldDef.tooltip,
26+
items = fieldDef.items,
27+
width = 200,
28+
}))
29+
elseif fieldDef.type == "numeric" then
30+
self:AddField(NumericField({
31+
name = fieldDef.name,
32+
title = fieldDef.title,
33+
tooltip = fieldDef.tooltip,
34+
value = fieldDef.value,
35+
min = fieldDef.min,
36+
max = fieldDef.max,
37+
width = 200,
38+
}))
39+
elseif fieldDef.type == "group" and fieldDef.fields then
40+
for _, subFieldDef in ipairs(fieldDef.fields) do
41+
if subFieldDef.type == "numeric" then
42+
self:AddField(NumericField({
43+
name = subFieldDef.name,
44+
title = subFieldDef.title,
45+
tooltip = subFieldDef.tooltip,
46+
value = subFieldDef.value,
47+
step = subFieldDef.step,
48+
width = 200,
49+
}))
50+
elseif subFieldDef.type == "color" then
51+
self:AddField(ColorField({
52+
name = subFieldDef.name,
53+
title = subFieldDef.title,
54+
tooltip = subFieldDef.tooltip,
55+
width = 200,
56+
format = subFieldDef.format,
57+
}))
58+
end
59+
end
60+
end
61+
end
62+
63+
function RmlUiLightingEditor:UpdateLighting()
64+
self.updating = true
65+
local params = self.model:UpdateLighting()
66+
for name, value in pairs(params) do
67+
self:SetFieldValue(name, value)
68+
end
69+
self.updating = false
70+
end
71+
72+
function RmlUiLightingEditor:OnCommandExecuted()
73+
if not self._startedChanging then
74+
self:UpdateLighting()
75+
end
76+
end
77+
78+
function RmlUiLightingEditor:OnStartChange(name)
79+
self.model:OnStartChange()
80+
end
81+
82+
function RmlUiLightingEditor:OnEndChange(name)
83+
self.model:OnEndChange()
84+
end
85+
86+
function RmlUiLightingEditor:OnFieldChange(name, value)
87+
if self.updating then
88+
return
89+
end
90+
self.model:OnFieldChange(name, value, self.fields)
91+
end
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
--- RmlUi Metal Editor
2+
3+
RmlUiMetalEditor = RmlUiEditorBase:extends{}
4+
5+
function RmlUiMetalEditor:init(model)
6+
self:super("init")
7+
self.model = model or MetalEditorModel()
8+
self.editorTitle = "Metal Editor"
9+
10+
local fieldDefs = self.model:GetFieldDefinitions()
11+
for _, fieldDef in ipairs(fieldDefs) do
12+
if fieldDef.type == "asset" then
13+
self:AddField(AssetField({
14+
name = fieldDef.name,
15+
title = fieldDef.title,
16+
rootDir = fieldDef.rootDir,
17+
expand = fieldDef.expand,
18+
itemWidth = fieldDef.itemWidth,
19+
itemHeight = fieldDef.itemHeight,
20+
}))
21+
elseif fieldDef.type == "numeric" then
22+
self:AddField(NumericField({
23+
name = fieldDef.name,
24+
value = fieldDef.value,
25+
min = fieldDef.min,
26+
max = fieldDef.max,
27+
title = fieldDef.title,
28+
tooltip = fieldDef.tooltip,
29+
width = 200,
30+
}))
31+
end
32+
end
33+
34+
self:AddButton({
35+
caption = "Show Metal Map",
36+
onClick = function()
37+
self.model:ShowMetalMap()
38+
end
39+
})
40+
end
41+
42+
function RmlUiMetalEditor:OnFieldChange(name, value)
43+
local fieldDefs = self.model:GetFieldDefinitions()
44+
for _, fieldDef in ipairs(fieldDefs) do
45+
if fieldDef.name == name and fieldDef.updateFunc then
46+
fieldDef.updateFunc(value)
47+
end
48+
end
49+
end
50+
51+
function RmlUiMetalEditor:IsValidState(state)
52+
return self.model:IsValidState(state)
53+
end
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
--- RmlUi Sky Editor
2+
3+
RmlUiSkyEditor = RmlUiEditorBase:extends{}
4+
5+
function RmlUiSkyEditor:init(model)
6+
self:super("init")
7+
self.model = model or SkyEditorModel()
8+
self.editorTitle = "Sky Editor"
9+
10+
local fieldDefs = self.model:GetFieldDefinitions()
11+
for _, fieldDef in ipairs(fieldDefs) do
12+
self:AddFieldFromDef(fieldDef)
13+
end
14+
15+
self:UpdateAtmosphere()
16+
SB.commandManager:addListener(self)
17+
end
18+
19+
function RmlUiSkyEditor:AddFieldFromDef(fieldDef)
20+
if fieldDef.type == "asset" then
21+
self:AddField(AssetField({
22+
name = fieldDef.name,
23+
title = fieldDef.title,
24+
tooltip = fieldDef.tooltip,
25+
rootDir = fieldDef.rootDir,
26+
width = 200,
27+
}))
28+
elseif fieldDef.type == "group" and fieldDef.fields then
29+
for _, subFieldDef in ipairs(fieldDef.fields) do
30+
if subFieldDef.type == "numeric" then
31+
self:AddField(NumericField({
32+
name = subFieldDef.name,
33+
title = subFieldDef.title,
34+
width = 200,
35+
tooltip = subFieldDef.tooltip,
36+
min = subFieldDef.min,
37+
max = subFieldDef.max,
38+
}))
39+
elseif subFieldDef.type == "color" then
40+
self:AddField(ColorField({
41+
name = subFieldDef.name,
42+
title = subFieldDef.title,
43+
width = 200,
44+
tooltip = subFieldDef.tooltip,
45+
format = subFieldDef.format,
46+
}))
47+
end
48+
end
49+
end
50+
end
51+
52+
function RmlUiSkyEditor:UpdateAtmosphere()
53+
self.updating = true
54+
local params = self.model:UpdateAtmosphere()
55+
for name, value in pairs(params) do
56+
self:SetFieldValue(name, value)
57+
end
58+
self.updating = false
59+
end
60+
61+
function RmlUiSkyEditor:OnCommandExecuted()
62+
if not self._startedChanging then
63+
self:UpdateAtmosphere()
64+
end
65+
end
66+
67+
function RmlUiSkyEditor:OnStartChange(name)
68+
self.model:OnStartChange()
69+
end
70+
71+
function RmlUiSkyEditor:OnEndChange(name)
72+
self.model:OnEndChange()
73+
end
74+
75+
function RmlUiSkyEditor:OnFieldChange(name, value)
76+
if self.updating then
77+
return
78+
end
79+
self.model:OnFieldChange(name, value)
80+
end
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
--- RmlUi Terrain Settings Editor
2+
3+
RmlUiTerrainSettingsEditor = RmlUiEditorBase:extends{}
4+
5+
function RmlUiTerrainSettingsEditor:init(model)
6+
self:super("init")
7+
self.model = model or TerrainSettingsEditorModel()
8+
self.editorTitle = "Terrain Settings"
9+
10+
local fieldDefs = self.model:GetFieldDefinitions()
11+
for _, fieldDef in ipairs(fieldDefs) do
12+
self:AddFieldFromDef(fieldDef)
13+
end
14+
15+
self:UpdateMapRendering()
16+
self:AddMapTextureControls()
17+
end
18+
19+
function RmlUiTerrainSettingsEditor:AddFieldFromDef(fieldDef)
20+
if fieldDef.type == "asset" then
21+
self:AddField(AssetField({
22+
name = fieldDef.name,
23+
title = fieldDef.title,
24+
tooltip = fieldDef.tooltip,
25+
rootDir = fieldDef.rootDir,
26+
width = 200,
27+
}))
28+
elseif fieldDef.type == "boolean" then
29+
self:AddField(BooleanField({
30+
name = fieldDef.name,
31+
title = fieldDef.title,
32+
tooltip = fieldDef.tooltip,
33+
width = 200,
34+
}))
35+
elseif fieldDef.type == "group" and fieldDef.fields then
36+
for _, subFieldDef in ipairs(fieldDef.fields) do
37+
if subFieldDef.type == "boolean" then
38+
self:AddField(BooleanField({
39+
name = subFieldDef.name,
40+
title = subFieldDef.title,
41+
tooltip = subFieldDef.tooltip,
42+
width = 200,
43+
}))
44+
end
45+
end
46+
end
47+
end
48+
49+
function RmlUiTerrainSettingsEditor:AddMapTextureControls()
50+
self.mapTextures = {}
51+
local textures = self.model:GetMapTextures()
52+
for _, tex in ipairs(textures) do
53+
local fname = "tex_" .. tostring(tex.name)
54+
self.mapTextures[fname] = tex.name
55+
self:AddField(BooleanField({
56+
name = fname,
57+
value = tex.exists,
58+
title = String.Capitalize(tex.name),
59+
tooltip = "Toggle texture enable: " .. tostring(tex.engineName),
60+
width = 200,
61+
}))
62+
end
63+
end
64+
65+
function RmlUiTerrainSettingsEditor:UpdateMapRendering()
66+
local params = self.model:UpdateMapRendering()
67+
if params then
68+
for name, value in pairs(params) do
69+
self:SetFieldValue(name, value)
70+
end
71+
end
72+
end
73+
74+
function RmlUiTerrainSettingsEditor:OnStartChange(name)
75+
self.model:OnStartChange()
76+
end
77+
78+
function RmlUiTerrainSettingsEditor:OnEndChange(name)
79+
self.model:OnEndChange()
80+
end
81+
82+
function RmlUiTerrainSettingsEditor:OnFieldChange(name, value)
83+
self.model:OnFieldChange(name, value, self.mapTextures, self.__isLoading)
84+
end

0 commit comments

Comments
 (0)