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
763 downloads per month
awsm_web is primarily used as a building block for other crates in the awsm ecosystem.
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 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
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:
uniforms: you can't know those in advance, you have to get them via a web api call that takes a string
uniform buffer objects: you can sorta set and calculate it in advance, but it's very error prone and fragile
sampler index: can be set in advance but requires syncing with the uniform value
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
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