// This file is part of the 64k demo project. // It defines SDFEffect base class for raymarching effects. #pragma once #include "3d/camera.h" #include "gpu/camera_params.h" #include "gpu/effect.h" #include "gpu/uniform_helper.h" // Base class for SDF raymarching effects // Provides CameraParams uniform buffer and helper methods // // Binding convention: // @group(0) @binding(2): CommonPostProcessUniforms (from Effect base) // @group(0) @binding(3): CameraParams // @group(0) @binding(4+): Per-effect custom parameters class SDFEffect : public Effect { public: SDFEffect(const GpuContext& ctx) : Effect(ctx) { camera_params_.init(ctx.device); } virtual ~SDFEffect() = default; // Populate camera parameters from Camera object void update_camera(const Camera& camera, float aspect_ratio) { CameraParams params; params.inv_view = camera.get_view_matrix().inverse(); params.fov = camera.fov_y_rad; params.near_plane = camera.near_plane; params.far_plane = camera.far_plane; params.aspect_ratio = aspect_ratio; camera_params_.update(ctx_.queue, params); } // Populate camera parameters with custom values void update_camera(const vec3& position, const vec3& target, const vec3& up, float fov, float near_plane, float far_plane, float aspect_ratio) { mat4 view = mat4::look_at(position, target, up); CameraParams params; params.inv_view = view.inverse(); params.fov = fov; params.near_plane = near_plane; params.far_plane = far_plane; params.aspect_ratio = aspect_ratio; camera_params_.update(ctx_.queue, params); } protected: UniformBuffer camera_params_; };