@next2d/webgpu 3.0.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.
Files changed (349) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +574 -0
  3. package/package.json +30 -0
  4. package/src/AtlasManager.d.ts +23 -0
  5. package/src/AtlasManager.js +123 -0
  6. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.d.ts +13 -0
  7. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.js +24 -0
  8. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.d.ts +15 -0
  9. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.js +31 -0
  10. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.d.ts +5 -0
  11. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.js +42 -0
  12. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.d.ts +16 -0
  13. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.js +28 -0
  14. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.d.ts +17 -0
  15. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.js +33 -0
  16. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.d.ts +16 -0
  17. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.js +28 -0
  18. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.d.ts +17 -0
  19. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.js +27 -0
  20. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.d.ts +18 -0
  21. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.js +27 -0
  22. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.d.ts +12 -0
  23. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.js +17 -0
  24. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.d.ts +26 -0
  25. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.js +43 -0
  26. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.d.ts +18 -0
  27. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.js +33 -0
  28. package/src/AttachmentManager.d.ts +19 -0
  29. package/src/AttachmentManager.js +105 -0
  30. package/src/BezierConverter/BezierConverter.d.ts +16 -0
  31. package/src/BezierConverter/BezierConverter.js +15 -0
  32. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.d.ts +15 -0
  33. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.js +37 -0
  34. package/src/BezierConverter/service/BezierConverterSplitCubicService.d.ts +15 -0
  35. package/src/BezierConverter/service/BezierConverterSplitCubicService.js +47 -0
  36. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.d.ts +29 -0
  37. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.js +80 -0
  38. package/src/Blend/BlendInstancedManager.d.ts +35 -0
  39. package/src/Blend/BlendInstancedManager.js +147 -0
  40. package/src/Blend/service/BlendAddService.d.ts +1 -0
  41. package/src/Blend/service/BlendAddService.js +8 -0
  42. package/src/Blend/service/BlendAlphaService.d.ts +1 -0
  43. package/src/Blend/service/BlendAlphaService.js +8 -0
  44. package/src/Blend/service/BlendEraseService.d.ts +1 -0
  45. package/src/Blend/service/BlendEraseService.js +8 -0
  46. package/src/Blend/service/BlendGetStateService.d.ts +12 -0
  47. package/src/Blend/service/BlendGetStateService.js +13 -0
  48. package/src/Blend/service/BlendOneZeroService.d.ts +1 -0
  49. package/src/Blend/service/BlendOneZeroService.js +8 -0
  50. package/src/Blend/service/BlendResetService.d.ts +1 -0
  51. package/src/Blend/service/BlendResetService.js +8 -0
  52. package/src/Blend/service/BlendScreenService.d.ts +1 -0
  53. package/src/Blend/service/BlendScreenService.js +8 -0
  54. package/src/Blend/service/BlendSetModeService.d.ts +2 -0
  55. package/src/Blend/service/BlendSetModeService.js +4 -0
  56. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.d.ts +6 -0
  57. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.js +79 -0
  58. package/src/Blend/usecase/BlendOperationUseCase.d.ts +11 -0
  59. package/src/Blend/usecase/BlendOperationUseCase.js +31 -0
  60. package/src/Blend.d.ts +8 -0
  61. package/src/Blend.js +91 -0
  62. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.d.ts +15 -0
  63. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.js +37 -0
  64. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.d.ts +13 -0
  65. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.js +23 -0
  66. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.d.ts +17 -0
  67. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.js +23 -0
  68. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.d.ts +12 -0
  69. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.js +32 -0
  70. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.d.ts +12 -0
  71. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.js +32 -0
  72. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.d.ts +12 -0
  73. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.js +20 -0
  74. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.d.ts +10 -0
  75. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.js +18 -0
  76. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.d.ts +15 -0
  77. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.js +51 -0
  78. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.d.ts +13 -0
  79. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.js +26 -0
  80. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.d.ts +14 -0
  81. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.js +46 -0
  82. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.d.ts +12 -0
  83. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.js +20 -0
  84. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.d.ts +9 -0
  85. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.js +15 -0
  86. package/src/BufferManager.d.ts +93 -0
  87. package/src/BufferManager.js +487 -0
  88. package/src/Compute/ComputePipelineManager.d.ts +61 -0
  89. package/src/Compute/ComputePipelineManager.js +313 -0
  90. package/src/Compute/service/ComputeExecuteBlurService.d.ts +21 -0
  91. package/src/Compute/service/ComputeExecuteBlurService.js +81 -0
  92. package/src/Context/service/ContextComputeBitmapMatrixService.d.ts +1 -0
  93. package/src/Context/service/ContextComputeBitmapMatrixService.js +74 -0
  94. package/src/Context/service/ContextComputeGradientMatrixService.d.ts +4 -0
  95. package/src/Context/service/ContextComputeGradientMatrixService.js +88 -0
  96. package/src/Context/service/ContextFillSimpleService.d.ts +2 -0
  97. package/src/Context/service/ContextFillSimpleService.js +28 -0
  98. package/src/Context/service/ContextFillWithStencilMainService.d.ts +2 -0
  99. package/src/Context/service/ContextFillWithStencilMainService.js +19 -0
  100. package/src/Context/service/ContextFillWithStencilService.d.ts +2 -0
  101. package/src/Context/service/ContextFillWithStencilService.js +19 -0
  102. package/src/Context/usecase/ContextApplyFilterUseCase.d.ts +5 -0
  103. package/src/Context/usecase/ContextApplyFilterUseCase.js +668 -0
  104. package/src/Context/usecase/ContextBitmapFillUseCase.d.ts +4 -0
  105. package/src/Context/usecase/ContextBitmapFillUseCase.js +210 -0
  106. package/src/Context/usecase/ContextBitmapStrokeUseCase.d.ts +4 -0
  107. package/src/Context/usecase/ContextBitmapStrokeUseCase.js +119 -0
  108. package/src/Context/usecase/ContextClipUseCase.d.ts +5 -0
  109. package/src/Context/usecase/ContextClipUseCase.js +101 -0
  110. package/src/Context/usecase/ContextContainerEndLayerUseCase.d.ts +5 -0
  111. package/src/Context/usecase/ContextContainerEndLayerUseCase.js +476 -0
  112. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.d.ts +6 -0
  113. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.js +135 -0
  114. package/src/Context/usecase/ContextDrawIndirectUseCase.d.ts +6 -0
  115. package/src/Context/usecase/ContextDrawIndirectUseCase.js +154 -0
  116. package/src/Context/usecase/ContextGradientFillUseCase.d.ts +4 -0
  117. package/src/Context/usecase/ContextGradientFillUseCase.js +230 -0
  118. package/src/Context/usecase/ContextGradientStrokeUseCase.d.ts +4 -0
  119. package/src/Context/usecase/ContextGradientStrokeUseCase.js +138 -0
  120. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.d.ts +6 -0
  121. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.js +213 -0
  122. package/src/Context.d.ts +430 -0
  123. package/src/Context.js +2453 -0
  124. package/src/FillTexturePool.d.ts +6 -0
  125. package/src/FillTexturePool.js +72 -0
  126. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.d.ts +10 -0
  127. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.js +214 -0
  128. package/src/Filter/BevelFilterShader.d.ts +2 -0
  129. package/src/Filter/BevelFilterShader.js +107 -0
  130. package/src/Filter/BitmapFilterShader.d.ts +2 -0
  131. package/src/Filter/BitmapFilterShader.js +207 -0
  132. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.d.ts +16 -0
  133. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.js +243 -0
  134. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.d.ts +40 -0
  135. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.js +51 -0
  136. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.d.ts +25 -0
  137. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.js +180 -0
  138. package/src/Filter/BlurFilterShader.d.ts +5 -0
  139. package/src/Filter/BlurFilterShader.js +109 -0
  140. package/src/Filter/BlurFilterUseCase.d.ts +36 -0
  141. package/src/Filter/BlurFilterUseCase.js +85 -0
  142. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.d.ts +12 -0
  143. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.js +90 -0
  144. package/src/Filter/ColorMatrixFilterShader.d.ts +4 -0
  145. package/src/Filter/ColorMatrixFilterShader.js +51 -0
  146. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.d.ts +6 -0
  147. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.js +144 -0
  148. package/src/Filter/ConvolutionFilterShader.d.ts +2 -0
  149. package/src/Filter/ConvolutionFilterShader.js +115 -0
  150. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.d.ts +6 -0
  151. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.js +172 -0
  152. package/src/Filter/DisplacementMapFilterShader.d.ts +2 -0
  153. package/src/Filter/DisplacementMapFilterShader.js +114 -0
  154. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.d.ts +24 -0
  155. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.js +179 -0
  156. package/src/Filter/DropShadowFilterShader.d.ts +4 -0
  157. package/src/Filter/DropShadowFilterShader.js +93 -0
  158. package/src/Filter/FilterGradientLUTCache.d.ts +29 -0
  159. package/src/Filter/FilterGradientLUTCache.js +84 -0
  160. package/src/Filter/FilterOffset.d.ts +8 -0
  161. package/src/Filter/FilterOffset.js +10 -0
  162. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.d.ts +24 -0
  163. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.js +143 -0
  164. package/src/Filter/GlowFilterShader.d.ts +4 -0
  165. package/src/Filter/GlowFilterShader.js +66 -0
  166. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.d.ts +29 -0
  167. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.js +216 -0
  168. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.d.ts +29 -0
  169. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.js +164 -0
  170. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.d.ts +4 -0
  171. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.js +23 -0
  172. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.d.ts +4 -0
  173. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.js +28 -0
  174. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.d.ts +11 -0
  175. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.js +19 -0
  176. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.d.ts +23 -0
  177. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.js +125 -0
  178. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.d.ts +14 -0
  179. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.js +23 -0
  180. package/src/FrameBufferManager.d.ts +24 -0
  181. package/src/FrameBufferManager.js +161 -0
  182. package/src/Gradient/GradientLUTCache.d.ts +61 -0
  183. package/src/Gradient/GradientLUTCache.js +153 -0
  184. package/src/Gradient/GradientLUTGenerator.d.ts +30 -0
  185. package/src/Gradient/GradientLUTGenerator.js +202 -0
  186. package/src/Grid.d.ts +18 -0
  187. package/src/Grid.js +21 -0
  188. package/src/Mask/service/MaskBeginMaskService.d.ts +9 -0
  189. package/src/Mask/service/MaskBeginMaskService.js +22 -0
  190. package/src/Mask/service/MaskEndMaskService.d.ts +15 -0
  191. package/src/Mask/service/MaskEndMaskService.js +36 -0
  192. package/src/Mask/service/MaskSetMaskBoundsService.d.ts +13 -0
  193. package/src/Mask/service/MaskSetMaskBoundsService.js +36 -0
  194. package/src/Mask/service/MaskUnionMaskService.d.ts +4 -0
  195. package/src/Mask/service/MaskUnionMaskService.js +74 -0
  196. package/src/Mask/usecase/MaskBindUseCase.d.ts +10 -0
  197. package/src/Mask/usecase/MaskBindUseCase.js +20 -0
  198. package/src/Mask/usecase/MaskLeaveMaskUseCase.d.ts +13 -0
  199. package/src/Mask/usecase/MaskLeaveMaskUseCase.js +51 -0
  200. package/src/Mask.d.ts +12 -0
  201. package/src/Mask.js +41 -0
  202. package/src/Mesh/service/MeshFillGenerateService.d.ts +19 -0
  203. package/src/Mesh/service/MeshFillGenerateService.js +76 -0
  204. package/src/Mesh/service/MeshLerpService.d.ts +13 -0
  205. package/src/Mesh/service/MeshLerpService.js +17 -0
  206. package/src/Mesh/service/MeshStrokeFillGenerateService.d.ts +19 -0
  207. package/src/Mesh/service/MeshStrokeFillGenerateService.js +76 -0
  208. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.d.ts +13 -0
  209. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.js +65 -0
  210. package/src/Mesh/usecase/MeshFillGenerateUseCase.d.ts +12 -0
  211. package/src/Mesh/usecase/MeshFillGenerateUseCase.js +48 -0
  212. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.d.ts +13 -0
  213. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.js +65 -0
  214. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.d.ts +14 -0
  215. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.js +28 -0
  216. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.d.ts +18 -0
  217. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.js +54 -0
  218. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.d.ts +25 -0
  219. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.js +608 -0
  220. package/src/PathCommand.d.ts +123 -0
  221. package/src/PathCommand.js +317 -0
  222. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.d.ts +11 -0
  223. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.js +35 -0
  224. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.d.ts +13 -0
  225. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.js +15 -0
  226. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.d.ts +15 -0
  227. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.js +30 -0
  228. package/src/SamplerCache.d.ts +18 -0
  229. package/src/SamplerCache.js +61 -0
  230. package/src/Shader/BlendModeShader.d.ts +51 -0
  231. package/src/Shader/BlendModeShader.js +71 -0
  232. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.d.ts +12 -0
  233. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.js +28 -0
  234. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.d.ts +13 -0
  235. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.js +61 -0
  236. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.d.ts +19 -0
  237. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.js +37 -0
  238. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.d.ts +11 -0
  239. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.js +24 -0
  240. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.d.ts +14 -0
  241. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.js +24 -0
  242. package/src/Shader/PipelineManager.d.ts +57 -0
  243. package/src/Shader/PipelineManager.js +2868 -0
  244. package/src/Shader/ShaderInstancedManager.d.ts +8 -0
  245. package/src/Shader/ShaderInstancedManager.js +18 -0
  246. package/src/Shader/ShaderSource.d.ts +60 -0
  247. package/src/Shader/ShaderSource.js +518 -0
  248. package/src/Shader/wgsl/common/SharedWgsl.d.ts +5 -0
  249. package/src/Shader/wgsl/common/SharedWgsl.js +37 -0
  250. package/src/Shader/wgsl/fragment/BasicFragment.d.ts +2 -0
  251. package/src/Shader/wgsl/fragment/BasicFragment.js +28 -0
  252. package/src/Shader/wgsl/fragment/BitmapFragment.d.ts +1 -0
  253. package/src/Shader/wgsl/fragment/BitmapFragment.js +43 -0
  254. package/src/Shader/wgsl/fragment/BlendFragment.d.ts +8 -0
  255. package/src/Shader/wgsl/fragment/BlendFragment.js +63 -0
  256. package/src/Shader/wgsl/fragment/EffectFragment.d.ts +6 -0
  257. package/src/Shader/wgsl/fragment/EffectFragment.js +324 -0
  258. package/src/Shader/wgsl/fragment/FillFragment.d.ts +1 -0
  259. package/src/Shader/wgsl/fragment/FillFragment.js +28 -0
  260. package/src/Shader/wgsl/fragment/FilterFragment.d.ts +10 -0
  261. package/src/Shader/wgsl/fragment/FilterFragment.js +212 -0
  262. package/src/Shader/wgsl/fragment/GradientFragment.d.ts +3 -0
  263. package/src/Shader/wgsl/fragment/GradientFragment.js +118 -0
  264. package/src/Shader/wgsl/fragment/InstancedFragment.d.ts +1 -0
  265. package/src/Shader/wgsl/fragment/InstancedFragment.js +20 -0
  266. package/src/Shader/wgsl/fragment/MaskFragment.d.ts +1 -0
  267. package/src/Shader/wgsl/fragment/MaskFragment.js +17 -0
  268. package/src/Shader/wgsl/fragment/StencilFragment.d.ts +2 -0
  269. package/src/Shader/wgsl/fragment/StencilFragment.js +33 -0
  270. package/src/Shader/wgsl/vertex/BasicVertex.d.ts +1 -0
  271. package/src/Shader/wgsl/vertex/BasicVertex.js +37 -0
  272. package/src/Shader/wgsl/vertex/BitmapVertex.d.ts +1 -0
  273. package/src/Shader/wgsl/vertex/BitmapVertex.js +43 -0
  274. package/src/Shader/wgsl/vertex/FillVertex.d.ts +1 -0
  275. package/src/Shader/wgsl/vertex/FillVertex.js +35 -0
  276. package/src/Shader/wgsl/vertex/FilterVertex.d.ts +12 -0
  277. package/src/Shader/wgsl/vertex/FilterVertex.js +193 -0
  278. package/src/Shader/wgsl/vertex/GradientVertex.d.ts +1 -0
  279. package/src/Shader/wgsl/vertex/GradientVertex.js +44 -0
  280. package/src/Shader/wgsl/vertex/InstancedVertex.d.ts +1 -0
  281. package/src/Shader/wgsl/vertex/InstancedVertex.js +48 -0
  282. package/src/Shader/wgsl/vertex/MaskVertex.d.ts +1 -0
  283. package/src/Shader/wgsl/vertex/MaskVertex.js +36 -0
  284. package/src/Shader/wgsl/vertex/StencilVertex.d.ts +2 -0
  285. package/src/Shader/wgsl/vertex/StencilVertex.js +66 -0
  286. package/src/TextureManager/service/TextureManagerInitializeSamplersService.d.ts +11 -0
  287. package/src/TextureManager/service/TextureManagerInitializeSamplersService.js +48 -0
  288. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.d.ts +13 -0
  289. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.js +30 -0
  290. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.d.ts +15 -0
  291. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.js +26 -0
  292. package/src/TextureManager.d.ts +15 -0
  293. package/src/TextureManager.js +87 -0
  294. package/src/TexturePool/service/TexturePoolCleanupService.d.ts +14 -0
  295. package/src/TexturePool/service/TexturePoolCleanupService.js +28 -0
  296. package/src/TexturePool/service/TexturePoolEvictOldestService.d.ts +11 -0
  297. package/src/TexturePool/service/TexturePoolEvictOldestService.js +24 -0
  298. package/src/TexturePool/service/TexturePoolReleaseService.d.ts +13 -0
  299. package/src/TexturePool/service/TexturePoolReleaseService.js +22 -0
  300. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.d.ts +19 -0
  301. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.js +90 -0
  302. package/src/TexturePool.d.ts +69 -0
  303. package/src/TexturePool.js +151 -0
  304. package/src/WebGPUUtil.d.ts +102 -0
  305. package/src/WebGPUUtil.js +157 -0
  306. package/src/index.d.ts +1 -0
  307. package/src/index.js +1 -0
  308. package/src/interface/IAttachmentObject.d.ts +41 -0
  309. package/src/interface/IAttachmentObject.js +1 -0
  310. package/src/interface/IBlendMode.d.ts +1 -0
  311. package/src/interface/IBlendMode.js +1 -0
  312. package/src/interface/IBlendState.d.ts +8 -0
  313. package/src/interface/IBlendState.js +1 -0
  314. package/src/interface/IBounds.d.ts +6 -0
  315. package/src/interface/IBounds.js +1 -0
  316. package/src/interface/ICachedBindGroup.d.ts +8 -0
  317. package/src/interface/ICachedBindGroup.js +1 -0
  318. package/src/interface/IColorBufferObject.d.ts +17 -0
  319. package/src/interface/IColorBufferObject.js +1 -0
  320. package/src/interface/IComplexBlendItem.d.ts +19 -0
  321. package/src/interface/IComplexBlendItem.js +1 -0
  322. package/src/interface/IFilterConfig.d.ts +29 -0
  323. package/src/interface/IFilterConfig.js +1 -0
  324. package/src/interface/IGradientLUTData.d.ts +8 -0
  325. package/src/interface/IGradientLUTData.js +1 -0
  326. package/src/interface/IGradientStop.d.ts +11 -0
  327. package/src/interface/IGradientStop.js +1 -0
  328. package/src/interface/ILocalFilterConfig.d.ts +21 -0
  329. package/src/interface/ILocalFilterConfig.js +1 -0
  330. package/src/interface/IMeshResult.d.ts +8 -0
  331. package/src/interface/IMeshResult.js +1 -0
  332. package/src/interface/IPath.d.ts +8 -0
  333. package/src/interface/IPath.js +1 -0
  334. package/src/interface/IPoint.d.ts +4 -0
  335. package/src/interface/IPoint.js +1 -0
  336. package/src/interface/IPooledBuffer.d.ts +8 -0
  337. package/src/interface/IPooledBuffer.js +1 -0
  338. package/src/interface/IPooledTexture.d.ts +17 -0
  339. package/src/interface/IPooledTexture.js +1 -0
  340. package/src/interface/IQuadraticSegment.d.ts +9 -0
  341. package/src/interface/IQuadraticSegment.js +1 -0
  342. package/src/interface/IRectangleInfo.d.ts +13 -0
  343. package/src/interface/IRectangleInfo.js +1 -0
  344. package/src/interface/IStencilBufferObject.d.ts +16 -0
  345. package/src/interface/IStencilBufferObject.js +1 -0
  346. package/src/interface/IStorageBufferConfig.d.ts +40 -0
  347. package/src/interface/IStorageBufferConfig.js +1 -0
  348. package/src/interface/ITextureObject.d.ts +16 -0
  349. package/src/interface/ITextureObject.js +1 -0
@@ -0,0 +1,608 @@
1
+ import { $context } from "../../WebGPUUtil";
2
+ /**
3
+ * @description Canvas 2Dコンテキスト(点が矩形内にあるか判定用)
4
+ */
5
+ const canvas = new OffscreenCanvas(1, 1);
6
+ const $canvasContext = canvas.getContext("2d");
7
+ /**
8
+ * @description 再利用可能なPointオブジェクト(GC回避)
9
+ */
10
+ const $startPoint = { "x": 0, "y": 0 };
11
+ const $controlPoint = { "x": 0, "y": 0 };
12
+ const $endPoint = { "x": 0, "y": 0 };
13
+ const $prevPoint = { "x": 0, "y": 0 };
14
+ /**
15
+ * @description 法線ベクトルを計算(WebGL版のMeshCalculateNormalVectorServiceと同じ)
16
+ * @param {number} x - 方向ベクトルのx成分
17
+ * @param {number} y - 方向ベクトルのy成分
18
+ * @param {number} thickness - 線の太さ(半分の値)
19
+ * @return {IPoint}
20
+ */
21
+ const calculateNormalVector = (x, y, thickness) => {
22
+ const magnitude = Math.sqrt(x * x + y * y);
23
+ if (magnitude === 0) {
24
+ return { "x": 0, "y": 0 };
25
+ }
26
+ return {
27
+ "x": -(y / magnitude) * thickness,
28
+ "y": x / magnitude * thickness
29
+ };
30
+ };
31
+ /**
32
+ * @description 線形補間(lerp)
33
+ */
34
+ const lerp = (p0, p1, t) => ({
35
+ "x": p0.x + (p1.x - p0.x) * t,
36
+ "y": p0.y + (p1.y - p0.y) * t
37
+ });
38
+ /**
39
+ * @description ベクトルの正規化
40
+ */
41
+ const normalize = (point) => {
42
+ const length = Math.sqrt(point.x * point.x + point.y * point.y);
43
+ return length === 0
44
+ ? { "x": 0, "y": 0 }
45
+ : { "x": point.x / length, "y": point.y / length };
46
+ };
47
+ /**
48
+ * @description 二次ベジェ曲線上の座標を計算
49
+ */
50
+ const getQuadraticBezierPoint = (t, s0, s1, s2) => ({
51
+ "x": (1 - t) ** 2 * s0.x + 2 * (1 - t) * t * s1.x + t ** 2 * s2.x,
52
+ "y": (1 - t) ** 2 * s0.y + 2 * (1 - t) * t * s1.y + t ** 2 * s2.y
53
+ });
54
+ /**
55
+ * @description 二次ベジェ曲線上の接線ベクトルを計算
56
+ */
57
+ const getQuadraticBezierTangent = (t, s0, s1, s2) => ({
58
+ "x": 2 * (1 - t) * (s1.x - s0.x) + 2 * t * (s2.x - s1.x),
59
+ "y": 2 * (1 - t) * (s1.y - s0.y) + 2 * t * (s2.y - s1.y)
60
+ });
61
+ /**
62
+ * @description 二次ベジェ曲線を分割
63
+ */
64
+ const splitQuadraticBezier = (s0, s1, s2, t = 0.5) => {
65
+ const M0 = lerp(s0, s1, t);
66
+ const M1 = lerp(s1, s2, t);
67
+ const M01 = lerp(M0, M1, t);
68
+ return [
69
+ [s0, M0, M01],
70
+ [M01, M1, s2]
71
+ ];
72
+ };
73
+ /**
74
+ * @description ベジェ曲線を複数回分割
75
+ */
76
+ const splitBezierMultipleTimes = (s0, s1, s2, n = 4) => {
77
+ let segments = [[s0, s1, s2]];
78
+ for (let i = 0; i < n; i++) {
79
+ const newSegments = [];
80
+ for (const seg of segments) {
81
+ const splitted = splitQuadraticBezier(seg[0], seg[1], seg[2], 0.5);
82
+ newSegments.push(splitted[0], splitted[1]);
83
+ }
84
+ segments = newSegments;
85
+ }
86
+ return segments;
87
+ };
88
+ /**
89
+ * @description 2次ベジェのオフセットを計算
90
+ */
91
+ const approximateOffsetQuadratic = (s0, s1, s2, offset) => {
92
+ const tValues = [0, 0.5, 1];
93
+ const newPoints = [];
94
+ for (const t of tValues) {
95
+ const pos = getQuadraticBezierPoint(t, s0, s1, s2);
96
+ const tan = getQuadraticBezierTangent(t, s0, s1, s2);
97
+ const n = normalize({ "x": -tan.y, "y": tan.x });
98
+ newPoints.push({
99
+ "x": pos.x + n.x * offset,
100
+ "y": pos.y + n.y * offset
101
+ });
102
+ }
103
+ return newPoints;
104
+ };
105
+ /**
106
+ * @description カーブの矩形を計算(WebGL版のMeshCalculateCurveRectangleUseCaseと同じ)
107
+ */
108
+ const calculateCurveRectangle = (startPoint, controlPoint, endPoint, thickness) => {
109
+ // WebGL版と同じ分割数(5回分割 = 32セグメント)
110
+ const segments = splitBezierMultipleTimes(startPoint, controlPoint, endPoint, 5);
111
+ const leftCurves = [];
112
+ const rightCurves = [];
113
+ for (const seg of segments) {
114
+ leftCurves.push(approximateOffsetQuadratic(seg[0], seg[1], seg[2], +thickness));
115
+ rightCurves.push(approximateOffsetQuadratic(seg[0], seg[1], seg[2], -thickness));
116
+ }
117
+ // セグメント間の連続性を確保:各セグメントの終点を次のセグメントの始点に強制一致
118
+ // これにより内側の曲線のつなぎめの隙間を解消
119
+ for (let idx = 0; idx < leftCurves.length - 1; ++idx) {
120
+ leftCurves[idx + 1][0] = leftCurves[idx][2];
121
+ }
122
+ for (let idx = 0; idx < rightCurves.length - 1; ++idx) {
123
+ rightCurves[idx + 1][0] = rightCurves[idx][2];
124
+ }
125
+ // 左サイドの最初のサブカーブ始点
126
+ const leftStart = leftCurves[0][0];
127
+ const paths = [leftStart.x, leftStart.y, false];
128
+ // 左サイド: WebGL版と同じく曲線フラグをtrueに設定(Loop-Blinn法で処理)
129
+ for (let idx = 0; idx < leftCurves.length; ++idx) {
130
+ const curves = leftCurves[idx];
131
+ paths.push(curves[1].x, curves[1].y, true, curves[2].x, curves[2].y, false);
132
+ }
133
+ const reversedRight = [...rightCurves].reverse();
134
+ for (let idx = 0; idx < reversedRight.length; ++idx) {
135
+ const [q0, q1, q2] = reversedRight[idx];
136
+ reversedRight[idx] = [q2, q1, q0]; // [Q2, Q1, Q0]
137
+ }
138
+ // 右サイドの最初のサブカーブ始点
139
+ const rightEnd = reversedRight[0][0];
140
+ paths.push(rightEnd.x, rightEnd.y, false);
141
+ // 右サイド: WebGL版と同じく曲線フラグをtrueに設定(Loop-Blinn法で処理)
142
+ for (let idx = 0; idx < reversedRight.length; ++idx) {
143
+ const curves = reversedRight[idx];
144
+ paths.push(curves[1].x, curves[1].y, true, curves[2].x, curves[2].y, false);
145
+ }
146
+ return paths;
147
+ };
148
+ /**
149
+ * @description 直線の矩形を計算(WebGL版のMeshCalculateLineRectangleUseCaseと同じ)
150
+ * @param {IPoint} startPoint - 開始点
151
+ * @param {IPoint} endPoint - 終了点
152
+ * @param {number} thickness - 線の太さ(半分の値)
153
+ * @return {IPath} 矩形パス
154
+ */
155
+ const calculateLineRectangle = (startPoint, endPoint, thickness) => {
156
+ const vector = {
157
+ "x": endPoint.x - startPoint.x,
158
+ "y": endPoint.y - startPoint.y
159
+ };
160
+ const normal = calculateNormalVector(vector.x, vector.y, thickness);
161
+ const shiftedUpStart = {
162
+ "x": startPoint.x + normal.x,
163
+ "y": startPoint.y + normal.y
164
+ };
165
+ const shiftedUpEnd = {
166
+ "x": endPoint.x + normal.x,
167
+ "y": endPoint.y + normal.y
168
+ };
169
+ const shiftedDownEnd = {
170
+ "x": endPoint.x - normal.x,
171
+ "y": endPoint.y - normal.y
172
+ };
173
+ const shiftedDownStart = {
174
+ "x": startPoint.x - normal.x,
175
+ "y": startPoint.y - normal.y
176
+ };
177
+ return [
178
+ shiftedUpStart.x, shiftedUpStart.y, false,
179
+ shiftedUpEnd.x, shiftedUpEnd.y, false,
180
+ shiftedDownEnd.x, shiftedDownEnd.y, false,
181
+ shiftedDownStart.x, shiftedDownStart.y, false,
182
+ shiftedUpStart.x, shiftedUpStart.y, false
183
+ ];
184
+ };
185
+ /**
186
+ * @description メッシュのパスの中で指定座標が含まれる線を探す
187
+ * WebGL版のMeshFindOverlappingPathsServiceと同じ
188
+ */
189
+ const findOverlappingPaths = (x, y, r, paths) => {
190
+ const points = [];
191
+ // 浮動小数点誤差を考慮した許容範囲(非常に小さい値)
192
+ const epsilon = 0.0001;
193
+ for (let idx = 0; idx < paths.length; idx += 3) {
194
+ // カーブのコントロール座標なら終了
195
+ if (paths[idx + 2]) {
196
+ continue;
197
+ }
198
+ const dx = paths[idx];
199
+ const dy = paths[idx + 1];
200
+ const distance = Math.sqrt(Math.pow(dx - x, 2) + Math.pow(dy - y, 2));
201
+ // 浮動小数点誤差を考慮した比較
202
+ if (Math.abs(distance - r) > epsilon) {
203
+ continue;
204
+ }
205
+ points.push(dx, dy);
206
+ }
207
+ return points;
208
+ };
209
+ /**
210
+ * @description 矩形内に含まれてない座標を返却
211
+ * WebGL版のMeshIsPointInsideRectangleServiceと同じ
212
+ */
213
+ const findPointOutsideRectangle = (points, rectangle) => {
214
+ $canvasContext.beginPath();
215
+ $canvasContext.moveTo(rectangle[0], rectangle[1]);
216
+ for (let idx = 3; idx < rectangle.length; idx += 3) {
217
+ if (rectangle[idx + 2]) {
218
+ $canvasContext.quadraticCurveTo(rectangle[idx], rectangle[idx + 1], rectangle[idx + 3], rectangle[idx + 4]);
219
+ idx += 3;
220
+ }
221
+ else {
222
+ $canvasContext.lineTo(rectangle[idx], rectangle[idx + 1]);
223
+ }
224
+ }
225
+ $canvasContext.closePath();
226
+ for (let idx = 0; idx < points.length; idx += 2) {
227
+ const px = points[idx];
228
+ const py = points[idx + 1];
229
+ if ($canvasContext.isPointInPath(px, py)) {
230
+ continue;
231
+ }
232
+ return [px, py];
233
+ }
234
+ return null;
235
+ };
236
+ /**
237
+ * @description ベベル結合を生成(WebGL版のMeshGenerateCalculateBevelJoinUseCaseと同じ)
238
+ */
239
+ const generateBevelJoin = (x, y, r, rectangles, isLast = false) => {
240
+ // WebGL版と同じ: isLastフラグでインデックスを切り替え
241
+ const indexA = isLast ? 0 : rectangles.length - 1;
242
+ const indexB = isLast ? rectangles.length - 1 : rectangles.length - 2;
243
+ const pathsA = findOverlappingPaths(x, y, r, rectangles[indexA]);
244
+ const pathsB = findOverlappingPaths(x, y, r, rectangles[indexB]);
245
+ // パスが並行であれば終了
246
+ if (pathsA[0] === pathsB[0] && pathsA[1] === pathsB[1]
247
+ || pathsA[0] === pathsB[2] && pathsA[1] === pathsB[3]) {
248
+ return;
249
+ }
250
+ const pointA = findPointOutsideRectangle(pathsA, rectangles[indexB]);
251
+ if (!pointA) {
252
+ return;
253
+ }
254
+ const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
255
+ if (!pointB) {
256
+ return;
257
+ }
258
+ rectangles.splice(-1, 0, [
259
+ x, y, false,
260
+ pointA[0], pointA[1], false,
261
+ pointB[0], pointB[1], false,
262
+ x, y, false
263
+ ]);
264
+ };
265
+ /**
266
+ * @description ラウンド結合を生成(WebGL版のMeshGenerateCalculateRoundJoinUseCaseと同じ)
267
+ */
268
+ const generateRoundJoin = (x, y, r, rectangles, isLast = false) => {
269
+ // WebGL版と同じ: isLastフラグでインデックスを切り替え
270
+ const indexA = isLast ? 0 : rectangles.length - 1;
271
+ const indexB = isLast ? rectangles.length - 1 : rectangles.length - 2;
272
+ const pathsA = findOverlappingPaths(x, y, r, rectangles[indexA]);
273
+ const pathsB = findOverlappingPaths(x, y, r, rectangles[indexB]);
274
+ const pointA = findPointOutsideRectangle(pathsA, rectangles[indexB]);
275
+ if (!pointA) {
276
+ return;
277
+ }
278
+ const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
279
+ if (!pointB) {
280
+ return;
281
+ }
282
+ const angleA = Math.atan2(pointA[1] - y, pointA[0] - x);
283
+ const angleB = Math.atan2(pointB[1] - y, pointB[0] - x);
284
+ // 角度差を正規化して180度以下にする
285
+ let angleDiff = angleB - angleA;
286
+ if (angleDiff > Math.PI) {
287
+ angleDiff -= 2 * Math.PI;
288
+ }
289
+ else if (angleDiff < -Math.PI) {
290
+ angleDiff += 2 * Math.PI;
291
+ }
292
+ const segment = 8;
293
+ const step = angleDiff / segment;
294
+ const points = [x, y, false];
295
+ for (let idx = 0; idx <= segment; idx++) {
296
+ const angle = angleA + idx * step;
297
+ const dx = x + r * Math.cos(angle);
298
+ const dy = y + r * Math.sin(angle);
299
+ points.push(dx, dy, false);
300
+ }
301
+ rectangles.splice(-1, 0, points);
302
+ };
303
+ /**
304
+ * @description マイター結合を生成(WebGL版のMeshGenerateCalculateMiterJoinUseCaseと同じ)
305
+ */
306
+ const generateMiterJoin = (startPoint, endPoint, prevPoint, r, rectangles, isLast = false) => {
307
+ const indexA = isLast ? 0 : rectangles.length - 1;
308
+ const indexB = isLast ? rectangles.length - 1 : rectangles.length - 2;
309
+ const pathsA = findOverlappingPaths(startPoint.x, startPoint.y, r, rectangles[indexA]);
310
+ const pathsB = findOverlappingPaths(startPoint.x, startPoint.y, r, rectangles[indexB]);
311
+ // パスが並行であれば終了
312
+ if (pathsA[0] === pathsB[0] && pathsA[1] === pathsB[1]
313
+ || pathsA[0] === pathsB[2] && pathsA[1] === pathsB[3]) {
314
+ return;
315
+ }
316
+ const pointA = findPointOutsideRectangle(pathsA, rectangles[indexB]);
317
+ if (!pointA) {
318
+ return;
319
+ }
320
+ const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
321
+ if (!pointB) {
322
+ return;
323
+ }
324
+ const aVx = endPoint.x - startPoint.x;
325
+ const aVy = endPoint.y - startPoint.y;
326
+ const lengthA = Math.hypot(aVx, aVy);
327
+ const normalizeA = {
328
+ "x": aVx / lengthA,
329
+ "y": aVy / lengthA
330
+ };
331
+ const bVx = prevPoint.x - startPoint.x;
332
+ const bVy = prevPoint.y - startPoint.y;
333
+ const lengthB = Math.hypot(bVx, bVy);
334
+ const normalizeB = {
335
+ "x": bVx / lengthB,
336
+ "y": bVy / lengthB
337
+ };
338
+ const d1x = normalizeA.x, d1y = normalizeA.y;
339
+ const d2x = normalizeB.x, d2y = normalizeB.y;
340
+ const denom = d1x * d2y - d1y * d2x;
341
+ if (denom === 0) {
342
+ rectangles.splice(-1, 0, [
343
+ startPoint.x, startPoint.y, false,
344
+ pointA[0], pointA[1], false,
345
+ pointB[0], pointB[1], false
346
+ ]);
347
+ return;
348
+ }
349
+ const t = ((pointB[0] - pointA[0]) * d2y - (pointB[1] - pointA[1]) * d2x) / denom;
350
+ const ix = pointA[0] + t * d1x;
351
+ const iy = pointA[1] + t * d1y;
352
+ rectangles.splice(-1, 0, [
353
+ startPoint.x, startPoint.y, false,
354
+ pointA[0], pointA[1], false,
355
+ ix, iy, false,
356
+ startPoint.x, startPoint.y, false,
357
+ pointB[0], pointB[1], false,
358
+ ix, iy, false
359
+ ]);
360
+ };
361
+ /**
362
+ * @description ラウンドキャップを生成(WebGL版のMeshGenerateCalculateRoundCapServiceと同じ)
363
+ */
364
+ const generateRoundCap = (vertices, thickness, rectangles) => {
365
+ // 始点のキャップ
366
+ // WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
367
+ // カーブの場合、制御点への方向が正しい接線方向となる
368
+ const startX = vertices[0];
369
+ const startY = vertices[1];
370
+ const startNextX = vertices[3];
371
+ const startNextY = vertices[4];
372
+ const startAngle = Math.atan2(startY - startNextY, startX - startNextX);
373
+ const startCapPath = [startX, startY, false];
374
+ const segment = 8;
375
+ for (let i = 0; i <= segment; i++) {
376
+ const angle = startAngle - Math.PI / 2 + i * Math.PI / segment;
377
+ startCapPath.push(startX + thickness * Math.cos(angle), startY + thickness * Math.sin(angle), false);
378
+ }
379
+ rectangles.unshift(startCapPath);
380
+ // 終点のキャップ
381
+ // WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
382
+ const endX = vertices[vertices.length - 3];
383
+ const endY = vertices[vertices.length - 2];
384
+ const endPrevX = vertices[vertices.length - 6];
385
+ const endPrevY = vertices[vertices.length - 5];
386
+ const endAngle = Math.atan2(endY - endPrevY, endX - endPrevX);
387
+ const endCapPath = [endX, endY, false];
388
+ for (let i = 0; i <= segment; i++) {
389
+ const angle = endAngle - Math.PI / 2 + i * Math.PI / segment;
390
+ endCapPath.push(endX + thickness * Math.cos(angle), endY + thickness * Math.sin(angle), false);
391
+ }
392
+ rectangles.push(endCapPath);
393
+ };
394
+ /**
395
+ * @description スクエアキャップを生成(WebGL版のMeshGenerateCalculateSquareCapServiceと同じ)
396
+ */
397
+ const generateSquareCap = (vertices, thickness, rectangles) => {
398
+ // 始点のキャップ
399
+ // WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
400
+ const startX = vertices[0];
401
+ const startY = vertices[1];
402
+ const startNextX = vertices[3];
403
+ const startNextY = vertices[4];
404
+ const startDx = startX - startNextX;
405
+ const startDy = startY - startNextY;
406
+ const startLen = Math.hypot(startDx, startDy);
407
+ if (startLen > 0) {
408
+ const startNx = startDx / startLen;
409
+ const startNy = startDy / startLen;
410
+ const startExtX = startX + startNx * thickness;
411
+ const startExtY = startY + startNy * thickness;
412
+ const startCapPath = [
413
+ startX - startNy * thickness, startY + startNx * thickness, false,
414
+ startExtX - startNy * thickness, startExtY + startNx * thickness, false,
415
+ startExtX + startNy * thickness, startExtY - startNx * thickness, false,
416
+ startX + startNy * thickness, startY - startNx * thickness, false,
417
+ startX - startNy * thickness, startY + startNx * thickness, false
418
+ ];
419
+ rectangles.unshift(startCapPath);
420
+ }
421
+ // 終点のキャップ
422
+ // WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
423
+ const endX = vertices[vertices.length - 3];
424
+ const endY = vertices[vertices.length - 2];
425
+ const endPrevX = vertices[vertices.length - 6];
426
+ const endPrevY = vertices[vertices.length - 5];
427
+ const endDx = endX - endPrevX;
428
+ const endDy = endY - endPrevY;
429
+ const endLen = Math.hypot(endDx, endDy);
430
+ if (endLen > 0) {
431
+ const endNx = endDx / endLen;
432
+ const endNy = endDy / endLen;
433
+ const endExtX = endX + endNx * thickness;
434
+ const endExtY = endY + endNy * thickness;
435
+ const endCapPath = [
436
+ endX - endNy * thickness, endY + endNx * thickness, false,
437
+ endExtX - endNy * thickness, endExtY + endNx * thickness, false,
438
+ endExtX + endNy * thickness, endExtY - endNx * thickness, false,
439
+ endX + endNy * thickness, endY - endNx * thickness, false,
440
+ endX - endNy * thickness, endY + endNx * thickness, false
441
+ ];
442
+ rectangles.push(endCapPath);
443
+ }
444
+ };
445
+ /**
446
+ * @description 線の外周を算出して塗りのフォーマットで返却(WebGL版と同じ)
447
+ * Calculate the outer circumference of the line and return it in the format of the fill
448
+ *
449
+ * @param {IPath} vertices - パス頂点 [x, y, isCurve, ...]
450
+ * @param {number} thickness - 線の太さ(半分の値)
451
+ * @return {IPath[]} パス配列
452
+ */
453
+ export const generateStrokeOutline = (vertices, thickness) => {
454
+ // 再利用可能なオブジェクトを使用
455
+ const startPoint = $startPoint;
456
+ startPoint.x = vertices[0];
457
+ startPoint.y = vertices[1];
458
+ const controlPoint = $controlPoint;
459
+ controlPoint.x = 0;
460
+ controlPoint.y = 0;
461
+ const endPoint = $endPoint;
462
+ endPoint.x = 0;
463
+ endPoint.y = 0;
464
+ const prevPoint = $prevPoint;
465
+ prevPoint.x = 0;
466
+ prevPoint.y = 0;
467
+ const rectangles = [];
468
+ for (let idx = 3; idx < vertices.length; idx += 3) {
469
+ const x = vertices[idx];
470
+ const y = vertices[idx + 1];
471
+ if (vertices[idx + 2]) {
472
+ controlPoint.x = x;
473
+ controlPoint.y = y;
474
+ continue;
475
+ }
476
+ endPoint.x = x;
477
+ endPoint.y = y;
478
+ if (vertices[idx - 1]) {
479
+ rectangles.push(calculateCurveRectangle(startPoint, controlPoint, endPoint, thickness));
480
+ }
481
+ else {
482
+ rectangles.push(calculateLineRectangle(startPoint, endPoint, thickness));
483
+ }
484
+ if (rectangles.length > 1) {
485
+ switch ($context.joints) {
486
+ case 0: // bevel
487
+ generateBevelJoin(startPoint.x, startPoint.y, thickness, rectangles);
488
+ break;
489
+ case 1: // miter
490
+ prevPoint.x = vertices[idx - 6];
491
+ prevPoint.y = vertices[idx - 5];
492
+ generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles);
493
+ break;
494
+ case 2: // round
495
+ generateRoundJoin(startPoint.x, startPoint.y, thickness, rectangles);
496
+ break;
497
+ }
498
+ }
499
+ startPoint.x = endPoint.x;
500
+ startPoint.y = endPoint.y;
501
+ }
502
+ // 始点と終点が繋がっているかどうかをチェック(浮動小数点誤差を考慮)
503
+ const startX = vertices[0];
504
+ const startY = vertices[1];
505
+ const endX = vertices[vertices.length - 3];
506
+ const endY = vertices[vertices.length - 2];
507
+ const closedEpsilon = 0.0001; // 非常に小さい許容誤差
508
+ const isClosed = Math.abs(startX - endX) < closedEpsilon
509
+ && Math.abs(startY - endY) < closedEpsilon
510
+ && rectangles.length > 1;
511
+ if (isClosed) {
512
+ // 始点と終点が繋がっている時はjointsの設定を適用(WebGL版と同じ)
513
+ switch ($context.joints) {
514
+ case 0: // bevel
515
+ generateBevelJoin(startX, startY, thickness, rectangles, true);
516
+ break;
517
+ case 1: // miter
518
+ startPoint.x = startX;
519
+ startPoint.y = startY;
520
+ endPoint.x = vertices[3];
521
+ endPoint.y = vertices[4];
522
+ prevPoint.x = vertices[vertices.length - 6];
523
+ prevPoint.y = vertices[vertices.length - 5];
524
+ generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles, true);
525
+ break;
526
+ case 2: // round
527
+ generateRoundJoin(startX, startY, thickness, rectangles, true);
528
+ break;
529
+ default:
530
+ break;
531
+ }
532
+ }
533
+ else if (rectangles.length > 0) {
534
+ // 始点と終点が繋がってない時はcapsの設定を適用
535
+ switch ($context.caps) {
536
+ case 1: // round
537
+ generateRoundCap(vertices, thickness, rectangles);
538
+ break;
539
+ case 2: // square
540
+ generateSquareCap(vertices, thickness, rectangles);
541
+ break;
542
+ default:
543
+ break;
544
+ }
545
+ }
546
+ return rectangles;
547
+ };
548
+ /**
549
+ * @description ストロークメッシュを生成(WebGL版のMeshStrokeGenerateUseCaseと同じ)
550
+ * @param {IPath[]} vertices - パス頂点配列
551
+ * @param {number} thickness - 線の太さ(フル値、内部で/2される)
552
+ * @return {IPath[]}
553
+ */
554
+ export const generateStrokeMesh = (vertices, thickness) => {
555
+ // WebGL版と同じ: 内部で半分にする
556
+ const halfThickness = thickness / 2;
557
+ const fillVertices = [];
558
+ for (const path of vertices) {
559
+ if (path.length < 6) {
560
+ continue;
561
+ }
562
+ const outlines = generateStrokeOutline(path, halfThickness);
563
+ for (const outline of outlines) {
564
+ fillVertices.push(outline);
565
+ }
566
+ }
567
+ return fillVertices;
568
+ };
569
+ /**
570
+ * @description IPoint[][]形式からストロークメッシュを生成(後方互換用)
571
+ * @param {IPoint[][]} paths - パス配列
572
+ * @param {number} thickness - 線の太さ
573
+ * @return {Float32Array}
574
+ */
575
+ export const generateStrokeMeshFromPoints = (paths, thickness) => {
576
+ const triangles = [];
577
+ // WebGL版と同じ: 内部で半分にする
578
+ const halfThickness = thickness / 2;
579
+ for (const path of paths) {
580
+ if (path.length < 2) {
581
+ continue;
582
+ }
583
+ // 各線分に対して矩形を生成
584
+ for (let i = 0; i < path.length - 1; i++) {
585
+ const startPoint = path[i];
586
+ const endPoint = path[i + 1];
587
+ const vector = {
588
+ "x": endPoint.x - startPoint.x,
589
+ "y": endPoint.y - startPoint.y
590
+ };
591
+ const normal = calculateNormalVector(vector.x, vector.y, halfThickness);
592
+ // 矩形の4頂点
593
+ const p0x = startPoint.x + normal.x;
594
+ const p0y = startPoint.y + normal.y;
595
+ const p1x = endPoint.x + normal.x;
596
+ const p1y = endPoint.y + normal.y;
597
+ const p2x = endPoint.x - normal.x;
598
+ const p2y = endPoint.y - normal.y;
599
+ const p3x = startPoint.x - normal.x;
600
+ const p3y = startPoint.y - normal.y;
601
+ // Triangle 1: p0, p1, p2
602
+ triangles.push(p0x, p0y, 0, 0, p1x, p1y, 0, 0, p2x, p2y, 0, 0);
603
+ // Triangle 2: p0, p2, p3
604
+ triangles.push(p0x, p0y, 0, 0, p2x, p2y, 0, 0, p3x, p3y, 0, 0);
605
+ }
606
+ }
607
+ return new Float32Array(triangles);
608
+ };