155 lines
3.1 KiB
C#
155 lines
3.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
using System;
|
|
|
|
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class BakingViewSettings:Resource
|
|
{
|
|
/*public enum CameraDistanceDetectionType
|
|
{
|
|
Automatic_Distance_Detection,
|
|
Custom_Distance
|
|
}
|
|
|
|
public enum CameraFOVMode
|
|
{
|
|
Keep_Fov,
|
|
Compute_Fov_With_Distance,
|
|
Custom_Fov
|
|
}*/
|
|
|
|
[Export]
|
|
public _XX_BakingFDSettings fovDistance;
|
|
|
|
/*
|
|
[Export]
|
|
public float originalFOV = 75;
|
|
|
|
[Export]
|
|
public bool assignFOV = false;
|
|
|
|
[Export]
|
|
public float placingDistance = 500;
|
|
|
|
|
|
|
|
[Export]
|
|
public float zoom = 1;
|
|
|
|
*/
|
|
|
|
[ExportGroup( "Debug Readonly" )]
|
|
|
|
[Export]
|
|
public float _XX_ComputedFOV = 75;
|
|
|
|
[Export]
|
|
public float _XX_ComputedDistance = 1;
|
|
|
|
[Export]
|
|
public float _XX_ComputedOutputScale = 1;
|
|
|
|
/*
|
|
|
|
[ExportGroup( "Custom FOV" )]
|
|
|
|
[Export]
|
|
public bool useCustomFOV = false;
|
|
|
|
[Export]
|
|
public float customFOV = 75;
|
|
|
|
[ExportGroup( "Custom Distance" )]
|
|
|
|
[Export]
|
|
public bool useCustomDistance = false;
|
|
|
|
[Export]
|
|
public float customDistance = 50;
|
|
*/
|
|
|
|
public enum RotationMode
|
|
{
|
|
Yaw_Pitch,
|
|
Quaternion
|
|
}
|
|
|
|
|
|
|
|
[ExportGroup("Rotation")]
|
|
|
|
[Export]
|
|
public RotationMode rotationMode = RotationMode.Yaw_Pitch;
|
|
|
|
[Export( PropertyHint.Range, "-180,180")]
|
|
public float yaw = 0;
|
|
|
|
[Export( PropertyHint.Range, "-180,180")]
|
|
public float pitch = 0;
|
|
|
|
[Export]
|
|
public Quaternion rotationQuaternion;
|
|
|
|
|
|
public Quaternion bakingRotation => RotationMode.Yaw_Pitch == rotationMode ?
|
|
Math3D.YawPitchRotation( yaw, pitch ) :
|
|
rotationQuaternion;
|
|
|
|
|
|
|
|
|
|
|
|
public void ApplySettings( Camera3D camera, Node3D target, Vector3 pivot )
|
|
{
|
|
var box = target.GetWorldBounds();
|
|
|
|
if ( box == null )
|
|
{
|
|
RJLog.Log( "No target" );
|
|
return;
|
|
}
|
|
|
|
Box3 box3 = box;
|
|
box3.IncludePoint( target.ToGlobal( pivot ) );
|
|
|
|
var sphere = Sphere.ContainingBox( box3 );
|
|
|
|
var size = sphere.radius;
|
|
|
|
if ( fovDistance is AutoDistance_BakingFDSettings ad )
|
|
{
|
|
size = ad.sizeEstimation == _XX_BakingFDSettings.SizeEstimationType.Bounding_Sphere ?
|
|
sphere.radius : ( box3.size.Y / 2f );
|
|
}
|
|
|
|
if ( fovDistance is AutoFOVDistance_BakingFDSettings afd )
|
|
{
|
|
size = afd.sizeEstimation == _XX_BakingFDSettings.SizeEstimationType.Bounding_Sphere ?
|
|
sphere.radius : ( box3.size.Y / 2f );
|
|
}
|
|
|
|
var fd = fovDistance.ComputeFOVDistance( size / 2f );
|
|
_XX_ComputedDistance = fd.Y;
|
|
_XX_ComputedFOV = fd.X;
|
|
|
|
camera.Fov = fd.X;
|
|
|
|
var cameraRotation = bakingRotation;
|
|
var offset = ( Vector3.Back * _XX_ComputedDistance ) * cameraRotation ;
|
|
camera.GlobalPosition = target.GlobalPosition + offset - pivot;
|
|
|
|
camera.SetGlobalQuaternion( cameraRotation.Inverse() );
|
|
|
|
_XX_ComputedOutputScale = Cameras.ComputeCameraFittingScale( camera.Fov, _XX_ComputedDistance );
|
|
|
|
|
|
}
|
|
}
|
|
}
|