1 #include "vogleditor_statetreetexenvitem.h"
2 #include "vogl_texenv_state.h"
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),
10 m_numComponents(numComponents),
11 m_pDiffBaseInfo(NULL),
12 m_pDiffBaseState(NULL)
16 //=============================================================================
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),
22 setValue(getValueFromEnums(values, numComponents));
25 bool vogleditor_stateTreeTexEnvStateVecEnumItem::hasChanged() const
27 if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
30 if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
32 // this index did not exist in the base state, so it must be new
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))
41 return curVals[0] != baseVals[0] || curVals[1] != baseVals[1] || curVals[2] != baseVals[2] || curVals[3] != baseVals[3];
45 // the values could not be obtained from both states, so something must have changed
50 QString vogleditor_stateTreeTexEnvStateVecEnumItem::getDiffedValue() const
52 if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
55 if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
57 // this index did not exist in the base state, so it must be new
58 return "non-existent";
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))
64 return getValueFromEnums(baseVals, m_numComponents);
68 // the values could not be obtained from both states, so something must have changed
69 return "non-existent";
73 //=============================================================================
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),
79 setValue(getValueFromFloats(values, numComponents));
82 bool vogleditor_stateTreeTexEnvStateVecFloatItem::hasChanged() const
84 if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
87 if (m_index >= this->m_pDiffBaseInfo->get_max_texture_coords())
89 // this index did not exist in the base state, so it must be new
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))
98 return curVals[0] != baseVals[0] || curVals[1] != baseVals[1] || curVals[2] != baseVals[2] || curVals[3] != baseVals[3];
102 // the values could not be obtained from both states, so something must have changed
107 QString vogleditor_stateTreeTexEnvStateVecFloatItem::getDiffedValue() const
109 if (m_pDiffBaseState == NULL || m_pDiffBaseInfo == NULL)
112 if (m_index >= m_pDiffBaseInfo->get_max_texture_coords())
114 // this index did not exist in the base state, so it must be new
115 return "non-existent";
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))
121 return getValueFromFloats(baseVals, m_numComponents);
125 // the values could not be obtained from both states, so something must have changed
126 return "non-existent";
129 //=============================================================================
131 vogleditor_stateTreeTexEnvItem::vogleditor_stateTreeTexEnvItem(QString name, vogleditor_stateTreeItem* parent, vogl_texenv_state& state, const vogl_context_info& info)
132 : vogleditor_stateTreeItem(name, "", parent),
134 m_pDiffBaseState(NULL),
135 m_pDiffBaseInfo(NULL)
138 for (uint texcoord_index = 0; texcoord_index < info.get_max_texture_coords(); texcoord_index++)
140 vogleditor_stateTreeItem* pTexNode = new vogleditor_stateTreeItem(tmp.sprintf("GL_TEXTURE%u", texcoord_index), "", this);
141 this->appendChild(pTexNode);
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); }
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);
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},
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); }
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);
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);
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);
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);
209 void vogleditor_stateTreeTexEnvItem::set_diff_base_state(const vogl_context_info* pBaseInfo, const vogl_texenv_state* pBaseState)
211 m_pDiffBaseState = pBaseState;
212 m_pDiffBaseInfo = pBaseInfo;
214 for (vogleditor_stateTreeTexEnvStateVecDiffableItem** iter = m_diffableItems.begin(); iter != m_diffableItems.end(); iter++)
216 (*iter)->set_diff_base_state(pBaseInfo, pBaseState);