103 lines
2.4 KiB
JavaScript
Executable File
103 lines
2.4 KiB
JavaScript
Executable File
|
|
class Renderer {
|
|
|
|
constructor(options) {
|
|
|
|
this.canvas = (options && options.canvas) || document.createElement('canvas');
|
|
|
|
this.canvas.style.transformOrigin = '0 0';
|
|
|
|
this.contextAttributes = Object.assign({},{
|
|
alpha: false,
|
|
depth: true,
|
|
stencil: true,
|
|
antialias: false,
|
|
premultipliedAlpha: true,
|
|
preserveDrawingBuffer: false,
|
|
failIfMajorPerformanceCaveat: false,
|
|
}, (options || {}) );
|
|
|
|
this._pixelRatio = 1;
|
|
|
|
this.gl = this.canvas.getContext("experimental-webgl", this.contextAttributes);
|
|
|
|
this.handleContextLost = this.handleContextLost.bind(this);
|
|
this.handleContextRestored = this.handleContextRestored.bind(this);
|
|
this.canvas.addEventListener('webglcontextlost', this.handleContextLost, false);
|
|
this.canvas.addEventListener('webglcontextrestored', this.handleContextRestored, false);
|
|
|
|
}
|
|
|
|
handleContextLost(event){
|
|
event.preventDefault();
|
|
}
|
|
|
|
handleContextRestored(){
|
|
|
|
}
|
|
|
|
handleContextRestored() {
|
|
|
|
}
|
|
|
|
render(container, camera, frameBuffer, preventCameraUpdate) {
|
|
|
|
if (!this.gl) {
|
|
return;
|
|
}
|
|
|
|
if (!preventCameraUpdate) {
|
|
camera.update();
|
|
}
|
|
|
|
if (frameBuffer){
|
|
frameBuffer.bindFrame();
|
|
container.render( camera );
|
|
frameBuffer.unbind();
|
|
}
|
|
else{
|
|
this.gl.viewport(0, 0, this._width* this._pixelRatio , this._height* this._pixelRatio );
|
|
container.render( camera );
|
|
}
|
|
|
|
}
|
|
|
|
resize(width, height) {
|
|
if (!this.gl) {
|
|
return;
|
|
}
|
|
this._width = width;
|
|
this._height = height;
|
|
this.canvas.width = this._width * this._pixelRatio;
|
|
this.canvas.height = this._height * this._pixelRatio;
|
|
this.canvas.style.transform = 'scale('+(1/this._pixelRatio)+') translateZ(0)';
|
|
this.gl.viewport(0, 0, this._width* this._pixelRatio , this._height* this._pixelRatio );
|
|
}
|
|
|
|
clearColor(r, g, b, alpha) {
|
|
if (!this.gl) {
|
|
return;
|
|
}
|
|
this.gl.clearColor(r, g, b, alpha);
|
|
}
|
|
|
|
clear(color, depth, stencil) {
|
|
if (!this.gl) {
|
|
return;
|
|
}
|
|
var bits = 0;
|
|
if ( color === void 0 || color ) bits |= this.gl.COLOR_BUFFER_BIT;
|
|
if ( depth === void 0 || depth ) bits |= this.gl.DEPTH_BUFFER_BIT;
|
|
if ( stencil === void 0 || stencil ) bits |= this.gl.STENCIL_BUFFER_BIT;
|
|
this.gl.clear( bits );
|
|
}
|
|
|
|
setPixelRatio(ratio) {
|
|
this._pixelRatio = ratio;
|
|
this.resize(this._width, this._height);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
export default Renderer; |