69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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 );
 |