Skip to content

TSL: renderer.debug.getShaderAsync throws for nested struct member access #33341

@shotamatsuda

Description

@shotamatsuda

Description

Nested structs supported in #32724 appear to work in rendering paths, but renderer.debug.getShaderAsync() fails at MemberNode.getMemberType, falling back to unrelated output.

Specifically, it throws the following error.

three.core.js:2035 THREE.TSL: TypeError: Cannot read properties of null (reading 'getMemberType') "MemberNode.getMemberType()"

Reproduction steps

  1. Call renderer.debug.getShaderAsync() with a node material that outputs a member of a nested struct
  2. See the output and errors

Code

const Inner = struct({ x: 'vec3' }, 'Inner')
const Outer = struct({ inner: 'Inner' }, 'Outer')
const outer = Outer(Inner(vec3(1, 0, 0)))
const inner = outer.get('inner')
const node = inner.get('x')

const material = new NodeMaterial()
material.fragmentNode = node

void renderer.debug
  .getShaderAsync(
    new Scene(),
    new Camera(),
    new Mesh(new BufferGeometry(), material)
  )
  .then(({ fragmentShader }) => {
    console.log(fragmentShader)
  })

Live example

https://jsfiddle.net/shotamatsuda/24ebv5j9/

Screenshots

No response

Version

r183

Device

Desktop

Browser

Chrome

OS

MacOS

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugTSLThree.js Shading Language

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions