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 );
							 |