summaryrefslogtreecommitdiff
path: root/Runtime/GfxDevice/TransformState.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/GfxDevice/TransformState.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/GfxDevice/TransformState.h')
-rw-r--r--Runtime/GfxDevice/TransformState.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/TransformState.h b/Runtime/GfxDevice/TransformState.h
new file mode 100644
index 0000000..ef56382
--- /dev/null
+++ b/Runtime/GfxDevice/TransformState.h
@@ -0,0 +1,64 @@
+#pragma once
+
+#include "GfxDeviceTypes.h"
+#include "Runtime/Math/Matrix4x4.h"
+#include "BuiltinShaderParams.h"
+
+struct TransformState
+{
+ enum {
+ kWorldDirty = (1<<0),
+ kViewDirty = (1<<1),
+ kProjDirty = (1<<2),
+
+ kWorldViewDirty = (kWorldDirty | kViewDirty),
+ kViewProjDirty = (kViewDirty | kProjDirty),
+ kWorldViewProjDirty = (kWorldDirty | kViewDirty | kProjDirty),
+ };
+
+ Matrix4x4f worldMatrix;
+ Matrix4x4f projectionMatrixOriginal; // Originally set from Unity code
+
+ Matrix4x4f texMatrices[kMaxSupportedTextureCoords];
+
+ // cache
+ mutable Matrix4x4f worldViewMatrix;
+
+ mutable volatile UInt32 dirtyFlags;
+
+public:
+ void Invalidate(BuiltinShaderParamValues& builtins);
+ void UpdateWorldViewMatrix (const BuiltinShaderParamValues& builtins) const;
+ void SetViewMatrix (const float matrix[16], BuiltinShaderParamValues& builtins);
+};
+
+inline void TransformState::Invalidate(BuiltinShaderParamValues& builtins)
+{
+ worldViewMatrix.SetIdentity();
+ worldMatrix.SetIdentity();
+ builtins.GetWritableMatrixParam(kShaderMatView).SetIdentity();
+ builtins.GetWritableMatrixParam(kShaderMatProj).SetIdentity();
+ builtins.GetWritableMatrixParam(kShaderMatViewProj).SetIdentity();
+ projectionMatrixOriginal.SetIdentity();
+ dirtyFlags = kWorldViewProjDirty;
+}
+
+inline void TransformState::UpdateWorldViewMatrix (const BuiltinShaderParamValues& builtins) const
+{
+ if (dirtyFlags & kWorldViewDirty)
+ {
+ MultiplyMatrices4x4 (&builtins.GetMatrixParam(kShaderMatView), &worldMatrix, &worldViewMatrix);
+ dirtyFlags &= ~kWorldViewDirty;
+ }
+}
+
+inline void TransformState::SetViewMatrix (const float matrix[16], BuiltinShaderParamValues& builtins)
+{
+ dirtyFlags |= TransformState::kWorldViewDirty;
+ Matrix4x4f& viewMat = builtins.GetWritableMatrixParam(kShaderMatView);
+ const Matrix4x4f& projMat = builtins.GetMatrixParam(kShaderMatProj);
+ Matrix4x4f& viewProjMat = builtins.GetWritableMatrixParam(kShaderMatViewProj);
+ CopyMatrix (matrix, viewMat.GetPtr());
+ MultiplyMatrices4x4 (&projMat, &viewMat, &viewProjMat);
+ worldMatrix = Matrix4x4f::identity;
+}