Added option to create Materials in Asset Browser

This commit is contained in:
Simon Lübeß
2023-08-01 16:24:31 +02:00
parent e8a5594540
commit 253dd8087e
5 changed files with 133 additions and 137 deletions
+44 -44
View File
@@ -469,7 +469,7 @@ class MaterialAssetLoader : IAssetLoader, IAssetSaver //, IReloadingAssetLoader
MaterialFile materialFile = scope .();
materialFile.Effect = new String(material.Effect.Identifier);
materialFile.Effect = new String(material.Effect?.Identifier ?? "");
materialFile.Textures = new .();
materialFile.Variables = new .();
@@ -482,59 +482,59 @@ class MaterialAssetLoader : IAssetLoader, IAssetSaver //, IReloadingAssetLoader
Effect effect = material.Effect;
if (effect == null)
return .Ok;
for (let (name, arguments) in effect.[Friend]_variableDescriptions)
if (effect != null)
{
VariableValue variableValue = .None;
let variable = effect.Variables[name];
bool hasPreviewType = MaterialAssetPropertiesEditor.TryGetValue(arguments, "Type", var previewType);
if (hasPreviewType && previewType.Get<String>() == "Color")
for (let (name, arguments) in effect.[Friend]_variableDescriptions)
{
Log.EngineLogger.AssertDebug(variable.Type == .Float && variable.Rows == 1);
VariableValue variableValue = .None;
if (variable.Columns == 3)
let variable = effect.Variables[name];
bool hasPreviewType = MaterialAssetPropertiesEditor.TryGetValue(arguments, "Type", var previewType);
if (hasPreviewType && previewType.Get<String>() == "Color")
{
material.GetVariable<ColorRGB>(variable.Name, var value);
Log.EngineLogger.AssertDebug(variable.Type == .Float && variable.Rows == 1);
value = ColorRGB.LinearToSRGB((ColorRGB)value);
if (variable.Columns == 3)
{
material.GetVariable<ColorRGB>(variable.Name, var value);
//variantValue = new box value;
variableValue = .ColorRGB(value);
value = ColorRGB.LinearToSRGB((ColorRGB)value);
//variantValue = new box value;
variableValue = .ColorRGB(value);
}
else if (variable.Columns == 4)
{
material.GetVariable<ColorRGBA>(variable.Name, var value);
value = ColorRGBA.LinearToSRGB((ColorRGBA)value);
variableValue = .ColorRGBA(value);
}
}
else if (variable.Columns == 4)
else if (variable.Type == .Float && variable.Rows == 1)
{
material.GetVariable<ColorRGBA>(variable.Name, var value);
value = ColorRGBA.LinearToSRGB((ColorRGBA)value);
variableValue = .ColorRGBA(value);
switch (variable.Columns)
{
case 1:
material.GetVariable<float>(variable.Name, let value);
variableValue = .Float(value);
case 2:
material.GetVariable<float2>(variable.Name, let value);
variableValue = .Float2(value);
case 3:
material.GetVariable<float3>(variable.Name, let value);
variableValue = .Float3(value);
case 4:
material.GetVariable<float4>(variable.Name, let value);
variableValue = .Float4(value);
}
}
materialFile.Variables.Add(new String(name), variableValue);
}
else if (variable.Type == .Float && variable.Rows == 1)
{
switch (variable.Columns)
{
case 1:
material.GetVariable<float>(variable.Name, let value);
variableValue = .Float(value);
case 2:
material.GetVariable<float2>(variable.Name, let value);
variableValue = .Float2(value);
case 3:
material.GetVariable<float3>(variable.Name, let value);
variableValue = .Float3(value);
case 4:
material.GetVariable<float4>(variable.Name, let value);
variableValue = .Float4(value);
}
}
materialFile.Variables.Add(new String(name), variableValue);
}
String text = scope .();
+76 -11
View File
@@ -281,7 +281,7 @@ class EditorContentManager : IContentManager
IAssetLoader assetLoader = GetAssetLoader(file);
Stream stream = GetStream(filePath);
Stream stream = GetStream(filePath, true);
// TODO: Add async loading!
Asset loadedAsset = assetLoader.LoadAsset(stream, file.AssetConfig.Config, resourceName, subassetName, this);
@@ -488,10 +488,7 @@ class EditorContentManager : IContentManager
Runtime.NotImplemented("Saving subassets is not currently allowed");
}
String filePath = scope String();
GetResourceFilePath(resourceName, filePath);
Result<TreeNode<AssetNode>> assetNode = AssetHierarchy.GetNodeFromPath(filePath);
Result<TreeNode<AssetNode>> assetNode = AssetHierarchy.GetNodeFromIdentifier(asset.Identifier);
if (assetNode case .Err)
return .Err(.PathNotFound);
@@ -508,7 +505,7 @@ class EditorContentManager : IContentManager
return .Err(.Unsavable);
}
Stream stream = OpenStream(filePath, false);
Stream stream = GetStream(asset.Identifier, false);
assetSaver.EditorSaveAsset(stream, asset, file.AssetConfig.Config, resourceName, subassetName, this);
@@ -520,13 +517,81 @@ class EditorContentManager : IContentManager
return .Ok;
}
private Stream OpenStream(StringView fileName, bool openOnly)
/// Saves the asset.
public Result<void, SaveAssetError> SaveAssetToFile(Asset asset, StringView fileName)
{
if (asset == null)
return .Err(.Unknown);
//if (asset.Identifier.IsWhiteSpace)
// return .Err(.Unsavable);
String fileAssetName = scope .();
Path.GetFileNameWithoutExtension(fileName, fileAssetName);
StringView assetName = fileAssetName;
StringView? subassetName = null;
if (!asset.Identifier.IsWhiteSpace)
GetResourceAndSubassetName(asset.Identifier, out assetName, out subassetName);
//if (subassetName != null)
//{
// TODO: should this ever be allowed? Couldn't we just save the entire asset?
// Would this ever be necessary?
// Runtime.NotImplemented("Saving subassets is not currently allowed");
//}
//Result<TreeNode<AssetNode>> assetNode = AssetHierarchy.GetNodeFromIdentifier(asset.Identifier);
//if (assetNode case .Err)
// return .Err(.PathNotFound);
//AssetFile file = assetNode.Get()->AssetFile;
String fileExtension = scope .();
Path.GetExtension(fileName, fileExtension);
IAssetLoader assetLoader = GetDefaultAssetLoader(fileExtension);//GetAssetLoader(asset.GetType());
if (assetLoader == null)
{
Log.EngineLogger.Error($"No asset loader found for extension {fileExtension}!");
return .Err(.Unsavable);
}
IAssetSaver assetSaver = assetLoader as IAssetSaver;
if (assetSaver == null)
{
Log.EngineLogger.Error("The asset loader can't save!");
return .Err(.Unsavable);
}
Stream stream = OpenStream(fileName, false);
var config = assetLoader.GetDefaultConfig();
assetSaver.EditorSaveAsset(stream, asset, config, assetName, subassetName, this);
delete config;
// Trim off the end of the file.
stream.SetLength(stream.Position);
delete stream;
return .Ok;
}
private Stream OpenStream(StringView fileName, bool readOnly)
{
FileStream fs = new FileStream();
FileMode fileMode = openOnly ? FileMode.Open : FileMode.OpenOrCreate;
FileMode fileMode = readOnly ? FileMode.Open : FileMode.OpenOrCreate;
var result = fs.Open(fileName, fileMode, openOnly ? .Read : .ReadWrite, .ReadWrite);
var result = fs.Open(fileName, fileMode, readOnly ? .Read : .ReadWrite, .ReadWrite);
if (result case .Err)
return null;
@@ -535,7 +600,7 @@ class EditorContentManager : IContentManager
}
/// Returns a file stream for the given assetIdentifier
public Stream GetStream(StringView assetIdentifier)
public Stream GetStream(StringView assetIdentifier, bool readOnly)
{
String fixuppedIdentifier = scope .(assetIdentifier);
AssetIdentifier.Fixup(fixuppedIdentifier);
@@ -548,7 +613,7 @@ class EditorContentManager : IContentManager
return null;
}
return OpenStream(node->Value.Path, true);
return OpenStream(node->Value.Path, readOnly);
}
public AssetHandle ManageAsset(Asset asset)
+8
View File
@@ -151,6 +151,14 @@ namespace GlitchyEditor
SaveScene(newScene, path);
}
}));
Editor.Instance.ContentBrowserWindow.RegisterAssetCreator(new AssetCreator("Material", "New Material.mat", new (path) =>
{
using (Material newMaterial = new Material())
{
_contentManager.SaveAssetToFile(newMaterial, path);
}
}));
}
private void InitGraphics()
+1 -78
View File
@@ -135,7 +135,7 @@ namespace GlitchyEngine.Content
void UnmanageAsset(AssetHandle asset);
/// Returns a data stream for the given asset.
Stream GetStream(StringView assetIdentifier);
Stream GetStream(StringView assetIdentifier, bool openOnly = true);
void RegisterAssetLoader<T>() where T : new, class, IAssetLoader;
void SetAsDefaultAssetLoader<T>(params Span<StringView> fileExtensions) where T : IAssetLoader;
@@ -143,81 +143,4 @@ namespace GlitchyEngine.Content
//Stream GetFile(String filename);
}
class RuntimeContentManager : IContentManager
{
public this()
{
Runtime.NotImplemented();
}
public AssetHandle LoadAsset(StringView assetIdentifier, bool blocking = false)
{
Runtime.NotImplemented();
}
public Asset GetAsset(Type assetType, AssetHandle handle)
{
Runtime.NotImplemented();
}
public AssetHandle ManageAsset(Asset asset)
{
Runtime.NotImplemented();
}
public void UnmanageAsset(AssetHandle asset)
{
Runtime.NotImplemented();
}
public Stream GetStream(StringView assetIdentifier)
{
Runtime.NotImplemented();
}
public void RegisterAssetLoader<T>() where T : IAssetLoader where T : class where T : new
{
Runtime.NotImplemented();
}
public void SetAsDefaultAssetLoader<T>(params Span<StringView> fileExtensions) where T : IAssetLoader
{
Runtime.NotImplemented();
}
/*private String _contentRoot;
[AllowAppend]
public this(String contentRoot)
{
String cntRoot = append String(contentRoot);
_contentRoot = cntRoot;
Runtime.Assert(Directory.Exists(contentRoot), "Content root directory doesn't exist.");
}
public void GetFilePath(String outFilename, String filename)
{
Path.InternalCombine(outFilename, _contentRoot, filename);
}
public Stream GetFile(String filename)
{
String fullpath = scope .(_contentRoot.Length + 1 + filename.Length);
GetFilePath(fullpath, filename);
Log.EngineLogger.AssertDebug(File.Exists(fullpath), "File doesn't exist!");
FileStream stream = new FileStream();
var result = stream.Open(fullpath, .Read, .Read);
if (result case .Err(let error))
{
Log.EngineLogger.Error($"Failed to open file \"{fullpath}\". Error: {error}");
return null;
}
return stream;
}*/
}
}
+1 -1
View File
@@ -51,7 +51,7 @@ public class Material : Asset
textureHandle = .Invalid;
}
_textures[new String(name)] = (textureHandle, effectTexture.TextureDimension);
newTextures[new String(name)] = (textureHandle, effectTexture.TextureDimension);
}
DeleteDictionaryAndKeys!(_textures);