@senspark/ee
Version:
utility library for cocos creator
214 lines (213 loc) • 8.69 kB
JavaScript
"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;