diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/GfxDevice/TransformState.h |
Diffstat (limited to 'Runtime/GfxDevice/TransformState.h')
-rw-r--r-- | Runtime/GfxDevice/TransformState.h | 64 |
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; +} |