65 releases (19 breaking)

new 0.19.2 Jun 20, 2021
0.18.1 Jun 10, 2021
0.16.0 Jan 7, 2021
0.12.0 Dec 30, 2020
0.0.11 Oct 28, 2019

#43 in WebAssembly

Download history 101/week @ 2021-02-25 241/week @ 2021-03-04 82/week @ 2021-03-11 120/week @ 2021-03-18 262/week @ 2021-03-25 67/week @ 2021-04-01 260/week @ 2021-04-08 267/week @ 2021-04-15 248/week @ 2021-04-22 67/week @ 2021-04-29 48/week @ 2021-05-06 121/week @ 2021-05-13 75/week @ 2021-05-20 88/week @ 2021-05-27 162/week @ 2021-06-03 421/week @ 2021-06-10

763 downloads per month

MIT/Apache

355KB
8K SLoC

Build Status LICENSE LICENSE Crates.io Documentation Demo

About

awsm_web is primarily used as a building block for other crates in the awsm ecosystem.

Description

The approach with this library is similar in spirit to gloo - that is to say, it bridges the gap between the auto-generated WebIDL-powered bindings web-sys provides, and the type of code we'd typically consider a real starting point in web apps.

Features

Features are heavily gated keep dependencies minimal. The default is for no features to be enabled, but the all feature will turn them all on (except those that are only meant for debugging like debug_log)

WebGL

Cache

The goal is to keep it very low level and low-cost abstraction that is almost universal. However, almost universal is not without opinions. For example, the webgl wrapper provides a lazy caching mechanism for all string lookups (including ubo offsets and texture samplers) and stores local state to avoid making unnecessary gl calls.

In terms of whether to use strings or precalculated integers:

  1. uniforms: you can't know those in advance, you have to get them via a web api call that takes a string
  2. uniform buffer objects: you can sorta set and calculate it in advance, but it's very error prone and fragile
  3. sampler index: can be set in advance but requires syncing with the uniform value
  4. attributes: can be set in advance, either through shader code or web api

Therefore, for everything other than attributes, it's best to use strings everywhere - after the first call, it's merely a local cache lookup.

Note also that there is a global registry for specifying ubo and attribute locations in advance of any shader code

Api

It happens in a couple levels

The first is very thin wrappers over the native web_sys types, added as extension traits on the contexts (both webgl1 and 2). These can be used directly on the contexts and are prefixed awsm_*. At this level, no additional state is maintained.

Then, the WebGlRenderer wrappers (also for 1 and 2) contain all the state and caching stuff mentiond above. For ease of use, many of the functions that could be called on the context directly are re-exported on the renderer without the awsm_ prefix.

Dependencies

~8.5MB
~162K SLoC