@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
90 lines (89 loc) • 3.27 kB
JavaScript
;
import { Vector2 } from "three";
export var UniformName = /* @__PURE__ */ ((UniformName2) => {
UniformName2["TIME"] = "time";
UniformName2["RESOLUTION"] = "resolution";
UniformName2["SPOTLIGHTS_RAYMARCHING"] = "spotLightsRayMarching";
UniformName2["DIRECTIONALLIGHTS_RAYMARCHING"] = "directionalLightsRayMarching";
UniformName2["POINTLIGHTS_RAYMARCHING"] = "pointLightsRayMarching";
return UniformName2;
})(UniformName || {});
const GLOBAL_UNIFORMS = {
// [UniformName.TIME]: {value: 0},
["resolution" /* RESOLUTION */]: { value: new Vector2(1e3, 1e3) }
};
export class UniformsController {
constructor(scene) {
this.scene = scene;
}
// private _resolution: Vector2 = new Vector2(1, 1);
// private _resolutionDependentUniformsMap: Map<string, IUniformsWithResolutionOnly> = new Map();
// private _resolutionDependentUniforms: IUniformsWithResolutionOnly[] = [];
// add uniforms from assemblers
addUniforms(uniforms, options) {
const {
paramConfigs,
additionalTextureUniforms,
timeDependent,
resolutionDependent,
raymarchingLightsWorldCoordsDependent
} = options;
for (const paramConfig of paramConfigs) {
uniforms[paramConfig.uniformName()] = paramConfig.uniform();
}
const additionalUniformNames = Object.keys(additionalTextureUniforms);
for (const uniformName of additionalUniformNames) {
const uniformValue = additionalTextureUniforms[uniformName];
uniforms[uniformName] = uniformValue;
}
if (timeDependent) {
this.addTimeUniform(uniforms);
} else {
this.removeTimeUniform(uniforms);
}
if (resolutionDependent) {
this.addResolutionUniforms(uniforms);
} else {
this.removeResolutionUniform(uniforms);
}
if (raymarchingLightsWorldCoordsDependent) {
this.addRaymarchingUniforms(uniforms);
} else {
this.removeRaymarchingUniform(uniforms);
}
}
addTimeUniform(uniforms) {
uniforms["time" /* TIME */] = this.scene.timeController.timeUniform();
}
removeTimeUniform(uniforms) {
delete uniforms["time" /* TIME */];
}
timeUniformValue() {
return this.scene.timeController.timeUniform().value;
}
// public updateTime() {
// GLOBAL_UNIFORMS[UniformName.TIME].value = this.scene.time();
// }
// resolution
addResolutionUniforms(uniforms) {
uniforms["resolution" /* RESOLUTION */] = GLOBAL_UNIFORMS["resolution" /* RESOLUTION */];
}
removeResolutionUniform(uniforms) {
delete uniforms["resolution" /* RESOLUTION */];
}
updateResolution(resolution, pixelRatio) {
GLOBAL_UNIFORMS["resolution" /* RESOLUTION */].value.copy(resolution).multiplyScalar(pixelRatio);
}
// raymarching
addRaymarchingUniforms(uniforms) {
this.scene.sceneTraverser.addLightsRayMarchingUniform(uniforms);
}
removeRaymarchingUniform(uniforms) {
this.scene.sceneTraverser.removeLightsRayMarchingUniform(uniforms);
}
// updateResolutionDependentUniforms(uniforms: IUniformsWithResolutionOnly) {
// const resolutionUniform = uniforms[UniformName.RESOLUTION];
// resolutionUniform.value.x = this._resolution.x; // * window.devicePixelRatio;
// resolutionUniform.value.y = this._resolution.y; // * window.devicePixelRatio;
// }
}