| /*============================================================================= | |
| LocalVertexFactory.hlsl: Local vertex factory shader code. | |
| Copyright 1998-2008 Epic Games, Inc. All Rights Reserved. | |
| =============================================================================*/ | |
| float4x4 LocalToWorld; | |
| float4x4 PreviousLocalToWorld; | |
| float3x3 WorldToLocal; | |
| float4 ShadowCoordinateScaleBias; | |
| struct FVertexFactoryInput | |
| { | |
| float4 Position : POSITION; | |
| half3 TangentX : TANGENT; | |
| // TangentZ.w contains sign of tangent basis determinant | |
| half4 TangentZ : NORMAL; | |
| half4 Color : COLOR1; | |
| float2 TexCoords[NUM_MATERIAL_TEXCOORDS] : TEXCOORD0; | |
| float4 LightMapA : TEXCOORD5; | |
| float4 LightMapB : TEXCOORD6; | |
| float4 LightMapC : TEXCOORD7; | |
| float4 LightMapA : TEXCOORD5; | |
| float2 LightMapCoordinate : COLOR; | |
| }; | |
| struct FPositionOnlyVertexFactoryInput | |
| { | |
| float4 Position : POSITION; | |
| }; | |
| struct FVertexFactoryInterpolants | |
| { | |
| // xyz=normal w=determinant | |
| float4 TangentBasisNormal : COLOR0; | |
| float3 TangentBasisTangent : COLOR1; | |
| float4 Color : COLOR0; | |
| float2 LightMapCoordinate : TEXCOORD0; | |
| float4 TexCoords[(NUM_MATERIAL_TEXCOORDS+1)/2] : TEXCOORD1; | |
| float4 TexCoords[(NUM_MATERIAL_TEXCOORDS+1)/2] : TEXCOORD0; | |
| float4 Dummy : TEXCOORD0; | |
| }; | |
| FMaterialParameters GetMaterialParameters(FVertexFactoryInterpolants Interpolants) | |
| { | |
| FMaterialParameters Result; | |
| UNROLL | |
| for(int CoordinateIndex = 0;CoordinateIndex < NUM_MATERIAL_TEXCOORDS;CoordinateIndex += 2) | |
| { | |
| Result.TexCoords[CoordinateIndex] = Interpolants.TexCoords[CoordinateIndex/2].xy; | |
| if(CoordinateIndex + 1 < NUM_MATERIAL_TEXCOORDS) | |
| { | |
| Result.TexCoords[CoordinateIndex + 1] = Interpolants.TexCoords[CoordinateIndex/2].wz; | |
| } | |
| } | |
| Result.VertexColor = 1; | |
| Result.VertexColor = Interpolants.Color; | |
| Result.TangentNormal = 0; | |
| Result.TangentCameraVector = 0; | |
| Result.TangentReflectionVector = 0; | |
| Result.ScreenPosition = 0; | |
| Result.TangentLightVector = 0; | |
| Result.TangentBasisInverse = CalcInvTangentBasis(Interpolants.TangentBasisNormal,Interpolants.TangentBasisTangent); | |
| return Result; | |
| } | |
| float2 GetLightMapCoordinate(FVertexFactoryInterpolants Interpolants) | |
| { | |
| return Interpolants.LightMapCoordinate; | |
| } | |
| void VertexFactoryGetVertexLightMap(FVertexFactoryInput Input,out float4 LightMapA,out float4 LightMapB,out float4 LightMapC) | |
| { | |
| LightMapA = Input.LightMapA; | |
| LightMapB = Input.LightMapB; | |
| LightMapC = Input.LightMapC; | |
| } | |
| void VertexFactoryGetSimpleVertexLightMap(FVertexFactoryInput Input,out float4 LightMapA) | |
| { | |
| LightMapA = Input.LightMapA; | |
| } | |
| float4 CalcWorldPosition(FVertexFactoryInput Input) | |
| { | |
| return MulMatrix(LocalToWorld,Input.Position); | |
| } | |
| /** | |
| * Get the 3x3 tangent basis vectors for this vertex factory | |
| * this vertex factory will calculate the binormal on-the-fly | |
| * | |
| * @param Input - vertex input stream structure | |
| * @return 3x3 matrix | |
| */ | |
| float3x3 VertexFactoryGetTangentBasis( FVertexFactoryInput Input ) | |
| { | |
| float3x3 Result=0; | |
| half4 TangentZ = TangentBias(Input.TangentZ); | |
| // pass-thru the tangent | |
| Result[0] = TangentBias(Input.TangentX); | |
| // pass-thru the normal | |
| Result[2] = float3(TangentZ.x,TangentZ.y,TangentZ.z); | |
| // derive the binormal by getting the cross product of the normal and tangent | |
| Result[1] = cross(Result[2], Result[0]) * TangentZ.w; | |
| return Result; | |
| } | |
| float4 VertexFactoryGetWorldPosition(FVertexFactoryInput Input) | |
| { | |
| return CalcWorldPosition(Input); | |
| } | |
| FVertexFactoryInterpolants VertexFactoryGetInterpolants(FVertexFactoryInput Input) | |
| { | |
| FVertexFactoryInterpolants Interpolants; | |
| // Ensure the unused components of the last packed texture coordinate are initialized. | |
| Interpolants.TexCoords[(NUM_MATERIAL_TEXCOORDS + 1) / 2 - 1] = 0; | |
| UNROLL | |
| for(int CoordinateIndex = 0;CoordinateIndex < NUM_MATERIAL_TEXCOORDS;CoordinateIndex += 2) | |
| { | |
| Interpolants.TexCoords[CoordinateIndex / 2].xy = Input.TexCoords[CoordinateIndex]; | |
| if(CoordinateIndex + 1 < NUM_MATERIAL_TEXCOORDS) | |
| { | |
| Interpolants.TexCoords[CoordinateIndex / 2].wz = Input.TexCoords[CoordinateIndex + 1]; | |
| } | |
| } | |
| Interpolants.LightMapCoordinate = Input.LightMapCoordinate * ShadowCoordinateScaleBias.xy + ShadowCoordinateScaleBias.wz; | |
| Interpolants.TangentBasisNormal = TangentNorm(Input.TangentZ); | |
| Interpolants.TangentBasisTangent = TangentNorm(Input.TangentX); | |
| Interpolants.Color = Input.Color FCOLOR_COMPONENT_SWIZZLE; | |
| Interpolants.Dummy = float4(0,0,0,0); | |
| return Interpolants; | |
| } | |
| /** for depth-only pass */ | |
| float4 VertexFactoryGetWorldPosition(FPositionOnlyVertexFactoryInput Input) | |
| { | |
| return MulMatrix(LocalToWorld,Input.Position); | |
| } | |
| float4 VertexFactoryGetPreviousWorldPosition(FVertexFactoryInput Input) | |
| { | |
| return MulMatrix(PreviousLocalToWorld,Input.Position); | |
| } | |
| /** | |
| * Transform a vector from world space to tangent space | |
| * | |
| * @param Input - vertex input stream structure | |
| * @param TangentBasis - 3x3 matrix to transform to tangent space | |
| * @param WorldVector - vector in world space to transform | |
| * @return vector in tangent space | |
| */ | |
| float3 VertexFactoryWorldToTangentSpace( FVertexFactoryInput Input, float3x3 TangentBasis, float3 WorldVector ) | |
| { | |
| // we use a straight mul here because we are generating the matrix, so we don't worry about column major vs row major (which is what MulMatrix manages per-platform) | |
| return mul(TangentBasis, MulMatrix(WorldToLocal,WorldVector)); | |
| } | |
| half3 VertexFactoryGetWorldNormal(FVertexFactoryInput Input) | |
| { | |
| half4 Normal = TangentBias(Input.TangentZ); | |
| Normal.w = 0; | |
| half4 WorldNormal = MulMatrix( LocalToWorld, Normal ); | |
| return WorldNormal.xyz; | |
| } |
Xet Storage Details
- Size:
- 6.51 kB
- Xet hash:
- 1ab2a82e870f45bc17dfdce8436f664b9c1a2c7baaccaad01577bf9a3c1bca17
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.