// This file is part of the 64k demo project. // It declares the concrete effects used in the demo. #pragma once #include "3d/camera.h" #include "3d/renderer.h" #include "3d/scene.h" #include "effect.h" #include "gpu/effects/post_process_helper.h" #include "gpu/effects/shaders.h" #include "gpu/gpu.h" #include "gpu/texture_manager.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: RenderPass pass_; }; 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: ComputePass compute_pass_; RenderPass render_pass_; GpuBuffer particles_buffer_; }; class PassthroughEffect : public PostProcessEffect { public: PassthroughEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void update_bind_group(WGPUTextureView input_view) override; }; 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: RenderPass pass_; }; 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: ComputePass compute_pass_; RenderPass render_pass_; GpuBuffer particles_buffer_; }; 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; }; 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; }; 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; }; 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; }; class Hybrid3DEffect : public Effect { public: Hybrid3DEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void init(MainSequence* demo) override; void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: Renderer3D renderer_; TextureManager texture_manager_; Scene scene_; Camera camera_; int width_ = 1280; int height_ = 720; }; class FlashCubeEffect : public Effect { public: FlashCubeEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); void init(MainSequence* demo) override; void resize(int width, int height) override; void render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) override; private: Renderer3D renderer_; TextureManager texture_manager_; Scene scene_; Camera camera_; int width_ = 1280; int height_ = 720; float last_beat_; float flash_intensity_; }; class ThemeModulationEffect : public PostProcessEffect { public: ThemeModulationEffect(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; }; class FadeEffect : public PostProcessEffect { public: FadeEffect(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; }; class FlashEffect : public PostProcessEffect { public: FlashEffect(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: float flash_intensity_ = 0.0f; }; // Auto-generated functions void LoadTimeline(MainSequence& main_seq, WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format); float GetDemoDuration(); // Returns demo end time in seconds, or -1 if not specified