diff --git a/extension/i18n/en.js b/extension/i18n/en.js
new file mode 100644
index 00000000..589e96a5
--- /dev/null
+++ b/extension/i18n/en.js
@@ -0,0 +1,4 @@
+module.exports = {
+ 'settingsmenuname': 'Enhance Kit Settings...',
+ 'settings_title': 'Enhance Kit Settings',
+};
diff --git a/extension/i18n/zh.js b/extension/i18n/zh.js
new file mode 100644
index 00000000..bd514a7d
--- /dev/null
+++ b/extension/i18n/zh.js
@@ -0,0 +1,4 @@
+module.exports = {
+ 'settingsmenuname': '增强包设置...',
+ 'settings_title': '增强包设置',
+};
diff --git a/extension/inspectors/comps/label.js b/extension/inspectors/comps/label.js
new file mode 100644
index 00000000..15e476dc
--- /dev/null
+++ b/extension/inspectors/comps/label.js
@@ -0,0 +1,129 @@
+"use strict";
+Vue.component("cc-label", {
+ dependencies: ["packages://inspector/share/blend.js"],
+ template: `
+
+
+
+
+
+
+ :multi-values="multi"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ props: {
+ target: {
+ twoWay: !0,
+ type: Object
+ },
+ multi: {
+ type: Boolean
+ }
+ },
+ methods: {
+ T: Editor.T,
+ _isBMFont() {
+ return this.target._bmFontOriginalSize.value > 0
+ },
+ _isSystemFont() {
+ return this.target.useSystemFont.value
+ },
+ _hiddenWrapText() {
+ let t = this.target.overflow.value;
+ return 0 === t || 3 === t
+ },
+ _hiddenActualFontSize() {
+ return 2 !== this.target.overflow.value
+ },
+ _isCharCacheMode() {
+ return 2 === this.target.cacheMode.value
+ },
+ }
+});
diff --git a/extension/inspectors/comps/richtext.js b/extension/inspectors/comps/richtext.js
new file mode 100644
index 00000000..568e2679
--- /dev/null
+++ b/extension/inspectors/comps/richtext.js
@@ -0,0 +1,73 @@
+"use strict";
+Vue.component("cc-richtext", {
+ template: `
+
+
+
+ :multi-values="multi"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ props: {
+ target: {
+ twoWay: !0,
+ type: Object
+ },
+ multi: {
+ type: Boolean
+ }
+ },
+ methods: {
+ T: Editor.T,
+ _isSystemFont() {
+ return this.target.useSystemFont.value
+ },
+ _isCharCacheMode() {
+ return 2 === this.target.cacheMode.value
+ },
+ }
+});
diff --git a/extension/inspectors/comps/sprite.js b/extension/inspectors/comps/sprite.js
new file mode 100644
index 00000000..30b36cf1
--- /dev/null
+++ b/extension/inspectors/comps/sprite.js
@@ -0,0 +1,155 @@
+"use strict";
+Vue.component("cc-sprite", {
+ dependencies: ["packages://inspector/share/blend.js"],
+ template: `
+
+
+
+ {{T('COMPONENT.sprite.select_button')}}
+
+
+
+
+
+
+ {{T('COMPONENT.sprite.edit_button')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ props: {
+ target: {
+ twoWay: !0,
+ type: Object
+ },
+ multi: {
+ twoWay: !0,
+ type: Boolean
+ }
+ },
+ data: ()=>({
+ atlasUuid: "",
+ atlasUuids: "",
+ atlasMulti: !1,
+ spriteUuid: "",
+ spriteUuids: "",
+ spriteMulti: !1
+ }),
+ created() {
+ this.target && (this._updateAtlas(),
+ this._updateSprite())
+ },
+ watch: {
+ target() {
+ this._updateAtlas(),
+ this._updateSprite()
+ }
+ },
+ methods: {
+ T: Editor.T,
+ selectAtlas() {
+ Editor.Ipc.sendToPanel("assets", "change-filter", "t:sprite-atlas")
+ },
+ editSprite() {
+ Editor.Panel.open("sprite-editor", {
+ uuid: this.target.spriteFrame.value.uuid
+ })
+ },
+ allowTrim() {
+ return this.target.type.value === cc.Sprite.Type.SIMPLE
+ },
+ isFilledType() {
+ return this.target.type.value === cc.Sprite.Type.FILLED
+ },
+ isRadialFilled() {
+ return this.target.fillType.value === cc.Sprite.FillType.RADIAL
+ },
+ _updateAtlas() {
+ if (!this.target)
+ return this.atlasUuid = "",
+ this.atlasUuids = "",
+ this.atlasMulti = !1,
+ void 0;
+ this.atlasUuid = this.target._atlas.value.uuid,
+ this.atlasUuids = this.target._atlas.values.map(t=>t.uuid);
+ var t = this.atlasUuids[0];
+ this.atlasMulti = !this.atlasUuids.every((i,e)=>0 === e || i === t)
+ },
+ _updateSprite() {
+ if (!this.target)
+ return this.spriteUuid = "",
+ this.spriteUuids = "",
+ this.spriteMulti = !1,
+ void 0;
+ this.spriteUuid = this.target.spriteFrame.value.uuid,
+ this.spriteUuids = this.target.spriteFrame.values.map(t=>t.uuid);
+ var t = this.spriteUuids[0];
+ this.spriteMulti = !this.spriteUuids.every((i,e)=>0 === e || i === t)
+ }
+ }
+});
diff --git a/extension/inspectors/comps/tiled-layer.js b/extension/inspectors/comps/tiled-layer.js
new file mode 100644
index 00000000..99993394
--- /dev/null
+++ b/extension/inspectors/comps/tiled-layer.js
@@ -0,0 +1,15 @@
+"use strict";
+Vue.component("cc-tiled-layer", {
+ dependencies: ["packages://inspector/share/blend.js"],
+ template: '\n \n\n ',
+ props: {
+ target: {
+ twoWay: !0,
+ type: Object
+ },
+ multi: {
+ twoWay: !0,
+ type: Boolean
+ }
+ }
+});
diff --git a/extension/main.js b/extension/main.js
new file mode 100644
index 00000000..e7bd8637
--- /dev/null
+++ b/extension/main.js
@@ -0,0 +1,136 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+
+/**
+ * 环境信息
+ */
+let engineEditorPath = path.dirname(path.dirname(Editor.frameworkPath));
+
+const engineMinigameAdapterPath = path.join(engineEditorPath, "builtin", "adapters");
+const engineWechatMinigameWorkerMainMacroPath = path.join(engineEditorPath, "builtin", "adapters", "platforms/wechat/worker/macro.js");
+const engineWechatMinigameWorkerSubMacroPath = path.join(engineEditorPath, "builtin", "adapters", "platforms/wechat/res/workers/macro.js");
+
+const WECHAT_MINIGAME_WORKER_SUB_PATH = "platforms/wechat/res/workers";
+const WECHAT_MINIGAME_CONFIG_PATH = "platforms/wechat/res/game.json";
+
+function t(str) {
+ return Editor.T('enhance-kit.' + str);
+}
+
+function getMinigameAdapterVersion() {
+ try {
+ return fs.readFileSync(path.join(engineMinigameAdapterPath, "VERSION.md"), { encoding: "utf-8" }).trim();
+ } catch (error) {
+ // Editor.error(error);
+ return "";
+ }
+}
+
+function getSettings() {
+ const minigameVersion = getMinigameAdapterVersion();
+ const isUninstalled = minigameVersion === "";
+ const isSupported = !isUninstalled && Number(minigameVersion.split(".")[0]) >= 2;
+ if (isUninstalled) {
+ return { code: -1, errMsg: "请先安装增强包。" };
+ } else if (!isSupported) {
+ return { code: -2, errMsg: "需安装版本 >= 2.0.0 的增强包,以支持设置面板功能。" };
+ } else {
+ const content = fs.readFileSync(engineWechatMinigameWorkerMainMacroPath, { encoding: "utf-8" });
+
+ return {
+ code: 0,
+ CC_WORKER_DEBUG: getMacroBooleanValue(content, "CC_WORKER_DEBUG"),
+ CC_WORKER_ASSET_PIPELINE: getMacroBooleanValue(content, "CC_WORKER_ASSET_PIPELINE"),
+ CC_WORKER_AUDIO_SYSTEM: getMacroBooleanValue(content, "CC_WORKER_AUDIO_SYSTEM"),
+ CC_WORKER_SCHEDULER: getMacroBooleanValue(content, "CC_WORKER_SCHEDULER"),
+ };
+ }
+}
+
+function syncSettingsToSubWorker() {
+ const result = getSettings();
+ if (result.code === 0) {
+ let content = fs.readFileSync(engineWechatMinigameWorkerSubMacroPath, { encoding: "utf-8" });
+
+ for (const key in result) {
+ if (key !== "code") {
+ content = setMacroBooleanValue(content, key, result[key]);
+ }
+ }
+
+ fs.writeFileSync(engineWechatMinigameWorkerSubMacroPath, content);
+ }
+}
+
+function setSettings(macro, value) {
+ {
+ const content = fs.readFileSync(engineWechatMinigameWorkerMainMacroPath, { encoding: "utf-8" });
+ fs.writeFileSync(engineWechatMinigameWorkerMainMacroPath, setMacroBooleanValue(content, macro, value));
+ }
+
+ checkAndModifyWorkerFiles();
+ syncSettingsToSubWorker();
+}
+
+function getMacroBooleanValue(text, macro) {
+ const regex = new RegExp(`globalThis\\.${macro}\\s*=\\s*(true|false);`);
+ const match = text.match(regex);
+ return match ? match[1] === 'true' : null;
+}
+
+function setMacroBooleanValue(text, macro, value) {
+ const regex = new RegExp(`globalThis\\.${macro}\\s*=\\s*(true|false);`);
+ const replacement = `globalThis.${macro} = ${value};`;
+ return text.replace(regex, replacement);
+}
+
+function checkAndModifyWorkerFiles() {
+ const result = getSettings();
+ if (result.code === 0) {
+ const workerDir = path.join(engineMinigameAdapterPath, WECHAT_MINIGAME_WORKER_SUB_PATH);
+ const gameJsonPath = path.join(engineMinigameAdapterPath, WECHAT_MINIGAME_CONFIG_PATH);
+ const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, { encoding: "utf-8" }));
+
+ // 是否启用 Worker
+ if (result.CC_WORKER_ASSET_PIPELINE || result.CC_WORKER_AUDIO_SYSTEM) {
+ // 没有 Worker 目录与配置的话提醒用户重新安装
+ if (!(gameJson.workers && fs.existsSync(workerDir))) {
+ Editor.error("你启用了增强包的多线程特性,但未检测到正确的 workers 目录与 game.json 字段,请重新安装增强包,详情请查看文档:TODO");
+ }
+ } else {
+ Editor.warn("你禁用了增强包的多线程特性,可以手动删除相关文件以减少包体大小,详情请查看文档:TODO");
+ }
+ }
+}
+
+
+module.exports = {
+
+ async load() {
+ // 这里场景未准备就绪,无法获取 engineVersion
+ },
+
+ messages: {
+
+ openSettings() {
+ Editor.Panel.open('enhance-kit');
+ },
+
+ getSettings(event) {
+ const result = getSettings();
+ event.reply(null, result);
+ },
+
+ setSettings(event, macro, value) {
+ setSettings(macro, value);
+ event.reply(null);
+ },
+
+ "scene:ready"(event) {
+ checkAndModifyWorkerFiles();
+ },
+
+ },
+
+};
diff --git a/extension/package.json b/extension/package.json
new file mode 100644
index 00000000..e11cfd80
--- /dev/null
+++ b/extension/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "enhance-kit",
+ "version": "2.0.0",
+ "description": "This extension provides support for cocos enhance kit.",
+ "author": "SmallMain",
+ "main": "main.js",
+ "panel": {
+ "main": "panel/index.js",
+ "type": "dockable",
+ "title": "i18n:enhance-kit.settings_title",
+ "width": 500,
+ "height": 600,
+ "min-width": 500,
+ "min-height": 600
+ },
+ "main-menu": {
+ "i18n:MAIN_MENU.project.title/i18n:enhance-kit.settingsmenuname": {
+ "message": "enhance-kit:openSettings"
+ }
+ },
+ "runtime-resource": {
+ "path": "resources",
+ "name": "resources"
+ },
+ "reload": {
+ "ignore": [
+ "resources/**/*"
+ ]
+ }
+}
diff --git a/extension/panel/index.js b/extension/panel/index.js
new file mode 100644
index 00000000..188cfb28
--- /dev/null
+++ b/extension/panel/index.js
@@ -0,0 +1,101 @@
+Editor.Panel.extend({
+ style: `
+ :host { margin: 5px; }
+ h1 { margin-left: 15px; }
+ .desc { color: gray; margin-left: 15px; margin-right: 15px; }
+ .subdesc { color: gray; }
+ .sub { margin-left: 30px; margin-right: 30px; }
+ .hidden { display: none; }
+ `,
+
+ template: `
+
+
+
多线程支持
+
该特性仅在微信小游戏平台下有效。
+
+
+
请注意,以下为全局设置,会影响所有项目,并在重新安装升级或卸载后丢失所有设置。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+
+ $: {
+ unripe_area: '#unripe',
+ unripe_tip: '#unripe_tip',
+ ready_area: '#ready',
+ thread_debug: '#td',
+ thread_debug_checkbox: '#tdc',
+ thread_asset_pipeline: '#tap',
+ thread_asset_pipeline_checkbox: '#tapc',
+ thread_audio_system: '#fs',
+ thread_audio_system_checkbox: '#fsc',
+ thread_scheduler: '#ts',
+ thread_scheduler_checkbox: '#tsc',
+ },
+
+ ready() {
+ Editor.Ipc.sendToMain('enhance-kit:getSettings', (error, data) => {
+ if (error) {
+ this.$unripe_tip.textContent = '发生错误:' + String(error);
+ this.$unripe_tip.style.color = 'red';
+ return;
+ }
+
+ if (data.code === 0) {
+ this.$unripe_area.classList.add('hidden');
+ this.$ready_area.classList.remove('hidden');
+
+ this.$thread_debug_checkbox.checked = data.CC_WORKER_DEBUG;
+ this.$thread_asset_pipeline_checkbox.checked = data.CC_WORKER_ASSET_PIPELINE;
+ this.$thread_audio_system_checkbox.checked = data.CC_WORKER_AUDIO_SYSTEM;
+ this.$thread_scheduler_checkbox.checked = data.CC_WORKER_SCHEDULER;
+
+ this.$thread_debug_checkbox.addEventListener('change', () => {
+ this.setSettings("CC_WORKER_DEBUG", this.$thread_debug_checkbox.checked);
+ });
+
+ this.$thread_asset_pipeline_checkbox.addEventListener('change', () => {
+ this.setSettings("CC_WORKER_ASSET_PIPELINE", this.$thread_asset_pipeline_checkbox.checked);
+ });
+
+ this.$thread_audio_system_checkbox.addEventListener('change', () => {
+ this.setSettings("CC_WORKER_AUDIO_SYSTEM", this.$thread_audio_system_checkbox.checked);
+ });
+
+ this.$thread_scheduler_checkbox.addEventListener('change', () => {
+ this.setSettings("CC_WORKER_SCHEDULER", this.$thread_scheduler_checkbox.checked);
+ });
+ } else {
+ this.$unripe_tip.textContent = data.errMsg;
+ this.$unripe_tip.style.color = 'red';
+ }
+ }, 5000);
+ },
+
+ async setSettings(macro, value) {
+ return new Promise((resolve, reject) => {
+ Editor.Ipc.sendToMain('enhance-kit:setSettings', macro, value, (error) => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve();
+ }
+ }, 3000);
+ });
+ },
+});
diff --git a/extension/resources/sp.meta b/extension/resources/sp.meta
new file mode 100644
index 00000000..cdcd6b2b
--- /dev/null
+++ b/extension/resources/sp.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.1.2",
+ "uuid": "74663d94-6782-4dee-9db9-26127ee8b265",
+ "isBundle": true,
+ "bundleName": "",
+ "priority": 1,
+ "compressionType": {},
+ "optimizeHotUpdate": {},
+ "inlineSpriteFrames": {},
+ "isRemoteBundle": {},
+ "subMetas": {}
+}
\ No newline at end of file
diff --git a/extension/resources/sp/effects.meta b/extension/resources/sp/effects.meta
new file mode 100644
index 00000000..81bd1d8b
--- /dev/null
+++ b/extension/resources/sp/effects.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.1.2",
+ "uuid": "8ee63b7e-0ac8-4cb5-95f0-85278bfd748a",
+ "isBundle": false,
+ "bundleName": "",
+ "priority": 1,
+ "compressionType": {},
+ "optimizeHotUpdate": {},
+ "inlineSpriteFrames": {},
+ "isRemoteBundle": {},
+ "subMetas": {}
+}
\ No newline at end of file
diff --git a/extension/resources/sp/effects/multi-2d-universal.effect b/extension/resources/sp/effects/multi-2d-universal.effect
new file mode 100644
index 00000000..8354ecb8
--- /dev/null
+++ b/extension/resources/sp/effects/multi-2d-universal.effect
@@ -0,0 +1,152 @@
+// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+CCEffect %{
+ techniques:
+ - passes:
+ - vert: vs
+ frag: fs
+ blendState:
+ targets:
+ - blend: true
+ rasterizerState:
+ cullMode: none
+ properties:
+ texture: { value: white }
+ texture2: { value: white }
+ texture3: { value: white }
+ texture4: { value: white }
+ texture5: { value: white }
+ texture6: { value: white }
+ texture7: { value: white }
+ texture8: { value: white }
+ alphaThreshold: { value: 0.5 }
+}%
+
+
+CCProgram vs %{
+ precision highp float;
+
+ #include
+ #include
+
+ in vec3 a_position;
+ in vec4 a_color;
+ out vec4 v_color;
+
+ #if USE_TINT
+ in vec4 a_color0;
+ out vec4 v_color0;
+ #endif
+
+ #if USE_TEXTURE
+ in vec2 a_uv0;
+ out vec2 v_uv0;
+
+ #if USE_MULTI_TEXTURE
+ in float a_texId;
+ out float v_texId;
+ #endif
+
+ #endif
+
+ void main () {
+ vec4 pos = vec4(a_position, 1);
+
+ #if CC_USE_MODEL
+ pos = cc_matViewProj * cc_matWorld * pos;
+ #else
+ pos = cc_matViewProj * pos;
+ #endif
+
+ #if USE_TEXTURE
+ v_uv0 = a_uv0;
+
+ #if USE_MULTI_TEXTURE
+ v_texId = a_texId;
+ #endif
+
+ #endif
+
+ v_color = a_color;
+ #if USE_TINT
+ v_color0 = a_color0;
+ #endif
+
+ gl_Position = pos;
+ }
+}%
+
+
+CCProgram fs %{
+ precision highp float;
+
+ #include
+ #include
+
+ in vec4 v_color;
+
+ #if USE_TINT
+ in vec4 v_color0;
+ #endif
+
+ #if USE_TEXTURE
+ in vec2 v_uv0;
+ uniform sampler2D texture;
+
+ #if USE_MULTI_TEXTURE
+ in float v_texId;
+ uniform sampler2D texture2;
+ uniform sampler2D texture3;
+ uniform sampler2D texture4;
+ uniform sampler2D texture5;
+ uniform sampler2D texture6;
+ uniform sampler2D texture7;
+ uniform sampler2D texture8;
+ #endif
+
+ #endif
+
+ void main () {
+ vec4 o = vec4(1, 1, 1, 1);
+
+ #if USE_TEXTURE
+ #if USE_MULTI_TEXTURE
+ if(v_texId < 1.0){
+ CCTexture(texture, v_uv0, o);
+ } else if(v_texId < 2.0){
+ CCTexture(texture2, v_uv0, o);
+ } else if(v_texId < 3.0){
+ CCTexture(texture3, v_uv0, o);
+ } else if(v_texId < 4.0){
+ CCTexture(texture4, v_uv0, o);
+ } else if(v_texId < 5.0){
+ CCTexture(texture5, v_uv0, o);
+ } else if(v_texId < 6.0){
+ CCTexture(texture6, v_uv0, o);
+ } else if(v_texId < 7.0){
+ CCTexture(texture7, v_uv0, o);
+ } else {
+ CCTexture(texture8, v_uv0, o);
+ }
+ #else
+ CCTexture(texture, v_uv0, o);
+ #endif
+ #endif
+
+ #if USE_TINT
+ vec4 finalColor;
+ finalColor.a = v_color.a * o.a;
+ finalColor.rgb = ((o.a - 1.0) * v_color0.a + 1.0 - o.rgb) * v_color0.rgb + o.rgb * v_color.rgb;
+
+ ALPHA_TEST(finalColor);
+
+ gl_FragColor = finalColor;
+ #else
+ o *= v_color;
+
+ ALPHA_TEST(o);
+
+ gl_FragColor = o;
+ #endif
+ }
+}%
diff --git a/extension/resources/sp/effects/multi-2d-universal.effect.meta b/extension/resources/sp/effects/multi-2d-universal.effect.meta
new file mode 100644
index 00000000..300f4f02
--- /dev/null
+++ b/extension/resources/sp/effects/multi-2d-universal.effect.meta
@@ -0,0 +1,17 @@
+{
+ "ver": "1.0.25",
+ "uuid": "5dcffc18-b913-460e-a0d9-5d74f4cda12b",
+ "compiledShaders": [
+ {
+ "glsl1": {
+ "vert": "\nprecision highp float;\nuniform mat4 cc_matViewProj;\nuniform mat4 cc_matWorld;\nattribute vec3 a_position;\nattribute vec4 a_color;\nvarying vec4 v_color;\n#if USE_TEXTURE\nattribute vec2 a_uv0;\nvarying vec2 v_uv0;\nattribute float a_texId;\nvarying float v_texId;\n#endif\nvoid main () {\n vec4 pos = vec4(a_position, 1);\n #if CC_USE_MODEL\n pos = cc_matViewProj * cc_matWorld * pos;\n #else\n pos = cc_matViewProj * pos;\n #endif\n #if USE_TEXTURE\n v_uv0 = a_uv0;\n v_texId = a_texId;\n #endif\n v_color = a_color;\n gl_Position = pos;\n}",
+ "frag": "\nprecision highp float;\n#if USE_ALPHA_TEST\n uniform float alphaThreshold;\n#endif\nvoid ALPHA_TEST (in vec4 color) {\n #if USE_ALPHA_TEST\n if (color.a < alphaThreshold) discard;\n #endif\n}\nvoid ALPHA_TEST (in float alpha) {\n #if USE_ALPHA_TEST\n if (alpha < alphaThreshold) discard;\n #endif\n}\nvarying vec4 v_color;\n#if USE_TEXTURE\nvarying vec2 v_uv0;\nvarying float v_texId;\nuniform sampler2D texture;\nuniform sampler2D texture2;\nuniform sampler2D texture3;\nuniform sampler2D texture4;\nuniform sampler2D texture5;\nuniform sampler2D texture6;\nuniform sampler2D texture7;\nuniform sampler2D texture8;\n#endif\nvoid main () {\n vec4 o = vec4(1, 1, 1, 1);\n #if USE_TEXTURE\n if(v_texId < 1.0){\n vec4 texture_tmp = texture2D(texture, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture\n texture_tmp.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture_tmp.rgb * texture_tmp.rgb);\n o.a *= texture_tmp.a;\n #else\n o *= texture_tmp;\n #endif\n } else if(v_texId < 2.0){\n vec4 texture2_tmp = texture2D(texture2, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture2\n texture2_tmp.a *= texture2D(texture2, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture2_tmp.rgb * texture2_tmp.rgb);\n o.a *= texture2_tmp.a;\n #else\n o *= texture2_tmp;\n #endif\n } else if(v_texId < 3.0){\n vec4 texture3_tmp = texture2D(texture3, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture3\n texture3_tmp.a *= texture2D(texture3, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture3_tmp.rgb * texture3_tmp.rgb);\n o.a *= texture3_tmp.a;\n #else\n o *= texture3_tmp;\n #endif\n } else if(v_texId < 4.0){\n vec4 texture4_tmp = texture2D(texture4, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture4\n texture4_tmp.a *= texture2D(texture4, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture4_tmp.rgb * texture4_tmp.rgb);\n o.a *= texture4_tmp.a;\n #else\n o *= texture4_tmp;\n #endif\n } else if(v_texId < 5.0){\n vec4 texture5_tmp = texture2D(texture5, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture5\n texture5_tmp.a *= texture2D(texture5, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture5_tmp.rgb * texture5_tmp.rgb);\n o.a *= texture5_tmp.a;\n #else\n o *= texture5_tmp;\n #endif\n } else if(v_texId < 6.0){\n vec4 texture6_tmp = texture2D(texture6, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture6\n texture6_tmp.a *= texture2D(texture6, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture6_tmp.rgb * texture6_tmp.rgb);\n o.a *= texture6_tmp.a;\n #else\n o *= texture6_tmp;\n #endif\n } else if(v_texId < 7.0){\n vec4 texture7_tmp = texture2D(texture7, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture7\n texture7_tmp.a *= texture2D(texture7, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture7_tmp.rgb * texture7_tmp.rgb);\n o.a *= texture7_tmp.a;\n #else\n o *= texture7_tmp;\n #endif\n } else {\n vec4 texture8_tmp = texture2D(texture8, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture8\n texture8_tmp.a *= texture2D(texture8, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture8_tmp.rgb * texture8_tmp.rgb);\n o.a *= texture8_tmp.a;\n #else\n o *= texture8_tmp;\n #endif\n }\n #endif\n o *= v_color;\n ALPHA_TEST(o);\n gl_FragColor = o;\n}"
+ },
+ "glsl3": {
+ "vert": "\nprecision highp float;\nuniform CCGlobal {\n mat4 cc_matView;\n mat4 cc_matViewInv;\n mat4 cc_matProj;\n mat4 cc_matProjInv;\n mat4 cc_matViewProj;\n mat4 cc_matViewProjInv;\n vec4 cc_cameraPos;\n vec4 cc_time;\n mediump vec4 cc_screenSize;\n mediump vec4 cc_screenScale;\n};\nuniform CCLocal {\n mat4 cc_matWorld;\n mat4 cc_matWorldIT;\n};\nin vec3 a_position;\nin vec4 a_color;\nout vec4 v_color;\n#if USE_TEXTURE\nin vec2 a_uv0;\nout vec2 v_uv0;\nin float a_texId;\nout float v_texId;\n#endif\nvoid main () {\n vec4 pos = vec4(a_position, 1);\n #if CC_USE_MODEL\n pos = cc_matViewProj * cc_matWorld * pos;\n #else\n pos = cc_matViewProj * pos;\n #endif\n #if USE_TEXTURE\n v_uv0 = a_uv0;\n v_texId = a_texId;\n #endif\n v_color = a_color;\n gl_Position = pos;\n}",
+ "frag": "\nprecision highp float;\n#if USE_ALPHA_TEST\n uniform ALPHA_TEST {\n float alphaThreshold;\n };\n#endif\nvoid ALPHA_TEST (in vec4 color) {\n #if USE_ALPHA_TEST\n if (color.a < alphaThreshold) discard;\n #endif\n}\nvoid ALPHA_TEST (in float alpha) {\n #if USE_ALPHA_TEST\n if (alpha < alphaThreshold) discard;\n #endif\n}\nin vec4 v_color;\n#if USE_TEXTURE\nin vec2 v_uv0;\nin float v_texId;\nuniform sampler2D texture;\nuniform sampler2D texture2;\nuniform sampler2D texture3;\nuniform sampler2D texture4;\nuniform sampler2D texture5;\nuniform sampler2D texture6;\nuniform sampler2D texture7;\nuniform sampler2D texture8;\n#endif\nvoid main () {\n vec4 o = vec4(1, 1, 1, 1);\n #if USE_TEXTURE\n if(v_texId < 1.0){\n vec4 texture_tmp = texture(texture, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture\n texture_tmp.a *= texture(texture, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture_tmp.rgb * texture_tmp.rgb);\n o.a *= texture_tmp.a;\n #else\n o *= texture_tmp;\n #endif\n } else if(v_texId < 2.0){\n vec4 texture2_tmp = texture(texture2, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture2\n texture2_tmp.a *= texture(texture2, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture2_tmp.rgb * texture2_tmp.rgb);\n o.a *= texture2_tmp.a;\n #else\n o *= texture2_tmp;\n #endif\n } else if(v_texId < 3.0){\n vec4 texture3_tmp = texture(texture3, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture3\n texture3_tmp.a *= texture(texture3, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture3_tmp.rgb * texture3_tmp.rgb);\n o.a *= texture3_tmp.a;\n #else\n o *= texture3_tmp;\n #endif\n } else if(v_texId < 4.0){\n vec4 texture4_tmp = texture(texture4, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture4\n texture4_tmp.a *= texture(texture4, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture4_tmp.rgb * texture4_tmp.rgb);\n o.a *= texture4_tmp.a;\n #else\n o *= texture4_tmp;\n #endif\n } else if(v_texId < 5.0){\n vec4 texture5_tmp = texture(texture5, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture5\n texture5_tmp.a *= texture(texture5, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture5_tmp.rgb * texture5_tmp.rgb);\n o.a *= texture5_tmp.a;\n #else\n o *= texture5_tmp;\n #endif\n } else if(v_texId < 6.0){\n vec4 texture6_tmp = texture(texture6, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture6\n texture6_tmp.a *= texture(texture6, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture6_tmp.rgb * texture6_tmp.rgb);\n o.a *= texture6_tmp.a;\n #else\n o *= texture6_tmp;\n #endif\n } else if(v_texId < 7.0){\n vec4 texture7_tmp = texture(texture7, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture7\n texture7_tmp.a *= texture(texture7, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture7_tmp.rgb * texture7_tmp.rgb);\n o.a *= texture7_tmp.a;\n #else\n o *= texture7_tmp;\n #endif\n } else {\n vec4 texture8_tmp = texture(texture8, v_uv0);\n #if CC_USE_ALPHA_ATLAS_texture8\n texture8_tmp.a *= texture(texture8, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n o.rgb *= (texture8_tmp.rgb * texture8_tmp.rgb);\n o.a *= texture8_tmp.a;\n #else\n o *= texture8_tmp;\n #endif\n }\n #endif\n o *= v_color;\n ALPHA_TEST(o);\n gl_FragColor = o;\n}"
+ }
+ }
+ ],
+ "subMetas": {}
+}
\ No newline at end of file