1
+ #pragma warning disable 168
1
2
using System . Threading ;
2
3
using Nanoforge . App ;
3
4
using Nanoforge . Rfg ;
@@ -8,6 +9,8 @@ using Nanoforge.Rfg.Import;
8
9
using Nanoforge . Misc ;
9
10
using Nanoforge . Render ;
10
11
using Common . Math ;
12
+ using Nanoforge . Render . Resources ;
13
+ using System . Collections ;
11
14
12
15
namespace Nanoforge . Gui . Documents
13
16
{
@@ -33,6 +36,10 @@ namespace Nanoforge.Gui.Documents
33
36
Loading = true ;
34
37
defer { Loading = false ; }
35
38
39
+ //Create scene for rendering
40
+ Renderer renderer = app . GetResource < Renderer > ( ) ;
41
+ _scene = renderer . CreateScene ( ) ;
42
+
36
43
//Check if the map was already imported
37
44
Territory findResult = ProjectDB . Find < Territory > ( MapName ) ;
38
45
if ( findResult != null )
@@ -56,9 +63,50 @@ namespace Nanoforge.Gui.Documents
56
63
return ;
57
64
}
58
65
59
- //Create scene for rendering
60
- Renderer renderer = app . GetResource < Renderer > ( ) ;
61
- _scene = renderer . CreateScene ( ) ;
66
+ //Create render objects for meshes
67
+ for ( Zone zone in Map. Zones)
68
+ {
69
+ for ( int i in 0 ... 8 )
70
+ {
71
+ List < u8 > indexBuffer = null ;
72
+ List < u8 > vertexBuffer = null ;
73
+ defer { DeleteIfSet ! ( indexBuffer ) ; }
74
+ defer { DeleteIfSet ! ( vertexBuffer ) ; }
75
+ if ( zone . LowLodTerrainIndexBuffers [ i ] . Load ( ) case . Ok ( let val ) )
76
+ {
77
+ indexBuffer = val ;
78
+ }
79
+ else
80
+ {
81
+ Logger . Error ( "Failed to load index buffer for low lod terrain submesh {} of {}." , i , zone . Name ) ;
82
+ continue ;
83
+ }
84
+ if ( zone . LowLodTerrainVertexBuffers [ i ] . Load ( ) case . Ok ( let val ) )
85
+ {
86
+ vertexBuffer = val ;
87
+ }
88
+ else
89
+ {
90
+ Logger . Error ( "Failed to load vertex buffer for low lod terrain submesh {} of {}." , i , zone . Name ) ;
91
+ continue ;
92
+ }
93
+
94
+ Mesh mesh = new . ( ) ;
95
+ if ( mesh . Init ( renderer . Device , zone . LowLodTerrainMeshConfig [ i ] , indexBuffer , vertexBuffer ) case . Ok )
96
+ {
97
+ if ( _scene . CreateRenderObject ( "TerrainLowLod" , mesh , zone . TerrainPosition , . Identity ) case . Err )
98
+ {
99
+ Logger . Error ( "Failed to create render object for low lod terrain submesh {} of {}" , i , zone . Name ) ;
100
+ continue ;
101
+ }
102
+ }
103
+ else
104
+ {
105
+ Logger . Error ( "Failed to create render object for low lod terrain submesh {} of {}" , i , zone . Name ) ;
106
+ delete mesh ;
107
+ }
108
+ }
109
+ }
62
110
}
63
111
64
112
public override void Update ( App app , Gui gui )
@@ -68,6 +116,31 @@ namespace Nanoforge.Gui.Documents
68
116
ThreadPool . QueueUserWorkItem ( new ( ) => { this . Load ( app ) ; } ) ;
69
117
}
70
118
119
+ if ( _scene != null )
120
+ {
121
+ //Update scene viewport size
122
+ ImGui . Vec2 contentAreaSize ;
123
+ contentAreaSize . x = ImGui . GetWindowContentRegionMax ( ) . x - ImGui . GetWindowContentRegionMin ( ) . x ;
124
+ contentAreaSize . y = ImGui . GetWindowContentRegionMax ( ) . y - ImGui . GetWindowContentRegionMin ( ) . y ;
125
+ if ( contentAreaSize . x > 0.0f && contentAreaSize . y > 0.0f )
126
+ {
127
+ _scene . Resize ( ( u32 ) contentAreaSize . x , ( u32 ) contentAreaSize . y ) ;
128
+ }
129
+
130
+ //Store initial position so we can draw buttons over the scene texture after drawing it
131
+ ImGui . Vec2 initialPos = ImGui . GetCursorPos ( ) ;
132
+
133
+ //Render scene texture
134
+ ImGui . PushStyleColor ( . WindowBg , . ( _scene . ClearColor . x , _scene . ClearColor . y , _scene . ClearColor . z , _scene . ClearColor . w ) ) ;
135
+ ImGui . Image ( _scene . View , . ( _scene . ViewWidth , _scene . ViewHeight ) ) ;
136
+ ImGui . PopStyleColor ( ) ;
137
+
138
+ //Set cursor pos to top left corner to draw buttons over scene texture
139
+ ImGui . Vec2 adjustedPos = initialPos ;
140
+ adjustedPos . x += 10.0f ;
141
+ adjustedPos . y += 10.0f ;
142
+ ImGui . SetCursorPos ( adjustedPos ) ;
143
+ }
71
144
if ( Loading )
72
145
return ;
73
146
@@ -82,29 +155,6 @@ namespace Nanoforge.Gui.Documents
82
155
_scene . DrawBox ( obj . BBox . Min , obj . BBox . Max , color ) ;
83
156
}
84
157
}
85
-
86
- //Update scene viewport size
87
- ImGui . Vec2 contentAreaSize ;
88
- contentAreaSize . x = ImGui . GetWindowContentRegionMax ( ) . x - ImGui . GetWindowContentRegionMin ( ) . x ;
89
- contentAreaSize . y = ImGui . GetWindowContentRegionMax ( ) . y - ImGui . GetWindowContentRegionMin ( ) . y ;
90
- if ( contentAreaSize . x > 0.0f && contentAreaSize . y > 0.0f )
91
- {
92
- _scene . Resize ( ( u32 ) contentAreaSize . x , ( u32 ) contentAreaSize . y ) ;
93
- }
94
-
95
- //Store initial position so we can draw buttons over the scene texture after drawing it
96
- ImGui . Vec2 initialPos = ImGui . GetCursorPos ( ) ;
97
-
98
- //Render scene texture
99
- ImGui . PushStyleColor ( . WindowBg , . ( _scene . ClearColor. x, _scene . ClearColor. y, _scene . ClearColor. z, _scene . ClearColor. w) ) ;
100
- ImGui . Image ( _scene . View, . ( _scene . ViewWidth, _scene . ViewHeight) ) ;
101
- ImGui . PopStyleColor ( ) ;
102
-
103
- //Set cursor pos to top left corner to draw buttons over scene texture
104
- ImGui . Vec2 adjustedPos = initialPos ;
105
- adjustedPos . x += 10.0f ;
106
- adjustedPos . y += 10.0f ;
107
- ImGui. SetCursorPos ( adjustedPos ) ;
108
158
}
109
159
110
160
public override void Save ( App app , Gui gui )
@@ -114,6 +164,12 @@ namespace Nanoforge.Gui.Documents
114
164
115
165
public override void OnClose ( App app , Gui gui )
116
166
{
167
+ if ( _scene != null )
168
+ {
169
+ Renderer renderer = app . GetResource < Renderer > ( ) ;
170
+ renderer . DestroyScene ( _scene ) ;
171
+ }
172
+
117
173
return ;
118
174
}
119
175
0 commit comments