using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Unity.Profiling; using UnityEngine; using UnityEngine.Rendering; namespace Obi { [StructLayout(LayoutKind.Sequential)] public struct DiffuseParticleVertex { public Vector4 pos; public Vector3 offset; public Vector4 color; public Vector4 velocity; public Vector4 attributes; } public class ObiFoamRenderSystem : RenderSystem { public Oni.RenderingSystemType typeEnum { get => Oni.RenderingSystemType.FoamParticles; } public RendererSet renderers { get; } = new RendererSet(); public bool isSetup => true; protected VertexAttributeDescriptor[] layout = { new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Color, VertexAttributeFormat.Float32, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 4), // velocity new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4), // attributes }; static protected ProfilerMarker m_SetupRenderMarker = new ProfilerMarker("SetupSurfaceMeshing"); static protected ProfilerMarker m_RenderMarker = new ProfilerMarker("SurfaceMeshing"); protected HashSet cameras = new HashSet(); protected MaterialPropertyBlock matProps; protected ObiSolver m_Solver; public ProceduralRenderBatch renderBatch; #if (UNITY_2019_1_OR_NEWER) System.Action renderCallback; #endif // must be done before fluid meshing. public uint tier { get { return 0; } } public ObiFoamRenderSystem(ObiSolver solver) { m_Solver = solver; matProps = new MaterialPropertyBlock(); #if (UNITY_2019_1_OR_NEWER) renderCallback = new System.Action((cntxt, cam) => { RenderFromCamera(cam); }); RenderPipelineManager.beginCameraRendering += renderCallback; #endif Camera.onPreCull += RenderFromCamera; } public virtual void Dispose() { #if (UNITY_2019_1_OR_NEWER) RenderPipelineManager.beginCameraRendering -= renderCallback; #endif Camera.onPreCull -= RenderFromCamera; renderBatch.Dispose(); cameras.Clear(); } public void RenderFromCamera(Camera camera) { cameras.Add(camera); } public virtual void Setup() { } public virtual void Step() { } public virtual void Render() { } } }