Skip to content

Commit 2a14752

Browse files
dakerfinetjul
authored andcommitted
feat(vtkProperty): add vtkProperty edgeOpacity
fixes: #3461
1 parent a777d91 commit 2a14752

4 files changed

Lines changed: 42 additions & 7 deletions

File tree

Sources/Rendering/Core/Property/index.d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface IPropertyInitialValues {
1717
RMTexture?: vtkTexture;
1818
ORMTexture?: vtkTexture;
1919
edgeColor?: RGBColor;
20+
edgeOpacity?: number;
2021
ambient?: number;
2122
diffuse?: number;
2223
metallic?: number;
@@ -103,6 +104,11 @@ export interface vtkProperty extends vtkObject {
103104
*/
104105
getEdgeColorByReference(): RGBColor;
105106

107+
/**
108+
*
109+
*/
110+
getEdgeOpacity(): number;
111+
106112
/**
107113
*
108114
*/
@@ -360,6 +366,13 @@ export interface vtkProperty extends vtkObject {
360366
*/
361367
setEdgeColorFrom(edgeColor: RGBColor): boolean;
362368

369+
/**
370+
* Set the opacity of primitive edges. If not set explicitly, edge opacity
371+
* follows the regular property opacity.
372+
* @param {Number} edgeOpacity The opacity of primitive edges.
373+
*/
374+
setEdgeOpacity(edgeOpacity: number): boolean;
375+
363376
/**
364377
* Turn on/off the visibility of edges. On some renderers it is
365378
* possible to render the edges of geometric primitives separately

Sources/Rendering/Core/Property/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ const DEFAULT_VALUES = {
116116
specular: 0,
117117
specularPower: 1,
118118
opacity: 1,
119+
edgeOpacity: 1,
119120
interpolation: Interpolation.GOURAUD,
120121
representation: Representation.SURFACE,
121122
edgeVisibility: false,
@@ -153,6 +154,7 @@ export function extend(publicAPI, model, initialValues = {}) {
153154
'specular',
154155
'specularPower',
155156
'opacity',
157+
'edgeOpacity',
156158
'edgeVisibility',
157159
'lineWidth',
158160
'pointSize',

Sources/Rendering/OpenGL/PolyDataMapper/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1529,7 +1529,12 @@ function vtkOpenGLPolyDataMapper(publicAPI, model) {
15291529

15301530
let ppty = actor.getProperty();
15311531

1532-
let opacity = ppty.getOpacity();
1532+
const edgeLikeRepresentation =
1533+
model.drawingEdges ||
1534+
ppty.getRepresentation() === Representation.WIREFRAME;
1535+
let opacity = edgeLikeRepresentation
1536+
? ppty.getEdgeOpacity()
1537+
: ppty.getOpacity();
15331538

15341539
let aColor = model.drawingEdges
15351540
? ppty.getEdgeColorByReference()

Sources/Rendering/WebGPU/CellArrayMapper/index.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,14 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
543543
const edgeColor = ppty.getEdgeColorByReference?.();
544544
if (edgeColor) model.UBO.setArray('EdgeColor', [...edgeColor, 1.0]);
545545
model.UBO.setValue('LineWidth', ppty.getLineWidth());
546-
model.UBO.setValue('Opacity', ppty.getOpacity());
546+
const edgeLikeRepresentation =
547+
model.primitiveType === PrimitiveTypes.TriangleEdges ||
548+
model.primitiveType === PrimitiveTypes.TriangleStripEdges ||
549+
ppty.getRepresentation() === Representation.WIREFRAME;
550+
model.UBO.setValue(
551+
'Opacity',
552+
edgeLikeRepresentation ? ppty.getEdgeOpacity() : ppty.getOpacity()
553+
);
547554
model.UBO.setValue('PropID', model.WebGPUActor.getPropID());
548555
const cp = publicAPI.getCoincidentParameters();
549556
model.UBO.setValue('CoincidentFactor', cp.factor);
@@ -825,13 +832,14 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
825832
let code = fDesc.getCode();
826833

827834
// Code that runs if the fragment shader includes normals
828-
if (
829-
code.includes('var normal:') &&
835+
const hasNormal = code.includes('var normal:');
836+
const needLighting =
837+
hasNormal &&
830838
model.useRendererMatrix &&
831839
!isEdges(hash) &&
832840
!model.is2D &&
833-
!hash.includes('sel')
834-
) {
841+
!hash.includes('sel');
842+
if (needLighting) {
835843
const lightingCode = [
836844
// Vectors needed for light calculations
837845
' let fragPos = vec3<f32>(input.vertexVC.xyz);',
@@ -1236,9 +1244,16 @@ function vtkWebGPUCellArrayMapper(publicAPI, model) {
12361244
// --- Normals ---
12371245
const usage = publicAPI.getUsage(representation, primType);
12381246
model._usesCellNormals = false;
1247+
// Add normals for triangles/strips, AND for lines in wireframe mode (converted from triangles)
1248+
const isWireframeFromTriangles =
1249+
representation === Representation.WIREFRAME &&
1250+
(primType === PrimitiveTypes.Triangles ||
1251+
primType === PrimitiveTypes.TriangleStrips);
12391252
if (
12401253
!model.is2D && // no lighting on Property2D
1241-
(usage === BufferUsage.Triangles || usage === BufferUsage.Strips)
1254+
(usage === BufferUsage.Triangles ||
1255+
usage === BufferUsage.Strips ||
1256+
isWireframeFromTriangles)
12421257
) {
12431258
const normals = pd.getPointData().getNormals();
12441259
// https://vtk.org/doc/nightly/html/classvtkPolyDataTangents.html

0 commit comments

Comments
 (0)