Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions debug/test-rastertile-fade.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<!DOCTYPE html>
<html>
<head>
<title>Mapbox-Raster-Reprojection</title>
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<!--
<link
href="https://api.mapbox.com/mapbox-gl-js/v3.14.0/mapbox-gl.css"
rel="stylesheet"
/>
<script src="https://api.mapbox.com/mapbox-gl-js/v3.14.0/mapbox-gl.js"></script>

-->

<link rel='stylesheet' href='../dist/mapbox-gl.css' />


<meta charset="UTF-8" />
<style>
body {
font-family: sans-serif;
}

html,
body,
#map {
margin: 0;
height: 100%;
}
</style>
</head>

<body>
<div id="map"></div>


<script src='../dist/mapbox-gl-dev.js'></script>
<script src='../debug/access_token_generated.js'></script>

<script>
let year = 2015;

// mapboxgl.accessToken =
// "pk.eyJ1IjoiYnJhbnpoYW5nIiwiYSI6ImNqM3FycmVldjAxZTUzM2xqMmllNnBjMHkifQ.Wv3ekbtia0BuUHGWVUGoFg";

const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v11",
center: [0, 55],
zoom: 3,
hash: true,
});

map.showTileBoundaries = true;
map.on("load", () => {
map.addSource("custom-source", {
scheme: "xyz",
type: "raster",
tiles: [
`https://gibs-b.earthdata.nasa.gov/wmts/epsg3857/all/MODIS_Aqua_CorrectedReflectance_TrueColor/default/${year}-08-02/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg`,
],
tileSize: 256,
});
map.addLayer({
id: "custom-source-layer",
type: "raster",
source: "custom-source",
paint: {
"raster-opacity": 1,
"raster-fade-duration": 500,
"raster-opacity-transition": { duration: 0 },
},
});

launchInterval();
});

function callback() {
year += 1;
if (year > 2024) {
year = 2015;
}
console.log(year)

let source = map.getSource("custom-source");
let new_url = `https://gibs-b.earthdata.nasa.gov/wmts/epsg3857/all/MODIS_Aqua_CorrectedReflectance_TrueColor/default/${year}-08-02/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg`;
//source?.setUrl(new_url); // not working
const clearSource= false
source?.setTiles([new_url], clearSource);
}

let intervalId;
function launchInterval() {
intervalId = setInterval(callback, 2000);
}
</script>
</body>
</html>
24 changes: 23 additions & 1 deletion src/render/draw_raster.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate';
import {COLOR_MIX_FACTOR} from '../style/style_layer/raster_style_layer';
import RasterArrayTile from '../source/raster_array_tile';
import RasterArrayTileSource from '../source/raster_array_tile_source';
import browser from '../util/browser';

import type Transform from '../geo/transform';
import type {OverscaledTileID} from '../source/tile_id';
Expand All @@ -40,6 +41,7 @@ import type {CrossTileID, VariableOffset} from '../symbol/placement';
export default drawRaster;

const RASTER_COLOR_TEXTURE_UNIT = 2;
const PREVIOUS_TILE_TEXTURE_UNIT = 3;

type RasterConfig = {
defines: DynamicDefinesType[];
Expand Down Expand Up @@ -185,6 +187,24 @@ function drawRaster(painter: Painter, sourceCache: SourceCache, layer: RasterSty
texture.bind(textureFilter, gl.CLAMP_TO_EDGE);
}

// --- ICONEM: bind previous tile texture (if any) on unit 3
let perTileFadeMix = 0.5;
const perTileFadeDuration = 1000; // because was probably initialLoad, rasterFadeDuration = 0
if (tile.previousTexture) {
const now = browser.now();
// If we missed setting start, treat as fully shown
const t0 = tile.perTileFadeStartTime ? tile.perTileFadeStartTime : now;
// const t0 = tile.perTileFadeEndTime ? tile.perTileFadeEndTime - perTileFadeDuration : now;
perTileFadeMix = Math.max(0, Math.min(1, (now - t0) / perTileFadeDuration));
context.activeTexture.set(gl.TEXTURE0 + PREVIOUS_TILE_TEXTURE_UNIT);
tile.previousTexture.bind(textureFilter, gl.CLAMP_TO_EDGE);
// Optional micro-GC once the fade is done
if (perTileFadeMix >= 1 && tile.previousTexture instanceof Texture) {
tile.previousTexture.destroy();
tile.previousTexture = null;
}
}

// Enable trilinear filtering on tiles only beyond 20 degrees pitch,
// to prevent it from compromising image crispness on flat or low tilted maps.
if ('useMipmap' in texture && context.extTextureFilterAnisotropic && painter.transform.pitch > 20) {
Expand Down Expand Up @@ -248,7 +268,9 @@ function drawRaster(painter: Painter, sourceCache: SourceCache, layer: RasterSty
rasterConfig.range,
tileSize,
buffer,
emissiveStrength
emissiveStrength,
perTileFadeMix,
(tile.previousTexture && perTileFadeMix < 1.0) ? PREVIOUS_TILE_TEXTURE_UNIT : 0
);
const affectedByFog = painter.isTileAffectedByFog(coord);

Expand Down
40 changes: 14 additions & 26 deletions src/render/program/raster_program.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ export type RasterUniformsType = {
['u_texture_offset']: Uniform2f;
['u_texture_res']: Uniform2f;
['u_emissive_strength']: Uniform1f;
['u_per_tile_fade_mix']: Uniform1f;
['u_previous_tile']: Uniform1i;
};

export type RasterDefinesType = 'RASTER_COLOR' | 'RENDER_CUTOFF' | 'RASTER_ARRAY' | 'RASTER_ARRAY_LINEAR';
Expand Down Expand Up @@ -74,34 +76,16 @@ const rasterUniforms = (context: Context): RasterUniformsType => ({
'u_color_ramp': new Uniform1i(context),
'u_texture_offset': new Uniform2f(context),
'u_texture_res': new Uniform2f(context),
'u_emissive_strength': new Uniform1f(context)
'u_emissive_strength': new Uniform1f(context),
'u_per_tile_fade_mix': new Uniform1f(context),
'u_previous_tile': new Uniform1i(context),
});

const rasterUniformValues = (
matrix: Float32Array,
normalizeMatrix: Float32Array,
globeMatrix: Float32Array,
mercMatrix: Float32Array,
gridMatrix: Float32Array,
parentTL: [number, number],
zoomTransition: number,
mercatorCenter: [number, number],
cutoffParams: [number, number, number, number],
parentScaleBy: number,
fade: {
mix: number;
opacity: number;
},
layer: RasterStyleLayer,
perspectiveTransform: [number, number],
elevation: number,
colorRampUnit: number,
colorMix: [number, number, number, number],
colorOffset: number,
colorRange: [number, number],
tileSize: number,
buffer: number,
emissiveStrength: number,
matrix: Float32Array, normalizeMatrix: Float32Array, globeMatrix: Float32Array, mercMatrix: Float32Array, gridMatrix: Float32Array, parentTL: [number, number], zoomTransition: number, mercatorCenter: [number, number], cutoffParams: [number, number, number, number], parentScaleBy: number, fade: {
mix: number;
opacity: number;
}, layer: RasterStyleLayer, perspectiveTransform: [number, number], elevation: number, colorRampUnit: number, colorMix: [number, number, number, number], colorOffset: number, colorRange: [number, number], tileSize: number, buffer: number, emissiveStrength: number, perTileFadeMix: number, previousTileTextureUnit: number,
): UniformValues<RasterUniformsType> => ({
'u_matrix': matrix,
'u_normalize_matrix': normalizeMatrix,
Expand Down Expand Up @@ -136,7 +120,9 @@ const rasterUniformValues = (
tileSize / (tileSize + 2 * buffer)
],
'u_texture_res': [tileSize + 2 * buffer, tileSize + 2 * buffer],
'u_emissive_strength': emissiveStrength
'u_emissive_strength': emissiveStrength,
'u_per_tile_fade_mix': perTileFadeMix,
'u_previous_tile': previousTileTextureUnit,
});

const rasterPoleUniformValues = (
Expand Down Expand Up @@ -178,6 +164,8 @@ const rasterPoleUniformValues = (
1,
0,
emissiveStrength,
1, // perTileperTileFadeMix by default
3, // previousTileTextureUnit
));

function spinWeights(angle: number): [number, number, number] {
Expand Down
35 changes: 35 additions & 0 deletions src/shaders/raster.fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ uniform highp float u_colorization_offset;
uniform vec2 u_texture_res;
#endif

// ICONEM
uniform sampler2D u_previous_tile;
uniform float u_per_tile_fade_mix; // 0: show previous, 1: show current


void main() {
vec4 color0, color1, color;
Expand Down Expand Up @@ -64,6 +68,10 @@ void main() {
if (value.y > 0.0) value.x /= value.y;
#else
color = mix(texture(u_image0, v_pos0), texture(u_image1, v_pos1), u_fade_t);

// ICONEM
// color = mix(texture(u_previous_tile, v_pos0), color, u_per_tile_fade_mix);

value = vec2(u_colorization_offset + dot(color.rgb, u_colorization_mix.rgb), color.a);
#endif

Expand All @@ -82,9 +90,36 @@ void main() {
if (color0.a > 0.0) color0.rgb /= color0.a;
if (color1.a > 0.0) color1.rgb /= color1.a;
color = mix(color0, color1, u_fade_t);

// ICONEM
vec4 previousColor = texture(u_previous_tile, v_pos0);
color = mix(previousColor, color, u_per_tile_fade_mix);
// float c = color0.a;
// float c = u_per_tile_fade_mix;
// color = vec4(c, 0.,0., 1.);
// color = previousColor;

// 1 Per-tile previous/current crossfade
// color = texture(u_image0, v_pos0);
// if (u_per_tile_fade_mix < 1.0) {
// // vec4 prevColor = texture(u_previous_tile, v_pos0);
// vec4 previousColor = vec4(1., 0., 0., 1.);
// color = mix(previousColor, color, clamp(u_per_tile_fade_mix, 0.0, 1.0));
// }
// 2 Existing parent/child crossfade
// parentColor = texture(u_image1, v_pos1);
// color = mix(parentColor, color, u_fade_t);

// ICONEM

#endif

color.a *= u_opacity;

// ICONEM
color.a = 1.;


#ifdef GLOBE_POLES
color.a *= 1.0 - smoothstep(0.0, 0.05, u_zoom_transition);
#endif
Expand Down
Loading