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 }