basic render boxes
This commit is contained in:
parent
d6312d9f1f
commit
a4193da919
2 changed files with 162 additions and 0 deletions
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "rust_game_test"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
miniquad = { version = "=0.3.14" }
|
153
src/main.rs
Normal file
153
src/main.rs
Normal file
|
@ -0,0 +1,153 @@
|
|||
#![windows_subsystem = "windows"]
|
||||
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 = Buffer::immutable(ctx, BufferType::VertexBuffer, &vertices);
|
||||
|
||||
let indices: [u16; 6] = [0, 1, 2, 0, 2, 3];
|
||||
let index_buffer = Buffer::immutable(ctx, BufferType::IndexBuffer, &indices);
|
||||
|
||||
let pixels: [u8; 4 * 4 * 4] = [
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
];
|
||||
let texture = Texture::from_rgba8(ctx, 4, 4, &pixels);
|
||||
|
||||
let bindings = Bindings {
|
||||
vertex_buffers: vec![vertex_buffer],
|
||||
index_buffer: index_buffer,
|
||||
images: vec![texture],
|
||||
};
|
||||
|
||||
let shader = Shader::new(ctx, shader::VERTEX, shader::FRAGMENT, shader::meta()).unwrap();
|
||||
|
||||
let pipeline = Pipeline::new(
|
||||
ctx,
|
||||
&[BufferLayout::default()],
|
||||
&[
|
||||
VertexAttribute::new("pos", VertexFormat::Float2),
|
||||
VertexAttribute::new("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) {
|
||||
let t = date::now();
|
||||
|
||||
ctx.begin_default_pass(Default::default());
|
||||
|
||||
ctx.apply_pipeline(&self.pipeline);
|
||||
ctx.apply_bindings(&self.bindings);
|
||||
for i in 0..10 {
|
||||
let t = t + i as f64 * 0.3;
|
||||
|
||||
ctx.apply_uniforms(&shader::Uniforms {
|
||||
offset: (t.sin() as f32 * 0.5, (t * 3.).cos() as f32 * 0.5),
|
||||
});
|
||||
ctx.draw(0, 6, 1);
|
||||
}
|
||||
ctx.end_render_pass();
|
||||
|
||||
ctx.commit_frame();
|
||||
}
|
||||
|
||||
fn char_event(&mut self, ctx: &mut Context, character: char, _: KeyMods, _: bool) {
|
||||
match character {
|
||||
'z' => ctx.show_mouse(false),
|
||||
'x' => ctx.show_mouse(true),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
let icon = match character {
|
||||
'1' => CursorIcon::Default,
|
||||
'2' => CursorIcon::Help,
|
||||
'3' => CursorIcon::Pointer,
|
||||
'4' => CursorIcon::Wait,
|
||||
'5' => CursorIcon::Crosshair,
|
||||
'6' => CursorIcon::Text,
|
||||
'7' => CursorIcon::Move,
|
||||
'8' => CursorIcon::NotAllowed,
|
||||
'9' => CursorIcon::EWResize,
|
||||
'0' => CursorIcon::NSResize,
|
||||
'q' => CursorIcon::NESWResize,
|
||||
'w' => CursorIcon::NWSEResize,
|
||||
_ => return,
|
||||
};
|
||||
ctx.set_mouse_cursor(icon);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
miniquad::start(conf::Conf::default(), |mut ctx| {
|
||||
Box::new(Stage::new(&mut ctx))
|
||||
});
|
||||
}
|
||||
|
||||
mod shader {
|
||||
use miniquad::*;
|
||||
|
||||
pub const VERTEX: &str = r#"#version 100
|
||||
attribute vec2 pos;
|
||||
attribute vec2 uv;
|
||||
uniform vec2 offset;
|
||||
varying lowp vec2 texcoord;
|
||||
void main() {
|
||||
gl_Position = vec4(pos + offset, 0, 1);
|
||||
texcoord = uv;
|
||||
}"#;
|
||||
|
||||
pub const FRAGMENT: &str = r#"#version 100
|
||||
varying lowp vec2 texcoord;
|
||||
uniform sampler2D tex;
|
||||
void main() {
|
||||
gl_FragColor = texture2D(tex, texcoord);
|
||||
}"#;
|
||||
|
||||
pub fn meta() -> ShaderMeta {
|
||||
ShaderMeta {
|
||||
images: vec!["tex".to_string()],
|
||||
uniforms: UniformBlockLayout {
|
||||
uniforms: vec![UniformDesc::new("offset", UniformType::Float2)],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct Uniforms {
|
||||
pub offset: (f32, f32),
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue