render method
Implementation
void render(List<Light> lights, Object3D scene, Camera camera) {
if (scope.enabled == false) return;
if (scope.autoUpdate == false && scope.needsUpdate == false) return;
if (lights.isEmpty) return;
var currentRenderTarget = _renderer.getRenderTarget();
var activeCubeFace = _renderer.getActiveCubeFace();
var activeMipmapLevel = _renderer.getActiveMipmapLevel();
var state = _renderer.state;
// Set GL state for depth map.
state.setBlending(NoBlending);
state.buffers["color"].setClear(1.0, 1.0, 1.0, 1.0, false);
state.buffers["depth"].setTest(true);
state.setScissorTest(false);
// render depth map
for (var i = 0, il = lights.length; i < il; i++) {
var light = lights[i];
var shadow = light.shadow;
if (shadow == null) {
// print( 'three.WebGLShadowMap: ${light} has no shadow.' );
continue;
}
if (shadow.autoUpdate == false && shadow.needsUpdate == false) continue;
_shadowMapSize.copy(shadow.mapSize);
var shadowFrameExtents = shadow.getFrameExtents();
_shadowMapSize.multiply(shadowFrameExtents);
_viewportSize.copy(shadow.mapSize);
if (_shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize) {
if (_shadowMapSize.x > _maxTextureSize) {
_viewportSize.x = Math.floor(_maxTextureSize / shadowFrameExtents.x).toDouble();
_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;
shadow.mapSize.x = _viewportSize.x;
}
if (_shadowMapSize.y > _maxTextureSize) {
_viewportSize.y = Math.floor(_maxTextureSize / shadowFrameExtents.y).toDouble();
_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;
shadow.mapSize.y = _viewportSize.y;
}
}
if (shadow.map == null && shadow is! PointLightShadow && type == VSMShadowMap) {
shadow.map = WebGLRenderTarget(_shadowMapSize.x.toInt(), _shadowMapSize.y.toInt());
shadow.map!.texture.name = '${light.name}.shadowMap';
shadow.mapPass = WebGLRenderTarget(_shadowMapSize.x.toInt(), _shadowMapSize.y.toInt());
shadow.camera!.updateProjectionMatrix();
}
if (shadow.map == null) {
var pars =
WebGLRenderTargetOptions({"minFilter": NearestFilter, "magFilter": NearestFilter, "format": RGBAFormat});
shadow.map = WebGLRenderTarget(_shadowMapSize.x.toInt(), _shadowMapSize.y.toInt(), pars);
shadow.map!.texture.name = '${light.name}.shadowMap';
shadow.camera!.updateProjectionMatrix();
}
_renderer.setRenderTarget(shadow.map);
_renderer.clear();
var viewportCount = shadow.getViewportCount();
for (var vp = 0; vp < viewportCount; vp++) {
var viewport = shadow.getViewport(vp);
_viewport.set(_viewportSize.x * viewport.x, _viewportSize.y * viewport.y, _viewportSize.x * viewport.z,
_viewportSize.y * viewport.w);
state.viewport(_viewport);
shadow.updateMatrices(light, viewportIndex: vp);
_frustum = shadow.getFrustum();
renderObject(scene, camera, shadow.camera!, light, type);
}
// do blur pass for VSM
if (shadow is! PointLightShadow && type == VSMShadowMap) {
vSMPass(shadow, camera);
}
shadow.needsUpdate = false;
}
scope.needsUpdate = false;
_renderer.setRenderTarget(currentRenderTarget, activeCubeFace, activeMipmapLevel);
}