From 96b7341a026296570bd7f3a794eff17fd8435394 Mon Sep 17 00:00:00 2001 From: Aaron Date: Tue, 22 Oct 2024 11:32:49 +0800 Subject: [PATCH] fix: fix parsedTransformToMat4 optimizer --- packages/g-lite/src/services/interfaces.ts | 22 ++++++++++++--- packages/g-lite/src/utils/transform-mat4.ts | 27 ++++++++++++++----- .../src/SVGRendererPlugin.ts | 1 - 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/packages/g-lite/src/services/interfaces.ts b/packages/g-lite/src/services/interfaces.ts index 9b0917563..c98be7f69 100644 --- a/packages/g-lite/src/services/interfaces.ts +++ b/packages/g-lite/src/services/interfaces.ts @@ -15,6 +15,7 @@ export interface SceneGraphService { ) => void; informDependentDisplayObjects: (object: DisplayObject) => void; dirtifyToRoot: (element: INode, affectChildren?: boolean) => void; + dirtifyLocal: (element: INode, transform: Transform) => void; matches: (query: string, root: T) => boolean; querySelector: ( query: string, @@ -38,9 +39,17 @@ export interface SceneGraphService { z?: number, ) => void; setPosition: (element: INode, position: vec3 | vec2) => void; - setLocalPosition: (element: INode, position: vec3 | vec2) => void; + setLocalPosition: ( + element: INode, + position: vec3 | vec2, + dirtify?: boolean, + ) => void; scaleLocal: (element: INode, scaling: vec3 | vec2) => void; - setLocalScale: (element: INode, scaling: vec3 | vec2) => void; + setLocalScale: ( + element: INode, + scaling: vec3 | vec2, + dirtify?: boolean, + ) => void; getLocalScale: (element: INode) => vec3; getScale: (element: INode) => vec3; getLocalSkew: (element: INode) => vec2; @@ -58,7 +67,12 @@ export interface SceneGraphService { ) => void; getPosition: (element: INode) => vec3; getLocalPosition: (element: INode) => vec3; - setLocalSkew: (element: INode, skew: vec2 | number, y?: number) => void; + setLocalSkew: ( + element: INode, + skew: vec2 | number, + y?: number, + dirtify?: boolean, + ) => void; setEulerAngles: ( element: INode, degrees: vec3 | number, @@ -70,6 +84,7 @@ export interface SceneGraphService { degrees: vec3 | number, y?: number, z?: number, + dirtify?: boolean, ) => void; rotateLocal: ( element: INode, @@ -97,6 +112,7 @@ export interface SceneGraphService { y?: number, z?: number, w?: number, + dirtify?: boolean, ) => void; getLocalRotation: (element: INode) => quat; getWorldTransform: (element: INode, transform?: Transform) => mat4; diff --git a/packages/g-lite/src/utils/transform-mat4.ts b/packages/g-lite/src/utils/transform-mat4.ts index 361ed8a33..28c5dad82 100644 --- a/packages/g-lite/src/utils/transform-mat4.ts +++ b/packages/g-lite/src/utils/transform-mat4.ts @@ -1,9 +1,10 @@ -import { mat4 } from 'gl-matrix'; +import { mat4, vec3 } from 'gl-matrix'; +import type { CSSUnitValue } from '../css/cssom'; import { ParsedTransform, convertAngleUnit } from '../css/parser'; import type { DisplayObject } from '../display-objects/DisplayObject'; -import { deg2rad } from './math'; -import type { CSSUnitValue } from '../css/cssom'; +import { runtime } from '../global-runtime'; import type { TransformType } from '../types'; +import { deg2rad } from './math'; function createSkewMatrix(skewMatrix: mat4, skewX: number, skewY: number) { // Create an identity matrix @@ -93,14 +94,26 @@ const parser: Record void> = { }, }; +const $vec3One = vec3.fromValues(1, 1, 1); +const $vec3Zero = vec3.create(); const optimizer: { [key in TransformType]?: (object: DisplayObject, d: CSSUnitValue[]) => void; } = { translate: (object: DisplayObject, d: CSSUnitValue[]) => { - object.setLocalPosition([d[0].value, d[1].value]); - }, - translate3d: (object: DisplayObject, d: CSSUnitValue[]) => { - object.setLocalPosition([d[0].value, d[1].value, d[2].value]); + runtime.sceneGraphService.setLocalScale(object, $vec3One, false); + runtime.sceneGraphService.setLocalEulerAngles( + object, + $vec3Zero, + undefined, + undefined, + false, + ); + runtime.sceneGraphService.setLocalPosition( + object, + [d[0].value, d[1].value, 0], + false, + ); + runtime.sceneGraphService.dirtifyLocal(object, object.transformable); }, }; diff --git a/packages/g-plugin-svg-renderer/src/SVGRendererPlugin.ts b/packages/g-plugin-svg-renderer/src/SVGRendererPlugin.ts index 549415ff2..c4c0d4aac 100644 --- a/packages/g-plugin-svg-renderer/src/SVGRendererPlugin.ts +++ b/packages/g-plugin-svg-renderer/src/SVGRendererPlugin.ts @@ -363,7 +363,6 @@ export class SVGRendererPlugin implements RenderingPlugin { this.applyTransform(this.$camera, this.context.camera.getOrthoMatrix()); } - // debugger; this.renderQueue.forEach((object) => { const $el = ((object as any).elementSVG as ElementSVG)?.$el; const $groupEl = ((object as any).elementSVG as ElementSVG)?.$groupEl;