Skip to content

Commit

Permalink
Feature Extensions API (#8410)
Browse files Browse the repository at this point in the history
  • Loading branch information
bigtimebuddy committed Jun 20, 2022
1 parent 03f8b02 commit b98acb1
Show file tree
Hide file tree
Showing 77 changed files with 654 additions and 188 deletions.
16 changes: 8 additions & 8 deletions bundles/pixi.js-legacy/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AccessibilityManager, InteractionManager } from 'pixi.js';
import { extensions } from 'pixi.js';
import { CanvasRenderer, canvasUtils } from '@pixi/canvas-renderer';
import { CanvasMeshRenderer } from '@pixi/canvas-mesh';
import { CanvasGraphicsRenderer } from '@pixi/canvas-graphics';
Expand All @@ -10,13 +10,13 @@ import '@pixi/canvas-particle-container';
import '@pixi/canvas-display';
import '@pixi/canvas-text';

CanvasRenderer.registerPlugin('accessibility', AccessibilityManager);
CanvasRenderer.registerPlugin('extract', CanvasExtract);
CanvasRenderer.registerPlugin('graphics', CanvasGraphicsRenderer);
CanvasRenderer.registerPlugin('interaction', InteractionManager);
CanvasRenderer.registerPlugin('mesh', CanvasMeshRenderer);
CanvasRenderer.registerPlugin('prepare', CanvasPrepare);
CanvasRenderer.registerPlugin('sprite', CanvasSpriteRenderer);
extensions.add(
CanvasExtract,
CanvasGraphicsRenderer,
CanvasMeshRenderer,
CanvasPrepare,
CanvasSpriteRenderer
);

// Export ES for those importing specifically by name,
// e.g., `import {autoDetectRenderer} from 'pixi.js-legacy'`
Expand Down
41 changes: 21 additions & 20 deletions bundles/pixi.js/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ import '@pixi/polyfill';
import * as utils from '@pixi/utils';
import { AccessibilityManager } from '@pixi/accessibility';
import { InteractionManager } from '@pixi/interaction';
import { Application } from '@pixi/app';
import { Renderer, BatchRenderer } from '@pixi/core';
import { BatchRenderer, extensions } from '@pixi/core';
import { Extract } from '@pixi/extract';
import { Loader, AppLoaderPlugin } from '@pixi/loaders';
import { AppLoaderPlugin } from '@pixi/loaders';
import { CompressedTextureLoader, DDSLoader, KTXLoader } from '@pixi/compressed-textures';
import { ParticleRenderer } from '@pixi/particle-container';
import { Prepare } from '@pixi/prepare';
Expand All @@ -24,25 +23,27 @@ import '@pixi/mixin-cache-as-bitmap';
import '@pixi/mixin-get-child-by-name';
import '@pixi/mixin-get-global-position';

// Install renderer plugins
Renderer.registerPlugin('accessibility', AccessibilityManager);
Renderer.registerPlugin('extract', Extract);
Renderer.registerPlugin('interaction', InteractionManager);
Renderer.registerPlugin('particle', ParticleRenderer);
Renderer.registerPlugin('prepare', Prepare);
Renderer.registerPlugin('batch', BatchRenderer);
Renderer.registerPlugin('tilingSprite', TilingSpriteRenderer);
extensions.add(
// Install renderer plugins
AccessibilityManager,
Extract,
InteractionManager,
ParticleRenderer,
Prepare,
BatchRenderer,
TilingSpriteRenderer,

// Install loader plugins
Loader.registerPlugin(BitmapFontLoader);
Loader.registerPlugin(CompressedTextureLoader);
Loader.registerPlugin(DDSLoader);
Loader.registerPlugin(KTXLoader);
Loader.registerPlugin(SpritesheetLoader);
// Install loader plugins
BitmapFontLoader,
CompressedTextureLoader,
DDSLoader,
KTXLoader,
SpritesheetLoader,

// Install application plugins
Application.registerPlugin(TickerPlugin);
Application.registerPlugin(AppLoaderPlugin);
// Install application plugins
TickerPlugin,
AppLoaderPlugin
);

/**
* String of the current PIXI version.
Expand Down
4 changes: 2 additions & 2 deletions packages/accessibility/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ npm install @pixi/accessibility

```js
import { AccessibilityManager } from '@pixi/accessibility';
import { Renderer } from '@pixi/core';
import { extensions } from '@pixi/core';

Renderer.registerPlugin('accessibility', AccessibilityManager);
extensions.add(AccessibilityManager);
```
11 changes: 10 additions & 1 deletion packages/accessibility/src/AccessibilityManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { accessibleTarget } from './accessibleTarget';

import type { Rectangle } from '@pixi/math';
import type { Container } from '@pixi/display';
import type { Renderer, AbstractRenderer } from '@pixi/core';
import { Renderer, AbstractRenderer, ExtensionMetadata, ExtensionType } from '@pixi/core';
import type { IAccessibleHTMLElement } from './accessibleTarget';

// add some extra variables to the container..
Expand Down Expand Up @@ -35,6 +35,15 @@ const DIV_HOOK_ZINDEX = 2;
*/
export class AccessibilityManager
{
/** @ignore */
static extension: ExtensionMetadata = {
name: 'accessibility',
type: [
ExtensionType.RendererPlugin,
ExtensionType.CanvasRendererPlugin,
],
};

/** Setting this to true will visually show the divs. */
public debug = false;

Expand Down
6 changes: 4 additions & 2 deletions packages/accessibility/test/AccessibilityManager.tests.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { AccessibilityManager } from '@pixi/accessibility';
import { CanvasRenderer } from '@pixi/canvas-renderer';
import { DisplayObject, Container } from '@pixi/display';
import { Renderer } from '@pixi/core';
import { extensions, Renderer } from '@pixi/core';
import { isMobile } from '@pixi/utils';
import { expect } from 'chai';

Expand All @@ -22,12 +22,14 @@ describe('AccessibilityManager', () =>

it('should be plugin for renderer', () =>
{
CanvasRenderer.registerPlugin('accessibility', AccessibilityManager);
extensions.add(AccessibilityManager);

const renderer = new CanvasRenderer();

expect(renderer.plugins.accessibility).to.be.instanceof(AccessibilityManager);
renderer.destroy();

extensions.remove(AccessibilityManager);
});

it('should remove touch hook when destroyed', () =>
Expand Down
2 changes: 1 addition & 1 deletion packages/app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ document.body.appendChild(app.view);

### Plugins

PixiJS provides a few plugins to add features to the Application. These can be installed from the following packages. Use `Application.registerPlugin` to use these plugins. _Note: if you are using pixi.js or pixi.js-legacy bundles, this is unnecessary since plugins are installed automatically by default._
PixiJS provides a few plugins to add features to the Application. These can be installed from the following packages. Use `extensions.add` to use these plugins. _Note: if you are using pixi.js or pixi.js-legacy bundles, this is unnecessary since plugins are installed automatically by default._

* **LoaderPlugin** from `@pixi/loaders`
* **TickerPlugin** from `@pixi/ticker`
42 changes: 37 additions & 5 deletions packages/app/src/Application.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { Container } from '@pixi/display';
import { autoDetectRenderer } from '@pixi/core';
import { autoDetectRenderer, extensions, ExtensionType } from '@pixi/core';

import type { Rectangle } from '@pixi/math';
import type { Renderer, IRendererOptionsAuto, AbstractRenderer } from '@pixi/core';
import type { IDestroyOptions } from '@pixi/display';
import { deprecation } from '@pixi/utils';

/**
* Any plugin that's usable for Application should contain these methods.
* @memberof PIXI
* @see {@link PIXI.Application.registerPlugin}
*/
export interface IApplicationPlugin
{
Expand Down Expand Up @@ -47,7 +47,7 @@ export interface Application extends GlobalMixins.Application {}
export class Application
{
/** Collection of installed plugins. */
private static _plugins: IApplicationPlugin[] = [];
static _plugins: IApplicationPlugin[] = [];

/**
* The root display container that's rendered.
Expand Down Expand Up @@ -111,13 +111,20 @@ export class Application
}

/**
* Register a middleware plugin for the application
* Use the {@link PIXI.extensions.add} API to register plugins.
* @deprecated since 6.5.0
* @static
* @param {PIXI.IApplicationPlugin} plugin - Plugin being installed
*/
static registerPlugin(plugin: IApplicationPlugin): void
{
Application._plugins.push(plugin);
// #if _DEBUG
deprecation('6.5.0', 'Application.registerPlugin() is deprecated, use extensions.add()');
// #endif
extensions.add({
type: ExtensionType.Application,
ref: plugin,
});
}

/** Render the current stage. */
Expand Down Expand Up @@ -177,3 +184,28 @@ export class Application
this.renderer = null;
}
}

extensions.handle(
ExtensionType.Application,
(extension) =>
{
const plugins = Application._plugins;
const plugin = extension.ref as unknown as IApplicationPlugin;

if (!plugins.includes(plugin))
{
plugins.push(plugin);
}
},
(extension) =>
{
const plugins = Application._plugins;
const plugin = extension.ref as unknown as IApplicationPlugin;
const index = plugins.indexOf(plugin);

if (index !== -1)
{
plugins.splice(index, 1);
}
}
);
5 changes: 4 additions & 1 deletion packages/app/src/ResizePlugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { CanvasRenderer } from '@pixi/canvas-renderer';
import type { Renderer } from '@pixi/core';
import { ExtensionMetadata, ExtensionType, Renderer } from '@pixi/core';
import type { IApplicationOptions } from './Application';

/**
Expand All @@ -9,6 +9,9 @@ import type { IApplicationOptions } from './Application';
*/
export class ResizePlugin
{
/** @ignore */
static extension: ExtensionMetadata = ExtensionType.Application;

public static resizeTo: Window | HTMLElement;
public static resize: () => void;
public static renderer: Renderer | CanvasRenderer;
Expand Down
4 changes: 2 additions & 2 deletions packages/app/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Application } from './Application';
import { ResizePlugin } from './ResizePlugin';
import { extensions } from '@pixi/core';

Application.registerPlugin(ResizePlugin);
extensions.add(ResizePlugin);

export * from './Application';
6 changes: 4 additions & 2 deletions packages/app/test/Application.tests.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Application } from '@pixi/app';
import { extensions, ExtensionType } from '@pixi/core';
import { Container } from '@pixi/display';
import { skipHello } from '@pixi/utils';
import { expect } from 'chai';
Expand Down Expand Up @@ -28,8 +29,9 @@ describe('Application', () =>
init: sinon.spy(),
destroy: sinon.spy(),
};
const extension = { type: ExtensionType.Application, ref: plugin };

Application.registerPlugin(plugin);
extensions.add(extension);

const app = new Application();

Expand All @@ -38,7 +40,7 @@ describe('Application', () =>
expect(plugin.init).to.be.calledOnce;
expect(plugin.destroy).to.be.calledOnce;

Application['_plugins'].pop();
extensions.remove(extension);
});

it('should remove canvas when destroyed', () =>
Expand Down
4 changes: 2 additions & 2 deletions packages/basis/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ npm install @pixi/core

```js
import { BasisLoader } from '@pixi/basis';
import { Loader } from '@pixi/loaders';
import { extensions } from '@pixi/core';

Loader.registerPlugin(BasisLoader);
extensions.add(BasisLoader);
```
5 changes: 4 additions & 1 deletion packages/basis/src/BasisLoader.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { TYPES, MIPMAP_MODES, ALPHA_MODES, FORMATS } from '@pixi/constants';
import { BaseTexture, BufferResource, Texture } from '@pixi/core';
import { BaseTexture, BufferResource, ExtensionMetadata, ExtensionType, Texture } from '@pixi/core';
import { CompressedTextureResource, INTERNAL_FORMATS } from '@pixi/compressed-textures';
import {
BASIS_FORMATS,
Expand Down Expand Up @@ -64,6 +64,9 @@ LoaderResource.setExtensionXhrType('basis', LoaderResource.XHR_RESPONSE_TYPE.BUF
*/
export class BasisLoader
{
/** @ignore */
static extension: ExtensionMetadata = ExtensionType.Loader;

private static basisBinding: BasisBinding;
private static defaultRGBFormat: { basisFormat: BASIS_FORMATS, textureFormat: INTERNAL_FORMATS | TYPES };
private static defaultRGBAFormat: { basisFormat: BASIS_FORMATS, textureFormat: INTERNAL_FORMATS | TYPES };
Expand Down
5 changes: 2 additions & 3 deletions packages/basis/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Loader } from '@pixi/loaders';
import { extensions } from '@pixi/core';
import { BasisLoader } from './BasisLoader';

export * from './Basis';
export * from './BasisLoader';

// parse any BASIS supercompressed files into textures
Loader.registerPlugin(BasisLoader);
extensions.add(BasisLoader);
4 changes: 2 additions & 2 deletions packages/canvas-extract/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ npm install @pixi/canvas-extract
## Usage

```js
import { extensions } from '@pixi/core';
import { CanvasExtract } from '@pixi/canvas-extract';
import { CanvasRenderer } from '@pixi/canvas-renderer';

CanvasRenderer.registerPlugin('extract', CanvasExtract);
extensions.add(CanvasExtract);
```
8 changes: 7 additions & 1 deletion packages/canvas-extract/src/CanvasExtract.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { RenderTexture } from '@pixi/core';
import { ExtensionMetadata, ExtensionType, RenderTexture } from '@pixi/core';
import { CanvasRenderTarget } from '@pixi/utils';
import { Rectangle } from '@pixi/math';
import { CanvasRenderer } from '@pixi/canvas-renderer';
Expand All @@ -16,6 +16,12 @@ const TEMP_RECT = new Rectangle();
*/
export class CanvasExtract
{
/** @ignore */
static extension: ExtensionMetadata = {
name: 'extract',
type: ExtensionType.CanvasRendererPlugin,
};

/** A reference to the current renderer */
public renderer: CanvasRenderer;

Expand Down
9 changes: 3 additions & 6 deletions packages/canvas-extract/test/CanvasExtract.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { CanvasRenderer } from '@pixi/canvas-renderer';
import { Sprite } from '@pixi/sprite';
import { expect } from 'chai';
import { skipHello } from '@pixi/utils';
import { Texture, RenderTexture } from '@pixi/core';
import { Texture, RenderTexture, extensions } from '@pixi/core';
import { CanvasSpriteRenderer } from '@pixi/canvas-sprite';

import '@pixi/canvas-display';
Expand All @@ -12,11 +12,8 @@ skipHello();

describe('CanvasExtract', () =>
{
before(() =>
{
CanvasRenderer.registerPlugin('extract', CanvasExtract);
CanvasRenderer.registerPlugin('sprite', CanvasSpriteRenderer);
});
before(() => extensions.add(CanvasExtract, CanvasSpriteRenderer));
after(() => extensions.remove(CanvasExtract, CanvasSpriteRenderer));

it('should access extract on renderer', () =>
{
Expand Down
4 changes: 2 additions & 2 deletions packages/canvas-graphics/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ npm install @pixi/canvas-graphics

```js
import { CanvasGraphicsRenderer } from '@pixi/canvas-graphics';
import { CanvasRenderer } from '@pixi/canvas-renderer';
import { extensions } from '@pixi/core';

CanvasRenderer.registerPlugin('graphics', CanvasGraphicsRenderer);
extensions.add(CanvasGraphicsRenderer);
```
Loading

0 comments on commit b98acb1

Please sign in to comment.