blob: 1ce5acb222020baed9cf43f04b739121e765c630 [file]
import { Layout, Context } from "rive/host";
import { GPUBuffer } from "rive/gpu";
import { BufferUsage } from "rive/gpu_enums";
import { Job, Jobs } from "rive/jobs";
import { Blob } from "rive/shared";
@job export function skins(count: i32): Blob {
let bytes = new Uint8Array(count);
for (let i = 0; i < count; i++) {
bytes[i] = <u8>(i * 3);
}
return Blob.from(bytes.buffer);
}
// A job's blob reaches GPU buffers without passing through this lane's
// memory, and is gone before anything replays the upload or the make.
export class Main extends Layout {
context: Context? = null;
vertices: GPUBuffer? = null;
mesh: GPUBuffer? = null;
skinning: Job<Blob>? = null;
override init(context: Context): bool {
this.context = context;
this.vertices = new GPUBuffer(BufferUsage.vertex, 64);
this.skinning = Jobs.run(skins, 48);
return true;
}
override advance(seconds: f64): bool {
let skinning = this.skinning;
if (skinning != null && !skinning.running) {
this.skinning = null;
let skinned = skinning.peek()!.value;
skinning.release();
this.vertices!.updateFromBlob(8, skinned, 32, 16);
this.mesh = GPUBuffer.fromBlob(BufferUsage.vertex, skinned, true, 8, 24);
skinned.release();
this.context!.log("skin uploaded");
}
return true;
}
}