54 lines
2.2 KiB
C#
54 lines
2.2 KiB
C#
using MoonTools.ECS;
|
|
using Nerfed.Runtime.Scene.Streaming;
|
|
using System;
|
|
|
|
namespace Nerfed.Runtime.Resources;
|
|
|
|
/// <summary>
|
|
/// A typical rendering preparation system that natively resolves and requests
|
|
/// asynchronous background loading for its own required assets, removing the
|
|
/// need for a monolithic generic AssetStreaming manager.
|
|
/// </summary>
|
|
public class SampleRenderSystem : MoonTools.ECS.System
|
|
{
|
|
private readonly Filter _meshVisualsFilter;
|
|
|
|
public SampleRenderSystem(World world) : base(world) {
|
|
_meshVisualsFilter = FilterBuilder
|
|
.Include<SampleMeshVisualComponent>()
|
|
// Always ignore chunk entities technically "unloading" from RAM
|
|
.Exclude<ChunkUnloadPendingTag>()
|
|
.Build();
|
|
}
|
|
|
|
public override void Update(TimeSpan delta) {
|
|
foreach(Entity entity in _meshVisualsFilter.Entities) {
|
|
SampleMeshVisualComponent visualComp = Get<SampleMeshVisualComponent>(entity);
|
|
|
|
// 1. Resolve State
|
|
ResourceState vertState = ResourceManager.GetState(visualComp.VertexShader.AssetId);
|
|
ResourceState fragState = ResourceManager.GetState(visualComp.FragmentShader.AssetId);
|
|
|
|
// 2. Asynchronously request assets if they don't exist in memory yet
|
|
if(vertState == ResourceState.Unloaded) {
|
|
ResourceManager.Retain<Shader>(visualComp.VertexShader.AssetId, "Unknown/Path");
|
|
}
|
|
if(fragState == ResourceState.Unloaded) {
|
|
ResourceManager.Retain<Shader>(visualComp.FragmentShader.AssetId, "Unknown/Path");
|
|
}
|
|
|
|
// 3. Prevent rendering logic unless ALL strictly required assets are fully mapped
|
|
bool isReadyToDraw = vertState == ResourceState.Loaded && fragState == ResourceState.Loaded;
|
|
|
|
if(isReadyToDraw) {
|
|
// At this exact point, you can safely assume:
|
|
// 1) The background loading threads are 100% finished processing these shaders.
|
|
// 2) The GraphicsDevice can safely extract the native handle.
|
|
|
|
// e.g. GraphicsDevice.BindShader(visualComp.VertexShader.AssetId);
|
|
// e.g. GraphicsDevice.DrawPolygons(...);
|
|
}
|
|
}
|
|
}
|
|
}
|