1 /** fragment shader effects with auto-synced uniforms */
2
3 module re.gfx.effects.frag;
4
5 import re.ng.scene;
6 import re.gfx.raytypes;
7 import re.gfx.effect;
8 import re.util.hotreload;
9 static import raylib;
10
11 /// fragment shader effect
12 class FragEffect : Effect {
13 enum shader_uni_resolution = "i_resolution";
14 enum shader_uni_frame = "i_frame";
15 enum shader_uni_time = "i_time";
16 // enum shader_uni_mouse = "i_mouse";
17
18 Scene scene;
19 int start_frame = 0;
20 float start_time = 0;
21
22 this(Scene scene, Shader shader) {
23 super(shader, Colors.WHITE);
24 setup(scene);
25 }
26
27 this(Scene scene, ReloadableShader reloadable_shader) {
28 super(reloadable_shader, Colors.WHITE);
29 setup(scene);
30 }
31
32 private void setup(Scene scene) {
33 this.scene = scene;
34
35 // initialize uniforms
36 init_time();
37 sync_uniforms();
38 }
39
40 public void init_time() {
41 start_frame = Time.frame_count;
42 start_time = Time.total_time;
43 }
44
45 public void sync_uniforms() {
46 this.set_shader_var_imm(shader_uni_resolution, cast(float[3])[
47 scene.resolution.x, scene.resolution.y, 1.0
48 ]);
49
50 }
51
52 protected override void reload_shader() {
53 super.reload_shader();
54
55 // if reloading, we need to resync uniforms
56 sync_uniforms();
57 }
58
59 public override void update() {
60 super.update();
61
62 this.set_shader_var_imm(shader_uni_frame, cast(int)(Time.frame_count - start_frame));
63 this.set_shader_var_imm(shader_uni_time, Time.total_time - start_time);
64 }
65 }