|
|
@ -5328,40 +5328,25 @@ |
|
|
map.on('pitch', updateFogOfWar); |
|
|
map.on('pitch', updateFogOfWar); |
|
|
|
|
|
|
|
|
// ===================== |
|
|
// ===================== |
|
|
// ANIMATED BUILDINGS (Random per-building) |
|
|
|
|
|
|
|
|
// ANIMATED BUILDINGS |
|
|
// ===================== |
|
|
// ===================== |
|
|
let buildingAnimationEnabled = true; // Set to false to disable |
|
|
let buildingAnimationEnabled = true; // Set to false to disable |
|
|
let buildingAnimationId = null; |
|
|
let buildingAnimationId = null; |
|
|
const buildingAnimationSpeed = 0.005; // How fast buildings breathe (higher = faster) |
|
|
|
|
|
|
|
|
const buildingAnimationSpeed = 0.003; // How fast buildings breathe |
|
|
|
|
|
|
|
|
function animateBuildings(timestamp) { |
|
|
function animateBuildings(timestamp) { |
|
|
if (!buildingAnimationEnabled) return; |
|
|
if (!buildingAnimationEnabled) return; |
|
|
|
|
|
|
|
|
// Create 8 different phase offsets for pseudo-random effect |
|
|
|
|
|
// Buildings are grouped by their height mod 8, each group has different phase |
|
|
|
|
|
// Range: 100% to 150% (1.0 to 1.5) |
|
|
|
|
|
const phases = []; |
|
|
|
|
|
for (let i = 0; i < 8; i++) { |
|
|
|
|
|
const phaseOffset = (i / 8) * Math.PI * 2; // Evenly distributed phases |
|
|
|
|
|
|
|
|
// Single multiplier for all buildings: 100% to 150% |
|
|
// (sin + 1) gives 0 to 2, multiply by 0.25 gives 0 to 0.5, add 1 gives 1.0 to 1.5 |
|
|
// (sin + 1) gives 0 to 2, multiply by 0.25 gives 0 to 0.5, add 1 gives 1.0 to 1.5 |
|
|
phases[i] = 1 + (Math.sin(timestamp * buildingAnimationSpeed + phaseOffset) + 1) * 0.25; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const multiplier = 1 + (Math.sin(timestamp * buildingAnimationSpeed) + 1) * 0.25; |
|
|
|
|
|
|
|
|
// Update building height with per-building variation based on render_height |
|
|
|
|
|
|
|
|
// Update building height |
|
|
if (map.getLayer('buildings-3d')) { |
|
|
if (map.getLayer('buildings-3d')) { |
|
|
map.setPaintProperty('buildings-3d', 'fill-extrusion-height', [ |
|
|
map.setPaintProperty('buildings-3d', 'fill-extrusion-height', [ |
|
|
'*', |
|
|
'*', |
|
|
['get', 'render_height'], |
|
|
['get', 'render_height'], |
|
|
['case', |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 1], phases[0], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 2], phases[1], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 3], phases[2], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 4], phases[3], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 5], phases[4], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 6], phases[5], |
|
|
|
|
|
['<', ['%', ['to-number', ['get', 'render_height'], 10], 8], 7], phases[6], |
|
|
|
|
|
phases[7] |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
multiplier |
|
|
]); |
|
|
]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|