@@ -28,7 +28,8 @@ public class ShaderEditor : IImGuiComponent
28
28
private string fps = "" ;
29
29
private float fpsUpdateCurrentInterval = 0 ;
30
30
31
- private string errorMessage ;
31
+ private string previousError = null ;
32
+ private readonly List < string > errorMessages = new List < string > ( ) ;
32
33
33
34
private string fragmentCode = @"// Available inputs
34
35
// mouse (vec4) : x,y => position, z => mouse 1 down, z => mouse 2 down
@@ -165,13 +166,6 @@ private unsafe void SubmitEditorWindow()
165
166
{
166
167
ImGui . PushFont ( Controller . EditorFont ) ;
167
168
Vector2 editorWindowSize = ImGui . GetWindowSize ( ) ;
168
- // TODO get rid of this crap right here
169
- if ( errorMessage != null )
170
- {
171
- ImGui . PushTextWrapPos ( ) ;
172
- ImGui . TextColored ( RgbaFloat . Red . ToVector4 ( ) , errorMessage ) ;
173
- ImGui . PopTextWrapPos ( ) ;
174
- }
175
169
if ( ImGui . BeginChild ( "editor" , Vector2 . Zero , true ) )
176
170
{
177
171
// handle basic input
@@ -217,9 +211,16 @@ private unsafe void SubmitEditorWindow()
217
211
{
218
212
string line = fragmentCodeLines [ i ] ;
219
213
string lineNumber = $ "{ i + Controller . Context . FragmentHeaderLineCount } ";
214
+ bool isError = errorMessages . Any ( msg => msg . StartsWith ( $ "{ lineNumber } :") ) ;
220
215
bool isEdited = i == editorSelectedLineIndex ;
221
- ImGui . TextColored ( isEdited ? RgbaFloat . Green . ToVector4 ( ) : RgbaFloat . LightGrey . ToVector4 ( ) , lineNumber ) ;
216
+ ImGui . TextColored (
217
+ isEdited ? RgbaFloat . Green . ToVector4 ( ) : isError ? RgbaFloat . Red . ToVector4 ( ) : RgbaFloat . LightGrey . ToVector4 ( ) ,
218
+ lineNumber ) ;
222
219
ImGui . SameLine ( 50 ) ;
220
+ if ( isError )
221
+ {
222
+ ImGui . PushStyleColor ( ImGuiCol . Text , RgbaFloat . Red . ToVector4 ( ) ) ;
223
+ }
223
224
if ( isEdited )
224
225
{
225
226
ImGui . PushStyleVar ( ImGuiStyleVar . FramePadding , Vector2 . Zero ) ;
@@ -253,12 +254,30 @@ private unsafe void SubmitEditorWindow()
253
254
{
254
255
SetSelectedLine ( i ) ;
255
256
}
257
+ if ( isError )
258
+ {
259
+ ImGui . PopStyleColor ( 1 ) ;
260
+ }
256
261
}
257
262
ImGui . EndChild ( ) ;
258
263
}
259
264
ImGui . PopFont ( ) ;
260
265
ImGui . End ( ) ;
261
266
}
267
+ if ( errorMessages . Count != 0 )
268
+ {
269
+ ImGui . SetNextWindowSizeConstraints ( new Vector2 ( 500 , 16 ) , new Vector2 ( 500 , 500 ) ) ;
270
+ ImGui . BeginTooltip ( ) ;
271
+ ImGui . PushTextWrapPos ( ) ;
272
+ for ( int i = 0 ; i < errorMessages . Count ; i ++ )
273
+ {
274
+ string errorMessage = errorMessages [ i ] ;
275
+ if ( string . IsNullOrWhiteSpace ( errorMessage ) ) continue ;
276
+ ImGui . TextColored ( RgbaFloat . Red . ToVector4 ( ) , errorMessage ) ;
277
+ }
278
+ ImGui . PopTextWrapPos ( ) ;
279
+ ImGui . EndTooltip ( ) ;
280
+ }
262
281
ImGui . PopStyleVar ( ) ;
263
282
}
264
283
@@ -300,7 +319,16 @@ public void Update(float deltaTime)
300
319
301
320
public void SetError ( string error )
302
321
{
303
- errorMessage = error ;
322
+ if ( error == previousError ) return ;
323
+ errorMessages . Clear ( ) ;
324
+ if ( error != null )
325
+ {
326
+ errorMessages . AddRange ( Regex . Split (
327
+ error . Replace ( "Compilation failed: " , "" )
328
+ . Replace ( "<veldrid-spirv-input>:" , "" ) ,
329
+ "\r \n |\r |\n " ) ) ;
330
+ }
331
+ previousError = error ;
304
332
}
305
333
306
334
public void Apply ( )
0 commit comments