From 3fde213df59accb819a404b40ca1690f82a83620 Mon Sep 17 00:00:00 2001 From: Alexandru Popovici Date: Fri, 8 Aug 2025 16:56:06 +0300 Subject: [PATCH 1/2] chore(viewer-lib): Empty chunks will no longer trigger error logs. overwriting material proxie will trigger warning not error logs (#5198) --- packages/viewer-sandbox/src/main.ts | 2 ++ .../src/modules/loaders/Speckle/SpeckleConverter.ts | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index 2503955fe..e40cfdbda 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -625,6 +625,8 @@ const getStream = () => { // Text with color proxy // 'https://app.speckle.systems/projects/ebf93a561b/models/0a07bc3231' + // Sum building + // 'https://app.speckle.systems/projects/a2b933a867/models/5b6b6e9360' // 'https://latest.speckle.systems/projects/9f13b874cf/models/0575b5dcd2' // Circles of different sizes diff --git a/packages/viewer/src/modules/loaders/Speckle/SpeckleConverter.ts b/packages/viewer/src/modules/loaders/Speckle/SpeckleConverter.ts index 83c4e19f2..2ace0768f 100644 --- a/packages/viewer/src/modules/loaders/Speckle/SpeckleConverter.ts +++ b/packages/viewer/src/modules/loaders/Speckle/SpeckleConverter.ts @@ -319,9 +319,12 @@ export default class SpeckleConverter { } else { real.references++ } - if (typeof real.data[0] !== 'number' || isNaN(real.data[0])) { + if ( + real.data.length && + (typeof real.data[0] !== 'number' || isNaN(real.data[0])) + ) { Logger.error( - `Chunk id ${real.id} used for mesh ${ref.referencedId} might not have numeric geometry data. This is not supported!` + `Chunk id ${real.id} might not have numeric geometry data. This is not supported!` ) } chunked.push(real) @@ -620,7 +623,7 @@ export default class SpeckleConverter { const targetObjects = obj.objects as [] for (let k = 0; k < targetObjects.length; k++) { if (this.renderMaterialMap[targetObjects[k]]) { - Logger.error(`Overwritting renderMaterial ${targetObjects[k]}`) + Logger.warn(`Overwritting renderMaterial ${targetObjects[k]}`) } this.renderMaterialMap[targetObjects[k]] = renderMaterialValue } @@ -638,7 +641,7 @@ export default class SpeckleConverter { const targetObjects = obj.objects as [] for (let k = 0; k < targetObjects.length; k++) { if (this.colorMap[targetObjects[k]]) { - Logger.error(`Overwritting color ${targetObjects[k]}`) + Logger.warn(`Overwritting color ${targetObjects[k]}`) } this.colorMap[targetObjects[k]] = obj } From 9b18a2364c5e326f51d478a6238f8656544b50ac Mon Sep 17 00:00:00 2001 From: Alexandru Popovici Date: Fri, 8 Aug 2025 16:56:53 +0300 Subject: [PATCH 2/2] fix(viewer-lib): Two things: (#5201) - Fixed an age old issue where transparent mesh batch ranges were incorrectly reported - Diff materials now have their visible flag reset to false when opacity is 0 and set when otherwise, so that they are not picked up by the edges pipeine in the transparent edges generation pass --- .../modules/batching/InstancedMeshBatch.ts | 2 +- .../src/modules/batching/PrimitiveBatch.ts | 2 +- .../viewer/src/modules/batching/TextBatch.ts | 7 +++++++ .../src/modules/extensions/DiffExtension.ts | 20 +++++++++++++++++-- .../pipeline/Pipelines/EdgesPipeline.ts | 3 ++- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/viewer/src/modules/batching/InstancedMeshBatch.ts b/packages/viewer/src/modules/batching/InstancedMeshBatch.ts index 0dcdd2c3a..1f0de3a0c 100644 --- a/packages/viewer/src/modules/batching/InstancedMeshBatch.ts +++ b/packages/viewer/src/modules/batching/InstancedMeshBatch.ts @@ -233,7 +233,7 @@ export class InstancedMeshBatch implements Batch { const offset = transparentGroup.start const count = hiddenGroup !== undefined - ? hiddenGroup.start + ? hiddenGroup.start - transparentGroup.start : this.getCount() - transparentGroup.start if (offset === 0 && count === this.getCount()) return AllBatchUpdateRange return { diff --git a/packages/viewer/src/modules/batching/PrimitiveBatch.ts b/packages/viewer/src/modules/batching/PrimitiveBatch.ts index 397cd1f7d..6e179f1be 100644 --- a/packages/viewer/src/modules/batching/PrimitiveBatch.ts +++ b/packages/viewer/src/modules/batching/PrimitiveBatch.ts @@ -184,7 +184,7 @@ export abstract class PrimitiveBatch implements Batch { offset: transparentGroup.start, count: hiddenGroup !== undefined - ? hiddenGroup.start + ? hiddenGroup.start - transparentGroup.start : this.getCount() - transparentGroup.start } } diff --git a/packages/viewer/src/modules/batching/TextBatch.ts b/packages/viewer/src/modules/batching/TextBatch.ts index e9e391a71..4e836c7ea 100644 --- a/packages/viewer/src/modules/batching/TextBatch.ts +++ b/packages/viewer/src/modules/batching/TextBatch.ts @@ -119,17 +119,24 @@ export default class TextBatch implements Batch { return AllBatchUpdateRange } + /** TODO: Need to give this a glow up */ public getOpaque(): BatchUpdateRange { if (Materials.isOpaque(this.batchMaterial)) return AllBatchUpdateRange return NoneBatchUpdateRange } + + /** TODO: Need to give this a glow up */ public getDepth(): BatchUpdateRange { return this.getOpaque() } + + /** TODO: Need to give this a glow up */ public getTransparent(): BatchUpdateRange { if (Materials.isTransparent(this.batchMaterial)) return AllBatchUpdateRange return NoneBatchUpdateRange } + + /** TODO: Need to give this a glow up */ public getStencil(): BatchUpdateRange { if (this.batchMaterial.stencilWrite === true) return AllBatchUpdateRange return NoneBatchUpdateRange diff --git a/packages/viewer/src/modules/extensions/DiffExtension.ts b/packages/viewer/src/modules/extensions/DiffExtension.ts index b168e8c8b..86d6e5fa0 100644 --- a/packages/viewer/src/modules/extensions/DiffExtension.ts +++ b/packages/viewer/src/modules/extensions/DiffExtension.ts @@ -7,7 +7,7 @@ import SpeckleLineMaterial from '../materials/SpeckleLineMaterial.js' import SpecklePointMaterial from '../materials/SpecklePointMaterial.js' import SpeckleStandardMaterial from '../materials/SpeckleStandardMaterial.js' import { NodeRenderView } from '../tree/NodeRenderView.js' -import { type IViewer } from '../../IViewer.js' +import { UpdateFlags, type IViewer } from '../../IViewer.js' import { Extension } from './Extension.js' import { SpeckleTypeAllRenderables } from '../loaders/GeometryConverter.js' import { SpeckleLoader } from '../loaders/Speckle/SpeckleLoader.js' @@ -369,7 +369,15 @@ export class DiffExtension extends Extension { this._diffMode = mode } } + + let needsRenderReset = false if (time !== undefined && time !== this._diffTime) { + /** We only want to do a reset at the edges of the time value + * because that's where materials become to/from visible from/to visible + */ + needsRenderReset = + (this._diffTime === 0) !== (time === 0) || + (this._diffTime === 1) !== (time === 1) this.setDiffTime(time) this._diffTime = time } @@ -378,7 +386,11 @@ export class DiffExtension extends Extension { this._materialGroups.forEach((value) => { this.viewer.getRenderer().setMaterial(value.rvs, value.material) }) - this.viewer.requestRender() + this.viewer.requestRender( + needsRenderReset + ? UpdateFlags.RENDER_RESET | UpdateFlags.SHADOWS + : UpdateFlags.RENDER + ) } private setDiffTime(time: number) { @@ -392,6 +404,7 @@ export class DiffExtension extends Extension { : from mat.depthWrite = from < 0.5 ? false : true mat.transparent = mat.opacity < 1 + mat.visible = mat.opacity === 0 ? false : true mat.needsCopy = true }) @@ -402,6 +415,7 @@ export class DiffExtension extends Extension { : to mat.depthWrite = to < 0.5 ? false : true mat.transparent = mat.opacity < 1 + mat.visible = mat.opacity === 0 ? false : true mat.needsCopy = true }) @@ -412,6 +426,7 @@ export class DiffExtension extends Extension { : from mat.depthWrite = from < 0.5 ? false : true mat.transparent = mat.opacity < 1 + mat.visible = mat.opacity === 0 ? false : true mat.needsCopy = true }) @@ -422,6 +437,7 @@ export class DiffExtension extends Extension { : to mat.depthWrite = to < 0.5 ? false : true mat.transparent = mat.opacity < 1 + mat.visible = mat.opacity === 0 ? false : true mat.needsCopy = true }) } diff --git a/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts b/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts index c0631d84e..11f42b059 100644 --- a/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts +++ b/packages/viewer/src/modules/pipeline/Pipelines/EdgesPipeline.ts @@ -67,6 +67,7 @@ export class EdgesPipeline extends ProgressivePipeline { const material = batch.materials[value.materialIndex] return ( Materials.isTransparent(material) && + material.visible && !(material instanceof SpeckleGhostMaterial) ) }) @@ -81,7 +82,7 @@ export class EdgesPipeline extends ProgressivePipeline { offset: transparentGroup.start, count: hiddenGroup !== undefined - ? hiddenGroup.start + ? hiddenGroup.start - transparentGroup.start : batch.getCount() - transparentGroup.start } continue