168 lines
3.5 KiB
C#
168 lines
3.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
using System.Runtime.CompilerServices;
|
|
|
|
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class _XX_BakingPass:Resource
|
|
{
|
|
[Export]
|
|
public bool isEnabled = true;
|
|
|
|
public _XX_BakingPass()
|
|
{
|
|
CreateBakingOutputs();
|
|
}
|
|
|
|
protected virtual bool KeepsOriginalState()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
protected virtual bool KeepsCompositors()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
protected virtual void CreateBakingOutputs()
|
|
{
|
|
|
|
}
|
|
|
|
protected virtual async Task _Bake()
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
public async Task Bake()
|
|
{
|
|
if ( bakingOutputs == null || bakingOutputs.Length == 0 )
|
|
{
|
|
CreateBakingOutputs();
|
|
}
|
|
|
|
await _Bake();
|
|
|
|
if ( ! KeepsOriginalState() )
|
|
{
|
|
textureBaker.multiBaker.SetTargetDirty();
|
|
}
|
|
|
|
if ( ! KeepsCompositors() )
|
|
{
|
|
textureBaker.multiBaker.SetCompositorsDirty();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
public async Task<Texture2D> GrabDilatedTexture( bool srgb, bool alpha, bool mipmaps = true )
|
|
{
|
|
var texture = await textureBaker.multiBaker.GrabDilatedTexture( srgb, alpha, mipmaps );
|
|
return texture;
|
|
}
|
|
|
|
public _XX_MultiTextureBaker textureBaker;
|
|
|
|
public MultiBaker multiBaker => textureBaker.multiBaker;
|
|
|
|
[Export]
|
|
public BakingOutput[] bakingOutputs = [];
|
|
|
|
public static Texture2D Get( List<_XX_BakingPass> passes, params BakingTargetType[] bakingTargetType )
|
|
{
|
|
for ( int i = 0 ; i < bakingTargetType.Length; i++ )
|
|
{
|
|
var t = Get( passes, bakingTargetType[ i ] );
|
|
|
|
if ( t != null )
|
|
{
|
|
return t;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
protected void Clear( BakingTargetType type, string customType = null )
|
|
{
|
|
Set( type, customType, null );
|
|
}
|
|
|
|
protected void Set( BakingTargetType type, Texture2D texture2D )
|
|
{
|
|
var index = Array.Find( bakingOutputs, b => b.IsType( type, null ) );
|
|
|
|
if ( index == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
index.bakedTexture = texture2D;
|
|
}
|
|
|
|
protected void Set( BakingTargetType type, string customType, Texture2D texture2D )
|
|
{
|
|
var index = Array.Find( bakingOutputs, b => b.IsType( type, customType ) );
|
|
|
|
if ( index == null )
|
|
{
|
|
return;
|
|
}
|
|
|
|
index.bakedTexture = texture2D;
|
|
}
|
|
|
|
public static Texture2D Get( List<_XX_BakingPass> passes, string customType = null )
|
|
{
|
|
return Get( passes, BakingTargetType.Custom, customType );
|
|
}
|
|
|
|
public static Texture2D Get( List<_XX_BakingPass> passes, BakingTargetType bakingTargetType, string customType = null )
|
|
{
|
|
|
|
var pass = passes.Find( p => p.ContainsBakingOutput( bakingTargetType ) );
|
|
|
|
if ( pass == null )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var output = Array.Find( pass.bakingOutputs, p => p.IsType( bakingTargetType, customType ) );
|
|
|
|
if ( output == null )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return output.bakedTexture;
|
|
}
|
|
|
|
|
|
public bool ContainsBakingOutput( BakingTargetType bakingTargetType, string customType = null )
|
|
{
|
|
for ( int i = 0; i < bakingOutputs.Length; i++ )
|
|
{
|
|
if ( bakingOutputs[ i ].bakingTarget.type == bakingTargetType )
|
|
{
|
|
if ( bakingTargetType == BakingTargetType.Custom )
|
|
{
|
|
return customType == bakingOutputs[ i ].bakingTarget.customType;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
} |