cocos-enhance-kit/patches/v1.0.0/0005-cc.Label-cc.RichText-cc.Sprite-cc.MotionStreak.patch
2022-06-21 23:22:06 +08:00

2079 lines
80 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 0f2dafc3798f563b4302333ac90e3e2f1c3f2cc7 Mon Sep 17 00:00:00 2001
From: SmallMain <smallmain@outlook.com>
Date: Tue, 21 Jun 2022 11:30:54 +0800
Subject: [PATCH 05/15] =?UTF-8?q?=E5=A4=9A=E7=BA=B9=E7=90=86=E6=B8=B2?=
=?UTF-8?q?=E6=9F=93=20-=20cc.Label=E3=80=81cc.RichText=E3=80=81cc.Sprite?=
=?UTF-8?q?=E3=80=81cc.MotionStreak=20=E7=BB=84=E4=BB=B6=E7=9A=84=E5=8E=9F?=
=?UTF-8?q?=E7=94=9F=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
engine/cocos2d/core/components/CCLabel.js | 27 +-
.../cocos2d/core/components/CCMotionStreak.js | 46 +++-
.../core/components/CCRenderComponent.js | 72 +++++-
engine/cocos2d/core/components/CCRichText.js | 32 ++-
engine/cocos2d/core/components/CCSprite.js | 29 ++-
engine/cocos2d/core/platform/CCMacro.js | 4 +-
engine/cocos2d/core/renderer/assembler-2d.js | 25 +-
engine/cocos2d/core/renderer/assembler.js | 53 ++++
.../core/renderer/utils/label/bmfont.js | 26 +-
.../cocos2d/core/renderer/utils/label/ttf.js | 13 +-
.../core/renderer/webgl/assemblers/index.js | 3 +-
.../webgl/assemblers/label/2d-multi/bmfont.js | 71 ++++++
.../webgl/assemblers/label/2d-multi/ttf.js | 72 ++++++
.../renderer/webgl/assemblers/label/index.js | 15 +-
.../webgl/assemblers/motion-streak-multi.js | 233 ++++++++++++++++++
.../webgl/assemblers/motion-streak.js | 3 -
.../assemblers/sprite/2d-multi/bar-filled.js | 99 ++++++++
.../webgl/assemblers/sprite/2d-multi/mesh.js | 94 +++++++
.../sprite/2d-multi/radial-filled.js | 70 ++++++
.../assemblers/sprite/2d-multi/simple.js | 76 ++++++
.../assemblers/sprite/2d-multi/sliced.js | 89 +++++++
.../webgl/assemblers/sprite/2d-multi/tiled.js | 99 ++++++++
.../webgl/assemblers/sprite/2d/bar-filled.js | 47 ++--
.../webgl/assemblers/sprite/2d/mesh.js | 48 ++--
.../assemblers/sprite/2d/radial-filled.js | 11 +-
.../webgl/assemblers/sprite/2d/simple.js | 13 +-
.../webgl/assemblers/sprite/2d/sliced.js | 15 +-
.../webgl/assemblers/sprite/2d/tiled.js | 63 ++---
.../renderer/webgl/assemblers/sprite/index.js | 28 ++-
.../core/renderer/webgl/vertex-format.js | 14 +-
engine/cocos2d/renderer/gfx/enums.js | 3 +-
engine/modules.json | 3 +-
32 files changed, 1359 insertions(+), 137 deletions(-)
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/bmfont.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/ttf.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/motion-streak-multi.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/bar-filled.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/mesh.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/radial-filled.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/simple.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/sliced.js
create mode 100644 engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/tiled.js
diff --git a/engine/cocos2d/core/components/CCLabel.js b/engine/cocos2d/core/components/CCLabel.js
index 81e3cd4..f2c372f 100644
--- a/engine/cocos2d/core/components/CCLabel.js
+++ b/engine/cocos2d/core/components/CCLabel.js
@@ -192,7 +192,7 @@ let Label = cc.Class({
editor: CC_EDITOR && {
menu: 'i18n:MAIN_MENU.component.renderers/Label',
help: 'i18n:COMPONENT.help_url.label',
- inspector: 'packages://inspector/inspectors/comps/label.js',
+ inspector: 'packages://service-pack/inspectors/comps/label.js',
},
properties: {
@@ -578,6 +578,11 @@ let Label = cc.Class({
},
tooltip: CC_DEV && 'i18n:COMPONENT.label.underline_height',
},
+
+ autoSwitchMaterial: {
+ type: RenderComponent.EnableType,
+ default: RenderComponent.EnableType.GLOBAL,
+ },
},
statics: {
@@ -782,7 +787,25 @@ let Label = cc.Class({
}
if (!this._frame) return;
- material && material.setProperty('texture', this._frame._texture);
+
+ if (material) {
+ // 根据材质更新 uniform
+ const isMultiMaterial = material.material.isMultiSupport();
+ if (isMultiMaterial) {
+ // 贴图在 updateRenderData 才确定下来
+ // if (texture) this._updateMultiTexId(material, texture);
+ this._texIdDirty = true;
+ } else {
+ material.setProperty('texture', this._frame._texture);
+ }
+
+ // 根据材质更新 assembler
+ if (this._assembler) {
+ if ((isMultiMaterial && !this._assembler.isMulti) || !isMultiMaterial && this._assembler.isMulti) {
+ RenderComponent.prototype._resetAssembler.call(this);
+ }
+ }
+ }
BlendFunc.prototype._updateMaterial.call(this);
},
diff --git a/engine/cocos2d/core/components/CCMotionStreak.js b/engine/cocos2d/core/components/CCMotionStreak.js
index 0b24abf..545c03f 100644
--- a/engine/cocos2d/core/components/CCMotionStreak.js
+++ b/engine/cocos2d/core/components/CCMotionStreak.js
@@ -160,6 +160,10 @@ var MotionStreak = cc.Class({
if (this._texture === value) return;
this._texture = value;
+
+ // 自动切换材质
+ this._checkSwitchMaterial();
+
this._updateMaterial();
},
type: cc.Texture2D,
@@ -209,6 +213,24 @@ var MotionStreak = cc.Class({
},
animatable: false,
tooltip: CC_DEV && 'i18n:COMPONENT.motionStreak.fastMode'
+ },
+
+ autoSwitchMaterial: {
+ type: RenderComponent.EnableType,
+ default: RenderComponent.EnableType.GLOBAL,
+ },
+ },
+
+ __preload() {
+ this._super();
+ this._checkSwitchMaterial();
+ },
+
+ _checkSwitchMaterial() {
+ if (this._assembler) {
+ const material = this._materials[0];
+ if (!material) return;
+ this._assembler.checkAndSwitchMaterial(this, this._texture, material);
}
},
@@ -219,7 +241,29 @@ var MotionStreak = cc.Class({
_updateMaterial () {
let material = this.getMaterial(0);
- material && material.setProperty('texture', this._texture);
+
+ // 根据材质更新 uniform
+ const isMultiMaterial = material.material.isMultiSupport();
+ if (isMultiMaterial) {
+ this._updateMultiTexId(material, this._texture);
+ } else {
+ if (material.getProperty('texture') !== this._texture) {
+ material.setProperty('texture', this._texture);
+ }
+ }
+
+ // 根据材质更新 assembler
+ if (this._assembler) {
+ if ((isMultiMaterial && !this._assembler.isMulti) || !isMultiMaterial && this._assembler.isMulti) {
+ this._resetAssembler();
+ }
+ }
+
+ // texId
+ if (isMultiMaterial && this._texIdDirty) {
+ this._assembler.updateTexId(this);
+ this._texIdDirty = false;
+ }
BlendFunc.prototype._updateMaterial.call(this);
},
diff --git a/engine/cocos2d/core/components/CCRenderComponent.js b/engine/cocos2d/core/components/CCRenderComponent.js
index c23fc4d..fb7103a 100644
--- a/engine/cocos2d/core/components/CCRenderComponent.js
+++ b/engine/cocos2d/core/components/CCRenderComponent.js
@@ -33,6 +33,32 @@ const Material = require('../assets/material/CCMaterial');
let _temp_color = new Color();
+/**
+ * !#en enable type
+ * !#zh 启用类型
+ * @enum RenderComponent.EnableType
+ */
+var EnableType = cc.Enum({
+ /**
+ * !#en Global.
+ * !#zh 使用全局值
+ * @property {Number} GLOBAL
+ */
+ GLOBAL: 0,
+ /**
+ * !#en Enable.
+ * !#zh 开启
+ * @property {Number} ENABLE
+ */
+ ENABLE: 1,
+ /**
+ * !#en Disable.
+ * !#zh 关闭
+ * @property {Number} DISABLE
+ */
+ DISABLE: 2,
+});
+
/**
* !#en
* Base class for components which supports rendering features.
@@ -51,6 +77,10 @@ let RenderComponent = cc.Class({
disallowMultiple: true
},
+ statics: {
+ EnableType: EnableType,
+ },
+
properties: {
_materials: {
default: [],
@@ -78,12 +108,16 @@ let RenderComponent = cc.Class({
ctor () {
this._vertsDirty = true;
+ this._texIdDirty = true;
+ this._texId = 0;
this._assembler = null;
},
_resetAssembler () {
Assembler.init(this);
this._updateColor();
+ // 切换 Assembler 时texId 与 vDatas 数据不同步
+ this._texId = 0;
this.setVertsDirty();
},
@@ -250,7 +284,43 @@ let RenderComponent = cc.Class({
renderer.material = material;
renderer.cullingMask = cullingMask;
}
- }
+ },
+
+ _updateMultiTexId(material, texture) {
+ const multi = material.material.getMultiHandler();
+
+ const spTexture = texture;
+ const nSpTexture = spTexture.getImpl();
+
+ // 快速检查插槽上的贴图是否相同
+ // 如果是当作普通材质使用multi.getTexture(this._texId) !== nSpTexture 会一直为 true
+ const same = this._texId === 0
+ ? material.getProperty('texture') !== nSpTexture
+ : multi.getTexture(this._texId) !== nSpTexture;
+
+ if (same) {
+ // 如果材质变体被修改了,则直接跳过位置检查
+ const isChanged = Object.prototype.hasOwnProperty.call(material._effect._passes['0']._properties, 'texture');
+ const texId = isChanged ? -1 : multi.getIndex(nSpTexture);
+
+ if (texId !== -1) {
+ // 插槽位置不对,则更新位置
+ this._texId = texId;
+ this._texIdDirty = true;
+ } else {
+ // 插槽根本没有该纹理,则修改变体的 texture
+ material.setProperty('texture', spTexture);
+ if (this._texId !== 0) {
+ this._texId = 0;
+ this._texIdDirty = true;
+ }
+ // cc.warn('renderComponent use multi-material but not has valid property.');
+ }
+ } else {
+ this._texIdDirty = false;
+ }
+ },
+
});
cc.RenderComponent = module.exports = RenderComponent;
diff --git a/engine/cocos2d/core/components/CCRichText.js b/engine/cocos2d/core/components/CCRichText.js
index af99d65..ae1183e 100644
--- a/engine/cocos2d/core/components/CCRichText.js
+++ b/engine/cocos2d/core/components/CCRichText.js
@@ -28,6 +28,7 @@ const js = require('../platform/js');
const macro = require('../platform/CCMacro');
const textUtils = require('../utils/text-utils');
const HtmlTextParser = require('../utils/html-text-parser');
+import MaterialVariant from '../assets/material/material-variant';
const _htmlTextParser = new HtmlTextParser();
const HorizontalAlign = macro.TextAlignment;
@@ -36,6 +37,8 @@ const RichTextChildName = "RICHTEXT_CHILD";
const RichTextChildImageName = "RICHTEXT_Image_CHILD";
const CacheMode = cc.Label.CacheMode;
+const RenderComponent = require('./CCRenderComponent');
+
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
@@ -129,7 +132,7 @@ let RichText = cc.Class({
editor: CC_EDITOR && {
menu: 'i18n:MAIN_MENU.component.renderers/RichText',
help: 'i18n:COMPONENT.help_url.richtext',
- inspector: 'packages://inspector/inspectors/comps/richtext.js',
+ inspector: 'packages://service-pack/inspectors/comps/richtext.js',
executeInEditMode: true
},
@@ -346,6 +349,30 @@ let RichText = cc.Class({
this.handleTouchEvent ? this._addEventListeners() : this._removeEventListeners();
}
}
+ },
+
+ autoSwitchMaterial: {
+ type: RenderComponent.EnableType,
+ default: RenderComponent.EnableType.GLOBAL,
+ notify: function (oldValue) {
+ if (this.autoSwitchMaterial === oldValue) return;
+ for (let i = 0; i < this._labelSegments.length; i++) {
+ const labelComponent = this._labelSegments[i].getComponent(cc.Label);
+ if (labelComponent) {
+ labelComponent.autoSwitchMaterial = this.autoSwitchMaterial;
+ }
+ const spriteComponent = this._labelSegments[i].getComponent(cc.Sprite);
+ if (spriteComponent) {
+ spriteComponent.autoSwitchMaterial = this.autoSwitchMaterial;
+ }
+ }
+ for (let i = 0; i < this._labelSegmentsCache.length; i++) {
+ const labelComponent = this._labelSegmentsCache[i].getComponent(cc.Label);
+ if (labelComponent) {
+ labelComponent.autoSwitchMaterial = this.autoSwitchMaterial;
+ }
+ }
+ }
}
},
@@ -656,6 +683,8 @@ let RichText = cc.Class({
if (spriteFrame) {
let spriteNode = new cc.PrivateNode(RichTextChildImageName);
let spriteComponent = spriteNode.addComponent(cc.Sprite);
+
+ spriteComponent.autoSwitchMaterial = this.autoSwitchMaterial;
switch (richTextElement.style.imageAlign)
{
case 'top':
@@ -948,6 +977,7 @@ let RichText = cc.Class({
labelComponent.cacheMode = this.cacheMode;
+ labelComponent.autoSwitchMaterial = this.autoSwitchMaterial;
let isAsset = this.font instanceof cc.Font;
if (isAsset && !this._isSystemFontUsed) {
labelComponent.font = this.font;
diff --git a/engine/cocos2d/core/components/CCSprite.js b/engine/cocos2d/core/components/CCSprite.js
index a265b1a..f0cf757 100644
--- a/engine/cocos2d/core/components/CCSprite.js
+++ b/engine/cocos2d/core/components/CCSprite.js
@@ -160,7 +160,7 @@ var Sprite = cc.Class({
editor: CC_EDITOR && {
menu: 'i18n:MAIN_MENU.component.renderers/Sprite',
help: 'i18n:COMPONENT.help_url.sprite',
- inspector: 'packages://inspector/inspectors/comps/sprite.js',
+ inspector: 'packages://service-pack/inspectors/comps/sprite.js',
},
properties: {
@@ -383,7 +383,12 @@ var Sprite = cc.Class({
animatable: false,
type: SizeMode,
tooltip: CC_DEV && 'i18n:COMPONENT.sprite.size_mode'
- }
+ },
+
+ autoSwitchMaterial: {
+ type: RenderComponent.EnableType,
+ default: RenderComponent.EnableType.GLOBAL,
+ },
},
statics: {
@@ -449,8 +454,24 @@ var Sprite = cc.Class({
if (material.getDefine('USE_TEXTURE') !== undefined) {
material.define('USE_TEXTURE', true);
}
- if (material.getProperty('texture') !== texture) {
- material.setProperty('texture', texture);
+
+ // 根据材质更新 uniform
+ const isMultiMaterial = material.material.isMultiSupport();
+ if (isMultiMaterial) {
+ // 在 assembler 中进行更新性能会更好,不需要每次 setSpriteFrame 都更新,并且动态图集会导致两次触发
+ // if (texture) this._updateMultiTexId(material, texture);
+ this._texIdDirty = true;
+ } else {
+ if (material.getProperty('texture') !== texture) {
+ material.setProperty('texture', texture);
+ }
+ }
+
+ // 根据材质更新 assembler
+ if (this._assembler) {
+ if ((isMultiMaterial && !this._assembler.isMulti) || !isMultiMaterial && this._assembler.isMulti) {
+ this._resetAssembler();
+ }
}
}
diff --git a/engine/cocos2d/core/platform/CCMacro.js b/engine/cocos2d/core/platform/CCMacro.js
index dddc686..037ee54 100644
--- a/engine/cocos2d/core/platform/CCMacro.js
+++ b/engine/cocos2d/core/platform/CCMacro.js
@@ -384,9 +384,9 @@ cc.macro = {
* 是否使用原生的文本渲染机制, 布局和编辑器有差异.
*
* @property {Boolean} ENABLE_NATIVE_TTF_RENDERER
- * @default true
+ * @default false
*/
- ENABLE_NATIVE_TTF_RENDERER: true
+ ENABLE_NATIVE_TTF_RENDERER: false
};
diff --git a/engine/cocos2d/core/renderer/assembler-2d.js b/engine/cocos2d/core/renderer/assembler-2d.js
index 29287a1..8390f28 100644
--- a/engine/cocos2d/core/renderer/assembler-2d.js
+++ b/engine/cocos2d/core/renderer/assembler-2d.js
@@ -131,22 +131,13 @@ export default class Assembler2D extends Assembler {
}
}
- packToDynamicAtlas (comp, frame) {
- if (CC_TEST) return;
-
- if (!frame._original && dynamicAtlasManager && frame._texture.packable) {
- let packedFrame = dynamicAtlasManager.insertSpriteFrame(frame);
- if (packedFrame) {
- frame._setDynamicAtlasFrame(packedFrame);
- }
- }
- let material = comp._materials[0];
- if (!material) return;
-
- if (material.getProperty('texture') !== frame._texture) {
- // texture was packed to dynamic atlas, should update uvs
- comp._vertsDirty = true;
- comp._updateMaterial();
+ updateTexId(comp) {
+ const texId = comp._texId;
+ let texIdOffset = this.texIdOffset;
+ let floatsPerVert = this.floatsPerVert;
+ let verts = this._renderData.vDatas[0];
+ for (let i = 0, l = verts.length; i < l; i++) {
+ verts[floatsPerVert * i + texIdOffset] = texId;
}
}
}
@@ -159,6 +150,8 @@ cc.js.addon(Assembler2D.prototype, {
uvOffset: 2,
colorOffset: 4,
+
+ isMulti: false,
});
cc.Assembler2D = Assembler2D;
diff --git a/engine/cocos2d/core/renderer/assembler.js b/engine/cocos2d/core/renderer/assembler.js
index b2cafd0..a65088b 100644
--- a/engine/cocos2d/core/renderer/assembler.js
+++ b/engine/cocos2d/core/renderer/assembler.js
@@ -1,5 +1,6 @@
import { vfmtPosUvColor } from './webgl/vertex-format';
import assemblerPool from './assembler-pool';
+import dynamicAtlasManager from './utils/dynamic-atlas/manager';
export default class Assembler {
constructor () {
@@ -12,12 +13,64 @@ export default class Assembler {
updateRenderData (comp) {
}
+ updateRenderDataForSwitchMaterial(comp) {
+
+ }
+
fillBuffers (comp, renderer) {
}
getVfmt () {
return vfmtPosUvColor;
}
+
+ packDynamicAtlasAndCheckMaterial(comp, frame) {
+ if (CC_TEST) return false;
+
+ if (!frame._original && dynamicAtlasManager && frame._texture.packable) {
+ let packedFrame = dynamicAtlasManager.insertSpriteFrame(frame);
+ if (packedFrame) {
+ frame._setDynamicAtlasFrame(packedFrame);
+ }
+ }
+
+ const material = comp._materials[0];
+ if (!material) return false;
+
+ // 自动切换材质
+ if (this.checkAndSwitchMaterial(comp, frame._texture, material)) {
+ return true;
+ }
+
+ if (material.material.isMultiSupport()) {
+ comp._texIdDirty = true;
+ } else {
+ if (material.getProperty('texture') !== frame._texture) {
+ // texture was packed to dynamic atlas, should update uvs
+ comp._vertsDirty = true;
+ comp._updateMaterial();
+ }
+ }
+
+ return false;
+ }
+
+ checkAndSwitchMaterial(comp, texture, material) {
+ const autoSwitchMaterial = comp.autoSwitchMaterial;
+ if ((cc.sp.autoSwitchMaterial && autoSwitchMaterial === 0) || autoSwitchMaterial === 1) {
+ if (texture._multiMaterial) {
+ if (material.material !== texture._multiMaterial) {
+ comp.setMaterial(0, texture._multiMaterial);
+ // setMaterial 中会置 comp._texIdDirty = true;
+ if (!this.isMulti) {
+ comp._assembler.updateRenderDataForSwitchMaterial(comp);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
}
diff --git a/engine/cocos2d/core/renderer/utils/label/bmfont.js b/engine/cocos2d/core/renderer/utils/label/bmfont.js
index 0b91a27..57951a5 100644
--- a/engine/cocos2d/core/renderer/utils/label/bmfont.js
+++ b/engine/cocos2d/core/renderer/utils/label/bmfont.js
@@ -84,12 +84,32 @@ export default class BmfontAssembler extends Assembler2D {
_comp = comp;
this._reserveQuads(comp, comp.string.toString().length);
- this._updateFontFamily(comp);
+
+ const assemblerChanged = this._updateFontFamily(comp);
+
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ this._updateRenderData(comp);
+ }
+ }
+
+ _preUpdateRenderData(comp) {
+ _comp = comp;
+
+ this._reserveQuads(comp, comp.string.toString().length);
+
+ let fontAsset = comp.font;
+ _spriteFrame = fontAsset.spriteFrame;
+ _fntConfig = fontAsset._fntConfig;
+ shareLabelInfo.fontAtlas = fontAsset._fontDefDictionary;
+ }
+
+ _updateRenderData(comp) {
this._updateProperties(comp);
this._updateLabelInfo(comp);
this._updateContent();
this.updateWorldVerts(comp);
-
+
_comp._actualFontSize = _fontSize;
_comp.node.setContentSize(_contentSize);
@@ -108,7 +128,7 @@ export default class BmfontAssembler extends Assembler2D {
_fntConfig = fontAsset._fntConfig;
shareLabelInfo.fontAtlas = fontAsset._fontDefDictionary;
- this.packToDynamicAtlas(comp, _spriteFrame);
+ return this.packDynamicAtlasAndCheckMaterial(comp, _spriteFrame);
}
_updateLabelInfo() {
diff --git a/engine/cocos2d/core/renderer/utils/label/ttf.js b/engine/cocos2d/core/renderer/utils/label/ttf.js
index 56edd9b..9d85e3f 100644
--- a/engine/cocos2d/core/renderer/utils/label/ttf.js
+++ b/engine/cocos2d/core/renderer/utils/label/ttf.js
@@ -106,8 +106,15 @@ export default class TTFAssembler extends Assembler2D {
this._calculateLabelFont();
this._updateLabelDimensions();
this._updateTexture(comp);
- this._calDynamicAtlas(comp);
+ const assemblerChanged = this._calDynamicAtlas(comp);
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ this._updateRenderData(comp);
+ }
+ }
+
+ _updateRenderData(comp) {
comp._actualFontSize = _fontSize;
comp.node.setContentSize(_nodeContentSize);
@@ -336,14 +343,14 @@ export default class TTFAssembler extends Assembler2D {
}
_calDynamicAtlas (comp) {
- if(comp.cacheMode !== Label.CacheMode.BITMAP) return;
+ if(comp.cacheMode !== Label.CacheMode.BITMAP) return false;
let frame = comp._frame;
// Delete cache in atlas.
deleteFromDynamicAtlas(comp, frame);
if (!frame._original) {
frame.setRect(cc.rect(0, 0, _canvas.width, _canvas.height));
}
- this.packToDynamicAtlas(comp, frame);
+ return this.packDynamicAtlasAndCheckMaterial(comp, frame);
}
_updateLabelDimensions () {
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/index.js b/engine/cocos2d/core/renderer/webgl/assemblers/index.js
index 4ffbc1c..e24a556 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/index.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/index.js
@@ -24,9 +24,10 @@
****************************************************************************/
cc.assemblers = {};
-
+
require('./sprite');
require('./mask-assembler');
require('./graphics');
require('./label');
require('./motion-streak');
+require('./motion-streak-multi');
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/bmfont.js b/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/bmfont.js
new file mode 100644
index 0000000..3fe3d2e
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/bmfont.js
@@ -0,0 +1,71 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import WebglBmfontAssembler from '../2d/bmfont';
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+
+export default class MultiWebglBmfontAssembler extends WebglBmfontAssembler {
+ initData () {
+ let data = this._renderData;
+ data.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData(comp) {
+ super.updateRenderData(comp);
+
+ if (comp._texIdDirty) {
+ comp._updateMultiTexId(comp.getMaterial(0), comp._frame._texture);
+ }
+
+ // 不进行 Dirty 判断,文本可能会变化,但是纹理不会变
+ this.updateTexId(comp);
+ comp._texIdDirty = false;
+ }
+
+ updateRenderDataForSwitchMaterial(comp) {
+ super._preUpdateRenderData(comp);
+ super._updateRenderData(comp);
+
+ if (comp._texIdDirty) {
+ comp._updateMultiTexId(comp.getMaterial(0), comp._frame._texture);
+ }
+
+ // 不进行 Dirty 判断,文本可能会变化,但是纹理不会变
+ this.updateTexId(comp);
+ comp._texIdDirty = false;
+ }
+}
+
+MultiWebglBmfontAssembler.prototype.floatsPerVert = 6;
+MultiWebglBmfontAssembler.prototype.texIdOffset = 5;
+MultiWebglBmfontAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/ttf.js b/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/ttf.js
new file mode 100644
index 0000000..4e63a79
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/label/2d-multi/ttf.js
@@ -0,0 +1,72 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import WebglTTFAssembler from '../2d/ttf';
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+
+export default class MultiWebglTTFAssembler extends WebglTTFAssembler {
+ initData() {
+ let data = this._renderData;
+ data.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());
+ const indices = data.iDatas[0];
+ data.initQuadIndices(indices);
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData(comp) {
+ super.updateRenderData(comp);
+
+ if (comp._texIdDirty) {
+ comp._updateMultiTexId(comp.getMaterial(0), comp._frame._texture);
+ }
+
+ // 不进行 Dirty 判断,文本可能会变化,但是纹理不会变
+ this.updateTexId(comp);
+ comp._texIdDirty = false;
+ }
+
+ updateRenderDataForSwitchMaterial(comp) {
+ super._updateRenderData(comp);
+
+ if (comp._texIdDirty) {
+ comp._updateMultiTexId(comp.getMaterial(0), comp._frame._texture);
+ }
+
+ // 不进行 Dirty 判断,文本可能会变化,但是纹理不会变
+ this.updateTexId(comp);
+ comp._texIdDirty = false;
+ }
+}
+
+MultiWebglTTFAssembler.prototype.floatsPerVert = 6;
+MultiWebglTTFAssembler.prototype.texIdOffset = 5;
+MultiWebglTTFAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/label/index.js b/engine/cocos2d/core/renderer/webgl/assemblers/label/index.js
index ad2d511..5e3da64 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/label/index.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/label/index.js
@@ -34,6 +34,9 @@ import TTF3D from './3d/ttf';
import Bmfont3D from './3d/bmfont';
import Letter3D from './3d/letter';
+import TTFMulti from './2d-multi/ttf';
+import BmfontMulti from './2d-multi/bmfont';
+
let NativeTTF = undefined;
if(CC_JSB) {
NativeTTF = require("./2d/nativeTTF");
@@ -69,10 +72,13 @@ Label._canvasPool = {
Assembler.register(cc.Label, {
getConstructor(label) {
let is3DNode = label.node.is3DNode;
- let ctor = is3DNode ? TTF3D : TTF;
+ const material = label.getMaterials()[0];
+ let isMultiMaterial = material && material.material.isMultiSupport();
+
+ let ctor = is3DNode ? TTF3D : (isMultiMaterial ? TTFMulti : TTF);
if (label.font instanceof cc.BitmapFont) {
- ctor = is3DNode ? Bmfont3D : Bmfont;
+ ctor = is3DNode ? Bmfont3D : (isMultiMaterial ? BmfontMulti : Bmfont);
} else if (label.cacheMode === Label.CacheMode.CHAR) {
if(CC_JSB && !is3DNode && !!jsb.LabelRenderer && label.font instanceof cc.TTFFont && label._useNativeTTF()){
@@ -94,5 +100,8 @@ Assembler.register(cc.Label, {
TTF3D,
Bmfont3D,
Letter3D,
- NativeTTF
+ NativeTTF,
+
+ TTFMulti,
+ BmfontMulti
});
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak-multi.js b/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak-multi.js
new file mode 100644
index 0000000..5a41c3b
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak-multi.js
@@ -0,0 +1,233 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import MotionStreakAssembler from "./motion-streak";
+import { vfmtPosUvColorTexId } from '../../webgl/vertex-format';
+const MotionStreak = require('../../../components/CCMotionStreak');
+const RenderFlow = require('../../render-flow');
+
+function Point(point, dir) {
+ this.point = point || cc.v2();
+ this.dir = dir || cc.v2();
+ this.distance = 0;
+ this.time = 0;
+}
+
+Point.prototype.setPoint = function (x, y) {
+ this.point.x = x;
+ this.point.y = y;
+};
+
+Point.prototype.setDir = function (x, y) {
+ this.dir.x = x;
+ this.dir.y = y;
+};
+
+let _normal = cc.v2();
+let _vec2 = cc.v2();
+
+function normal(out, dir) {
+ //get perpendicular
+ out.x = -dir.y;
+ out.y = dir.x;
+ return out
+}
+
+export default class MultiMotionStreakAssembler extends MotionStreakAssembler {
+ initData() {
+ this._renderData.createFlexData(0, 16, (16 - 2) * 3, this.getVfmt());
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ update(comp, dt) {
+ if (CC_EDITOR && !comp.preview) return;
+
+ let stroke = comp._stroke / 2;
+
+ let node = comp.node;
+ let matrix = node._worldMatrix.m;
+ let tx = matrix[12], ty = matrix[13];
+
+ let points = comp._points;
+
+ let cur;
+ if (points.length > 1) {
+ let difx = points[0].point.x - tx;
+ let dify = points[0].point.y - ty;
+ if ((difx * difx + dify * dify) < comp.minSeg) {
+ cur = points[0];
+ }
+ }
+
+ if (!cur) {
+ cur = new Point();
+ points.splice(0, 0, cur);
+ }
+
+ cur.setPoint(tx, ty);
+ cur.time = comp._fadeTime + dt;
+
+ let verticesCount = 0;
+ let indicesCount = 0;
+
+ if (points.length < 2) {
+ return;
+ }
+
+ let color = comp._color,
+ cr = color.r, cg = color.g, cb = color.b, ca = color.a;
+
+ let prev = points[1];
+ prev.distance = cur.point.sub(prev.point, _vec2).mag();
+ _vec2.normalizeSelf();
+ prev.setDir(_vec2.x, _vec2.y);
+ cur.setDir(_vec2.x, _vec2.y);
+
+ let flexBuffer = this._renderData._flexBuffer;
+ flexBuffer.reserve(points.length * 2, (points.length - 1) * 6);
+ let vData = flexBuffer.vData;
+ let uintVData = flexBuffer.uintVData;
+ let vertsOffset = 6;
+
+ let fadeTime = comp._fadeTime;
+ let findLast = false;
+ for (let i = points.length - 1; i >= 0; i--) {
+ let p = points[i];
+ let point = p.point;
+ let dir = p.dir;
+ p.time -= dt;
+
+ if (p.time < 0) {
+ points.splice(i, 1);
+ continue;
+ }
+
+ let progress = p.time / fadeTime;
+
+ let next = points[i - 1];
+ if (!findLast) {
+ if (!next) {
+ points.splice(i, 1);
+ continue;
+ }
+
+ point.x = next.point.x - dir.x * progress;
+ point.y = next.point.y - dir.y * progress;
+ }
+ findLast = true;
+
+ normal(_normal, dir);
+
+
+ let da = progress * ca;
+ let c = ((da << 24) >>> 0) + (cb << 16) + (cg << 8) + cr;
+
+ let offset = verticesCount * vertsOffset;
+
+ vData[offset] = point.x + _normal.x * stroke;
+ vData[offset + 1] = point.y + _normal.y * stroke;
+ vData[offset + 2] = 1;
+ vData[offset + 3] = progress;
+ uintVData[offset + 4] = c;
+ vData[offset + 5] = comp._texId;
+
+ offset += vertsOffset;
+
+ vData[offset] = point.x - _normal.x * stroke;
+ vData[offset + 1] = point.y - _normal.y * stroke;
+ vData[offset + 2] = 0;
+ vData[offset + 3] = progress;
+ uintVData[offset + 4] = c;
+ vData[offset + 5] = comp._texId;
+
+ verticesCount += 2;
+ }
+
+ indicesCount = verticesCount <= 2 ? 0 : (verticesCount - 2) * 3;
+
+ flexBuffer.used(verticesCount, indicesCount);
+ }
+
+ fillBuffers(comp, renderer) {
+ let { vData, usedVertices, usedIndices, usedVerticesFloats } = this._renderData._flexBuffer;
+
+ let buffer = this.getBuffer(renderer);
+ let offsetInfo = buffer.request(usedVertices, usedIndices);
+
+ // buffer data may be realloc, need get reference after request.
+
+ // fill vertices
+ let vertexOffset = offsetInfo.byteOffset >> 2,
+ vbuf = buffer._vData;
+
+ if (vData.length + vertexOffset > vbuf.length) {
+ vbuf.set(vData.subarray(0, usedVerticesFloats), vertexOffset);
+ }
+ else {
+ vbuf.set(vData, vertexOffset);
+ }
+
+ // fill indices
+ let ibuf = buffer._iData,
+ indiceOffset = offsetInfo.indiceOffset,
+ vertexId = offsetInfo.vertexOffset;
+
+ // index buffer
+ for (let i = 0, l = usedVertices; i < l; i += 2) {
+ let start = vertexId + i;
+ ibuf[indiceOffset++] = start;
+ ibuf[indiceOffset++] = start + 2;
+ ibuf[indiceOffset++] = start + 1;
+ ibuf[indiceOffset++] = start + 1;
+ ibuf[indiceOffset++] = start + 2;
+ ibuf[indiceOffset++] = start + 3;
+ }
+
+ comp.node._renderFlag |= RenderFlow.FLAG_UPDATE_RENDER_DATA;
+ }
+
+}
+
+MotionStreakAssembler.register(MotionStreak, {
+ getConstructor(comp) {
+ const material = comp.getMaterials()[0];
+ let isMultiMaterial = material && material.material.isMultiSupport();
+ return isMultiMaterial ? MultiMotionStreakAssembler : MotionStreakAssembler;
+ },
+
+ MotionStreakAssembler,
+ MultiMotionStreakAssembler
+});
+
+MultiMotionStreakAssembler.prototype.floatsPerVert = 6;
+MultiMotionStreakAssembler.prototype.texIdOffset = 5;
+MultiMotionStreakAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak.js b/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak.js
index d3161f8..8f40585 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/motion-streak.js
@@ -25,7 +25,6 @@
import Assembler2D from '../../assembler-2d';
-const MotionStreak = require('../../../components/CCMotionStreak');
const RenderFlow = require('../../render-flow');
function Point (point, dir) {
@@ -226,5 +225,3 @@ export default class MotionStreakAssembler extends Assembler2D {
comp.node._renderFlag |= RenderFlow.FLAG_UPDATE_RENDER_DATA;
}
}
-
-MotionStreakAssembler.register(MotionStreak, MotionStreakAssembler);
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/bar-filled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/bar-filled.js
new file mode 100644
index 0000000..7bbfb6c
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/bar-filled.js
@@ -0,0 +1,99 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import BarFilledAssembler from '../2d/bar-filled';
+
+export default class BarFilledAssemblerMulti extends BarFilledAssembler {
+ initData() {
+ let data = this._renderData;
+ data.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());
+ const indices = data.iDatas[0];
+ data.initQuadIndices(indices);
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData (sprite) {
+ super.updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ if (sprite._vertsDirty) {
+ let fillStart = sprite._fillStart;
+ let fillRange = sprite._fillRange;
+
+ if (fillRange < 0) {
+ fillStart += fillRange;
+ fillRange = -fillRange;
+ }
+
+ fillRange = fillStart + fillRange;
+
+ fillStart = fillStart > 1.0 ? 1.0 : fillStart;
+ fillStart = fillStart < 0.0 ? 0.0 : fillStart;
+
+ fillRange = fillRange > 1.0 ? 1.0 : fillRange;
+ fillRange = fillRange < 0.0 ? 0.0 : fillRange;
+ fillRange = fillRange - fillStart;
+ fillRange = fillRange < 0 ? 0 : fillRange;
+
+ let fillEnd = fillStart + fillRange;
+ fillEnd = fillEnd > 1 ? 1 : fillEnd;
+
+ this.updateUVs(sprite, fillStart, fillEnd);
+ this.updateVerts(sprite, fillStart, fillEnd);
+
+ sprite._vertsDirty = false;
+ }
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+
+}
+
+BarFilledAssemblerMulti.prototype.floatsPerVert = 6;
+BarFilledAssemblerMulti.prototype.texIdOffset = 5;
+BarFilledAssemblerMulti.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/mesh.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/mesh.js
new file mode 100644
index 0000000..1166031
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/mesh.js
@@ -0,0 +1,94 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import MeshSpriteAssembler from '../2d/mesh';
+
+export default class MultiMeshSpriteAssembler extends MeshSpriteAssembler {
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData(sprite) {
+ let frame = sprite.spriteFrame;
+
+ super.updateRenderData(sprite);
+
+ if (frame) {
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), frame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ let frame = sprite.spriteFrame;
+
+ if (frame) {
+ let vertices = frame.vertices;
+ if (vertices) {
+ this.verticesCount = vertices.x.length;
+ this.indicesCount = vertices.triangles.length;
+
+ let renderData = this._renderData;
+ let flexBuffer = renderData._flexBuffer;
+ if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
+ this.updateColor(sprite);
+ sprite._vertsDirty = true;
+ }
+ flexBuffer.used(this.verticesCount, this.indicesCount);
+
+ this.updateIndices(vertices.triangles);
+
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ this.updateWorldVerts(sprite);
+ sprite._vertsDirty = false;
+ }
+ }
+ }
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), frame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+}
+
+MultiMeshSpriteAssembler.prototype.floatsPerVert = 6;
+MultiMeshSpriteAssembler.prototype.texIdOffset = 5;
+MultiMeshSpriteAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/radial-filled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/radial-filled.js
new file mode 100644
index 0000000..70f18d4
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/radial-filled.js
@@ -0,0 +1,70 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import RadialFilledAssembler from '../2d/radial-filled';
+
+export default class MultiRadialFilledAssembler extends RadialFilledAssembler {
+ initData (sprite) {
+ this._renderData.createFlexData(0, 4, 6, this.getVfmt());
+ this.updateIndices();
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData (sprite) {
+ super.updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite.spriteFrame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ this._updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite.spriteFrame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+}
+
+MultiRadialFilledAssembler.prototype.floatsPerVert = 6;
+MultiRadialFilledAssembler.prototype.texIdOffset = 5;
+MultiRadialFilledAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/simple.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/simple.js
new file mode 100644
index 0000000..6e91a55
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/simple.js
@@ -0,0 +1,76 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import SimpleSpriteAssembler from '../2d/simple';
+
+export default class MultiSimpleSpriteAssembler extends SimpleSpriteAssembler {
+ initData() {
+ let data = this._renderData;
+ data.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());
+ const indices = data.iDatas[0];
+ data.initQuadIndices(indices);
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData (sprite) {
+ super.updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+}
+
+MultiSimpleSpriteAssembler.prototype.floatsPerVert = 6;
+MultiSimpleSpriteAssembler.prototype.texIdOffset = 5;
+MultiSimpleSpriteAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/sliced.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/sliced.js
new file mode 100644
index 0000000..ec51f02
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/sliced.js
@@ -0,0 +1,89 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import SlicedAssembler from '../2d/sliced';
+
+export default class MultiSlicedAssembler extends SlicedAssembler {
+ initData (sprite) {
+ if (this._renderData.meshCount > 0) return;
+ this._renderData.createFlexData(0, this.verticesCount, this.indicesCount, this.getVfmt());
+
+ let indices = this._renderData.iDatas[0];
+ let indexOffset = 0;
+ for (let r = 0; r < 3; ++r) {
+ for (let c = 0; c < 3; ++c) {
+ let start = r * 4 + c;
+ indices[indexOffset++] = start;
+ indices[indexOffset++] = start + 1;
+ indices[indexOffset++] = start + 4;
+ indices[indexOffset++] = start + 1;
+ indices[indexOffset++] = start + 5;
+ indices[indexOffset++] = start + 4;
+ }
+ }
+ }
+
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData (sprite) {
+ super.updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite._spriteFrame._texture);
+ if (sprite._texIdDirty) {
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+ }
+ }
+
+}
+
+MultiSlicedAssembler.prototype.floatsPerVert = 6;
+MultiSlicedAssembler.prototype.texIdOffset = 5;
+MultiSlicedAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/tiled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/tiled.js
new file mode 100644
index 0000000..9b170b2
--- /dev/null
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d-multi/tiled.js
@@ -0,0 +1,99 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ https://www.cocos.com/
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ 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.
+ ****************************************************************************/
+
+import { vfmtPosUvColorTexId } from '../../../../webgl/vertex-format';
+import TiledAssembler from '../2d/tiled';
+
+export default class MultiTiledAssembler extends TiledAssembler {
+ getVfmt() {
+ return vfmtPosUvColorTexId;
+ }
+
+ getBuffer() {
+ return cc.renderer._handle.getBuffer("mesh", this.getVfmt());
+ }
+
+ updateRenderData(sprite) {
+ super.updateRenderData(sprite);
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite.spriteFrame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+
+ updateRenderDataForSwitchMaterial(sprite) {
+ let frame = sprite._spriteFrame;
+ let node = sprite.node;
+
+ let contentWidth = this.contentWidth = Math.abs(node.width);
+ let contentHeight = this.contentHeight = Math.abs(node.height);
+ let rect = frame._rect;
+ let leftWidth = frame.insetLeft, rightWidth = frame.insetRight, centerWidth = rect.width - leftWidth - rightWidth,
+ topHeight = frame.insetTop, bottomHeight = frame.insetBottom, centerHeight = rect.height - topHeight - bottomHeight;
+ this.sizableWidth = contentWidth - leftWidth - rightWidth;
+ this.sizableHeight = contentHeight - topHeight - bottomHeight;
+ this.sizableWidth = this.sizableWidth > 0 ? this.sizableWidth : 0;
+ this.sizableHeight = this.sizableHeight > 0 ? this.sizableHeight : 0;
+ let hRepeat = this.hRepeat = centerWidth === 0 ? this.sizableWidth : this.sizableWidth / centerWidth;
+ let vRepeat = this.vRepeat = centerHeight === 0 ? this.sizableHeight : this.sizableHeight / centerHeight;
+ let row = this.row = Math.ceil(vRepeat + 2);
+ let col = this.col = Math.ceil(hRepeat + 2);
+
+ // update data property
+ let count = row * col;
+ this.verticesCount = count * 4;
+ this.indicesCount = count * 6;
+
+ let renderData = this._renderData;
+ let flexBuffer = renderData._flexBuffer;
+ if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
+ this._updateIndices();
+ this.updateColor(sprite);
+ }
+ flexBuffer.used(this.verticesCount, this.indicesCount);
+
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
+
+ if (sprite._texIdDirty) {
+ sprite._updateMultiTexId(sprite.getMaterial(0), sprite.spriteFrame._texture);
+ }
+
+ // 不进行 Dirty 判断Mesh 可能会变化,但是纹理不会变
+ this.updateTexId(sprite);
+ sprite._texIdDirty = false;
+ }
+}
+
+MultiTiledAssembler.prototype.floatsPerVert = 6;
+MultiTiledAssembler.prototype.texIdOffset = 5;
+MultiTiledAssembler.prototype.isMulti = true;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/bar-filled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/bar-filled.js
index 34d8af7..5622c2e 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/bar-filled.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/bar-filled.js
@@ -31,37 +31,38 @@ const FillType = Sprite.FillType;
export default class BarFilledAssembler extends Assembler2D {
updateRenderData (sprite) {
let frame = sprite._spriteFrame;
- this.packToDynamicAtlas(sprite, frame);
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, frame);
- if (!sprite._vertsDirty) {
- return;
- }
-
- let fillStart = sprite._fillStart;
- let fillRange = sprite._fillRange;
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ if (sprite._vertsDirty) {
+ let fillStart = sprite._fillStart;
+ let fillRange = sprite._fillRange;
- if (fillRange < 0) {
- fillStart += fillRange;
- fillRange = -fillRange;
- }
+ if (fillRange < 0) {
+ fillStart += fillRange;
+ fillRange = -fillRange;
+ }
- fillRange = fillStart + fillRange;
+ fillRange = fillStart + fillRange;
- fillStart = fillStart > 1.0 ? 1.0 : fillStart;
- fillStart = fillStart < 0.0 ? 0.0 : fillStart;
+ fillStart = fillStart > 1.0 ? 1.0 : fillStart;
+ fillStart = fillStart < 0.0 ? 0.0 : fillStart;
- fillRange = fillRange > 1.0 ? 1.0 : fillRange;
- fillRange = fillRange < 0.0 ? 0.0 : fillRange;
- fillRange = fillRange - fillStart;
- fillRange = fillRange < 0 ? 0 : fillRange;
+ fillRange = fillRange > 1.0 ? 1.0 : fillRange;
+ fillRange = fillRange < 0.0 ? 0.0 : fillRange;
+ fillRange = fillRange - fillStart;
+ fillRange = fillRange < 0 ? 0 : fillRange;
- let fillEnd = fillStart + fillRange;
- fillEnd = fillEnd > 1 ? 1 : fillEnd;
+ let fillEnd = fillStart + fillRange;
+ fillEnd = fillEnd > 1 ? 1 : fillEnd;
- this.updateUVs(sprite, fillStart, fillEnd);
- this.updateVerts(sprite, fillStart, fillEnd);
+ this.updateUVs(sprite, fillStart, fillEnd);
+ this.updateVerts(sprite, fillStart, fillEnd);
- sprite._vertsDirty = false;
+ sprite._vertsDirty = false;
+ }
+ }
}
updateUVs (sprite, fillStart, fillEnd) {
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/mesh.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/mesh.js
index a2571ca..8b8b934 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/mesh.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/mesh.js
@@ -31,30 +31,34 @@ export default class MeshSpriteAssembler extends Assembler2D {
}
updateRenderData (sprite) {
- this.packToDynamicAtlas(sprite, sprite._spriteFrame);
-
let frame = sprite.spriteFrame;
- if (frame) {
- let vertices = frame.vertices;
- if (vertices) {
- this.verticesCount = vertices.x.length;
- this.indicesCount = vertices.triangles.length;
-
- let renderData = this._renderData;
- let flexBuffer = renderData._flexBuffer;
- if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
- this.updateColor(sprite);
- sprite._vertsDirty = true;
- }
- flexBuffer.used(this.verticesCount, this.indicesCount);
-
- this.updateIndices(vertices.triangles);
- if (sprite._vertsDirty) {
- this.updateUVs(sprite);
- this.updateVerts(sprite);
- this.updateWorldVerts(sprite);
- sprite._vertsDirty = false;
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, frame);
+
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ if (frame) {
+ let vertices = frame.vertices;
+ if (vertices) {
+ this.verticesCount = vertices.x.length;
+ this.indicesCount = vertices.triangles.length;
+
+ let renderData = this._renderData;
+ let flexBuffer = renderData._flexBuffer;
+ if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
+ this.updateColor(sprite);
+ sprite._vertsDirty = true;
+ }
+ flexBuffer.used(this.verticesCount, this.indicesCount);
+
+ this.updateIndices(vertices.triangles);
+
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ this.updateWorldVerts(sprite);
+ sprite._vertsDirty = false;
+ }
}
}
}
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/radial-filled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/radial-filled.js
index 6bedde3..da5342d 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/radial-filled.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/radial-filled.js
@@ -179,7 +179,16 @@ export default class RadialFilledAssembler extends Assembler2D {
super.updateRenderData(sprite);
let frame = sprite.spriteFrame;
- this.packToDynamicAtlas(sprite, frame);
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, frame);
+
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ this._updateRenderData(sprite);
+ }
+ }
+
+ _updateRenderData(sprite) {
+ let frame = sprite.spriteFrame;
if (sprite._vertsDirty) {
let fillStart = sprite._fillStart;
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/simple.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/simple.js
index 939e7b1..178b70a 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/simple.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/simple.js
@@ -27,12 +27,15 @@ import Assembler2D from '../../../../assembler-2d';
export default class SimpleSpriteAssembler extends Assembler2D {
updateRenderData (sprite) {
- this.packToDynamicAtlas(sprite, sprite._spriteFrame);
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, sprite._spriteFrame);
- if (sprite._vertsDirty) {
- this.updateUVs(sprite);
- this.updateVerts(sprite);
- sprite._vertsDirty = false;
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
}
}
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/sliced.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/sliced.js
index 9013a9b..69b3c4f 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/sliced.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/sliced.js
@@ -52,12 +52,15 @@ export default class SlicedAssembler extends Assembler2D {
updateRenderData (sprite) {
let frame = sprite._spriteFrame;
- this.packToDynamicAtlas(sprite, frame);
-
- if (sprite._vertsDirty) {
- this.updateUVs(sprite);
- this.updateVerts(sprite);
- sprite._vertsDirty = false;
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, frame);
+
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
}
}
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/tiled.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/tiled.js
index 5028e8b..b0c0296 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/tiled.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/2d/tiled.js
@@ -59,41 +59,44 @@ export default class TiledAssembler extends Assembler2D {
updateRenderData (sprite) {
let frame = sprite._spriteFrame;
- this.packToDynamicAtlas(sprite, frame);
+ const assemblerChanged = this.packDynamicAtlasAndCheckMaterial(sprite, frame);
- let node = sprite.node;
+ // 打包到动态图集时可能会切换 Assembler
+ if (!assemblerChanged) {
+ let node = sprite.node;
- let contentWidth = this.contentWidth = Math.abs(node.width);
- let contentHeight = this.contentHeight = Math.abs(node.height);
- let rect = frame._rect;
- let leftWidth = frame.insetLeft, rightWidth = frame.insetRight, centerWidth = rect.width - leftWidth - rightWidth,
- topHeight = frame.insetTop, bottomHeight = frame.insetBottom, centerHeight = rect.height - topHeight - bottomHeight;
- this.sizableWidth = contentWidth - leftWidth - rightWidth;
- this.sizableHeight = contentHeight - topHeight - bottomHeight;
- this.sizableWidth = this.sizableWidth > 0 ? this.sizableWidth : 0;
- this.sizableHeight = this.sizableHeight > 0 ? this.sizableHeight : 0;
- let hRepeat = this.hRepeat = centerWidth === 0 ? this.sizableWidth : this.sizableWidth / centerWidth;
- let vRepeat = this.vRepeat = centerHeight === 0 ? this.sizableHeight : this.sizableHeight / centerHeight;
- let row = this.row = Math.ceil(vRepeat + 2);
- let col = this.col = Math.ceil(hRepeat + 2);
+ let contentWidth = this.contentWidth = Math.abs(node.width);
+ let contentHeight = this.contentHeight = Math.abs(node.height);
+ let rect = frame._rect;
+ let leftWidth = frame.insetLeft, rightWidth = frame.insetRight, centerWidth = rect.width - leftWidth - rightWidth,
+ topHeight = frame.insetTop, bottomHeight = frame.insetBottom, centerHeight = rect.height - topHeight - bottomHeight;
+ this.sizableWidth = contentWidth - leftWidth - rightWidth;
+ this.sizableHeight = contentHeight - topHeight - bottomHeight;
+ this.sizableWidth = this.sizableWidth > 0 ? this.sizableWidth : 0;
+ this.sizableHeight = this.sizableHeight > 0 ? this.sizableHeight : 0;
+ let hRepeat = this.hRepeat = centerWidth === 0 ? this.sizableWidth : this.sizableWidth / centerWidth;
+ let vRepeat = this.vRepeat = centerHeight === 0 ? this.sizableHeight : this.sizableHeight / centerHeight;
+ let row = this.row = Math.ceil(vRepeat + 2);
+ let col = this.col = Math.ceil(hRepeat + 2);
- // update data property
- let count = row * col;
- this.verticesCount = count * 4;
- this.indicesCount = count * 6;
+ // update data property
+ let count = row * col;
+ this.verticesCount = count * 4;
+ this.indicesCount = count * 6;
- let renderData = this._renderData;
- let flexBuffer = renderData._flexBuffer;
- if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
- this._updateIndices();
- this.updateColor(sprite);
- }
- flexBuffer.used(this.verticesCount, this.indicesCount);
+ let renderData = this._renderData;
+ let flexBuffer = renderData._flexBuffer;
+ if (flexBuffer.reserve(this.verticesCount, this.indicesCount)) {
+ this._updateIndices();
+ this.updateColor(sprite);
+ }
+ flexBuffer.used(this.verticesCount, this.indicesCount);
- if (sprite._vertsDirty) {
- this.updateUVs(sprite);
- this.updateVerts(sprite);
- sprite._vertsDirty = false;
+ if (sprite._vertsDirty) {
+ this.updateUVs(sprite);
+ this.updateVerts(sprite);
+ sprite._vertsDirty = false;
+ }
}
}
diff --git a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/index.js b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/index.js
index 885ddc4..de11d9c 100644
--- a/engine/cocos2d/core/renderer/webgl/assemblers/sprite/index.js
+++ b/engine/cocos2d/core/renderer/webgl/assemblers/sprite/index.js
@@ -15,27 +15,36 @@ import RadialFilled3D from "./3d/radial-filled";
import BarFilled3D from "./3d/bar-filled";
import Mesh3D from './3d/mesh';
+import SimpleMulti from "./2d-multi/simple";
+import SlicedMulti from "./2d-multi/sliced";
+import TiledMulti from "./2d-multi/tiled";
+import RadialFilledMulti from "./2d-multi/radial-filled";
+import BarFilledMulti from "./2d-multi/bar-filled";
+import MeshMulti from "./2d-multi/mesh";
+
let ctor = {
getConstructor(sprite) {
let is3DNode = sprite.node.is3DNode;
+ const material = sprite.getMaterials()[0];
+ let isMultiMaterial = material && material.material.isMultiSupport();
- let ctor = is3DNode ? Simple3D : Simple;
+ let ctor = is3DNode ? Simple3D : (isMultiMaterial ? SimpleMulti : Simple);
switch (sprite.type) {
case Type.SLICED:
- ctor = is3DNode ? Sliced3D : Sliced;
+ ctor = is3DNode ? Sliced3D : (isMultiMaterial ? SlicedMulti : Sliced);
break;
case Type.TILED:
- ctor = is3DNode ? Tiled3D : Tiled;
+ ctor = is3DNode ? Tiled3D : (isMultiMaterial ? TiledMulti : Tiled);
break;
case Type.FILLED:
if (sprite._fillType === FillType.RADIAL) {
- ctor = is3DNode ? RadialFilled3D : RadialFilled;
+ ctor = is3DNode ? RadialFilled3D : (isMultiMaterial ? RadialFilledMulti : RadialFilled);
} else {
- ctor = is3DNode ? BarFilled3D : BarFilled;
+ ctor = is3DNode ? BarFilled3D : (isMultiMaterial ? BarFilledMulti : BarFilled);
}
break;
case Type.MESH:
- ctor = is3DNode ? Mesh3D : Mesh;
+ ctor = is3DNode ? Mesh3D : (isMultiMaterial ? MeshMulti : Mesh);
break;
}
@@ -55,6 +64,13 @@ let ctor = {
RadialFilled3D,
BarFilled3D,
Mesh3D,
+
+ SimpleMulti,
+ SlicedMulti,
+ TiledMulti,
+ RadialFilledMulti,
+ BarFilledMulti,
+ MeshMulti,
};
Assembler.register(cc.Sprite, ctor);
diff --git a/engine/cocos2d/core/renderer/webgl/vertex-format.js b/engine/cocos2d/core/renderer/webgl/vertex-format.js
index 53e817a..4a93586 100644
--- a/engine/cocos2d/core/renderer/webgl/vertex-format.js
+++ b/engine/cocos2d/core/renderer/webgl/vertex-format.js
@@ -41,6 +41,15 @@ var vfmtPosUvColor = new gfx.VertexFormat([
vfmtPosUvColor.name = 'vfmtPosUvColor';
gfx.VertexFormat.XY_UV_Color = vfmtPosUvColor;
+var vfmtPosUvColorTexId = new gfx.VertexFormat([
+ { name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
+ { name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
+ { name: gfx.ATTR_COLOR, type: gfx.ATTR_TYPE_UINT8, num: 4, normalize: true },
+ { name: gfx.ATTR_TEX_ID, type: gfx.ATTR_TYPE_FLOAT32, num: 1 },
+]);
+vfmtPosUvColorTexId.name = 'vfmtPosUvColorTexId';
+gfx.VertexFormat.XY_UV_Color_TexId = vfmtPosUvColorTexId;
+
var vfmtPosUvTwoColor = new gfx.VertexFormat([
{ name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
{ name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },
@@ -76,5 +85,6 @@ module.exports = {
vfmtPosUvTwoColor,
vfmtPosUv,
vfmtPosColor,
- vfmtPos
-};
\ No newline at end of file
+ vfmtPos,
+ vfmtPosUvColorTexId
+};
diff --git a/engine/cocos2d/renderer/gfx/enums.js b/engine/cocos2d/renderer/gfx/enums.js
index 9ecc685..69770ac 100644
--- a/engine/cocos2d/renderer/gfx/enums.js
+++ b/engine/cocos2d/renderer/gfx/enums.js
@@ -178,6 +178,7 @@ export const enums = {
ATTR_TEX_COORD6: 'a_texCoord6',
ATTR_TEX_COORD7: 'a_texCoord7',
ATTR_TEX_COORD8: 'a_texCoord8',
+ ATTR_TEX_ID: 'a_texId',
// vertex attribute type
@@ -360,4 +361,4 @@ export function glTextureFmt(fmt) {
}
return result;
-}
\ No newline at end of file
+}
diff --git a/engine/modules.json b/engine/modules.json
index 4c1da42..71b0b44 100644
--- a/engine/modules.json
+++ b/engine/modules.json
@@ -164,7 +164,8 @@
"name": "MotionStreak",
"entries": [
"./cocos2d/core/components/CCMotionStreak.js",
- "./cocos2d/core/renderer/webgl/assemblers/motion-streak.js"
+ "./cocos2d/core/renderer/webgl/assemblers/motion-streak.js",
+ "./cocos2d/core/renderer/webgl/assemblers/motion-streak-multi.js"
],
"dependencies": ["WebGL Renderer"]
},
--
2.32.0 (Apple Git-132)