46 lines
		
	
	
		
			1018 B
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			1018 B
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using Godot;
							 | 
						||
| 
								 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Rokojori
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  public class OctahedralMapping
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    public static Vector3 Hemisphere( Vector2 uv )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      var position = new Vector3 (uv.X - uv.Y, 0, -1.0f + uv.X + uv.Y );
							 | 
						||
| 
								 | 
							
								      var absolute = position.Abs();
							 | 
						||
| 
								 | 
							
								      position.Y = 1.0f - absolute.X - absolute.Z;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return position;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static Vector3 Sphere( Vector2 uv )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      uv = uv * 2.0f - Vector2.One;
							 | 
						||
| 
								 | 
							
								      var position = new Vector3( uv.X, 0, uv.Y );
							 | 
						||
| 
								 | 
							
								      var absolute = position.Abs();
							 | 
						||
| 
								 | 
							
								      position.Y = 1.0f - absolute.X - absolute.Z;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if ( position.Y < 0 )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        var sign = position.Sign();
							 | 
						||
| 
								 | 
							
								        position.X = sign.X * ( 1.0f - absolute.Z );
							 | 
						||
| 
								 | 
							
								        position.Z = sign.Z * ( 1.0f - absolute.X );
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return position;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static Vector3 Map( Vector2 uv, bool sphere )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      var position = sphere ? Sphere( uv ) : Hemisphere( uv );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return position.Normalized();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |