rj-action-library/Runtime/Procedural/Baking/MultiBaker/Octahedral_Baker.cs

125 lines
3.4 KiB
C#
Raw Normal View History

2025-01-03 12:09:23 +00:00
using System.Collections;
using System.Collections.Generic;
using Godot;
using System;
using System.Threading.Tasks;
namespace Rokojori
{
2025-04-08 09:07:02 +00:00
[Tool]
[GlobalClass]
public partial class Octahedral_Baker:_XX_MultiBakeMode
2025-01-03 12:09:23 +00:00
{
2025-04-08 09:07:02 +00:00
public static readonly string octahedralShader = "res://addons/rokojori_action_library/External/Imposter/materials/shaders/ImpostorShader.gdshader";
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
[Export]
public int octahedralSides = 4;
[Export]
public bool octahedralFullSphere = false;
2025-01-03 12:09:23 +00:00
public override int GetNumViews()
{
2025-04-08 09:07:02 +00:00
var views = octahedralSides * octahedralSides;
2025-01-03 12:09:23 +00:00
return views;
}
2025-05-07 12:18:01 +00:00
public override void CreateMaterial( List<_XX_BakingPass> passes )
2025-01-03 12:09:23 +00:00
{
var mb = multiBaker;
var material = new ShaderMaterial();
material.Shader = ResourceLoader.Load( octahedralShader ) as Shader;
2025-04-08 09:07:02 +00:00
material.SetShaderParameter( "isFullSphere", octahedralFullSphere );
material.SetShaderParameter( "imposterFrames", Vector2.One * octahedralSides );
2025-01-03 12:09:23 +00:00
Materials.Set( mb.X_outputMesh, material );
}
2025-05-07 12:18:01 +00:00
public override void AssignMaterial( List<_XX_BakingPass> passes )
2025-01-03 12:09:23 +00:00
{
var mb = multiBaker;
2025-05-07 12:18:01 +00:00
2025-01-03 12:09:23 +00:00
var material = Materials.Get<ShaderMaterial>( mb.X_outputMesh );
if ( material == null )
{
RJLog.Log( "Not the right material on mesh!" );
return;
}
2025-05-07 12:18:01 +00:00
material.SetShaderParameter( "imposterTextureAlbedo",
_XX_BakingPass.Get( passes, BakingTargetType.Albedo, BakingTargetType.Lit ) );
material.SetShaderParameter( "imposterTextureNormal",
_XX_BakingPass.Get( passes, BakingTargetType.Normals ) );
material.SetShaderParameter( "imposterTextureOrm",
_XX_BakingPass.Get( passes, BakingTargetType.ORM ) );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
material.SetShaderParameter( "imposterTextureDepth",
_XX_BakingPass.Get( passes, BakingTargetType.Depth ) );
2025-01-03 12:09:23 +00:00
}
2025-04-08 09:07:02 +00:00
public override void CreateBakers()
2025-01-03 12:09:23 +00:00
{
var fov = multiBaker.GetCameraFOV();
var distance = multiBaker.GetCameraDistance();
var outputScale = multiBaker.GetOutputScale();
2025-05-07 12:18:01 +00:00
var _bakers = multiBaker.bakerCameras;
2025-01-03 12:09:23 +00:00
var mb = multiBaker;
2025-04-08 09:07:02 +00:00
2025-01-03 12:09:23 +00:00
_bakers.ForEach(
2025-04-08 09:07:02 +00:00
bk =>
2025-01-03 12:09:23 +00:00
{
2025-04-08 09:07:02 +00:00
var vs = bk.viewSettings;
vs.fovDistance = Manual_BakingFDSettings.Create( fov, distance );
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
vs.rotationMode = BakingViewSettings.RotationMode.Quaternion;
2025-01-03 12:09:23 +00:00
}
);
var numTextures = GetNumViews();
var textureAlignment = TextureMerger.ComputeTextureAlignment( numTextures );
2025-04-08 09:07:02 +00:00
var toOP = 1f / ( octahedralSides - 1 );
2025-01-03 12:09:23 +00:00
var index = 0;
2025-04-08 09:07:02 +00:00
for ( int x = 0; x < octahedralSides; x++ )
2025-01-03 12:09:23 +00:00
{
2025-04-08 09:07:02 +00:00
for ( int y = 0; y < octahedralSides; y++ )
2025-01-03 12:09:23 +00:00
{
2025-04-08 09:07:02 +00:00
var inverseX = ( octahedralSides - 1 ) - x;
var inverseY = ( octahedralSides - 1 ) - y;
2025-01-03 12:09:23 +00:00
var octahedralPosition = new Vector2( y, inverseX ) * toOP;
2025-04-08 09:07:02 +00:00
var normal = OctahedralMapping.Map( octahedralPosition, octahedralFullSphere );
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
_bakers[ index ].viewSettings.rotationQuaternion = Math3D.LookRotation( normal, true ).Normalized().Inverse();
2025-01-03 12:09:23 +00:00
index ++;
}
}
var qm = new QuadMesh();
mb.X_outputMesh.Mesh = qm;
var magicScale = 0.75f;
mb.X_outputMesh.Scale = Vector3.One * ( outputScale / mb.cameraZoom * magicScale);
}
}
}