summaryrefslogtreecommitdiff
path: root/src/gpu/sdf_effect.h
blob: 4f23604340b48e6ea86a0a848e2ea8fd3874277c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 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<CameraParams> camera_params_;
};