Fixed AssetHandle serialization

- Serialize MeshComponents
- Fixed handling renamed files
This commit is contained in:
Simon Lübeß
2023-03-19 01:04:32 +01:00
parent c164aeecaa
commit edcec02e94
19 changed files with 324 additions and 321 deletions
+2 -14
View File
@@ -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;
}
}
+1 -158
View File
@@ -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)
+10 -8
View File
@@ -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;
}));