Skip to content

Commit a80a6dd

Browse files
authored
Merge pull request PistonDevelopers#352 from bvssvni/master
Published 0.88.0
2 parents 1e18781 + bd78d97 commit a80a6dd

File tree

5 files changed

+312
-53
lines changed

5 files changed

+312
-53
lines changed

Cargo.toml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
name = "piston2d-opengl_graphics"
4-
version = "0.87.0"
4+
version = "0.88.0"
55
edition = "2018"
66
authors = [
77
"bvssvni <[email protected]>",
@@ -31,19 +31,19 @@ path = "src/lib.rs"
3131
[features]
3232
default = ["gl"]
3333
webgl = ["gl"]
34-
glow = ["piston2d-glow_wrap"]
34+
glow = ["piston2d-glow_wrap", "dep:glow"]
3535

3636
[dependencies]
37-
image = "0.25.2"
37+
image = {version = "0.25.2", features = ["png"]}
3838

3939
piston-shaders_graphics2d = "0.4.0"
4040
piston-texture = "0.9.0"
4141
piston-viewport = "1.0.2"
4242
shader_version = "0.7.0"
4343
fnv = "1.0.7"
4444

45-
piston2d-glow_wrap = { path = "glow_wrap", version = "0.1.0", optional = true}
46-
gl = { version = "0.14.0", optional = true}
45+
piston2d-glow_wrap = { path = "glow_wrap", version = "0.2.0", optional = true}
46+
gl = {version = "0.14.0", optional = true}
4747

4848

4949
[dependencies.piston2d-graphics]
@@ -56,11 +56,13 @@ pistoncore-sdl2_window = "0.70.0"
5656
rand = "0.8.5"
5757
tokio = {version = "1.40.0", features = ["full"]}
5858
futures = "0.3.31"
59-
glutin = "0.32.1"
60-
glow = "0.14.2"
59+
glutin = "0.32.2"
60+
winit = "0.30.9"
61+
glutin-winit = "0.5.0"
62+
glow = "0.16.0"
6163

6264
[target.'cfg(target_arch = "wasm32")'.dependencies]
63-
glow = "0.14.2"
65+
glow = {version = "0.16.0", optional = true}
6466
web-sys = { version = "0.3.72", features = [
6567
"HtmlCanvasElement",
6668
"WebGl2RenderingContext",

examples/glow-hello_world.rs

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
/*
2+
3+
Code copied from:
4+
https://github.com/grovesNL/glow/blob/main/examples/hello/src/main.rs
5+
6+
This example is used as reference for other Glow examples.
7+
8+
*/
9+
10+
use glow::*;
11+
12+
fn main() {
13+
unsafe {
14+
// Create a context from a WebGL2 context on wasm32 targets
15+
#[cfg(target_arch = "wasm32")]
16+
let (gl, shader_version) = {
17+
use wasm_bindgen::JsCast;
18+
let canvas = web_sys::window()
19+
.unwrap()
20+
.document()
21+
.unwrap()
22+
.get_element_by_id("canvas")
23+
.unwrap()
24+
.dyn_into::<web_sys::HtmlCanvasElement>()
25+
.unwrap();
26+
let webgl2_context = canvas
27+
.get_context("webgl2")
28+
.unwrap()
29+
.unwrap()
30+
.dyn_into::<web_sys::WebGl2RenderingContext>()
31+
.unwrap();
32+
let gl = glow::Context::from_webgl2_context(webgl2_context);
33+
(gl, "#version 300 es")
34+
};
35+
36+
// Create a context from a glutin window on non-wasm32 targets
37+
#[cfg(not(target_arch = "wasm32"))]
38+
// #[cfg(feature = "glutin_winit")]
39+
let (gl, gl_surface, gl_context, shader_version, _window, event_loop) = {
40+
use glutin::{
41+
config::{ConfigTemplateBuilder, GlConfig},
42+
context::{ContextApi, ContextAttributesBuilder, NotCurrentGlContext},
43+
display::{GetGlDisplay, GlDisplay},
44+
surface::{GlSurface, SwapInterval},
45+
};
46+
use glutin_winit::{DisplayBuilder, GlWindow};
47+
use winit::raw_window_handle::HasRawWindowHandle;
48+
use std::num::NonZeroU32;
49+
50+
let event_loop = winit::event_loop::EventLoopBuilder::new().build().unwrap();
51+
let window_builder = winit::window::WindowAttributes::new()
52+
.with_title("Hello triangle!")
53+
.with_inner_size(winit::dpi::LogicalSize::new(1024.0, 768.0));
54+
55+
let template = ConfigTemplateBuilder::new();
56+
57+
let display_builder = DisplayBuilder::new().with_window_attributes(Some(window_builder));
58+
59+
let (window, gl_config) = display_builder
60+
.build(&event_loop, template, |configs| {
61+
configs
62+
.reduce(|accum, config| {
63+
use glutin::config::GlConfig;
64+
65+
if config.num_samples() > accum.num_samples() {
66+
config
67+
} else {
68+
accum
69+
}
70+
})
71+
.unwrap()
72+
})
73+
.unwrap();
74+
75+
let raw_window_handle = window.as_ref().map(|window| window.raw_window_handle().unwrap());
76+
77+
let gl_display = gl_config.display();
78+
let context_attributes = ContextAttributesBuilder::new()
79+
.with_context_api(ContextApi::OpenGl(Some(glutin::context::Version {
80+
major: 4,
81+
minor: 1,
82+
})))
83+
.build(raw_window_handle);
84+
85+
let not_current_gl_context = gl_display
86+
.create_context(&gl_config, &context_attributes)
87+
.unwrap();
88+
89+
let window = window.unwrap();
90+
91+
let attrs = window.build_surface_attributes(Default::default()).unwrap();
92+
let gl_surface = gl_display
93+
.create_window_surface(&gl_config, &attrs)
94+
.unwrap();
95+
96+
let gl_context = not_current_gl_context.make_current(&gl_surface).unwrap();
97+
98+
let gl = glow::Context::from_loader_function_cstr(|s| gl_display.get_proc_address(s));
99+
100+
gl_surface
101+
.set_swap_interval(&gl_context, SwapInterval::Wait(NonZeroU32::new(1).unwrap()))
102+
.unwrap();
103+
104+
(
105+
gl,
106+
gl_surface,
107+
gl_context,
108+
"#version 410",
109+
window,
110+
event_loop,
111+
)
112+
};
113+
114+
let vertex_array = gl
115+
.create_vertex_array()
116+
.expect("Cannot create vertex array");
117+
gl.bind_vertex_array(Some(vertex_array));
118+
119+
let program = gl.create_program().expect("Cannot create program");
120+
121+
let (vertex_shader_source, fragment_shader_source) = (
122+
r#"const vec2 verts[3] = vec2[3](
123+
vec2(0.5f, 1.0f),
124+
vec2(0.0f, 0.0f),
125+
vec2(1.0f, 0.0f)
126+
);
127+
out vec2 vert;
128+
void main() {
129+
vert = verts[gl_VertexID];
130+
gl_Position = vec4(vert - 0.5, 0.0, 1.0);
131+
}"#,
132+
r#"precision mediump float;
133+
in vec2 vert;
134+
out vec4 color;
135+
void main() {
136+
color = vec4(vert, 0.5, 1.0);
137+
}"#,
138+
);
139+
140+
let shader_sources = [
141+
(glow::VERTEX_SHADER, vertex_shader_source),
142+
(glow::FRAGMENT_SHADER, fragment_shader_source),
143+
];
144+
145+
let mut shaders = Vec::with_capacity(shader_sources.len());
146+
147+
for (shader_type, shader_source) in shader_sources.iter() {
148+
let shader = gl
149+
.create_shader(*shader_type)
150+
.expect("Cannot create shader");
151+
gl.shader_source(shader, &format!("{}\n{}", shader_version, shader_source));
152+
gl.compile_shader(shader);
153+
if !gl.get_shader_compile_status(shader) {
154+
panic!("{}", gl.get_shader_info_log(shader));
155+
}
156+
gl.attach_shader(program, shader);
157+
shaders.push(shader);
158+
}
159+
160+
gl.link_program(program);
161+
if !gl.get_program_link_status(program) {
162+
panic!("{}", gl.get_program_info_log(program));
163+
}
164+
165+
for shader in shaders {
166+
gl.detach_shader(program, shader);
167+
gl.delete_shader(shader);
168+
}
169+
170+
gl.use_program(Some(program));
171+
gl.clear_color(0.1, 0.2, 0.3, 1.0);
172+
173+
// We handle events differently between targets
174+
175+
#[cfg(not(target_arch = "wasm32"))]
176+
// #[cfg(feature = "glutin_winit")]
177+
{
178+
use glutin::prelude::GlSurface;
179+
use winit::event::{Event, WindowEvent};
180+
let _ = event_loop.run(move |event, elwt| {
181+
if let Event::WindowEvent { event, .. } = event {
182+
match event {
183+
WindowEvent::CloseRequested => {
184+
elwt.exit();
185+
}
186+
WindowEvent::RedrawRequested => {
187+
gl.clear(glow::COLOR_BUFFER_BIT);
188+
gl.draw_arrays(glow::TRIANGLES, 0, 3);
189+
gl_surface.swap_buffers(&gl_context).unwrap();
190+
}
191+
_ => (),
192+
}
193+
}
194+
});
195+
}
196+
197+
#[cfg(target_arch = "wasm32")]
198+
{
199+
// This could be called from `requestAnimationFrame`, a winit event
200+
// loop, etc.
201+
gl.clear(glow::COLOR_BUFFER_BIT);
202+
gl.draw_arrays(glow::TRIANGLES, 0, 3);
203+
gl.delete_program(program);
204+
gl.delete_vertex_array(vertex_array);
205+
}
206+
}
207+
}
208+

0 commit comments

Comments
 (0)