Added HairBlending shader pass;

Added HairBlendingSetting in UTSRenderPassSetting;
Added MaterialType to UTS;
Added MaterialFeature scope to UTS material editor;

Merged HairBlendingPass and HairShadowPass into UTSPass;

Fixed the bug that character box light can not update rotation correctly according to bound light source;
This commit is contained in:
Misaki
2025-01-09 07:58:06 +09:00
parent 9290223624
commit d47641e5e2
18 changed files with 627 additions and 368 deletions

View File

@@ -26,10 +26,7 @@ namespace Misaki.HdrpToon
public Transform trackedTransform;
public bool followGameObjectPosition = false;
public bool followGameObjectRotation = false;
public Vector3 positionOffset;
public Quaternion rotationOffset;
public float distanceOffset = 20.0f;
[CreateProperty]
public Light BindingSourceLight
@@ -64,8 +61,8 @@ namespace Misaki.HdrpToon
return;
}
UpdateShadowLayer(_bindingSourceLightData, _layerMask, value);
UpdateShadowLayer(_targetBoxLightData, _layerMask, value);
UpdateShadowLayer(_bindingSourceLightData, value);
UpdateShadowLayer(_targetBoxLightData, value);
_layerMask = value;
}
@@ -92,13 +89,9 @@ namespace Misaki.HdrpToon
{
Initialize();
}
// Start is called before the first frame update
private void Start()
{
}
// Update is called once per frame
private void LateUpdate()
private void Update()
{
Initialize();
@@ -125,16 +118,12 @@ namespace Misaki.HdrpToon
_targetBoxLight.enabled = _bindingSourceLight.enabled;
_targetBoxLight.intensity = _bindingSourceLight.intensity;
if (trackedTransform != null)
if (trackedTransform != null && followGameObjectPosition)
{
if (followGameObjectPosition)
{
_targetBoxLight.transform.position = trackedTransform.transform.position + positionOffset;
}
if (followGameObjectRotation)
{
_targetBoxLight.transform.rotation = trackedTransform.transform.rotation * rotationOffset;
}
var desiredPosition = trackedTransform.position - _bindingSourceLight.transform.forward * distanceOffset;
_targetBoxLight.transform.position = desiredPosition;
_targetBoxLight.transform.rotation = _bindingSourceLight.transform.rotation;
}
}
@@ -187,7 +176,7 @@ namespace Misaki.HdrpToon
#if UNITY_EDITOR
Undo.RegisterCreatedObjectUndo(lightGameObject, "Created Boxlight adjustment");
#endif
var hdLightData = lightGameObject.AddHDLight(LightType.Box);
var hdLightData = lightGameObject.AddHDLight(UnityEngine.LightType.Box);
// light size
hdLightData.SetBoxSpotSize(new Vector2(10.0f, 10.0f)); // Size should be culculated with more acculacy?
var boxLightAdjustment = lightGameObject.GetComponent<BoxLightAdjustment>();
@@ -228,12 +217,11 @@ namespace Misaki.HdrpToon
return lightGameObject;
}
private void UpdateShadowLayer(HDAdditionalLightData lightData, uint oldValue, uint newValue)
private void UpdateShadowLayer(HDAdditionalLightData lightData, uint newValue)
{
lightData.linkShadowLayers = false;
var oldShadowLayer = lightData.GetShadowLayers();
oldShadowLayer &= ~oldValue;
var newShadowLayer = oldShadowLayer | newValue;
var lightLayer = lightData.GetLightLayers();
var newShadowLayer = lightLayer | newValue | UnityEngine.RenderingLayerMask.defaultRenderingLayerMask;
lightData.SetShadowLightLayer((UnityEngine.Rendering.HighDefinition.RenderingLayerMask)newShadowLayer);
}
@@ -256,8 +244,7 @@ namespace Misaki.HdrpToon
if (_targetBoxLight != null)
{
positionOffset = _targetBoxLight.transform.position - trackedTransform.transform.position;
rotationOffset = Quaternion.Inverse(trackedTransform.transform.rotation) * _targetBoxLight.transform.rotation;
distanceOffset = Mathf.Abs(Vector3.Distance(_targetBoxLight.transform.position, trackedTransform.transform.position));
}
_initialized = true;