Files
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

143 lines
3.9 KiB
HLSL

//Grass Batches
#define GRASS_BATCH_NUM_CONSTS_PER_INSTANCE (3)
#define GRASS_BATCH_SHARED_DATA_COUNT (8)
#define GRASS_BATCH_CS_CULLING ((1 && (__D3D11 && RSG_PC)) || (1 && RSG_DURANGO) || (1 && RSG_ORBIS)) //(1 && (__SHADERMODEL >= 40))
#define GRASS_BATCH_CS_THREADS_PER_WAVEFRONT 64
#if GRASS_BATCH_CS_CULLING
# define GRASS_BATCH_CS_CULLING_SWITCH(_if_CS_,_else_) _if_CS_
#else
# define GRASS_BATCH_CS_CULLING_SWITCH(_if_CS_,_else_) _else_
#endif
#if defined(__SHADERMODEL)
# define CASCADE_SHADOWS_SCAN_NUM_PLANES 16 //See ScanCascadeShadows.h (Only define for shaders.)
//Grass batch instanced vert stream is interpreted by the input assembler/fetch shader. I don't think that'll work for the CS.
struct BatchRawInstanceData //grassBatchRawInstanceData
{
uint PosXY_u16;
uint PosZ_u16_NormXY_u8;
uint ColorRGB_Scale_u8;
uint Ao_Pad3_u8;
};
struct BatchCSInstanceData
{
//BatchRawInstanceData raw;
uint InstId_u16_CrossFade_Scale_u8;
};
//This is now in the raw structured buffer!
struct BatchInstanceData
{
float2 pos : BLENDWEIGHT;
float posZ : TEXCOORD1;
float2 normal : TEXCOORD2;
float4 color_scale : TEXCOORD3;
float4 ao_pad3 : TEXCOORD7;
};
struct BatchGlobalData
{
float4 worldMatA : TEXCOORD4;
float4 worldMatB : TEXCOORD5;
float4 worldMatC : TEXCOORD6;
};
struct BatchComputeData
{
uint InstId;
float CrossFade;
float Scale;
};
BatchInstanceData ExpandRawInstanceDataBigEndian(BatchRawInstanceData raw)
{
BatchInstanceData OUT;
uint3 pos;
pos.x = (raw.PosXY_u16 >> 16) & 0xFFFF;
pos.y = (raw.PosXY_u16) & 0xFFFF;
pos.z = (raw.PosZ_u16_NormXY_u8 >> 16) & 0xFFFF;
uint2 normal;
normal.x = (raw.PosZ_u16_NormXY_u8 >> 8) & 0xFF;
normal.y = (raw.PosZ_u16_NormXY_u8) & 0xFF;
uint3 color;
color.r = (raw.ColorRGB_Scale_u8 >> 24) & 0xFF;
color.g = (raw.ColorRGB_Scale_u8 >> 16) & 0xFF;
color.b = (raw.ColorRGB_Scale_u8 >> 8) & 0xFF;
uint scale = (raw.ColorRGB_Scale_u8) & 0xFF;
uint aoScale = (raw.Ao_Pad3_u8 >> 24) & 0xFF;
OUT.pos = ((float2)pos.xy) / 65535.0f;
OUT.posZ = ((float)pos.z) / 65535.0f;
OUT.normal = ((float2)normal) / 255.0f;
OUT.color_scale.rgb = ((float3)color) / 255.0f;
OUT.color_scale.w = ((float)scale) / 255.0f;
OUT.ao_pad3 = ((float)aoScale) / 255.0f;
return OUT;
}
BatchInstanceData ExpandRawInstanceData(BatchRawInstanceData raw)
{
//Since we are bit-shifting binary data, need to remember endian order...
BatchInstanceData OUT;
uint3 pos;
pos.x = (raw.PosXY_u16) & 0xFFFF;
pos.y = (raw.PosXY_u16 >> 16) & 0xFFFF;
pos.z = (raw.PosZ_u16_NormXY_u8) & 0xFFFF;
uint2 normal;
normal.x = (raw.PosZ_u16_NormXY_u8 >> 16) & 0xFF;
normal.y = (raw.PosZ_u16_NormXY_u8 >> 24) & 0xFF;
uint3 color;
color.r = (raw.ColorRGB_Scale_u8) & 0xFF;
color.g = (raw.ColorRGB_Scale_u8 >> 8) & 0xFF;
color.b = (raw.ColorRGB_Scale_u8 >> 16) & 0xFF;
uint scale = (raw.ColorRGB_Scale_u8 >> 24) & 0xFF;
uint aoScale = (raw.Ao_Pad3_u8) & 0xFF;
OUT.pos = ((float2)pos.xy) / 65535.0f;
OUT.posZ = ((float)pos.z) / 65535.0f;
OUT.normal = ((float2)normal) / 255.0f;
OUT.color_scale.rgb = ((float3)color) / 255.0f;
OUT.color_scale.w = ((float)scale) / 255.0f;
OUT.ao_pad3 = ((float)aoScale) / 255.0f;
return OUT;
}
BatchComputeData ExpandComputeData(BatchCSInstanceData csData)
{
BatchComputeData OUT;
OUT.InstId = csData.InstId_u16_CrossFade_Scale_u8 & 0xFFFF;
uint crossFade = (csData.InstId_u16_CrossFade_Scale_u8 >> 16) & 0xFF;
uint scale = (csData.InstId_u16_CrossFade_Scale_u8 >> 24) & 0xFF;
OUT.CrossFade = ((float) crossFade) / 255.0f;
OUT.Scale = ((float) scale) / 255.0f;
return OUT;
}
#else
# define GrassBatchCSInstanceData_Size (sizeof(u32) * 1)
# define GrassBatchCSInstanceData_Align (4) //4 is min size for PS4?
# if GRASS_BATCH_CS_CULLING
# define GRASS_BATCH_CS_CULLING_ONLY(...) __VA_ARGS__
# else
# define GRASS_BATCH_CS_CULLING_ONLY(...)
# endif
#endif