MBHaxe/src/shaders/CubemapRenderer.hx
2022-12-10 00:16:56 +05:30

72 lines
1.7 KiB
Haxe

package shaders;
import src.Sky;
import h3d.Vector;
import h3d.scene.Scene;
import h3d.Engine;
import h3d.Camera;
import src.MarbleGame;
import h3d.mat.Texture;
class CubemapRenderer {
public var cubemap:Texture;
public var sky:Sky;
public var position:Vector;
var camera:Camera;
var scene:Scene;
var nextFaceToRender:Int;
public function new(scene:Scene, sky:Sky) {
this.scene = scene;
this.sky = sky;
this.cubemap = new Texture(128, 128, [Cube, Dynamic, Target], h3d.mat.Data.TextureFormat.RGB8);
this.cubemap.depthBuffer = new h3d.mat.DepthBuffer(128, 128, h3d.mat.DepthBuffer.DepthFormat.Depth24);
this.camera = new Camera(90, 1, 1, 0.02, scene.camera.zFar);
this.position = new Vector();
this.nextFaceToRender = 0;
}
public function render(e:Engine, budget:Float = 1e8) {
var scenecam = scene.camera;
scene.camera = camera;
var start = haxe.Timer.stamp();
var renderedFaces = 0;
for (i in 0...6) {
var index = (nextFaceToRender + i) % 6;
e.pushTarget(cubemap, index);
this.camera.setCubeMap(index, position);
e.clear(0, 1);
scene.render(e);
e.popTarget();
renderedFaces++;
var time = haxe.Timer.stamp();
var elapsed = time - start;
var elapsedPerFace = elapsed / renderedFaces;
if (elapsedPerFace * (renderedFaces + 1) >= budget)
break;
}
scene.camera = scenecam;
this.nextFaceToRender += renderedFaces;
this.nextFaceToRender %= 6;
}
public function getCameraFrustums() {
var frustums = [];
var prevFar = this.camera.zFar;
this.camera.zFar = 300; // Max draw distance
for (i in 0...6) {
this.camera.setCubeMap(i, position);
this.camera.update();
frustums.push(camera.frustum.clone());
}
this.camera.zFar = prevFar;
return frustums;
}
}