From 7a2da8c2851d09ae8426f0e86b067dcd97e72883 Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 11:01:24 +0800 Subject: [PATCH 1/7] fix: merge anchor into modelmatrix #1440 --- .../g-plugin-device-renderer/src/drawcalls/InstancedFill.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/g-plugin-device-renderer/src/drawcalls/InstancedFill.ts b/packages/g-plugin-device-renderer/src/drawcalls/InstancedFill.ts index 38bbe8c93..2686eb902 100644 --- a/packages/g-plugin-device-renderer/src/drawcalls/InstancedFill.ts +++ b/packages/g-plugin-device-renderer/src/drawcalls/InstancedFill.ts @@ -16,6 +16,8 @@ import { BatchContext } from '../renderer'; const SEGMENT_NUM = 12; export class InstancedFillDrawcall extends Instanced { + protected mergeAnchorIntoModelMatrix = true; + constructor( protected renderHelper: RenderHelper, protected texturePool: TexturePool, From bfba326ecb540bd57d05e24660554b02bed2af62 Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 11:02:34 +0800 Subject: [PATCH 2/7] chore: commit changeset --- .changeset/curvy-laws-kick.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curvy-laws-kick.md diff --git a/.changeset/curvy-laws-kick.md b/.changeset/curvy-laws-kick.md new file mode 100644 index 000000000..cdea35d67 --- /dev/null +++ b/.changeset/curvy-laws-kick.md @@ -0,0 +1,5 @@ +--- +'@antv/g-plugin-device-renderer': patch +--- + +Merge anchor into modelmatrix. From a6979d43aee5d9b9e745e667ea514b15f02c32c2 Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 15:06:56 +0800 Subject: [PATCH 3/7] fix: billboard effect should work for Line under ortho camera #1442 --- .../src/shader/instanced-line.vert | 4 +- site/examples/3d/3d-basic/demo/billboard.js | 153 ++++++++++++++++++ site/examples/3d/3d-basic/demo/meta.json | 8 + 3 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 site/examples/3d/3d-basic/demo/billboard.js diff --git a/packages/g-plugin-device-renderer/src/shader/instanced-line.vert b/packages/g-plugin-device-renderer/src/shader/instanced-line.vert index db096fca8..4e637e38b 100644 --- a/packages/g-plugin-device-renderer/src/shader/instanced-line.vert +++ b/packages/g-plugin-device-renderer/src/shader/instanced-line.vert @@ -33,9 +33,7 @@ void main() { float clampedStrokeWidth = max(strokeWidth, 1.0); float isBillboard = a_Dash.w; - bool isPerspective = isPerspectiveMatrix(u_ProjectionMatrix); - - if (isBillboard > 0.5 && isPerspective) { + if (isBillboard > 0.5) { // clip space vec4 clip0 = project(vec4(a_PointA, 1.0), u_ProjectionMatrix, u_ViewMatrix, u_ModelMatrix); vec4 clip1 = project(vec4(a_PointB, 1.0), u_ProjectionMatrix, u_ViewMatrix, u_ModelMatrix); diff --git a/site/examples/3d/3d-basic/demo/billboard.js b/site/examples/3d/3d-basic/demo/billboard.js new file mode 100644 index 000000000..ac6a18796 --- /dev/null +++ b/site/examples/3d/3d-basic/demo/billboard.js @@ -0,0 +1,153 @@ +import { + runtime, + Canvas, + CanvasEvent, + Line, + Text, + Rect, + Image, + Circle, + Path, +} from '@antv/g'; +import { Renderer } from '@antv/g-webgl'; +import { + MeshPhongMaterial, + SphereGeometry, + DirectionalLight, + Mesh, + Plugin as Plugin3D, +} from '@antv/g-plugin-3d'; +import { Plugin as PluginControl } from '@antv/g-plugin-control'; +import * as lil from 'lil-gui'; +import Stats from 'stats.js'; + +runtime.enableCSSParsing = false; + +// create a renderer +const renderer = new Renderer(); +renderer.registerPlugin(new Plugin3D()); +renderer.registerPlugin(new PluginControl()); + +// create a canvas +const canvas = new Canvas({ + container: 'container', + width: 400, + height: 400, + renderer, +}); + +(async () => { + // wait for canvas' initialization complete + await canvas.ready; + // use GPU device + const plugin = renderer.getPlugin('device-renderer'); + const device = plugin.getDevice(); + + const origin = new Image({ + style: { + x: 200, + y: 200, + z: 0, + width: 20, + height: 20, + src: 'https://gw.alipayobjects.com/mdn/rms_6ae20b/afts/img/A*N4ZMS7gHsUIAAAAAAAAAAABkARQnAQ', + isBillboard: true, + }, + }); + canvas.appendChild(origin); + + const x = origin.cloneNode(); + x.attr({ + x: 300, + }); + canvas.appendChild(x); + + const y = origin.cloneNode(); + y.attr({ + y: 100, + }); + canvas.appendChild(y); + + const z = origin.cloneNode(); + z.attr({ + z: 100, + }); + canvas.appendChild(z); + + const xAxis = new Line({ + style: { + x1: 200, + y1: 200, + z1: 0, + x2: 300, + y2: 200, + z2: 0, + stroke: 'black', + lineWidth: 2, + isBillboard: true, + }, + }); + canvas.appendChild(xAxis); + + const yAxis = new Line({ + style: { + x1: 200, + y1: 200, + z1: 0, + x2: 200, + y2: 100, + z2: 0, + stroke: 'black', + lineWidth: 2, + isBillboard: true, + }, + }); + canvas.appendChild(yAxis); + + const zAxis = new Line({ + style: { + x1: 200, + y1: 200, + z1: 0, + x2: 200, + y2: 200, + z2: 100, + stroke: 'black', + lineWidth: 2, + isBillboard: true, + }, + }); + canvas.appendChild(zAxis); + + // add a directional light into scene + const light = new DirectionalLight({ + style: { + fill: 'white', + direction: [-1, 0, 1], + }, + }); + canvas.appendChild(light); + + // adjust camera's position + // const camera = canvas.getCamera(); + // camera.setPerspective(0.1, 5000, 90, 400 / 400); + + // stats + const stats = new Stats(); + stats.showPanel(0); + const $stats = stats.dom; + $stats.style.position = 'absolute'; + $stats.style.left = '0px'; + $stats.style.top = '0px'; + const $wrapper = document.getElementById('container'); + $wrapper.appendChild($stats); + canvas.addEventListener(CanvasEvent.AFTER_RENDER, () => { + if (stats) { + stats.update(); + } + }); + + // GUI + const gui = new lil.GUI({ autoPlace: false }); + $wrapper.appendChild(gui.domElement); +})(); diff --git a/site/examples/3d/3d-basic/demo/meta.json b/site/examples/3d/3d-basic/demo/meta.json index b561a1dc6..dd2e5b0c8 100644 --- a/site/examples/3d/3d-basic/demo/meta.json +++ b/site/examples/3d/3d-basic/demo/meta.json @@ -20,6 +20,14 @@ }, "screenshot": "https://gw.alipayobjects.com/mdn/rms_6ae20b/afts/img/A*nKFQQZdL3-IAAAAAAAAAAAAAARQnAQ" }, + { + "filename": "billboard.js", + "title": { + "zh": "公告牌效果", + "en": "Billboard effect" + }, + "screenshot": "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*V44QR4my8ZwAAAAAAAAAAAAADmJ7AQ/original" + }, { "filename": "sprite.js", "title": { From 6d38c01c4904aa2367d666bac056b2ffc7e2bce5 Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 16:12:07 +0800 Subject: [PATCH 4/7] fix: dashline should be displayed as same as Canvas / SVG #1446 --- .../webgl/snapshots/d3-barchart.png | Bin 14598 -> 14611 bytes .../__node__tests__/webgl/snapshots/line.png | Bin 419 -> 419 bytes .../src/shader/instanced-line.frag | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/integration/__node__tests__/webgl/snapshots/d3-barchart.png b/__tests__/integration/__node__tests__/webgl/snapshots/d3-barchart.png index 01d881c009418c8d67d3d98a1d8e7b4221c3075d..3adaf86ed68c094026906aae0b68f0179c29b545 100644 GIT binary patch literal 14611 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 T=6&#=9Z}o1TASrDkvW;Dc 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 diff --git a/packages/g-plugin-device-renderer/src/shader/instanced-line.frag b/packages/g-plugin-device-renderer/src/shader/instanced-line.frag index 6aa2b386c..cd8aa70de 100644 --- a/packages/g-plugin-device-renderer/src/shader/instanced-line.frag +++ b/packages/g-plugin-device-renderer/src/shader/instanced-line.frag @@ -37,6 +37,6 @@ void main() { outputColor.a = outputColor.a * blur * u_Opacity * u_StrokeOpacity - * ceil(mod(v_Dash.x + u_dash_offset, u_dash_array) - (u_dash_array * u_dash_ratio)); + * (u_dash_array < 1.0 ? (ceil((u_dash_array * u_dash_ratio) - mod(v_Dash.x + u_dash_offset, u_dash_array))) : 1.0); } } \ No newline at end of file From 531a439a96fe5a048101ef1af9b46a42737e609c Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 16:13:09 +0800 Subject: [PATCH 5/7] chore: commit changeset --- .changeset/hip-geckos-melt.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hip-geckos-melt.md diff --git a/.changeset/hip-geckos-melt.md b/.changeset/hip-geckos-melt.md new file mode 100644 index 000000000..6ac91fad8 --- /dev/null +++ b/.changeset/hip-geckos-melt.md @@ -0,0 +1,5 @@ +--- +'@antv/g-plugin-device-renderer': patch +--- + +Fix dash effect in webgl. From 586f3d7d80c667b3a012ba73bac1e702510cc3a9 Mon Sep 17 00:00:00 2001 From: zengyue ye Date: Mon, 31 Jul 2023 19:25:40 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=E6=89=8B=E5=8A=BF=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=86=92=E6=B3=A1=E8=80=8C=E5=A4=9A=E6=AC=A1?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=20(#1448)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/g-gesture/src/gesture.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/g-gesture/src/gesture.ts b/packages/g-gesture/src/gesture.ts index 5e17faee5..222acd78f 100644 --- a/packages/g-gesture/src/gesture.ts +++ b/packages/g-gesture/src/gesture.ts @@ -90,13 +90,14 @@ class Gesture extends EventEmitter { el.ownerDocument?.defaultView.addEventListener('pointermove', this._move); } else { el.isMutationObserved = true; - el.on(ElementEvent.MOUNTED, (e) => + el.on(ElementEvent.MOUNTED, (e) => { + e.stopPropagation(); el.ownerDocument?.defaultView.addEventListener( 'pointermove', // @ts-ignore this._move, - ), - ); + ); + }); } el.addEventListener('pointerdown', this._start); @@ -105,10 +106,11 @@ class Gesture extends EventEmitter { // @ts-ignore el.ownerDocument?.defaultView.addEventListener('pointerup', this._end); } else { - el.on(ElementEvent.MOUNTED, (e) => + el.on(ElementEvent.MOUNTED, (e) => { + e.stopPropagation(); // @ts-ignore - el.ownerDocument?.defaultView.addEventListener('pointerup', this._end), - ); + el.ownerDocument?.defaultView.addEventListener('pointerup', this._end); + }); } el.addEventListener('pointercancel', this._cancel); From 64aa5d22ea4fd81ba20e39eeff3ebff77548d8a0 Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Mon, 31 Jul 2023 19:33:11 +0800 Subject: [PATCH 7/7] chore: commit changeset --- .changeset/late-items-fry.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/late-items-fry.md diff --git a/.changeset/late-items-fry.md b/.changeset/late-items-fry.md new file mode 100644 index 000000000..2cf707601 --- /dev/null +++ b/.changeset/late-items-fry.md @@ -0,0 +1,6 @@ +--- +'@antv/g-plugin-device-renderer': patch +'@antv/g-gesture': patch +--- + +Stop propagation in g-gesture.