gpu-curtains
Version:
gpu-curtains is a 3D WebGPU rendering engine. It can be used as a standalone 3D engine, but also includes extra classes focused on mapping 3d objects to DOM elements; It allows users to synchronize values such as position, sizing, or scale between them.
79 lines (76 loc) • 2.18 kB
JavaScript
import { isRenderer } from '../renderers/utils.mjs';
import { SamplerBinding } from '../bindings/SamplerBinding.mjs';
import { generateUUID, throwWarning } from '../../utils/utils.mjs';
class Sampler {
/**
* Sampler constructor
* @param renderer - {@link Renderer} object or {@link GPUCurtains} class object used to create this {@link Sampler}.
* @param parameters - {@link SamplerParams | parameters} used to create this {@link Sampler}.
*/
constructor(renderer, {
label = "Sampler",
name,
addressModeU = "repeat",
addressModeV = "repeat",
magFilter = "linear",
minFilter = "linear",
mipmapFilter = "linear",
maxAnisotropy = 1,
type = "filtering",
compare = null
} = {}) {
this.type = "Sampler";
this.uuid = generateUUID();
this.label = label;
this.setRenderer(renderer);
if (!name && !this.renderer.production) {
name = "sampler" + this.renderer.samplers.length;
throwWarning(
`Sampler: you are trying to create a sampler without the mandatory name parameter. A default name will be used instead: ${name}`
);
}
this.name = name;
this.options = {
addressModeU,
addressModeV,
magFilter,
minFilter,
mipmapFilter,
maxAnisotropy,
type,
...compare !== null && { compare }
};
this.createSampler();
this.createBinding();
}
/**
* Set or reset this {@link Sampler} {@link Sampler.renderer | renderer}.
* @param renderer - New {@link Renderer} or {@link GPUCurtains} instance to use.
*/
setRenderer(renderer) {
renderer = isRenderer(renderer, this.label + " " + this.type);
this.renderer = renderer;
}
/**
* Set the {@link GPUSampler}.
*/
createSampler() {
this.sampler = this.renderer.createSampler(this);
if (this.binding) {
this.binding.resource = this.sampler;
}
}
/**
* Set the {@link SamplerBinding | binding}.
*/
createBinding() {
this.binding = new SamplerBinding({
label: this.label,
name: this.name,
bindingType: "sampler",
sampler: this.sampler,
type: this.options.type
});
}
}
export { Sampler };