|
@@ -28,9 +28,10 @@
|
|
|
*****************************************************************************/
|
|
|
|
|
|
import Phaser from "phaser";
|
|
|
-import { SPINE_ATLAS_CACHE_KEY, SPINE_FILE_TYPE, SPINE_TEXTURE_CACHE_KEY } from "./keys";
|
|
|
+import { SPINE_ATLAS_CACHE_KEY, SPINE_CONTAINER_TYPE, SPINE_FILE_TYPE, SPINE_GAME_OBJECT_TYPE, SPINE_TEXTURE_CACHE_KEY } from "./keys";
|
|
|
import { SceneRenderer, SkeletonDebugRenderer, SkeletonRenderer } from "@esotericsoftware/spine-webgl"
|
|
|
import { SpineFile } from "./SpineFile";
|
|
|
+import { SpineGameObject } from "./SpineGameObject";
|
|
|
|
|
|
export class SpinePlugin extends Phaser.Plugins.ScenePlugin {
|
|
|
game: Phaser.Game;
|
|
@@ -42,8 +43,6 @@ export class SpinePlugin extends Phaser.Plugins.ScenePlugin {
|
|
|
gl: WebGLRenderingContext | null;
|
|
|
phaserRenderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer | null;
|
|
|
sceneRenderer: SceneRenderer | null;
|
|
|
- skeletonRenderer: SkeletonRenderer | null;
|
|
|
- skeletonDebugRenderer: SkeletonDebugRenderer | null;
|
|
|
|
|
|
constructor(scene: Phaser.Scene, pluginManager: Phaser.Plugins.PluginManager, pluginKey: string) {
|
|
|
super(scene, pluginManager, pluginKey);
|
|
@@ -56,8 +55,6 @@ export class SpinePlugin extends Phaser.Plugins.ScenePlugin {
|
|
|
this.gl = this.isWebGL ? (this.game.renderer as Phaser.Renderer.WebGL.WebGLRenderer).gl : null;
|
|
|
this.phaserRenderer = this.game.renderer;
|
|
|
this.sceneRenderer = null;
|
|
|
- this.skeletonRenderer = null;
|
|
|
- this.skeletonDebugRenderer = null;
|
|
|
|
|
|
if (!this.phaserRenderer) {
|
|
|
this.phaserRenderer = {
|
|
@@ -70,29 +67,96 @@ export class SpinePlugin extends Phaser.Plugins.ScenePlugin {
|
|
|
} as unknown as Phaser.Renderer.Canvas.CanvasRenderer;
|
|
|
}
|
|
|
|
|
|
- let fileCallback = function (this: any, key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig | Phaser.Types.Loader.FileTypes.JSONFileConfig[],
|
|
|
+ let fileCallback = function (this: any, key: string,
|
|
|
jsonURL: string,
|
|
|
- atlasURL: string | string[],
|
|
|
+ atlasURL: string,
|
|
|
premultipliedAlpha: boolean,
|
|
|
jsonXhrSettings: Phaser.Types.Loader.XHRSettingsObject,
|
|
|
atlasXhrSettings: Phaser.Types.Loader.XHRSettingsObject) {
|
|
|
- let file = new SpineFile(this as any, key, jsonURL, atlasURL, premultipliedAlpha, jsonXhrSettings, atlasXhrSettings);
|
|
|
- this.addFile(file.files);
|
|
|
- return this;
|
|
|
+ let file = new SpineFile(this as any, key, jsonURL, atlasURL, premultipliedAlpha, jsonXhrSettings, atlasXhrSettings);
|
|
|
+ this.addFile(file.files);
|
|
|
return this;
|
|
|
};
|
|
|
- pluginManager.registerFileType(SPINE_FILE_TYPE, fileCallback, scene);
|
|
|
|
|
|
+ let self = this;
|
|
|
+ let addSpineGameObject = function (this: Phaser.GameObjects.GameObjectFactory, x: number, y: number, key: string) {
|
|
|
+ let gameObject = new SpineGameObject(scene, self, x, y, key);
|
|
|
+ this.displayList.add(gameObject);
|
|
|
+ this.updateList.add(gameObject);
|
|
|
+ };
|
|
|
+
|
|
|
+ let makeSpineGameObject = function (this: Phaser.GameObjects.GameObjectFactory, config: any, addToScene: boolean) {
|
|
|
+ let key = config.key ? config.key : null;
|
|
|
+ let gameObject = new SpineGameObject(this.scene, self, 0, 0, key);
|
|
|
+ if (addToScene !== undefined) {
|
|
|
+ config.add = addToScene;
|
|
|
+ }
|
|
|
+ Phaser.GameObjects.BuildGameObject(this.scene, gameObject, config);
|
|
|
+ }
|
|
|
+
|
|
|
+ pluginManager.registerFileType(SPINE_FILE_TYPE, fileCallback, scene);
|
|
|
+ pluginManager.registerGameObject(SPINE_GAME_OBJECT_TYPE, addSpineGameObject, makeSpineGameObject);
|
|
|
}
|
|
|
|
|
|
boot() {
|
|
|
- // FIXME
|
|
|
+ if (this.isWebGL) {
|
|
|
+ // Monkeypatch the Spine setBlendMode functions, or batching is destroyed!
|
|
|
+ let setBlendMode = function (this: any, srcBlend: any, dstBlend: any) {
|
|
|
+ if (srcBlend !== this.srcBlend || dstBlend !== this.dstBlend) {
|
|
|
+ let gl = this.context.gl;
|
|
|
+ this.srcBlend = srcBlend;
|
|
|
+ this.dstBlend = dstBlend;
|
|
|
+ if (this.isDrawing) {
|
|
|
+ this.flush();
|
|
|
+ gl.blendFunc(this.srcBlend, this.dstBlend);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ var sceneRenderer = this.sceneRenderer;
|
|
|
+ if (!sceneRenderer) {
|
|
|
+ sceneRenderer = new SceneRenderer((this.phaserRenderer! as Phaser.Renderer.WebGL.WebGLRenderer).canvas, this.gl!, true);
|
|
|
+ sceneRenderer.batcher.setBlendMode = setBlendMode;
|
|
|
+ (sceneRenderer as any).shapes.setBlendMode = setBlendMode;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.sceneRenderer = sceneRenderer;
|
|
|
+ }
|
|
|
+
|
|
|
+ var eventEmitter = this.systems.events;
|
|
|
+ eventEmitter.once('shutdown', this.shutdown, this);
|
|
|
+ eventEmitter.once('destroy', this.destroy, this);
|
|
|
+ this.game.events.once('destroy', this.gameDestroy, this);
|
|
|
}
|
|
|
|
|
|
- getNumbers(count: number) {
|
|
|
- let numbers = [];
|
|
|
- for (let i = 0; i < count; i++)
|
|
|
- numbers.push(i);
|
|
|
- return numbers;
|
|
|
+ onResize() {
|
|
|
+ var phaserRenderer = this.phaserRenderer;
|
|
|
+ var sceneRenderer = this.sceneRenderer;
|
|
|
+
|
|
|
+ if (phaserRenderer && sceneRenderer) {
|
|
|
+ var viewportWidth = phaserRenderer.width;
|
|
|
+ var viewportHeight = phaserRenderer.height;
|
|
|
+ sceneRenderer.camera.position.x = viewportWidth / 2;
|
|
|
+ sceneRenderer.camera.position.y = viewportHeight / 2;
|
|
|
+ sceneRenderer.camera.setViewport(viewportWidth, viewportHeight);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ shutdown() {
|
|
|
+ this.systems.events.off("shutdown", this.shutdown, this);
|
|
|
+ if (this.isWebGL) {
|
|
|
+ this.game.scale.off(Phaser.Scale.Events.RESIZE, this.onResize, this);
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+ destroy() {
|
|
|
+ this.shutdown()
|
|
|
+ }
|
|
|
+
|
|
|
+ gameDestroy() {
|
|
|
+ this.pluginManager.removeGameObject(SPINE_GAME_OBJECT_TYPE, true, true);
|
|
|
+ this.pluginManager.removeGameObject(SPINE_CONTAINER_TYPE, true, true);
|
|
|
+ if (this.sceneRenderer) this.sceneRenderer.dispose();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|