update method
void
update()
Implementation
void update() {
final csm = this.csm;
final camera = csm.data.camera;
final cascades = csm.data.cascades;
final mainFrustum = csm.mainFrustum;
final frustums = csm.frustums;
final lights = csm.lights;
final frustumLines = this.frustumLines;
final frustumLinePositions = frustumLines.geometry?.getAttributeFromString( 'position' );
final cascadeLines = this.cascadeLines;
final cascadePlanes = this.cascadePlanes;
final shadowLines = this.shadowLines;
position.setFrom( camera.position );
quaternion.setFrom( camera.quaternion );
scale.setFrom( camera.scale );
updateMatrixWorld( true );
while ( cascadeLines.length > cascades ) {
remove( cascadeLines.removeLast() );
remove( cascadePlanes.removeLast() );
remove( shadowLines.removeLast() );
}
while ( cascadeLines.length < cascades ) {
final cascadeLine = BoundingBoxHelper( BoundingBox(), 0xffffff );
final planeMat = MeshBasicMaterial.fromMap( { 'transparent': true, 'opacity': 0.1, 'depthWrite': false, 'side': DoubleSide } );
final cascadePlane = Mesh( PlaneGeometry(), planeMat );
final shadowLineGroup = Group();
final shadowLine = BoundingBoxHelper( BoundingBox(), 0xffff00 );
shadowLineGroup.add( shadowLine );
add( cascadeLine );
add( cascadePlane );
add( shadowLineGroup );
cascadeLines.add( cascadeLine );
cascadePlanes.add( cascadePlane );
shadowLines.add( shadowLineGroup );
}
for (int i = 0; i < cascades; i ++ ) {
final frustum = frustums[ i ];
final light = lights[ i ];
final shadowCam = light.shadow!.camera!;
final farVerts = frustum.vertices.far;
final cascadeLine = cascadeLines[ i ];
final cascadePlane = cascadePlanes[ i ];
final shadowLineGroup = shadowLines[ i ];
final shadowLine = shadowLineGroup.children[ 0 ];
cascadeLine.box?.min.setFrom( farVerts[ 2 ] );
cascadeLine.box?.max.setFrom( farVerts[ 0 ] );
cascadeLine.box?.max.z += 1e-4;
cascadePlane.position.add2( farVerts[ 0 ], farVerts[ 2 ] );
cascadePlane.position.scale( 0.5 );
cascadePlane.scale.sub2( farVerts[ 0 ], farVerts[ 2 ] );
cascadePlane.scale.z = 1e-4;
remove( shadowLineGroup );
shadowLineGroup.position.setFrom( shadowCam.position );
shadowLineGroup.quaternion.setFrom( shadowCam.quaternion );
shadowLineGroup.scale.setFrom( shadowCam.scale );
shadowLineGroup.updateMatrixWorld( true );
attach( shadowLineGroup );
(shadowLine as BoundingBoxHelper).box?.min.setValues( shadowCam.bottom, shadowCam.left, - shadowCam.far );
shadowLine.box?.max.setValues( shadowCam.top, shadowCam.right, - shadowCam.near );
}
final nearVerts = mainFrustum.vertices.near;
final farVerts = mainFrustum.vertices.far;
frustumLinePositions.setXYZ( 0, farVerts[ 0 ].x, farVerts[ 0 ].y, farVerts[ 0 ].z );
frustumLinePositions.setXYZ( 1, farVerts[ 3 ].x, farVerts[ 3 ].y, farVerts[ 3 ].z );
frustumLinePositions.setXYZ( 2, farVerts[ 2 ].x, farVerts[ 2 ].y, farVerts[ 2 ].z );
frustumLinePositions.setXYZ( 3, farVerts[ 1 ].x, farVerts[ 1 ].y, farVerts[ 1 ].z );
frustumLinePositions.setXYZ( 4, nearVerts[ 0 ].x, nearVerts[ 0 ].y, nearVerts[ 0 ].z );
frustumLinePositions.setXYZ( 5, nearVerts[ 3 ].x, nearVerts[ 3 ].y, nearVerts[ 3 ].z );
frustumLinePositions.setXYZ( 6, nearVerts[ 2 ].x, nearVerts[ 2 ].y, nearVerts[ 2 ].z );
frustumLinePositions.setXYZ( 7, nearVerts[ 1 ].x, nearVerts[ 1 ].y, nearVerts[ 1 ].z );
frustumLinePositions.needsUpdate = true;
}