playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
86 lines (83 loc) • 2.53 kB
JavaScript
import { PIXELFORMAT_RGBA32U } from '../../platform/graphics/constants.js';
import { GSplatResourceBase } from './gsplat-resource-base.js';
import { GSplatFormat } from './gsplat-format.js';
class GSplatSogResource extends GSplatResourceBase {
_actualDestroy() {
this.streams.textures.delete('packedTexture');
this.streams.textures.delete('packedSh0');
this.streams.textures.delete('packedShN');
this.gsplatData.destroy();
super._actualDestroy();
}
_populateParameters() {
const { meta } = this.gsplatData;
if (meta.means) {
this.parameters.set('means_mins', meta.means.mins);
this.parameters.set('means_maxs', meta.means.maxs);
}
if (meta.version === 2) {
[
'scales',
'sh0',
'shN'
].forEach((name)=>{
const v = meta[name];
if (v) {
this.parameters.set(`${name}_mins`, v.codebook[0]);
this.parameters.set(`${name}_maxs`, v.codebook[255]);
}
});
} else {
[
'scales',
'sh0'
].forEach((name)=>{
const v = meta[name];
if (v) {
this.parameters.set(`${name}_mins`, Math.min(...v.mins.slice(0, 3)));
this.parameters.set(`${name}_maxs`, Math.max(...v.maxs.slice(0, 3)));
}
});
[
'shN'
].forEach((name)=>{
const v = meta[name];
if (v) {
this.parameters.set(`${name}_mins`, v.mins);
this.parameters.set(`${name}_maxs`, v.maxs);
}
});
}
}
configureMaterialDefines(defines) {
defines.set('SH_BANDS', this.gsplatData.shBands);
}
constructor(device, gsplatData){
super(device, gsplatData);
const sizeTexture = gsplatData.means_l || gsplatData.packedTexture;
if (sizeTexture) {
this.streams.textureDimensions.set(sizeTexture.width, sizeTexture.height);
}
if (gsplatData.packedTexture) {
this.streams.textures.set('packedTexture', gsplatData.packedTexture);
}
if (gsplatData.packedSh0) {
this.streams.textures.set('packedSh0', gsplatData.packedSh0);
}
if (gsplatData.packedShN) {
this.streams.textures.set('packedShN', gsplatData.packedShN);
}
const streams = [
{
name: 'packedTexture',
format: PIXELFORMAT_RGBA32U
}
];
this._format = new GSplatFormat(device, streams, {
readGLSL: '#include "gsplatSogVS"',
readWGSL: '#include "gsplatSogVS"'
});
this._populateParameters();
}
}
export { GSplatSogResource };