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