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_;
};
|