Fixed Textures in Materials

This commit is contained in:
Simon Lübeß
2023-03-16 23:32:02 +01:00
parent cfa046d2ea
commit 7b6662cbc4
4 changed files with 38 additions and 47 deletions
@@ -84,11 +84,10 @@ class MaterialAssetPropertiesEditor : AssetPropertiesEditor
{ {
StringView path = .((char8*)payload.Data, (int)payload.DataSize); StringView path = .((char8*)payload.Data, (int)payload.DataSize);
AssetHandle<Texture2D> newTexture = Content.LoadAsset(path);//new Texture2D(path, true)) AssetHandle<Texture2D> newTexture = Content.LoadAsset(path);
newTexture.Get().SamplerState = SamplerStateManager.AnisotropicWrap; newTexture.Get().SamplerState = SamplerStateManager.AnisotropicWrap;
material.SetTexture(texture.key, newTexture); material.SetTexture(texture.key, newTexture.Cast<Texture>());
// TODO!!!
} }
ImGui.EndDragDropTarget(); ImGui.EndDragDropTarget();
@@ -98,7 +97,6 @@ class MaterialAssetPropertiesEditor : AssetPropertiesEditor
private void ShowVariables(Material material, Effect effect) private void ShowVariables(Material material, Effect effect)
{ {
for (let (name, arguments) in effect.[Friend]_variableDescriptions) for (let (name, arguments) in effect.[Friend]_variableDescriptions)
{ {
let variable = effect.Variables[name]; let variable = effect.Variables[name];
@@ -350,9 +348,9 @@ class MaterialAssetLoader : IAssetLoader, IAssetSaver //, IReloadingAssetLoader
for (let (slotName, textureIdentifier) in materialFile.Textures) for (let (slotName, textureIdentifier) in materialFile.Textures)
{ {
Texture texture = Content.GetAsset<Texture>(contentManager.LoadAsset(textureIdentifier), contentManager); AssetHandle<Texture> texture = contentManager.LoadAsset(textureIdentifier);
if (texture == null) if (texture.IsInvalid)
{ {
Log.EngineLogger.Error($"Failed to load texture \"{textureIdentifier}\"."); Log.EngineLogger.Error($"Failed to load texture \"{textureIdentifier}\".");
// TODO: LoadAsset should return an error texture. // TODO: LoadAsset should return an error texture.
@@ -408,7 +406,9 @@ class MaterialAssetLoader : IAssetLoader, IAssetSaver //, IReloadingAssetLoader
for (let (slotName, texture) in material.[Friend]_textures) for (let (slotName, texture) in material.[Friend]_textures)
{ {
materialFile.Textures.Add(new String(slotName), new String(texture?.Identifier ?? "")); Texture textureAsset = texture.Get();
materialFile.Textures.Add(new String(slotName), new String(textureAsset?.Identifier ?? ""));
} }
Effect effect = material.Effect; Effect effect = material.Effect;
@@ -19,7 +19,6 @@ class PropertiesWindow : EditorWindow
private append String _selectedFileName = .(); private append String _selectedFileName = .();
private AssetHandle _currentAssetHandle; private AssetHandle _currentAssetHandle;
//private Asset _currentAsset;
public this(Editor editor) public this(Editor editor)
{ {
@@ -83,14 +82,6 @@ class PropertiesWindow : EditorWindow
_currentAssetHandle = _editor.ContentManager.LoadAsset(assetFile.Identifier); _currentAssetHandle = _editor.ContentManager.LoadAsset(assetFile.Identifier);
} }
/*if (asset != _currentAsset)
{
_currentAsset?.ReleaseRef();
_currentAsset = asset;
_currentAsset?.AddRef();
}*/
// TODO: allow changing AssetLoader // TODO: allow changing AssetLoader
// assetFile.AssetConfig.AssetLoade // assetFile.AssetConfig.AssetLoade
+21 -13
View File
@@ -13,6 +13,9 @@ struct AssetHandle : IHashable
/// Defines an asset that is invalid. /// Defines an asset that is invalid.
public const AssetHandle Invalid = .(UUID(0xAAAA'AAAA'AAAA'AAAA)); public const AssetHandle Invalid = .(UUID(0xAAAA'AAAA'AAAA'AAAA));
public bool IsValid => this == .Invalid;
public bool IsInvalid => !IsValid;
/// Create a new random AssetHandle /// Create a new random AssetHandle
public this() public this()
{ {
@@ -46,6 +49,9 @@ struct AssetHandle<T> where T : Asset
public const Self Invalid = .(); public const Self Invalid = .();
public bool IsValid => this == .Invalid;
public bool IsInvalid => !IsValid;
public this(AssetHandle handle, IContentManager contentManager = null) public this(AssetHandle handle, IContentManager contentManager = null)
{ {
_handle = handle; _handle = handle;
@@ -81,20 +87,9 @@ struct AssetHandle<T> where T : Asset
return handle.Get(); return handle.Get();
} }
public T Get(IContentManager contentManager = null) mut public T Get(IContentManager contentManager = null)
{ {
// We only care whether we are in a different frame -> we only compare the lower 8 bits. return Content.GetAsset<T>(_handle, contentManager == null ? _contentManager : contentManager);
//uint8 actualFrame = (uint8)Application.Get().GameTime.FrameCount;
//var actualActualFrame = Application.Get().GameTime.FrameCount;
//if (actualFrame != _currentFrame)
{
_asset = Content.GetAsset<T>(_handle, contentManager == null ? _contentManager : contentManager);
//_currentFrame = actualFrame;
//_actualCurrentFrame = Application.Get().GameTime.FrameCount;
}
return _asset;
} }
[Comptime, OnCompile(.TypeInit)] [Comptime, OnCompile(.TypeInit)]
@@ -250,4 +245,17 @@ struct AssetHandle<T> where T : Asset
Compiler.EmitTypeBody(typeof(Self), code); Compiler.EmitTypeBody(typeof(Self), code);
} }
} }
public AssetHandle<NewT> Cast<NewT>()
where NewT : Asset
where T : NewT
{
return AssetHandle<NewT>(this._handle, this._contentManager);
}
// TODO: Cast up?
public AssetHandle<NewT> Cast<NewT>() where NewT : T
{
return AssetHandle<NewT>(this._handle, this._contentManager);
}
} }
+9 -17
View File
@@ -14,7 +14,7 @@ public class Material : Asset
private uint8[] _rawVariables ~ delete _; private uint8[] _rawVariables ~ delete _;
private Dictionary<String, Texture> _textures = new .(); private Dictionary<String, AssetHandle<Texture>> _textures = new .() ~ delete _;
private Dictionary<String, (uint32 Offset, BufferVariable Variable)> _variables = new .() ~ delete _; private Dictionary<String, (uint32 Offset, BufferVariable Variable)> _variables = new .() ~ delete _;
@@ -29,25 +29,17 @@ public class Material : Asset
// Get texture slots from effect // Get texture slots from effect
for(let (name, entry) in _effect.Textures) for(let (name, entry) in _effect.Textures)
{ {
// TODO: Do we want to be able to define textures in the shader? // TODO: We need to be able to define default textures in the shader.
/*var texture = entry.BoundTexture; // At least things like "Black", "White", "Normal"
texture.AddRef();*/ // At best whole paths. Shouldn't be that hard to do...
/*var texture = entry.BoundTexture;*/
_textures.Add(name, null); _textures.Add(name, .Invalid);
} }
InitRawData(); InitRawData();
} }
public ~this()
{
for(let (name, texture) in _textures)
{
texture?.ReleaseRef();
}
delete _textures;
}
/** @brief Initializes the raw data array for the variables. /** @brief Initializes the raw data array for the variables.
*/ */
@@ -90,13 +82,13 @@ public class Material : Asset
* @param name The name of the texture to set. * @param name The name of the texture to set.
* @param texture The texture to bind to the effect. * @param texture The texture to bind to the effect.
*/ */
public void SetTexture(String name, Texture texture) public void SetTexture(String name, AssetHandle<Texture> texture)
{ {
if(_textures.TryGetValue(name, var entry)) if(_textures.TryGetValue(name, var entry))
{ {
entry?.ReleaseRef(); //entry?.ReleaseRef();
_textures[name] = texture; _textures[name] = texture;
texture?.AddRef(); //texture?.AddRef();
} }
else else
{ {