UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

47 lines (46 loc) 1.58 kB
import { Vec3 } from "../../core/math/vec3.js"; import { random } from "../../core/math/random.js"; import { Color } from "../../core/math/color.js"; import { Entity } from "../entity.js"; import { SHADOW_PCF3_32F } from "../../scene/constants.js"; import { BakeLight } from "./bake-light.js"; const _tempPoint = new Vec3(); class BakeLightAmbient extends BakeLight { constructor(lightmapper) { const scene = lightmapper.scene; const lightEntity = new Entity("AmbientLight"); lightEntity.addComponent("light", { type: "directional", affectDynamic: true, affectLightmapped: false, bake: true, bakeNumSamples: scene.ambientBakeNumSamples, castShadows: true, normalOffsetBias: 0.05, shadowBias: 0.2, shadowDistance: 1, // this is updated during shadow map rendering shadowResolution: 2048, shadowType: SHADOW_PCF3_32F, color: Color.WHITE, intensity: 1, bakeDir: false }); super(scene, lightEntity.light.light, lightmapper.lightingParams); } get numVirtualLights() { return this.light.bakeNumSamples; } prepareVirtualLight(index, numVirtualLights) { random.spherePointDeterministic(_tempPoint, index, numVirtualLights, 0, this.scene.ambientBakeSpherePart); this.light._node.lookAt(_tempPoint.mulScalar(-1)); this.light._node.rotateLocal(90, 0, 0); const gamma = 2.2; const fullIntensity = 2 * Math.PI * this.scene.ambientBakeSpherePart; const linearIntensity = Math.pow(fullIntensity, gamma); this.light.intensity = Math.pow(linearIntensity / numVirtualLights, 1 / gamma); } } export { BakeLightAmbient };