Skip to content

Class: MorphableSurface

Defined in: src/MorphableSurface.ts:84

A multi-layer surface with GPU-accelerated morph target support.

Enables smooth animated transitions between different surface representations (e.g., pial, inflated, flat, sphere) using Three.js morphTargets for GPU-accelerated interpolation with proper normal blending.

Example

typescript
// Create from SurfaceSet with multiple variants
const surface = MorphableSurface.fromSurfaceSet(surfaceSet, {
  baseColor: 0xcccccc
});

// Animate to inflated view
surface.morphTo('inflated', { duration: 500 });

// Set morph weight directly (0 = base, 1 = target)
surface.setMorphWeight('inflated', 0.5);

// Blend between multiple targets
surface.setMorphWeights({ inflated: 0.3, flat: 0.7 });

Extends

Constructors

Constructor

ts
new MorphableSurface(geometry, config?): MorphableSurface;

Defined in: src/MorphableSurface.ts:103

Parameters

geometry

SurfaceGeometry

config?

MorphableSurfaceConfig = {}

Returns

MorphableSurface

Overrides

MultiLayerNeuroSurface.constructor

Properties

layerStack

ts
layerStack: LayerStack;

Defined in: src/MultiLayerNeuroSurface.ts:137

Inherited from

MultiLayerNeuroSurface.layerStack


compositeBuffer

ts
compositeBuffer: Float32Array;

Defined in: src/MultiLayerNeuroSurface.ts:138

Inherited from

MultiLayerNeuroSurface.compositeBuffer


vertexCount

ts
vertexCount: number;

Defined in: src/MultiLayerNeuroSurface.ts:139

Inherited from

MultiLayerNeuroSurface.vertexCount


clipPlanes

ts
readonly clipPlanes: ClipPlaneSet;

Defined in: src/MultiLayerNeuroSurface.ts:147

Clip plane set for surface clipping

Inherited from

MultiLayerNeuroSurface.clipPlanes


geometry

ts
geometry: SurfaceGeometry;

Defined in: src/classes.ts:263

Inherited from

MultiLayerNeuroSurface.geometry


indices

ts
indices: Uint32Array;

Defined in: src/classes.ts:264

Inherited from

MultiLayerNeuroSurface.indices


data

ts
data: Float32Array;

Defined in: src/classes.ts:265

Inherited from

MultiLayerNeuroSurface.data


vertexCurv

ts
vertexCurv: Float32Array<ArrayBufferLike> | null;

Defined in: src/classes.ts:266

Inherited from

MultiLayerNeuroSurface.vertexCurv


mesh

ts
mesh: 
  | Mesh<BufferGeometry<NormalBufferAttributes, BufferGeometryEventMap>, Material | Material[], Object3DEventMap>
  | null;

Defined in: src/classes.ts:267

Inherited from

MultiLayerNeuroSurface.mesh


threshold

ts
threshold: [number, number];

Defined in: src/classes.ts:268

Inherited from

MultiLayerNeuroSurface.threshold


irange

ts
irange: [number, number];

Defined in: src/classes.ts:269

Inherited from

MultiLayerNeuroSurface.irange


hemisphere

ts
hemisphere: string;

Defined in: src/classes.ts:270

Inherited from

MultiLayerNeuroSurface.hemisphere


config

ts
config: Required<SurfaceConfig>;

Defined in: src/classes.ts:271

Inherited from

MultiLayerNeuroSurface.config


viewer?

ts
optional viewer?: any;

Defined in: src/classes.ts:272

Inherited from

MultiLayerNeuroSurface.viewer

Methods

on()

ts
on(event, listener): UnsubscribeFn;

Defined in: src/EventEmitter.ts:12

Parameters

event

string

listener

EventListener

Returns

UnsubscribeFn

Inherited from

MultiLayerNeuroSurface.on


once()

ts
once(event, listener): UnsubscribeFn;

Defined in: src/EventEmitter.ts:23

Parameters

event

string

listener

EventListener

Returns

UnsubscribeFn

Inherited from

MultiLayerNeuroSurface.once


emit()

ts
emit(event, ...args): void;

Defined in: src/EventEmitter.ts:34

Parameters

event

string

args

...any[]

Returns

void

Inherited from

MultiLayerNeuroSurface.emit


removeListener()

ts
removeListener(event, listenerToRemove): void;

Defined in: src/EventEmitter.ts:41

Parameters

event

string

listenerToRemove

EventListener

Returns

void

Inherited from

MultiLayerNeuroSurface.removeListener


removeAllListeners()

ts
removeAllListeners(event?): void;

Defined in: src/EventEmitter.ts:52

Parameters

event?

string

Returns

void

Inherited from

MultiLayerNeuroSurface.removeAllListeners


off()

ts
off(event, listener): void;

Defined in: src/EventEmitter.ts:61

Parameters

event

string

listener

EventListener

Returns

void

Inherited from

MultiLayerNeuroSurface.off


fromSurfaceSet()

ts
static fromSurfaceSet(surfaceSet, config?): MorphableSurface;

Defined in: src/MorphableSurface.ts:141

Create a MorphableSurface from a SurfaceSet with multiple variants. Each variant becomes a morph target.

Parameters

surfaceSet

SurfaceSet

config?

MorphableSurfaceConfig = {}

Returns

MorphableSurface


addMorphTarget()

ts
addMorphTarget(
   name, 
   positions, 
   curvature?): void;

Defined in: src/MorphableSurface.ts:179

Add a morph target with the given name and positions.

Parameters

name

string

Unique name for this morph target

positions

Float32Array<ArrayBufferLike> | number[]

Vertex positions (must match base geometry vertex count)

curvature?

Float32Array<ArrayBufferLike> | number[]

Optional curvature data for this morph target

Returns

void


removeMorphTarget()

ts
removeMorphTarget(name): boolean;

Defined in: src/MorphableSurface.ts:244

Remove a morph target by name.

Parameters

name

string

Returns

boolean


getMorphTargetNames()

ts
getMorphTargetNames(): string[];

Defined in: src/MorphableSurface.ts:283

Get the list of available morph target names.

Returns

string[]


hasMorphTarget()

ts
hasMorphTarget(name): boolean;

Defined in: src/MorphableSurface.ts:290

Check if a morph target exists.

Parameters

name

string

Returns

boolean


getMorphWeight()

ts
getMorphWeight(name): number;

Defined in: src/MorphableSurface.ts:297

Get the current weight of a morph target.

Parameters

name

string

Returns

number


getMorphWeights()

ts
getMorphWeights(): Record<string, number>;

Defined in: src/MorphableSurface.ts:309

Get all current morph weights as a dictionary.

Returns

Record<string, number>


setMorphWeight()

ts
setMorphWeight(name, weight): void;

Defined in: src/MorphableSurface.ts:323

Set the weight of a single morph target (0 = base, 1 = full morph).

Parameters

name

string

Morph target name

weight

number

Weight value (typically 0-1, but can exceed for exaggeration)

Returns

void


setMorphWeights()

ts
setMorphWeights(weights): void;

Defined in: src/MorphableSurface.ts:342

Set multiple morph weights at once.

Parameters

weights

Record<string, number>

Dictionary of target name to weight

Returns

void


resetMorphWeights()

ts
resetMorphWeights(): void;

Defined in: src/MorphableSurface.ts:356

Reset all morph weights to 0 (return to base geometry).

Returns

void


morphTo()

ts
morphTo(targetName, options?): Promise<void>;

Defined in: src/MorphableSurface.ts:373

Animate morph to a specific target.

Parameters

targetName

string

Name of the morph target to animate to

options?

MorphAnimationOptions = {}

Animation options

Returns

Promise<void>

Promise that resolves when animation completes


morphToBase()

ts
morphToBase(options?): Promise<void>;

Defined in: src/MorphableSurface.ts:438

Animate morph from current state back to base geometry (all weights = 0).

Parameters

options?

MorphAnimationOptions = {}

Returns

Promise<void>


morphToWeights()

ts
morphToWeights(targetWeights, options?): Promise<void>;

Defined in: src/MorphableSurface.ts:494

Animate a smooth blend between multiple targets.

Parameters

targetWeights

Record<string, number>

Dictionary of target names to their final weights

options?

MorphAnimationOptions = {}

Animation options

Returns

Promise<void>


cancelAnimation()

ts
cancelAnimation(): void;

Defined in: src/MorphableSurface.ts:554

Cancel any running morph animation.

Returns

void


isAnimating()

ts
isAnimating(): boolean;

Defined in: src/MorphableSurface.ts:565

Check if an animation is currently running.

Returns

boolean


getMorphValue()

ts
getMorphValue(): number;

Defined in: src/MorphableSurface.ts:573

Get a normalized morph value (0 = base, 1 = first target, 2 = second target, etc.) that can be used with a slider for sequential morphing through targets.

Returns

number


setMorphValue()

ts
setMorphValue(value): void;

Defined in: src/MorphableSurface.ts:592

Set morph using a normalized value (0 = base, 1 = first target, 2 = second target, etc.) Useful for slider-based sequential morphing.

Parameters

value

number

Normalized morph value

Returns

void


getInterpolatedCurvature()

ts
getInterpolatedCurvature(): Float32Array<ArrayBufferLike> | null;

Defined in: src/MorphableSurface.ts:633

Get curvature data for the current morph state (interpolated if blending). Returns null if no curvature data is available.

Returns

Float32Array<ArrayBufferLike> | null


dispose()

ts
dispose(): void;

Defined in: src/MorphableSurface.ts:676

Dispose of all resources

Returns

void

Overrides

MultiLayerNeuroSurface.dispose


toggleWireframe()

ts
toggleWireframe(enabled): void;

Defined in: src/MultiLayerNeuroSurface.ts:216

Toggle a simple edge wireframe for debugging/presentation. Creates if missing.

Parameters

enabled

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.toggleWireframe


updateOutlineResolution()

ts
updateOutlineResolution(
   width, 
   height, 
   dpr?): void;

Defined in: src/MultiLayerNeuroSurface.ts:430

Parameters

width

number

height

number

dpr?

number = 1

Returns

void

Inherited from

MultiLayerNeuroSurface.updateOutlineResolution


requestColorUpdate()

ts
requestColorUpdate(): void;

Defined in: src/MultiLayerNeuroSurface.ts:447

Request a color update (throttled)

Returns

void

Inherited from

MultiLayerNeuroSurface.requestColorUpdate


addLayer()

ts
addLayer(layer): void;

Defined in: src/MultiLayerNeuroSurface.ts:462

Add a layer to the surface

Parameters

layer

Layer

Returns

void

Inherited from

MultiLayerNeuroSurface.addLayer


addTwoDataLayer()

ts
addTwoDataLayer(
   id, 
   dataX, 
   dataY, 
   colorMap?, 
   config?): TwoDataLayer;

Defined in: src/MultiLayerNeuroSurface.ts:512

Add a 2D data layer that maps two scalar fields to a 2D colormap.

This is a convenience method for creating TwoDataLayer instances.

Parameters

id

string

Layer identifier

dataX

Float32Array<ArrayBufferLike> | number[]

First scalar field (X axis of colormap)

dataY

Float32Array<ArrayBufferLike> | number[]

Second scalar field (Y axis of colormap)

colorMap?

ColorMap2D | ColorMap2DPreset

2D colormap preset name or ColorMap2D instance

config?

TwoDataLayerConfig = {}

Layer configuration options

Returns

TwoDataLayer

Example

typescript
// Visualize effect size vs. confidence
surface.addTwoDataLayer(
  'effect-confidence',
  effectSizeData,
  confidenceData,
  'confidence',
  {
    rangeX: [-2, 2],
    rangeY: [0, 1],
    thresholdY: [0, 0.05]  // Hide low-confidence values
  }
);

Inherited from

MultiLayerNeuroSurface.addTwoDataLayer


addParcelValueLayer()

ts
addParcelValueLayer(
   id, 
   parcelData, 
   vertexLabels, 
   colorMap?, 
   config?): ParcelValueLayer;

Defined in: src/MultiLayerNeuroSurface.ts:530

Add a parcel-native value layer.

Parcel values are expanded to vertices using the provided per-vertex parcel labels.

Parameters

id

string

parcelData

ParcelData

vertexLabels

| Uint32Array<ArrayBufferLike> | Int32Array<ArrayBufferLike> | number[]

colorMap?

string = 'viridis'

config?

ParcelValueLayerConfig = {}

Returns

ParcelValueLayer

Inherited from

MultiLayerNeuroSurface.addParcelValueLayer


getTwoDataLayer()

ts
getTwoDataLayer(id): TwoDataLayer | undefined;

Defined in: src/MultiLayerNeuroSurface.ts:545

Get a TwoDataLayer by ID (type-safe convenience method)

Parameters

id

string

Returns

TwoDataLayer | undefined

Inherited from

MultiLayerNeuroSurface.getTwoDataLayer


removeLayer()

ts
removeLayer(id): boolean;

Defined in: src/MultiLayerNeuroSurface.ts:553

Remove a layer by ID

Parameters

id

string

Returns

boolean

Inherited from

MultiLayerNeuroSurface.removeLayer


clearLayers()

ts
clearLayers(options?): void;

Defined in: src/MultiLayerNeuroSurface.ts:581

Remove all non-base layers (optionally including base).

Parameters

options?

ClearLayersOptions = {}

Returns

void

Inherited from

MultiLayerNeuroSurface.clearLayers


updateLayer()

ts
updateLayer(id, updates): void;

Defined in: src/MultiLayerNeuroSurface.ts:596

Update a layer's properties

Parameters

id

string

updates

Record<string, any>

Returns

void

Inherited from

MultiLayerNeuroSurface.updateLayer


updateLayerData()

ts
updateLayerData(
   id, 
   data, 
   indices?): void;

Defined in: src/MultiLayerNeuroSurface.ts:607

Parameters

id

string

data

Float32Array<ArrayBufferLike> | number[]

indices?

Uint32Array<ArrayBufferLike> | number[] | null

Returns

void

Inherited from

MultiLayerNeuroSurface.updateLayerData


updateLayerVisibility()

ts
updateLayerVisibility(id, visible): void;

Defined in: src/MultiLayerNeuroSurface.ts:611

Parameters

id

string

visible

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.updateLayerVisibility


getLayer()

ts
getLayer(id): Layer | undefined;

Defined in: src/MultiLayerNeuroSurface.ts:618

Get a layer by ID

Parameters

id

string

Returns

Layer | undefined

Inherited from

MultiLayerNeuroSurface.getLayer


setCurvature()

ts
setCurvature(curvature, options?): void;

Defined in: src/MultiLayerNeuroSurface.ts:629

Set curvature data for display as underlay. Creates curvature layer if it doesn't exist.

Parameters

curvature

Float32Array<ArrayBufferLike> | number[]

Curvature values per vertex

options?

Display options (brightness, contrast, smoothness)

brightness?

number

contrast?

number

smoothness?

number

Returns

void

Inherited from

MultiLayerNeuroSurface.setCurvature


getCurvatureLayer()

ts
getCurvatureLayer(): CurvatureLayer | undefined;

Defined in: src/MultiLayerNeuroSurface.ts:654

Get the curvature layer if it exists

Returns

CurvatureLayer | undefined

Inherited from

MultiLayerNeuroSurface.getCurvatureLayer


showCurvature()

ts
showCurvature(visible): void;

Defined in: src/MultiLayerNeuroSurface.ts:664

Toggle curvature visibility. When curvature is shown, the base layer is hidden (curvature acts as the underlay). When curvature is hidden, the base layer is shown.

Parameters

visible

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.showCurvature


setClipPlane()

ts
setClipPlane(
   axis, 
   distance, 
   enabled?, 
   flip?): void;

Defined in: src/MultiLayerNeuroSurface.ts:700

Set a clip plane by axis.

Parameters

axis

ClipAxis

Which axis to clip ('x', 'y', or 'z')

distance

number

Distance from origin along axis

enabled?

boolean = true

Whether to enable (default: true)

flip?

boolean = false

Flip clipping direction (default: false)

Returns

void

Example

ts
// Clip at x=0 (midline sagittal cut)
surface.setClipPlane('x', 0);

// Clip right hemisphere only
surface.setClipPlane('x', 0, true, true);

Inherited from

MultiLayerNeuroSurface.setClipPlane


enableClipPlane()

ts
enableClipPlane(axis): void;

Defined in: src/MultiLayerNeuroSurface.ts:714

Enable a clip plane.

Parameters

axis

ClipAxis

Returns

void

Inherited from

MultiLayerNeuroSurface.enableClipPlane


disableClipPlane()

ts
disableClipPlane(axis): void;

Defined in: src/MultiLayerNeuroSurface.ts:723

Disable a clip plane.

Parameters

axis

ClipAxis

Returns

void

Inherited from

MultiLayerNeuroSurface.disableClipPlane


clearClipPlanes()

ts
clearClipPlanes(): void;

Defined in: src/MultiLayerNeuroSurface.ts:732

Clear all clip planes (disable all).

Returns

void

Inherited from

MultiLayerNeuroSurface.clearClipPlanes


getClipPlane()

ts
getClipPlane(axis): ClipPlane;

Defined in: src/MultiLayerNeuroSurface.ts:741

Get a clip plane by axis.

Parameters

axis

ClipAxis

Returns

ClipPlane

Inherited from

MultiLayerNeuroSurface.getClipPlane


setLayerOrder()

ts
setLayerOrder(ids): void;

Defined in: src/MultiLayerNeuroSurface.ts:781

Set the order of layers (bottom to top)

Parameters

ids

string[]

Returns

void

Inherited from

MultiLayerNeuroSurface.setLayerOrder


updateLayers()

ts
updateLayers(updates): void;

Defined in: src/MultiLayerNeuroSurface.ts:789

Batch update multiple layers

Parameters

updates

LayerUpdate[]

Returns

void

Inherited from

MultiLayerNeuroSurface.updateLayers


updateColors()

ts
updateColors(): void;

Defined in: src/MultiLayerNeuroSurface.ts:965

Composite all layers and update mesh colors

Returns

void

Inherited from

MultiLayerNeuroSurface.updateColors


createMesh()

ts
createMesh(): Mesh;

Defined in: src/MultiLayerNeuroSurface.ts:1233

Create mesh with proper material settings

Returns

Mesh

Inherited from

MultiLayerNeuroSurface.createMesh


setCompositingMode()

ts
setCompositingMode(useGPU): void;

Defined in: src/MultiLayerNeuroSurface.ts:1280

Switch compositing mode between CPU and GPU

Parameters

useGPU

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.setCompositingMode


setWideLines()

ts
setWideLines(useWide): void;

Defined in: src/MultiLayerNeuroSurface.ts:1338

Parameters

useWide

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.setWideLines


getCompositingMode()

ts
getCompositingMode(): "CPU" | "GPU";

Defined in: src/MultiLayerNeuroSurface.ts:1355

Get current compositing mode

Returns

"CPU" | "GPU"

Inherited from

MultiLayerNeuroSurface.getCompositingMode


update()

ts
update(property, value): void;

Defined in: src/classes.ts:317

Parameters

property

string

value

any

Returns

void

Inherited from

MultiLayerNeuroSurface.update


updateConfig()

ts
updateConfig(newConfig): void;

Defined in: src/classes.ts:342

Update surface material properties dynamically

Parameters

newConfig

Partial<SurfaceConfig>

Partial configuration object with properties to update

Returns

void

Example

javascript
// Make surface shiny and semi-transparent
surface.updateConfig({
  shininess: 150,
  specularColor: 0xffffff,
  alpha: 0.7
});

// Switch to flat shading for faceted look
surface.updateConfig({ flatShading: true });

Inherited from

MultiLayerNeuroSurface.updateConfig


getPickMetadata()

ts
getPickMetadata(_vertexIndex): Record<string, unknown> | null;

Defined in: src/classes.ts:438

Parameters

_vertexIndex

number

Returns

Record<string, unknown> | null

Inherited from

MultiLayerNeuroSurface.getPickMetadata


setVisible()

ts
setVisible(visible): void;

Defined in: src/classes.ts:445

Parameters

visible

boolean

Returns

void

Inherited from

MultiLayerNeuroSurface.setVisible


setOpacity()

ts
setOpacity(opacity): void;

Defined in: src/classes.ts:453

Parameters

opacity

number

Returns

void

Inherited from

MultiLayerNeuroSurface.setOpacity


setSmoothShading()

ts
setSmoothShading(smooth, smoothingAngle?): void;

Defined in: src/classes.ts:473

Control surface shading style (visual only, doesn't modify geometry)

Parameters

smooth

boolean

If true, uses smooth shading (interpolated normals). If false, uses flat shading (face normals)

smoothingAngle?

number

Optional angle threshold in degrees (0-180). Edges above this angle remain sharp

Returns

void

Example

javascript
// Enable smooth shading for organic surfaces
surface.setSmoothShading(true);

// Smooth shading with 30° threshold (sharp edges preserved)
surface.setSmoothShading(true, 30);

// Flat shading for faceted/crystalline look
surface.setSmoothShading(false);

Inherited from

MultiLayerNeuroSurface.setSmoothShading


applyLaplacianSmoothing()

ts
applyLaplacianSmoothing(
   iterations?, 
   lambda?, 
   method?, 
   preserveBoundaries?): void;

Defined in: src/classes.ts:509

Apply Laplacian smoothing to the surface vertices (modifies geometry)

Parameters

iterations?

number = 1

Number of smoothing iterations (1-10). More iterations = smoother surface

lambda?

number = 0.5

Smoothing strength (0-1). 0 = no effect, 1 = maximum smoothing per iteration

method?

"laplacian" | "taubin"

Smoothing algorithm:

  • 'laplacian': Standard smoothing, may shrink surface
  • 'taubin': Alternates shrink/expand to preserve volume
preserveBoundaries?

boolean = true

If true, boundary edges remain fixed

Returns

void

Example

javascript
// Gentle smoothing to reduce noise
surface.applyLaplacianSmoothing(2, 0.3, 'laplacian', true);

// Aggressive smoothing while preserving volume
surface.applyLaplacianSmoothing(5, 0.5, 'taubin', true);

// Smooth including boundaries (may distort edges)
surface.applyLaplacianSmoothing(3, 0.4, 'laplacian', false);

Inherited from

MultiLayerNeuroSurface.applyLaplacianSmoothing


createSmoothedCopy()

ts
createSmoothedCopy(
   iterations?, 
   lambda?, 
   method?): SurfaceGeometry;

Defined in: src/classes.ts:559

Create a smoothed copy of this surface

Parameters

iterations?

number = 1

Number of smoothing iterations

lambda?

number = 0.5

Smoothing factor 0-1

method?

"laplacian" | "taubin"

'laplacian' or 'taubin'

Returns

SurfaceGeometry

A new smoothed surface geometry

Inherited from

MultiLayerNeuroSurface.createSmoothedCopy


updateMesh()

ts
updateMesh(): Mesh;

Defined in: src/classes.ts:584

Returns

Mesh

Inherited from

MultiLayerNeuroSurface.updateMesh

Released under the MIT License.