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

674 lines
16 KiB
C#
Raw Normal View History

2024-12-01 17:07:41 +00:00
using System.Collections;
using System.Collections.Generic;
using Godot;
using System;
2025-01-03 12:09:23 +00:00
using System.Threading.Tasks;
2025-05-07 12:18:01 +00:00
using System.Linq;
2024-12-01 17:07:41 +00:00
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class MultiBaker:Node
{
2025-04-06 16:39:24 +00:00
[ExportToolButton( "Bake")]
2025-04-08 09:07:02 +00:00
public Callable BakeButton => Callable.From( () => StartBaking() );
[Export]
public bool cleanUpAfterBaking = true;
[Export]
public _XX_MultiBakeMode bakeMode;
2025-01-03 12:09:23 +00:00
public enum MaterialMode
{
Full_Seperated,
Simple_Prebaked
}
2025-05-07 12:18:01 +00:00
// [ExportGroup("Textures")]
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
[Export]
2025-05-07 12:18:01 +00:00
public _XX_MultiTextureBaker textureBaker;
// [Export]
// public MaterialMode materialMode;
// [Export]
// public int dilationRadius = 64;
// [ExportGroup("Material/Full Seperated")]
// [Export]
// public bool mmfs_Normals = true;
// [Export]
// public bool mmfs_Depth = true;
// [Export]
// public bool mmfs_ORM = true;
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
[Export]
public BakingViewSettings viewSettings;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
[ExportGroup( "Object")]
2025-01-03 12:09:23 +00:00
2024-12-01 17:07:41 +00:00
[Export]
2025-04-08 09:07:02 +00:00
public Node3D target;
2025-01-03 12:09:23 +00:00
[Export]
2025-04-08 09:07:02 +00:00
public bool autoTargetPivot = false;
2025-01-03 12:09:23 +00:00
[Export]
2025-04-08 09:07:02 +00:00
public Vector3 targetPivot;
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
public float cameraZoom
{
get
{
if ( viewSettings.fovDistance is AutoDistance_BakingFDSettings ad )
{
return ad.zoom;
}
if ( viewSettings.fovDistance is AutoDistance_BakingFDSettings afd )
{
return afd.zoom;
}
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
return 1;
}
}
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
[ExportGroup( "Output")]
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public string outputDirectory;
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
[Export]
public string outputFileName;
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
[Export]
public float outputQuality = 1f;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Vector2 outputTextureSize = new Vector2( 2048, 2048 );
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public bool showOutputTexture = false;
[ExportGroup("Read Only")]
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public SubViewport X_bakingViewport;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Node3D X_bakingTargetContainer;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Node X_views;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public WorldEnvironment X_worldEnvironment;
[Export]
public MeshInstance3D X_outputMesh;
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
[Export]
public TextureMerger X_textureMerger;
2024-12-01 17:07:41 +00:00
2025-04-30 20:18:22 +00:00
[Export]
public TextureDilate X_textureDilate;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public SetBakingMaterials X_setBakingMaterials;
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
[Export]
public MeshInstance3D X_texturePreview;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public CsgMesh3D X_depthMapper;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Texture2D X_bakedTextureAlbedo;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Texture2D X_bakedTextureNormal;
2024-12-01 17:07:41 +00:00
[Export]
2025-01-03 12:09:23 +00:00
public Texture2D X_bakedTextureORM;
[Export]
public Texture2D X_bakedTextureDepth;
2025-04-30 20:18:22 +00:00
2025-04-08 09:07:02 +00:00
[Export]
public bool X_baking = false;
public void StartBaking()
{
Initialize();
Bake();
}
public void Initialize()
{
this.LogInfo( "Initializing" );
Nodes.RemoveAndDeleteChildren( this );
2025-05-07 12:18:01 +00:00
_bakerCameras = null;
2025-04-08 09:07:02 +00:00
X_bakingViewport = this.CreateChild<SubViewport>( "Multi Baker Viewport" );
X_bakingViewport.Size = (Vector2I) outputTextureSize;
X_bakingViewport.OwnWorld3D = true;
X_bakingViewport.TransparentBg = true;
X_worldEnvironment = X_bakingViewport.CreateChild<WorldEnvironment>( "Multi Baker Environment" );
X_worldEnvironment.Environment = new Godot.Environment();
X_worldEnvironment.Environment.AmbientLightSource = Godot.Environment.AmbientSource.Color;
X_worldEnvironment.Environment.AmbientLightColor = HSLColor.white;
X_bakingTargetContainer = X_bakingViewport.CreateChild<Node3D>( "Target Container" );
X_views = X_bakingViewport.CreateChild<Node>( "Views" );
X_textureMerger = this.CreateChild<TextureMerger>( "Texture Merger" );
X_textureMerger.multiBaker = this;
2025-05-07 12:18:01 +00:00
// X_textureMerger.dilationRadius = dilationRadius;
2025-04-08 09:07:02 +00:00
X_textureMerger.Initialize();
2025-04-30 20:18:22 +00:00
X_textureDilate = this.CreateChild<TextureDilate>( "Texture Dilate" );
X_textureDilate.viewport = X_textureMerger.X_textureMergerViewport;
2025-04-08 09:07:02 +00:00
X_outputMesh = this.CreateChild<MeshInstance3D>( "Output Mesh" );
X_texturePreview = this.CreateChild<MeshInstance3D>( "Texture Preview" );
X_texturePreview.Mesh = new QuadMesh();
X_texturePreview.Scale = Vector3.One * 100;
var pm = new StandardMaterial3D();
pm.Transparency = BaseMaterial3D.TransparencyEnum.AlphaScissor;
pm.ResourceLocalToScene = true;
var vt = new ViewportTexture();
vt.ViewportPath = X_textureMerger.X_textureMergerViewport.GetPath();
pm.AlbedoTexture = vt;
X_setBakingMaterials = this.CreateChild<SetBakingMaterials>( "Set Baking Materials" );
Materials.Set( X_texturePreview, pm );
}
2025-05-07 12:18:01 +00:00
public async Task<Texture2D> GrabDilatedTexture( bool srgb, bool alpha, bool mipmaps )
{
X_textureDilate.viewport = X_textureMerger.X_textureMergerViewport;
var maxRadius = X_textureMerger.GetMaxTextureDimension() / 2;
X_textureDilate.SetDilationRadius( maxRadius );
var texture = await X_textureDilate.Grab( srgb, alpha, mipmaps );
return texture;
}
bool _targetIsInInitialState = false;
public void SetTargetDirty()
{
_targetIsInInitialState = false;
}
public void ResetOriginalTargetState()
{
if ( _targetIsInInitialState )
{
return;
}
// _bakerCameras.ForEach( b => b.viewport.en)
Nodes.RemoveAndDeleteChildren( X_bakingTargetContainer );
target.DeepCopyTo( X_bakingTargetContainer );
_targetIsInInitialState = true;
return;
}
bool _compositorsClean = false;
public void SetCompositorsDirty()
{
_compositorsClean = false;
}
public void ResetCompositorStates()
{
X_worldEnvironment.Compositor = null;
_compositorsClean = true;
}
public void AddCompositorEffect( CompositorEffect compositorEffect )
{
if ( X_worldEnvironment.Compositor == null )
{
X_worldEnvironment.Compositor = new Compositor();
}
var compositorEffects = X_worldEnvironment.Compositor.CompositorEffects;
compositorEffects.Add( compositorEffect );
X_worldEnvironment.Compositor.CompositorEffects = compositorEffects;
_compositorsClean = false;
}
2025-04-08 09:07:02 +00:00
2025-04-06 16:39:24 +00:00
public async Task Bake()
{
2025-04-08 09:07:02 +00:00
if ( X_baking )
2025-01-03 12:09:23 +00:00
{
return;
}
2025-04-08 09:07:02 +00:00
X_baking = true;
2025-01-03 12:09:23 +00:00
try
{
2025-04-08 09:07:02 +00:00
bakeMode.multiBaker = this;
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
_targetIsInInitialState = false;
2025-01-03 12:09:23 +00:00
this.LogInfo( "Started baking" );
2025-05-07 12:18:01 +00:00
ResetOriginalTargetState();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
if ( _bakerCameras == null || _bakerCameras.Count != GetNumViews() )
2025-01-03 12:09:23 +00:00
{
2025-05-07 12:18:01 +00:00
CreateBakerCameras();
2025-01-03 12:09:23 +00:00
await this.RequestNextFrame();
}
2025-05-07 12:18:01 +00:00
SetupBakerCameras();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
this.LogInfo( "Bake Cameras set up" );
2025-01-03 12:09:23 +00:00
await this.RequestNextFrame();
2025-05-07 12:18:01 +00:00
this.LogInfo( "Render passes" );
var passes = textureBaker.GetPasses( this );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// X_setBakingMaterials.SetTarget( X_bakingTargetContainer );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// var bakingMaterialModes = new List<BakingMaterialMode>();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// var preview_QuickMaterial = MaterialMode.Simple_Prebaked == materialMode;
2025-04-08 09:07:02 +00:00
2025-05-07 12:18:01 +00:00
// bakeMode.CreateMaterial( preview_QuickMaterial );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
bakeMode.CreateMaterial( passes );
// if ( preview_QuickMaterial )
// {
// bakingMaterialModes.Add( BakingMaterialMode.Preview );
// }
// else
// {
// bakingMaterialModes.Add( BakingMaterialMode.Albedo );
// if ( mmfs_Normals )
// {
// bakingMaterialModes.Add( BakingMaterialMode.Normals );
// }
// if ( mmfs_Depth )
// {
// bakingMaterialModes.Add( BakingMaterialMode.Depth );
// }
// if ( mmfs_ORM )
// {
// bakingMaterialModes.Add( BakingMaterialMode.ORM );
// }
// }
2025-01-03 12:09:23 +00:00
this.LogInfo( "Prepared baking modes" );
X_textureMerger.textureSize = outputTextureSize;
X_textureMerger.Initialize();
X_textureMerger.CreateLayout();
2025-05-07 12:18:01 +00:00
// this.LogInfo( "Prepared texture merger" );
// var fovDistance = viewSettings.fovDistance.ComputeFOVDistance(
// var objectDistance = GetCameraDistance();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// this.LogInfo( "Set Camera Distance", objectDistance );
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
2025-05-07 12:18:01 +00:00
for ( int i = 0; i < passes.Count; i++ )
{
ResetOriginalTargetState();
_bakerCameras.ForEach( b => b.ApplyCameraSettings() );
await passes[ i ].Bake();
2025-01-03 12:09:23 +00:00
await this.RequestNextFrame();
2025-05-07 12:18:01 +00:00
}
bakeMode.AssignMaterial( passes );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// for ( int i = 0; i < bakingMaterialModes.Count; i++ )
// {
// this.LogInfo( "Baking mode:", bakingMaterialModes[ i ] );
// X_setBakingMaterials.mode = bakingMaterialModes[ i ];
// X_setBakingMaterials.ApplyBakingMaterials( objectDistance, _targetBoundingSphere.radius );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// this.LogInfo( "Materials changed:", bakingMaterialModes[ i ] );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// _bakers.ForEach( b => b.ApplyCameraSettings() );
// await this.RequestNextFrame();
// X_textureDilate.viewport = X_textureMerger.X_textureMergerViewport;
// Texture2D texture = await X_textureDilate.Grab();
2025-04-23 12:00:43 +00:00
2025-05-07 12:18:01 +00:00
// this.LogInfo( "Assigning Texture", bakingMaterialModes[ i ] );
// bakeMode.AssignMaterial( bakingMaterialModes[ i ], texture );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// this.LogInfo( "Baking done:", bakingMaterialModes[ i ] );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// await this.RequestNextFrame();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// }
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
// await this.RequestNextFrame();
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
X_outputMesh.GlobalPosition = target.GlobalPosition - targetPivot;
X_outputMesh.Scale = Vector3.One * cameraZoom;
2025-05-07 12:18:01 +00:00
2025-04-08 09:07:02 +00:00
this.LogInfo( "All Baking done" );
2025-01-03 12:09:23 +00:00
}
catch ( System.Exception e )
{
this.LogError( "Baking failed" );
this.LogError( e );
}
2025-05-07 12:18:01 +00:00
if ( cleanUpAfterBaking )
{
this.LogInfo( "Cleaning Up" );
CleanUp();
}
2025-04-08 09:07:02 +00:00
X_baking = false;
2025-01-03 12:09:23 +00:00
return;
}
public List<SubViewport> GetAllViewports()
2024-12-01 17:07:41 +00:00
{
2025-01-03 12:09:23 +00:00
return Nodes.AllIn<SubViewport>( X_views, null, false );
}
2025-05-07 12:18:01 +00:00
// public void CacheTexture( BakingMaterialMode mode, Texture2D texture )
// {
// if ( BakingMaterialMode.Albedo == mode )
// {
// X_bakedTextureAlbedo = texture;
// }
// else if ( BakingMaterialMode.Normals == mode )
// {
// X_bakedTextureNormal = texture;
// }
// else if ( BakingMaterialMode.ORM == mode )
// {
// X_bakedTextureORM = texture;
// }
// else if ( BakingMaterialMode.Depth == mode )
// {
// X_bakedTextureDepth = texture;
// }
// }
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
public void CleanUp()
{
var mesh = X_outputMesh;
mesh.Reparent( GetParent(), true );
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakingViewport = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakingTargetContainer = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_views = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_worldEnvironment = null;
X_outputMesh = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_textureMerger = null;
2024-12-01 17:07:41 +00:00
2025-05-07 12:18:01 +00:00
X_textureDilate = null;
2025-04-08 09:07:02 +00:00
X_setBakingMaterials = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_texturePreview = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_depthMapper = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakedTextureAlbedo = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakedTextureNormal = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakedTextureORM = null;
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
X_bakedTextureDepth = null;
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
Nodes.RemoveAndDeleteChildren( this );
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
mesh.Reparent( this, true );
2025-01-03 12:09:23 +00:00
}
2025-04-08 09:07:02 +00:00
2025-01-03 12:09:23 +00:00
public int GetNumViews()
{
2025-04-08 09:07:02 +00:00
return bakeMode.GetNumViews();
2024-12-01 17:07:41 +00:00
}
2025-05-07 12:18:01 +00:00
List<Baker> _bakerCameras;
2024-12-01 17:07:41 +00:00
2025-05-07 12:18:01 +00:00
public List<Baker> bakerCameras => _bakerCameras;
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
public void CreateBakerCameras()
2025-01-03 12:09:23 +00:00
{
2024-12-01 17:07:41 +00:00
Nodes.RemoveAndDeleteChildren( X_views );
var numViews = GetNumViews();
2025-05-07 12:18:01 +00:00
_bakerCameras = new List<Baker>();
2024-12-01 17:07:41 +00:00
2025-05-07 12:18:01 +00:00
var alginment = TextureMerger.ComputeTextureAlignment( numViews );
var minViewsPerAxis = Mathf.Max( alginment.X, alginment.Y );
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
this.LogInfo( "Size per Baker:", "nv", numViews, "al", alginment, "mvpa", minViewsPerAxis,"s", (Vector2I) ( outputTextureSize / minViewsPerAxis ) );
2024-12-01 17:07:41 +00:00
for ( int i = 0; i < numViews; i++ )
{
var userIndex = ( i + 1 );
var bakingView = X_views.CreateChild<SubViewport>( "Baking View " + userIndex );
bakingView.TransparentBg = true;
2025-01-03 12:09:23 +00:00
bakingView.Size = (Vector2I) ( outputTextureSize / minViewsPerAxis );
2024-12-01 17:07:41 +00:00
var bakingCamera = bakingView.CreateChild<Camera3D>( "Camera View " + userIndex );
var baker = bakingView.CreateChild<Baker>( "Baker " + userIndex );
baker.camera = bakingCamera;
baker.target = X_bakingTargetContainer;
baker.viewport = bakingView;
2025-05-07 12:18:01 +00:00
baker.viewport.Msaa3D = Viewport.Msaa.Msaa8X;
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
2024-12-01 17:07:41 +00:00
2025-05-07 12:18:01 +00:00
_bakerCameras.Add( baker );
2024-12-01 17:07:41 +00:00
}
}
2025-05-07 12:18:01 +00:00
public void SetupBakerCameras()
2024-12-01 17:07:41 +00:00
{
2025-01-03 12:09:23 +00:00
var numViews = GetNumViews();
var minViewsPerAxis = TextureMerger.ComputeTextureAlignment( numViews ).Y;
X_bakingViewport.Size = (Vector2I) outputTextureSize;
for ( int i = 0; i < numViews; i++ )
{
2025-05-07 12:18:01 +00:00
var baker = _bakerCameras[ i ];
2025-01-03 12:09:23 +00:00
var bakingView = baker.viewport as SubViewport;
bakingView.Size = (Vector2I) ( outputTextureSize / minViewsPerAxis );
}
_targetBoundingSphere = null;
2025-04-08 09:07:02 +00:00
_targetBoundingBox = null;
2025-01-03 12:09:23 +00:00
ComputeBoundingSphere();
if ( _targetBoundingSphere == null )
{
this.LogError( "No bounding sphere created, ensure there are visible targets" );
return;
}
2025-04-08 09:07:02 +00:00
ComputeCameraViewSettings();
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
bakeMode.CreateBakers();
2025-01-03 12:09:23 +00:00
2024-12-01 17:07:41 +00:00
}
Sphere _targetBoundingSphere;
2025-04-08 09:07:02 +00:00
Box3 _targetBoundingBox;
2024-12-01 17:07:41 +00:00
Sphere targetBoundingSphere
{
get
{
if ( _targetBoundingSphere == null )
{
ComputeBoundingSphere();
}
return _targetBoundingSphere;
}
}
void ComputeBoundingSphere()
{
2025-01-03 12:09:23 +00:00
if ( X_bakingTargetContainer.GetChildCount() == 0 )
{
_targetBoundingSphere = null;
return;
}
var firstChild = X_bakingTargetContainer.GetChild( 0 ) as Node3D;
if ( firstChild == null )
{
_targetBoundingSphere = null;
return;
}
if ( ! firstChild.Visible )
{
firstChild.Visible = true;
}
2025-04-08 09:07:02 +00:00
_targetBoundingBox = X_bakingTargetContainer.GetWorldBounds();
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
if ( _targetBoundingBox == null )
{
return;
}
2025-04-08 09:07:02 +00:00
if ( autoTargetPivot )
{
Box3 box = target.GetWorldBounds();
2025-05-07 12:18:01 +00:00
if ( box == null )
{
_targetBoundingSphere = null;
return;
}
2025-04-08 09:07:02 +00:00
targetPivot = new Vector3( 0, -box.center.Y, 0 );
}
2025-01-03 12:09:23 +00:00
2025-04-08 09:07:02 +00:00
_targetBoundingSphere = Sphere.ContainingBox( _targetBoundingBox );
2024-12-01 17:07:41 +00:00
}
2025-04-08 09:07:02 +00:00
float _cameraFOV = 0;
float _cameraDistance = 0;
float _outputScale = 1;
void ComputeCameraViewSettings()
2024-12-01 17:07:41 +00:00
{
2025-04-08 09:07:02 +00:00
var fovDistance = viewSettings.fovDistance;
var size = targetBoundingSphere.radius;
var computeScale = false;
if ( fovDistance is AutoDistance_BakingFDSettings ad )
2024-12-01 17:07:41 +00:00
{
2025-04-08 09:07:02 +00:00
size = ad.sizeEstimation == _XX_BakingFDSettings.SizeEstimationType.Bounding_Sphere ?
targetBoundingSphere.radius : ( _targetBoundingBox.size.Y / 2f );
computeScale = true;
}
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
if ( fovDistance is AutoFOVDistance_BakingFDSettings afd )
2024-12-01 17:07:41 +00:00
{
2025-04-08 09:07:02 +00:00
size = afd.sizeEstimation == _XX_BakingFDSettings.SizeEstimationType.Bounding_Sphere ?
targetBoundingSphere.radius : ( _targetBoundingBox.size.Y / 2f );
computeScale = true;
}
var fd = fovDistance.ComputeFOVDistance( size / 2f );
2024-12-01 17:07:41 +00:00
2025-04-08 09:07:02 +00:00
_cameraFOV = fd.X;
_cameraDistance = fd.Y;
_outputScale = computeScale ? Cameras.ComputeCameraFittingScale( _cameraFOV, _cameraDistance ) : 1;
}
public float GetCameraFOV()
{
return _cameraFOV;
2024-12-01 17:07:41 +00:00
}
2025-01-03 12:09:23 +00:00
public float GetCameraDistance()
2024-12-01 17:07:41 +00:00
{
2025-04-08 09:07:02 +00:00
return _cameraDistance;
2024-12-01 17:07:41 +00:00
}
2025-01-03 12:09:23 +00:00
public float GetOutputScale()
2024-12-01 17:07:41 +00:00
{
2025-04-08 09:07:02 +00:00
return _outputScale;
2024-12-01 17:07:41 +00:00
}
}
}