X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mandelwow.rs;h=1a6516c36f1266e991d916f419e5de0329d63d5d;hb=29b275596efed3b3064072483aa6d8c4cba1e3d4;hp=76ca54e4cb5572a421d9aab8b1c18f961528ee77;hpb=4168a7f814e1ed23a2f6e93d312c87bb2cb3005a;p=mandelwow.git diff --git a/mandelwow.rs b/mandelwow.rs index 76ca54e..1a6516c 100644 --- a/mandelwow.rs +++ b/mandelwow.rs @@ -1,11 +1,10 @@ // Wow. Such fractal. -use cube::Cube; +use crate::cube::Cube; use glium; use glium::index::PrimitiveType; -use glium::Surface; -use support; - +use glium::{Display, Program, Surface, implement_vertex, uniform}; +use crate::support; /* fn mand(cx: f32, cy: f32) -> [f32; 3] { @@ -28,63 +27,17 @@ fn mand(cx: f32, cy: f32) -> [f32; 3] { } */ -pub fn program(display: &glium::Display) -> glium::Program { - return program!(display, - 140 => { - vertex: r#" - #version 140 - uniform mat4 perspective; - uniform mat4 view; - uniform mat4 model; - uniform vec2 z0; - in vec3 position; - out vec2 c; - out vec2 z; - - void main() { - mat4 modelview = view * model; - gl_Position = perspective * modelview * vec4(position, 1.0); - c = vec2(position.x, position.y); - z = vec2(z0.x, z0.y); - } - "#, - - fragment: r#" - #version 140 - precision highp float; - in vec2 c; - in vec2 z; - out vec4 f_color; - - void main() { - float zx = z.x; - float zy = z.y; - int maxiter = 64; - int iter = maxiter; - while (iter > 0) { - float zx2 = zx * zx; - float zy2 = zy * zy; - if (zx2 * zy2 > 4.0) { - float index = float(iter) / float(maxiter); - f_color = vec4(index, 0.1, 0.5 - index / 2, 0.8 - index); - return; - } - zy = zx * zy * 2.0 + c.y; - zx = zx2 - zy2 + c.x; - iter -= 1; - } - f_color = vec4((sin(z.y) + 1.0) / 2, - (sin(c.y) + 1.0) / 2, - (sin(c.x) + 1.0) / 2, - 1.0); - } - "# - }).unwrap(); +pub fn program(display: &Display) -> Program { + Program::from_source( + display, + include_str!("shaders/mandelwow.vert"), + include_str!("shaders/mandelwow.frag"), None) + .unwrap() } -fn mandel(display: &glium::Display, +fn mandel(display: &Display, frame: &mut glium::Frame, - program: &glium::Program, + program: &Program, uniforms: &U, bounds: &Cube, z: [f32; 2]) where U: glium::uniforms::Uniforms { @@ -150,9 +103,9 @@ fn mandel(display: &glium::Display, frame.draw(&vb, &indices, program, uniforms, ¶ms).unwrap(); } -pub fn draw(display: &glium::Display, +pub fn draw(display: &Display, mut frame: &mut glium::Frame, - program: &glium::Program, + program: &Program, model: [[f32; 4]; 4], camera: &support::camera::CameraState, bounds: &Cube, @@ -175,6 +128,6 @@ pub fn draw(display: &glium::Display, perspective: camera.get_perspective(), }; - mandel(&display, &mut frame, &program, &uniforms, bounds, z0); + mandel(display, &mut frame, program, &uniforms, bounds, z0); } }