| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 | 
							- /****************************************************************************
 
-  Copyright (c) 2008-2010 Ricardo Quesada
 
-  Copyright (c) 2011-2012 cocos2d-x.org
 
-  Copyright (c) 2013-2014 Chukong Technologies Inc.
 
-  http://www.cocos2d-x.org
 
-  Permission is hereby granted, free of charge, to any person obtaining a copy
 
-  of this software and associated documentation files (the "Software"), to deal
 
-  in the Software without restriction, including without limitation the rights
 
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
-  copies of the Software, and to permit persons to whom the Software is
 
-  furnished to do so, subject to the following conditions:
 
-  The above copyright notice and this permission notice shall be included in
 
-  all copies or substantial portions of the Software.
 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
-  THE SOFTWARE.
 
-  ****************************************************************************/
 
- /**
 
-  * <p>A class that implements a Texture Atlas. <br />
 
-  * Supported features: <br />
 
-  * The atlas file can be a PNG, JPG. <br />
 
-  * Quads can be updated in runtime <br />
 
-  * Quads can be added in runtime <br />
 
-  * Quads can be removed in runtime <br />
 
-  * Quads can be re-ordered in runtime <br />
 
-  * The TextureAtlas capacity can be increased or decreased in runtime.</p>
 
-  * @class
 
-  * @extends cc.Class
 
-  *
 
-  * @property {Boolean}  dirty           - Indicates whether or not the array buffer of the VBO needs to be updated.
 
-  * @property {Image}    texture         - Image texture for cc.TextureAtlas.
 
-  * @property {Number}   capacity        - <@readonly> Quantity of quads that can be stored with the current texture atlas size.
 
-  * @property {Number}   totalQuads      - <@readonly> Quantity of quads that are going to be drawn.
 
-  * @property {Array}    quads           - <@readonly> Quads that are going to be rendered
 
-  */
 
- cc.TextureAtlas = cc.Class.extend(/** @lends cc.TextureAtlas# */{
 
-     dirty: false,
 
-     texture: null,
 
-     _indices: null,
 
-     //0: vertex  1: indices
 
-     _buffersVBO: null,
 
-     _capacity: 0,
 
-     _quads: null,
 
-     _quadsArrayBuffer: null,
 
-     _quadsWebBuffer: null,
 
-     _quadsReader: null,
 
-     /**
 
-      * <p>Creates a TextureAtlas with an filename and with an initial capacity for Quads. <br />
 
-      * The TextureAtlas capacity can be increased in runtime. </p>
 
-      * Constructor of cc.TextureAtlas
 
-      * @param {String|cc.Texture2D} fileName
 
-      * @param {Number} capacity
 
-      * @example
 
-      * 1.
 
-      * //creates a TextureAtlas with  filename
 
-      * var textureAtlas = new cc.TextureAtlas("res/hello.png", 3);
 
-      * 2.
 
-      * //creates a TextureAtlas with texture
 
-      * var texture = cc.textureCache.addImage("hello.png");
 
-      * var textureAtlas = new cc.TextureAtlas(texture, 3);
 
-      */
 
-     ctor: function (fileName, capacity) {
 
-         this._buffersVBO = [];
 
-         if (typeof(fileName) == "string") {
 
-             this.initWithFile(fileName, capacity);
 
-         }
 
-         else if (fileName instanceof cc.Texture2D) {
 
-             this.initWithTexture(fileName, capacity);
 
-         }
 
-     },
 
-     /**
 
-      * Quantity of quads that are going to be drawn.
 
-      * @return {Number}
 
-      */
 
-     getTotalQuads: function () {
 
-         //return this._quads.length;
 
-         return this._totalQuads;
 
-     },
 
-     /**
 
-      * Quantity of quads that can be stored with the current texture atlas size
 
-      * @return {Number}
 
-      */
 
-     getCapacity: function () {
 
-         return this._capacity;
 
-     },
 
-     /**
 
-      * Texture of the texture atlas
 
-      * @return {Image}
 
-      */
 
-     getTexture: function () {
 
-         return this.texture;
 
-     },
 
-     /**
 
-      * @param {Image} texture
 
-      */
 
-     setTexture: function (texture) {
 
-         this.texture = texture;
 
-     },
 
-     /**
 
-      * specify if the array buffer of the VBO needs to be updated
 
-      * @param {Boolean} dirty
 
-      */
 
-     setDirty: function (dirty) {
 
-         this.dirty = dirty;
 
-     },
 
-     /**
 
-      * whether or not the array buffer of the VBO needs to be updated
 
-      * @returns {boolean}
 
-      */
 
-     isDirty: function () {
 
-         return this.dirty;
 
-     },
 
-     /**
 
-      * Quads that are going to be rendered
 
-      * @return {Array}
 
-      */
 
-     getQuads: function () {
 
-         return this._quads;
 
-     },
 
-     /**
 
-      * @param {Array} quads
 
-      */
 
-     setQuads: function (quads) {
 
-         this._quads = quads;
 
-         //TODO need re-binding
 
-     },
 
-     _copyQuadsToTextureAtlas: function (quads, index) {
 
-         if (!quads)
 
-             return;
 
-         for (var i = 0; i < quads.length; i++)
 
-             this._setQuadToArray(quads[i], index + i);
 
-     },
 
-     _setQuadToArray: function (quad, index) {
 
-         var locQuads = this._quads;
 
-         if (!locQuads[index]) {
 
-             locQuads[index] = new cc.V3F_C4B_T2F_Quad(quad.tl, quad.bl, quad.tr, quad.br, this._quadsArrayBuffer, index * cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT);
 
-             return;
 
-         }
 
-         locQuads[index].bl = quad.bl;
 
-         locQuads[index].br = quad.br;
 
-         locQuads[index].tl = quad.tl;
 
-         locQuads[index].tr = quad.tr;
 
-     },
 
-     /**
 
-      * Description
 
-      * @return {String}
 
-      */
 
-     description: function () {
 
-         return '<cc.TextureAtlas | totalQuads =' + this._totalQuads + '>';
 
-     },
 
-     _setupIndices: function () {
 
-         if (this._capacity === 0)
 
-             return;
 
-         var locIndices = this._indices, locCapacity = this._capacity;
 
-         for (var i = 0; i < locCapacity; i++) {
 
-             if (cc.TEXTURE_ATLAS_USE_TRIANGLE_STRIP) {
 
-                 locIndices[i * 6 + 0] = i * 4 + 0;
 
-                 locIndices[i * 6 + 1] = i * 4 + 0;
 
-                 locIndices[i * 6 + 2] = i * 4 + 2;
 
-                 locIndices[i * 6 + 3] = i * 4 + 1;
 
-                 locIndices[i * 6 + 4] = i * 4 + 3;
 
-                 locIndices[i * 6 + 5] = i * 4 + 3;
 
-             } else {
 
-                 locIndices[i * 6 + 0] = i * 4 + 0;
 
-                 locIndices[i * 6 + 1] = i * 4 + 1;
 
-                 locIndices[i * 6 + 2] = i * 4 + 2;
 
-                 // inverted index. issue #179
 
-                 locIndices[i * 6 + 3] = i * 4 + 3;
 
-                 locIndices[i * 6 + 4] = i * 4 + 2;
 
-                 locIndices[i * 6 + 5] = i * 4 + 1;
 
-             }
 
-         }
 
-     },
 
-     _setupVBO: function () {
 
-         var gl = cc._renderContext;
 
-         //create WebGLBuffer
 
-         this._buffersVBO[0] = gl.createBuffer();
 
-         this._buffersVBO[1] = gl.createBuffer();
 
-         this._quadsWebBuffer = gl.createBuffer();
 
-         this._mapBuffers();
 
-     },
 
-     _mapBuffers: function () {
 
-         var gl = cc._renderContext;
 
-         gl.bindBuffer(gl.ARRAY_BUFFER, this._quadsWebBuffer);
 
-         gl.bufferData(gl.ARRAY_BUFFER, this._quadsArrayBuffer, gl.DYNAMIC_DRAW);
 
-         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._buffersVBO[1]);
 
-         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._indices, gl.STATIC_DRAW);
 
-     },
 
-     /**
 
-      * <p>Initializes a TextureAtlas with a filename and with a certain capacity for Quads.<br />
 
-      * The TextureAtlas capacity can be increased in runtime.<br />
 
-      * WARNING: Do not reinitialize the TextureAtlas because it will leak memory. </p>
 
-      * @param {String} file
 
-      * @param {Number} capacity
 
-      * @return {Boolean}
 
-      * @example
 
-      * //example
 
-      * var textureAtlas = new cc.TextureAtlas();
 
-      * textureAtlas.initWithTexture("hello.png", 3);
 
-      */
 
-     initWithFile: function (file, capacity) {
 
-         // retained in property
 
-         var texture = cc.textureCache.addImage(file);
 
-         if (texture)
 
-             return this.initWithTexture(texture, capacity);
 
-         else {
 
-             cc.log(cc._LogInfos.TextureAtlas_initWithFile, file);
 
-             return false;
 
-         }
 
-     },
 
-     /**
 
-      * <p>Initializes a TextureAtlas with a previously initialized Texture2D object, and<br />
 
-      * with an initial capacity for Quads.<br />
 
-      * The TextureAtlas capacity can be increased in runtime.<br />
 
-      * WARNING: Do not reinitialize the TextureAtlas because it will leak memory</p>
 
-      * @param {Image} texture
 
-      * @param {Number} capacity
 
-      * @return {Boolean}
 
-      * @example
 
-      * //example
 
-      * var texture = cc.textureCache.addImage("hello.png");
 
-      * var textureAtlas = new cc.TextureAtlas();
 
-      * textureAtlas.initWithTexture(texture, 3);
 
-      */
 
-     initWithTexture: function (texture, capacity) {
 
-         cc.assert(texture, cc._LogInfos.TextureAtlas_initWithTexture);
 
-         capacity = 0 | (capacity);
 
-         this._capacity = capacity;
 
-         this._totalQuads = 0;
 
-         // retained in property
 
-         this.texture = texture;
 
-         // Re-initialization is not allowed
 
-         this._quads = [];
 
-         this._indices = new Uint16Array(capacity * 6);
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         this._quadsArrayBuffer = new ArrayBuffer(quadSize * capacity);
 
-         this._quadsReader = new Uint8Array(this._quadsArrayBuffer);
 
-         if (!( this._quads && this._indices) && capacity > 0)
 
-             return false;
 
-         var locQuads = this._quads;
 
-         for (var i = 0; i < capacity; i++)
 
-             locQuads[i] = new cc.V3F_C4B_T2F_Quad(null, null, null, null, this._quadsArrayBuffer, i * quadSize);
 
-         this._setupIndices();
 
-         this._setupVBO();
 
-         this.dirty = true;
 
-         return true;
 
-     },
 
-     /**
 
-      * <p>Updates a Quad (texture, vertex and color) at a certain index <br />
 
-      * index must be between 0 and the atlas capacity - 1 </p>
 
-      * @param {cc.V3F_C4B_T2F_Quad} quad
 
-      * @param {Number} index
 
-      */
 
-     updateQuad: function (quad, index) {
 
-         cc.assert(quad, cc._LogInfos.TextureAtlas_updateQuad);
 
-         cc.assert(index >= 0 && index < this._capacity, cc._LogInfos.TextureAtlas_updateQuad_2);
 
-         this._totalQuads = Math.max(index + 1, this._totalQuads);
 
-         this._setQuadToArray(quad, index);
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * <p>Inserts a Quad (texture, vertex and color) at a certain index<br />
 
-      * index must be between 0 and the atlas capacity - 1 </p>
 
-      * @param {cc.V3F_C4B_T2F_Quad} quad
 
-      * @param {Number} index
 
-      */
 
-     insertQuad: function (quad, index) {
 
-         cc.assert(index < this._capacity, cc._LogInfos.TextureAtlas_insertQuad_2);
 
-         this._totalQuads++;
 
-         if (this._totalQuads > this._capacity) {
 
-             cc.log(cc._LogInfos.TextureAtlas_insertQuad);
 
-             return;
 
-         }
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         // issue #575. index can be > totalQuads
 
-         var remaining = (this._totalQuads - 1) - index;
 
-         var startOffset = index * quadSize;
 
-         var moveLength = remaining * quadSize;
 
-         this._quads[this._totalQuads - 1] = new cc.V3F_C4B_T2F_Quad(null, null, null, null, this._quadsArrayBuffer, (this._totalQuads - 1) * quadSize);
 
-         this._quadsReader.set(this._quadsReader.subarray(startOffset, startOffset + moveLength), startOffset + quadSize);
 
-         this._setQuadToArray(quad, index);
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * <p>
 
-      *      Inserts a c array of quads at a given index                                           <br />
 
-      *      index must be between 0 and the atlas capacity - 1                                    <br />
 
-      *      this method doesn't enlarge the array when amount + index > totalQuads                <br />
 
-      * </p>
 
-      * @param {Array} quads
 
-      * @param {Number} index
 
-      * @param {Number} amount
 
-      */
 
-     insertQuads: function (quads, index, amount) {
 
-         amount = amount || quads.length;
 
-         cc.assert((index + amount) <= this._capacity, cc._LogInfos.TextureAtlas_insertQuads);
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         this._totalQuads += amount;
 
-         if (this._totalQuads > this._capacity) {
 
-             cc.log(cc._LogInfos.TextureAtlas_insertQuad);
 
-             return;
 
-         }
 
-         // issue #575. index can be > totalQuads
 
-         var remaining = (this._totalQuads - 1) - index - amount;
 
-         var startOffset = index * quadSize;
 
-         var moveLength = remaining * quadSize;
 
-         var lastIndex = (this._totalQuads - 1) - amount;
 
-         var i;
 
-         for (i = 0; i < amount; i++)
 
-             this._quads[lastIndex + i] = new cc.V3F_C4B_T2F_Quad(null, null, null, null, this._quadsArrayBuffer, (this._totalQuads - 1) * quadSize);
 
-         this._quadsReader.set(this._quadsReader.subarray(startOffset, startOffset + moveLength), startOffset + quadSize * amount);
 
-         for (i = 0; i < amount; i++)
 
-             this._setQuadToArray(quads[i], index + i);
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * <p>Removes the quad that is located at a certain index and inserts it at a new index <br />
 
-      * This operation is faster than removing and inserting in a quad in 2 different steps</p>
 
-      * @param {Number} fromIndex
 
-      * @param {Number} newIndex
 
-      */
 
-     insertQuadFromIndex: function (fromIndex, newIndex) {
 
-         if (fromIndex === newIndex)
 
-             return;
 
-         cc.assert(newIndex >= 0 || newIndex < this._totalQuads, cc._LogInfos.TextureAtlas_insertQuadFromIndex);
 
-         cc.assert(fromIndex >= 0 || fromIndex < this._totalQuads, cc._LogInfos.TextureAtlas_insertQuadFromIndex_2);
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         var locQuadsReader = this._quadsReader;
 
-         var sourceArr = locQuadsReader.subarray(fromIndex * quadSize, quadSize);
 
-         var startOffset, moveLength;
 
-         if (fromIndex > newIndex) {
 
-             startOffset = newIndex * quadSize;
 
-             moveLength = (fromIndex - newIndex) * quadSize;
 
-             locQuadsReader.set(locQuadsReader.subarray(startOffset, startOffset + moveLength), startOffset + quadSize);
 
-             locQuadsReader.set(sourceArr, startOffset);
 
-         } else {
 
-             startOffset = (fromIndex + 1) * quadSize;
 
-             moveLength = (newIndex - fromIndex) * quadSize;
 
-             locQuadsReader.set(locQuadsReader.subarray(startOffset, startOffset + moveLength), startOffset - quadSize);
 
-             locQuadsReader.set(sourceArr, newIndex * quadSize);
 
-         }
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * <p>Removes a quad at a given index number.<br />
 
-      * The capacity remains the same, but the total number of quads to be drawn is reduced in 1 </p>
 
-      * @param {Number} index
 
-      */
 
-     removeQuadAtIndex: function (index) {
 
-         cc.assert(index < this._totalQuads, cc._LogInfos.TextureAtlas_removeQuadAtIndex);
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         this._totalQuads--;
 
-         this._quads.length = this._totalQuads;
 
-         if (index !== this._totalQuads) {
 
-             //move data
 
-             var startOffset = (index + 1) * quadSize;
 
-             var moveLength = (this._totalQuads - index) * quadSize;
 
-             this._quadsReader.set(this._quadsReader.subarray(startOffset, startOffset + moveLength), startOffset - quadSize);
 
-         }
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * Removes a given number of quads at a given index
 
-      * @param {Number} index
 
-      * @param {Number} amount
 
-      */
 
-     removeQuadsAtIndex: function (index, amount) {
 
-         cc.assert(index + amount <= this._totalQuads, cc._LogInfos.TextureAtlas_removeQuadsAtIndex);
 
-         this._totalQuads -= amount;
 
-         if (index !== this._totalQuads) {
 
-             //move data
 
-             var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-             var srcOffset = (index + amount) * quadSize;
 
-             var moveLength = (this._totalQuads - index) * quadSize;
 
-             var dstOffset = index * quadSize;
 
-             this._quadsReader.set(this._quadsReader.subarray(srcOffset, srcOffset + moveLength), dstOffset);
 
-         }
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * <p>Removes all Quads. <br />
 
-      * The TextureAtlas capacity remains untouched. No memory is freed.<br />
 
-      * The total number of quads to be drawn will be 0</p>
 
-      */
 
-     removeAllQuads: function () {
 
-         this._quads.length = 0;
 
-         this._totalQuads = 0;
 
-     },
 
-     _setDirty: function (dirty) {
 
-         this.dirty = dirty;
 
-     },
 
-     /**
 
-      * <p>Resize the capacity of the CCTextureAtlas.<br />
 
-      * The new capacity can be lower or higher than the current one<br />
 
-      * It returns YES if the resize was successful. <br />
 
-      * If it fails to resize the capacity it will return NO with a new capacity of 0. <br />
 
-      * no used for js</p>
 
-      * @param {Number} newCapacity
 
-      * @return {Boolean}
 
-      */
 
-     resizeCapacity: function (newCapacity) {
 
-         if (newCapacity == this._capacity)
 
-             return true;
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         var oldCapacity = this._capacity;
 
-         // update capacity and totolQuads
 
-         this._totalQuads = Math.min(this._totalQuads, newCapacity);
 
-         this._capacity = 0 | newCapacity;
 
-         var i, capacity = this._capacity, locTotalQuads = this._totalQuads;
 
-         if (this._quads == null) {
 
-             this._quads = [];
 
-             this._quadsArrayBuffer = new ArrayBuffer(quadSize * capacity);
 
-             this._quadsReader = new Uint8Array(this._quadsArrayBuffer);
 
-             for (i = 0; i < capacity; i++)
 
-                 this._quads = new cc.V3F_C4B_T2F_Quad(null, null, null, null, this._quadsArrayBuffer, i * quadSize);
 
-         } else {
 
-             var newQuads, newArrayBuffer, quads = this._quads;
 
-             if (capacity > oldCapacity) {
 
-                 newQuads = [];
 
-                 newArrayBuffer = new ArrayBuffer(quadSize * capacity);
 
-                 for (i = 0; i < locTotalQuads; i++) {
 
-                     newQuads[i] = new cc.V3F_C4B_T2F_Quad(quads[i].tl, quads[i].bl, quads[i].tr, quads[i].br,
 
-                         newArrayBuffer, i * quadSize);
 
-                 }
 
-                 for (; i < capacity; i++)
 
-                     newQuads[i] = new cc.V3F_C4B_T2F_Quad(null, null, null, null, newArrayBuffer, i * quadSize);
 
-                 this._quadsReader = new Uint8Array(newArrayBuffer);
 
-                 this._quads = newQuads;
 
-                 this._quadsArrayBuffer = newArrayBuffer;
 
-             } else {
 
-                 var count = Math.max(locTotalQuads, capacity);
 
-                 newQuads = [];
 
-                 newArrayBuffer = new ArrayBuffer(quadSize * capacity);
 
-                 for (i = 0; i < count; i++) {
 
-                     newQuads[i] = new cc.V3F_C4B_T2F_Quad(quads[i].tl, quads[i].bl, quads[i].tr, quads[i].br,
 
-                         newArrayBuffer, i * quadSize);
 
-                 }
 
-                 this._quadsReader = new Uint8Array(newArrayBuffer);
 
-                 this._quads = newQuads;
 
-                 this._quadsArrayBuffer = newArrayBuffer;
 
-             }
 
-         }
 
-         if (this._indices == null) {
 
-             this._indices = new Uint16Array(capacity * 6);
 
-         } else {
 
-             if (capacity > oldCapacity) {
 
-                 var tempIndices = new Uint16Array(capacity * 6);
 
-                 tempIndices.set(this._indices, 0);
 
-                 this._indices = tempIndices;
 
-             } else {
 
-                 this._indices = this._indices.subarray(0, capacity * 6);
 
-             }
 
-         }
 
-         this._setupIndices();
 
-         this._mapBuffers();
 
-         this.dirty = true;
 
-         return true;
 
-     },
 
-     /**
 
-      * Used internally by CCParticleBatchNode                                    <br/>
 
-      * don't use this unless you know what you're doing
 
-      * @param {Number} amount
 
-      */
 
-     increaseTotalQuadsWith: function (amount) {
 
-         this._totalQuads += amount;
 
-     },
 
-     /**
 
-      * Moves an amount of quads from oldIndex at newIndex
 
-      * @param {Number} oldIndex
 
-      * @param {Number} amount
 
-      * @param {Number} newIndex
 
-      */
 
-     moveQuadsFromIndex: function (oldIndex, amount, newIndex) {
 
-         if (newIndex === undefined) {
 
-             newIndex = amount;
 
-             amount = this._totalQuads - oldIndex;
 
-             cc.assert((newIndex + (this._totalQuads - oldIndex)) <= this._capacity, cc._LogInfos.TextureAtlas_moveQuadsFromIndex);
 
-             if (amount === 0)
 
-                 return;
 
-         } else {
 
-             cc.assert((newIndex + amount) <= this._totalQuads, cc._LogInfos.TextureAtlas_moveQuadsFromIndex_2);
 
-             cc.assert(oldIndex < this._totalQuads, cc._LogInfos.TextureAtlas_moveQuadsFromIndex_3);
 
-             if (oldIndex == newIndex)
 
-                 return;
 
-         }
 
-         var quadSize = cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         var srcOffset = oldIndex * quadSize;
 
-         var srcLength = amount * quadSize;
 
-         var locQuadsReader = this._quadsReader;
 
-         var sourceArr = locQuadsReader.subarray(srcOffset, srcOffset + srcLength);
 
-         var dstOffset = newIndex * quadSize;
 
-         var moveLength, moveStart;
 
-         if (newIndex < oldIndex) {
 
-             moveLength = (oldIndex - newIndex) * quadSize;
 
-             moveStart = newIndex * quadSize;
 
-             locQuadsReader.set(locQuadsReader.subarray(moveStart, moveStart + moveLength), moveStart + srcLength)
 
-         } else {
 
-             moveLength = (newIndex - oldIndex) * quadSize;
 
-             moveStart = (oldIndex + amount) * quadSize;
 
-             locQuadsReader.set(locQuadsReader.subarray(moveStart, moveStart + moveLength), srcOffset);
 
-         }
 
-         locQuadsReader.set(sourceArr, dstOffset);
 
-         this.dirty = true;
 
-     },
 
-     /**
 
-      * Ensures that after a realloc quads are still empty                                <br/>
 
-      * Used internally by CCParticleBatchNode
 
-      * @param {Number} index
 
-      * @param {Number} amount
 
-      */
 
-     fillWithEmptyQuadsFromIndex: function (index, amount) {
 
-         var count = amount * cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT;
 
-         var clearReader = new Uint8Array(this._quadsArrayBuffer, index * cc.V3F_C4B_T2F_Quad.BYTES_PER_ELEMENT, count);
 
-         for (var i = 0; i < count; i++)
 
-             clearReader[i] = 0;
 
-     },
 
-     // TextureAtlas - Drawing
 
-     /**
 
-      * Draws all the Atlas's Quads
 
-      */
 
-     drawQuads: function () {
 
-         this.drawNumberOfQuads(this._totalQuads, 0);
 
-     },
 
-     _releaseBuffer: function () {
 
-         var gl = cc._renderContext;
 
-         if (this._buffersVBO) {
 
-             if (this._buffersVBO[0])
 
-                 gl.deleteBuffer(this._buffersVBO[0]);
 
-             if (this._buffersVBO[1])
 
-                 gl.deleteBuffer(this._buffersVBO[1])
 
-         }
 
-         if (this._quadsWebBuffer)
 
-             gl.deleteBuffer(this._quadsWebBuffer);
 
-     }
 
- });
 
- var _p = cc.TextureAtlas.prototype;
 
- // Extended properties
 
- /** @expose */
 
- _p.totalQuads;
 
- cc.defineGetterSetter(_p, "totalQuads", _p.getTotalQuads);
 
- /** @expose */
 
- _p.capacity;
 
- cc.defineGetterSetter(_p, "capacity", _p.getCapacity);
 
- /** @expose */
 
- _p.quads;
 
- cc.defineGetterSetter(_p, "quads", _p.getQuads, _p.setQuads);
 
- /**
 
-  * <p>Creates a TextureAtlas with an filename and with an initial capacity for Quads. <br />
 
-  * The TextureAtlas capacity can be increased in runtime. </p>
 
-  * @deprecated since v3.0, please use new cc.TextureAtlas(fileName, capacity) instead
 
-  * @param {String|cc.Texture2D} fileName
 
-  * @param {Number} capacity
 
-  * @return {cc.TextureAtlas|Null}
 
-  * @example
 
-  * 1.
 
-  * //creates a TextureAtlas with  filename
 
-  * var textureAtlas = cc.TextureAtlas.create("res/hello.png", 3);
 
-  * 2.
 
-  * //creates a TextureAtlas with texture
 
-  * var texture = cc.textureCache.addImage("hello.png");
 
-  * var textureAtlas = cc.TextureAtlas.create(texture, 3);
 
-  */
 
- cc.TextureAtlas.create = function (fileName, capacity) {
 
-     return new cc.TextureAtlas(fileName, capacity);
 
- };
 
- /**
 
-  * @deprecated  since v3.0, please use new cc.TextureAtlas(texture) instead
 
-  * @function
 
-  */
 
- cc.TextureAtlas.createWithTexture = cc.TextureAtlas.create;
 
- if (cc._renderType === cc._RENDER_TYPE_WEBGL) {
 
-     cc.assert(typeof cc._tmp.WebGLTextureAtlas === "function", cc._LogInfos.MissingFile, "TexturesWebGL.js");
 
-     cc._tmp.WebGLTextureAtlas();
 
-     delete cc._tmp.WebGLTextureAtlas;
 
- }
 
- cc.assert(typeof cc._tmp.PrototypeTextureAtlas === "function", cc._LogInfos.MissingFile, "TexturesPropertyDefine.js");
 
- cc._tmp.PrototypeTextureAtlas();
 
- delete cc._tmp.PrototypeTextureAtlas;
 
 
  |