|
@@ -1,6 +1,12 @@
|
|
var BABYLON = BABYLON || {};
|
|
var BABYLON = BABYLON || {};
|
|
|
|
|
|
(function () {
|
|
(function () {
|
|
|
|
+ BABYLON.TextureSamplingModes = {
|
|
|
|
+ NEAREST : 1,
|
|
|
|
+ BILINEAR: 2,
|
|
|
|
+ TRILINEAR: 3,
|
|
|
|
+ DEFAULT : 3
|
|
|
|
+ };
|
|
BABYLON.Engine = function (canvas, antialias) {
|
|
BABYLON.Engine = function (canvas, antialias) {
|
|
this._renderingCanvas = canvas;
|
|
this._renderingCanvas = canvas;
|
|
|
|
|
|
@@ -707,31 +713,66 @@
|
|
texture.isReady = true;
|
|
texture.isReady = true;
|
|
};
|
|
};
|
|
|
|
|
|
- BABYLON.Engine.prototype.createRenderTargetTexture = function (size, generateMipMaps) {
|
|
|
|
|
|
+ BABYLON.Engine.prototype.createRenderTargetTexture = function (size, options) {
|
|
|
|
+ // old version had a "generateMipMaps" arg instead of options.
|
|
|
|
+ // if options.generateMipMaps is undefined, consider that options itself if the generateMipmaps value
|
|
|
|
+ // in the same way, generateDepthBuffer is defaulted to true
|
|
|
|
+ var generateMipMaps = false;
|
|
|
|
+ var generateDepthBuffer = true;
|
|
|
|
+ var samplingMode = BABYLON.TextureSamplingModes.DEFAULT;
|
|
|
|
+ if (options !== undefined) {
|
|
|
|
+ generateMipMaps = options.generateMipMaps === undefined ? options : options.generateMipmaps;
|
|
|
|
+ generateDepthBuffer = options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;
|
|
|
|
+ if (options.samplingMode !== undefined) {
|
|
|
|
+ samplingMode = options.samplingMode;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
var gl = this._gl;
|
|
var gl = this._gl;
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
var texture = gl.createTexture();
|
|
var texture = gl.createTexture();
|
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
|
|
|
|
var width = size.width || size;
|
|
var width = size.width || size;
|
|
var height = size.height || size;
|
|
var height = size.height || size;
|
|
-
|
|
|
|
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
|
|
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, generateMipMaps ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR);
|
|
|
|
|
|
+ var magFilter = gl.NEAREST;
|
|
|
|
+ var minFilter = gl.NEAREST;
|
|
|
|
+ if (samplingMode === BABYLON.TextureSamplingModes.BILINEAR) {
|
|
|
|
+ magFilter = gl.LINEAR;
|
|
|
|
+ if (generateMipMaps) {
|
|
|
|
+ minFilter = gl.LINEAR_MIPMAP_NEAREST;
|
|
|
|
+ } else {
|
|
|
|
+ minFilter = gl.LINEAR;
|
|
|
|
+ }
|
|
|
|
+ } else if (samplingMode === BABYLON.TextureSamplingModes.TRILINEAR) {
|
|
|
|
+ magFilter = gl.LINEAR;
|
|
|
|
+ if (generateMipMaps) {
|
|
|
|
+ minFilter = gl.LINEAR_MIPMAP_LINEAR;
|
|
|
|
+ } else {
|
|
|
|
+ minFilter = gl.LINEAR;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
|
|
|
|
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
|
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
|
|
|
|
|
|
+ var depthBuffer;
|
|
// Create the depth buffer
|
|
// Create the depth buffer
|
|
- var depthBuffer = gl.createRenderbuffer();
|
|
|
|
- gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
|
|
|
|
- gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
|
|
|
|
-
|
|
|
|
|
|
+ if (generateDepthBuffer) {
|
|
|
|
+ depthBuffer = gl.createRenderbuffer();
|
|
|
|
+ gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
|
|
|
|
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
|
|
|
|
+ }
|
|
// Create the framebuffer
|
|
// Create the framebuffer
|
|
var framebuffer = gl.createFramebuffer();
|
|
var framebuffer = gl.createFramebuffer();
|
|
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
- gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuffer);
|
|
|
|
|
|
+ if (generateDepthBuffer) {
|
|
|
|
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuffer);
|
|
|
|
+ }
|
|
|
|
|
|
// Unbind
|
|
// Unbind
|
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
@@ -739,7 +780,9 @@
|
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
|
|
|
|
texture._framebuffer = framebuffer;
|
|
texture._framebuffer = framebuffer;
|
|
- texture._depthBuffer = depthBuffer;
|
|
|
|
|
|
+ if (generateDepthBuffer) {
|
|
|
|
+ texture._depthBuffer = depthBuffer;
|
|
|
|
+ }
|
|
texture._width = width;
|
|
texture._width = width;
|
|
texture._height = height;
|
|
texture._height = height;
|
|
texture.isReady = true;
|
|
texture.isReady = true;
|
|
@@ -845,6 +888,11 @@
|
|
this._gl.bindTexture(this._gl.TEXTURE_CUBE_MAP, null);
|
|
this._gl.bindTexture(this._gl.TEXTURE_CUBE_MAP, null);
|
|
this._activeTexturesCache[channel] = null;
|
|
this._activeTexturesCache[channel] = null;
|
|
}
|
|
}
|
|
|
|
+ // hmm vilain leak !
|
|
|
|
+ var index = this._loadedTexturesCache.indexOf(texture);
|
|
|
|
+ if (index !== -1) {
|
|
|
|
+ this._loadedTexturesCache.splice(index, 1);
|
|
|
|
+ }
|
|
};
|
|
};
|
|
|
|
|
|
BABYLON.Engine.prototype.bindSamplers = function (effect) {
|
|
BABYLON.Engine.prototype.bindSamplers = function (effect) {
|