@@ -131,26 +131,28 @@ export class PointCloudMaterial extends RawShaderMaterial {
131131 fog = false ;
132132 numClipBoxes : number = 0 ;
133133 clipBoxes : IClipBox [ ] = [ ] ;
134- readonly visibleNodesTexture : Texture ;
134+ visibleNodesTexture : Texture | undefined ;
135135
136136 private _gradient = SPECTRAL ;
137- private gradientTexture = generateGradientTexture ( this . _gradient ) ;
137+ private gradientTexture : Texture | undefined = generateGradientTexture ( this . _gradient ) ;
138138
139139 private _classification : IClassification = DEFAULT_CLASSIFICATION ;
140- private classificationTexture : Texture = generateClassificationTexture ( this . _classification ) ;
140+ private classificationTexture : Texture | undefined = generateClassificationTexture (
141+ this . _classification ,
142+ ) ;
141143
142144 uniforms : IPointCloudMaterialUniforms & Record < string , IUniform < any > > = {
143145 bbSize : makeUniform ( 'fv' , [ 0 , 0 , 0 ] as [ number , number , number ] ) ,
144146 blendDepthSupplement : makeUniform ( 'f' , 0.0 ) ,
145147 blendHardness : makeUniform ( 'f' , 2.0 ) ,
146- classificationLUT : makeUniform ( 't' , this . classificationTexture ) ,
148+ classificationLUT : makeUniform ( 't' , this . classificationTexture || new Texture ( ) ) ,
147149 clipBoxCount : makeUniform ( 'f' , 0 ) ,
148150 clipBoxes : makeUniform ( 'Matrix4fv' , [ ] as any ) ,
149151 depthMap : makeUniform ( 't' , null ) ,
150152 diffuse : makeUniform ( 'fv' , [ 1 , 1 , 1 ] as [ number , number , number ] ) ,
151153 far : makeUniform ( 'f' , 1.0 ) ,
152154 fov : makeUniform ( 'f' , 1.0 ) ,
153- gradient : makeUniform ( 't' , this . gradientTexture ) ,
155+ gradient : makeUniform ( 't' , this . gradientTexture || new Texture ( ) ) ,
154156 heightMax : makeUniform ( 'f' , 1.0 ) ,
155157 heightMin : makeUniform ( 'f' , 0.0 ) ,
156158 intensityBrightness : makeUniform ( 'f' , 0 ) ,
@@ -175,7 +177,7 @@ export class PointCloudMaterial extends RawShaderMaterial {
175177 toModel : makeUniform ( 'Matrix4f' , [ ] ) ,
176178 transition : makeUniform ( 'f' , 0.5 ) ,
177179 uColor : makeUniform ( 'c' , new Color ( 0xffffff ) ) ,
178- visibleNodes : makeUniform ( 't' , this . visibleNodesTexture ) ,
180+ visibleNodes : makeUniform ( 't' , this . visibleNodesTexture || new Texture ( ) ) ,
179181 vnStart : makeUniform ( 'f' , 0.0 ) ,
180182 wClassification : makeUniform ( 'f' , 0 ) ,
181183 wElevation : makeUniform ( 'f' , 0 ) ,
@@ -187,48 +189,48 @@ export class PointCloudMaterial extends RawShaderMaterial {
187189 filterByNormalThreshold : makeUniform ( 'f' , 0 ) ,
188190 } ;
189191
190- @uniform ( 'bbSize' ) bbSize ! : [ number , number , number ] ; // prettier-ignore
191- @uniform ( 'depthMap' ) depthMap ! : Texture | null ; // prettier-ignore
192- @uniform ( 'far' ) far ! : number ; // prettier-ignore
193- @uniform ( 'fov' ) fov ! : number ; // prettier-ignore
194- @uniform ( 'heightMax' ) heightMax ! : number ; // prettier-ignore
195- @uniform ( 'heightMin' ) heightMin ! : number ; // prettier-ignore
196- @uniform ( 'intensityBrightness' ) intensityBrightness ! : number ; // prettier-ignore
197- @uniform ( 'intensityContrast' ) intensityContrast ! : number ; // prettier-ignore
198- @uniform ( 'intensityGamma' ) intensityGamma ! : number ; // prettier-ignore
199- @uniform ( 'intensityRange' ) intensityRange ! : [ number , number ] ; // prettier-ignore
200- @uniform ( 'maxSize' ) maxSize ! : number ; // prettier-ignore
201- @uniform ( 'minSize' ) minSize ! : number ; // prettier-ignore
202- @uniform ( 'near' ) near ! : number ; // prettier-ignore
203- @uniform ( 'opacity' , true ) opacity ! : number ; // prettier-ignore
204- @uniform ( 'rgbBrightness' , true ) rgbBrightness ! : number ; // prettier-ignore
205- @uniform ( 'rgbContrast' , true ) rgbContrast ! : number ; // prettier-ignore
206- @uniform ( 'rgbGamma' , true ) rgbGamma ! : number ; // prettier-ignore
207- @uniform ( 'screenHeight' ) screenHeight ! : number ; // prettier-ignore
208- @uniform ( 'screenWidth' ) screenWidth ! : number ; // prettier-ignore
209- @uniform ( 'size' ) size ! : number ; // prettier-ignore
210- @uniform ( 'spacing' ) spacing ! : number ; // prettier-ignore
211- @uniform ( 'transition' ) transition ! : number ; // prettier-ignore
212- @uniform ( 'uColor' ) color ! : Color ; // prettier-ignore
213- @uniform ( 'wClassification' ) weightClassification ! : number ; // prettier-ignore
214- @uniform ( 'wElevation' ) weightElevation ! : number ; // prettier-ignore
215- @uniform ( 'wIntensity' ) weightIntensity ! : number ; // prettier-ignore
216- @uniform ( 'wReturnNumber' ) weightReturnNumber ! : number ; // prettier-ignore
217- @uniform ( 'wRGB' ) weightRGB ! : number ; // prettier-ignore
218- @uniform ( 'wSourceID' ) weightSourceID ! : number ; // prettier-ignore
219- @uniform ( 'opacityAttenuation' ) opacityAttenuation ! : number ; // prettier-ignore
220- @uniform ( 'filterByNormalThreshold' ) filterByNormalThreshold ! : number ; // prettier-ignore
221-
222- @requiresShaderUpdate ( ) useClipBox : boolean = false ; // prettier-ignore
223- @requiresShaderUpdate ( ) weighted : boolean = false ; // prettier-ignore
224- @requiresShaderUpdate ( ) pointColorType : PointColorType = PointColorType . RGB ; // prettier-ignore
225- @requiresShaderUpdate ( ) pointSizeType : PointSizeType = PointSizeType . ADAPTIVE ; // prettier-ignore
226- @requiresShaderUpdate ( ) clipMode : ClipMode = ClipMode . DISABLED ; // prettier-ignore
227- @requiresShaderUpdate ( ) useEDL : boolean = false ; // prettier-ignore
228- @requiresShaderUpdate ( ) shape : PointShape = PointShape . SQUARE ; // prettier-ignore
229- @requiresShaderUpdate ( ) treeType : TreeType = TreeType . OCTREE ; // prettier-ignore
230- @requiresShaderUpdate ( ) pointOpacityType : PointOpacityType = PointOpacityType . FIXED ; // prettier-ignore
231- @requiresShaderUpdate ( ) useFilterByNormal : boolean = false ; // prettier-ignore
192+ @uniform ( 'bbSize' ) bbSize ! : [ number , number , number ] ;
193+ @uniform ( 'depthMap' ) depthMap ! : Texture | undefined ;
194+ @uniform ( 'far' ) far ! : number ;
195+ @uniform ( 'fov' ) fov ! : number ;
196+ @uniform ( 'heightMax' ) heightMax ! : number ;
197+ @uniform ( 'heightMin' ) heightMin ! : number ;
198+ @uniform ( 'intensityBrightness' ) intensityBrightness ! : number ;
199+ @uniform ( 'intensityContrast' ) intensityContrast ! : number ;
200+ @uniform ( 'intensityGamma' ) intensityGamma ! : number ;
201+ @uniform ( 'intensityRange' ) intensityRange ! : [ number , number ] ;
202+ @uniform ( 'maxSize' ) maxSize ! : number ;
203+ @uniform ( 'minSize' ) minSize ! : number ;
204+ @uniform ( 'near' ) near ! : number ;
205+ @uniform ( 'opacity' , true ) opacity ! : number ;
206+ @uniform ( 'rgbBrightness' , true ) rgbBrightness ! : number ;
207+ @uniform ( 'rgbContrast' , true ) rgbContrast ! : number ;
208+ @uniform ( 'rgbGamma' , true ) rgbGamma ! : number ;
209+ @uniform ( 'screenHeight' ) screenHeight ! : number ;
210+ @uniform ( 'screenWidth' ) screenWidth ! : number ;
211+ @uniform ( 'size' ) size ! : number ;
212+ @uniform ( 'spacing' ) spacing ! : number ;
213+ @uniform ( 'transition' ) transition ! : number ;
214+ @uniform ( 'uColor' ) color ! : Color ;
215+ @uniform ( 'wClassification' ) weightClassification ! : number ;
216+ @uniform ( 'wElevation' ) weightElevation ! : number ;
217+ @uniform ( 'wIntensity' ) weightIntensity ! : number ;
218+ @uniform ( 'wReturnNumber' ) weightReturnNumber ! : number ;
219+ @uniform ( 'wRGB' ) weightRGB ! : number ;
220+ @uniform ( 'wSourceID' ) weightSourceID ! : number ;
221+ @uniform ( 'opacityAttenuation' ) opacityAttenuation ! : number ;
222+ @uniform ( 'filterByNormalThreshold' ) filterByNormalThreshold ! : number ;
223+
224+ @requiresShaderUpdate ( ) useClipBox : boolean = false ;
225+ @requiresShaderUpdate ( ) weighted : boolean = false ;
226+ @requiresShaderUpdate ( ) pointColorType : PointColorType = PointColorType . RGB ;
227+ @requiresShaderUpdate ( ) pointSizeType : PointSizeType = PointSizeType . ADAPTIVE ;
228+ @requiresShaderUpdate ( ) clipMode : ClipMode = ClipMode . DISABLED ;
229+ @requiresShaderUpdate ( ) useEDL : boolean = false ;
230+ @requiresShaderUpdate ( ) shape : PointShape = PointShape . SQUARE ;
231+ @requiresShaderUpdate ( ) treeType : TreeType = TreeType . OCTREE ;
232+ @requiresShaderUpdate ( ) pointOpacityType : PointOpacityType = PointOpacityType . FIXED ;
233+ @requiresShaderUpdate ( ) useFilterByNormal : boolean = false ;
232234
233235 attributes = {
234236 position : { type : 'fv' , value : [ ] } ,
@@ -266,7 +268,31 @@ export class PointCloudMaterial extends RawShaderMaterial {
266268 this . updateShaderSource ( ) ;
267269 }
268270
269- updateShaderSource ( ) {
271+ dispose ( ) : void {
272+ super . dispose ( ) ;
273+
274+ if ( this . gradientTexture ) {
275+ this . gradientTexture . dispose ( ) ;
276+ this . gradientTexture = undefined ;
277+ }
278+
279+ if ( this . visibleNodesTexture ) {
280+ this . visibleNodesTexture . dispose ( ) ;
281+ this . visibleNodesTexture = undefined ;
282+ }
283+
284+ if ( this . classificationTexture ) {
285+ this . classificationTexture . dispose ( ) ;
286+ this . classificationTexture = undefined ;
287+ }
288+
289+ if ( this . depthMap ) {
290+ this . depthMap . dispose ( ) ;
291+ this . depthMap = undefined ;
292+ }
293+ }
294+
295+ updateShaderSource ( ) : void {
270296 this . vertexShader = this . applyDefines ( require ( './shaders/pointcloud.vert' ) . default ) ;
271297 this . fragmentShader = this . applyDefines ( require ( './shaders/pointcloud.frag' ) . default ) ;
272298
0 commit comments