mirror of
https://github.com/photonstorm/phaser
synced 2025-02-16 14:08:28 +00:00
Added manager, target auto clear, clearTarget and lots of new hooks for handlers, plus post bind and post flush support.
This commit is contained in:
parent
f94e7b4f75
commit
4287181b2b
1 changed files with 260 additions and 127 deletions
|
@ -81,6 +81,18 @@ var WebGLPipeline = new Class({
|
||||||
*/
|
*/
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reference to the WebGL Pipeline Manager.
|
||||||
|
*
|
||||||
|
* This is initially undefined and only set when this pipeline is added
|
||||||
|
* to the manager.
|
||||||
|
*
|
||||||
|
* @name Phaser.Renderer.WebGL.WebGLPipeline#manager
|
||||||
|
* @type {?Phaser.Renderer.WebGL.PipelineManager}
|
||||||
|
* @since 3.50.0
|
||||||
|
*/
|
||||||
|
this.manager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The WebGL context this WebGL Pipeline uses.
|
* The WebGL context this WebGL Pipeline uses.
|
||||||
*
|
*
|
||||||
|
@ -275,6 +287,19 @@ var WebGLPipeline = new Class({
|
||||||
*/
|
*/
|
||||||
this.targetScale = GetFastValue(config, 'targetScale', 1);
|
this.targetScale = GetFastValue(config, 'targetScale', 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When using a targetTexture this controls if the target is
|
||||||
|
* automatically cleared (via `gl.COLOR_BUFFER_BIT`) during the `postBind` method.
|
||||||
|
*
|
||||||
|
* If you need more control how, or if, the target is cleared, you can disable
|
||||||
|
* this via the config, or even directly at runtime.
|
||||||
|
*
|
||||||
|
* @name Phaser.GameObjects.Shader#targetAutoClear
|
||||||
|
* @type {boolean}
|
||||||
|
* @since 3.50.0
|
||||||
|
*/
|
||||||
|
this.targetAutoClear = GetFastValue(config, 'targetAutoClear', true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An array of all the WebGLShader instances that belong to this pipeline.
|
* An array of all the WebGLShader instances that belong to this pipeline.
|
||||||
*
|
*
|
||||||
|
@ -350,8 +375,6 @@ var WebGLPipeline = new Class({
|
||||||
{
|
{
|
||||||
this.targetTexture = renderer.createTextureFromSource(null, width, height, 0);
|
this.targetTexture = renderer.createTextureFromSource(null, width, height, 0);
|
||||||
this.targetFramebuffer = renderer.createFramebuffer(width, height, this.targetTexture, false);
|
this.targetFramebuffer = renderer.createFramebuffer(width, height, this.targetTexture, false);
|
||||||
|
|
||||||
// this.targetTexture.flipY = flipY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setShadersFromConfig(config);
|
this.setShadersFromConfig(config);
|
||||||
|
@ -412,6 +435,24 @@ var WebGLPipeline = new Class({
|
||||||
this.onBoot();
|
this.onBoot();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
clearTarget: function ()
|
||||||
|
{
|
||||||
|
var gl = this.gl;
|
||||||
|
var renderer = this.renderer;
|
||||||
|
var target = this.targetTexture;
|
||||||
|
|
||||||
|
if (target)
|
||||||
|
{
|
||||||
|
renderer.setFramebuffer(this.targetFramebuffer);
|
||||||
|
|
||||||
|
gl.clearColor(0, 0, 0, 0);
|
||||||
|
|
||||||
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
renderer.setFramebuffer(null, false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called once when this pipeline has finished being set-up
|
* This method is called once when this pipeline has finished being set-up
|
||||||
* at the end of the boot process. By the time this method is called, all
|
* at the end of the boot process. By the time this method is called, all
|
||||||
|
@ -664,8 +705,6 @@ var WebGLPipeline = new Class({
|
||||||
|
|
||||||
this.targetTexture = renderer.createTextureFromSource(null, width, height, 0);
|
this.targetTexture = renderer.createTextureFromSource(null, width, height, 0);
|
||||||
this.targetFramebuffer = renderer.createFramebuffer(width, height, this.targetTexture, false);
|
this.targetFramebuffer = renderer.createFramebuffer(width, height, this.targetTexture, false);
|
||||||
|
|
||||||
// this.targetTexture.flipY = flipY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var shaders = this.shaders;
|
var shaders = this.shaders;
|
||||||
|
@ -698,11 +737,6 @@ var WebGLPipeline = new Class({
|
||||||
*/
|
*/
|
||||||
bind: function ()
|
bind: function ()
|
||||||
{
|
{
|
||||||
if (this.targetTexture)
|
|
||||||
{
|
|
||||||
this.renderer.setFramebuffer(this.targetFramebuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
var wasBound = this.renderer.setVertexBuffer(this.vertexBuffer);
|
var wasBound = this.renderer.setVertexBuffer(this.vertexBuffer);
|
||||||
|
|
||||||
this.currentShader.bind(wasBound);
|
this.currentShader.bind(wasBound);
|
||||||
|
@ -710,6 +744,40 @@ var WebGLPipeline = new Class({
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#postBind
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
||||||
|
*
|
||||||
|
* @return {this} This WebGLPipeline instance.
|
||||||
|
*/
|
||||||
|
postBind: function (gameObject)
|
||||||
|
{
|
||||||
|
var renderer = this.renderer;
|
||||||
|
var target = this.targetTexture;
|
||||||
|
|
||||||
|
if (target)
|
||||||
|
{
|
||||||
|
renderer.setFramebuffer(this.targetFramebuffer);
|
||||||
|
|
||||||
|
if (this.targetAutoClear)
|
||||||
|
{
|
||||||
|
var gl = this.gl;
|
||||||
|
|
||||||
|
gl.clearColor(0, 0, 0, 0);
|
||||||
|
|
||||||
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onPostBind(gameObject);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called every time the Pipeline Manager deactivates this pipeline, swapping from
|
* This method is called every time the Pipeline Manager deactivates this pipeline, swapping from
|
||||||
* it to another one. This happens after a call to `flush` and before the new pipeline is bound.
|
* it to another one. This happens after a call to `flush` and before the new pipeline is bound.
|
||||||
|
@ -725,134 +793,25 @@ var WebGLPipeline = new Class({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called every time a **Game Object** asks the Pipeline Manager to use this pipeline.
|
|
||||||
*
|
|
||||||
* Unlike the `bind` method, which is only called once per frame, this is called for every object
|
|
||||||
* that requests use of this pipeline, allowing you to perform per-object set-up, such as loading
|
|
||||||
* shader uniform data.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onBind
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onBind: function ()
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called once per frame, right before anything has been rendered, but after the canvas
|
|
||||||
* has been cleared. If this pipeline has a targetTexture, it will be cleared.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPreRender
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onPreRender: function ()
|
|
||||||
{
|
|
||||||
var gl = this.gl;
|
|
||||||
var renderer = this.renderer;
|
|
||||||
var target = this.targetTexture;
|
|
||||||
|
|
||||||
if (target)
|
|
||||||
{
|
|
||||||
renderer.setFramebuffer(this.targetFramebuffer);
|
|
||||||
|
|
||||||
gl.clearColor(0, 0, 0, 0);
|
|
||||||
|
|
||||||
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
renderer.setFramebuffer(null, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called once per frame, for every Camera in a Scene that wants to render.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onRender
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @param {Phaser.Scene} scene - The Scene being rendered.
|
|
||||||
* @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera being rendered with.
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onRender: function ()
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called once per frame, after all rendering has happened and snapshots have been taken.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPostRender
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onPostRender: function ()
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called every time this pipeline is asked to flush its batch.
|
|
||||||
*
|
|
||||||
* It is called immediately before the gl.bufferData and gl.drawArray calls are made, so you can
|
|
||||||
* perform any final pre-render modifications. To apply changes post-render, see `onPostFlush`.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onFlush
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onFlush: function ()
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called immediately after this pipeline has finished flushing its batch.
|
|
||||||
*
|
|
||||||
* It is called after the `gl.drawArray` call.
|
|
||||||
*
|
|
||||||
* You can perform additional post-render effects, but be careful not to call `flush`
|
|
||||||
* on this pipeline from within this method, or you'll cause an infinite loop.
|
|
||||||
*
|
|
||||||
* To apply changes pre-render, see `onFlush`.
|
|
||||||
*
|
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPostFlush
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @return {this} This WebGLPipeline instance.
|
|
||||||
*/
|
|
||||||
onPostFlush: function ()
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uploads the vertex data and emits a draw call for the current batch of vertices.
|
* Uploads the vertex data and emits a draw call for the current batch of vertices.
|
||||||
*
|
*
|
||||||
* @method Phaser.Renderer.WebGL.WebGLPipeline#flush
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#flush
|
||||||
* @since 3.0.0
|
* @since 3.0.0
|
||||||
*
|
*
|
||||||
|
* @param {boolean} [isPostFlush=false] - Was this flush invoked as part of a post-process, or not?
|
||||||
|
*
|
||||||
* @return {this} This WebGLPipeline instance.
|
* @return {this} This WebGLPipeline instance.
|
||||||
*/
|
*/
|
||||||
flush: function ()
|
flush: function (isPostFlush)
|
||||||
{
|
{
|
||||||
|
if (isPostFlush === undefined) { isPostFlush = false; }
|
||||||
|
|
||||||
var vertexCount = this.vertexCount;
|
var vertexCount = this.vertexCount;
|
||||||
|
|
||||||
if (vertexCount > 0)
|
if (vertexCount > 0)
|
||||||
{
|
{
|
||||||
this.onFlush();
|
this.onBeforeFlush(isPostFlush);
|
||||||
|
|
||||||
var gl = this.gl;
|
var gl = this.gl;
|
||||||
var vertexSize = this.currentShader.vertexSize;
|
var vertexSize = this.currentShader.vertexSize;
|
||||||
|
@ -870,12 +829,173 @@ var WebGLPipeline = new Class({
|
||||||
|
|
||||||
this.vertexCount = 0;
|
this.vertexCount = 0;
|
||||||
|
|
||||||
this.onPostFlush();
|
this.onAfterFlush(isPostFlush);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#postFlush
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
||||||
|
*
|
||||||
|
* @return {this} This WebGLPipeline instance.
|
||||||
|
*/
|
||||||
|
postFlush: function (gameObject)
|
||||||
|
{
|
||||||
|
this.renderer.setFramebuffer(null);
|
||||||
|
this.renderer.resetTextures();
|
||||||
|
|
||||||
|
var wasBound = this.renderer.setVertexBuffer(this.vertexBuffer);
|
||||||
|
|
||||||
|
this.currentShader.bind(wasBound);
|
||||||
|
|
||||||
|
var texture = this.targetTexture;
|
||||||
|
var width = texture.width;
|
||||||
|
var height = texture.height;
|
||||||
|
|
||||||
|
this.drawFillRect(0, 0, width, height, 0x0, 0.5, texture, true);
|
||||||
|
|
||||||
|
this.flush(true);
|
||||||
|
|
||||||
|
this.onPostFlush(gameObject);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called every time a **Game Object** asks the Pipeline Manager to use this pipeline.
|
||||||
|
*
|
||||||
|
* Unlike the `bind` method, which is only called once per frame, this is called for every object
|
||||||
|
* that requests use of this pipeline, allowing you to perform per-object set-up, such as loading
|
||||||
|
* shader uniform data.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onBind
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
||||||
|
*/
|
||||||
|
onBind: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called every time a **Game Object** asks the Pipeline Manager to use this pipeline
|
||||||
|
* as the post-render pipeline.
|
||||||
|
*
|
||||||
|
* Unlike the `bind` method, which is only called once per frame, this is called for every object
|
||||||
|
* that requests use of this pipeline, allowing you to perform per-object set-up, such as loading
|
||||||
|
* shader uniform data.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPostBind
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
||||||
|
*/
|
||||||
|
onPostBind: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* TODO
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPostFlush
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
|
||||||
|
*/
|
||||||
|
onPostFlush: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called once per frame, right before anything has been rendered, but after the canvas
|
||||||
|
* has been cleared. If this pipeline has a targetTexture, it will be cleared.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPreRender
|
||||||
|
* @since 3.50.0
|
||||||
|
*/
|
||||||
|
onPreRender: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called once per frame, for every Camera in a Scene that wants to render.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onRender
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {Phaser.Scene} scene - The Scene being rendered.
|
||||||
|
* @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera being rendered with.
|
||||||
|
*/
|
||||||
|
onRender: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called once per frame, after all rendering has happened and snapshots have been taken.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onPostRender
|
||||||
|
* @since 3.50.0
|
||||||
|
*/
|
||||||
|
onPostRender: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called every time this pipeline is asked to flush its batch.
|
||||||
|
*
|
||||||
|
* It is called immediately before the gl.bufferData and gl.drawArray calls are made, so you can
|
||||||
|
* perform any final pre-render modifications. To apply changes post-render, see `onPostFlush`.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onBeforeFlush
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {boolean} [isPostFlush=false] - Was this flush invoked as part of a post-process, or not?
|
||||||
|
*/
|
||||||
|
onBeforeFlush: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default this is an empty method hook that you can override and use in your own custom pipelines.
|
||||||
|
*
|
||||||
|
* This method is called immediately after this pipeline has finished flushing its batch.
|
||||||
|
*
|
||||||
|
* It is called after the `gl.drawArrays` call.
|
||||||
|
*
|
||||||
|
* You can perform additional post-render effects, but be careful not to call `flush`
|
||||||
|
* on this pipeline from within this method, or you'll cause an infinite loop.
|
||||||
|
*
|
||||||
|
* To apply changes pre-render, see `onBeforeFlush`.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLPipeline#onAfterFlush
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {boolean} [isPostFlush=false] - Was this flush invoked as part of a post-process, or not?
|
||||||
|
*/
|
||||||
|
onAfterFlush: function ()
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a single vertex to the current vertex buffer and increments the
|
* Adds a single vertex to the current vertex buffer and increments the
|
||||||
* `vertexCount` property by 1.
|
* `vertexCount` property by 1.
|
||||||
|
@ -1059,10 +1179,12 @@ var WebGLPipeline = new Class({
|
||||||
* @param {number} color - Color of the rectangle to draw.
|
* @param {number} color - Color of the rectangle to draw.
|
||||||
* @param {number} alpha - Alpha value of the rectangle to draw.
|
* @param {number} alpha - Alpha value of the rectangle to draw.
|
||||||
* @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch if a flush occurs.
|
* @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch if a flush occurs.
|
||||||
|
* @param {boolean} [flipUV=true] - Flip the vertical UV coordinates of the texture before rendering?
|
||||||
*/
|
*/
|
||||||
drawFillRect: function (x, y, width, height, color, alpha, texture)
|
drawFillRect: function (x, y, width, height, color, alpha, texture, flipUV)
|
||||||
{
|
{
|
||||||
if (texture === undefined) { texture = this.renderer.whiteTexture.glTexture; }
|
if (texture === undefined) { texture = this.renderer.whiteTexture.glTexture; }
|
||||||
|
if (flipUV === undefined) { flipUV = true; }
|
||||||
|
|
||||||
x = Math.floor(x);
|
x = Math.floor(x);
|
||||||
y = Math.floor(y);
|
y = Math.floor(y);
|
||||||
|
@ -1074,7 +1196,18 @@ var WebGLPipeline = new Class({
|
||||||
|
|
||||||
var tint = Utils.getTintAppendFloatAlphaAndSwap(color, alpha);
|
var tint = Utils.getTintAppendFloatAlphaAndSwap(color, alpha);
|
||||||
|
|
||||||
this.batchQuad(x, y, x, yh, xw, yh, xw, y, 0, 0, 1, 1, tint, tint, tint, tint, 0, texture, unit);
|
var u0 = 0;
|
||||||
|
var v0 = 0;
|
||||||
|
var u1 = 1;
|
||||||
|
var v1 = 1;
|
||||||
|
|
||||||
|
if (flipUV)
|
||||||
|
{
|
||||||
|
v0 = 1;
|
||||||
|
v1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.batchQuad(x, y, x, yh, xw, yh, xw, y, u0, v0, u1, v1, tint, tint, tint, tint, 0, texture, unit);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue