rj-action-library/Runtime/Procedural/Baking/OctahedralMapping.cs

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