1 module play;
2 
3 import re;
4 import re.gfx;
5 import re.gfx.shapes.cube;
6 import re.gfx.shapes.grid;
7 import re.math;
8 static import raylib;
9 
10 class PlayScene : Scene3D {
11     private PostProcessor glitch_postproc;
12     private float[2] aberrationOffset = [0.01, 0];
13 
14     override void on_start() {
15         clear_color = Colors.LIGHTGRAY;
16 
17         // load the effect and add it as a postprocessor
18         auto chrm_abr = Effect(Core.content.load_shader(null,
19                 "chromatic_aberration.frag"), color_alpha_white(0.8));
20         glitch_postproc = new PostProcessor(resolution, chrm_abr);
21         glitch_postproc.enabled = false;
22         postprocessors ~= glitch_postproc;
23 
24         auto cam = &camera;
25         cam.position = Vector3(0, 10, 10);
26         camera.target = Vector3(0, 0, 0);
27         camera.up = Vector3(0, 1, 0);
28         camera.fovy = (C_PI_4) * C_RAD2DEG; // 45 deg
29         camera.type = CameraType.CAMERA_PERSPECTIVE;
30         raylib.SetCameraMode(camera, raylib.CameraMode.CAMERA_ORBITAL);
31 
32         auto block = create_entity("block", Vector3(0, 0, 0));
33         auto cube = block.add_component(new Cube(Vector3(2, 2, 2)));
34 
35         // enable an example shader on cube
36         auto cross_stitch = Effect(Core.content.load_shader(null,
37                 "cross_stitch.frag"), Colors.PURPLE);
38         auto mixAmt = 0.05f;
39         cross_stitch.set_shader_var("mixAmt", mixAmt);
40         cube.effect = cross_stitch;
41 
42         auto grid = create_entity("grid");
43         grid.add_component(new Grid3D(10, 1));
44     }
45 
46     override void update() {
47         super.update();
48 
49         if (Input.is_key_pressed(Keys.KEY_SPACE)) {
50             glitch_postproc.enabled = !glitch_postproc.enabled;
51         }
52 
53         // make our postprocess effect fluctuate
54         import std.math : sin;
55 
56         aberrationOffset[0] = 0.010 + 0.005 * sin(Time.total_time / 2);
57         glitch_postproc.effect.set_shader_var("aberrationOffset", aberrationOffset);
58     }
59 
60     override void render() {
61         super.render();
62     }
63 }