armory/Sources/armory/renderpath/DynamicResolutionScale.hx

52 lines
1.4 KiB
Haxe
Raw Normal View History

2016-10-19 17:46:13 +02:00
package armory.renderpath;
2017-11-22 21:17:36 +01:00
import iron.RenderPath;
2016-10-19 17:46:13 +02:00
class DynamicResolutionScale {
public static var dynamicScale = 1.0;
static var firstFrame = true;
static inline var startScaleMs = 30;
static inline var scaleRangeMs = 10;
static inline var maxScale = 0.6;
2019-12-19 23:54:08 +01:00
public static function run(path: RenderPath) {
2016-10-19 17:46:13 +02:00
if (firstFrame) {
2017-11-20 13:38:19 +01:00
iron.App.notifyOnRender(render);
2016-10-19 17:46:13 +02:00
firstFrame = false;
return;
}
// TODO: execute once per frame max
if (frameTimeAvg > startScaleMs && frameTimeAvg < 100) {
var overTime = Math.min(scaleRangeMs, frameTimeAvg - startScaleMs);
var scale = 1.0 - (overTime / scaleRangeMs) * (1.0 - maxScale);
2017-11-20 13:38:19 +01:00
var w = Std.int(iron.App.w() * scale);
var h = Std.int(iron.App.h() * scale);
2016-10-19 17:46:13 +02:00
path.setCurrentViewport(w, h);
path.setCurrentScissor(w, h);
dynamicScale = scale;
}
else dynamicScale = 1.0;
}
2019-12-19 23:54:08 +01:00
static var frameTime: Float;
static var lastTime: Float = 0;
static var totalTime: Float = 0;
2016-10-19 17:46:13 +02:00
static var frames = 0;
static var frameTimeAvg = 0.0;
2019-12-19 23:54:08 +01:00
public static function render(g: kha.graphics4.Graphics) {
2016-10-19 17:46:13 +02:00
frameTime = kha.Scheduler.realTime() - lastTime;
lastTime = kha.Scheduler.realTime();
totalTime += frameTime;
frames++;
if (totalTime >= 1) {
frameTimeAvg = Std.int(totalTime / frames * 10000) / 10;
totalTime = 0;
frames = 0;
}
}
}