mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
Fixed AssetHandle serialization
- Serialize MeshComponents - Fixed handling renamed files
This commit is contained in:
@@ -63,7 +63,15 @@ abstract class Asset : RefCounter
|
||||
|
||||
Deserialize.String!(reader, ref identifier, environment);
|
||||
|
||||
Asset asset = Content.GetAsset<Asset>(Content.LoadAsset(identifier));
|
||||
AssetHandle handle = Content.LoadAsset(identifier);
|
||||
|
||||
if (handle == .Invalid)
|
||||
{
|
||||
value.Assign<Asset>(null);
|
||||
return .Ok;
|
||||
}
|
||||
|
||||
Asset asset = Content.GetAsset<Asset>(handle);
|
||||
|
||||
if (asset != null)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
using Bon;
|
||||
using Bon.Integrated;
|
||||
using System;
|
||||
using xxHash;
|
||||
using System.Collections;
|
||||
using System.Reflection;
|
||||
using System.Diagnostics;
|
||||
using GlitchyEngine.Core;
|
||||
|
||||
namespace GlitchyEngine.Content;
|
||||
|
||||
struct AssetHandle : IHashable
|
||||
@@ -27,6 +30,12 @@ struct AssetHandle : IHashable
|
||||
_uuid = uuid;
|
||||
}
|
||||
|
||||
static this
|
||||
{
|
||||
gBonEnv.typeHandlers.Add(typeof(AssetHandle),
|
||||
((.)new => AssetSerialize, new => AssetDeserialize));
|
||||
}
|
||||
|
||||
[Inline]
|
||||
public T Get<T>(IContentManager contentManager = null) where T : Asset
|
||||
{
|
||||
@@ -34,6 +43,36 @@ struct AssetHandle : IHashable
|
||||
}
|
||||
|
||||
public int GetHashCode() => _uuid.GetHashCode();
|
||||
|
||||
static void AssetSerialize(BonWriter writer, ValueView value, BonEnvironment environment, SerializeValueState state)
|
||||
{
|
||||
Log.EngineLogger.Assert(value.type == typeof(AssetHandle));
|
||||
|
||||
AssetHandle handle = value.Get<AssetHandle>();
|
||||
|
||||
if (handle.IsInvalid)
|
||||
writer.String("");
|
||||
else
|
||||
{
|
||||
let identifier = handle.Get<Asset>().Identifier;
|
||||
writer.String(identifier);
|
||||
}
|
||||
}
|
||||
|
||||
static Result<void> AssetDeserialize(BonReader reader, ValueView value, BonEnvironment environment, DeserializeValueState state)
|
||||
{
|
||||
Log.EngineLogger.Assert(value.type == typeof(AssetHandle));
|
||||
|
||||
String identifier = scope .();
|
||||
|
||||
Deserialize.String!(reader, ref identifier, environment);
|
||||
|
||||
AssetHandle handle = Content.LoadAsset(identifier);
|
||||
|
||||
value.Assign<AssetHandle>(handle);
|
||||
|
||||
return .Ok;
|
||||
}
|
||||
}
|
||||
|
||||
struct AssetHandle<T> where T : Asset
|
||||
@@ -72,6 +111,12 @@ struct AssetHandle<T> where T : Asset
|
||||
_asset = null;
|
||||
}
|
||||
|
||||
static this
|
||||
{
|
||||
gBonEnv.typeHandlers.Add(typeof(AssetHandle<T>),
|
||||
((.)new => AssetSerialize, new => AssetDeserialize));
|
||||
}
|
||||
|
||||
public static implicit operator Self(AssetHandle handle)
|
||||
{
|
||||
return Self(handle);
|
||||
@@ -258,4 +303,34 @@ struct AssetHandle<T> where T : Asset
|
||||
{
|
||||
return AssetHandle<NewT>(this._handle, this._contentManager);
|
||||
}
|
||||
|
||||
static void AssetSerialize(BonWriter writer, ValueView value, BonEnvironment environment, SerializeValueState state)
|
||||
{
|
||||
Log.EngineLogger.Assert(value.type == typeof(AssetHandle<T>));
|
||||
|
||||
AssetHandle handle = value.Get<AssetHandle<T>>();
|
||||
|
||||
if (handle.IsInvalid)
|
||||
writer.String("");
|
||||
else
|
||||
{
|
||||
let identifier = handle.Get<Asset>().Identifier;
|
||||
writer.String(identifier);
|
||||
}
|
||||
}
|
||||
|
||||
static Result<void> AssetDeserialize(BonReader reader, ValueView value, BonEnvironment environment, DeserializeValueState state)
|
||||
{
|
||||
Log.EngineLogger.Assert(value.type == typeof(AssetHandle<T>));
|
||||
|
||||
String identifier = scope .();
|
||||
|
||||
Deserialize.String!(reader, ref identifier, environment);
|
||||
|
||||
AssetHandle<T> handle = Content.LoadAsset(identifier);
|
||||
|
||||
value.Assign<AssetHandle<T>>(handle);
|
||||
|
||||
return .Ok;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,27 +4,8 @@ using GlitchyEngine.Content;
|
||||
|
||||
namespace GlitchyEngine.Renderer
|
||||
{
|
||||
public struct MeshComponent// : IDisposableComponent
|
||||
public struct MeshComponent
|
||||
{
|
||||
public AssetHandle<GeometryBinding> Mesh {get; set mut;} = .Invalid;
|
||||
/*
|
||||
private GeometryBinding _mesh;
|
||||
public AssetHandle<GeometryBinding> Mesh
|
||||
{
|
||||
[Inline]
|
||||
get => _mesh;
|
||||
set mut
|
||||
{
|
||||
if(_mesh == value)
|
||||
return;
|
||||
|
||||
SetReference!(_mesh, value);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose() mut
|
||||
{
|
||||
ReleaseRefAndNullify!(_mesh);
|
||||
}*/
|
||||
public AssetHandle<GeometryBinding> Mesh = .Invalid;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,21 +45,9 @@ namespace GlitchyEngine.World
|
||||
}
|
||||
|
||||
[Component("Sprite Renderer")]
|
||||
struct SpriteRendererComponent// : IDisposableComponent
|
||||
struct SpriteRendererComponent
|
||||
{
|
||||
private AssetHandle<Texture2D> _sprite = .Invalid;
|
||||
|
||||
public AssetHandle<Texture2D> Sprite
|
||||
{
|
||||
get => _sprite;
|
||||
set mut
|
||||
{
|
||||
if (_sprite == value)
|
||||
return;
|
||||
_sprite = value;
|
||||
//SetReference!(_sprite, value);
|
||||
}
|
||||
}
|
||||
public AssetHandle<Texture2D> Sprite = .Invalid;
|
||||
|
||||
public ColorRGBA Color = .White;
|
||||
public Vector4 UvTransform = .(0, 0, 1, 1);
|
||||
|
||||
@@ -5,26 +5,8 @@ using GlitchyEngine.Content;
|
||||
namespace GlitchyEngine.World
|
||||
{
|
||||
/// A component that allows to render a mesh.
|
||||
public struct MeshRendererComponent// : IDisposableComponent
|
||||
public struct MeshRendererComponent
|
||||
{
|
||||
private AssetHandle<Material> _material = .Invalid;
|
||||
|
||||
public AssetHandle<Material> Material
|
||||
{
|
||||
[Inline]
|
||||
get => _material;
|
||||
set mut
|
||||
{
|
||||
if(_material == value)
|
||||
return;
|
||||
|
||||
_material = value;
|
||||
}
|
||||
}
|
||||
|
||||
/*public void Dispose() mut
|
||||
{
|
||||
_material?.ReleaseRef();
|
||||
}*/
|
||||
public AssetHandle<Material> Material = .Invalid;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,14 +47,6 @@ namespace GlitchyEngine.World
|
||||
|
||||
public this()
|
||||
{
|
||||
/*Entity entity = CreateEntity("Green Quad");
|
||||
entity.AddComponent<SpriterRendererComponent>(.(ColorRGBA.SRgbToLinear(.(0.2f, 0.9f, 0.15f))));
|
||||
|
||||
Entity entity2 = CreateEntity("Red Square");
|
||||
var v = entity2.AddComponent<SpriterRendererComponent>(.(ColorRGBA.SRgbToLinear(.(0.95f, 0.1f, 0.3f))));
|
||||
v.Sprite = new Texture2D("Textures/rocket.dds");
|
||||
v.Sprite.SamplerState = SamplerStateManager.PointClamp;*/
|
||||
|
||||
_onComponentAddedHandlers.Add(typeof(CameraComponent), (e, t, c) => {
|
||||
CameraComponent* cameraComponent = (.)c;
|
||||
|
||||
@@ -99,6 +91,7 @@ namespace GlitchyEngine.World
|
||||
// Copy components
|
||||
//CopyComponents<TransformComponent>(this, target); /* Parent will be copied below*/
|
||||
CopyComponents<MeshRendererComponent>(this, target);
|
||||
CopyComponents<MeshComponent>(this, target);
|
||||
CopyComponents<EditorComponent>(this, target);
|
||||
CopyComponents<SpriteRendererComponent>(this, target);
|
||||
CopyComponents<CameraComponent>(this, target);
|
||||
@@ -335,156 +328,6 @@ namespace GlitchyEngine.World
|
||||
}
|
||||
|
||||
finalTarget.ReleaseRef();
|
||||
|
||||
|
||||
/*Debug.Profiler.ProfileRendererFunction!();
|
||||
|
||||
finalTarget.AddRef();
|
||||
|
||||
TransformSystem.Update(_ecsWorld);
|
||||
|
||||
// Run scripts
|
||||
for (var (entity, script) in _ecsWorld.Enumerate<NativeScriptComponent>())
|
||||
{
|
||||
if (script.Instance == null)
|
||||
{
|
||||
script.Instance = script.InstantiateFunction();
|
||||
script.Instance._entity = Entity(entity, this);
|
||||
script.Instance.[Friend]OnCreate();
|
||||
}
|
||||
|
||||
script.Instance.[Friend]OnUpdate(gameTime);
|
||||
}
|
||||
|
||||
// Find camera
|
||||
Camera* primaryCamera = null;
|
||||
Matrix primaryCameraTransform = default;
|
||||
RenderTargetGroup renderTarget = null;
|
||||
|
||||
for (var (entity, transform, camera) in _ecsWorld.Enumerate<TransformComponent, CameraComponent>())
|
||||
{
|
||||
if (camera.Primary)// && camera.RenderTarget != null)
|
||||
{
|
||||
primaryCamera = &camera.Camera;
|
||||
primaryCameraTransform = transform.WorldTransform;
|
||||
//renderTarget = camera.RenderTarget..AddRef();
|
||||
}
|
||||
}
|
||||
|
||||
if (primaryCamera != null)
|
||||
{
|
||||
// 3D render
|
||||
Renderer.BeginScene(*primaryCamera, primaryCameraTransform, _compositeTarget, finalTarget);
|
||||
|
||||
for (var (entity, transform, mesh, meshRenderer) in _ecsWorld.Enumerate<TransformComponent, MeshComponent, MeshRendererComponent>())
|
||||
{
|
||||
Renderer.Submit(mesh.Mesh, meshRenderer.Material, entity, transform.WorldTransform);
|
||||
}
|
||||
|
||||
for (var (entity, transform, light) in _ecsWorld.Enumerate<TransformComponent, LightComponent>())
|
||||
{
|
||||
Renderer.Submit(light.SceneLight, transform.WorldTransform);
|
||||
}
|
||||
|
||||
Renderer.EndScene();
|
||||
|
||||
// TODO: alphablending (handle in Renderer2D)
|
||||
// TODO: 2D-Postprocessing requires rendering into separate target instead of directly into compositeTarget
|
||||
|
||||
RenderCommand.SetRenderTargetGroup(_compositeTarget);
|
||||
RenderCommand.BindRenderTargets();
|
||||
|
||||
// Sprite renderer
|
||||
Renderer2D.BeginScene(*primaryCamera, primaryCameraTransform, .BackToFront);
|
||||
|
||||
for (var (entity, transform, sprite) in _ecsWorld.Enumerate<TransformComponent, SpriterRendererComponent>())
|
||||
{
|
||||
Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index);
|
||||
}
|
||||
|
||||
Renderer2D.EndScene();
|
||||
|
||||
// Gamma correct composit target and draw it into viewport
|
||||
{
|
||||
RenderCommand.UnbindRenderTargets();
|
||||
RenderCommand.SetRenderTargetGroup(finalTarget, false);
|
||||
RenderCommand.BindRenderTargets();
|
||||
|
||||
_gammaCorrectEffect.SetTexture("Texture", _compositeTarget, 0);
|
||||
// TODO: iiihhh
|
||||
_gammaCorrectEffect.Bind(Application.Get().Window.Context);
|
||||
|
||||
FullscreenQuad.Draw();
|
||||
}
|
||||
}
|
||||
|
||||
finalTarget.ReleaseRef();*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Debug.Profiler.ProfileRendererFunction!();
|
||||
|
||||
TransformSystem.Update(_ecsWorld);
|
||||
|
||||
for (var (entity, script) in _ecsWorld.Enumerate<NativeScriptComponent>())
|
||||
{
|
||||
if (script.Instance == null)
|
||||
{
|
||||
script.Instance = script.InstantiateFunction();
|
||||
script.Instance._entity = Entity(entity, this);
|
||||
script.Instance.[Friend]OnCreate();
|
||||
}
|
||||
|
||||
script.Instance.[Friend]OnUpdate(gameTime);
|
||||
}
|
||||
|
||||
Camera* primaryCamera = null;
|
||||
Matrix primaryCameraTransform = default;
|
||||
RenderTargetGroup renderTarget = null;
|
||||
|
||||
for (var (entity, transform, camera) in _ecsWorld.Enumerate<TransformComponent, CameraComponent>())
|
||||
{
|
||||
if (camera.Primary && camera.RenderTarget != null)
|
||||
{
|
||||
primaryCamera = &camera.Camera;
|
||||
primaryCameraTransform = transform.WorldTransform;
|
||||
renderTarget = camera.RenderTarget..AddRef();
|
||||
}
|
||||
}
|
||||
|
||||
if (primaryCamera != null)
|
||||
{
|
||||
// 3D render
|
||||
Renderer.BeginScene(*primaryCamera, primaryCameraTransform, renderTarget, finalTarget);
|
||||
|
||||
for (var (entity, transform, mesh, meshRenderer) in _ecsWorld.Enumerate<TransformComponent, MeshComponent, MeshRendererComponent>())
|
||||
{
|
||||
Renderer.Submit(mesh.Mesh, meshRenderer.Material, transform.WorldTransform);
|
||||
}
|
||||
|
||||
for (var (entity, transform, light) in _ecsWorld.Enumerate<TransformComponent, LightComponent>())
|
||||
{
|
||||
Renderer.Submit(light.SceneLight, transform.WorldTransform);
|
||||
}
|
||||
|
||||
Renderer.EndScene();
|
||||
|
||||
// Sprite renderer
|
||||
Renderer2D.BeginScene(*primaryCamera, primaryCameraTransform);
|
||||
|
||||
for (var (entity, transform, sprite) in _ecsWorld.Enumerate<TransformComponent, SpriterRendererComponent>())
|
||||
{
|
||||
Renderer2D.DrawQuad(transform.WorldTransform, sprite.Sprite, sprite.Color);
|
||||
}
|
||||
|
||||
Renderer2D.EndScene();
|
||||
|
||||
renderTarget?.ReleaseRef();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
public void UpdateEditor(GameTime gameTime, EditorCamera camera, RenderTargetGroup viewportTarget, delegate void() DebugDraw3D, delegate void() DrawDebug2D)
|
||||
|
||||
@@ -84,11 +84,13 @@ class SceneSerializer
|
||||
Serialize.Value(writer, "Name", component.Name);
|
||||
});
|
||||
|
||||
SerializeComponent<SpriteRendererComponent>(writer, entity, "SpriterRendererComponent", scope (component) =>
|
||||
SerializeComponent<SpriteRendererComponent>(writer, entity, "SpriteRendererComponent", scope (component) =>
|
||||
{
|
||||
Serialize.Value(writer, "Color", component.Color);
|
||||
Serialize.Value(writer, "IsCircle", component.IsCircle);
|
||||
Serialize.Value(writer, "Sprite", component.Sprite.Get().Identifier);
|
||||
|
||||
Serialize.Value(writer, "Sprite", component.Sprite);
|
||||
|
||||
Serialize.Value(writer, "UvTransform", component.UvTransform);
|
||||
});
|
||||
|
||||
@@ -172,12 +174,12 @@ class SceneSerializer
|
||||
|
||||
SerializeComponent<MeshComponent>(writer, entity, "MeshComponent", scope (component) =>
|
||||
{
|
||||
Serialize.Value(writer, "Mesh", component.Mesh.Identifier);
|
||||
Serialize.Value(writer, "Mesh", component.Mesh);
|
||||
});
|
||||
|
||||
SerializeComponent<MeshRendererComponent>(writer, entity, "MeshRendererComponent", scope (component) =>
|
||||
{
|
||||
Serialize.Value(writer, "Material", component.Material.Identifier);
|
||||
Serialize.Value(writer, "Material", component.Material);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -329,7 +331,7 @@ class SceneSerializer
|
||||
|
||||
return .Ok;
|
||||
}));
|
||||
case "SpriterRendererComponent":
|
||||
case "SpriteRendererComponent":
|
||||
Try!(DeserializeComponent<SpriteRendererComponent>(reader, entity, scope (component) =>
|
||||
{
|
||||
Try!(Deserialize.Value(reader, "Color", out component.Color));
|
||||
@@ -337,7 +339,7 @@ class SceneSerializer
|
||||
Try!(Deserialize.Value(reader, "IsCircle", out component.IsCircle));
|
||||
reader.EntryEnd();
|
||||
|
||||
component.Sprite = DeserializeAssetHandle!<Texture2D>("Sprite");
|
||||
Try!(Deserialize.Value(reader, "Sprite", out component.Sprite));
|
||||
reader.EntryEnd();
|
||||
|
||||
Try!(Deserialize.Value(reader, "UvTransform", out component.UvTransform));
|
||||
@@ -486,14 +488,14 @@ class SceneSerializer
|
||||
case "MeshComponent":
|
||||
Try!(DeserializeComponent<MeshComponent>(reader, entity, scope (component) =>
|
||||
{
|
||||
component.Mesh = DeserializeAssetHandle!<GeometryBinding>("Mesh");
|
||||
Try!(Deserialize.Value(reader, "Mesh", out component.Mesh));
|
||||
|
||||
return .Ok;
|
||||
}));
|
||||
case "MeshRendererComponent":
|
||||
Try!(DeserializeComponent<MeshRendererComponent>(reader, entity, scope (component) =>
|
||||
{
|
||||
component.Material = DeserializeAssetHandle!<Material>("Material");
|
||||
Try!(Deserialize.Value(reader, "Material", out component.Material));
|
||||
|
||||
return .Ok;
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user