@next2d/webgpu 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 +3 -3
- package/src/AtlasManager.d.ts +75 -6
- package/src/AtlasManager.js +106 -30
- package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.d.ts +2 -2
- package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.js +3 -3
- package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.d.ts +4 -4
- package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.js +4 -4
- package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.d.ts +5 -5
- package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.js +6 -6
- package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.d.ts +6 -6
- package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.js +7 -7
- package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.d.ts +6 -6
- package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.js +9 -9
- package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.d.ts +6 -6
- package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.js +10 -10
- package/src/AttachmentManager/service/AttachmentManagerGetTextureService.d.ts +7 -7
- package/src/AttachmentManager/service/AttachmentManagerGetTextureService.js +10 -10
- package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.d.ts +3 -3
- package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.js +7 -7
- package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.d.ts +10 -10
- package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.js +16 -16
- package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.d.ts +6 -6
- package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.js +10 -10
- package/src/AttachmentManager.d.ts +28 -6
- package/src/AttachmentManager.js +28 -23
- package/src/BezierConverter/BezierConverter.d.ts +9 -3
- package/src/BezierConverter/BezierConverter.js +5 -3
- package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.d.ts +2 -13
- package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.js +13 -25
- package/src/Blend/BlendInstancedManager.d.ts +19 -15
- package/src/Blend/BlendInstancedManager.js +35 -22
- package/src/Blend/usecase/BlendApplyComplexBlendUseCase.d.ts +9 -2
- package/src/Blend/usecase/BlendApplyComplexBlendUseCase.js +28 -17
- package/src/Blend.d.ts +20 -2
- package/src/Blend.js +20 -4
- package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.js +2 -2
- package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.js +2 -2
- package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.d.ts +1 -0
- package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.js +1 -0
- package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.d.ts +1 -0
- package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.js +1 -0
- package/src/BufferManager.d.ts +108 -43
- package/src/BufferManager.js +113 -153
- package/src/Context/service/ContextComputeBitmapMatrixService.d.ts +7 -0
- package/src/Context/service/ContextComputeBitmapMatrixService.js +7 -0
- package/src/Context/service/ContextComputeGradientMatrixService.d.ts +9 -1
- package/src/Context/service/ContextComputeGradientMatrixService.js +15 -7
- package/src/Context/service/ContextFillSimpleService.d.ts +14 -0
- package/src/Context/service/ContextFillSimpleService.js +14 -0
- package/src/Context/service/ContextFillWithStencilMainService.d.ts +11 -0
- package/src/Context/service/ContextFillWithStencilMainService.js +11 -0
- package/src/Context/service/ContextFillWithStencilService.d.ts +11 -0
- package/src/Context/service/ContextFillWithStencilService.js +11 -0
- package/src/Context/usecase/ContextApplyFilterUseCase.d.ts +17 -0
- package/src/Context/usecase/ContextApplyFilterUseCase.js +201 -62
- package/src/Context/usecase/ContextBitmapFillUseCase.d.ts +23 -0
- package/src/Context/usecase/ContextBitmapFillUseCase.js +47 -0
- package/src/Context/usecase/ContextBitmapStrokeUseCase.d.ts +23 -0
- package/src/Context/usecase/ContextBitmapStrokeUseCase.js +35 -0
- package/src/Context/usecase/ContextClipUseCase.d.ts +15 -0
- package/src/Context/usecase/ContextClipUseCase.js +19 -0
- package/src/Context/usecase/ContextContainerEndLayerUseCase.d.ts +21 -1
- package/src/Context/usecase/ContextContainerEndLayerUseCase.js +195 -104
- package/src/Context/usecase/ContextDrawArraysInstancedUseCase.d.ts +13 -0
- package/src/Context/usecase/ContextDrawArraysInstancedUseCase.js +41 -20
- package/src/Context/usecase/ContextDrawIndirectUseCase.d.ts +16 -1
- package/src/Context/usecase/ContextDrawIndirectUseCase.js +53 -30
- package/src/Context/usecase/ContextGradientFillUseCase.d.ts +23 -0
- package/src/Context/usecase/ContextGradientFillUseCase.js +47 -0
- package/src/Context/usecase/ContextGradientStrokeUseCase.d.ts +23 -0
- package/src/Context/usecase/ContextGradientStrokeUseCase.js +35 -0
- package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.d.ts +13 -1
- package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.js +126 -60
- package/src/Context.d.ts +445 -63
- package/src/Context.js +566 -144
- package/src/FillTexturePool.d.ts +39 -0
- package/src/FillTexturePool.js +70 -7
- package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.d.ts +21 -2
- package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.js +33 -26
- package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.d.ts +5 -5
- package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.js +81 -64
- package/src/Filter/BlurFilterUseCase.d.ts +15 -11
- package/src/Filter/BlurFilterUseCase.js +22 -17
- package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.d.ts +2 -2
- package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.js +5 -5
- package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.d.ts +15 -1
- package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.js +23 -17
- package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.d.ts +20 -1
- package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.js +37 -26
- package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.d.ts +7 -7
- package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.js +19 -31
- package/src/Filter/FilterGradientLUTCache.js +2 -0
- package/src/Filter/FilterUtil.d.ts +23 -0
- package/src/Filter/FilterUtil.js +33 -0
- package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.d.ts +5 -5
- package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.js +12 -21
- package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.d.ts +6 -6
- package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.js +16 -19
- package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.d.ts +5 -5
- package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.js +13 -16
- package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.d.ts +13 -1
- package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.js +30 -3
- package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.d.ts +11 -1
- package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.js +36 -6
- package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.d.ts +10 -10
- package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.js +15 -15
- package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.d.ts +4 -4
- package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.js +5 -5
- package/src/FrameBufferManager.d.ts +95 -3
- package/src/FrameBufferManager.js +97 -8
- package/src/Gradient/GradientLUTCache.d.ts +36 -4
- package/src/Gradient/GradientLUTCache.js +61 -5
- package/src/Gradient/GradientLUTGenerator.d.ts +26 -14
- package/src/Gradient/GradientLUTGenerator.js +74 -43
- package/src/Mask/service/MaskUnionMaskService.d.ts +16 -1
- package/src/Mask/service/MaskUnionMaskService.js +45 -31
- package/src/Mask.d.ts +57 -3
- package/src/Mask.js +75 -11
- package/src/Mesh/service/MeshFillGenerateService.d.ts +4 -4
- package/src/Mesh/service/MeshFillGenerateService.js +4 -4
- package/src/Mesh/service/MeshStrokeFillGenerateService.d.ts +4 -4
- package/src/Mesh/service/MeshStrokeFillGenerateService.js +4 -4
- package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.d.ts +3 -3
- package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.js +10 -3
- package/src/Mesh/usecase/MeshFillGenerateUseCase.d.ts +2 -2
- package/src/Mesh/usecase/MeshFillGenerateUseCase.js +9 -2
- package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.d.ts +3 -3
- package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.js +10 -3
- package/src/Mesh/usecase/MeshStrokeGenerateUseCase.d.ts +8 -14
- package/src/Mesh/usecase/MeshStrokeGenerateUseCase.js +214 -129
- package/src/PathCommand.d.ts +24 -23
- package/src/PathCommand.js +25 -79
- package/src/Shader/PipelineManager.d.ts +223 -6
- package/src/Shader/PipelineManager.js +308 -66
- package/src/Shader/ShaderInstancedManager.d.ts +17 -0
- package/src/Shader/ShaderInstancedManager.js +17 -0
- package/src/Shader/ShaderSource.d.ts +317 -12
- package/src/Shader/ShaderSource.js +328 -39
- package/src/Shader/wgsl/common/SharedWgsl.d.ts +28 -1
- package/src/Shader/wgsl/common/SharedWgsl.js +28 -9
- package/src/Shader/wgsl/fragment/BasicFragment.d.ts +14 -0
- package/src/Shader/wgsl/fragment/BasicFragment.js +14 -0
- package/src/Shader/wgsl/fragment/BitmapFragment.d.ts +7 -0
- package/src/Shader/wgsl/fragment/BitmapFragment.js +7 -0
- package/src/Shader/wgsl/fragment/EffectFragment.d.ts +42 -0
- package/src/Shader/wgsl/fragment/EffectFragment.js +42 -0
- package/src/Shader/wgsl/fragment/FillFragment.d.ts +7 -0
- package/src/Shader/wgsl/fragment/FillFragment.js +7 -0
- package/src/Shader/wgsl/fragment/FilterFragment.d.ts +70 -0
- package/src/Shader/wgsl/fragment/FilterFragment.js +70 -0
- package/src/Shader/wgsl/fragment/GradientFragment.d.ts +21 -0
- package/src/Shader/wgsl/fragment/GradientFragment.js +43 -8
- package/src/Shader/wgsl/fragment/InstancedFragment.d.ts +7 -0
- package/src/Shader/wgsl/fragment/InstancedFragment.js +7 -0
- package/src/Shader/wgsl/fragment/MaskFragment.d.ts +7 -0
- package/src/Shader/wgsl/fragment/MaskFragment.js +7 -0
- package/src/Shader/wgsl/fragment/StencilFragment.d.ts +14 -0
- package/src/Shader/wgsl/fragment/StencilFragment.js +14 -0
- package/src/Shader/wgsl/vertex/BasicVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/BasicVertex.js +7 -0
- package/src/Shader/wgsl/vertex/BitmapVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/BitmapVertex.js +7 -0
- package/src/Shader/wgsl/vertex/FillVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/FillVertex.js +7 -0
- package/src/Shader/wgsl/vertex/FilterVertex.d.ts +77 -1
- package/src/Shader/wgsl/vertex/FilterVertex.js +135 -42
- package/src/Shader/wgsl/vertex/GradientVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/GradientVertex.js +7 -0
- package/src/Shader/wgsl/vertex/InstancedVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/InstancedVertex.js +7 -0
- package/src/Shader/wgsl/vertex/MaskVertex.d.ts +7 -0
- package/src/Shader/wgsl/vertex/MaskVertex.js +7 -0
- package/src/Shader/wgsl/vertex/StencilVertex.d.ts +14 -0
- package/src/Shader/wgsl/vertex/StencilVertex.js +14 -0
- package/src/TextureManager/service/TextureManagerInitializeSamplersService.d.ts +2 -2
- package/src/TextureManager/service/TextureManagerInitializeSamplersService.js +2 -2
- package/src/TextureManager.d.ts +36 -5
- package/src/TextureManager.js +36 -24
- package/src/TexturePool/service/TexturePoolCleanupService.d.ts +4 -4
- package/src/TexturePool/service/TexturePoolCleanupService.js +6 -6
- package/src/TexturePool/service/TexturePoolReleaseService.d.ts +4 -4
- package/src/TexturePool/service/TexturePoolReleaseService.js +5 -5
- package/src/TexturePool/usecase/TexturePoolAcquireUseCase.d.ts +10 -10
- package/src/TexturePool/usecase/TexturePoolAcquireUseCase.js +19 -18
- package/src/TexturePool.d.ts +36 -35
- package/src/TexturePool.js +44 -65
- package/src/WebGPUUtil.d.ts +79 -34
- package/src/WebGPUUtil.js +79 -36
- package/src/interface/IAttachmentObject.d.ts +36 -0
- package/src/interface/IBlendMode.d.ts +7 -0
- package/src/interface/IBlendState.d.ts +8 -0
- package/src/interface/IBounds.d.ts +23 -0
- package/src/interface/IColorBufferObject.d.ts +28 -0
- package/src/interface/IComplexBlendItem.d.ts +48 -0
- package/src/interface/IFilterConfig.d.ts +28 -2
- package/src/interface/IGradientStop.d.ts +20 -0
- package/src/interface/ILocalFilterConfig.d.ts +32 -2
- package/src/interface/IMeshResult.d.ts +8 -0
- package/src/interface/IPoint.d.ts +12 -0
- package/src/interface/IPooledTexture.d.ts +24 -0
- package/src/interface/IQuadraticSegment.d.ts +8 -0
- package/src/interface/IStencilBufferObject.d.ts +28 -0
- package/src/interface/IStorageBufferConfig.d.ts +8 -1
- package/src/interface/ITextureObject.d.ts +28 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.d.ts +0 -5
- package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.js +0 -42
- package/src/Blend/service/BlendAddService.d.ts +0 -1
- package/src/Blend/service/BlendAddService.js +0 -8
- package/src/Blend/service/BlendAlphaService.d.ts +0 -1
- package/src/Blend/service/BlendAlphaService.js +0 -8
- package/src/Blend/service/BlendEraseService.d.ts +0 -1
- package/src/Blend/service/BlendEraseService.js +0 -8
- package/src/Blend/service/BlendGetStateService.d.ts +0 -12
- package/src/Blend/service/BlendGetStateService.js +0 -13
- package/src/Blend/service/BlendOneZeroService.d.ts +0 -1
- package/src/Blend/service/BlendOneZeroService.js +0 -8
- package/src/Blend/service/BlendResetService.d.ts +0 -1
- package/src/Blend/service/BlendResetService.js +0 -8
- package/src/Blend/service/BlendScreenService.d.ts +0 -1
- package/src/Blend/service/BlendScreenService.js +0 -8
- package/src/Blend/service/BlendSetModeService.d.ts +0 -2
- package/src/Blend/service/BlendSetModeService.js +0 -4
- package/src/Blend/usecase/BlendOperationUseCase.d.ts +0 -11
- package/src/Blend/usecase/BlendOperationUseCase.js +0 -31
- package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.d.ts +0 -9
- package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.js +0 -15
- package/src/Compute/ComputePipelineManager.d.ts +0 -61
- package/src/Compute/ComputePipelineManager.js +0 -313
- package/src/Compute/service/ComputeExecuteBlurService.d.ts +0 -21
- package/src/Compute/service/ComputeExecuteBlurService.js +0 -81
- package/src/Filter/BevelFilterShader.d.ts +0 -2
- package/src/Filter/BevelFilterShader.js +0 -107
- package/src/Filter/BitmapFilterShader.d.ts +0 -2
- package/src/Filter/BitmapFilterShader.js +0 -207
- package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.d.ts +0 -40
- package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.js +0 -51
- package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.d.ts +0 -25
- package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.js +0 -180
- package/src/Filter/BlurFilterShader.d.ts +0 -5
- package/src/Filter/BlurFilterShader.js +0 -109
- package/src/Filter/ColorMatrixFilterShader.d.ts +0 -4
- package/src/Filter/ColorMatrixFilterShader.js +0 -51
- package/src/Filter/ConvolutionFilterShader.d.ts +0 -2
- package/src/Filter/ConvolutionFilterShader.js +0 -115
- package/src/Filter/DisplacementMapFilterShader.d.ts +0 -2
- package/src/Filter/DisplacementMapFilterShader.js +0 -114
- package/src/Filter/DropShadowFilterShader.d.ts +0 -4
- package/src/Filter/DropShadowFilterShader.js +0 -93
- package/src/Filter/GlowFilterShader.d.ts +0 -4
- package/src/Filter/GlowFilterShader.js +0 -66
- package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.d.ts +0 -11
- package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.js +0 -19
- package/src/Mask/usecase/MaskBindUseCase.d.ts +0 -10
- package/src/Mask/usecase/MaskBindUseCase.js +0 -20
- package/src/Mesh/service/MeshLerpService.d.ts +0 -13
- package/src/Mesh/service/MeshLerpService.js +0 -17
- package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.d.ts +0 -14
- package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.js +0 -28
- package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.d.ts +0 -18
- package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.js +0 -54
- package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.d.ts +0 -11
- package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.js +0 -35
- package/src/SamplerCache/service/SamplerCacheGenerateKeyService.d.ts +0 -13
- package/src/SamplerCache/service/SamplerCacheGenerateKeyService.js +0 -15
- package/src/SamplerCache/service/SamplerCacheGetOrCreateService.d.ts +0 -15
- package/src/SamplerCache/service/SamplerCacheGetOrCreateService.js +0 -30
- package/src/SamplerCache.d.ts +0 -18
- package/src/SamplerCache.js +0 -61
- package/src/Shader/BlendModeShader.d.ts +0 -51
- package/src/Shader/BlendModeShader.js +0 -71
- package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.d.ts +0 -12
- package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.js +0 -28
- package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.d.ts +0 -13
- package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.js +0 -61
- package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.d.ts +0 -19
- package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.js +0 -37
- package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.d.ts +0 -11
- package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.js +0 -24
- package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.d.ts +0 -14
- package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.js +0 -24
- package/src/Shader/wgsl/fragment/BlendFragment.d.ts +0 -8
- package/src/Shader/wgsl/fragment/BlendFragment.js +0 -63
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.d.ts +0 -13
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.js +0 -30
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.d.ts +0 -15
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.js +0 -26
- package/src/TexturePool/service/TexturePoolEvictOldestService.d.ts +0 -11
- package/src/TexturePool/service/TexturePoolEvictOldestService.js +0 -24
- package/src/interface/ICachedBindGroup.d.ts +0 -8
- package/src/interface/ICachedBindGroup.js +0 -1
- package/src/interface/IGradientLUTData.d.ts +0 -8
- package/src/interface/IGradientLUTData.js +0 -1
- package/src/interface/IPooledBuffer.d.ts +0 -8
- package/src/interface/IPooledBuffer.js +0 -1
- package/src/interface/IRectangleInfo.d.ts +0 -13
- package/src/interface/IRectangleInfo.js +0 -1
|
@@ -1,24 +1,44 @@
|
|
|
1
1
|
import { $context } from "../../WebGPUUtil";
|
|
2
2
|
/**
|
|
3
3
|
* @description Canvas 2Dコンテキスト(点が矩形内にあるか判定用)
|
|
4
|
+
* Canvas 2D context for point-in-rectangle testing
|
|
4
5
|
*/
|
|
5
|
-
const canvas = new OffscreenCanvas(1, 1);
|
|
6
|
-
|
|
6
|
+
const $canvas = new OffscreenCanvas(1, 1);
|
|
7
|
+
/**
|
|
8
|
+
* @description 矩形内の点判定用2Dコンテキスト
|
|
9
|
+
* 2D context used for point-in-path detection
|
|
10
|
+
*/
|
|
11
|
+
const $canvasContext = $canvas.getContext("2d");
|
|
7
12
|
/**
|
|
8
13
|
* @description 再利用可能なPointオブジェクト(GC回避)
|
|
14
|
+
* Reusable Point objects to avoid GC overhead
|
|
9
15
|
*/
|
|
10
16
|
const $startPoint = { "x": 0, "y": 0 };
|
|
17
|
+
/**
|
|
18
|
+
* @description 再利用可能な制御点オブジェクト(GC回避)
|
|
19
|
+
* Reusable control point object to avoid GC overhead
|
|
20
|
+
*/
|
|
11
21
|
const $controlPoint = { "x": 0, "y": 0 };
|
|
22
|
+
/**
|
|
23
|
+
* @description 再利用可能な終了点オブジェクト(GC回避)
|
|
24
|
+
* Reusable end point object to avoid GC overhead
|
|
25
|
+
*/
|
|
12
26
|
const $endPoint = { "x": 0, "y": 0 };
|
|
27
|
+
/**
|
|
28
|
+
* @description 再利用可能な前の点オブジェクト(GC回避)
|
|
29
|
+
* Reusable previous point object to avoid GC overhead
|
|
30
|
+
*/
|
|
13
31
|
const $prevPoint = { "x": 0, "y": 0 };
|
|
14
32
|
/**
|
|
15
33
|
* @description 法線ベクトルを計算(WebGL版のMeshCalculateNormalVectorServiceと同じ)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* @param
|
|
19
|
-
* @
|
|
34
|
+
* Calculate the normal vector (same as WebGL MeshCalculateNormalVectorService)
|
|
35
|
+
*
|
|
36
|
+
* @param {number} x - 方向ベクトルのx成分 / X component of direction vector
|
|
37
|
+
* @param {number} y - 方向ベクトルのy成分 / Y component of direction vector
|
|
38
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
39
|
+
* @return {IPoint} 法線ベクトル / Normal vector
|
|
20
40
|
*/
|
|
21
|
-
const calculateNormalVector = (x, y, thickness) => {
|
|
41
|
+
const $calculateNormalVector = (x, y, thickness) => {
|
|
22
42
|
const magnitude = Math.sqrt(x * x + y * y);
|
|
23
43
|
if (magnitude === 0) {
|
|
24
44
|
return { "x": 0, "y": 0 };
|
|
@@ -30,15 +50,25 @@ const calculateNormalVector = (x, y, thickness) => {
|
|
|
30
50
|
};
|
|
31
51
|
/**
|
|
32
52
|
* @description 線形補間(lerp)
|
|
53
|
+
* Linear interpolation between two points
|
|
54
|
+
*
|
|
55
|
+
* @param {IPoint} p0 - 始点 / Start point
|
|
56
|
+
* @param {IPoint} p1 - 終点 / End point
|
|
57
|
+
* @param {number} t - 補間パラメータ(0〜1) / Interpolation parameter (0-1)
|
|
58
|
+
* @return {IPoint} 補間された点 / Interpolated point
|
|
33
59
|
*/
|
|
34
|
-
const lerp = (p0, p1, t) => ({
|
|
60
|
+
const $lerp = (p0, p1, t) => ({
|
|
35
61
|
"x": p0.x + (p1.x - p0.x) * t,
|
|
36
62
|
"y": p0.y + (p1.y - p0.y) * t
|
|
37
63
|
});
|
|
38
64
|
/**
|
|
39
65
|
* @description ベクトルの正規化
|
|
66
|
+
* Normalize a vector to unit length
|
|
67
|
+
*
|
|
68
|
+
* @param {IPoint} point - 正規化する点 / Point to normalize
|
|
69
|
+
* @return {IPoint} 正規化された点 / Normalized point
|
|
40
70
|
*/
|
|
41
|
-
const normalize = (point) => {
|
|
71
|
+
const $normalize = (point) => {
|
|
42
72
|
const length = Math.sqrt(point.x * point.x + point.y * point.y);
|
|
43
73
|
return length === 0
|
|
44
74
|
? { "x": 0, "y": 0 }
|
|
@@ -46,25 +76,46 @@ const normalize = (point) => {
|
|
|
46
76
|
};
|
|
47
77
|
/**
|
|
48
78
|
* @description 二次ベジェ曲線上の座標を計算
|
|
79
|
+
* Calculate a point on a quadratic Bezier curve
|
|
80
|
+
*
|
|
81
|
+
* @param {number} t - 曲線パラメータ(0〜1) / Curve parameter (0-1)
|
|
82
|
+
* @param {IPoint} s0 - 始点 / Start point
|
|
83
|
+
* @param {IPoint} s1 - 制御点 / Control point
|
|
84
|
+
* @param {IPoint} s2 - 終点 / End point
|
|
85
|
+
* @return {IPoint} 曲線上の座標 / Point on the curve
|
|
49
86
|
*/
|
|
50
|
-
const getQuadraticBezierPoint = (t, s0, s1, s2) => ({
|
|
87
|
+
const $getQuadraticBezierPoint = (t, s0, s1, s2) => ({
|
|
51
88
|
"x": (1 - t) ** 2 * s0.x + 2 * (1 - t) * t * s1.x + t ** 2 * s2.x,
|
|
52
89
|
"y": (1 - t) ** 2 * s0.y + 2 * (1 - t) * t * s1.y + t ** 2 * s2.y
|
|
53
90
|
});
|
|
54
91
|
/**
|
|
55
92
|
* @description 二次ベジェ曲線上の接線ベクトルを計算
|
|
93
|
+
* Calculate the tangent vector on a quadratic Bezier curve
|
|
94
|
+
*
|
|
95
|
+
* @param {number} t - 曲線パラメータ(0〜1) / Curve parameter (0-1)
|
|
96
|
+
* @param {IPoint} s0 - 始点 / Start point
|
|
97
|
+
* @param {IPoint} s1 - 制御点 / Control point
|
|
98
|
+
* @param {IPoint} s2 - 終点 / End point
|
|
99
|
+
* @return {IPoint} 接線ベクトル / Tangent vector
|
|
56
100
|
*/
|
|
57
|
-
const getQuadraticBezierTangent = (t, s0, s1, s2) => ({
|
|
101
|
+
const $getQuadraticBezierTangent = (t, s0, s1, s2) => ({
|
|
58
102
|
"x": 2 * (1 - t) * (s1.x - s0.x) + 2 * t * (s2.x - s1.x),
|
|
59
103
|
"y": 2 * (1 - t) * (s1.y - s0.y) + 2 * t * (s2.y - s1.y)
|
|
60
104
|
});
|
|
61
105
|
/**
|
|
62
106
|
* @description 二次ベジェ曲線を分割
|
|
107
|
+
* Split a quadratic Bezier curve at a given parameter
|
|
108
|
+
*
|
|
109
|
+
* @param {IPoint} s0 - 始点 / Start point
|
|
110
|
+
* @param {IPoint} s1 - 制御点 / Control point
|
|
111
|
+
* @param {IPoint} s2 - 終点 / End point
|
|
112
|
+
* @param {number} t - 分割パラメータ / Split parameter
|
|
113
|
+
* @return {Array<IPoint[]>} 分割された2つの曲線 / Two split curves
|
|
63
114
|
*/
|
|
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);
|
|
115
|
+
const $splitQuadraticBezier = (s0, s1, s2, t = 0.5) => {
|
|
116
|
+
const M0 = $lerp(s0, s1, t);
|
|
117
|
+
const M1 = $lerp(s1, s2, t);
|
|
118
|
+
const M01 = $lerp(M0, M1, t);
|
|
68
119
|
return [
|
|
69
120
|
[s0, M0, M01],
|
|
70
121
|
[M01, M1, s2]
|
|
@@ -72,13 +123,20 @@ const splitQuadraticBezier = (s0, s1, s2, t = 0.5) => {
|
|
|
72
123
|
};
|
|
73
124
|
/**
|
|
74
125
|
* @description ベジェ曲線を複数回分割
|
|
126
|
+
* Split a Bezier curve multiple times
|
|
127
|
+
*
|
|
128
|
+
* @param {IPoint} s0 - 始点 / Start point
|
|
129
|
+
* @param {IPoint} s1 - 制御点 / Control point
|
|
130
|
+
* @param {IPoint} s2 - 終点 / End point
|
|
131
|
+
* @param {number} n - 分割回数 / Number of splits
|
|
132
|
+
* @return {Array<IPoint[]>} 分割されたセグメント配列 / Array of split segments
|
|
75
133
|
*/
|
|
76
|
-
const splitBezierMultipleTimes = (s0, s1, s2, n = 4) => {
|
|
134
|
+
const $splitBezierMultipleTimes = (s0, s1, s2, n = 4) => {
|
|
77
135
|
let segments = [[s0, s1, s2]];
|
|
78
136
|
for (let i = 0; i < n; i++) {
|
|
79
137
|
const newSegments = [];
|
|
80
138
|
for (const seg of segments) {
|
|
81
|
-
const splitted = splitQuadraticBezier(seg[0], seg[1], seg[2], 0.5);
|
|
139
|
+
const splitted = $splitQuadraticBezier(seg[0], seg[1], seg[2], 0.5);
|
|
82
140
|
newSegments.push(splitted[0], splitted[1]);
|
|
83
141
|
}
|
|
84
142
|
segments = newSegments;
|
|
@@ -87,14 +145,21 @@ const splitBezierMultipleTimes = (s0, s1, s2, n = 4) => {
|
|
|
87
145
|
};
|
|
88
146
|
/**
|
|
89
147
|
* @description 2次ベジェのオフセットを計算
|
|
148
|
+
* Calculate offset of a quadratic Bezier curve
|
|
149
|
+
*
|
|
150
|
+
* @param {IPoint} s0 - 始点 / Start point
|
|
151
|
+
* @param {IPoint} s1 - 制御点 / Control point
|
|
152
|
+
* @param {IPoint} s2 - 終点 / End point
|
|
153
|
+
* @param {number} offset - オフセット距離 / Offset distance
|
|
154
|
+
* @return {IPoint[]} オフセットされた点配列 / Array of offset points
|
|
90
155
|
*/
|
|
91
|
-
const approximateOffsetQuadratic = (s0, s1, s2, offset) => {
|
|
156
|
+
const $approximateOffsetQuadratic = (s0, s1, s2, offset) => {
|
|
92
157
|
const tValues = [0, 0.5, 1];
|
|
93
158
|
const newPoints = [];
|
|
94
159
|
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 });
|
|
160
|
+
const pos = $getQuadraticBezierPoint(t, s0, s1, s2);
|
|
161
|
+
const tan = $getQuadraticBezierTangent(t, s0, s1, s2);
|
|
162
|
+
const n = $normalize({ "x": -tan.y, "y": tan.x });
|
|
98
163
|
newPoints.push({
|
|
99
164
|
"x": pos.x + n.x * offset,
|
|
100
165
|
"y": pos.y + n.y * offset
|
|
@@ -104,15 +169,22 @@ const approximateOffsetQuadratic = (s0, s1, s2, offset) => {
|
|
|
104
169
|
};
|
|
105
170
|
/**
|
|
106
171
|
* @description カーブの矩形を計算(WebGL版のMeshCalculateCurveRectangleUseCaseと同じ)
|
|
172
|
+
* Calculate curve rectangle (same as WebGL MeshCalculateCurveRectangleUseCase)
|
|
173
|
+
*
|
|
174
|
+
* @param {IPoint} start_point - 始点 / Start point
|
|
175
|
+
* @param {IPoint} control_point - 制御点 / Control point
|
|
176
|
+
* @param {IPoint} end_point - 終点 / End point
|
|
177
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
178
|
+
* @return {IPath} カーブ矩形パス / Curve rectangle path
|
|
107
179
|
*/
|
|
108
|
-
const calculateCurveRectangle = (
|
|
180
|
+
const $calculateCurveRectangle = (start_point, control_point, end_point, thickness) => {
|
|
109
181
|
// WebGL版と同じ分割数(5回分割 = 32セグメント)
|
|
110
|
-
const segments = splitBezierMultipleTimes(
|
|
182
|
+
const segments = $splitBezierMultipleTimes(start_point, control_point, end_point, 5);
|
|
111
183
|
const leftCurves = [];
|
|
112
184
|
const rightCurves = [];
|
|
113
185
|
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));
|
|
186
|
+
leftCurves.push($approximateOffsetQuadratic(seg[0], seg[1], seg[2], +thickness));
|
|
187
|
+
rightCurves.push($approximateOffsetQuadratic(seg[0], seg[1], seg[2], -thickness));
|
|
116
188
|
}
|
|
117
189
|
// セグメント間の連続性を確保:各セグメントの終点を次のセグメントの始点に強制一致
|
|
118
190
|
// これにより内側の曲線のつなぎめの隙間を解消
|
|
@@ -147,32 +219,34 @@ const calculateCurveRectangle = (startPoint, controlPoint, endPoint, thickness)
|
|
|
147
219
|
};
|
|
148
220
|
/**
|
|
149
221
|
* @description 直線の矩形を計算(WebGL版のMeshCalculateLineRectangleUseCaseと同じ)
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* @param
|
|
153
|
-
* @
|
|
222
|
+
* Calculate line rectangle (same as WebGL MeshCalculateLineRectangleUseCase)
|
|
223
|
+
*
|
|
224
|
+
* @param {IPoint} start_point - 開始点 / Start point
|
|
225
|
+
* @param {IPoint} end_point - 終了点 / End point
|
|
226
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
227
|
+
* @return {IPath} 矩形パス / Rectangle path
|
|
154
228
|
*/
|
|
155
|
-
const calculateLineRectangle = (
|
|
229
|
+
const $calculateLineRectangle = (start_point, end_point, thickness) => {
|
|
156
230
|
const vector = {
|
|
157
|
-
"x":
|
|
158
|
-
"y":
|
|
231
|
+
"x": end_point.x - start_point.x,
|
|
232
|
+
"y": end_point.y - start_point.y
|
|
159
233
|
};
|
|
160
|
-
const normal = calculateNormalVector(vector.x, vector.y, thickness);
|
|
234
|
+
const normal = $calculateNormalVector(vector.x, vector.y, thickness);
|
|
161
235
|
const shiftedUpStart = {
|
|
162
|
-
"x":
|
|
163
|
-
"y":
|
|
236
|
+
"x": start_point.x + normal.x,
|
|
237
|
+
"y": start_point.y + normal.y
|
|
164
238
|
};
|
|
165
239
|
const shiftedUpEnd = {
|
|
166
|
-
"x":
|
|
167
|
-
"y":
|
|
240
|
+
"x": end_point.x + normal.x,
|
|
241
|
+
"y": end_point.y + normal.y
|
|
168
242
|
};
|
|
169
243
|
const shiftedDownEnd = {
|
|
170
|
-
"x":
|
|
171
|
-
"y":
|
|
244
|
+
"x": end_point.x - normal.x,
|
|
245
|
+
"y": end_point.y - normal.y
|
|
172
246
|
};
|
|
173
247
|
const shiftedDownStart = {
|
|
174
|
-
"x":
|
|
175
|
-
"y":
|
|
248
|
+
"x": start_point.x - normal.x,
|
|
249
|
+
"y": start_point.y - normal.y
|
|
176
250
|
};
|
|
177
251
|
return [
|
|
178
252
|
shiftedUpStart.x, shiftedUpStart.y, false,
|
|
@@ -184,9 +258,16 @@ const calculateLineRectangle = (startPoint, endPoint, thickness) => {
|
|
|
184
258
|
};
|
|
185
259
|
/**
|
|
186
260
|
* @description メッシュのパスの中で指定座標が含まれる線を探す
|
|
261
|
+
* Find paths overlapping with specified coordinates
|
|
187
262
|
* WebGL版のMeshFindOverlappingPathsServiceと同じ
|
|
263
|
+
*
|
|
264
|
+
* @param {number} x - 中心x座標 / Center x coordinate
|
|
265
|
+
* @param {number} y - 中心y座標 / Center y coordinate
|
|
266
|
+
* @param {number} r - 半径 / Radius
|
|
267
|
+
* @param {IPath} paths - パスデータ / Path data
|
|
268
|
+
* @return {number[]} 重複する座標配列 / Array of overlapping coordinates
|
|
188
269
|
*/
|
|
189
|
-
const findOverlappingPaths = (x, y, r, paths) => {
|
|
270
|
+
const $findOverlappingPaths = (x, y, r, paths) => {
|
|
190
271
|
const points = [];
|
|
191
272
|
// 浮動小数点誤差を考慮した許容範囲(非常に小さい値)
|
|
192
273
|
const epsilon = 0.0001;
|
|
@@ -208,9 +289,14 @@ const findOverlappingPaths = (x, y, r, paths) => {
|
|
|
208
289
|
};
|
|
209
290
|
/**
|
|
210
291
|
* @description 矩形内に含まれてない座標を返却
|
|
292
|
+
* Return coordinates that are not inside the rectangle
|
|
211
293
|
* WebGL版のMeshIsPointInsideRectangleServiceと同じ
|
|
294
|
+
*
|
|
295
|
+
* @param {number[]} points - 判定対象の座標配列 / Array of points to test
|
|
296
|
+
* @param {IPath} rectangle - 矩形パス / Rectangle path
|
|
297
|
+
* @return {number[] | null} 矩形外の座標またはnull / Point outside rectangle or null
|
|
212
298
|
*/
|
|
213
|
-
const findPointOutsideRectangle = (points, rectangle) => {
|
|
299
|
+
const $findPointOutsideRectangle = (points, rectangle) => {
|
|
214
300
|
$canvasContext.beginPath();
|
|
215
301
|
$canvasContext.moveTo(rectangle[0], rectangle[1]);
|
|
216
302
|
for (let idx = 3; idx < rectangle.length; idx += 3) {
|
|
@@ -235,23 +321,31 @@ const findPointOutsideRectangle = (points, rectangle) => {
|
|
|
235
321
|
};
|
|
236
322
|
/**
|
|
237
323
|
* @description ベベル結合を生成(WebGL版のMeshGenerateCalculateBevelJoinUseCaseと同じ)
|
|
324
|
+
* Generate bevel join (same as WebGL MeshGenerateCalculateBevelJoinUseCase)
|
|
325
|
+
*
|
|
326
|
+
* @param {number} x - 結合点のx座標 / Join point x coordinate
|
|
327
|
+
* @param {number} y - 結合点のy座標 / Join point y coordinate
|
|
328
|
+
* @param {number} r - 半径 / Radius
|
|
329
|
+
* @param {IPath[]} rectangles - 矩形パス配列 / Array of rectangle paths
|
|
330
|
+
* @param {boolean} is_last - 最後の結合かどうか / Whether this is the last join
|
|
331
|
+
* @return {void}
|
|
238
332
|
*/
|
|
239
|
-
const generateBevelJoin = (x, y, r, rectangles,
|
|
333
|
+
const $generateBevelJoin = (x, y, r, rectangles, is_last = false) => {
|
|
240
334
|
// WebGL版と同じ: isLastフラグでインデックスを切り替え
|
|
241
|
-
const indexA =
|
|
242
|
-
const indexB =
|
|
243
|
-
const pathsA = findOverlappingPaths(x, y, r, rectangles[indexA]);
|
|
244
|
-
const pathsB = findOverlappingPaths(x, y, r, rectangles[indexB]);
|
|
335
|
+
const indexA = is_last ? 0 : rectangles.length - 1;
|
|
336
|
+
const indexB = is_last ? rectangles.length - 1 : rectangles.length - 2;
|
|
337
|
+
const pathsA = $findOverlappingPaths(x, y, r, rectangles[indexA]);
|
|
338
|
+
const pathsB = $findOverlappingPaths(x, y, r, rectangles[indexB]);
|
|
245
339
|
// パスが並行であれば終了
|
|
246
340
|
if (pathsA[0] === pathsB[0] && pathsA[1] === pathsB[1]
|
|
247
341
|
|| pathsA[0] === pathsB[2] && pathsA[1] === pathsB[3]) {
|
|
248
342
|
return;
|
|
249
343
|
}
|
|
250
|
-
const pointA = findPointOutsideRectangle(pathsA, rectangles[indexB]);
|
|
344
|
+
const pointA = $findPointOutsideRectangle(pathsA, rectangles[indexB]);
|
|
251
345
|
if (!pointA) {
|
|
252
346
|
return;
|
|
253
347
|
}
|
|
254
|
-
const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
348
|
+
const pointB = $findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
255
349
|
if (!pointB) {
|
|
256
350
|
return;
|
|
257
351
|
}
|
|
@@ -264,18 +358,26 @@ const generateBevelJoin = (x, y, r, rectangles, isLast = false) => {
|
|
|
264
358
|
};
|
|
265
359
|
/**
|
|
266
360
|
* @description ラウンド結合を生成(WebGL版のMeshGenerateCalculateRoundJoinUseCaseと同じ)
|
|
361
|
+
* Generate round join (same as WebGL MeshGenerateCalculateRoundJoinUseCase)
|
|
362
|
+
*
|
|
363
|
+
* @param {number} x - 結合点のx座標 / Join point x coordinate
|
|
364
|
+
* @param {number} y - 結合点のy座標 / Join point y coordinate
|
|
365
|
+
* @param {number} r - 半径 / Radius
|
|
366
|
+
* @param {IPath[]} rectangles - 矩形パス配列 / Array of rectangle paths
|
|
367
|
+
* @param {boolean} is_last - 最後の結合かどうか / Whether this is the last join
|
|
368
|
+
* @return {void}
|
|
267
369
|
*/
|
|
268
|
-
const generateRoundJoin = (x, y, r, rectangles,
|
|
370
|
+
const $generateRoundJoin = (x, y, r, rectangles, is_last = false) => {
|
|
269
371
|
// WebGL版と同じ: isLastフラグでインデックスを切り替え
|
|
270
|
-
const indexA =
|
|
271
|
-
const indexB =
|
|
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]);
|
|
372
|
+
const indexA = is_last ? 0 : rectangles.length - 1;
|
|
373
|
+
const indexB = is_last ? rectangles.length - 1 : rectangles.length - 2;
|
|
374
|
+
const pathsA = $findOverlappingPaths(x, y, r, rectangles[indexA]);
|
|
375
|
+
const pathsB = $findOverlappingPaths(x, y, r, rectangles[indexB]);
|
|
376
|
+
const pointA = $findPointOutsideRectangle(pathsA, rectangles[indexB]);
|
|
275
377
|
if (!pointA) {
|
|
276
378
|
return;
|
|
277
379
|
}
|
|
278
|
-
const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
380
|
+
const pointB = $findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
279
381
|
if (!pointB) {
|
|
280
382
|
return;
|
|
281
383
|
}
|
|
@@ -302,34 +404,43 @@ const generateRoundJoin = (x, y, r, rectangles, isLast = false) => {
|
|
|
302
404
|
};
|
|
303
405
|
/**
|
|
304
406
|
* @description マイター結合を生成(WebGL版のMeshGenerateCalculateMiterJoinUseCaseと同じ)
|
|
407
|
+
* Generate miter join (same as WebGL MeshGenerateCalculateMiterJoinUseCase)
|
|
408
|
+
*
|
|
409
|
+
* @param {IPoint} start_point - 結合点 / Join point
|
|
410
|
+
* @param {IPoint} end_point - 終了点 / End point
|
|
411
|
+
* @param {IPoint} prev_point - 前の点 / Previous point
|
|
412
|
+
* @param {number} r - 半径 / Radius
|
|
413
|
+
* @param {IPath[]} rectangles - 矩形パス配列 / Array of rectangle paths
|
|
414
|
+
* @param {boolean} is_last - 最後の結合かどうか / Whether this is the last join
|
|
415
|
+
* @return {void}
|
|
305
416
|
*/
|
|
306
|
-
const generateMiterJoin = (
|
|
307
|
-
const indexA =
|
|
308
|
-
const indexB =
|
|
309
|
-
const pathsA = findOverlappingPaths(
|
|
310
|
-
const pathsB = findOverlappingPaths(
|
|
417
|
+
const $generateMiterJoin = (start_point, end_point, prev_point, r, rectangles, is_last = false) => {
|
|
418
|
+
const indexA = is_last ? 0 : rectangles.length - 1;
|
|
419
|
+
const indexB = is_last ? rectangles.length - 1 : rectangles.length - 2;
|
|
420
|
+
const pathsA = $findOverlappingPaths(start_point.x, start_point.y, r, rectangles[indexA]);
|
|
421
|
+
const pathsB = $findOverlappingPaths(start_point.x, start_point.y, r, rectangles[indexB]);
|
|
311
422
|
// パスが並行であれば終了
|
|
312
423
|
if (pathsA[0] === pathsB[0] && pathsA[1] === pathsB[1]
|
|
313
424
|
|| pathsA[0] === pathsB[2] && pathsA[1] === pathsB[3]) {
|
|
314
425
|
return;
|
|
315
426
|
}
|
|
316
|
-
const pointA = findPointOutsideRectangle(pathsA, rectangles[indexB]);
|
|
427
|
+
const pointA = $findPointOutsideRectangle(pathsA, rectangles[indexB]);
|
|
317
428
|
if (!pointA) {
|
|
318
429
|
return;
|
|
319
430
|
}
|
|
320
|
-
const pointB = findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
431
|
+
const pointB = $findPointOutsideRectangle(pathsB, rectangles[indexA]);
|
|
321
432
|
if (!pointB) {
|
|
322
433
|
return;
|
|
323
434
|
}
|
|
324
|
-
const aVx =
|
|
325
|
-
const aVy =
|
|
435
|
+
const aVx = end_point.x - start_point.x;
|
|
436
|
+
const aVy = end_point.y - start_point.y;
|
|
326
437
|
const lengthA = Math.hypot(aVx, aVy);
|
|
327
438
|
const normalizeA = {
|
|
328
439
|
"x": aVx / lengthA,
|
|
329
440
|
"y": aVy / lengthA
|
|
330
441
|
};
|
|
331
|
-
const bVx =
|
|
332
|
-
const bVy =
|
|
442
|
+
const bVx = prev_point.x - start_point.x;
|
|
443
|
+
const bVy = prev_point.y - start_point.y;
|
|
333
444
|
const lengthB = Math.hypot(bVx, bVy);
|
|
334
445
|
const normalizeB = {
|
|
335
446
|
"x": bVx / lengthB,
|
|
@@ -340,7 +451,7 @@ const generateMiterJoin = (startPoint, endPoint, prevPoint, r, rectangles, isLas
|
|
|
340
451
|
const denom = d1x * d2y - d1y * d2x;
|
|
341
452
|
if (denom === 0) {
|
|
342
453
|
rectangles.splice(-1, 0, [
|
|
343
|
-
|
|
454
|
+
start_point.x, start_point.y, false,
|
|
344
455
|
pointA[0], pointA[1], false,
|
|
345
456
|
pointB[0], pointB[1], false
|
|
346
457
|
]);
|
|
@@ -350,18 +461,24 @@ const generateMiterJoin = (startPoint, endPoint, prevPoint, r, rectangles, isLas
|
|
|
350
461
|
const ix = pointA[0] + t * d1x;
|
|
351
462
|
const iy = pointA[1] + t * d1y;
|
|
352
463
|
rectangles.splice(-1, 0, [
|
|
353
|
-
|
|
464
|
+
start_point.x, start_point.y, false,
|
|
354
465
|
pointA[0], pointA[1], false,
|
|
355
466
|
ix, iy, false,
|
|
356
|
-
|
|
467
|
+
start_point.x, start_point.y, false,
|
|
357
468
|
pointB[0], pointB[1], false,
|
|
358
469
|
ix, iy, false
|
|
359
470
|
]);
|
|
360
471
|
};
|
|
361
472
|
/**
|
|
362
473
|
* @description ラウンドキャップを生成(WebGL版のMeshGenerateCalculateRoundCapServiceと同じ)
|
|
474
|
+
* Generate round cap (same as WebGL MeshGenerateCalculateRoundCapService)
|
|
475
|
+
*
|
|
476
|
+
* @param {IPath} vertices - パス頂点 / Path vertices
|
|
477
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
478
|
+
* @param {IPath[]} rectangles - 矩形パス配列 / Array of rectangle paths
|
|
479
|
+
* @return {void}
|
|
363
480
|
*/
|
|
364
|
-
const generateRoundCap = (vertices, thickness, rectangles) => {
|
|
481
|
+
const $generateRoundCap = (vertices, thickness, rectangles) => {
|
|
365
482
|
// 始点のキャップ
|
|
366
483
|
// WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
|
|
367
484
|
// カーブの場合、制御点への方向が正しい接線方向となる
|
|
@@ -393,8 +510,14 @@ const generateRoundCap = (vertices, thickness, rectangles) => {
|
|
|
393
510
|
};
|
|
394
511
|
/**
|
|
395
512
|
* @description スクエアキャップを生成(WebGL版のMeshGenerateCalculateSquareCapServiceと同じ)
|
|
513
|
+
* Generate square cap (same as WebGL MeshGenerateCalculateSquareCapService)
|
|
514
|
+
*
|
|
515
|
+
* @param {IPath} vertices - パス頂点 / Path vertices
|
|
516
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
517
|
+
* @param {IPath[]} rectangles - 矩形パス配列 / Array of rectangle paths
|
|
518
|
+
* @return {void}
|
|
396
519
|
*/
|
|
397
|
-
const generateSquareCap = (vertices, thickness, rectangles) => {
|
|
520
|
+
const $generateSquareCap = (vertices, thickness, rectangles) => {
|
|
398
521
|
// 始点のキャップ
|
|
399
522
|
// WebGL版と同じく隣接頂点を直接使用(制御点でもそのまま使用する)
|
|
400
523
|
const startX = vertices[0];
|
|
@@ -446,9 +569,9 @@ const generateSquareCap = (vertices, thickness, rectangles) => {
|
|
|
446
569
|
* @description 線の外周を算出して塗りのフォーマットで返却(WebGL版と同じ)
|
|
447
570
|
* Calculate the outer circumference of the line and return it in the format of the fill
|
|
448
571
|
*
|
|
449
|
-
* @param
|
|
450
|
-
* @param
|
|
451
|
-
* @return {IPath[]} パス配列
|
|
572
|
+
* @param {IPath} vertices - パス頂点 [x, y, isCurve, ...] / Path vertices
|
|
573
|
+
* @param {number} thickness - 線の太さ(半分の値) / Half line thickness
|
|
574
|
+
* @return {IPath[]} パス配列 / Array of paths
|
|
452
575
|
*/
|
|
453
576
|
export const generateStrokeOutline = (vertices, thickness) => {
|
|
454
577
|
// 再利用可能なオブジェクトを使用
|
|
@@ -476,23 +599,23 @@ export const generateStrokeOutline = (vertices, thickness) => {
|
|
|
476
599
|
endPoint.x = x;
|
|
477
600
|
endPoint.y = y;
|
|
478
601
|
if (vertices[idx - 1]) {
|
|
479
|
-
rectangles.push(calculateCurveRectangle(startPoint, controlPoint, endPoint, thickness));
|
|
602
|
+
rectangles.push($calculateCurveRectangle(startPoint, controlPoint, endPoint, thickness));
|
|
480
603
|
}
|
|
481
604
|
else {
|
|
482
|
-
rectangles.push(calculateLineRectangle(startPoint, endPoint, thickness));
|
|
605
|
+
rectangles.push($calculateLineRectangle(startPoint, endPoint, thickness));
|
|
483
606
|
}
|
|
484
607
|
if (rectangles.length > 1) {
|
|
485
608
|
switch ($context.joints) {
|
|
486
609
|
case 0: // bevel
|
|
487
|
-
generateBevelJoin(startPoint.x, startPoint.y, thickness, rectangles);
|
|
610
|
+
$generateBevelJoin(startPoint.x, startPoint.y, thickness, rectangles);
|
|
488
611
|
break;
|
|
489
612
|
case 1: // miter
|
|
490
613
|
prevPoint.x = vertices[idx - 6];
|
|
491
614
|
prevPoint.y = vertices[idx - 5];
|
|
492
|
-
generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles);
|
|
615
|
+
$generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles);
|
|
493
616
|
break;
|
|
494
617
|
case 2: // round
|
|
495
|
-
generateRoundJoin(startPoint.x, startPoint.y, thickness, rectangles);
|
|
618
|
+
$generateRoundJoin(startPoint.x, startPoint.y, thickness, rectangles);
|
|
496
619
|
break;
|
|
497
620
|
}
|
|
498
621
|
}
|
|
@@ -512,7 +635,7 @@ export const generateStrokeOutline = (vertices, thickness) => {
|
|
|
512
635
|
// 始点と終点が繋がっている時はjointsの設定を適用(WebGL版と同じ)
|
|
513
636
|
switch ($context.joints) {
|
|
514
637
|
case 0: // bevel
|
|
515
|
-
generateBevelJoin(startX, startY, thickness, rectangles, true);
|
|
638
|
+
$generateBevelJoin(startX, startY, thickness, rectangles, true);
|
|
516
639
|
break;
|
|
517
640
|
case 1: // miter
|
|
518
641
|
startPoint.x = startX;
|
|
@@ -521,10 +644,10 @@ export const generateStrokeOutline = (vertices, thickness) => {
|
|
|
521
644
|
endPoint.y = vertices[4];
|
|
522
645
|
prevPoint.x = vertices[vertices.length - 6];
|
|
523
646
|
prevPoint.y = vertices[vertices.length - 5];
|
|
524
|
-
generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles, true);
|
|
647
|
+
$generateMiterJoin(startPoint, endPoint, prevPoint, thickness, rectangles, true);
|
|
525
648
|
break;
|
|
526
649
|
case 2: // round
|
|
527
|
-
generateRoundJoin(startX, startY, thickness, rectangles, true);
|
|
650
|
+
$generateRoundJoin(startX, startY, thickness, rectangles, true);
|
|
528
651
|
break;
|
|
529
652
|
default:
|
|
530
653
|
break;
|
|
@@ -534,10 +657,10 @@ export const generateStrokeOutline = (vertices, thickness) => {
|
|
|
534
657
|
// 始点と終点が繋がってない時はcapsの設定を適用
|
|
535
658
|
switch ($context.caps) {
|
|
536
659
|
case 1: // round
|
|
537
|
-
generateRoundCap(vertices, thickness, rectangles);
|
|
660
|
+
$generateRoundCap(vertices, thickness, rectangles);
|
|
538
661
|
break;
|
|
539
662
|
case 2: // square
|
|
540
|
-
generateSquareCap(vertices, thickness, rectangles);
|
|
663
|
+
$generateSquareCap(vertices, thickness, rectangles);
|
|
541
664
|
break;
|
|
542
665
|
default:
|
|
543
666
|
break;
|
|
@@ -547,9 +670,11 @@ export const generateStrokeOutline = (vertices, thickness) => {
|
|
|
547
670
|
};
|
|
548
671
|
/**
|
|
549
672
|
* @description ストロークメッシュを生成(WebGL版のMeshStrokeGenerateUseCaseと同じ)
|
|
550
|
-
*
|
|
551
|
-
*
|
|
552
|
-
* @
|
|
673
|
+
* Generate stroke mesh (same as WebGL MeshStrokeGenerateUseCase)
|
|
674
|
+
*
|
|
675
|
+
* @param {IPath[]} vertices - パス頂点配列 / Array of path vertices
|
|
676
|
+
* @param {number} thickness - 線の太さ(フル値、内部で/2される) / Full line thickness (halved internally)
|
|
677
|
+
* @return {IPath[]} 塗りフォーマットのパス配列 / Array of fill-format paths
|
|
553
678
|
*/
|
|
554
679
|
export const generateStrokeMesh = (vertices, thickness) => {
|
|
555
680
|
// WebGL版と同じ: 内部で半分にする
|
|
@@ -566,43 +691,3 @@ export const generateStrokeMesh = (vertices, thickness) => {
|
|
|
566
691
|
}
|
|
567
692
|
return fillVertices;
|
|
568
693
|
};
|
|
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
|
-
};
|