From 482ab0dbcd6010947635d5b5af2bebddde32ba42 Mon Sep 17 00:00:00 2001 From: AlaricBaraou Date: Tue, 16 Sep 2025 22:14:42 +0900 Subject: [PATCH 1/3] usePremultipliedalpha experiment --- .../text-batched/BatchedTextExample.jsx | 218 +++++++++++------- packages/troika-three-text/src/BatchedText.js | 5 + packages/troika-three-text/src/Text.js | 21 +- .../src/TextDerivedMaterial.js | 10 +- 4 files changed, 171 insertions(+), 83 deletions(-) diff --git a/packages/troika-examples/text-batched/BatchedTextExample.jsx b/packages/troika-examples/text-batched/BatchedTextExample.jsx index f7797c57..21ce1814 100644 --- a/packages/troika-examples/text-batched/BatchedTextExample.jsx +++ b/packages/troika-examples/text-batched/BatchedTextExample.jsx @@ -1,88 +1,148 @@ import React from "react"; +import { BoxGeometry, Mesh, MeshBasicMaterial, MeshStandardMaterial } from "three"; import { Canvas3D } from "troika-3d"; import { Text3DFacade, BatchedText3DFacade } from "troika-3d-text"; -import { FONTS } from '../text/TextExample' -import { Color } from "three/src/math/Color"; +import { Object3DFacade } from "../../troika-3d/src/index"; -export default function BatchedTextExample ({ stats, width, height }) { - const [texts, setTexts] = React.useState(randomizeText()); +// Define the source text array once, so both 3D and SVG can use it +const words = [ + "One", "Two", "Three", "Four", "Five", + "Six", "Seven", "Eight", "Nine", "Ten", + "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", + "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty" +]; - function randomizeText() { - const all = [ - "One", "Two", "Three", "Four", "Five", - "Six", "Seven", "Eight", "Nine", "Ten", - "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", - "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty" - ] - const subset = all.slice(0, Math.max(16, Math.floor(Math.random() * all.length))) - return subset.map((text, i) => ({ - facade: Text3DFacade, - text, - font: Object.values(FONTS)[i % Object.values(FONTS).length], - fontSize: randRange(0.05, 0.25), - x: randRange(-1, 1), - y: randRange(-1, 1), - z: randRange(-1, 1), - rotateZ: randRange(-0.01, 0.01), - anchorX: "50%", - anchorY: "50%", - color: randColor(), - // fillOpacity: Math.random() < 0.5 ? 0.1 : 1, - // strokeWidth: Math.random() < 0.5 ? '3%' : 0, - // strokeColor: randColor(), - outlineWidth: Math.random() < 0.3 ? '10%' : 0, - // outlineBlur: Math.random() < 0.3 ? '20%' : 0, - // outlineColor: randColor(), - // outlineOpacity: Math.random(), - // clipRect: Math.random() < 0.5 ? [0, 0, 999, 999] : null, - // curveRadius: Math.random() < 0.5 ? 0.1 : 0, - animation: { - from: { rotateY: 0 }, - to: { rotateY: Math.PI * 2 }, - duration: randRange(800, 3000), - iterations: Infinity - } - })) - } +// This function generates the properties for the 3D text +function generate3DTextLayout(premultiply) { + const startY = 1.5; + const yStep = 0.15; + const startFontSize = 0.3; + const fontSizeStep = 0.012; - return
- { - setTexts(randomizeText()) - }} - camera={{ - fov: 75, - aspect: width / height, - x: 0, - y: 0, - z: 2.5 - }} - objects={[ - { - facade: BatchedText3DFacade, - children: texts, - animation: { - from: { rotateY: 0 }, - to: { rotateY: Math.PI * 2 }, - duration: 10000, - iterations: Infinity - } - } - ]} - /> -
; + return words.map((text, i) => ({ + facade: Text3DFacade, + text, + font: '/Geist-Regular.ttf', + fontSize: Math.max(0.02, startFontSize - i * fontSizeStep), + anchorX: "50%", + anchorY: "50%", + x: premultiply ? 1 : -1, + y: startY - i * yStep, + z: 0, + // color: 0xc4c4c4, + // color: 0xd0d0d0, + color: 0x808080, + fillOpacity: 0.5, + // fillOpacity: 0.9375, + outlineWidth: '10%', + outlineColor: 0x121212, + outlineOpacity: 1, + usePremultipliedAlpha: !!premultiply, + })); } -function randRange (min, max) { - return min + Math.random() * (max - min); -} -function randColor() { - return new Color().setHSL(Math.random(), 1, 0.5) +class BackgroundTest extends Object3DFacade { + initThreeObject() { + return new Mesh( + new BoxGeometry(10,1,1), + new MeshBasicMaterial({ + color: 0xff0000, + }) + ) + } } -// function randFromArray(array) { -// return array[Math.floor(Math.random() * array.length)]; -// } + + +export default function BatchedTextExample({ stats, width, height }) { + const [texts3D,setTexts] = React.useState(generate3DTextLayout()); + const [premultipliedTexts3D,setPremultipliedTexts] = React.useState(generate3DTextLayout(true)); + + console.log('texts3D', texts3D) + + // --- SVG Text Logic --- + // Define layout parameters suitable for SVG pixels + const svgStartY = 60; // Starting Y position in pixels + const svgYStep = 20; // Gap between lines in pixels + const svgStartFontSize = 32; // Starting font size in pixels + const svgFontSizeStep = 1; // How much to decrease font size (px) + + // Generate the properties for the SVG text elements + const svgTexts = words.map((text, i) => ({ + text, + y: svgStartY + i * svgYStep, + fontSize: Math.max(8, svgStartFontSize - i * svgFontSizeStep), + })); + + return ( + // Main container using Flexbox for a side-by-side layout +
+ + {/* Add a style tag to load the custom font for the SVG */} + + + {/* 1. 3D Canvas Container (takes up the left 50%) */} +
+ { + setTexts(generate3DTextLayout()); + setPremultipliedTexts(generate3DTextLayout(true)); + }} + camera={{ fov: 75, aspect: (width / 2) / height, x: 0, y: 0, z: 2.5 }} + objects={[ + { + facade: BatchedText3DFacade, + children: texts3D, + }, + { + facade: BatchedText3DFacade, + children: premultipliedTexts3D, + }, + { + key: 'jnjn', + facade: BackgroundTest, + receiveShadow: true, + scale: 1, + z:-1, + y:-1.4, + } + ]} + /> +
+ + {/* 2. SVG Container (takes up the right 50%) */} +
+ + + {svgTexts.map((item, i) => ( + + {item.text} + + ))} + +
+
+ ); +} \ No newline at end of file diff --git a/packages/troika-three-text/src/BatchedText.js b/packages/troika-three-text/src/BatchedText.js index f81c90f2..b6306b53 100644 --- a/packages/troika-three-text/src/BatchedText.js +++ b/packages/troika-three-text/src/BatchedText.js @@ -27,6 +27,7 @@ Data texture packing strategy: 30: uTroikaStrokeOpacity # Outline: +27: usePremultipliedAlpha (0/1) 28-29: uTroikaPositionOffset 30: uTroikaEdgeOffset 31: uTroikaBlurRadius @@ -210,6 +211,7 @@ export class BatchedText extends Text { uTroikaStrokeOpacity, uTroikaFillOpacity, uTroikaCurveRadius, + uUsePremultipliedAlpha } = material.uniforms; // Total bounds for uv @@ -234,6 +236,7 @@ export class BatchedText extends Text { // Curve radius setTexData(startIndex + 26, uTroikaCurveRadius.value) + setTexData(startIndex + 27, uUsePremultipliedAlpha.value); if (isOutline) { // Outline properties @@ -415,6 +418,7 @@ function createBatchedTextMaterial (baseMaterial) { 'uTroikaStrokeOpacity', 'uTroikaFillOpacity', 'uTroikaCurveRadius', + 'uUsePremultipliedAlpha', 'diffuse' ] varyingUniforms.forEach(uniformName => { @@ -444,6 +448,7 @@ function createBatchedTextMaterial (baseMaterial) { diffuse = troikaFloatToColor(data.x); uTroikaFillOpacity = data.y; uTroikaCurveRadius = data.z; + uUsePremultipliedAlpha = data.w; data = troikaBatchTexel(7.0); if (uTroikaIsOutline) { diff --git a/packages/troika-three-text/src/Text.js b/packages/troika-three-text/src/Text.js index b4b9977d..112a2f35 100644 --- a/packages/troika-three-text/src/Text.js +++ b/packages/troika-three-text/src/Text.js @@ -7,6 +7,10 @@ import { PlaneGeometry, Vector3, Vector2, + CustomBlending, + OneFactor, + OneMinusSrcAlphaFactor, + NormalBlending, } from 'three' import { GlyphsGeometry } from './GlyphsGeometry.js' import { createTextDerivedMaterial } from './TextDerivedMaterial.js' @@ -398,6 +402,12 @@ class Text extends Mesh { */ this.gpuAccelerateSDF = true + /** + * @member {boolean} usePremultipliedAlpha + * TODO + **/ + this.usePremultipliedAlpha = true + this.debugSDF = false } @@ -638,7 +648,15 @@ class Text extends Mesh { } fillOpacity = this.fillOpacity } - + if(this.usePremultipliedAlpha){ + material.premultipliedAlpha = true + material.blending = CustomBlending; + material.blendSrc = OneFactor; // Use the source color as-is + material.blendDst = OneMinusSrcAlphaFactor; + }else{ + material.blending = NormalBlending + } + uniforms.uTroikaEdgeOffset.value = distanceOffset uniforms.uTroikaPositionOffset.value.set(offsetX, offsetY) uniforms.uTroikaBlurRadius.value = blurRadius @@ -663,6 +681,7 @@ class Text extends Mesh { this.geometry.applyClipRect(uniforms.uTroikaClipRect.value) } uniforms.uTroikaSDFDebug.value = !!this.debugSDF + uniforms.uUsePremultipliedAlpha.value = this.usePremultipliedAlpha ? 1 : 0 material.polygonOffset = !!this.depthOffset material.polygonOffsetFactor = material.polygonOffsetUnits = this.depthOffset || 0 diff --git a/packages/troika-three-text/src/TextDerivedMaterial.js b/packages/troika-three-text/src/TextDerivedMaterial.js index 576de108..73ed330c 100644 --- a/packages/troika-three-text/src/TextDerivedMaterial.js +++ b/packages/troika-three-text/src/TextDerivedMaterial.js @@ -84,6 +84,7 @@ uniform vec3 uTroikaStrokeColor; uniform float uTroikaStrokeWidth; uniform float uTroikaStrokeOpacity; uniform bool uTroikaSDFDebug; +uniform float uUsePremultipliedAlpha; varying vec2 vTroikaGlyphUV; varying vec4 vTroikaTextureUVBounds; varying float vTroikaTextureChannel; @@ -195,9 +196,11 @@ gl_FragColor = mix(fillRGBA, strokeRGBA, smoothstep( )); gl_FragColor.a *= edgeAlpha; #endif - +if(uUsePremultipliedAlpha == 1.0){ + gl_FragColor.rgb *= gl_FragColor.a; +} if (edgeAlpha == 0.0) { - discard; + discard; } ` @@ -228,7 +231,8 @@ export function createTextDerivedMaterial(baseMaterial) { uTroikaStrokeOpacity: {value: 1}, uTroikaOrient: {value: new Matrix3()}, uTroikaUseGlyphColors: {value: true}, - uTroikaSDFDebug: {value: false} + uTroikaSDFDebug: {value: false}, + uUsePremultipliedAlpha: {value: 0} }, vertexDefs: VERTEX_DEFS, vertexTransform: VERTEX_TRANSFORM, From 6cb19a77d0e7b416c7c4039e8218a8ef57ee33e0 Mon Sep 17 00:00:00 2001 From: AlaricBaraou Date: Tue, 16 Sep 2025 22:31:36 +0900 Subject: [PATCH 2/3] WIP: 0c1238a usePremultipliedalpha experiment --- .../troika-3d-text/src/facade/Text3DFacade.js | 1 + packages/troika-examples/Geist-Regular.ttf | Bin 0 -> 113068 bytes 2 files changed, 1 insertion(+) create mode 100644 packages/troika-examples/Geist-Regular.ttf diff --git a/packages/troika-3d-text/src/facade/Text3DFacade.js b/packages/troika-3d-text/src/facade/Text3DFacade.js index ad9e8a31..6c7e8e03 100644 --- a/packages/troika-3d-text/src/facade/Text3DFacade.js +++ b/packages/troika-3d-text/src/facade/Text3DFacade.js @@ -40,6 +40,7 @@ export const TEXT_MESH_PROPS = [ 'sdfGlyphSize', 'unicodeFontsURL', 'gpuAccelerateSDF', + 'usePremultipliedAlpha', 'debugSDF' ] diff --git a/packages/troika-examples/Geist-Regular.ttf b/packages/troika-examples/Geist-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e63cb78535b90b970f8db8f039407c439ddb38c0 GIT binary patch literal 113068 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 literal 0 HcmV?d00001 From 06c9b539088525d2bb37fc9dd55aabb5c5f92834 Mon Sep 17 00:00:00 2001 From: AlaricBaraou Date: Tue, 16 Sep 2025 22:33:18 +0900 Subject: [PATCH 3/3] latest three in examples --- packages/troika-3d/src/facade/World3DFacade.js | 4 ++-- packages/troika-examples/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/troika-3d/src/facade/World3DFacade.js b/packages/troika-3d/src/facade/World3DFacade.js index b770eff0..a6d17a73 100644 --- a/packages/troika-3d/src/facade/World3DFacade.js +++ b/packages/troika-3d/src/facade/World3DFacade.js @@ -1,5 +1,5 @@ import { WorldBaseFacade, utils } from 'troika-core' -import { WebGLRenderer, Raycaster, Color, Vector2, Vector3, LinearEncoding, NoToneMapping } from 'three' +import { WebGLRenderer, Raycaster, Color, Vector2, Vector3, LinearSRGBColorSpace, NoToneMapping } from 'three' import Scene3DFacade from './Scene3DFacade.js' import {PerspectiveCamera3DFacade} from './Camera3DFacade.js' import {BoundingSphereOctree} from '../BoundingSphereOctree.js' @@ -53,7 +53,7 @@ class World3DFacade extends WorldBaseFacade { this._bgColor = backgroundColor } - renderer.outputEncoding = this.outputEncoding || LinearEncoding + renderer.outputEncoding = this.outputEncoding || LinearSRGBColorSpace renderer.toneMapping = this.toneMapping || NoToneMapping // Update render canvas size diff --git a/packages/troika-examples/package.json b/packages/troika-examples/package.json index b0e7c625..af9652ba 100644 --- a/packages/troika-examples/package.json +++ b/packages/troika-examples/package.json @@ -21,7 +21,7 @@ "react": "^16.14.0", "react-dat-gui": "^4.0.0", "react-dom": "^16.14.0", - "three": "^0.149.0", + "three": "^0.180.0", "three-instanced-uniforms-mesh": "^0.52.4", "three-line-2d": "^1.1.6", "troika-2d": "^0.52.0",