From ba47bb268eeedd02277ac0b56f1daf3e3b18767f Mon Sep 17 00:00:00 2001 From: ienaga Date: Thu, 27 Nov 2025 16:54:23 +0900 Subject: [PATCH 1/6] #238 update packages --- package-lock.json | 117 ++++++++++++++++++++++++---------------------- package.json | 8 ++-- 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0d65ed0..2febcb20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@next2d/player", - "version": "2.12.0", + "version": "2.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@next2d/player", - "version": "2.12.0", + "version": "2.13.0", "license": "MIT", "workspaces": [ "packages/*" @@ -25,7 +25,7 @@ "@types/node": "^24.10.1", "@typescript-eslint/eslint-plugin": "^8.48.0", "@typescript-eslint/parser": "^8.48.0", - "@vitest/web-worker": "^4.0.13", + "@vitest/web-worker": "^4.0.14", "eslint": "^9.39.1", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.5.0", @@ -34,7 +34,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.2.4", - "vitest": "^4.0.13", + "vitest": "^4.0.14", "vitest-webgl-canvas-mock": "^1.1.0", "xml2js": "^0.6.2" }, @@ -1740,16 +1740,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.13.tgz", - "integrity": "sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.14.tgz", + "integrity": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.13", - "@vitest/utils": "4.0.13", + "@vitest/spy": "4.0.14", + "@vitest/utils": "4.0.14", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -1758,13 +1758,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.13.tgz", - "integrity": "sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.14.tgz", + "integrity": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.13", + "@vitest/spy": "4.0.14", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -1795,9 +1795,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.13.tgz", - "integrity": "sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.14.tgz", + "integrity": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1808,13 +1808,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.13.tgz", - "integrity": "sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.14.tgz", + "integrity": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.13", + "@vitest/utils": "4.0.14", "pathe": "^2.0.3" }, "funding": { @@ -1822,13 +1822,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.13.tgz", - "integrity": "sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.14.tgz", + "integrity": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.13", + "@vitest/pretty-format": "4.0.14", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -1837,9 +1837,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.13.tgz", - "integrity": "sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.14.tgz", + "integrity": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==", "dev": true, "license": "MIT", "funding": { @@ -1847,13 +1847,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.13.tgz", - "integrity": "sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.14.tgz", + "integrity": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.13", + "@vitest/pretty-format": "4.0.14", "tinyrainbow": "^3.0.3" }, "funding": { @@ -1861,19 +1861,19 @@ } }, "node_modules/@vitest/web-worker": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.13.tgz", - "integrity": "sha512-LLkq30B6inJ5E6KxXjfcHhL1MT/bdk50Y22BjHFEwPzG3WteDvH0OQorqX6GaYgHEfCJAD665nOajnayWQsdtg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-4.0.14.tgz", + "integrity": "sha512-aF7LmA1v6GTNcKLlvSBEI7maCd2AfQj//k9xJSo5wMsTA9SV/2UpgGKgkjyi79rms87WaB/fn1ui/nEtDab8ig==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.3" + "obug": "^2.1.1" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.0.13" + "vitest": "4.0.14" } }, "node_modules/acorn": { @@ -3084,6 +3084,17 @@ "dev": true, "license": "MIT" }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3817,23 +3828,23 @@ } }, "node_modules/vitest": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.13.tgz", - "integrity": "sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.14.tgz", + "integrity": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.13", - "@vitest/mocker": "4.0.13", - "@vitest/pretty-format": "4.0.13", - "@vitest/runner": "4.0.13", - "@vitest/snapshot": "4.0.13", - "@vitest/spy": "4.0.13", - "@vitest/utils": "4.0.13", - "debug": "^4.4.3", + "@vitest/expect": "4.0.14", + "@vitest/mocker": "4.0.14", + "@vitest/pretty-format": "4.0.14", + "@vitest/runner": "4.0.14", + "@vitest/snapshot": "4.0.14", + "@vitest/spy": "4.0.14", + "@vitest/utils": "4.0.14", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", + "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", @@ -3856,12 +3867,11 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", - "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.13", - "@vitest/browser-preview": "4.0.13", - "@vitest/browser-webdriverio": "4.0.13", - "@vitest/ui": "4.0.13", + "@vitest/browser-playwright": "4.0.14", + "@vitest/browser-preview": "4.0.14", + "@vitest/browser-webdriverio": "4.0.14", + "@vitest/ui": "4.0.14", "happy-dom": "*", "jsdom": "*" }, @@ -3872,9 +3882,6 @@ "@opentelemetry/api": { "optional": true }, - "@types/debug": { - "optional": true - }, "@types/node": { "optional": true }, diff --git a/package.json b/package.json index d5d17d22..8033c3b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@next2d/player", - "version": "2.12.0", + "version": "2.13.0", "description": "Experience the fast and beautiful anti-aliased rendering of WebGL. You can create rich, interactive graphics, cross-platform applications and games without worrying about browser or device compatibility.", "author": "Toshiyuki Ienaga (https://github.com/ienaga/)", "license": "MIT", @@ -54,7 +54,7 @@ "@types/node": "^24.10.1", "@typescript-eslint/eslint-plugin": "^8.48.0", "@typescript-eslint/parser": "^8.48.0", - "@vitest/web-worker": "^4.0.13", + "@vitest/web-worker": "^4.0.14", "eslint": "^9.39.1", "eslint-plugin-unused-imports": "^4.3.0", "globals": "^16.5.0", @@ -63,7 +63,7 @@ "tslib": "^2.8.1", "typescript": "^5.9.3", "vite": "^7.2.4", - "vitest": "^4.0.13", + "vitest": "^4.0.14", "vitest-webgl-canvas-mock": "^1.1.0", "xml2js": "^0.6.2" }, @@ -83,4 +83,4 @@ "@next2d/ui": "file:packages/ui", "@next2d/webgl": "file:packages/webgl" } -} +} \ No newline at end of file From 6d27492af49a501dc5afe8beeacff3a590519035 Mon Sep 17 00:00:00 2001 From: ienaga Date: Thu, 27 Nov 2025 16:55:21 +0900 Subject: [PATCH 2/6] =?UTF-8?q?#238=20=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=83=85=E5=A0=B1=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1a2d103e..4ff3f796 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Next2D } from "@next2d/core"; if (!("next2d" in window)) { - console.log("%c Next2D Player %c 2.12.0 %c https://next2d.app", + console.log("%c Next2D Player %c 2.13.0 %c https://next2d.app", "color: #fff; background: #5f5f5f", "color: #fff; background: #4bc729", ""); From ca6cb4a559f710fe3c9de3e0bfd110b3ba3985a6 Mon Sep 17 00:00:00 2001 From: ienaga Date: Thu, 27 Nov 2025 16:55:51 +0900 Subject: [PATCH 3/6] =?UTF-8?q?#238=20=E3=83=AC=E3=82=AF=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=83=AB=E3=81=AE=E4=B8=89=E8=A7=92=E5=BD=A2=E3=81=AE?= =?UTF-8?q?=E3=83=91=E3=82=B9=E6=83=85=E5=A0=B1=E3=82=92=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eInstancedVertexArrayObjectUseCase.test.ts | 31 +++++++++++++------ ...CreateInstancedVertexArrayObjectUseCase.ts | 7 ++--- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts index 6caadc37..9c42d1a6 100644 --- a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.test.ts @@ -1,12 +1,9 @@ import { execute } from "./VertexArrayObjectCreateInstancedVertexArrayObjectUseCase"; import { describe, expect, it, vi } from "vitest"; -describe("VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.js method test", () => -{ - it("test case", () => - { - vi.mock("../../WebGLUtil.ts", async (importOriginal) => - { +describe("VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.js method test", () => { + it("test case", () => { + vi.mock("../../WebGLUtil.ts", async (importOriginal) => { const mod = await importOriginal(); return { ...mod, @@ -14,7 +11,24 @@ describe("VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.js method tes "createVertexArray": vi.fn(() => "testVertexArray"), "createBuffer": vi.fn(() => "testBuffer"), "bindVertexArray": vi.fn(), - "bindBuffer": vi.fn(), + "bindBuffer": vi.fn((target: number, srcData: Float32Array) => { + if (!(srcData instanceof Float32Array)) { + return; + } + expect(srcData[0]).toBe(0); + expect(srcData[1]).toBe(0); + expect(srcData[2]).toBe(1); + expect(srcData[3]).toBe(0); + expect(srcData[4]).toBe(1); + expect(srcData[5]).toBe(1); + + expect(srcData[6]).toBe(0); + expect(srcData[7]).toBe(0); + expect(srcData[8]).toBe(1); + expect(srcData[9]).toBe(1); + expect(srcData[10]).toBe(0); + expect(srcData[11]).toBe(1); + }), "bufferData": vi.fn(), "enableVertexAttribArray": vi.fn(), "vertexAttribPointer": vi.fn(), @@ -27,8 +41,7 @@ describe("VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.js method tes } }); - vi.mock("../../VertexArrayObject.ts", async (importOriginal) => - { + vi.mock("../../VertexArrayObject.ts", async (importOriginal) => { const mod = await importOriginal(); return { ...mod, diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts index c16dddd7..7bbe5d16 100644 --- a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts @@ -13,15 +13,14 @@ import { $attributeWebGLBuffer } from "../../VertexArrayObject"; * @method * @protected */ -export const execute = (): IVertexArrayObject => -{ +export const execute = (): IVertexArrayObject => { const vertexArrayObject = vertexArrayObjectCreateFillObjectService(); vertexArrayObjectBindService(vertexArrayObject); $gl.bindBuffer($gl.ARRAY_BUFFER, vertexArrayObject.vertexBuffer); $gl.bufferData($gl.ARRAY_BUFFER, new Float32Array([ - 0, 0, 1, 0, 0, 1, - 1, 1, 0, 1, 1, 0 + 0, 0, 1, 0, 1, 1, + 0, 0, 1, 1, 0, 1 ]), $gl.STATIC_DRAW); $gl.enableVertexAttribArray(0); From e8ccf15f984a88ebb684f0fe7cd8ed029ef08482 Mon Sep 17 00:00:00 2001 From: ienaga Date: Thu, 27 Nov 2025 23:06:24 +0900 Subject: [PATCH 4/6] =?UTF-8?q?#238=20Bitmap=E7=94=A8=E3=81=AE=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=82=BF=E3=83=B3=E3=82=B0=E3=83=AB=E3=81=AE=E4=B8=89?= =?UTF-8?q?=E8=A7=92=E5=BD=A2=E3=81=AE=E3=83=91=E3=82=B9=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E3=82=92=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts | 3 ++- .../VertexArrayObjectCreateRectVertexArrayObjectUseCase.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts index 7bbe5d16..cd08f7e8 100644 --- a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateInstancedVertexArrayObjectUseCase.ts @@ -13,7 +13,8 @@ import { $attributeWebGLBuffer } from "../../VertexArrayObject"; * @method * @protected */ -export const execute = (): IVertexArrayObject => { +export const execute = (): IVertexArrayObject => +{ const vertexArrayObject = vertexArrayObjectCreateFillObjectService(); vertexArrayObjectBindService(vertexArrayObject); diff --git a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.ts b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.ts index 8d4dd0ad..a2fd9a2e 100644 --- a/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.ts +++ b/packages/webgl/src/VertexArrayObject/usecase/VertexArrayObjectCreateRectVertexArrayObjectUseCase.ts @@ -19,8 +19,8 @@ export const execute = (): IVertexArrayObject => $gl.bindBuffer($gl.ARRAY_BUFFER, vertexArrayObject.vertexBuffer); const vertexBufferData = new Float32Array([ - 0, 0, 1, 0, 0, 1, - 1, 1, 0, 1, 1, 0 + 0, 0, 1, 0, 1, 1, + 0, 0, 1, 1, 0, 1 ]); $gl.bufferData($gl.ARRAY_BUFFER, vertexBufferData, $gl.STATIC_DRAW); From 9c6902035d64fff6744c76efd69aee848177dd5e Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 28 Nov 2025 00:42:59 +0900 Subject: [PATCH 5/6] =?UTF-8?q?#238=20Node=E7=AE=A1=E7=90=86=E3=81=AE1px?= =?UTF-8?q?=E3=81=AE=E4=BD=99=E7=99=BD=E5=87=A6=E7=90=86=E3=82=92=E6=94=B9?= =?UTF-8?q?=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Node/service/NodeInsertService.ts | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/texture-packer/src/Node/service/NodeInsertService.ts b/packages/texture-packer/src/Node/service/NodeInsertService.ts index 447b2966..554cbb03 100644 --- a/packages/texture-packer/src/Node/service/NodeInsertService.ts +++ b/packages/texture-packer/src/Node/service/NodeInsertService.ts @@ -18,24 +18,31 @@ export const execute = (node: Node, width: number, height: number): Node | null return newNode ? newNode : node.right?.insert(width, height) || null; } - if (width > node.w || height > node.h) { + // 右と下に1pxのパディングを考慮した実際の必要サイズ + const requiredWidth = width + 1; + const requiredHeight = height + 1; + + if (requiredWidth > node.w || requiredHeight > node.h) { return null; } - if (width === node.w && height === node.h) { + if (requiredWidth === node.w && requiredHeight === node.h) { node.used = true; + // w, hは実寸で返す(パディングは座標計算のみに使用) + node.w = width; + node.h = height; return node; } - const dw = node.w - width; - const dh = node.h - height; + const dw = node.w - requiredWidth; + const dh = node.h - requiredHeight; if (dw > dh) { - node.left = node.create(node.index, node.x, node.y, width, height); - node.right = node.create(node.index, node.x + width + 1, node.y, dw - 1, node.h); + node.left = node.create(node.index, node.x, node.y, requiredWidth, node.h); + node.right = node.create(node.index, node.x + requiredWidth, node.y, dw, node.h); } else { - node.left = node.create(node.index, node.x, node.y, node.w, height); - node.right = node.create(node.index, node.x, node.y + height + 1, node.w, dh - 1); + node.left = node.create(node.index, node.x, node.y, node.w, requiredHeight); + node.right = node.create(node.index, node.x, node.y + requiredHeight, node.w, dh); } node.used = true; From 349a043a58bfebb1d06e9e6135d9180787232af4 Mon Sep 17 00:00:00 2001 From: ienaga Date: Fri, 28 Nov 2025 01:21:28 +0900 Subject: [PATCH 6/6] =?UTF-8?q?#238=20=E3=83=A1=E3=83=A2=E3=83=AA=E6=B6=88?= =?UTF-8?q?=E8=B2=BB=E7=AE=87=E6=89=80=E3=82=92=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/texture-packer/src/Node.ts | 51 +++++++++++++++++-- .../src/Node/service/NodeDisposeService.ts | 14 +++++ packages/webgl/src/AtlasManager.ts | 35 ++++++++----- 3 files changed, 85 insertions(+), 15 deletions(-) diff --git a/packages/texture-packer/src/Node.ts b/packages/texture-packer/src/Node.ts index e6949a6a..f51d2e75 100644 --- a/packages/texture-packer/src/Node.ts +++ b/packages/texture-packer/src/Node.ts @@ -1,6 +1,15 @@ import { execute as nodeInsertService } from "./Node/service/NodeInsertService"; import { execute as nodeDisposeService } from "./Node/service/NodeDisposeService"; +/** + * @description ノードオブジェクトプール(パフォーマンス最適化) + * Node object pool (performance optimization) + * + * @type {Node[]} + * @private + */ +const $nodePool: Node[] = []; + /** * @description テクスチャパッキングのノードクラス * Node class for texture @@ -132,8 +141,8 @@ export class Node } /** - * @description 新規ノードを生成 - * Create a new node + * @description 新規ノードを生成(プールから取得または新規作成) + * Create a new node (get from pool or create new) * * @param {number} index * @param {number} x @@ -146,6 +155,42 @@ export class Node */ create (index: number, x: number, y: number, w: number, h: number): Node { - return new Node(index, x, y, w, h); + let node: Node; + if ($nodePool.length > 0) { + node = $nodePool.pop() as Node; + node.index = index; + node.x = x; + node.y = y; + node.w = w; + node.h = h; + node.left = null; + node.right = null; + node.used = false; + } else { + node = new Node(index, x, y, w, h); + } + return node; + } + + /** + * @description ノードをプールに返却(メモリ再利用) + * Return node to pool (memory reuse) + * + * @return {void} + * @method + * @public + */ + release (): void + { + if (this.left) { + this.left.release(); + this.left = null; + } + if (this.right) { + this.right.release(); + this.right = null; + } + this.used = false; + $nodePool.push(this); } } \ No newline at end of file diff --git a/packages/texture-packer/src/Node/service/NodeDisposeService.ts b/packages/texture-packer/src/Node/service/NodeDisposeService.ts index 5c63e39b..8ba11ede 100644 --- a/packages/texture-packer/src/Node/service/NodeDisposeService.ts +++ b/packages/texture-packer/src/Node/service/NodeDisposeService.ts @@ -23,6 +23,13 @@ export const execute = ( if (node.left?.dispose(x, y, width, height)) { if (!node.left.used && !node.right?.used) { + // 子ノードをプールに返却 + if (node.left) { + node.left.release(); + } + if (node.right) { + node.right.release(); + } node.left = node.right = null; node.used = false; } @@ -31,6 +38,13 @@ export const execute = ( if (node.right?.dispose(x, y, width, height)) { if (!node.right.used && !node.left?.used) { + // 子ノードをプールに返却 + if (node.left) { + node.left.release(); + } + if (node.right) { + node.right.release(); + } node.left = node.right = null; node.used = false; } diff --git a/packages/webgl/src/AtlasManager.ts b/packages/webgl/src/AtlasManager.ts index c2ec3e80..a239390a 100644 --- a/packages/webgl/src/AtlasManager.ts +++ b/packages/webgl/src/AtlasManager.ts @@ -5,6 +5,17 @@ import { execute as textureManagerCreateAtlasTextureUseCase } from "./TextureMan import { execute as frameBufferManagerGetAttachmentObjectUseCase } from "./FrameBufferManager/usecase/FrameBufferManagerGetAttachmentObjectUseCase"; import { $RENDER_MAX_SIZE } from "./WebGLUtil"; +/** + * @description 最大値定数(パフォーマンス最適化のためキャッシュ) + * Maximum value constants (cached for performance optimization) + * + * @type {number} + * @private + * @const + */ +const $MAX_VALUE: number = Number.MAX_VALUE; +const $MIN_VALUE: number = -Number.MAX_VALUE; + /** * @description アクティブなアトラスインデックス * Active atlas index @@ -161,10 +172,10 @@ export const $getActiveTransferBounds = (index: number): Float32Array => { if (!(index in $transferBounds)) { $transferBounds[index] = new Float32Array([ - Number.MAX_VALUE, - Number.MAX_VALUE, - -Number.MAX_VALUE, - -Number.MAX_VALUE + $MAX_VALUE, + $MAX_VALUE, + $MIN_VALUE, + $MIN_VALUE ]); } return $transferBounds[index]; @@ -189,10 +200,10 @@ export const $getActiveAllTransferBounds = (index: number): Float32Array => { if (!(index in $allTransferBounds)) { $allTransferBounds[index] = new Float32Array([ - Number.MAX_VALUE, - Number.MAX_VALUE, - -Number.MAX_VALUE, - -Number.MAX_VALUE + $MAX_VALUE, + $MAX_VALUE, + $MIN_VALUE, + $MIN_VALUE ]); } return $allTransferBounds[index]; @@ -214,8 +225,8 @@ export const $clearTransferBounds = (): void => continue; } - bounds[0] = bounds[1] = Number.MAX_VALUE; - bounds[2] = bounds[3] = -Number.MAX_VALUE; + bounds[0] = bounds[1] = $MAX_VALUE; + bounds[2] = bounds[3] = $MIN_VALUE; } for (let idx = 0; idx < $allTransferBounds.length; ++idx) { @@ -224,8 +235,8 @@ export const $clearTransferBounds = (): void => continue; } - bounds[0] = bounds[1] = Number.MAX_VALUE; - bounds[2] = bounds[3] = -Number.MAX_VALUE; + bounds[0] = bounds[1] = $MAX_VALUE; + bounds[2] = bounds[3] = $MIN_VALUE; } };