File indexing completed on 2026-11-08 10:23:57
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef _OpenGl_MatrixState_H__
0017 #define _OpenGl_MatrixState_H__
0018
0019 #include <OpenGl_Vec.hxx>
0020 #include <NCollection_DynamicArray.hxx>
0021 #include <Standard_Dump.hxx>
0022
0023
0024 template <class T>
0025 class OpenGl_MatrixState
0026 {
0027 public:
0028
0029 OpenGl_MatrixState()
0030 : myStack(8),
0031 myStackHead(-1)
0032 {
0033
0034 }
0035
0036
0037 void Push()
0038 {
0039 if (++myStackHead >= myStack.Length())
0040 {
0041 myStack.Append(myCurrent);
0042 }
0043 else
0044 {
0045 myStack.SetValue(myStackHead, myCurrent);
0046 }
0047 }
0048
0049
0050 void Pop()
0051 {
0052 Standard_ASSERT_RETURN(myStackHead != -1,
0053 "Matrix stack already empty when MatrixState.Pop() called.",
0054 Standard_VOID_RETURN);
0055 myCurrent = myStack.Value(myStackHead--);
0056 }
0057
0058
0059 const typename OpenGl::MatrixType<T>::Mat4& Current() { return myCurrent; }
0060
0061
0062 void SetCurrent(const typename OpenGl::MatrixType<T>::Mat4& theNewCurrent)
0063 {
0064 myCurrent = theNewCurrent;
0065 }
0066
0067
0068 typename OpenGl::MatrixType<T>::Mat4& ChangeCurrent() { return myCurrent; }
0069
0070
0071 template <typename Other_t>
0072 void SetCurrent(const typename OpenGl::MatrixType<Other_t>::Mat4& theNewCurrent)
0073 {
0074 myCurrent.Convert(theNewCurrent);
0075 }
0076
0077
0078 void SetIdentity() { myCurrent = typename OpenGl::MatrixType<T>::Mat4(); }
0079
0080
0081 void DumpJson(Standard_OStream& theOStream, int theDepth = -1) const
0082 {
0083 (void)theDepth;
0084 OCCT_DUMP_FIELD_VALUES_NUMERICAL(theOStream,
0085 "myCurrent",
0086 16,
0087 myCurrent.GetValue(0, 0),
0088 myCurrent.GetValue(0, 1),
0089 myCurrent.GetValue(0, 2),
0090 myCurrent.GetValue(0, 3),
0091 myCurrent.GetValue(1, 0),
0092 myCurrent.GetValue(1, 1),
0093 myCurrent.GetValue(1, 2),
0094 myCurrent.GetValue(1, 3),
0095 myCurrent.GetValue(2, 0),
0096 myCurrent.GetValue(2, 1),
0097 myCurrent.GetValue(2, 2),
0098 myCurrent.GetValue(2, 3),
0099 myCurrent.GetValue(3, 0),
0100 myCurrent.GetValue(3, 1),
0101 myCurrent.GetValue(3, 2),
0102 myCurrent.GetValue(3, 3))
0103
0104 OCCT_DUMP_FIELD_VALUE_NUMERICAL(theOStream, myStack.Length())
0105 OCCT_DUMP_FIELD_VALUE_NUMERICAL(theOStream, myStackHead)
0106 }
0107
0108 private:
0109
0110 NCollection_DynamicArray<typename OpenGl::MatrixType<T>::Mat4> myStack;
0111
0112 typename OpenGl::MatrixType<T>::Mat4 myCurrent;
0113 int myStackHead;
0114 };
0115
0116 #endif