95 lines
5.1 KiB
JavaScript
95 lines
5.1 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$shader$Shader = function(global, require, module, exports) {
|
|
global = require("module$node_modules$eventemitter3$index");
|
|
var uid = require("module$node_modules$pixi_DOT_js$lib$utils$data$uid"), GlProgram = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gl$shader$GlProgram"), BindGroup = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$shader$BindGroup"), GpuProgram = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$shader$GpuProgram"), types = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$types"), UniformGroup = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$shader$UniformGroup");
|
|
"use strict";
|
|
class Shader extends global {
|
|
constructor(options) {
|
|
super();
|
|
this.uid = uid.uid("shader");
|
|
this._uniformBindMap = Object.create(null);
|
|
this._ownedBindGroups = [];
|
|
this._destroyed = !1;
|
|
let {gpuProgram, glProgram, groups, resources, compatibleRenderers, groupMap} = options;
|
|
this.gpuProgram = gpuProgram;
|
|
this.glProgram = glProgram;
|
|
void 0 === compatibleRenderers && (compatibleRenderers = 0, gpuProgram && (compatibleRenderers |= types.RendererType.WEBGPU), glProgram && (compatibleRenderers |= types.RendererType.WEBGL));
|
|
this.compatibleRenderers = compatibleRenderers;
|
|
const nameHash = {};
|
|
resources || groups || (resources = {});
|
|
if (resources && groups) {
|
|
throw Error("[Shader] Cannot have both resources and groups");
|
|
}
|
|
if (!gpuProgram && groups && !groupMap) {
|
|
throw Error("[Shader] No group map or WebGPU shader provided - consider using resources instead.");
|
|
}
|
|
if (!gpuProgram && groups && groupMap) {
|
|
for (var i$jscomp$0 in groupMap) {
|
|
for (var j in groupMap[i$jscomp$0]) {
|
|
var uniformName = groupMap[i$jscomp$0][j];
|
|
nameHash[uniformName] = {group:i$jscomp$0, binding:j, name:uniformName};
|
|
}
|
|
}
|
|
} else if (gpuProgram && groups && !groupMap) {
|
|
uniformName = gpuProgram.structsAndGroups.groups, groupMap = {}, uniformName.forEach(data => {
|
|
groupMap[data.group] = groupMap[data.group] || {};
|
|
groupMap[data.group][data.binding] = data.name;
|
|
nameHash[data.name] = data;
|
|
});
|
|
} else if (resources) {
|
|
groups = {};
|
|
groupMap = {};
|
|
gpuProgram && gpuProgram.structsAndGroups.groups.forEach(data => {
|
|
groupMap[data.group] = groupMap[data.group] || {};
|
|
groupMap[data.group][data.binding] = data.name;
|
|
nameHash[data.name] = data;
|
|
});
|
|
i$jscomp$0 = 0;
|
|
for (const i in resources) {
|
|
nameHash[i] || (groups[99] || (groups[99] = new BindGroup.BindGroup(), this._ownedBindGroups.push(groups[99])), nameHash[i] = {group:99, binding:i$jscomp$0, name:i}, groupMap[99] = groupMap[99] || {}, groupMap[99][i$jscomp$0] = i, i$jscomp$0++);
|
|
}
|
|
for (uniformName in resources) {
|
|
if (j = uniformName, i$jscomp$0 = resources[uniformName], i$jscomp$0.source || i$jscomp$0._resourceType || (i$jscomp$0 = new UniformGroup.UniformGroup(i$jscomp$0)), j = nameHash[j]) {
|
|
groups[j.group] || (groups[j.group] = new BindGroup.BindGroup(), this._ownedBindGroups.push(groups[j.group])), groups[j.group].setResource(i$jscomp$0, j.binding);
|
|
}
|
|
}
|
|
}
|
|
this.groups = groups;
|
|
this._uniformBindMap = groupMap;
|
|
this.resources = this._buildResourceAccessor(groups, nameHash);
|
|
}
|
|
addResource(name, groupIndex, bindIndex) {
|
|
var _a, _b;
|
|
(_a = this._uniformBindMap)[groupIndex] || (_a[groupIndex] = {});
|
|
(_b = this._uniformBindMap[groupIndex])[bindIndex] || (_b[bindIndex] = name);
|
|
this.groups[groupIndex] || (this.groups[groupIndex] = new BindGroup.BindGroup(), this._ownedBindGroups.push(this.groups[groupIndex]));
|
|
}
|
|
_buildResourceAccessor(groups, nameHash) {
|
|
const uniformsOut = {};
|
|
for (const i in nameHash) {
|
|
const data = nameHash[i];
|
|
Object.defineProperty(uniformsOut, data.name, {get() {
|
|
return groups[data.group].getResource(data.binding);
|
|
}, set(value) {
|
|
groups[data.group].setResource(value, data.binding);
|
|
}});
|
|
}
|
|
return uniformsOut;
|
|
}
|
|
destroy(destroyPrograms = !1) {
|
|
this._destroyed || (this._destroyed = !0, this.emit("destroy", this), destroyPrograms && (this.gpuProgram?.destroy(), this.glProgram?.destroy()), this.glProgram = this.gpuProgram = null, this.removeAllListeners(), this._uniformBindMap = null, this._ownedBindGroups.forEach(bindGroup => {
|
|
bindGroup.destroy();
|
|
}), this.groups = this.resources = this._ownedBindGroups = null);
|
|
}
|
|
static from(options) {
|
|
const {gpu, gl, ...rest} = options;
|
|
let gpuProgram, glProgram;
|
|
gpu && (gpuProgram = GpuProgram.GpuProgram.from(gpu));
|
|
gl && (glProgram = GlProgram.GlProgram.from(gl));
|
|
return new Shader({gpuProgram, glProgram, ...rest});
|
|
}
|
|
}
|
|
exports.Shader = Shader;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$shader$Shader.js.map
|