Files
2022-01-22 20:13:49 -08:00

147 lines
5.5 KiB
HLSL
Vendored

// Alloy Physical Shader Framework
// Copyright 2013-2017 RUST LLC.
// http://www.alloy.rustltd.com/
/////////////////////////////////////////////////////////////////////////////////
/// @file TriPlanar.cginc
/// @brief TriPlanar mapping.
/////////////////////////////////////////////////////////////////////////////////
#ifndef ALLOY_SHADERS_FEATURE_TRIPLANAR_CGINC
#define ALLOY_SHADERS_FEATURE_TRIPLANAR_CGINC
#ifdef A_TRIPLANAR_ON
#ifndef A_TRIPLANAR_MAPPING_ON
#define A_TRIPLANAR_MAPPING_ON
#endif
#ifndef A_METALLIC_ON
#define A_METALLIC_ON
#endif
#ifndef A_SPECULAR_TINT_ON
#define A_SPECULAR_TINT_ON
#endif
#if !defined(A_AMBIENT_OCCLUSION_ON) && !defined(A_ROUGHNESS_SOURCE_BASE_COLOR_ALPHA)
#define A_AMBIENT_OCCLUSION_ON
#endif
#endif
#include "Assets/Alloy/Shaders/Framework/Feature.cginc"
#ifdef A_TRIPLANAR_ON
half _TriplanarBlendSharpness;
half4 _PrimaryColor;
A_SAMPLER_2D(_PrimaryMainTex);
sampler2D _PrimaryMaterialMap;
sampler2D _PrimaryBumpMap;
half _PrimaryColorVertexTint;
half _PrimaryMetallic;
half _PrimarySpecularity;
half _PrimarySpecularTint;
half _PrimaryOcclusion;
half _PrimaryRoughness;
half _PrimaryBumpScale;
#ifdef _SECONDARY_TRIPLANAR_ON
half4 _SecondaryColor;
A_SAMPLER_2D(_SecondaryMainTex);
sampler2D _SecondaryMaterialMap;
sampler2D _SecondaryBumpMap;
half _SecondaryColorVertexTint;
half _SecondaryMetallic;
half _SecondarySpecularity;
half _SecondarySpecularTint;
half _SecondaryOcclusion;
half _SecondaryRoughness;
half _SecondaryBumpScale;
#endif
#ifdef _TERTIARY_TRIPLANAR_ON
half4 _TertiaryColor;
A_SAMPLER_2D(_TertiaryMainTex);
sampler2D _TertiaryMaterialMap;
sampler2D _TertiaryBumpMap;
half _TertiaryColorVertexTint;
half _TertiaryMetallic;
half _TertiarySpecularity;
half _TertiarySpecularTint;
half _TertiaryOcclusion;
half _TertiaryRoughness;
half _TertiaryBumpScale;
#endif
#ifdef _QUATERNARY_TRIPLANAR_ON
half4 _QuaternaryColor;
A_SAMPLER_2D(_QuaternaryMainTex);
sampler2D _QuaternaryMaterialMap;
sampler2D _QuaternaryBumpMap;
half _QuaternaryColorVertexTint;
half _QuaternaryMetallic;
half _QuaternarySpecularity;
half _QuaternarySpecularTint;
half _QuaternaryRoughness;
half _QuaternaryOcclusion;
half _QuaternaryBumpScale;
#endif
#endif
void aTriPlanar(
inout ASurface s)
{
#ifdef A_TRIPLANAR_ON
ASplatContext sc = aNewSplatContext(s, _TriplanarBlendSharpness, 1.0h);
ASplat sp0 = aNewSplat();
#if 1 // PRIMARY
#if defined(_SECONDARY_TRIPLANAR_ON) || defined(_TERTIARY_TRIPLANAR_ON)
aTriPlanarPositiveY(sp0, sc, A_SAMPLER_2D_INPUT(_PrimaryMainTex), _PrimaryMaterialMap, _PrimaryBumpMap, _PrimaryOcclusion, _PrimaryBumpScale);
#else
aTriPlanarY(sp0, sc, A_SAMPLER_2D_INPUT(_PrimaryMainTex), _PrimaryMaterialMap, _PrimaryBumpMap, _PrimaryOcclusion, _PrimaryBumpScale);
#endif
#ifndef _SECONDARY_TRIPLANAR_ON
aTriPlanarX(sp0, sc, A_SAMPLER_2D_INPUT(_PrimaryMainTex), _PrimaryMaterialMap, _PrimaryBumpMap, _PrimaryOcclusion, _PrimaryBumpScale);
#ifndef _QUATERNARY_TRIPLANAR_ON
aTriPlanarZ(sp0, sc, A_SAMPLER_2D_INPUT(_PrimaryMainTex), _PrimaryMaterialMap, _PrimaryBumpMap, _PrimaryOcclusion, _PrimaryBumpScale);
#endif
#endif
aSplatMaterial(sp0, sc, _PrimaryColor, _PrimaryColorVertexTint, _PrimaryMetallic, _PrimarySpecularity, _PrimarySpecularTint, _PrimaryRoughness);
#endif
#ifdef _SECONDARY_TRIPLANAR_ON
ASplat sp1 = aNewSplat();
aTriPlanarX(sp1, sc, A_SAMPLER_2D_INPUT(_SecondaryMainTex), _SecondaryMaterialMap, _SecondaryBumpMap, _SecondaryOcclusion, _SecondaryBumpScale);
#ifndef _TERTIARY_TRIPLANAR_ON
aTriPlanarNegativeY(sp1, sc, A_SAMPLER_2D_INPUT(_SecondaryMainTex), _SecondaryMaterialMap, _SecondaryBumpMap, _SecondaryOcclusion, _SecondaryBumpScale);
#endif
#ifndef _QUATERNARY_TRIPLANAR_ON
aTriPlanarZ(sp1, sc, A_SAMPLER_2D_INPUT(_SecondaryMainTex), _SecondaryMaterialMap, _SecondaryBumpMap, _SecondaryOcclusion, _SecondaryBumpScale);
#endif
aSplatMaterial(sp1, sc, _SecondaryColor, _SecondaryColorVertexTint, _SecondaryMetallic, _SecondarySpecularity, _SecondarySpecularTint, _SecondaryRoughness);
aMergeSplats(sp0, sp1);
#endif
#ifdef _TERTIARY_TRIPLANAR_ON
ASplat sp2 = aNewSplat();
aTriPlanarNegativeY(sp2, sc, A_SAMPLER_2D_INPUT(_TertiaryMainTex), _TertiaryMaterialMap, _TertiaryBumpMap, _TertiaryOcclusion, _TertiaryBumpScale);
aSplatMaterial(sp2, sc, _TertiaryColor, _TertiaryColorVertexTint, _TertiaryMetallic, _TertiarySpecularity, _TertiarySpecularTint, _TertiaryRoughness);
aMergeSplats(sp0, sp2);
#endif
#ifdef _QUATERNARY_TRIPLANAR_ON
ASplat sp3 = aNewSplat();
aTriPlanarZ(sp3, sc, A_SAMPLER_2D_INPUT(_QuaternaryMainTex), _QuaternaryMaterialMap, _QuaternaryBumpMap, _QuaternaryOcclusion, _QuaternaryBumpScale);
aSplatMaterial(sp3, sc, _QuaternaryColor, _QuaternaryColorVertexTint, _QuaternaryMetallic, _QuaternarySpecularity, _QuaternarySpecularTint, _QuaternaryRoughness);
aMergeSplats(sp0, sp3);
#endif
aApplySplat(s, sp0);
aCutout(s);
#endif
}
#endif // ALLOY_SHADERS_FEATURE_TRIPLANAR_CGINC