62 lines
2.2 KiB
C#
62 lines
2.2 KiB
C#
using System.Runtime.InteropServices;
|
|
|
|
namespace T3.Core.Rendering;
|
|
|
|
[StructLayout(LayoutKind.Explicit, Size = 4 * 4 * 4 * 10)]
|
|
public struct TransformBufferLayout
|
|
{
|
|
public TransformBufferLayout(Matrix4x4 cameraToClipSpace, Matrix4x4 worldToCamera, Matrix4x4 objectToWorld)
|
|
{
|
|
Matrix4x4.Invert(cameraToClipSpace, out var clipSpaceToCamera);
|
|
Matrix4x4.Invert(worldToCamera, out var cameraToWorld);
|
|
Matrix4x4.Invert(objectToWorld, out var worldToObject);
|
|
|
|
WorldToClipSpace = Matrix4x4.Multiply(worldToCamera, cameraToClipSpace);
|
|
ClipSpaceToWorld = Matrix4x4.Multiply(clipSpaceToCamera, cameraToWorld);
|
|
ObjectToCamera = Matrix4x4.Multiply(objectToWorld, worldToCamera);
|
|
ObjectToClipSpace = Matrix4x4.Multiply(ObjectToCamera, cameraToClipSpace);
|
|
|
|
CameraToClipSpace = Matrix4x4.Transpose(cameraToClipSpace);
|
|
// transpose all as mem layout in hlsl constant buffer is row based
|
|
CameraToClipSpace = Matrix4x4.Transpose(cameraToClipSpace);
|
|
ClipSpaceToCamera = Matrix4x4.Transpose(clipSpaceToCamera);
|
|
WorldToCamera = Matrix4x4.Transpose(worldToCamera);
|
|
CameraToWorld = Matrix4x4.Transpose(cameraToWorld);
|
|
WorldToClipSpace = Matrix4x4.Transpose(WorldToClipSpace);
|
|
ClipSpaceToWorld = Matrix4x4.Transpose(ClipSpaceToWorld);
|
|
ObjectToWorld = Matrix4x4.Transpose(objectToWorld);
|
|
WorldToObject = Matrix4x4.Transpose(worldToObject);
|
|
ObjectToCamera = Matrix4x4.Transpose(ObjectToCamera);
|
|
ObjectToClipSpace = Matrix4x4.Transpose(ObjectToClipSpace);
|
|
}
|
|
|
|
[FieldOffset(0)]
|
|
public Matrix4x4 CameraToClipSpace;
|
|
|
|
[FieldOffset(64)]
|
|
public Matrix4x4 ClipSpaceToCamera;
|
|
|
|
[FieldOffset(128)]
|
|
public Matrix4x4 WorldToCamera;
|
|
|
|
[FieldOffset(192)]
|
|
public Matrix4x4 CameraToWorld;
|
|
|
|
[FieldOffset(256)]
|
|
public Matrix4x4 WorldToClipSpace;
|
|
|
|
[FieldOffset(320)]
|
|
public Matrix4x4 ClipSpaceToWorld;
|
|
|
|
[FieldOffset(384)]
|
|
public Matrix4x4 ObjectToWorld;
|
|
|
|
[FieldOffset(448)]
|
|
public Matrix4x4 WorldToObject;
|
|
|
|
[FieldOffset(512)]
|
|
public Matrix4x4 ObjectToCamera;
|
|
|
|
[FieldOffset(576)]
|
|
public Matrix4x4 ObjectToClipSpace;
|
|
} |