@next2d/webgl 3.0.5 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next2d/webgl",
3
- "version": "3.0.5",
3
+ "version": "3.1.0",
4
4
  "description": "Next2D Webgl Package",
5
5
  "author": "Toshiyuki Ienaga<ienaga@next2d.app> (https://github.com/ienaga/)",
6
6
  "license": "MIT",
@@ -24,7 +24,7 @@
24
24
  "url": "git+https://github.com/Next2D/Player.git"
25
25
  },
26
26
  "dependencies": {
27
- "@next2d/texture-packer": "3.0.5",
28
- "@next2d/render-queue": "3.0.5"
27
+ "@next2d/texture-packer": "3.1.0",
28
+ "@next2d/render-queue": "3.1.0"
29
29
  }
30
30
  }
@@ -0,0 +1,13 @@
1
+ import type { Node } from "@next2d/texture-packer";
2
+ /**
3
+ * @description コンテナのアトラスノードへの描画を終了し、
4
+ * temp FBOの内容をアトラスのノード領域にコピーします。
5
+ * End container atlas node rendering,
6
+ * copy temp FBO contents to atlas node region.
7
+ *
8
+ * @param {Node} node
9
+ * @return {void}
10
+ * @method
11
+ * @protected
12
+ */
13
+ export declare const execute: (node: Node) => void;
@@ -0,0 +1,61 @@
1
+ import { $containerLayerStack } from "./ContextContainerBeginLayerUseCase";
2
+ import { execute as frameBufferManagerReleaseAttachmentObjectUseCase } from "../../FrameBufferManager/usecase/FrameBufferManagerReleaseAttachmentObjectUseCase";
3
+ import { execute as variantsBlendMatrixTextureShaderService } from "../../Shader/Variants/Blend/service/VariantsBlendMatrixTextureShaderService";
4
+ import { execute as shaderManagerSetMatrixTextureWithColorTransformUniformService } from "../../Shader/ShaderManager/service/ShaderManagerSetMatrixTextureWithColorTransformUniformService";
5
+ import { execute as textureManagerBind0UseCase } from "../../TextureManager/usecase/TextureManagerBind0UseCase";
6
+ import { execute as shaderManagerDrawTextureUseCase } from "../../Shader/ShaderManager/usecase/ShaderManagerDrawTextureUseCase";
7
+ import { execute as textureManagerReleaseTextureObjectUseCase } from "../../TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase";
8
+ import { execute as blendOperationUseCase } from "../../Blend/usecase/BlendOperationUseCase";
9
+ import { $context } from "../../WebGLUtil";
10
+ import { $getAtlasAttachmentObject } from "../../AtlasManager";
11
+ /**
12
+ * @description コンテナ用のカラー変換(恒等変換)
13
+ * Identity color transform for container copy
14
+ *
15
+ * @type {Float32Array}
16
+ * @private
17
+ */
18
+ const $identityColorTransform = new Float32Array([1, 1, 1, 1, 0, 0, 0, 0]);
19
+ /**
20
+ * @description コンテナのアトラスノードへの描画を終了し、
21
+ * temp FBOの内容をアトラスのノード領域にコピーします。
22
+ * End container atlas node rendering,
23
+ * copy temp FBO contents to atlas node region.
24
+ *
25
+ * @param {Node} node
26
+ * @return {void}
27
+ * @method
28
+ * @protected
29
+ */
30
+ export const execute = (node) => {
31
+ // temp FBOへの描画をフラッシュ
32
+ $context.drawArraysInstanced();
33
+ const tempAttachment = $context.$mainAttachmentObject;
34
+ const textureObject = tempAttachment.texture;
35
+ // mainを復元($containerLayerStackから)
36
+ $context.$mainAttachmentObject = $containerLayerStack.pop();
37
+ // temp FBOを解放(テクスチャは保持してアトラスコピーに使用)
38
+ frameBufferManagerReleaseAttachmentObjectUseCase(tempAttachment, false);
39
+ if (textureObject) {
40
+ // アトラスにバインド
41
+ const atlas = $getAtlasAttachmentObject();
42
+ $context.bind(atlas);
43
+ // ノード領域を設定(scissor + clear + transfer bounds登録)
44
+ $context.beginNodeRendering(node);
45
+ // ブレンドモード設定(premultiplied alpha用: ONE, ONE_MINUS_SRC_ALPHA)
46
+ blendOperationUseCase("normal");
47
+ // テクスチャをノード位置に描画(Y軸反転: WebGLはbottom-left原点)
48
+ const offsetY = atlas.height - node.y - node.h;
49
+ $context.setTransform(1, 0, 0, 1, node.x, offsetY);
50
+ const shaderManager = variantsBlendMatrixTextureShaderService(false);
51
+ shaderManagerSetMatrixTextureWithColorTransformUniformService(shaderManager, $identityColorTransform, node.w, node.h);
52
+ textureManagerBind0UseCase(textureObject);
53
+ shaderManagerDrawTextureUseCase(shaderManager);
54
+ // ノード描画終了
55
+ $context.endNodeRendering();
56
+ // テクスチャを解放
57
+ textureManagerReleaseTextureObjectUseCase(textureObject);
58
+ }
59
+ // mainをバインド
60
+ $context.bind($context.$mainAttachmentObject);
61
+ };
package/src/Context.d.ts CHANGED
@@ -22,6 +22,7 @@ export declare class Context {
22
22
  joints: number;
23
23
  miterLimit: number;
24
24
  newDrawState: boolean;
25
+ private readonly _pendingAtlasNodes;
25
26
  constructor(gl: WebGL2RenderingContext, samples: number, device_pixel_ratio?: number);
26
27
  clearTransferBounds(): void;
27
28
  updateBackgroundColor(red: number, green: number, blue: number, alpha: number): void;
@@ -71,6 +72,8 @@ export declare class Context {
71
72
  applyFilter(node: Node, unique_key: string, updated: boolean, width: number, height: number, is_bitmap: boolean, matrix: Float32Array, color_transform: Float32Array, blend_mode: IBlendMode, bounds: Float32Array, params: Float32Array): void;
72
73
  containerBeginLayer(width: number, height: number): void;
73
74
  containerEndLayer(blend_mode: IBlendMode, matrix: Float32Array, color_transform: Float32Array | null, use_filter: boolean, filter_bounds: Float32Array | null, filter_params: Float32Array | null, unique_key: string, filter_key: string): void;
75
+ containerBeginAtlasNode(width: number, height: number): Node;
76
+ containerEndAtlasNode(): void;
74
77
  containerDrawCachedFilter(blend_mode: IBlendMode, matrix: Float32Array, color_transform: Float32Array, filter_bounds: Float32Array, unique_key: string, filter_key: string): void;
75
78
  createImageBitmap(width: number, height: number): Promise<ImageBitmap>;
76
79
  }
package/src/Context.js CHANGED
@@ -43,6 +43,7 @@ import { execute as contextStrokeUseCase } from "./Context/usecase/ContextStroke
43
43
  import { execute as contextApplyFilterUseCase } from "./Context/usecase/ContextApplyFilterUseCase";
44
44
  import { execute as contextContainerBeginLayerUseCase } from "./Context/usecase/ContextContainerBeginLayerUseCase";
45
45
  import { execute as contextContainerEndLayerUseCase } from "./Context/usecase/ContextContainerEndLayerUseCase";
46
+ import { execute as contextContainerEndAtlasNodeUseCase } from "./Context/usecase/ContextContainerEndAtlasNodeUseCase";
46
47
  import { execute as contextContainerDrawCachedFilterUseCase } from "./Context/usecase/ContextContainerDrawCachedFilterUseCase";
47
48
  import { execute as contextUpdateTransferBoundsService } from "./Context/service/ContextUpdateTransferBoundsService";
48
49
  import { execute as contextDrawFillUseCase } from "./Context/usecase/ContextDrawFillUseCase";
@@ -167,6 +168,12 @@ export class Context {
167
168
  writable: true,
168
169
  value: false
169
170
  });
171
+ Object.defineProperty(this, "_pendingAtlasNodes", {
172
+ enumerable: true,
173
+ configurable: true,
174
+ writable: true,
175
+ value: []
176
+ });
170
177
  $setWebGL2RenderingContext(gl);
171
178
  $setRenderMaxSize(gl.getParameter(gl.MAX_TEXTURE_SIZE));
172
179
  $setSamples(samples);
@@ -379,6 +386,19 @@ export class Context {
379
386
  containerEndLayer(blend_mode, matrix, color_transform, use_filter, filter_bounds, filter_params, unique_key, filter_key) {
380
387
  contextContainerEndLayerUseCase(blend_mode, matrix, color_transform, use_filter, filter_bounds, filter_params, unique_key, filter_key);
381
388
  }
389
+ containerBeginAtlasNode(width, height) {
390
+ this.drawArraysInstanced();
391
+ // アトラスノードを確保(後でコピー先として使用)
392
+ const node = atlasManagerCreateNodeService(width, height);
393
+ this._pendingAtlasNodes.push(node);
394
+ // temp FBOを作成して子要素の描画先として設定
395
+ contextContainerBeginLayerUseCase(width, height);
396
+ return node;
397
+ }
398
+ containerEndAtlasNode() {
399
+ const node = this._pendingAtlasNodes.pop();
400
+ contextContainerEndAtlasNodeUseCase(node);
401
+ }
382
402
  containerDrawCachedFilter(blend_mode, matrix, color_transform, filter_bounds, unique_key, filter_key) {
383
403
  contextContainerDrawCachedFilterUseCase(blend_mode, matrix, color_transform, filter_bounds, unique_key, filter_key);
384
404
  }