skia2/modules/canvaskit/particles.js
Kevin Lubick f8f9cd84fa [canvaskit] Expose bindings to particles uniforms.
Uniforms in the general case can be multiple floats, so
we expose a small struct to provide information about all
uniforms (including the built in ones like "dt") as well
as effectUniforms and particleUniforms which return Float32Arrays
bound to the WASM memory containing those unifroms.

Thus, by modifying the Float32Array, one can directly affect
the particle/effect properties.

This allows us to expose sliders on particles.skia.org
(https://skia-review.googlesource.com/c/buildbot/+/272398)

Change-Id: Ie390f3d2dc571ee4ebaab59a7fa1b7b2dc24d871
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/272377
Reviewed-by: Brian Osman <brianosman@google.com>
2020-02-21 14:43:01 +00:00

76 lines
2.8 KiB
JavaScript

// Adds compile-time JS functions to augment the CanvasKit interface.
// Specifically, anything that should only be on the Particle builds of canvaskit.
// assets is a dictionary of named blobs: { key: ArrayBuffer, ... }
// The keys should be well-behaved strings - they're turned into null-terminated
// strings for the native side.
CanvasKit.MakeParticles = function(json, assets) {
if (!CanvasKit._MakeParticles) {
throw 'Not compiled with MakeParticles';
}
if (!assets) {
return CanvasKit._MakeParticles(json, 0, nullptr, nullptr, nullptr);
}
var assetNamePtrs = [];
var assetDataPtrs = [];
var assetSizes = [];
var assetKeys = Object.keys(assets || {});
for (var i = 0; i < assetKeys.length; i++) {
var key = assetKeys[i];
var buffer = assets[key];
var data = new Uint8Array(buffer);
var iptr = CanvasKit._malloc(data.byteLength);
CanvasKit.HEAPU8.set(data, iptr);
assetDataPtrs.push(iptr);
assetSizes.push(data.byteLength);
// lengthBytesUTF8 and stringToUTF8Array are defined in the emscripten
// JS. See https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#stringToUTF8
// Add 1 for null terminator
var strLen = lengthBytesUTF8(key) + 1;
var strPtr = CanvasKit._malloc(strLen);
stringToUTF8(key, strPtr, strLen);
assetNamePtrs.push(strPtr);
}
// Not entirely sure if it matters, but the uintptr_t are 32 bits
// we want to copy our array of uintptr_t into the right size memory.
var namesPtr = copy1dArray(assetNamePtrs, CanvasKit.HEAPU32);
var assetsPtr = copy1dArray(assetDataPtrs, CanvasKit.HEAPU32);
var assetSizesPtr = copy1dArray(assetSizes, CanvasKit.HEAPU32);
var particles = CanvasKit._MakeParticles(json, assetKeys.length,
namesPtr, assetsPtr, assetSizesPtr);
// The C++ code has made copies of the asset and string data, so free our copies.
CanvasKit._free(namesPtr);
CanvasKit._free(assetsPtr);
CanvasKit._free(assetSizesPtr);
return particles;
};
CanvasKit._extraInitializations = CanvasKit._extraInitializations || [];
CanvasKit._extraInitializations.push(function() {
CanvasKit.SkParticleEffect.prototype.effectUniforms = function() {
var fptr = this._effectUniformPtr();
var numFloats = this.getEffectUniformFloatCount();
if (!fptr || numFloats <= 0) {
return new Float32Array();
}
return new Float32Array(CanvasKit.HEAPU8.buffer, fptr, numFloats);
}
CanvasKit.SkParticleEffect.prototype.particleUniforms = function() {
var fptr = this._particleUniformPtr();
var numFloats = this.getParticleUniformFloatCount();
if (!fptr || numFloats <= 0) {
return new Float32Array();
}
return new Float32Array(CanvasKit.HEAPU8.buffer, fptr, numFloats);
}
});