UNPKG

@senspark/ee

Version:

utility library for cocos creator

214 lines (213 loc) 8.69 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var assert = require("assert"); var _a = cc._decorator, ccclass = _a.ccclass, disallowMultiple = _a.disallowMultiple, executeInEditMode = _a.executeInEditMode, menu = _a.menu; var assembler = { useModel: false, createData: function (sprite) { var renderData = sprite.requestRenderData(); // 0-4 for local verts // 5-20 for world verts renderData.dataLength = 20; renderData.vertexCount = 16; renderData.indiceCount = 54; return renderData; }, updateRenderData: function (sprite, batchData) { var frame = sprite.spriteFrame; var dynamicAtlasManager = cc.dynamicAtlasManager; // TODO: Material API design and export from editor could affect the material activation process // need to update the logic here if (frame) { if (!frame._original && dynamicAtlasManager) { dynamicAtlasManager.insertSpriteFrame(frame); } if (sprite._material._texture !== frame._texture) { sprite._activateMaterial(); } } var renderData = sprite._renderData; if (renderData && frame) { var vertDirty = renderData.vertDirty; if (vertDirty) { this.updateVerts(sprite); this.updateWorldVerts(sprite); } } }, updateVerts: function (sprite) { var renderData = sprite._renderData; var data = renderData._data; var node = sprite.node; var width = node.width; var height = node.height; var appx = node.anchorX * width; var appy = node.anchorY * height; var frame = sprite.spriteFrame; var leftWidth = frame.insetLeft; var rightWidth = frame.insetRight; var topHeight = frame.insetTop; var bottomHeight = frame.insetBottom; var sizableWidth = width - leftWidth - rightWidth; var sizableHeight = height - topHeight - bottomHeight; var xScale = width / (leftWidth + rightWidth); var yScale = height / (topHeight + bottomHeight); xScale = (isNaN(xScale) || xScale > 1) ? 1 : xScale; yScale = (isNaN(yScale) || yScale > 1) ? 1 : yScale; sizableWidth = sizableWidth < 0 ? 0 : sizableWidth; sizableHeight = sizableHeight < 0 ? 0 : sizableHeight; data[0].x = -appx; data[0].y = -appy; data[1].x = leftWidth * xScale - appx; data[1].y = bottomHeight * yScale - appy; data[2].x = data[1].x + sizableWidth; data[2].y = data[1].y + sizableHeight; data[3].x = width - appx; data[3].y = height - appy; renderData.vertDirty = false; }, fillBuffers: function (sprite, renderer) { if (renderer.worldMatDirty) { this.updateWorldVerts(sprite); } var renderData = sprite._renderData; var data = renderData._data; var buffer = renderer._meshBuffer; var vertexOffset = buffer.byteOffset >> 2; var vertexCount = renderData.vertexCount; var indiceOffset = buffer.indiceOffset; var vertexId = buffer.vertexOffset; // Recalculate uv sliced if needed. var frame = sprite.spriteFrame; var insetL = frame.insetLeft; var insetR = frame.insetRight; var insetT = frame.insetTop; var insetB = frame.insetBottom; var sizableWidth = sprite.node.width - insetL - insetR; var sizableHeight = sprite.node.height - insetT - insetB; var oldInsets = frame._capInsets.slice(); var needRecalculation = false; if (sizableWidth < 0) { var insetWidth = insetL + insetR; frame._capInsets[0] += sizableWidth * insetL / insetWidth; frame._capInsets[2] += sizableWidth * insetR / insetWidth; needRecalculation = true; } if (sizableHeight < 0) { var insetHeight = insetT + insetB; frame._capInsets[1] += sizableHeight * insetT / insetHeight; frame._capInsets[3] += sizableHeight * insetB / insetHeight; needRecalculation = true; } var oldUvSliced = []; if (needRecalculation) { oldUvSliced.push.apply(oldUvSliced, frame.uvSliced); frame._calculateSlicedUV(); } var uvSliced = frame.uvSliced; buffer.request(vertexCount, renderData.indiceCount); // buffer data may be realloc, need get reference after request. var vbuf = buffer._vData; var ibuf = buffer._iData; for (var i = 4; i < 20; ++i) { var vert = data[i]; var uvs = uvSliced[i - 4]; vbuf[vertexOffset++] = vert.x; vbuf[vertexOffset++] = vert.y; vbuf[vertexOffset++] = uvs.u; vbuf[vertexOffset++] = uvs.v; } for (var r = 0; r < 3; ++r) { for (var c = 0; c < 3; ++c) { var start = vertexId + r * 4 + c; ibuf[indiceOffset++] = start; ibuf[indiceOffset++] = start + 1; ibuf[indiceOffset++] = start + 4; ibuf[indiceOffset++] = start + 1; ibuf[indiceOffset++] = start + 5; ibuf[indiceOffset++] = start + 4; } } // Restore. if (needRecalculation) { frame._capInsets = oldInsets; frame.uvSliced = oldUvSliced; } }, updateWorldVerts: function (sprite) { var node = sprite.node; var data = sprite._renderData._data; var matrix = node._worldMatrix; var a = matrix.m00; var b = matrix.m01; var c = matrix.m04; var d = matrix.m05; var tx = matrix.m12; var ty = matrix.m13; for (var row = 0; row < 4; ++row) { var rowD = data[row]; for (var col = 0; col < 4; ++col) { var colD = data[col]; var world = data[4 + row * 4 + col]; world.x = colD.x * a + rowD.y * c + tx; world.y = colD.x * b + rowD.y * d + ty; } } }, }; var Scale9 = /** @class */ (function (_super) { __extends(Scale9, _super); function Scale9() { return _super !== null && _super.apply(this, arguments) || this; } Scale9.prototype.update = function (delta) { var component = this.getComponent(cc.Sprite); var type = component.type; if (type === cc.Sprite.Type.SLICED) { if (component._assembler !== assembler) { // Use custom assembler. this.updateAssembler(); } } }; Scale9.prototype.updateAssembler = function () { var component = this.getComponent(cc.Sprite); assert(component !== null); if (component._assembler !== assembler) { component._assembler = assembler; component._renderData = null; } if (!component._renderData) { component._renderData = component._assembler.createData(component); component._renderData.material = component._material; component.markForUpdateRenderData(true); } }; Scale9 = __decorate([ ccclass, disallowMultiple, executeInEditMode, menu('ee/Scale9') ], Scale9); return Scale9; }(cc.Component)); exports.Scale9 = Scale9;