You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.2 KiB
Plaintext
134 lines
3.2 KiB
Plaintext
|
4 years ago
|
#include "UnityCG.cginc"
|
||
|
|
|
||
|
|
#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(SHADER_API_PS4) || defined(SHADER_API_GLCORE) || defined(SHADER_API_VULKAN) || defined(SHADER_API_PSSL) || defined(SHADER_API_METAL)
|
||
|
|
#define STRUCTURED_BUFFER_SUPPORT 1
|
||
|
|
#else
|
||
|
|
#define STRUCTURED_BUFFER_SUPPORT 0
|
||
|
|
#endif
|
||
|
|
|
||
|
|
float3 _Position, _PositionOld;
|
||
|
|
float4 _Rotation, _RotationOld;
|
||
|
|
float3 _Scale, _ScaleOld;
|
||
|
|
float _PointSize;
|
||
|
|
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
StructuredBuffer<float3> _AlembicPoints;
|
||
|
|
StructuredBuffer<float3> _AlembicVelocities;
|
||
|
|
StructuredBuffer<int> _AlembicIDs;
|
||
|
|
int _AlembicHasVelocities;
|
||
|
|
int _AlembicHasIDs;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
float GetPointSize()
|
||
|
|
{
|
||
|
|
return _PointSize;
|
||
|
|
}
|
||
|
|
|
||
|
|
float3x3 ToF33(float4x4 v)
|
||
|
|
{
|
||
|
|
// (float3x3)v don't compile on some platforms
|
||
|
|
return float3x3(
|
||
|
|
v[0][0], v[0][1], v[0][2],
|
||
|
|
v[1][0], v[1][1], v[1][2],
|
||
|
|
v[2][0], v[2][1], v[2][2]);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
float4x4 Translate44(float3 t)
|
||
|
|
{
|
||
|
|
return float4x4(
|
||
|
|
1.0, 0.0, 0.0, t.x,
|
||
|
|
0.0, 1.0, 0.0, t.y,
|
||
|
|
0.0, 0.0, 1.0, t.z,
|
||
|
|
0.0, 0.0, 0.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
float4x4 Scale44(float3 s)
|
||
|
|
{
|
||
|
|
return float4x4(
|
||
|
|
s.x, 0.0, 0.0, 0.0,
|
||
|
|
0.0, s.y, 0.0, 0.0,
|
||
|
|
0.0, 0.0, s.x, 0.0,
|
||
|
|
0.0, 0.0, 0.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
// q: quaternion
|
||
|
|
float4x4 Rotate44(float4 q)
|
||
|
|
{
|
||
|
|
return float4x4(
|
||
|
|
1.0-2.0*q.y*q.y - 2.0*q.z*q.z, 2.0*q.x*q.y - 2.0*q.z*q.w, 2.0*q.x*q.z + 2.0*q.y*q.w, 0.0,
|
||
|
|
2.0*q.x*q.y + 2.0*q.z*q.w, 1.0 - 2.0*q.x*q.x - 2.0*q.z*q.z, 2.0*q.y*q.z - 2.0*q.x*q.w, 0.0,
|
||
|
|
2.0*q.x*q.z - 2.0*q.y*q.w, 2.0*q.y*q.z + 2.0*q.x*q.w, 1.0 - 2.0*q.x*q.x - 2.0*q.y*q.y, 0.0,
|
||
|
|
0.0, 0.0, 0.0, 1.0 );
|
||
|
|
}
|
||
|
|
|
||
|
|
float3 Cross(float3 l, float3 r)
|
||
|
|
{
|
||
|
|
return float3(
|
||
|
|
l.y * r.z - l.z * r.y,
|
||
|
|
l.z * r.x - l.x * r.z,
|
||
|
|
l.x * r.y - l.y * r.x);
|
||
|
|
}
|
||
|
|
|
||
|
|
// q: quaternion
|
||
|
|
float3 Rotate(float4 q, float3 p)
|
||
|
|
{
|
||
|
|
float3 a = cross(q.xyz, p);
|
||
|
|
float3 b = cross(q.xyz, a);
|
||
|
|
return p + (a * q.w + b) * 2.0;
|
||
|
|
}
|
||
|
|
|
||
|
|
float3 GetAlembicPoint(int iid)
|
||
|
|
{
|
||
|
|
return
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
Rotate(_Rotation, _AlembicPoints[iid] * _Scale) + _Position;
|
||
|
|
#else
|
||
|
|
float3(0,0,0);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
float3 GetAlembicVelocity(int iid)
|
||
|
|
{
|
||
|
|
return
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
Rotate(_Rotation, _AlembicVelocities[iid] * _Scale);
|
||
|
|
#else
|
||
|
|
float3(0, 0, 0);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
int GetAlembicID(int iid)
|
||
|
|
{
|
||
|
|
return
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
_AlembicIDs[iid];
|
||
|
|
#else
|
||
|
|
0;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
float4x4 GetPointMatrix(int iid)
|
||
|
|
{
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
float3 ppos = Rotate(_Rotation, _AlembicPoints[iid] * _Scale) + _Position;
|
||
|
|
float4 prot = _Rotation;
|
||
|
|
float3 pscale = _Scale * _PointSize;
|
||
|
|
return mul(mul(Translate44(ppos), Rotate44(prot)), Scale44(pscale));
|
||
|
|
#else
|
||
|
|
return unity_ObjectToWorld;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
float4x4 GetPointMatrixOld(int iid)
|
||
|
|
{
|
||
|
|
#if STRUCTURED_BUFFER_SUPPORT
|
||
|
|
float3 ppos = Rotate(_RotationOld, (_AlembicPoints[iid] - _AlembicVelocities[iid]) * _ScaleOld) + _PositionOld;
|
||
|
|
float4 prot = _RotationOld;
|
||
|
|
float3 pscale = _ScaleOld * _PointSize;
|
||
|
|
return mul(mul(Translate44(ppos), Rotate44(prot)), Scale44(pscale));
|
||
|
|
#else
|
||
|
|
return unity_ObjectToWorld;
|
||
|
|
#endif
|
||
|
|
}
|