// This file is part of the 64k demo project. // It declares the concrete effects used in the demo. #pragma once #include "effect.h" #include "gpu/gpu.h" #include static const int NUM_PARTICLES = 10000; struct Particle { float pos[4]; float vel[4]; float rot[4]; float color[4]; }; class HeptagonEffect : public Effect { public: HeptagonEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: WGPUQueue queue_; RenderPass pass_; GpuBuffer uniforms_; }; class ParticlesEffect : public Effect { public: ParticlesEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void compute(WGPUCommandEncoder encoder, float time, float beat, float intensity, float aspect_ratio) override; void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: WGPUQueue queue_; ComputePass compute_pass_; RenderPass render_pass_; GpuBuffer particles_buffer_; GpuBuffer uniforms_; }; class PassthroughEffect : public PostProcessEffect { public: PassthroughEffect(WGPUDevice device, WGPUTextureFormat format); void update_bind_group(WGPUTextureView input_view) override; private: WGPUDevice device_; GpuBuffer uniforms_; }; class MovingEllipseEffect : public Effect { public: MovingEllipseEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: WGPUQueue queue_; RenderPass pass_; GpuBuffer uniforms_; }; class ParticleSprayEffect : public Effect { public: ParticleSprayEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void compute(WGPUCommandEncoder encoder, float time, float beat, float intensity, float aspect_ratio) override; void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: WGPUQueue queue_; ComputePass compute_pass_; RenderPass render_pass_; GpuBuffer particles_buffer_; GpuBuffer uniforms_; }; class GaussianBlurEffect : public PostProcessEffect { public: GaussianBlurEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; void update_bind_group(WGPUTextureView input_view) override; private: WGPUDevice device_; WGPUQueue queue_; GpuBuffer uniforms_; }; class SolarizeEffect : public PostProcessEffect { public: SolarizeEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; void update_bind_group(WGPUTextureView input_view) override; private: WGPUDevice device_; WGPUQueue queue_; GpuBuffer uniforms_; }; class DistortEffect : public PostProcessEffect { public: DistortEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; void update_bind_group(WGPUTextureView input_view) override; private: WGPUDevice device_; WGPUQueue queue_; GpuBuffer uniforms_; }; class ChromaAberrationEffect : public PostProcessEffect { public: ChromaAberrationEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; void update_bind_group(WGPUTextureView input_view) override; private: WGPUDevice device_; WGPUQueue queue_; GpuBuffer uniforms_; }; // Auto-generated function to populate the timeline void LoadTimeline(MainSequence &main_seq, WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format);