diff --git a/.gitignore b/.gitignore index 0305e2c0..4c33ee90 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target Cargo.lock examples/*/target examples/*/Cargo.lock +.idea/ \ No newline at end of file diff --git a/examples/webgl/Cargo.toml b/examples/webgl/Cargo.toml new file mode 100644 index 00000000..f0e0114b --- /dev/null +++ b/examples/webgl/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "webgl" +version = "0.1.0" +authors = ["Liana Pigeot "] + +[dependencies] +stdweb = { path = "../.." } diff --git a/examples/webgl/README.md b/examples/webgl/README.md new file mode 100644 index 00000000..e69de29b diff --git a/examples/webgl/src/main.rs b/examples/webgl/src/main.rs new file mode 100644 index 00000000..61b30ebd --- /dev/null +++ b/examples/webgl/src/main.rs @@ -0,0 +1,26 @@ +extern crate stdweb; + +use stdweb::unstable::TryInto; +use stdweb::web::{ + IParentNode, + IHtmlElement, + document, + WebGLRenderingContext +}; + +use stdweb::web::html_element::CanvasElement; + +fn main() { + stdweb::initialize(); + + let canvas: CanvasElement = document().query_selector( "#canvas" ).unwrap().unwrap().try_into().unwrap(); + let context: WebGLRenderingContext = canvas.get_context().unwrap(); + + canvas.set_width(canvas.offset_width() as u32); + canvas.set_height(canvas.offset_height() as u32); + + context.clear_color(0.7, 0.2, 0.5, 1.0); + context.clear(); + + stdweb::event_loop(); +} diff --git a/examples/webgl/static/index.html b/examples/webgl/static/index.html new file mode 100644 index 00000000..c38910d5 --- /dev/null +++ b/examples/webgl/static/index.html @@ -0,0 +1,20 @@ + + + + + stdweb • Canvas + + + + + + + diff --git a/src/lib.rs b/src/lib.rs index 6486e6b5..310a4ea5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -160,6 +160,7 @@ pub mod web { pub use webapi::history::History; pub use webapi::web_socket::{WebSocket, SocketCloseCode}; pub use webapi::rendering_context::{RenderingContext, CanvasRenderingContext2d}; + pub use webapi::webgl_rendering_context::WebGLRenderingContext; pub use webapi::mutation_observer::{MutationObserver, MutationObserverHandle, MutationObserverInit, MutationRecord}; pub use webapi::xml_http_request::{XmlHttpRequest, XhrReadyState}; diff --git a/src/webapi/mod.rs b/src/webapi/mod.rs index ec194735..89fb4060 100644 --- a/src/webapi/mod.rs +++ b/src/webapi/mod.rs @@ -27,6 +27,7 @@ pub mod xml_http_request; pub mod history; pub mod web_socket; pub mod rendering_context; +pub mod webgl_rendering_context; pub mod mutation_observer; pub mod error; pub mod dom_exception; diff --git a/src/webapi/webgl_rendering_context.rs b/src/webapi/webgl_rendering_context.rs new file mode 100644 index 00000000..f59c7a55 --- /dev/null +++ b/src/webapi/webgl_rendering_context.rs @@ -0,0 +1,45 @@ +use webcore::value::{Reference, ConversionError}; +use webcore::try_from::TryInto; +use webapi::rendering_context::RenderingContext; +use webapi::html_elements::CanvasElement; + +/// Used for drawing Webgl content onto the canvas element. +/// +/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext) +// https://html.spec.whatwg.org/#webglrenderingcontext +pub struct WebGLRenderingContext(Reference); + +reference_boilerplate! { + WebGLRenderingContext, + instanceof WebGLRenderingContext +} + +impl RenderingContext for WebGLRenderingContext { + type Error = ConversionError; + fn from_canvas(canvas: &CanvasElement) -> Result { + js!( + return @{canvas}.getContext("webgl"); + ).try_into() + } +} + +impl WebGLRenderingContext { + /// This specifies what color values to use when calling the clear() method. + /// The values are clamped between 0 and 1. + /// + /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clearColor) + pub fn clear_color(&self, red: f64, green: f64, blue: f64, alpha: f64) { + js! { @(no_return) + @{&self.0}.clearColor(@{red}, @{green}, @{blue}, @{alpha}); + } + } + + /// The WebGLRenderingContext.clear() method of the WebGL API clears buffers to preset values. + /// + /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear) + pub fn clear(&self) { + js! { @(no_return) + @{&self.0}.clear(@{&self.0}.COLOR_BUFFER_BIT); + } + } +}