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