Files
tooll3--t3/Core/Rendering/TransformBufferLayout.cs
2026-07-13 13:13:17 +08:00

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;
}