Buckets:
| /*============================================================================= | |
| ParticleBeamTrailVertexFactory.hlsl: Particle vertex factory shader code. | |
| Copyright 1998-2008 Epic Games, Inc. All Rights Reserved. | |
| =============================================================================*/ | |
| float4 CameraWorldPosition; | |
| float4 CameraRight; | |
| float4 CameraUp; | |
| float4 ScreenAlignment; | |
| float4x4 LocalToWorld; | |
| struct FVertexFactoryInput | |
| { | |
| float4 Position : POSITION; | |
| float4 OldPosition : NORMAL; | |
| float3 Size : TANGENT; | |
| float2 TexCoord : TEXCOORD0; | |
| float Rotation : BLENDWEIGHT0; | |
| float4 Color : TEXCOORD1; | |
| }; | |
| struct FVertexFactoryInterpolants | |
| { | |
| #if WORLD_COORDS | |
| // xyz=normal w=determinant | |
| float4 TangentBasisNormal : COLOR0; | |
| float3 TangentBasisTangent : COLOR1; | |
| #endif | |
| float2 TexCoord : TEXCOORD0; | |
| float4 Color : TEXCOORD1; | |
| }; | |
| FMaterialParameters GetMaterialParameters(FVertexFactoryInterpolants Interpolants) | |
| { | |
| FMaterialParameters Result; | |
| #if NUM_MATERIAL_TEXCOORDS | |
| for(int CoordinateIndex = 0;CoordinateIndex < NUM_MATERIAL_TEXCOORDS;CoordinateIndex++) | |
| Result.TexCoords[CoordinateIndex] = Interpolants.TexCoord; | |
| #endif | |
| Result.VertexColor = Interpolants.Color; | |
| Result.TangentNormal = 0; | |
| Result.TangentCameraVector = 0; | |
| Result.TangentReflectionVector = 0; | |
| Result.TangentLightVector = 0; | |
| Result.ScreenPosition = 0; | |
| #if WORLD_COORDS | |
| Result.TangentBasisInverse = CalcInvTangentBasis(Interpolants.TangentBasisNormal,Interpolants.TangentBasisTangent); | |
| #endif | |
| return Result; | |
| } | |
| #if !VERTEX_LIGHTMAP // AJS: If this is an emissive+vertex light-map shader, we can save an interpolator by skipping the light-map coordinate. | |
| float2 GetLightMapCoordinate(FVertexFactoryInterpolants Interpolants) | |
| { | |
| return Interpolants.TexCoord; | |
| } | |
| #endif //#if !VERTEX_LIGHTMAP | |
| float3 SafeNormalize(float3 V) | |
| { | |
| return V / sqrt(max(dot(V,V),0.01)); | |
| } | |
| void GetTangents(FVertexFactoryInput Input,out float4 Right,out float4 Up) | |
| { | |
| float4 Position = MulMatrix( LocalToWorld, Input.Position ), | |
| OldPosition = MulMatrix( LocalToWorld, Input.OldPosition ); | |
| float3 CameraDirection = SafeNormalize(CameraWorldPosition.xyz - Position.xyz), | |
| ParticleDirection = SafeNormalize(Position.xyz - OldPosition.xyz); | |
| float4 Right_Square = CameraRight, | |
| Up_Square = CameraUp; | |
| float4 Right_Rotated = (-1.0 * cos(Input.Rotation) * Up_Square) + (sin(Input.Rotation) * Right_Square), | |
| Up_Rotated = ( sin(Input.Rotation) * Up_Square) + (cos(Input.Rotation) * Right_Square); | |
| float4 Right_Velocity = float4( SafeNormalize( cross( CameraDirection, ParticleDirection ) ), 0.0 ), | |
| Up_Velocity = float4( ParticleDirection, 0.0 ); | |
| // enum EParticleScreenAlignment | |
| // { | |
| // PSA_Square, | |
| // PSA_Rectangle, | |
| // PSA_Velocity | |
| // }; | |
| Right = ScreenAlignment.x > 1.5f ? Right_Velocity : Right_Rotated; | |
| Up = ScreenAlignment.x > 1.5f ? Up_Velocity : Up_Rotated; | |
| } | |
| float4 CalcWorldPosition(FVertexFactoryInput Input) | |
| { | |
| float4 TempPos = Input.Position; | |
| float4 Right; | |
| float4 Up; | |
| GetTangents(Input,Right,Up); | |
| // float4 WorldPosition = mul(LocalToWorld,TempPos); | |
| // WorldPosition += Input.Size.y * (Input.TexCoord.y - 0.5) * Up; | |
| float4 WorldPosition = MulMatrix(LocalToWorld,TempPos); | |
| return WorldPosition; | |
| } | |
| /** derive basis vectors */ | |
| float3x3 CalcTangentBasis(FVertexFactoryInput Input) | |
| { | |
| float4 Right, | |
| Up; | |
| GetTangents(Input,Right,Up); | |
| return float3x3( | |
| Right.xyz, | |
| Up.xyz, | |
| -normalize(cross(Right.xyz,Up.xyz)) | |
| ); | |
| } | |
| float4 VertexFactoryGetWorldPosition(FVertexFactoryInput Input) | |
| { | |
| return CalcWorldPosition(Input); | |
| } | |
| FVertexFactoryInterpolants VertexFactoryGetInterpolants(FVertexFactoryInput Input) | |
| { | |
| FVertexFactoryInterpolants Interpolants; | |
| Interpolants.TexCoord = Input.TexCoord; | |
| Interpolants.Color = Input.Color; | |
| #if WORLD_COORDS | |
| float3x3 TangentBasis = CalcTangentBasis(Input); | |
| Interpolants.TangentBasisNormal = float4(TangentBasis[2],determinant(TangentBasis)) * 0.5 + 0.5; | |
| Interpolants.TangentBasisTangent = TangentBasis[0] * 0.5 + 0.5; | |
| #endif | |
| return Interpolants; | |
| } | |
| float4 VertexFactoryGetPreviousWorldPosition(FVertexFactoryInput Input) | |
| { | |
| return VertexFactoryGetWorldPosition(Input); | |
| } | |
| /** | |
| * Get the 3x3 tangent basis vectors for this vertex factory | |
| * | |
| * @param Input - vertex input stream structure | |
| * @return 3x3 matrix | |
| */ | |
| float3x3 VertexFactoryGetTangentBasis( FVertexFactoryInput Input ) | |
| { | |
| return CalcTangentBasis(Input); | |
| } | |
| /** | |
| * 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, | |
| WorldVector | |
| ); | |
| } | |
| half3 VertexFactoryGetWorldNormal(FVertexFactoryInput Input) | |
| { | |
| float3x3 TangentBasis = VertexFactoryGetTangentBasis(Input); | |
| return TangentBasis[2]; | |
| } | |
Xet Storage Details
- Size:
- 5.34 kB
- Xet hash:
- 29d28d31ae26971b5f3461b7d1d2961aa19ba42d9acc5b55ccf851d8681deeea
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.