94 lines
2.3 KiB
HLSL
94 lines
2.3 KiB
HLSL
float3 centerEyePos()
|
|
{
|
|
#if defined(UNITY_STEREO_MULTIVIEW_ENABLED) || defined(UNITY_STEREO_INSTANCING_ENABLED)
|
|
return 0.5 * (unity_StereoWorldSpaceCameraPos[0] + unity_StereoWorldSpaceCameraPos[1]);
|
|
#else
|
|
return _WorldSpaceCameraPos;
|
|
#endif
|
|
}
|
|
|
|
/** Rotates a particle to face the camera in a more vr-correct way than unity's default particle system
|
|
*
|
|
*/
|
|
|
|
float3 particle_face_camera(float3 vertex, inout float3 normal, inout float3 center)
|
|
{
|
|
vertex.xyz -= center;
|
|
|
|
float3 head = centerEyePos();
|
|
float3 centerToEye = normalize(center-head);
|
|
float c2eXZLen = length(centerToEye.xz);
|
|
float sin1 = -centerToEye.y;
|
|
float cos1 = c2eXZLen;
|
|
float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1);
|
|
|
|
vertex.zy = mul(rotPitch, vertex.zy);
|
|
normal.zy = mul(rotPitch, normal.zy);
|
|
//tangent.zy = mul(rotPitch, tangent.zy);
|
|
|
|
float sin2 = centerToEye.x/c2eXZLen;
|
|
float cos2 = centerToEye.z/c2eXZLen;
|
|
float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2);
|
|
|
|
vertex.xz = mul(rotYaw,vertex.xz);
|
|
normal.xz = mul(rotYaw,normal.xz);
|
|
//tangent.xz = mul(rotYaw,tangent.xz);
|
|
|
|
vertex.xyz += center;
|
|
return vertex;
|
|
}
|
|
|
|
|
|
|
|
|
|
float3 ParticleFaceCamera(float3 vertex, float3 center)
|
|
{
|
|
vertex.xyz -= center;
|
|
|
|
float3 head = centerEyePos();
|
|
float3 centerToEye = normalize(center - head);
|
|
float c2eXZLen = length(centerToEye.xz);
|
|
float sin1 = -centerToEye.y;
|
|
float cos1 = c2eXZLen;
|
|
float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1);
|
|
|
|
vertex.zy = mul(rotPitch, vertex.zy);
|
|
|
|
|
|
float sin2 = centerToEye.x / c2eXZLen;
|
|
float cos2 = centerToEye.z / c2eXZLen;
|
|
float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2);
|
|
|
|
vertex.xz = mul(rotYaw, vertex.xz);
|
|
|
|
|
|
vertex.xyz += center;
|
|
return vertex;
|
|
}
|
|
|
|
float3 MeshFaceCamera(float3 vertex)
|
|
{
|
|
float3 center = float3(0,0,0);
|
|
//vertex = TransformObjectToWorld(vertex);
|
|
|
|
float3 head = TransformWorldToObject(centerEyePos());
|
|
float3 centerToEye = normalize(center - head);
|
|
float c2eXZLen = length(centerToEye.xz);
|
|
float sin1 = -centerToEye.y;
|
|
float cos1 = c2eXZLen;
|
|
float2x2 rotPitch = float2x2(cos1, sin1, -sin1, cos1);
|
|
|
|
vertex.zy = mul(rotPitch, vertex.zy);
|
|
|
|
|
|
float sin2 = centerToEye.x / c2eXZLen;
|
|
float cos2 = centerToEye.z / c2eXZLen;
|
|
float2x2 rotYaw = float2x2(cos2, sin2, -sin2, cos2);
|
|
|
|
vertex.xz = mul(rotYaw, vertex.xz);
|
|
|
|
|
|
//vertex.xyz += center;
|
|
return vertex;
|
|
}
|
|
|