From bba2d65488234999fe483673fa1c79709cbf8762 Mon Sep 17 00:00:00 2001 From: bingliu Date: Thu, 16 Oct 2025 10:24:57 +0800 Subject: [PATCH] =?UTF-8?q?GLTFMarker.setUniform=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=B9nodexIndex=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/layer-gltf/src/GLTFMarker.js | 12 ++++++++++-- packages/layer-gltf/test/FixBugSpec.js | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/layer-gltf/src/GLTFMarker.js b/packages/layer-gltf/src/GLTFMarker.js index ae055c2c79..e7752cc7d0 100644 --- a/packages/layer-gltf/src/GLTFMarker.js +++ b/packages/layer-gltf/src/GLTFMarker.js @@ -317,7 +317,13 @@ export default class GLTFMarker extends Marker { //此处涉及到材质的更新,比较耗费性能,对于不需要更新材质的操作尽量不去更新 if (markerUniforms && this.isDirty() && this._isUniformsDirty()) { for (const u in markerUniforms) { - mesh.setUniform(u, markerUniforms[u]); + if (this._uniformNodeIndex && defined(this._uniformNodeIndex[u])) { + if (Number(mesh.properties.nodeIndex) === this._uniformNodeIndex[u]) { + mesh.setUniform(u, markerUniforms[u]); + } + } else { + mesh.setUniform(u, markerUniforms[u]); + } } } if (this._isTransparent()) { @@ -1136,11 +1142,13 @@ export default class GLTFMarker extends Marker { return symbol && symbol.uniforms; } - setUniform(key, value) { + setUniform(key, value, nodeIndex) { const uniforms = this.getUniforms() || {}; uniforms[key] = value; super.updateSymbol({ uniforms }); this._uniformDirty = true; + this._uniformNodeIndex = this._uniformNodeIndex || {}; + this._uniformNodeIndex[key] = nodeIndex; return this; } diff --git a/packages/layer-gltf/test/FixBugSpec.js b/packages/layer-gltf/test/FixBugSpec.js index f4f123a3a6..e6c622ebed 100644 --- a/packages/layer-gltf/test/FixBugSpec.js +++ b/packages/layer-gltf/test/FixBugSpec.js @@ -2068,4 +2068,29 @@ describe('bug', () => { const vLayer = new maptalks.VectorLayer('v', { enableAltitude: true }).addTo(map); new maptalks.Marker([0, 0, 100]).addTo(vLayer); }); + + it('set uniform for specific nodeIndex(#issues/886)', done => { + const gltflayer = new maptalks.GLTFLayer('gltf'); + const marker = new maptalks.GLTFGeometry(center, { + symbol: { + scaleX: 50, + scaleY: 50, + scaleZ: 50, + url: url2, + uniforms: { + polygonFill: [1, 1, 1, 1], + polygonOpacity: 1 + } + } + }).addTo(gltflayer); + marker.on('load', () => { + marker.setUniform('polygonFill', [1, 0, 0, 1], 1); + setTimeout(function() { + const pixel = pickPixel(map, map.width / 2, map.height / 2, 1, 1); + expect(pixelMatch([168, 3, 3, 255], pixel)).to.be.eql(true); + done(); + }, 100); + }); + new maptalks.GroupGLLayer('gl', [gltflayer], { sceneConfig }).addTo(map); + }); });