diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..2cd0c603
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,42 @@
+#/////////////////////////////////////////////////////////////////////////////
+# npm files
+#/////////////////////////////////////////////////////////////////////////////
+
+npm-debug.log
+node_modules/
+package-lock.json
+
+#/////////////////////////////////////////////////////////////////////////////
+# OS generated files
+#/////////////////////////////////////////////////////////////////////////////
+
+.DS_Store
+ehthumbs.db
+Thumbs.db
+
+#/////////////////////////////////////////////////////////////////////////////
+# WebStorm files
+#/////////////////////////////////////////////////////////////////////////////
+
+.idea/
+
+#/////////////////////////////////////////////////////////////////////////////
+# VS Code files
+#/////////////////////////////////////////////////////////////////////////////
+
+.vscode/*
+!.vscode/settings.json
+!.vscode/launch.json
+!.vscode/**/*.code-snippets
+
+#/////////////////////////////////////////////////////////////////////////////
+# Temp files
+#/////////////////////////////////////////////////////////////////////////////
+
+temp
+
+#/////////////////////////////////////////////////////////////////////////////
+# 使用 Creator 调试时会为每个脚本生成 .meta 文件
+#/////////////////////////////////////////////////////////////////////////////
+
+**/*.meta
diff --git a/extension/service-pack-support/inspectors/comps/label.js b/extension/service-pack-support/inspectors/comps/label.js
new file mode 100644
index 00000000..15e476dc
--- /dev/null
+++ b/extension/service-pack-support/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/service-pack-support/inspectors/comps/richtext.js b/extension/service-pack-support/inspectors/comps/richtext.js
new file mode 100644
index 00000000..d2328806
--- /dev/null
+++ b/extension/service-pack-support/inspectors/comps/richtext.js
@@ -0,0 +1,70 @@
+"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
+ }
+ }
+});
diff --git a/extension/service-pack-support/inspectors/comps/sprite.js b/extension/service-pack-support/inspectors/comps/sprite.js
new file mode 100644
index 00000000..30b36cf1
--- /dev/null
+++ b/extension/service-pack-support/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/service-pack-support/main.js b/extension/service-pack-support/main.js
new file mode 100644
index 00000000..8b46fbba
--- /dev/null
+++ b/extension/service-pack-support/main.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = {};
diff --git a/extension/service-pack-support/package.json b/extension/service-pack-support/package.json
new file mode 100644
index 00000000..eccbc425
--- /dev/null
+++ b/extension/service-pack-support/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "service-pack",
+ "version": "1.0.0",
+ "description": "This extension provides support for cocos service pack.",
+ "author": "SmallMain",
+ "main": "main.js",
+ "runtime-resource": {
+ "path": "resources",
+ "name": "resources"
+ },
+ "reload": {
+ "ignore": [
+ "resources/**/*"
+ ]
+ }
+}
diff --git a/extension/service-pack-support/resources/sp/effects/multi-2d-sprite.effect b/extension/service-pack-support/resources/sp/effects/multi-2d-sprite.effect
new file mode 100644
index 00000000..d45dc10e
--- /dev/null
+++ b/extension/service-pack-support/resources/sp/effects/multi-2d-sprite.effect
@@ -0,0 +1,114 @@
+// 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_TEXTURE
+ in vec2 a_uv0;
+ out vec2 v_uv0;
+ in float a_texId;
+ out float v_texId;
+ #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;
+ v_texId = a_texId;
+ #endif
+
+ v_color = a_color;
+
+ gl_Position = pos;
+ }
+}%
+
+
+CCProgram fs %{
+ precision highp float;
+
+ #include
+ #include
+
+ in vec4 v_color;
+
+ #if USE_TEXTURE
+ in vec2 v_uv0;
+ in float v_texId;
+ uniform sampler2D texture;
+ uniform sampler2D texture2;
+ uniform sampler2D texture3;
+ uniform sampler2D texture4;
+ uniform sampler2D texture5;
+ uniform sampler2D texture6;
+ uniform sampler2D texture7;
+ uniform sampler2D texture8;
+ #endif
+
+ void main () {
+ vec4 o = vec4(1, 1, 1, 1);
+
+ #if USE_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);
+ }
+ #endif
+
+ o *= v_color;
+
+ ALPHA_TEST(o);
+
+ gl_FragColor = o;
+ }
+}%