44
44
#include " cvfTexture.h"
45
45
#include " cvfSampler.h"
46
46
#include " cvfScalarMapper.h"
47
+ #include " cafEffectGenerator.h"
47
48
48
49
49
50
// --------------------------------------------------------------------------------------------------
@@ -87,22 +88,16 @@ void RivCellEdgeGeometryGenerator::addCellEdgeResultsToDrawableGeo(
87
88
const RigGridBase* grid = dynamic_cast <const RigGridBase*>(generator->activeGrid ());
88
89
89
90
CVF_ASSERT (grid != NULL );
90
- const std::vector< double >* cellScalarResults = NULL ;
91
- bool cellScalarResultUseGlobalActiveIndex = true ;
92
91
93
- const std::vector< double >* edgeScalarResults[ 6 ] = { NULL , NULL , NULL , NULL , NULL , NULL } ;
92
+ bool cellScalarResultUseGlobalActiveIndex = true ;
94
93
bool edgeScalarResultUseGlobalActiveIndex[6 ];
95
94
96
95
if (cellResultSlot->hasResult ())
97
96
{
98
- const std::vector< std::vector<double > >& scalarResultTimeSteps = grid->mainGrid ()->results ()->cellScalarResults (cellResultSlot->gridScalarIndex ());
99
- if (cellResultSlot->hasDynamicResult ())
100
- {
101
- cellScalarResults = &scalarResultTimeSteps[timeStepIndex];
102
- }
103
- else
97
+ if (!cellResultSlot->hasDynamicResult ())
104
98
{
105
- cellScalarResults = &scalarResultTimeSteps[0 ];
99
+ // Static result values are located at time step 0
100
+ timeStepIndex = 0 ;
106
101
}
107
102
108
103
cellScalarResultUseGlobalActiveIndex = grid->mainGrid ()->results ()->isUsingGlobalActiveIndex (cellResultSlot->gridScalarIndex ());
@@ -118,8 +113,6 @@ void RivCellEdgeGeometryGenerator::addCellEdgeResultsToDrawableGeo(
118
113
{
119
114
if (resultIndices[cubeFaceIdx] != cvf::UNDEFINED_SIZE_T)
120
115
{
121
- const std::vector< std::vector<double > >& scalarResultTimeSteps = grid->mainGrid ()->results ()->cellScalarResults (resultIndices[cubeFaceIdx]);
122
- edgeScalarResults[cubeFaceIdx] = &scalarResultTimeSteps[0 ]; // Assuming only static edge results
123
116
edgeScalarResultUseGlobalActiveIndex[cubeFaceIdx] = grid->mainGrid ()->results ()->isUsingGlobalActiveIndex (resultIndices[cubeFaceIdx]);
124
117
}
125
118
}
@@ -143,18 +136,16 @@ void RivCellEdgeGeometryGenerator::addCellEdgeResultsToDrawableGeo(
143
136
float cellColorTextureCoord = 0 .5f ; // If no results exists, the texture will have a special color
144
137
size_t cellIndex = quadToCell[quadIdx];
145
138
146
- size_t resultIndex = cellIndex;
139
+ size_t resultValueIndex = cellIndex;
147
140
if (cellScalarResultUseGlobalActiveIndex)
148
141
{
149
- resultIndex = grid->cell (cellIndex).globalActiveIndex ();
142
+ resultValueIndex = grid->cell (cellIndex).globalActiveIndex ();
150
143
}
151
144
152
- if (cellScalarResults )
153
145
{
154
- if (resultIndex != cvf::UNDEFINED_SIZE_T)
146
+ double scalarValue = grid->mainGrid ()->results ()->cellScalarResult (timeStepIndex, cellResultSlot->gridScalarIndex (), resultValueIndex);
147
+ if (scalarValue != HUGE_VAL)
155
148
{
156
- double scalarValue = (*cellScalarResults)[resultIndex];
157
-
158
149
cellColorTextureCoord = cellResultScalarMapper->mapToTextureCoord (scalarValue)[0 ];
159
150
}
160
151
else
@@ -174,19 +165,17 @@ void RivCellEdgeGeometryGenerator::addCellEdgeResultsToDrawableGeo(
174
165
{
175
166
edgeColor = -1 .0f ; // Undefined texture coord. Shader handles this.
176
167
177
- resultIndex = cellIndex;
168
+ resultValueIndex = cellIndex;
178
169
if (edgeScalarResultUseGlobalActiveIndex[cubeFaceIdx])
179
170
{
180
- resultIndex = grid->cell (cellIndex).globalActiveIndex ();
171
+ resultValueIndex = grid->cell (cellIndex).globalActiveIndex ();
181
172
}
182
173
183
- if (resultIndices[cubeFaceIdx] != cvf::UNDEFINED_SIZE_T && resultIndex != cvf::UNDEFINED_SIZE_T)
174
+ // Assuming static values to be mapped onto cell edge, always using time step zero
175
+ double scalarValue = grid->mainGrid ()->results ()->cellScalarResult (0 , resultIndices[cubeFaceIdx], resultValueIndex);
176
+ if (scalarValue != HUGE_VAL && scalarValue != ignoredScalarValue)
184
177
{
185
- double scalarValue = (*(edgeScalarResults[cubeFaceIdx]))[resultIndex];
186
- if (scalarValue != ignoredScalarValue)
187
- {
188
- edgeColor = edgeResultScalarMapper->mapToTextureCoord (scalarValue)[0 ];
189
- }
178
+ edgeColor = edgeResultScalarMapper->mapToTextureCoord (scalarValue)[0 ];
190
179
}
191
180
192
181
cvf::FloatArray* colArr = cellEdgeColorTextureCoordsArrays.at (cubeFaceIdx);
@@ -250,6 +239,20 @@ bool CellEdgeEffectGenerator::isEqual(const EffectGenerator* other) const
250
239
&& m_defaultCellColor == otherCellFaceEffectGenerator->m_defaultCellColor
251
240
)
252
241
{
242
+ cvf::ref<cvf::TextureImage> texImg2 = new cvf::TextureImage;
243
+
244
+ if (otherCellFaceEffectGenerator->m_edgeScalarMapper .notNull ())
245
+ {
246
+ otherCellFaceEffectGenerator->m_edgeScalarMapper ->updateTexture (texImg2.p ());
247
+ if (!caf::ScalarMapperEffectGenerator::isImagesEqual (m_edgeTextureImage.p (), texImg2.p ())) return false ;
248
+ }
249
+
250
+ if (otherCellFaceEffectGenerator->m_cellScalarMapper .notNull ())
251
+ {
252
+ otherCellFaceEffectGenerator->m_cellScalarMapper ->updateTexture (texImg2.p ());
253
+ if (!caf::ScalarMapperEffectGenerator::isImagesEqual (m_cellTextureImage.p (), texImg2.p ())) return false ;
254
+ }
255
+
253
256
return true ;
254
257
}
255
258
else
@@ -264,6 +267,9 @@ bool CellEdgeEffectGenerator::isEqual(const EffectGenerator* other) const
264
267
caf::EffectGenerator* CellEdgeEffectGenerator::copy () const
265
268
{
266
269
CellEdgeEffectGenerator * newEffect = new CellEdgeEffectGenerator (m_edgeScalarMapper.p (), m_cellScalarMapper.p ());
270
+ newEffect->m_edgeTextureImage = m_edgeTextureImage;
271
+ newEffect->m_cellTextureImage = m_cellTextureImage;
272
+
267
273
newEffect->setOpacityLevel (m_opacityLevel);
268
274
newEffect->setCullBackfaces (m_cullBackfaces);
269
275
newEffect->setUndefinedColor (m_undefinedColor);
@@ -316,23 +322,25 @@ void CellEdgeEffectGenerator::updateForShaderBasedRendering(cvf::Effect* effect)
316
322
317
323
// Set up textures
318
324
319
- cvf::ref<cvf::TextureImage> edgeTexImg = new cvf::TextureImage;
320
- cvf::ref<cvf::TextureImage> cellTexImg = new cvf::TextureImage;
325
+ m_edgeTextureImage = new cvf::TextureImage;
326
+ m_cellTextureImage = new cvf::TextureImage;
321
327
322
- m_edgeScalarMapper->updateTexture (edgeTexImg.p ());
328
+ cvf::ref<cvf::TextureImage> modifiedCellTextImage;
329
+ m_edgeScalarMapper->updateTexture (m_edgeTextureImage.p ());
323
330
if (m_cellScalarMapper.notNull ())
324
331
{
325
- m_cellScalarMapper->updateTexture (cellTexImg .p ());
326
- cellTexImg = caf::ScalarMapperEffectGenerator::addAlphaAndUndefStripes (cellTexImg .p (), m_undefinedColor, m_opacityLevel);
332
+ m_cellScalarMapper->updateTexture (m_cellTextureImage .p ());
333
+ modifiedCellTextImage = caf::ScalarMapperEffectGenerator::addAlphaAndUndefStripes (m_cellTextureImage .p (), m_undefinedColor, m_opacityLevel);
327
334
}
328
335
else
329
336
{
330
- cellTexImg->allocate (2 ,1 );
331
- cellTexImg->fill (cvf::Color4ub (cvf::Color4f (m_defaultCellColor, m_opacityLevel)));
337
+ modifiedCellTextImage = new cvf::TextureImage;
338
+ modifiedCellTextImage->allocate (2 ,1 );
339
+ modifiedCellTextImage->fill (cvf::Color4ub (cvf::Color4f (m_defaultCellColor, m_opacityLevel)));
332
340
}
333
341
334
- cvf::ref<cvf::Texture> edgeTexture = new cvf::Texture (edgeTexImg .p ());
335
- cvf::ref<cvf::Texture> cellTexture = new cvf::Texture (cellTexImg .p ());
342
+ cvf::ref<cvf::Texture> edgeTexture = new cvf::Texture (m_edgeTextureImage .p ());
343
+ cvf::ref<cvf::Texture> cellTexture = new cvf::Texture (modifiedCellTextImage .p ());
336
344
337
345
cvf::ref<cvf::Sampler> sampler = new cvf::Sampler;
338
346
sampler->setWrapMode (cvf::Sampler::CLAMP_TO_EDGE);
0 commit comments