Skip to content

Commit 1268538

Browse files
committed
added better shader error handling
1 parent 28a3a6c commit 1268538

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed

YALCT/ShaderEditor.cs

+38-10
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ public class ShaderEditor : IImGuiComponent
2828
private string fps = "";
2929
private float fpsUpdateCurrentInterval = 0;
3030

31-
private string errorMessage;
31+
private string previousError = null;
32+
private readonly List<string> errorMessages = new List<string>();
3233

3334
private string fragmentCode = @"// Available inputs
3435
// mouse (vec4) : x,y => position, z => mouse 1 down, z => mouse 2 down
@@ -165,13 +166,6 @@ private unsafe void SubmitEditorWindow()
165166
{
166167
ImGui.PushFont(Controller.EditorFont);
167168
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-
}
175169
if (ImGui.BeginChild("editor", Vector2.Zero, true))
176170
{
177171
// handle basic input
@@ -217,9 +211,16 @@ private unsafe void SubmitEditorWindow()
217211
{
218212
string line = fragmentCodeLines[i];
219213
string lineNumber = $"{i + Controller.Context.FragmentHeaderLineCount}";
214+
bool isError = errorMessages.Any(msg => msg.StartsWith($"{lineNumber}:"));
220215
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);
222219
ImGui.SameLine(50);
220+
if (isError)
221+
{
222+
ImGui.PushStyleColor(ImGuiCol.Text, RgbaFloat.Red.ToVector4());
223+
}
223224
if (isEdited)
224225
{
225226
ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, Vector2.Zero);
@@ -253,12 +254,30 @@ private unsafe void SubmitEditorWindow()
253254
{
254255
SetSelectedLine(i);
255256
}
257+
if (isError)
258+
{
259+
ImGui.PopStyleColor(1);
260+
}
256261
}
257262
ImGui.EndChild();
258263
}
259264
ImGui.PopFont();
260265
ImGui.End();
261266
}
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+
}
262281
ImGui.PopStyleVar();
263282
}
264283

@@ -300,7 +319,16 @@ public void Update(float deltaTime)
300319

301320
public void SetError(string error)
302321
{
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;
304332
}
305333

306334
public void Apply()

0 commit comments

Comments
 (0)