]> git.cworth.org Git - vogl/blob - src/vogleditor/vogleditor_statetreetexenvitem.cpp
Initial vogl checkin
[vogl] / src / vogleditor / vogleditor_statetreetexenvitem.cpp
1 #include "vogleditor_statetreetexenvitem.h"
2 #include "vogl_texenv_state.h"
3
4
5 vogleditor_stateTreeTexEnvStateVecDiffableItem::vogleditor_stateTreeTexEnvStateVecDiffableItem(GLenum target, GLenum enumId, unsigned int index, unsigned int numComponents, QString name, QString value, vogleditor_stateTreeItem* parent)
6 : vogleditor_stateTreeStateVecDiffableItem(name, value, parent),
7   m_target(target),
8   m_name(enumId),
9   m_index(index),
10   m_numComponents(numComponents),
11   m_pDiffBaseInfo(NULL),
12   m_pDiffBaseState(NULL)
13 {
14 }
15
16 //=============================================================================
17
18 vogleditor_stateTreeTexEnvStateVecEnumItem::vogleditor_stateTreeTexEnvStateVecEnumItem(GLenum target, QString glenumName, GLenum name, unsigned int index, int* values, unsigned int numComponents, vogleditor_stateTreeItem* parent, vogl_texenv_state& state)
19     : vogleditor_stateTreeTexEnvStateVecDiffableItem(target, name, index, numComponents, glenumName, "", parent),
20     m_pState(&state)
21 {
22     setValue(getValueFromEnums(values, numComponents));
23 }
24
25 bool vogleditor_stateTreeTexEnvStateVecEnumItem::hasChanged() const
26 {
27     if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
28         return false;
29
30     if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
31     {
32         // this index did not exist in the base state, so it must be new
33         return true;
34     }
35
36     int curVals[4] = {0,0,0,0};
37     int baseVals[4] = {0,0,0,0};
38     if (m_pState->get_state(m_target).get<int>(m_name, m_index, curVals, m_numComponents) &&
39         m_pDiffBaseState->get_state(m_target).get<int>(m_name, m_index, baseVals, m_numComponents))
40     {
41         return curVals[0] != baseVals[0] || curVals[1] != baseVals[1] || curVals[2] != baseVals[2] || curVals[3] != baseVals[3];
42     }
43     else
44     {
45         // the values could not be obtained from both states, so something must have changed
46         return true;
47     }
48 }
49
50 QString vogleditor_stateTreeTexEnvStateVecEnumItem::getDiffedValue() const
51 {
52     if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
53         return "";
54
55     if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
56     {
57         // this index did not exist in the base state, so it must be new
58         return "non-existent";
59     }
60
61     int baseVals[4] = {0,0,0,0};
62     if (m_pDiffBaseState->get_state(m_target).get<int>(m_name, m_index, baseVals, m_numComponents))
63     {
64         return getValueFromEnums(baseVals, m_numComponents);
65     }
66     else
67     {
68         // the values could not be obtained from both states, so something must have changed
69         return "non-existent";
70     }
71 }
72
73 //=============================================================================
74
75 vogleditor_stateTreeTexEnvStateVecFloatItem::vogleditor_stateTreeTexEnvStateVecFloatItem(GLenum target, QString glenumName, GLenum name, unsigned int index, float* values, unsigned int numComponents, vogleditor_stateTreeItem* parent, vogl_texenv_state& state)
76     : vogleditor_stateTreeTexEnvStateVecDiffableItem(target, name, index, numComponents, glenumName, "", parent),
77       m_pState(&state)
78 {
79     setValue(getValueFromFloats(values, numComponents));
80 }
81
82 bool vogleditor_stateTreeTexEnvStateVecFloatItem::hasChanged() const
83 {
84     if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
85         return false;
86
87     if (m_index >= this->m_pDiffBaseInfo->get_max_texture_coords())
88     {
89         // this index did not exist in the base state, so it must be new
90         return true;
91     }
92
93     float curVals[4] = {0,0,0,0};
94     float baseVals[4] = {0,0,0,0};
95     if (m_pState->get_state(m_target).get<float>(m_name, m_index, curVals, m_numComponents) &&
96         m_pDiffBaseState->get_state(m_target).get<float>(m_name, m_index, baseVals, m_numComponents))
97     {
98         return curVals[0] != baseVals[0] || curVals[1] != baseVals[1] || curVals[2] != baseVals[2] || curVals[3] != baseVals[3];
99     }
100     else
101     {
102         // the values could not be obtained from both states, so something must have changed
103         return true;
104     }
105 }
106
107 QString vogleditor_stateTreeTexEnvStateVecFloatItem::getDiffedValue() const
108 {
109     if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
110         return "";
111
112     if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
113     {
114         // this index did not exist in the base state, so it must be new
115         return "non-existent";
116     }
117
118     float baseVals[4] = {0,0,0,0};
119     if (m_pDiffBaseState->get_state(m_target).get<float>(m_name, m_index, baseVals, m_numComponents))
120     {
121         return getValueFromFloats(baseVals, m_numComponents);
122     }
123     else
124     {
125         // the values could not be obtained from both states, so something must have changed
126         return "non-existent";
127     }
128 }
129 //=============================================================================
130
131 vogleditor_stateTreeTexEnvItem::vogleditor_stateTreeTexEnvItem(QString name, vogleditor_stateTreeItem* parent, vogl_texenv_state& state, const vogl_context_info& info)
132     : vogleditor_stateTreeItem(name, "", parent),
133       m_pState(&state),
134       m_pDiffBaseState(NULL),
135       m_pDiffBaseInfo(NULL)
136 {
137     QString tmp;
138     for (uint texcoord_index = 0; texcoord_index < info.get_max_texture_coords(); texcoord_index++)
139     {
140         vogleditor_stateTreeItem* pTexNode = new vogleditor_stateTreeItem(tmp.sprintf("GL_TEXTURE%u", texcoord_index), "", this);
141         this->appendChild(pTexNode);
142
143         int iVals[4] = {0,0,0,0};
144         float fVals[4] = {0,0,0,0};
145 #define GET_ENUM(target, idx, name, num) if (m_pState->get_state(target).get<int>(name, idx, iVals, num)) { vogleditor_stateTreeTexEnvStateVecEnumItem* pItem = new vogleditor_stateTreeTexEnvStateVecEnumItem(target, #name, name, idx, iVals, num, pTexNode, *m_pState); m_diffableItems.push_back(pItem); pTexNode->appendChild(pItem); }
146 #define GET_FLOAT(target, idx, name, num) if (m_pState->get_state(target).get<float>(name, idx, fVals, num)) { vogleditor_stateTreeTexEnvStateVecFloatItem* pItem = new vogleditor_stateTreeTexEnvStateVecFloatItem(target, #name, name, idx, fVals, num, pTexNode, *m_pState); m_diffableItems.push_back(pItem); pTexNode->appendChild(pItem); }
147
148         GET_FLOAT(GL_TEXTURE_FILTER_CONTROL, texcoord_index, GL_TEXTURE_LOD_BIAS, 1);
149         GET_ENUM(GL_POINT_SPRITE, texcoord_index, GL_COORD_REPLACE, 1);
150         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_TEXTURE_ENV_MODE, 1);
151         GET_FLOAT(GL_TEXTURE_ENV, texcoord_index, GL_TEXTURE_ENV_COLOR, 4);
152         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_COMBINE_RGB, 1);
153         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_COMBINE_ALPHA, 1);
154         GET_FLOAT(GL_TEXTURE_ENV, texcoord_index, GL_RGB_SCALE, 1);
155         GET_FLOAT(GL_TEXTURE_ENV, texcoord_index, GL_ALPHA_SCALE, 1);
156         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC0_RGB, 1);
157         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC1_RGB, 1);
158         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC2_RGB, 1);
159         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC0_ALPHA, 1);
160         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC1_ALPHA, 1);
161         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_SRC2_ALPHA, 1);
162         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND0_RGB, 1);
163         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND1_RGB, 1);
164         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND2_RGB, 1);
165         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND0_ALPHA, 1);
166         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND1_ALPHA, 1);
167         GET_ENUM(GL_TEXTURE_ENV, texcoord_index, GL_OPERAND2_ALPHA, 1);
168
169         // TODO:
170         //{ "glGetTexEnv",      'E',    1,      "GL_SOURCE3_RGB_NV",  0x8583},
171         //{ "glGetTexEnv",      'E',    1,      "GL_SOURCE3_ALPHA_NV",  0x858B},
172         //{ "glGetTexEnv",      'E',    1,      "GL_OPERAND3_RGB_NV",  0x8593},
173         //{ "glGetTexEnv",      'E',    1,      "GL_OPERAND3_ALPHA_NV",  0x859B},
174         //{ "glGetTexEnv",      'E',    1,      "GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV",  0x86D9},
175         //{ "glGetTexEnv",      'E',    1,      "GL_SHADER_OPERATION_NV",  0x86DF},
176         //{ "glGetTexEnv",      'E',    4,      "GL_CULL_MODES_NV",  0x86E0},
177         //{ "glGetTexEnv",      'F',    4,      "GL_OFFSET_TEXTURE_MATRIX_NV",  0x86E1},
178         //{ "glGetTexEnv",      'F',    1,      "GL_OFFSET_TEXTURE_SCALE_NV",  0x86E2},
179         //{ "glGetTexEnv",      'F',    1,      "GL_OFFSET_TEXTURE_BIAS_NV",  0x86E3},
180         //{ "glGetTexEnv",      'E',    1,      "GL_PREVIOUS_TEXTURE_INPUT_NV",  0x86E4},
181         //{ "glGetTexEnv",      'F',    3,      "GL_CONST_EYE_NV",  0x86E5},
182         //{ "glGetTexEnv",      'E',    1,      "GL_BUMP_TARGET_ATI",  0x877C},
183
184 #undef GET_FLOAT
185 #undef GET_ENUM
186 #define GET_ENUM(target, idx, name, num) if (m_pState->get_state(target).get<int>(name, idx, iVals, num)) { vogleditor_stateTreeTexEnvStateVecEnumItem* pItem = new vogleditor_stateTreeTexEnvStateVecEnumItem(target, #target " " #name, name, idx, iVals, num, pTexNode, *m_pState); m_diffableItems.push_back(pItem); pTexNode->appendChild(pItem); }
187 #define GET_FLOAT(target, idx, name, num) if (m_pState->get_state(target).get<float>(name, idx, fVals, num)) { vogleditor_stateTreeTexEnvStateVecFloatItem* pItem = new vogleditor_stateTreeTexEnvStateVecFloatItem(target, #target " " #name, name, idx, fVals, num, pTexNode, *m_pState); m_diffableItems.push_back(pItem); pTexNode->appendChild(pItem); }
188
189         GET_ENUM(GL_S, texcoord_index, GL_TEXTURE_GEN_MODE, 1);
190         GET_FLOAT(GL_S, texcoord_index, GL_OBJECT_PLANE, 4);
191         GET_FLOAT(GL_S, texcoord_index, GL_EYE_PLANE, 4);
192
193         GET_ENUM(GL_T, texcoord_index, GL_TEXTURE_GEN_MODE, 1);
194         GET_FLOAT(GL_T, texcoord_index, GL_OBJECT_PLANE, 4);
195         GET_FLOAT(GL_T, texcoord_index, GL_EYE_PLANE, 4);
196
197         GET_ENUM(GL_R, texcoord_index, GL_TEXTURE_GEN_MODE, 1);
198         GET_FLOAT(GL_R, texcoord_index, GL_OBJECT_PLANE, 4);
199         GET_FLOAT(GL_R, texcoord_index, GL_EYE_PLANE, 4);
200
201         GET_ENUM(GL_Q, texcoord_index, GL_TEXTURE_GEN_MODE, 1);
202         GET_FLOAT(GL_Q, texcoord_index, GL_OBJECT_PLANE, 4);
203         GET_FLOAT(GL_Q, texcoord_index, GL_EYE_PLANE, 4);
204 #undef GET_FLOAT
205 #undef GET_ENUM
206     }
207 }
208
209 void vogleditor_stateTreeTexEnvItem::set_diff_base_state(const vogl_context_info* pBaseInfo, const vogl_texenv_state* pBaseState)
210 {
211     m_pDiffBaseState = pBaseState;
212     m_pDiffBaseInfo = pBaseInfo;
213
214     for (vogleditor_stateTreeTexEnvStateVecDiffableItem** iter = m_diffableItems.begin(); iter != m_diffableItems.end(); iter++)
215     {
216         (*iter)->set_diff_base_state(pBaseInfo, pBaseState);
217     }
218 }