@@ -7,7 +7,7 @@ import skinWgslVert from './wgsl/terrain_skin_vert.wgsl';
77import skinWgslFrag from './wgsl/terrain_skin_frag.wgsl' ;
88import { getCascadeTileIds , getSkinTileScale , getSkinTileRes , createEmtpyTerrainHeights , EMPTY_TERRAIN_GEO } from './TerrainTileUtil' ;
99import { createMartiniData } from './util/martini' ;
10- import { isNil , extend , pushIn } from '../util/util' ;
10+ import { isNil , extend , pushIn , isFunction } from '../util/util' ;
1111import TerrainPainter from './TerrainPainter' ;
1212import TerrainLitPainter from './TerrainLitPainter' ;
1313import MaskRendererMixin from '../mask/MaskRendererMixin' ;
@@ -927,35 +927,60 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
927927 cesiumIonTokenURL : layerOptions . cesiumIonTokenURL ,
928928 error : error ,
929929 colors : layerOptions . colors ,
930- tileSize : tileSize ? [ tileSize . width , tileSize . height ] : [ 256 , 256 ]
930+ tileSize : tileSize ? [ tileSize . width , tileSize . height ] : [ 256 , 256 ] ,
931+ command : 'loadTile'
931932 } ;
932- this . workerConn . fetchTerrain ( terrainUrl , options , ( err , resource ) => {
933- if ( this . _parentRequests ) {
934- const reqKey = getParentRequestKey ( tile . x , tile . y ) ;
935- const childTiles = this . _parentRequests [ reqKey ] ;
936- if ( childTiles && childTiles . size ) {
937- this . tileCache . add ( tile . id , { info : tile , image : terrainData } ) ;
938- for ( const tile of childTiles ) {
939- this . removeTileLoading ( tile ) ;
933+
934+ const fetchTerrain = ( ) => {
935+ this . workerConn . fetchTerrain ( terrainUrl , options , ( err , resource ) => {
936+ if ( this . _parentRequests ) {
937+ const reqKey = getParentRequestKey ( tile . x , tile . y ) ;
938+ const childTiles = this . _parentRequests [ reqKey ] ;
939+ if ( childTiles && childTiles . size ) {
940+ this . tileCache . add ( tile . id , { info : tile , image : terrainData } ) ;
941+ for ( const tile of childTiles ) {
942+ this . removeTileLoading ( tile ) ;
943+ }
940944 }
945+ delete this . _parentRequests [ reqKey ] ;
941946 }
942- delete this . _parentRequests [ reqKey ] ;
943- }
944- if ( err ) {
945- if ( err . canceled ) {
947+ if ( err ) {
948+ fetchError ( err ) ;
946949 return ;
947950 }
948- console . warn ( err ) ;
949- this . onTileError ( terrainData , tile ) ;
951+ maptalks . Util . extend ( terrainData , resource ) ;
952+ terrainExaggeration ( terrainData , this . layer . options . exaggeration ) ;
953+
954+ // this.consumeTile(terrainData, tile);
955+ tile . colorsTexture = terrainData . colorsTexture ;
956+ this . onTileLoad ( terrainData , tile ) ;
957+ } ) ;
958+ } ;
959+ const fetchError = ( err ) => {
960+ if ( err && err . canceled ) {
950961 return ;
951962 }
952- maptalks . Util . extend ( terrainData , resource ) ;
953- terrainExaggeration ( terrainData , this . layer . options . exaggeration ) ;
963+ console . warn ( err ) ;
964+ this . onTileError ( terrainData , tile ) ;
965+ return ;
966+ }
967+ if ( this . loadTileBitmap && isFunction ( this . loadTileBitmap ) ) {
968+ this . loadTileBitmap ( terrainUrl , tile , ( err , bitmap ) => {
969+ if ( err ) {
970+ fetchError ( err ) ;
971+ return ;
972+ }
973+ if ( bitmap && bitmap instanceof ImageBitmap ) {
974+ options . tileImage = bitmap ;
975+ fetchTerrain ( ) ;
976+ } else {
977+ fetchError ( new Error ( 'bitmap is not ImageBitmap' ) ) ;
978+ }
979+ } , options ) ;
980+ } else {
981+ fetchTerrain ( ) ;
982+ }
954983
955- // this.consumeTile(terrainData, tile);
956- tile . colorsTexture = terrainData . colorsTexture ;
957- this . onTileLoad ( terrainData , tile ) ;
958- } ) ;
959984 return terrainData ;
960985 }
961986
@@ -1092,6 +1117,18 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
10921117 abortTileLoading ( tileImage , tileInfo ) {
10931118 const layer = this . layer ;
10941119 const maxAvailableZoom = layer . options . maxAvailableZoom && ( layer . options . maxAvailableZoom - layer . options . zoomOffset ) ;
1120+
1121+ const abortTile = ( url , tile ) => {
1122+ if ( this . loadTileBitmap && isFunction ( this . loadTileBitmap ) ) {
1123+ this . loadTileBitmap ( url , tile , ( ) => {
1124+
1125+ } , {
1126+ command : 'abortTile'
1127+ } )
1128+ } else if ( this . workerConn ) {
1129+ this . workerConn . abortTerrain ( url ) ;
1130+ }
1131+ }
10951132 if ( tileInfo ) {
10961133 if ( maxAvailableZoom && tileInfo . z > maxAvailableZoom ) {
10971134 const { requests, key } = this . _getParentTileRequest ( tileInfo ) ;
@@ -1100,16 +1137,12 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
11001137 if ( ! requests . size ) {
11011138 // 中止 maxAvailableZoom 瓦片的请求
11021139 delete this . _parentRequests [ key ] ;
1103- if ( this . workerConn ) {
1104- this . workerConn . abortTerrain ( requests . url ) ;
1105- }
1140+ abortTile ( requests . url , tileInfo ) ;
11061141 }
11071142 }
11081143 } else {
11091144 if ( tileInfo && tileInfo . url ) {
1110- if ( this . workerConn ) {
1111- this . workerConn . abortTerrain ( tileInfo . url ) ;
1112- }
1145+ abortTile ( tileInfo . url , tileInfo ) ;
11131146 }
11141147 }
11151148 }
0 commit comments