mirror of
https://github.com/AssetRipper/AssetRipper.git
synced 2025-12-11 20:15:29 +01:00
224 lines
4.8 KiB
C#
224 lines
4.8 KiB
C#
using AssetRipper.Export.Modules.Shaders.ShaderBlob.Parameters;
|
|
using AssetRipper.Export.Modules.Shaders.UltraShaderConverter.DirectXDisassembler;
|
|
using AssetRipper.Export.Modules.Shaders.UltraShaderConverter.DirectXDisassembler.Blocks;
|
|
using AssetRipper.Export.Modules.Shaders.UltraShaderConverter.USIL;
|
|
using AssetRipper.SourceGenerated.Extensions.Enums.Shader;
|
|
|
|
namespace AssetRipper.Export.Modules.Shaders.UltraShaderConverter.UShader.DirectX;
|
|
|
|
public static class DXShaderNamingUtils
|
|
{
|
|
// these two are useless now
|
|
public static string GetConstantBufferParamTypeName(VectorParameter param) => GetConstantBufferParamTypeName(param.Dim, 1, param.Type, false);
|
|
public static string GetConstantBufferParamTypeName(MatrixParameter param) => GetConstantBufferParamTypeName(param.RowCount, param.ColumnCount, param.Type, true);
|
|
|
|
public static string GetConstantBufferParamTypeName(NumericShaderParameter param) => GetConstantBufferParamTypeName(param.RowCount, param.ColumnCount, param.Type, true);
|
|
|
|
public static string GetConstantBufferParamTypeName(int rowCount, int columnCount, ShaderParamType paramType, bool isMatrix)
|
|
{
|
|
string name = $"unknownType";
|
|
string baseName = paramType.ToString().ToLower();
|
|
|
|
if (columnCount == 1)
|
|
{
|
|
if (rowCount == 1)
|
|
{
|
|
name = $"{baseName}";
|
|
}
|
|
|
|
if (rowCount == 2)
|
|
{
|
|
name = $"{baseName}2";
|
|
}
|
|
|
|
if (rowCount == 3)
|
|
{
|
|
name = $"{baseName}3";
|
|
}
|
|
|
|
if (rowCount == 4)
|
|
{
|
|
name = $"{baseName}4";
|
|
}
|
|
}
|
|
else if (columnCount == 4)
|
|
{
|
|
if (rowCount == 4 && isMatrix)
|
|
{
|
|
name = $"{baseName}4x4";
|
|
}
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
public static string GetISGNInputName(ISGN.Input input)
|
|
{
|
|
string type;
|
|
if (input.index > 0)
|
|
{
|
|
type = input.name + input.index;
|
|
}
|
|
else
|
|
{
|
|
type = input.name;
|
|
}
|
|
|
|
string name = input.name switch
|
|
{
|
|
"SV_POSITION" => "position",
|
|
"SV_Position" => "position",
|
|
"SV_IsFrontFace" => "facing",
|
|
"POSITION" => "vertex",
|
|
_ => type.ToLower(),
|
|
};
|
|
return name;
|
|
}
|
|
|
|
public static string GetOSGNOutputName(OSGN.Output output)
|
|
{
|
|
string type;
|
|
if (output.index > 0)
|
|
{
|
|
type = output.name + output.index;
|
|
}
|
|
else
|
|
{
|
|
type = output.name;
|
|
}
|
|
|
|
if (HasSpecialInputOutputName(output.name))
|
|
{
|
|
return GetSpecialInputOutputName(output.name);
|
|
}
|
|
|
|
string name = output.name switch
|
|
{
|
|
"SV_POSITION" => "position",
|
|
"POSITION" => "vertex",
|
|
_ => type.ToLower(),
|
|
};
|
|
|
|
return name;
|
|
}
|
|
|
|
public static bool HasSpecialInputOutputName(string typeName) => GetSpecialInputOutputName(typeName) != string.Empty;
|
|
public static string GetSpecialInputOutputName(string typeName)
|
|
{
|
|
switch (typeName)
|
|
{
|
|
case "SV_Depth":
|
|
{
|
|
return "oDepth";
|
|
}
|
|
case "SV_Coverage":
|
|
{
|
|
return "oMask";
|
|
}
|
|
case "SV_DepthGreaterEqual":
|
|
{
|
|
return "oDepthGE";
|
|
}
|
|
case "SV_DepthLessEqual":
|
|
{
|
|
return "oDepthLE";
|
|
}
|
|
case "SV_StencilRef":
|
|
{
|
|
return "oStencilRef"; // not in 3dmigoto
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
public static bool HasSpecialInputOutputName(USILOperandType operandType) => GetSpecialInputOutputName(operandType) != string.Empty;
|
|
public static string GetSpecialInputOutputName(USILOperandType operandType)
|
|
{
|
|
switch (operandType)
|
|
{
|
|
case USILOperandType.InputCoverageMask:
|
|
{
|
|
return "vCoverage";
|
|
}
|
|
case USILOperandType.InputThreadGroupID:
|
|
{
|
|
return "vThreadGroupID";
|
|
}
|
|
case USILOperandType.InputThreadID:
|
|
{
|
|
return "vThreadID";
|
|
}
|
|
case USILOperandType.InputThreadIDInGroup:
|
|
{
|
|
return "vThreadIDInGroup";
|
|
}
|
|
case USILOperandType.InputThreadIDInGroupFlattened:
|
|
{
|
|
return "vThreadIDInGroupFlattened";
|
|
}
|
|
case USILOperandType.InputPrimitiveID:
|
|
{
|
|
return "vPrim";
|
|
}
|
|
case USILOperandType.InputForkInstanceID:
|
|
{
|
|
return "vForkInstanceID";
|
|
}
|
|
case USILOperandType.InputGSInstanceID:
|
|
{
|
|
return "vGSInstanceID";
|
|
}
|
|
case USILOperandType.InputDomainPoint:
|
|
{
|
|
return "vDomain";
|
|
}
|
|
case USILOperandType.OutputControlPointID:
|
|
{
|
|
return "outputControlPointID"; // not in 3dmigoto
|
|
}
|
|
case USILOperandType.OutputDepth:
|
|
{
|
|
return "oDepth";
|
|
}
|
|
case USILOperandType.OutputCoverageMask:
|
|
{
|
|
return "oMask";
|
|
}
|
|
case USILOperandType.OutputDepthGreaterEqual:
|
|
{
|
|
return "oDepthGE";
|
|
}
|
|
case USILOperandType.OutputDepthLessEqual:
|
|
{
|
|
return "oDepthLE";
|
|
}
|
|
case USILOperandType.StencilRef:
|
|
{
|
|
return "oStencilRef"; // not in 3dmigoto
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
public static string GetOSGNFormatName(OSGN.Output output)
|
|
{
|
|
int maskSize = GetMaskSize(output.mask);
|
|
return ((FormatType)output.format).ToString() + (maskSize != 1 ? maskSize : "");
|
|
}
|
|
|
|
public static int GetMaskSize(byte mask)
|
|
{
|
|
int p = 0;
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
if ((mask >> i & 1) == 1)
|
|
{
|
|
p++;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
}
|