@lightningjs/renderer 0.3.0 → 0.3.2
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/NOTICE +1 -2
- package/dist/exports/core-api.js +1 -1
- package/dist/exports/main-api.js +1 -1
- package/dist/exports/utils.js +1 -1
- package/dist/src/common/CommonTypes.js +1 -1
- package/dist/src/common/EventEmitter.js +1 -1
- package/dist/src/common/IAnimationController.js +1 -1
- package/dist/src/core/CoreExtension.js +1 -1
- package/dist/src/core/CoreNode.d.ts +5 -1
- package/dist/src/core/CoreNode.js +9 -2
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +2 -1
- package/dist/src/core/CoreTextNode.js +3 -3
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.js +1 -1
- package/dist/src/core/Matrix2DContext.js +1 -1
- package/dist/src/core/Stage.d.ts +2 -1
- package/dist/src/core/Stage.js +20 -6
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/animations/AnimationManager.js +1 -1
- package/dist/src/core/animations/CoreAnimation.js +1 -1
- package/dist/src/core/animations/CoreAnimationController.js +1 -1
- package/dist/src/core/lib/glm/common.js +1 -1
- package/dist/src/core/lib/glm/index.js +1 -1
- package/dist/src/core/lib/glm/mat2.js +1 -1
- package/dist/src/core/lib/glm/mat2d.js +1 -1
- package/dist/src/core/lib/glm/mat3.js +1 -1
- package/dist/src/core/lib/glm/mat4.js +1 -1
- package/dist/src/core/lib/glm/quat.js +1 -1
- package/dist/src/core/lib/glm/quat2.js +1 -1
- package/dist/src/core/lib/glm/vec2.js +1 -1
- package/dist/src/core/lib/glm/vec3.js +1 -1
- package/dist/src/core/lib/glm/vec4.js +1 -1
- package/dist/src/core/lib/utils.d.ts +1 -0
- package/dist/src/core/lib/utils.js +10 -1
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/platform.js +1 -1
- package/dist/src/core/renderers/CoreContextTexture.js +1 -1
- package/dist/src/core/renderers/CoreRenderOp.js +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +2 -0
- package/dist/src/core/renderers/CoreRenderer.js +1 -1
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/CoreShader.d.ts +2 -2
- package/dist/src/core/renderers/CoreShader.js +1 -1
- package/dist/src/core/renderers/CoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +4 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +22 -4
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +29 -15
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +46 -3
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +44 -9
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/BufferCollection.js +1 -1
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js +1 -1
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +1 -1
- package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +8 -6
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +20 -13
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.d.ts +5 -6
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +12 -11
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.d.ts +16 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.d.ts +16 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.d.ts +16 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.d.ts +16 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.d.ts +16 -0
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.d.ts +12 -0
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +100 -0
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.d.ts +28 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +3 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +3 -0
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +4 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +19 -0
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +5 -2
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +38 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +116 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.d.ts +11 -0
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
- package/dist/src/core/scene/Scene.js +1 -1
- package/dist/src/core/text-rendering/TextTextureRendererUtils.js +1 -1
- package/dist/src/core/text-rendering/TrFontManager.js +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +1 -1
- package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +1 -1
- package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -2
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +5 -2
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +3 -3
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +2 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/ColorTexture.js +1 -1
- package/dist/src/core/textures/ImageTexture.js +1 -1
- package/dist/src/core/textures/NoiseTexture.js +1 -1
- package/dist/src/core/textures/SubTexture.js +1 -1
- package/dist/src/core/textures/Texture.js +1 -1
- package/dist/src/core/utils.js +1 -1
- package/dist/src/main-api/INode.d.ts +19 -0
- package/dist/src/main-api/INode.js +1 -1
- package/dist/src/main-api/IRenderDriver.js +1 -1
- package/dist/src/main-api/RendererMain.d.ts +1 -1
- package/dist/src/main-api/RendererMain.js +2 -1
- package/dist/src/main-api/RendererMain.js.map +1 -1
- package/dist/src/main-api/TextureRegistry.d.ts +33 -0
- package/dist/src/main-api/TextureRegistry.js +97 -0
- package/dist/src/main-api/TextureRegistry.js.map +1 -0
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.d.ts +33 -0
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js +97 -0
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js.map +1 -0
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +9 -0
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +38 -0
- package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +1 -0
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +56 -0
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +101 -0
- package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +1 -0
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +32 -0
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +28 -0
- package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +1 -0
- package/dist/src/render-drivers/main/MainOnlyNode.d.ts +2 -0
- package/dist/src/render-drivers/main/MainOnlyNode.js +8 -1
- package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +2 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
- package/dist/src/render-drivers/main/MainRenderDriver.js +1 -1
- package/dist/src/render-drivers/threadx/NodeStruct.d.ts +3 -0
- package/dist/src/render-drivers/threadx/NodeStruct.js +10 -1
- package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
- package/dist/src/render-drivers/threadx/SharedNode.d.ts +1 -0
- package/dist/src/render-drivers/threadx/SharedNode.js +2 -1
- package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/TextNodeStruct.js +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +1 -1
- package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +3 -1
- package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +2 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +2 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +2 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
- package/dist/src/utils.d.ts +10 -2
- package/dist/src/utils.js +13 -3
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/package.json +6 -5
- package/src/common/CommonTypes.ts +70 -0
- package/src/common/EventEmitter.ts +77 -0
- package/src/common/IAnimationController.ts +29 -0
- package/src/core/CoreExtension.ts +32 -0
- package/src/core/CoreNode.ts +700 -0
- package/src/core/CoreShaderManager.ts +111 -0
- package/src/core/CoreTextNode.ts +342 -0
- package/src/core/CoreTextureManager.ts +323 -0
- package/src/core/Matrix2DContext.ts +52 -0
- package/src/core/Stage.ts +280 -0
- package/src/core/animations/AnimationManager.ts +38 -0
- package/src/core/animations/CoreAnimation.ts +139 -0
- package/src/core/animations/CoreAnimationController.ts +117 -0
- package/src/core/lib/glm/common.ts +231 -0
- package/src/core/lib/glm/index.ts +31 -0
- package/src/core/lib/glm/mat2.ts +499 -0
- package/src/core/lib/glm/mat2d.ts +547 -0
- package/src/core/lib/glm/mat3.ts +849 -0
- package/src/core/lib/glm/mat4.ts +2169 -0
- package/src/core/lib/glm/quat.ts +828 -0
- package/src/core/lib/glm/quat2.ts +951 -0
- package/src/core/lib/glm/vec2.ts +671 -0
- package/src/core/lib/glm/vec3.ts +859 -0
- package/src/core/lib/glm/vec4.ts +708 -0
- package/src/core/lib/utils.ts +144 -0
- package/src/core/platform.ts +40 -0
- package/src/core/renderers/CoreContextTexture.ts +30 -0
- package/src/core/renderers/CoreRenderOp.ts +22 -0
- package/src/core/renderers/CoreRenderer.ts +66 -0
- package/src/core/renderers/CoreShader.ts +41 -0
- package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +36 -0
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +208 -0
- package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +111 -0
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +567 -0
- package/src/core/renderers/webgl/WebGlCoreShader.ts +328 -0
- package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -0
- package/src/core/renderers/webgl/internal/RendererUtils.ts +134 -0
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +135 -0
- package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -0
- package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -0
- package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -0
- package/src/core/renderers/webgl/shaders/DynamicShader.ts +430 -0
- package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +168 -0
- package/src/core/renderers/webgl/shaders/SdfShader.ts +165 -0
- package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -0
- package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -0
- package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -0
- package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -0
- package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -0
- package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -0
- package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +111 -0
- package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -0
- package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +37 -0
- package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +182 -0
- package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +159 -0
- package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +106 -0
- package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -0
- package/src/core/scene/Scene.ts +120 -0
- package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -0
- package/src/core/text-rendering/TrFontManager.ts +96 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +128 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +159 -0
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +164 -0
- package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -0
- package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -0
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +634 -0
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +705 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +647 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +76 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +381 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +136 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.ts +64 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +41 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -0
- package/src/core/text-rendering/renderers/TextRenderer.ts +371 -0
- package/src/core/textures/ColorTexture.ts +85 -0
- package/src/core/textures/ImageTexture.ts +113 -0
- package/src/core/textures/NoiseTexture.ts +96 -0
- package/src/core/textures/SubTexture.ts +140 -0
- package/src/core/textures/Texture.ts +162 -0
- package/src/core/utils.ts +222 -0
- package/src/main-api/INode.ts +443 -0
- package/src/main-api/IRenderDriver.ts +58 -0
- package/src/main-api/RendererMain.ts +451 -0
- package/src/render-drivers/main/MainOnlyNode.ts +429 -0
- package/src/render-drivers/main/MainOnlyTextNode.ts +220 -0
- package/src/render-drivers/main/MainRenderDriver.ts +117 -0
- package/src/render-drivers/threadx/NodeStruct.ts +290 -0
- package/src/render-drivers/threadx/SharedNode.ts +95 -0
- package/src/render-drivers/threadx/TextNodeStruct.ts +166 -0
- package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -0
- package/src/render-drivers/threadx/ThreadXMainNode.ts +151 -0
- package/src/render-drivers/threadx/ThreadXMainTextNode.ts +75 -0
- package/src/render-drivers/threadx/ThreadXRenderDriver.ts +247 -0
- package/src/render-drivers/threadx/ThreadXRendererMessage.ts +82 -0
- package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +232 -0
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +146 -0
- package/src/render-drivers/threadx/worker/renderer.ts +138 -0
- package/src/render-drivers/utils.ts +57 -0
- package/src/utils.ts +202 -0
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* If not stated otherwise in this file or this component's LICENSE file the
|
|
3
|
+
* following copyright and licenses apply:
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2023 Comcast Cable Communications Management, LLC.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the License);
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
assertTruthy,
|
|
22
|
+
createWebGLContext,
|
|
23
|
+
hasOwn,
|
|
24
|
+
mergeColorAlphaPremultiplied,
|
|
25
|
+
} from '../../../utils.js';
|
|
26
|
+
import {
|
|
27
|
+
CoreRenderer,
|
|
28
|
+
type QuadOptions as QuadOptions,
|
|
29
|
+
} from '../CoreRenderer.js';
|
|
30
|
+
import { WebGlCoreRenderOp } from './WebGlCoreRenderOp.js';
|
|
31
|
+
import type { CoreContextTexture } from '../CoreContextTexture.js';
|
|
32
|
+
import {
|
|
33
|
+
createIndexBuffer,
|
|
34
|
+
type CoreWebGlParameters,
|
|
35
|
+
type CoreWebGlExtensions,
|
|
36
|
+
getWebGlParameters,
|
|
37
|
+
getWebGlExtensions,
|
|
38
|
+
} from './internal/RendererUtils.js';
|
|
39
|
+
import { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
|
|
40
|
+
import { Texture } from '../../textures/Texture.js';
|
|
41
|
+
import { ColorTexture } from '../../textures/ColorTexture.js';
|
|
42
|
+
import type { Stage } from '../../Stage.js';
|
|
43
|
+
import { SubTexture } from '../../textures/SubTexture.js';
|
|
44
|
+
import { WebGlCoreCtxSubTexture } from './WebGlCoreCtxSubTexture.js';
|
|
45
|
+
import type {
|
|
46
|
+
CoreTextureManager,
|
|
47
|
+
TextureOptions,
|
|
48
|
+
} from '../../CoreTextureManager.js';
|
|
49
|
+
import { CoreShaderManager } from '../../CoreShaderManager.js';
|
|
50
|
+
import type { CoreShader } from '../CoreShader.js';
|
|
51
|
+
import { BufferCollection } from './internal/BufferCollection.js';
|
|
52
|
+
import {
|
|
53
|
+
compareRect,
|
|
54
|
+
getNormalizedRgbaComponents,
|
|
55
|
+
type Rect,
|
|
56
|
+
} from '../../lib/utils.js';
|
|
57
|
+
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
58
|
+
import { WebGlCoreShader } from './WebGlCoreShader.js';
|
|
59
|
+
import { RoundedRectangle } from './shaders/RoundedRectangle.js';
|
|
60
|
+
|
|
61
|
+
const WORDS_PER_QUAD = 24;
|
|
62
|
+
const BYTES_PER_QUAD = WORDS_PER_QUAD * 4;
|
|
63
|
+
|
|
64
|
+
export interface WebGlCoreRendererOptions {
|
|
65
|
+
stage: Stage;
|
|
66
|
+
canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
67
|
+
pixelRatio: number;
|
|
68
|
+
txManager: CoreTextureManager;
|
|
69
|
+
shManager: CoreShaderManager;
|
|
70
|
+
clearColor: number;
|
|
71
|
+
bufferMemory: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface CoreWebGlSystem {
|
|
75
|
+
parameters: CoreWebGlParameters;
|
|
76
|
+
extensions: CoreWebGlExtensions;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export class WebGlCoreRenderer extends CoreRenderer {
|
|
80
|
+
//// WebGL Native Context and Data
|
|
81
|
+
gl: WebGLRenderingContext;
|
|
82
|
+
system: CoreWebGlSystem;
|
|
83
|
+
|
|
84
|
+
//// Core Managers
|
|
85
|
+
txManager: CoreTextureManager;
|
|
86
|
+
shManager: CoreShaderManager;
|
|
87
|
+
|
|
88
|
+
//// Options
|
|
89
|
+
options: Required<WebGlCoreRendererOptions>;
|
|
90
|
+
|
|
91
|
+
//// Persistent data
|
|
92
|
+
quadBuffer: ArrayBuffer = new ArrayBuffer(1024 * 1024 * 4);
|
|
93
|
+
fQuadBuffer: Float32Array = new Float32Array(this.quadBuffer);
|
|
94
|
+
uiQuadBuffer: Uint32Array = new Uint32Array(this.quadBuffer);
|
|
95
|
+
renderOps: WebGlCoreRenderOp[] = [];
|
|
96
|
+
|
|
97
|
+
//// Render Op / Buffer Filling State
|
|
98
|
+
curBufferIdx = 0;
|
|
99
|
+
curRenderOp: WebGlCoreRenderOp | null = null;
|
|
100
|
+
renderables: Array<QuadOptions | WebGlCoreRenderOp> = [];
|
|
101
|
+
|
|
102
|
+
//// Default Shader
|
|
103
|
+
defaultShader: WebGlCoreShader;
|
|
104
|
+
quadBufferCollection: BufferCollection;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* White pixel texture used by default when no texture is specified.
|
|
108
|
+
*/
|
|
109
|
+
defaultTexture: Texture;
|
|
110
|
+
|
|
111
|
+
constructor(options: WebGlCoreRendererOptions) {
|
|
112
|
+
super(options.stage);
|
|
113
|
+
const { canvas, clearColor, bufferMemory } = options;
|
|
114
|
+
this.options = options;
|
|
115
|
+
this.txManager = options.txManager;
|
|
116
|
+
this.shManager = options.shManager;
|
|
117
|
+
this.defaultTexture = new ColorTexture(this.txManager);
|
|
118
|
+
|
|
119
|
+
const gl = createWebGLContext(canvas);
|
|
120
|
+
if (!gl) {
|
|
121
|
+
throw new Error('Unable to create WebGL context');
|
|
122
|
+
}
|
|
123
|
+
this.gl = gl;
|
|
124
|
+
|
|
125
|
+
const color = getNormalizedRgbaComponents(clearColor);
|
|
126
|
+
gl.viewport(0, 0, canvas.width, canvas.height);
|
|
127
|
+
gl.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
|
|
128
|
+
|
|
129
|
+
createIndexBuffer(gl, bufferMemory);
|
|
130
|
+
|
|
131
|
+
this.system = {
|
|
132
|
+
parameters: getWebGlParameters(gl),
|
|
133
|
+
extensions: getWebGlExtensions(gl),
|
|
134
|
+
};
|
|
135
|
+
this.shManager.renderer = this;
|
|
136
|
+
this.defaultShader = this.shManager.loadShader(
|
|
137
|
+
'DefaultShaderBatched',
|
|
138
|
+
).shader;
|
|
139
|
+
const quadBuffer = gl.createBuffer();
|
|
140
|
+
assertTruthy(quadBuffer);
|
|
141
|
+
const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
|
|
142
|
+
this.quadBufferCollection = new BufferCollection([
|
|
143
|
+
{
|
|
144
|
+
buffer: quadBuffer,
|
|
145
|
+
attributes: {
|
|
146
|
+
a_position: {
|
|
147
|
+
name: 'a_position',
|
|
148
|
+
size: 2, // 2 components per iteration
|
|
149
|
+
type: gl.FLOAT, // the data is 32bit floats
|
|
150
|
+
normalized: false, // don't normalize the data
|
|
151
|
+
stride, // 0 = move forward size * sizeof(type) each iteration to get the next position
|
|
152
|
+
offset: 0, // start at the beginning of the buffer
|
|
153
|
+
},
|
|
154
|
+
a_textureCoordinate: {
|
|
155
|
+
name: 'a_textureCoordinate',
|
|
156
|
+
size: 2,
|
|
157
|
+
type: gl.FLOAT,
|
|
158
|
+
normalized: false,
|
|
159
|
+
stride,
|
|
160
|
+
offset: 2 * Float32Array.BYTES_PER_ELEMENT,
|
|
161
|
+
},
|
|
162
|
+
a_color: {
|
|
163
|
+
name: 'a_color',
|
|
164
|
+
size: 4,
|
|
165
|
+
type: gl.UNSIGNED_BYTE,
|
|
166
|
+
normalized: true,
|
|
167
|
+
stride,
|
|
168
|
+
offset: 4 * Float32Array.BYTES_PER_ELEMENT,
|
|
169
|
+
},
|
|
170
|
+
a_textureIndex: {
|
|
171
|
+
name: 'a_textureIndex',
|
|
172
|
+
size: 1,
|
|
173
|
+
type: gl.FLOAT,
|
|
174
|
+
normalized: false,
|
|
175
|
+
stride,
|
|
176
|
+
offset: 5 * Float32Array.BYTES_PER_ELEMENT,
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
]);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
reset() {
|
|
184
|
+
this.curBufferIdx = 0;
|
|
185
|
+
this.curRenderOp = null;
|
|
186
|
+
this.renderOps.length = 0;
|
|
187
|
+
this.gl.clear(this.gl.COLOR_BUFFER_BIT);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
override getShaderManager(): CoreShaderManager {
|
|
191
|
+
return this.shManager;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
override createCtxTexture(textureSource: Texture): CoreContextTexture {
|
|
195
|
+
if (textureSource instanceof SubTexture) {
|
|
196
|
+
return new WebGlCoreCtxSubTexture(this.gl, textureSource);
|
|
197
|
+
}
|
|
198
|
+
return new WebGlCoreCtxTexture(this.gl, textureSource);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Add a renderable to the current set of renderables.
|
|
203
|
+
*
|
|
204
|
+
* @remarks
|
|
205
|
+
* If a {@link QuadOptions} structure is provided, this will ultimately result
|
|
206
|
+
* in a render ops being created, merged and added to the render ops list.
|
|
207
|
+
*
|
|
208
|
+
* If a direct {@link WebGlCoreRenderOp} instance is provided, it will be
|
|
209
|
+
* added to the render ops list as-is. Be sure to set the zIndex correctly of
|
|
210
|
+
* the render op to ensure proper rendering order.
|
|
211
|
+
*
|
|
212
|
+
* @param renderable
|
|
213
|
+
*/
|
|
214
|
+
override addRenderable(renderable: QuadOptions | WebGlCoreRenderOp) {
|
|
215
|
+
this.renderables?.push(renderable);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private addQuad(params: QuadOptions) {
|
|
219
|
+
const { fQuadBuffer, uiQuadBuffer } = this;
|
|
220
|
+
const {
|
|
221
|
+
width,
|
|
222
|
+
height,
|
|
223
|
+
clippingRect,
|
|
224
|
+
colorTl,
|
|
225
|
+
colorTr,
|
|
226
|
+
colorBl,
|
|
227
|
+
colorBr,
|
|
228
|
+
textureOptions,
|
|
229
|
+
shader,
|
|
230
|
+
shaderProps,
|
|
231
|
+
alpha,
|
|
232
|
+
wpx,
|
|
233
|
+
wpy,
|
|
234
|
+
ta,
|
|
235
|
+
tb,
|
|
236
|
+
tc,
|
|
237
|
+
td,
|
|
238
|
+
} = params;
|
|
239
|
+
let { texture } = params;
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* If the shader props contain any automatic properties, update it with the
|
|
243
|
+
* current dimensions that will be used to render the quad.
|
|
244
|
+
*/
|
|
245
|
+
if (shaderProps && hasOwn(shaderProps, '$dimensions')) {
|
|
246
|
+
const dimensions = shaderProps.$dimensions as Dimensions;
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
248
|
+
dimensions.width = width;
|
|
249
|
+
dimensions.height = height;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
texture = texture ?? this.defaultTexture;
|
|
253
|
+
assertTruthy(texture instanceof Texture, 'Invalid texture type');
|
|
254
|
+
|
|
255
|
+
let { curBufferIdx: bufferIdx, curRenderOp } = this;
|
|
256
|
+
const targetDims = {
|
|
257
|
+
width,
|
|
258
|
+
height,
|
|
259
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
260
|
+
};
|
|
261
|
+
const targetShader = shader || this.defaultShader;
|
|
262
|
+
assertTruthy(targetShader instanceof WebGlCoreShader);
|
|
263
|
+
if (curRenderOp) {
|
|
264
|
+
// If the current render op is not the same shader, create a new one
|
|
265
|
+
// If the current render op's shader props are not compatible with the
|
|
266
|
+
// the new shader props, create a new one render op.
|
|
267
|
+
if (
|
|
268
|
+
curRenderOp.shader !== targetShader ||
|
|
269
|
+
!compareRect(curRenderOp.clippingRect, clippingRect) ||
|
|
270
|
+
(curRenderOp.shader !== this.defaultShader &&
|
|
271
|
+
(!shaderProps ||
|
|
272
|
+
!curRenderOp.shader.canBatchShaderProps(
|
|
273
|
+
curRenderOp.shaderProps,
|
|
274
|
+
shaderProps,
|
|
275
|
+
)))
|
|
276
|
+
) {
|
|
277
|
+
curRenderOp = null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
assertTruthy(targetShader instanceof WebGlCoreShader);
|
|
281
|
+
|
|
282
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
283
|
+
if (!curRenderOp) {
|
|
284
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
285
|
+
this.newRenderOp(
|
|
286
|
+
targetShader,
|
|
287
|
+
shaderProps as any,
|
|
288
|
+
alpha,
|
|
289
|
+
targetDims,
|
|
290
|
+
clippingRect,
|
|
291
|
+
bufferIdx,
|
|
292
|
+
);
|
|
293
|
+
curRenderOp = this.curRenderOp;
|
|
294
|
+
assertTruthy(curRenderOp);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const flipX = textureOptions?.flipX ?? false;
|
|
298
|
+
const flipY = textureOptions?.flipY ?? false;
|
|
299
|
+
|
|
300
|
+
let texCoordX1 = 0;
|
|
301
|
+
let texCoordY1 = 0;
|
|
302
|
+
let texCoordX2 = 1;
|
|
303
|
+
let texCoordY2 = 1;
|
|
304
|
+
|
|
305
|
+
if (texture instanceof SubTexture) {
|
|
306
|
+
const { x: tx, y: ty, width: tw, height: th } = texture.props;
|
|
307
|
+
const { width: parentW = 0, height: parentH = 0 } = texture.parentTexture
|
|
308
|
+
.dimensions || { width: 0, height: 0 };
|
|
309
|
+
texCoordX1 = tx / parentW;
|
|
310
|
+
texCoordX2 = texCoordX1 + tw / parentW;
|
|
311
|
+
texCoordY1 = ty / parentH;
|
|
312
|
+
texCoordY2 = texCoordY1 + th / parentH;
|
|
313
|
+
texture = texture.parentTexture;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Flip texture coordinates if dictated by texture options
|
|
317
|
+
if (flipX) {
|
|
318
|
+
[texCoordX1, texCoordX2] = [texCoordX2, texCoordX1];
|
|
319
|
+
}
|
|
320
|
+
if (flipY) {
|
|
321
|
+
[texCoordY1, texCoordY2] = [texCoordY2, texCoordY1];
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const { txManager } = this.stage;
|
|
325
|
+
const ctxTexture = txManager.getCtxTexture(texture);
|
|
326
|
+
assertTruthy(ctxTexture instanceof WebGlCoreCtxTexture);
|
|
327
|
+
const textureIdx = this.addTexture(ctxTexture, bufferIdx);
|
|
328
|
+
curRenderOp = this.curRenderOp;
|
|
329
|
+
assertTruthy(curRenderOp);
|
|
330
|
+
|
|
331
|
+
// render quad advanced
|
|
332
|
+
if (tb !== 0 || tc !== 0) {
|
|
333
|
+
// Upper-Left
|
|
334
|
+
fQuadBuffer[bufferIdx++] = wpx; // vertexX
|
|
335
|
+
fQuadBuffer[bufferIdx++] = wpy; // vertexY
|
|
336
|
+
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
337
|
+
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
338
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
339
|
+
colorTl,
|
|
340
|
+
alpha,
|
|
341
|
+
true,
|
|
342
|
+
); // color
|
|
343
|
+
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
344
|
+
|
|
345
|
+
// Upper-Right
|
|
346
|
+
fQuadBuffer[bufferIdx++] = wpx + width * ta;
|
|
347
|
+
fQuadBuffer[bufferIdx++] = wpy + width * tc;
|
|
348
|
+
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
349
|
+
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
350
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
351
|
+
colorTr,
|
|
352
|
+
alpha,
|
|
353
|
+
true,
|
|
354
|
+
);
|
|
355
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
356
|
+
|
|
357
|
+
// Lower-Left
|
|
358
|
+
fQuadBuffer[bufferIdx++] = wpx + height * tb;
|
|
359
|
+
fQuadBuffer[bufferIdx++] = wpy + height * td;
|
|
360
|
+
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
361
|
+
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
362
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
363
|
+
colorBl,
|
|
364
|
+
alpha,
|
|
365
|
+
true,
|
|
366
|
+
);
|
|
367
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
368
|
+
|
|
369
|
+
// Lower-Right
|
|
370
|
+
fQuadBuffer[bufferIdx++] = wpx + width * ta + height * tb;
|
|
371
|
+
fQuadBuffer[bufferIdx++] = wpy + width * tc + height * td;
|
|
372
|
+
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
373
|
+
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
374
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
375
|
+
colorBr,
|
|
376
|
+
alpha,
|
|
377
|
+
true,
|
|
378
|
+
);
|
|
379
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
380
|
+
} else {
|
|
381
|
+
// Calculate the right corner of the quad
|
|
382
|
+
// multiplied by the scale
|
|
383
|
+
const rightCornerX = wpx + width * ta;
|
|
384
|
+
const rightCornerY = wpy + height * td;
|
|
385
|
+
|
|
386
|
+
// Upper-Left
|
|
387
|
+
fQuadBuffer[bufferIdx++] = wpx; // vertexX
|
|
388
|
+
fQuadBuffer[bufferIdx++] = wpy; // vertexY
|
|
389
|
+
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
390
|
+
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
391
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
392
|
+
colorTl,
|
|
393
|
+
alpha,
|
|
394
|
+
true,
|
|
395
|
+
); // color
|
|
396
|
+
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
397
|
+
|
|
398
|
+
// Upper-Right
|
|
399
|
+
fQuadBuffer[bufferIdx++] = rightCornerX;
|
|
400
|
+
fQuadBuffer[bufferIdx++] = wpy;
|
|
401
|
+
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
402
|
+
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
403
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
404
|
+
colorTr,
|
|
405
|
+
alpha,
|
|
406
|
+
true,
|
|
407
|
+
);
|
|
408
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
409
|
+
|
|
410
|
+
// Lower-Left
|
|
411
|
+
fQuadBuffer[bufferIdx++] = wpx;
|
|
412
|
+
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
413
|
+
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
414
|
+
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
415
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
416
|
+
colorBl,
|
|
417
|
+
alpha,
|
|
418
|
+
true,
|
|
419
|
+
);
|
|
420
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
421
|
+
|
|
422
|
+
// Lower-Right
|
|
423
|
+
fQuadBuffer[bufferIdx++] = rightCornerX;
|
|
424
|
+
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
425
|
+
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
426
|
+
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
427
|
+
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
428
|
+
colorBr,
|
|
429
|
+
alpha,
|
|
430
|
+
true,
|
|
431
|
+
);
|
|
432
|
+
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Update the length of the current render op
|
|
436
|
+
curRenderOp.length += WORDS_PER_QUAD;
|
|
437
|
+
curRenderOp.numQuads++;
|
|
438
|
+
this.curBufferIdx = bufferIdx;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Replace the existing RenderOp with a new one that uses the specified Shader
|
|
443
|
+
* and starts at the specified buffer index.
|
|
444
|
+
*
|
|
445
|
+
* @param shader
|
|
446
|
+
* @param bufferIdx
|
|
447
|
+
*/
|
|
448
|
+
private newRenderOp(
|
|
449
|
+
shader: WebGlCoreShader,
|
|
450
|
+
shaderProps: Record<string, unknown>,
|
|
451
|
+
alpha: number,
|
|
452
|
+
dimensions: Dimensions,
|
|
453
|
+
clippingRect: Rect | null,
|
|
454
|
+
bufferIdx: number,
|
|
455
|
+
) {
|
|
456
|
+
const curRenderOp = new WebGlCoreRenderOp(
|
|
457
|
+
this.gl,
|
|
458
|
+
this.options,
|
|
459
|
+
this.quadBufferCollection,
|
|
460
|
+
shader,
|
|
461
|
+
shaderProps,
|
|
462
|
+
alpha,
|
|
463
|
+
clippingRect,
|
|
464
|
+
dimensions,
|
|
465
|
+
bufferIdx,
|
|
466
|
+
0, // Z-Index is only used for explictly added Render Ops
|
|
467
|
+
);
|
|
468
|
+
this.curRenderOp = curRenderOp;
|
|
469
|
+
this.renderOps.push(curRenderOp);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Add a texture to the current RenderOp. If the texture cannot be added to the
|
|
474
|
+
* current RenderOp, a new RenderOp will be created and the texture will be added
|
|
475
|
+
* to that one.
|
|
476
|
+
*
|
|
477
|
+
* If the texture cannot be added to the new RenderOp, an error will be thrown.
|
|
478
|
+
*
|
|
479
|
+
* @param texture
|
|
480
|
+
* @param bufferIdx
|
|
481
|
+
* @param recursive
|
|
482
|
+
* @returns Assigned Texture Index of the texture in the render op
|
|
483
|
+
*/
|
|
484
|
+
private addTexture(
|
|
485
|
+
texture: WebGlCoreCtxTexture,
|
|
486
|
+
bufferIdx: number,
|
|
487
|
+
recursive?: boolean,
|
|
488
|
+
): number {
|
|
489
|
+
const { curRenderOp } = this;
|
|
490
|
+
assertTruthy(curRenderOp);
|
|
491
|
+
const textureIdx = curRenderOp.addTexture(texture);
|
|
492
|
+
// TODO: Refactor to be more DRY
|
|
493
|
+
if (textureIdx === 0xffffffff) {
|
|
494
|
+
if (recursive) {
|
|
495
|
+
throw new Error('Unable to add texture to render op');
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const { shader, shaderProps, dimensions, clippingRect, alpha } =
|
|
499
|
+
curRenderOp;
|
|
500
|
+
this.newRenderOp(
|
|
501
|
+
shader,
|
|
502
|
+
shaderProps,
|
|
503
|
+
alpha,
|
|
504
|
+
dimensions,
|
|
505
|
+
clippingRect,
|
|
506
|
+
bufferIdx,
|
|
507
|
+
);
|
|
508
|
+
return this.addTexture(texture, bufferIdx, true);
|
|
509
|
+
}
|
|
510
|
+
return textureIdx;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Sort renderable children and add them to the render ops.
|
|
515
|
+
* @todo:
|
|
516
|
+
* - move to merge sort to keep relative order
|
|
517
|
+
* - support z-index parent locking
|
|
518
|
+
*
|
|
519
|
+
*/
|
|
520
|
+
|
|
521
|
+
sortRenderables() {
|
|
522
|
+
const { renderables } = this;
|
|
523
|
+
renderables.sort((a, b) => a.zIndex - b.zIndex);
|
|
524
|
+
|
|
525
|
+
renderables.forEach((renderable) => {
|
|
526
|
+
if (renderable instanceof WebGlCoreRenderOp) {
|
|
527
|
+
this.renderOps.push(renderable);
|
|
528
|
+
this.curRenderOp = null;
|
|
529
|
+
} else {
|
|
530
|
+
this.addQuad(renderable);
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Render the current set of RenderOps to render to the specified surface.
|
|
537
|
+
*
|
|
538
|
+
* TODO: 'screen' is the only supported surface at the moment.
|
|
539
|
+
*
|
|
540
|
+
* @param surface
|
|
541
|
+
*/
|
|
542
|
+
render(surface: 'screen' | CoreContextTexture = 'screen'): void {
|
|
543
|
+
const { gl, quadBuffer } = this;
|
|
544
|
+
|
|
545
|
+
const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
|
|
546
|
+
|
|
547
|
+
const buffer = this.quadBufferCollection.getBuffer('a_position') ?? null;
|
|
548
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
549
|
+
gl.bufferData(gl.ARRAY_BUFFER, arr, gl.DYNAMIC_DRAW);
|
|
550
|
+
|
|
551
|
+
const doLog = false; // idx++ % 100 === 0;
|
|
552
|
+
if (doLog) {
|
|
553
|
+
console.log('renderOps', this.renderOps.length);
|
|
554
|
+
}
|
|
555
|
+
this.renderOps.forEach((renderOp, i) => {
|
|
556
|
+
if (doLog) {
|
|
557
|
+
console.log('renderOp', i, renderOp.numQuads);
|
|
558
|
+
}
|
|
559
|
+
renderOp.draw();
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
// clean up
|
|
563
|
+
this.renderables = [];
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
const idx = 0;
|