firtoz / react-three-renderer

Render into a three.js canvas using React.
https://toxicfork.github.com/react-three-renderer-example/
MIT License
1.49k stars 155 forks source link

Should the default for empty properties be null? #228

Open AndrewRayCode opened 6 years ago

AndrewRayCode commented 6 years ago

I have a custom mesh component, something like:

class MyMesh extends Component {
    const { position, } = this.props;
    render() {
        return <mesh position={ position }>...</mesh>
    }
}

Most (but not all) of my meshes go through this class. I wanted to try forcing a manual render order, so I added the renderOrder prop and passed it down:

class MyMesh extends Component {
    const { position, renderOrder, } = this.props;
    render() {
        return <mesh position={ position } renderOrder={ renderOrder }>...</mesh>
    }
}

I started getting some strange flickering in my scene, and tracked it down to an undefined behavior in threejs.

Here's how three.js sorts by renderOrder: https://github.com/mrdoob/three.js/blob/dev/src/renderers/webgl/WebGLRenderLists.js#L7

Since three doesn't check for truthiness, it will sort only on equality difference. Normally, a mesh's render order is undefined. By simply adding the renderOrder={...} prop to my <mesh>, now anything using my component, even if doesn't pass renderOrder, will get null instead of the "default" undefined, which means my scene objects start sorting unexpectedly.

Should the default property be undefined, not null ? https://github.com/toxicFork/react-three-renderer/blob/master/src/lib/descriptors/THREEElementDescriptor.js#L40