FrameHistory::getFadeProperties

This commit is contained in:
John Firebaugh
2014-09-05 14:03:33 -07:00
parent 4c0b4a7901
commit de720f3515
3 changed files with 51 additions and 37 deletions

View File

@@ -16,12 +16,20 @@ struct FrameSnapshot {
float z;
};
struct FadeProperties {
float fadedist;
float minfadezoom;
float maxfadezoom;
float bump;
};
class FrameHistory {
public:
// Record frame history that will be used to calculate fading params
void record(timestamp now, float zoom);
bool needsAnimation(timestamp duration) const;
FadeProperties getFadeProperties(timestamp duration);
public:
std::deque<FrameSnapshot> history;

View File

@@ -45,4 +45,41 @@ bool FrameHistory::needsAnimation(const timestamp duration) const {
}
return false;
}
}
FadeProperties FrameHistory::getFadeProperties(timestamp duration)
{
const timestamp currentTime = util::now();
// Remove frames until only one is outside the duration, or until there are only three
while (history.size() > 3 && history[1].t + duration < currentTime) {
history.pop_front();
}
if (history[1].t + duration < currentTime) {
history[0].z = history[1].z;
}
// Find the range of zoom levels we want to fade between
float startingZ = history.front().z;
const FrameSnapshot lastFrame = history.back();
float endingZ = lastFrame.z;
float lowZ = std::fmin(startingZ, endingZ);
float highZ = std::fmax(startingZ, endingZ);
// Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one
// duration
float zoomDiff = endingZ - history[1].z, timeDiff = lastFrame.t - history[1].t;
float fadedist = zoomDiff / (timeDiff / duration);
// At end of a zoom when the zoom stops changing continue pretending to zoom at that speed
// bump is how much farther it would have been if it had continued zooming at the same rate
float bump = (currentTime - lastFrame.t) / duration * fadedist;
return FadeProperties {
fadedist,
lowZ,
highZ,
bump
};
}

View File

@@ -63,42 +63,11 @@ void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr<StyleLayer> lay
sdfShader->u_flip = (bucket.properties.placement == PlacementType::Line ? 1 : 0);
sdfShader->u_zoom = (map.getState().getNormalizedZoom() - zoomAdjust) * 10; // current zoom level
// Label fading
const timestamp duration = 300_milliseconds;
const timestamp currentTime = util::now();
std::deque<FrameSnapshot> &history = frameHistory.history;
if (history.size() >= 2) {
// Remove frames until only one is outside the duration, or until there are only three
while (history.size() > 3 && history[1].t + duration < currentTime) {
history.pop_front();
}
if (history[1].t + duration < currentTime) {
history[0].z = history[1].z;
}
// Find the range of zoom levels we want to fade between
float startingZ = history.front().z;
const FrameSnapshot lastFrame = history.back();
float endingZ = lastFrame.z;
float lowZ = std::fmin(startingZ, endingZ);
float highZ = std::fmax(startingZ, endingZ);
// Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one
// duration
float zoomDiff = endingZ - history[1].z, timeDiff = lastFrame.t - history[1].t;
float fadedist = zoomDiff / (timeDiff / duration);
// At end of a zoom when the zoom stops changing continue pretending to zoom at that speed
// bump is how much farther it would have been if it had continued zooming at the same rate
float bump = (currentTime - lastFrame.t) / duration * fadedist;
sdfShader->u_fadedist = fadedist * 10;
sdfShader->u_minfadezoom = std::floor(lowZ * 10);
sdfShader->u_maxfadezoom = std::floor(highZ * 10);
sdfShader->u_fadezoom = (map.getState().getNormalizedZoom() + bump) * 10;
}
FadeProperties f = frameHistory.getFadeProperties(300_milliseconds);
sdfShader->u_fadedist = f.fadedist * 10;
sdfShader->u_minfadezoom = std::floor(f.minfadezoom * 10);
sdfShader->u_maxfadezoom = std::floor(f.maxfadezoom * 10);
sdfShader->u_fadezoom = (map.getState().getNormalizedZoom() + f.bump) * 10;
// This defines the gamma around the SDF cutoff value.
const float sdfGamma = 1.0f / 10.0f;