Handle loading error and placeholder shaders

This commit is contained in:
Simon Lübeß
2025-07-10 14:59:37 +02:00
parent 1b63c922da
commit c2d330fc8f
8 changed files with 192 additions and 56 deletions
@@ -0,0 +1,28 @@
#include "GlitchyEngine.hlsl"
struct VS_IN
{
float3 Position : POSITION;
};
struct PS_IN
{
float4 Position : SV_POSITION;
};
PS_IN VS(VS_IN input)
{
PS_IN output;
float4 worldPosition = mul(Transform, float4(input.Position, 1));
output.Position = mul(ViewProjection, worldPosition);
return output;
}
float4 PS(PS_IN input) : SV_TARGET
{
return float4(1, 0, 1, 1);
}
#pragma Effect[VS = VS; PS = PS]
@@ -0,0 +1,11 @@
{
AssetLoader = null,
Config = null,
Importer = "ShaderImporter",
ImporterConfig = null,
Processor = null,
ProcessorConfig = null,
Exporter = null,
ExporterConfig = null,
AssetHandle = 652951988555027469
}
@@ -0,0 +1,28 @@
#include "GlitchyEngine.hlsl"
struct VS_IN
{
float3 Position : POSITION;
};
struct PS_IN
{
float4 Position : SV_POSITION;
};
PS_IN VS(VS_IN input)
{
PS_IN output;
float4 worldPosition = mul(Transform, float4(input.Position, 1));
output.Position = mul(ViewProjection, worldPosition);
return output;
}
float4 PS(PS_IN input) : SV_TARGET
{
return float4(0, 1, 1, 1);
}
#pragma Effect[VS = VS; PS = PS]
@@ -0,0 +1,11 @@
{
AssetLoader = null,
Config = null,
Importer = "ShaderImporter",
ImporterConfig = null,
Processor = null,
ProcessorConfig = null,
Exporter = null,
ExporterConfig = null,
AssetHandle = 3052446500956620342
}
@@ -316,8 +316,7 @@ namespace GlitchyEditor.EditWindows
{ {
_manager.Update(); _manager.Update();
// Show History /*if (ImGui.Begin("Debug History"))
if (ImGui.Begin("Debug History"))
{ {
ImGui.CollapsingHeader("History"); ImGui.CollapsingHeader("History");
for (String path in _directoryHistory.[Friend]_history) for (String path in _directoryHistory.[Friend]_history)
@@ -338,7 +337,7 @@ namespace GlitchyEditor.EditWindows
} }
ImGui.End(); ImGui.End();
} }*/
// Make sure we are in an existing directory. // Make sure we are in an existing directory.
if (!_manager.AssetHierarchy.FileExists(CurrentDirectory)) if (!_manager.AssetHierarchy.FileExists(CurrentDirectory))
@@ -745,57 +744,81 @@ namespace GlitchyEditor.EditWindows
private ImGui.RectangleSelectionData _rectangleSelection; private ImGui.RectangleSelectionData _rectangleSelection;
enum Modifiers
{
None,
Alt,
Ctrl,
Shift
}
private void HandleShortcuts()
{
Modifiers modifiers = .None;
Enum.SetFlagConditionally(ref modifiers, .Alt, Input.IsKeyPressed(.Alt));
Enum.SetFlagConditionally(ref modifiers, .Ctrl, Input.IsKeyPressed(.Control));
Enum.SetFlagConditionally(ref modifiers, .Shift, Input.IsKeyPressed(.Shift));
// TODO: Come up with a good hotkey system...
if (modifiers == .Alt)
{
if (Input.IsKeyPressing(.Up))
{
NavigateUp();
}
if (Input.IsKeyPressing(.Left))
{
NavigateBack();
}
if (Input .IsKeyPressing(.Right))
{
NavigateForward();
}
}
if (Input.IsMouseButtonPressing(.XButton1))
{
NavigateBack();
}
if (Input.IsMouseButtonPressing(.XButton2))
{
NavigateForward();
}
if (modifiers == .Ctrl)
{
if (Input.IsKeyPressing(.C))
{
CopySelectedFiles(cutFiles: false);
}
if (Input.IsKeyPressing(.X))
{
CopySelectedFiles(cutFiles: true);
}
if (Input.IsKeyPressing(.V))
{
PasteFiles(CurrentDirectory);
}
}
if (modifiers == .Ctrl | .Shift)
{
}
}
/// Renders the contents of _currentDirectory. Returns the node of the current directory, or null if the browser isn't in a directory. /// Renders the contents of _currentDirectory. Returns the node of the current directory, or null if the browser isn't in a directory.
private void DrawCurrentDirectory(TreeNode<AssetNode> currentDirectoryNode) private void DrawCurrentDirectory(TreeNode<AssetNode> currentDirectoryNode)
{ {
if (ImGui.IsWindowHovered()) if (ImGui.IsWindowHovered())
{ {
// TODO: Come up with a good hotkey system... HandleShortcuts();
if (Input.IsKeyPressed(.Alt))
{
if (Input.IsKeyPressing(.Up))
{
NavigateUp();
}
if (Input.IsKeyPressing(.Left))
{
NavigateBack();
}
if (Input .IsKeyPressing(.Right))
{
NavigateForward();
}
}
if (Input.IsMouseButtonPressing(.XButton1))
{
NavigateBack();
}
if (Input.IsMouseButtonPressing(.XButton2))
{
NavigateForward();
}
if (Input.IsKeyPressed(.Control))
{
if (Input.IsKeyPressing(.C))
{
CopySelectedFiles(cutFiles: false);
}
if (Input.IsKeyPressing(.X))
{
CopySelectedFiles(cutFiles: true);
}
if (Input.IsKeyPressing(.V))
{
PasteFiles(CurrentDirectory);
}
}
} }
List<TreeNode<AssetNode>> directoryEntries = scope List<TreeNode<AssetNode>>(); List<TreeNode<AssetNode>> directoryEntries = scope List<TreeNode<AssetNode>>();
+36 -4
View File
@@ -367,7 +367,16 @@ class EditorContentManager : IContentManager
if (!_handleToAsset.TryGetValue(handle, out asset)) if (!_handleToAsset.TryGetValue(handle, out asset))
{ {
LoadAsset(handle, blocking); AssetHandle handleAfterLoading = LoadAsset(handle, blocking);
if (handleAfterLoading == .Invalid)
{
// TODO: If the asset existed at some point, the cache might still know of it.
// Or we store the asset name somewhere else. (For the editor in the asset using it?)
asset = new NewPlaceholderAsset(handle, .Error);
AssignHandleAndManage(asset, handle);
}
} }
if (var placeholder = asset as PlaceholderAsset) if (var placeholder = asset as PlaceholderAsset)
@@ -401,6 +410,8 @@ class EditorContentManager : IContentManager
private Asset GetPlaceholderAsset(Type assetType, PlaceholderType placeholderType) private Asset GetPlaceholderAsset(Type assetType, PlaceholderType placeholderType)
{ {
// TODO: Probably don't hardcode paths here.
// TODO: Probably verify existence at start of application.
switch (assetType) switch (assetType)
{ {
case typeof(Texture2D): case typeof(Texture2D):
@@ -414,6 +425,17 @@ class EditorContentManager : IContentManager
AssetHandle handle = LoadAsset("Resources/Textures/ErrorTexture2D.png", true); AssetHandle handle = LoadAsset("Resources/Textures/ErrorTexture2D.png", true);
return GetAsset(null, handle); return GetAsset(null, handle);
} }
case typeof(Effect):
if (placeholderType == .Loading)
{
AssetHandle handle = LoadAsset("Resources/Shaders/PlaceholderLoading.fx", true);
return GetAsset(null, handle);
}
else if (placeholderType == .Error)
{
AssetHandle handle = LoadAsset("Resources/Shaders/PlaceholderError.fx", true);
return GetAsset(null, handle);
}
} }
return null; return null;
@@ -623,6 +645,7 @@ class EditorContentManager : IContentManager
using (_finishedEntriesLock.Enter()) using (_finishedEntriesLock.Enter())
{ {
loadedAsset.Identifier = assetNode.Identifier; loadedAsset.Identifier = assetNode.Identifier;
// TODO: AssignHandleAndManage
loadedAsset.[Friend]_contentManager = this; loadedAsset.[Friend]_contentManager = this;
loadedAsset.[Friend]_handle = handle; loadedAsset.[Friend]_handle = handle;
@@ -874,14 +897,23 @@ class EditorContentManager : IContentManager
// If this happens too often we could use a different random generator // If this happens too often we could use a different random generator
} }
//_handles.Add(asset.Identifier, handle); AssignHandleAndManage(asset, handle);
return handle;
}
private void AssignHandleAndManage(Asset asset, AssetHandle handle)
{
if (_handleToAsset.TryGetValue(handle, let existingAsset))
{
existingAsset.ReleaseRef();
}
_handleToAsset.Add(handle, asset); _handleToAsset.Add(handle, asset);
asset.[Friend]_contentManager = this; asset.[Friend]_contentManager = this;
asset.[Friend]_handle = handle; asset.[Friend]_handle = handle;
asset.AddRef(); asset.AddRef();
return handle;
} }
private void SwapAsset(Asset oldAsset, Asset newAsset) private void SwapAsset(Asset oldAsset, Asset newAsset)
@@ -27,7 +27,10 @@ class MaterialLoader : IProcessedAssetLoader
String textureName = scope String(textureNameLength); String textureName = scope String(textureNameLength);
stream.ReadStrSized32(textureNameLength, textureName); stream.ReadStrSized32(textureNameLength, textureName);
material.SetTexture(textureName, textureHandle); if (material.SetTexture(textureName, textureHandle) case .Err(let error))
{
Log.EngineLogger.Error($"Failed to set texture slot {textureName}: {error}");
}
} }
uint16 bufferCount = Try!(stream.Read<uint16>()); uint16 bufferCount = Try!(stream.Read<uint16>());
+2 -2
View File
@@ -532,7 +532,7 @@ namespace GlitchyEngine.Renderer
s_quadBatchMaterial.SetVariable("ViewProjection", sceneViewProjection); s_quadBatchMaterial.SetVariable("ViewProjection", sceneViewProjection);
//s_currentQuadEffect.Get()?.Variables["ViewProjection"].SetData(viewProjection); //s_currentQuadEffect.Get()?.Variables["ViewProjection"].SetData(viewProjection);
s_currentCircleEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection); //s_currentCircleEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection);
s_currentLineEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection); s_currentLineEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection);
s_drawOrder = drawOrder; s_drawOrder = drawOrder;
@@ -574,7 +574,7 @@ namespace GlitchyEngine.Renderer
//s_currentQuadEffect.Get()?.Variables["ViewProjection"].SetData(viewProjection); //s_currentQuadEffect.Get()?.Variables["ViewProjection"].SetData(viewProjection);
s_quadBatchMaterial.SetVariable("ViewProjection", sceneViewProjection); s_quadBatchMaterial.SetVariable("ViewProjection", sceneViewProjection);
s_currentCircleEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection); //s_currentCircleEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection);
s_currentLineEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection); s_currentLineEffect.Get()?.Variables["ViewProjection"].SetData(sceneViewProjection);
s_drawOrder = drawOrder; s_drawOrder = drawOrder;