UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

751 lines (582 loc) 24 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace egret.native { /** * @private * 判断当前runtime版本是否支持cmdBatch */ export let $supportCmdBatch = egret_native.sendToC ? true : false; /* * @private * 命令控制器 * */ class CmdManager { /* * 存储绘制命令的 array buffer **/ private maxArrayBufferLen = 80000; private arrayBuffer:ArrayBuffer = new ArrayBuffer(this.maxArrayBufferLen * 4); private uint32View:Uint32Array = new Uint32Array(this.arrayBuffer); private float32View:Float32Array = new Float32Array(this.arrayBuffer); private arrayBufferLen:number = 0; /* * 存储字符串的数组 */ private strArray:string[] = []; /* * native上下文 */ private context:any; /* * 上传绘制命令到C */ public flush() { egret_native.sendToC(this.float32View, this.arrayBufferLen, this.strArray); this.clear(); } /* * 切换native上下文 * native绘制需要在自身的上下文进行绘制 */ public setContext(ctx:any):void { if(this.context != ctx) { if(this.arrayBufferLen + 3 > this.maxArrayBufferLen) { this.flush(); } this.context = ctx; let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 1000; // uint32View[arrayBufferLen++] = ctx.___native_texture__p; // 兼容64位 let addr = ctx.___native_texture__p; uint32View[arrayBufferLen++] = (addr / 4294967296) >>> 0; uint32View[arrayBufferLen++] = (addr & 4294967295) >>> 0; // uint32View[arrayBufferLen++] = addr >> 32; // uint32View[arrayBufferLen++] = addr & 4294967295; this.arrayBufferLen = arrayBufferLen; } } /* * 清空绘制命令 */ private clear() { this.arrayBufferLen = 0; this.strArray.length = 0; } /* * 压入一个字符串并返回索引 */ public pushString(str:string):number { let array = this.strArray; let len = array.length; array[len] = str; return len; } //------绘制命令 start------------- public clearScreen(i1:number, i2:number, i3:number, i4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 100; uint32View[arrayBufferLen++] = i1; uint32View[arrayBufferLen++] = i2; uint32View[arrayBufferLen++] = i3; uint32View[arrayBufferLen++] = i4; this.arrayBufferLen = arrayBufferLen; } public drawImage(i1:number, f1:number, f2:number, f3:number, f4:number, f5:number, f6:number, f7:number, f8:number):void { if(this.arrayBufferLen + 11 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 101; // uint32View[arrayBufferLen++] = i1; // 兼容64位 // uint32View[arrayBufferLen++] = i1 >> 32; // uint32View[arrayBufferLen++] = i1 & 4294967295; uint32View[arrayBufferLen++] = (i1 / 4294967296) >>> 0; uint32View[arrayBufferLen++] = (i1 & 4294967295) >>> 0; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; float32View[arrayBufferLen++] = f5; float32View[arrayBufferLen++] = f6; float32View[arrayBufferLen++] = f7; float32View[arrayBufferLen++] = f8; this.arrayBufferLen = arrayBufferLen; } public setTransform(f1:number, f2:number, f3:number, f4:number, f5:number, f6:number):void { if(this.arrayBufferLen + 7 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 103; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; float32View[arrayBufferLen++] = f5; float32View[arrayBufferLen++] = f6; this.arrayBufferLen = arrayBufferLen; } public setGlobalAlpha(f1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 106; float32View[arrayBufferLen++] = f1; this.arrayBufferLen = arrayBufferLen; } public pushRectStencils(array:any):void { let len = array.length; if(this.arrayBufferLen + len + 1 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 113; uint32View[arrayBufferLen++] = len; for(let i = 0; i < len; i++) { float32View[arrayBufferLen++] = array[i]; } this.arrayBufferLen = arrayBufferLen; } public restore():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 116; } public save():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 117; } public setBlendArg(f1:number, f2:number):void { if(this.arrayBufferLen + 3 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 120; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; this.arrayBufferLen = arrayBufferLen; } public beginPath():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 204; } public closePath():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 205; } public rect(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 210; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public clearRect(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 214; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public createLabel(i1:number, f1:number, i2:number, f2:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 300; uint32View[arrayBufferLen++] = i1; float32View[arrayBufferLen++] = f1; uint32View[arrayBufferLen++] = i2; float32View[arrayBufferLen++] = f2; this.arrayBufferLen = arrayBufferLen; } public drawText(i1:number, f1:number, f2:number):void { if(this.arrayBufferLen + 4 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 301; uint32View[arrayBufferLen++] = i1; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; this.arrayBufferLen = arrayBufferLen; } public setTextColor(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 302; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } public setStrokeColor(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 303; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } public setFillStyle(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 1200; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } public setStrokeStyle(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 1201; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } public setLineWidth(f1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 1202; float32View[arrayBufferLen++] = f1; this.arrayBufferLen = arrayBufferLen; } public moveTo(f1:number, f2:number):void { if(this.arrayBufferLen + 3 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 207; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; this.arrayBufferLen = arrayBufferLen; } public lineTo(f1:number, f2:number):void { if(this.arrayBufferLen + 3 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 208; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; this.arrayBufferLen = arrayBufferLen; } public fill(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 203; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } public pushClip(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 107; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public popClip():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 108; } public stroke():void { if(this.arrayBufferLen + 1 > this.maxArrayBufferLen) { this.flush(); } this.uint32View[this.arrayBufferLen++] = 206; } public arc(f1:number, f2:number, f3:number, f4:number, f5:number, i6:number):void { if(this.arrayBufferLen + 7 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 209; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; float32View[arrayBufferLen++] = f5; uint32View[arrayBufferLen++] = i6; this.arrayBufferLen = arrayBufferLen; } public quadraticCurveTo(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 211; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public fillRect(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 212; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public strokeRect(f1:number, f2:number, f3:number, f4:number):void { if(this.arrayBufferLen + 5 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 213; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; this.arrayBufferLen = arrayBufferLen; } public bezierCurveTo(f1:number, f2:number, f3:number, f4:number, f5:number, f6:number):void { if(this.arrayBufferLen + 7 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let float32View = this.float32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 215; float32View[arrayBufferLen++] = f1; float32View[arrayBufferLen++] = f2; float32View[arrayBufferLen++] = f3; float32View[arrayBufferLen++] = f4; float32View[arrayBufferLen++] = f5; float32View[arrayBufferLen++] = f6; this.arrayBufferLen = arrayBufferLen; } public setGlobalShader(i1:number):void { if(this.arrayBufferLen + 2 > this.maxArrayBufferLen) { this.flush(); } let uint32View = this.uint32View; let arrayBufferLen = this.arrayBufferLen; uint32View[arrayBufferLen++] = 111; uint32View[arrayBufferLen++] = i1; this.arrayBufferLen = arrayBufferLen; } //------绘制命令 end------------- } /* * @private * 输出一个单例命令控制器,供所有需要调用的地方使用 */ export let $cmdManager = new CmdManager(); let isRunning:boolean = false; let playerList:Array<NativePlayer> = []; function runEgret(options?:runEgretOptions) { if (isRunning) { return; } isRunning = true; if(!options){ options = {}; } setRenderMode(options.renderMode); if (DEBUG) { //todo 获得系统语言版本 let language = "zh_CN"; if (language in egret.$locale_strings) egret.$language = language; } try { Capabilities.$setNativeCapabilities(egret_native.getVersion()); } catch (e) { } let ticker = egret.ticker; let mainLoop = $supportCmdBatch ? function () { ticker.update(); $cmdManager.flush(); } : function() { ticker.update(); }; egret_native.executeMainLoop(mainLoop, ticker); if (!egret.sys.screenAdapter) { if(options.screenAdapter){ egret.sys.screenAdapter = options.screenAdapter; } else{ egret.sys.screenAdapter = new egret.sys.DefaultScreenAdapter(); } } //todo let player = new NativePlayer(); playerList.push(player); sys.customHitTestBuffer = new NativeCanvasRenderBuffer(3, 3); sys.canvasHitTestBuffer = sys.customHitTestBuffer; } /** * 设置渲染模式。"auto","webgl","canvas" * @param renderMode */ function setRenderMode(renderMode:string):void{ sys.RenderBuffer = NativeCanvasRenderBuffer; sys.CanvasRenderBuffer = NativeCanvasRenderBuffer; sys.systemRenderer = new CanvasRenderer(); sys.canvasRenderer = sys.systemRenderer; Capabilities.$renderMode = "canvas"; } function updateAllScreens():void { let length:number = playerList.length; for (let i:number = 0; i < length; i++) { playerList[i].updateScreenSize(); } } function toArray(argument) { let args = []; for (let i = 0; i < argument.length; i++) { args.push(argument[i]); } return args; } egret.warn = function () { console.warn.apply(console, toArray(arguments)) }; egret.error = function () { console.error.apply(console, toArray(arguments)) }; egret.assert = function () { if (console.assert) { console.assert.apply(console, toArray(arguments)); } else { let args = toArray(arguments); if (!args[0]) { let args2 = []; for (let i = 1; i < args.length; i++) { args2.push(args[i]); } console.error.apply(console, args2); } } }; if (DEBUG) { egret.log = function () { if (DEBUG) { let length = arguments.length; let info = ""; for (let i = 0; i < length; i++) { info += arguments[i] + " "; } sys.$logToFPS(info); } console.log.apply(console, toArray(arguments)); } } else { egret.log = function () { console.log.apply(console, toArray(arguments)) }; } egret.runEgret = runEgret; egret.updateAllScreens = updateAllScreens; }