1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import TempNode from '../core/TempNode.js';
- import { addNodeClass } from '../core/Node.js';
- import {
- addNodeElement,
- nodeProxy,
- vec4,
- mat2,
- mat4,
- } from '../shadernode/ShaderNode.js';
- import { cos, sin } from '../math/MathNode.js';
- class RotateNode extends TempNode {
- constructor( positionNode, rotationNode ) {
- super();
- this.positionNode = positionNode;
- this.rotationNode = rotationNode;
- }
- getNodeType( builder ) {
- return this.positionNode.getNodeType( builder );
- }
- setup( builder ) {
- const { rotationNode, positionNode } = this;
- const nodeType = this.getNodeType( builder );
- if ( nodeType === 'vec2' ) {
- const cosAngle = rotationNode.cos();
- const sinAngle = rotationNode.sin();
- const rotationMatrix = mat2(
- cosAngle, sinAngle,
- sinAngle.negate(), cosAngle
- );
- return rotationMatrix.mul( positionNode );
- } else {
- const rotation = rotationNode;
- const rotationXMatrix = mat4( vec4( 1.0, 0.0, 0.0, 0.0 ), vec4( 0.0, cos( rotation.x ), sin( rotation.x ).negate(), 0.0 ), vec4( 0.0, sin( rotation.x ), cos( rotation.x ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
- const rotationYMatrix = mat4( vec4( cos( rotation.y ), 0.0, sin( rotation.y ), 0.0 ), vec4( 0.0, 1.0, 0.0, 0.0 ), vec4( sin( rotation.y ).negate(), 0.0, cos( rotation.y ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
- const rotationZMatrix = mat4( vec4( cos( rotation.z ), sin( rotation.z ).negate(), 0.0, 0.0 ), vec4( sin( rotation.z ), cos( rotation.z ), 0.0, 0.0 ), vec4( 0.0, 0.0, 1.0, 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );
- return rotationXMatrix.mul( rotationYMatrix ).mul( rotationZMatrix ).mul( vec4( positionNode, 1.0 ) ).xyz;
- }
- }
- }
- export default RotateNode;
- export const rotate = nodeProxy( RotateNode );
- addNodeElement( 'rotate', rotate );
- addNodeClass( 'RotateNode', RotateNode );
|