Files
NovaFree/Runtime/Shaders/UIBlock3D.cginc
2025-08-02 20:11:41 +08:00

73 lines
2.2 KiB
HLSL

#ifndef NOVA_UIBLOCK_3D
#define NOVA_UIBLOCK_3D
#include "Nova.cginc"
#include "Generated/UIBlock3D.g.cginc"
NOVA_DECLARE_BUFFER(UIBlock3DData, _NovaData);
v2f NovaVert(UIBlock3DVert v, uint instanceID : SV_InstanceID)
{
NovaVertInit(instanceID, v2f, o);
uint indexIntoIndexBuffer = InstanceIDToDataIndex(instanceID);
NOVA_GET_BUFFER_ITEM_uint(index, indexIntoIndexBuffer, _NovaDataIndices);
NOVA_GET_BUFFER_ITEM_UIBlock3DData(shaderData, index, _NovaData);
float3 vertNodePos = v.Pos * shaderData.Size + v.CornerOffsetDir * shaderData.CornerRadius + v.EdgeOffsetDir * shaderData.EdgeRadius;
NOVA_GET_BUFFER_ITEM_TransformAndLighting(transformAndLighting, shaderData.TransformIndex, _NovaTransformsAndLighting);
float3 rootSpace = mul(transformAndLighting.RootFromBlock, float4(vertNodePos, 1)).xyz;
float3 worldPos = NovaRootToWorldPos(rootSpace);
o.pos = UnityWorldToClipPos(worldPos);
#if defined(NOVA_CLIPPING)
SetRootPos(o, rootSpace);
#endif
NovaColorToV2F(Color, o, shaderData.Color);
#if defined(NOVA_LIT)
NovaSetLitV2FParams(o, transformAndLighting);
SetWorldPos(o, worldPos);
float3 rootNormal = NovaRootFromBlockNormal(transformAndLighting.RootFromBlock, v.Normal);
float3 worldNormal = UnityObjectToWorldNormal(rootNormal);
SetWorldNormal(o, worldNormal);
NovaInitInstance(appdata_full, appdata);
appdata.vertex = float4(rootSpace, 1);
appdata.normal = rootNormal;
NovaDoLitVert(o, worldPos, worldNormal, appdata);
#endif
return o;
}
fixed4 NovaFrag(v2f i) : SV_Target
{
NovaFragInit(i);
fixed4 color = GetColor(i);
#if defined(NOVA_CLIPPING)
half clipWeight = GetTotalVisualModifierClipping(GetRootPos(i));
// NOTE: We don't soften here, just clip
clip(clipWeight - 1.0);
#endif
#if defined(NOVA_CLIP_RECT)
color = ApplyGlobalColorModification(color);
#elif defined(NOVA_CLIP_MASK)
color = ApplyClipMaskAndColorModifiers(color, GetRootPos(i));
#endif
#if defined(NOVA_LIT)
color = NovaDoLightingCalculations(i, color);
#endif
return color;
}
#endif