Use correct viewport and clear correctly

This commit is contained in:
Manish Goregaokar 2018-03-09 10:03:32 -08:00
parent 148e77d995
commit 3af3635eea
6 changed files with 46 additions and 17 deletions

View File

@ -376,6 +376,7 @@ class ThreeDRenderer extends Renderer {
camera: PerspectiveCamera;
needsStencil: boolean = false;
rightEye: boolean = false;
get isMulticolor(): boolean {
return false;
@ -386,8 +387,12 @@ class ThreeDRenderer extends Renderer {
}
get destAllocatedSize(): glmatrix.vec2 {
let width = this.renderContext.canvas.width;
if (this.inVR) {
width = width / 2;
}
return glmatrix.vec2.clone([
this.renderContext.canvas.width,
width,
this.renderContext.canvas.height,
]);
}
@ -484,14 +489,27 @@ class ThreeDRenderer extends Renderer {
}
redrawVR(frame: VRFrameData): void {
this.clearDestFramebuffer(true);
this.vrProjectionMatrix = frame.leftProjectionMatrix;
this.rightEye = false;
this.camera.setView(F32ArrayToMat4(frame.leftViewMatrix), frame.pose);
this.redraw();
this.rightEye = true;
this.vrProjectionMatrix = frame.rightProjectionMatrix;
this.camera.setView(F32ArrayToMat4(frame.rightViewMatrix), frame.pose);
this.redraw();
}
setDrawViewport() {
let offset = 0;
if (this.rightEye) {
offset = this.destAllocatedSize[0];
}
const renderContext = this.renderContext;
const gl = renderContext.gl;
gl.viewport(offset, 0, this.destAllocatedSize[0], this.destAllocatedSize[1]);
}
pathTransformsForObject(objectIndex: number): PathTransformBuffers<Float32Array> {
const meshDescriptor = this.renderContext.appController.meshDescriptors[objectIndex];
const pathCount = this.pathCountForObject(objectIndex);
@ -546,17 +564,20 @@ class ThreeDRenderer extends Renderer {
throw new PathfinderError("Unsupported antialiasing type!");
}
protected clearDestFramebuffer(): void {
protected clearDestFramebuffer(force: boolean): void {
const gl = this.renderContext.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, this.destFramebuffer);
gl.viewport(0, 0, this.destAllocatedSize[0], this.destAllocatedSize[1]);
// clear the entire viewport
gl.viewport(0, 0, this.renderContext.canvas.width, this.renderContext.canvas.height);
gl.clearColor(1.0, 1.0, 1.0, 1.0);
gl.clearDepth(1.0);
gl.depthMask(true);
if (force || this.vrProjectionMatrix == null) {
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
}
}
protected getModelviewTransform(objectIndex: number): glmatrix.mat4 {
const textFrameIndex = this.renderContext

View File

@ -136,7 +136,7 @@ export class NoAAStrategy extends AntialiasingStrategy {
const renderContext = renderer.renderContext;
const gl = renderContext.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, renderer.destFramebuffer);
gl.viewport(0, 0, this.framebufferSize[0], this.framebufferSize[1]);
renderer.setDrawViewport();
gl.disable(gl.SCISSOR_TEST);
}
@ -147,7 +147,7 @@ export class NoAAStrategy extends AntialiasingStrategy {
const gl = renderContext.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, renderer.destFramebuffer);
gl.viewport(0, 0, this.framebufferSize[0], this.framebufferSize[1]);
renderer.setDrawViewport();
gl.disable(gl.SCISSOR_TEST);
}

View File

@ -48,6 +48,8 @@ export abstract class Renderer {
lastTimings: Timings;
inVR: boolean = false;
get emboldenAmount(): glmatrix.vec2 {
return glmatrix.vec2.create();
}
@ -141,13 +143,19 @@ export abstract class Renderer {
this.redraw();
}
setDrawViewport() {
const renderContext = this.renderContext;
const gl = renderContext.gl;
gl.viewport(0, 0, this.destAllocatedSize[0], this.destAllocatedSize[1]);
}
redraw(): void {
const renderContext = this.renderContext;
if (this.meshBuffers == null)
return;
this.clearDestFramebuffer();
this.clearDestFramebuffer(false);
// Start timing rendering.
if (this.timerQueryPollInterval == null &&
@ -426,7 +434,7 @@ export abstract class Renderer {
protected drawSceneryIfNecessary(): void {}
protected clearDestFramebuffer(): void {
protected clearDestFramebuffer(force: boolean): void {
const renderContext = this.renderContext;
const gl = renderContext.gl;

View File

@ -127,7 +127,7 @@ export default class SSAAStrategy extends AntialiasingStrategy {
const gl = renderContext.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, renderer.destFramebuffer);
gl.viewport(0, 0, renderer.destAllocatedSize[0], renderer.destAllocatedSize[1]);
renderer.setDrawViewport();
gl.disable(gl.DEPTH_TEST);
gl.disable(gl.BLEND);

View File

@ -178,7 +178,6 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
private vrDisplay: VRDisplay | null;
private vrFrameData: VRFrameData | null;
private inVRRAF: boolean;
private inVR: boolean;
/// NB: All subclasses are responsible for creating a renderer in their constructors.
constructor(areaLUT: HTMLImageElement,
@ -202,7 +201,6 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
this.inVRRAF = false;
this.inVR = false;
this.vrDisplay = null;
if ("VRFrameData" in window) {
this.vrFrameData = new VRFrameData;
@ -234,14 +232,14 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
}
window.addEventListener('vrdisplaypresentchange', () => {
if (this.vrDisplay == null)
return;
if (this.vrDisplay.isPresenting) {
const that = this;
this.resized();
function vrCallback(): void {
if (that.vrDisplay == null || !that.inVR) {
if (that.vrDisplay == null || !that.renderer.inVR) {
return;
}
that.vrDisplay.requestAnimationFrame(vrCallback);
@ -251,7 +249,8 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
}
this.vrDisplay.requestAnimationFrame(vrCallback);
} else {
this.inVR = false;
this.renderer.inVR = false;
this.resized();
}
});
}
@ -307,7 +306,7 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
enterVR(): void {
if (this.vrDisplay != null) {
this.inVR = true;
this.renderer.inVR = true;
this.vrDisplay.requestPresent([{ source: this.canvas }]);
}
}
@ -318,7 +317,8 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
if (!this.renderer.meshesAttached)
return;
if (!this.inVR || this.vrDisplay == null || this.vrFrameData == null) {
if (!this.renderer.inVR || this.vrDisplay == null ||
this.vrFrameData == null) {
this.renderer.redraw();
} else {
if (!this.inVRRAF) {

View File

@ -294,7 +294,7 @@ export abstract class XCAAStrategy extends AntialiasingStrategy {
const gl = renderContext.gl;
gl.bindFramebuffer(gl.FRAMEBUFFER, renderer.destFramebuffer);
gl.viewport(0, 0, this.destFramebufferSize[0], this.destFramebufferSize[1]);
renderer.setDrawViewport();
gl.disable(gl.SCISSOR_TEST);
}