Skip to content

Instantly share code, notes, and snippets.

@not-fl3

not-fl3/quad.rs Secret

Last active December 18, 2019 05:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save not-fl3/9ed781924402dfbe3de6161185051db8 to your computer and use it in GitHub Desktop.
Save not-fl3/9ed781924402dfbe3de6161185051db8 to your computer and use it in GitHub Desktop.
use miniquad::*;
#[repr(C)]
struct Vec2 {
x: f32,
y: f32,
}
#[repr(C)]
struct Vertex {
pos: Vec2,
uv: Vec2,
}
struct Stage {
pipeline: Pipeline,
bindings: Bindings,
}
impl Stage {
pub fn new(ctx: &mut Context) -> Stage {
#[rustfmt::skip]
let vertices: [Vertex; 4] = [
Vertex { pos : Vec2 { x: -0.5, y: -0.5 }, uv: Vec2 { x: 0., y: 0. } },
Vertex { pos : Vec2 { x: 0.5, y: -0.5 }, uv: Vec2 { x: 1., y: 0. } },
Vertex { pos : Vec2 { x: 0.5, y: 0.5 }, uv: Vec2 { x: 1., y: 1. } },
Vertex { pos : Vec2 { x: -0.5, y: 0.5 }, uv: Vec2 { x: 0., y: 1. } },
];
let vertex_buffer =
unsafe { Buffer::new(ctx, BufferType::VertexBuffer, Usage::Immutable, &vertices) };
let indices: [u16; 6] = [0, 1, 2, 0, 2, 3];
let index_buffer =
unsafe { Buffer::new(ctx, BufferType::IndexBuffer, Usage::Immutable, &indices) };
let pixels: [u8; 4 * 4 * 4] = [
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
];
let texture = Texture::from_rgba8(4, 4, &pixels);
let bindings = Bindings {
vertex_buffer: vertex_buffer,
index_buffer: index_buffer,
images: vec![texture],
};
let shader = Shader::new(ctx, shader::VERTEX, shader::FRAGMENT, shader::META);
let pipeline = Pipeline::new(
ctx,
VertexLayout::new(&[
(VertexAttribute::Custom("pos"), VertexFormat::Float2),
(VertexAttribute::Custom("uv"), VertexFormat::Float2),
]),
shader,
);
Stage { pipeline, bindings }
}
}
impl EventHandler for Stage {
fn update(&mut self, _ctx: &mut Context) {}
fn draw(&mut self, ctx: &mut Context) {
ctx.begin_render_pass();
ctx.apply_pipeline(&self.pipeline);
ctx.apply_bindings(&self.bindings);
unsafe {
ctx.apply_uniforms(&shader::Uniforms {
offset: (date::now().sin() as f32, 0.),
});
}
ctx.draw(6);
ctx.end_render_pass();
ctx.commit_frame();
}
}
fn main() {
miniquad::start(conf::Conf::default(), |ctx| Box::new(Stage::new(ctx)));
}
mod shader {
use miniquad::*;
pub const VERTEX: &str = r#"#version 300 es
in vec2 pos;
in vec2 uv;
uniform vec2 offset;
out lowp vec2 texcoord;
void main() {
gl_Position = vec4(pos + offset, 0, 1);
texcoord = uv;
}"#;
pub const FRAGMENT: &str = r#"#version 300 es
in lowp vec2 texcoord;
out lowp vec4 fragColor;
uniform sampler2D tex;
void main() {
fragColor = texture2D(tex, texcoord);
}"#;
pub const META: ShaderMeta = ShaderMeta {
images: &["tex"],
uniforms: UniformBlockLayout {
uniforms: &[("offset", UniformType::Float2)],
},
};
#[repr(C)]
pub struct Uniforms {
pub offset: (f32, f32),
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment