CustomWGSLPointsSource

← prev index next →

Generates clone placements from your own WGSL — a procedural point distribution written as a GPU function, for shapes no built-in source covers (a helix, a gyroid, a formula-defined swarm).

Remarks

This is the fully custom member of the points-source family (see ShaderFunctionPointsSource): a points-source defines the set of positions at which a sk-cloner places copies of its content, so it lives as a child of a <sk-cloner> and the cloner's other child is the template cloned at each point. Where the built-in procedural sources encode a fixed shape (sk-grid-points-source, sk-sphere-points-source, …), this one runs an author-supplied getPointAtIndex(index) on the GPU, so every point's local transform is whatever the WGSL computes — and, like the other procedural sources, the placements never touch the CPU, so even large counts stay cheap.

Key attributes. point-count is how many points to generate — the WGSL is evaluated once per index from 0 to point-count − 1. wgsl is the inline shader body; it must define fn getPointAtIndex(index: u32) -> PointData and set point.localMatrix (column 3 is the position, the +Y axis is the surface normal). src loads that WGSL from an external .wgsl file instead, taking precedence over inline wgsl (mirroring <script src>); on-load / on-error fire when a src fetch resolves or fails. Author parameters are supplied as <sk-wgsl-uniform> children and read in WGSL via the generated skUniform_<name>() accessors.

Related. For placements a GPU compute pass produces into a buffer rather than a per-index function, see sk-compute-buffer-points-source (which pairs with a sk-compute-node). For built-in procedural shapes see sk-grid-points-source, sk-sphere-points-source, and sk-platonic-sphere-points-source; for object/data-driven placements see sk-mesh-vertex-points-source, sk-mesh-surface-points-source, sk-buffer-points-source, and sk-cloner-points-source. Its host is always a sk-cloner.

Constructor

constructor(config?: { pointCount: number; wgsl?: string; src?: string })

Properties

Config Properties

PropertyTypeDefaultDescriptionDeclared by
pointCount number 1 Number of points to generate. CustomWGSLPointsSource
wgsl string "" Inline WGSL shader code. Ignored while src is set. CustomWGSLPointsSource
src string — External WGSL source URL (the src attribute), or null if none. CustomWGSLPointsSource

Other Properties

PropertyTypeDefaultDescriptionDeclared by
configuredPointCountread-only number — The configured point count, independent of the inert state. CustomWGSLPointsSource
hasEffectiveWGSLread-only boolean — Whether usable effective WGSL is available. false while a src is set CustomWGSLPointsSource
localMatricesread-only Float32Array<ArrayBufferLike> | null — CPU-side local matrices. ShaderFunctionPointsSource
typeread-only PointsSourceType "shader-function" The type of this points source. ShaderFunctionPointsSource
sceneread-only any — Gets the Scene this animatable belongs to, if any. SkenraAnimatable
animationsread-only SkenraAnimation[] — Public getter for the animations affecting this target. SkenraAnimatable

Methods

MethodDescriptionDeclared by
configure(config: CustomWGSLPointsSourceConfig): void Declarative configuration API. CustomWGSLPointsSource
addUniform(name: string, value: number): WGSLUniform Imperative twin of authoring a <sk-wgsl-uniform> child. CustomWGSLPointsSource
addF32ArrayUniform(name: string, values: readonly number[]): WGSLF32ArrayUniform Imperative twin of authoring a <sk-wgsl-f32-array-uniform> child. CustomWGSLPointsSource
addVec2Uniform(name: string, x: number, y: number): WGSLVec2Uniform Imperative twin of authoring a <sk-wgsl-vec2-uniform> child. CustomWGSLPointsSource
addVec3Uniform(name: string, x: number, y: number, z: number): WGSLVec3Uniform Imperative twin of authoring a <sk-wgsl-vec3-uniform> child. CustomWGSLPointsSource
addVec4Uniform(name: string, x: number, y: number, z: number, w: number): WGSLVec4Uniform Imperative twin of authoring a <sk-wgsl-vec4-uniform> child. CustomWGSLPointsSource
addColorUniform(name: string, color: ColorInput): WGSLColorUniform Imperative twin of authoring a <sk-wgsl-color-uniform> child. CustomWGSLPointsSource
getBoundsInSpace(fullTransform: Float32Array): { minX: number; maxX: number; minY: number; maxY: number; minZ: number; maxZ: number; } | null Computes the AABB in target space by transforming local bounds corners. ShaderFunctionPointsSource
setWorldReferenceNode(node: WorldReferenceNode | null): void Sets the reference node whose world matrix should be used for transforms. ShaderFunctionPointsSource
animate(firstArg: TypedKeyframe<this>[] | TypedPropertyIndexedKeyframes<this> | Record<string, any> | globalThis.Keyframe[] | globalThis.PropertyIndexedKeyframes | null, secondArg?: number | KeyframeAnimationOptions | globalThis.KeyframeAnimationOptions): SkenraAnimation & Animation Creates a new SkenraAnimation for this target per Web Animations API. SkenraAnimatable
removeAnimation(animation: SkenraAnimation): boolean Removes a specific animation from this object. SkenraAnimatable
constrain(type: K, config: ConstraintConfigMap[K]): ConstraintReturnMap[K] Creates a constraint on this Animatable using a fluent API. SkenraAnimatable

Example

const helixSource = new CustomWGSLPointsSource({
    pointCount: 200,
    wgsl: `
        fn getPointAtIndex(index: u32) -> PointData {
            var point: PointData;
            let t = f32(index) / skUniform_count();
            let angle = t * 6.283 * 4.0;
            let pos = vec3<f32>(cos(angle) * skUniform_radius(), t * skUniform_pitch(), sin(angle) * skUniform_radius());
            // Identity basis → +Y surface normal; position in column 3.
            point.localMatrix = mat4x4<f32>(
                vec4<f32>(1.0, 0.0, 0.0, 0.0),
                vec4<f32>(0.0, 1.0, 0.0, 0.0),
                vec4<f32>(0.0, 0.0, 1.0, 0.0),
                vec4<f32>(pos, 1.0)
            );
            return point;
        }
    `,
});
// Parameters are <sk-wgsl-uniform> children (count/radius/pitch).