root/OpenSceneGraph/trunk/src/osgVolume/Property.cpp @ 13948

Revision 13948, 13.7 kB (checked in by robert, 3 hours ago)

Added support for changing background colour of LineEdit? widget when focus changes

  • Property svn:eol-style set to native
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#include <osgVolume/Property>
15#include <osgVolume/VolumeTile>
16
17using namespace osgVolume;
18
19Property::Property()
20{
21}
22
23Property::Property(const Property& property,const osg::CopyOp& copyop):
24    osg::Object(property,copyop)
25{
26}
27
28Property::~Property()
29{
30}
31
32/////////////////////////////////////////////////////////////////////////////
33//
34// CompositeProperty
35//
36CompositeProperty::CompositeProperty()
37{
38}
39
40CompositeProperty::CompositeProperty(const CompositeProperty& compositeProperty, const osg::CopyOp& copyop):
41    Property(compositeProperty,copyop)
42{
43}
44
45
46void CompositeProperty::clear()
47{
48    _properties.clear();
49}
50
51/////////////////////////////////////////////////////////////////////////////
52//
53// SwitchProperty
54//
55SwitchProperty::SwitchProperty()
56{
57}
58
59SwitchProperty::SwitchProperty(const SwitchProperty& switchProperty, const osg::CopyOp& copyop):
60    CompositeProperty(switchProperty,copyop),
61    _activeProperty(switchProperty._activeProperty)
62{
63}
64
65
66/////////////////////////////////////////////////////////////////////////////
67//
68// TransferFunctionProperty
69//
70TransferFunctionProperty::TransferFunctionProperty(osg::TransferFunction* tf):
71    _tf(tf)
72{
73}
74
75TransferFunctionProperty::TransferFunctionProperty(const TransferFunctionProperty& tfp, const osg::CopyOp& copyop):
76    Property(tfp,copyop),
77    _tf(tfp._tf)
78{
79}
80
81/////////////////////////////////////////////////////////////////////////////
82//
83// ScalarProperty
84//
85ScalarProperty::ScalarProperty()
86{
87    _uniform = new osg::Uniform;
88}
89
90ScalarProperty::ScalarProperty(const std::string& scalarName, float value)
91{
92    setName(scalarName);
93    _uniform = new osg::Uniform(scalarName.c_str(), value);
94}
95
96ScalarProperty::ScalarProperty(const ScalarProperty& sp, const osg::CopyOp& copyop):
97    Property(sp,copyop)
98{
99    _uniform = new osg::Uniform(sp._uniform->getName().c_str(), getValue());
100
101}
102
103/////////////////////////////////////////////////////////////////////////////
104//
105// IsoSurfaceProperty
106//
107IsoSurfaceProperty::IsoSurfaceProperty(float value):
108    ScalarProperty("IsoSurfaceValue",value)
109{
110}
111
112IsoSurfaceProperty::IsoSurfaceProperty(const IsoSurfaceProperty& isp,const osg::CopyOp& copyop):
113    ScalarProperty(isp, copyop)
114{
115}
116
117
118/////////////////////////////////////////////////////////////////////////////
119//
120// AlphaFuncProperty
121//
122AlphaFuncProperty::AlphaFuncProperty(float value):
123    ScalarProperty("AlphaFuncValue",value)
124{
125    _alphaFunc = new osg::AlphaFunc(osg::AlphaFunc::GREATER, value);
126}
127
128AlphaFuncProperty::AlphaFuncProperty(const AlphaFuncProperty& afp,const osg::CopyOp& copyop):
129    ScalarProperty(afp, copyop)
130{
131    _alphaFunc = new osg::AlphaFunc(osg::AlphaFunc::GREATER, getValue());
132}
133
134void AlphaFuncProperty::setValue(float v)
135{
136    _uniform->set(v);
137    _alphaFunc->setReferenceValue(v);
138}
139
140/////////////////////////////////////////////////////////////////////////////
141//
142// MaximumIntensityProjectionProperty
143//
144MaximumIntensityProjectionProperty::MaximumIntensityProjectionProperty()
145{
146}
147
148MaximumIntensityProjectionProperty::MaximumIntensityProjectionProperty(const MaximumIntensityProjectionProperty& isp,const osg::CopyOp& copyop):
149    Property(isp, copyop)
150{
151}
152
153/////////////////////////////////////////////////////////////////////////////
154//
155// LightingProperty
156//
157LightingProperty::LightingProperty()
158{
159}
160
161LightingProperty::LightingProperty(const LightingProperty& isp,const osg::CopyOp& copyop):
162    Property(isp, copyop)
163{
164}
165
166
167/////////////////////////////////////////////////////////////////////////////
168//
169// SampleDensityProperty
170//
171SampleDensityProperty::SampleDensityProperty(float value):
172    ScalarProperty("SampleDensityValue",value)
173{
174}
175
176SampleDensityProperty::SampleDensityProperty(const SampleDensityProperty& isp,const osg::CopyOp& copyop):
177    ScalarProperty(isp, copyop)
178{
179}
180
181
182/////////////////////////////////////////////////////////////////////////////
183//
184// SampleDensityWhenMovingProperty
185//
186SampleDensityWhenMovingProperty::SampleDensityWhenMovingProperty(float value):
187    ScalarProperty("SampleDensityValue",value)
188{
189}
190
191SampleDensityWhenMovingProperty::SampleDensityWhenMovingProperty(const SampleDensityWhenMovingProperty& isp,const osg::CopyOp& copyop):
192    ScalarProperty(isp, copyop)
193{
194}
195
196/////////////////////////////////////////////////////////////////////////////
197//
198// SampleRatioProperty
199//
200SampleRatioProperty::SampleRatioProperty(float value):
201    ScalarProperty("SampleRatioValue",value)
202{
203}
204
205SampleRatioProperty::SampleRatioProperty(const SampleRatioProperty& srp,const osg::CopyOp& copyop):
206    ScalarProperty(srp, copyop)
207{
208}
209
210/////////////////////////////////////////////////////////////////////////////
211//
212// SampleRatioWhenMovingProperty
213//
214SampleRatioWhenMovingProperty::SampleRatioWhenMovingProperty(float value):
215    ScalarProperty("SampleRatioValue",value)
216{
217}
218
219SampleRatioWhenMovingProperty::SampleRatioWhenMovingProperty(const SampleRatioWhenMovingProperty& isp,const osg::CopyOp& copyop):
220    ScalarProperty(isp, copyop)
221{
222}
223
224
225
226/////////////////////////////////////////////////////////////////////////////
227//
228// TransparencyProperty
229//
230TransparencyProperty::TransparencyProperty(float value):
231    ScalarProperty("TransparencyValue",value)
232{
233}
234
235TransparencyProperty::TransparencyProperty(const TransparencyProperty& isp,const osg::CopyOp& copyop):
236    ScalarProperty(isp, copyop)
237{
238}
239
240/////////////////////////////////////////////////////////////////////////////
241//
242// PropertyVisitor
243//
244PropertyVisitor::PropertyVisitor(bool traverseOnlyActiveChildren):
245    _traverseOnlyActiveChildren(traverseOnlyActiveChildren)
246{
247}
248
249void PropertyVisitor::apply(CompositeProperty& cp)
250{
251    for(unsigned int i=0; i<cp.getNumProperties(); ++i)
252    {
253        cp.getProperty(i)->accept(*this);
254    }
255}
256
257void PropertyVisitor::apply(SwitchProperty& sp)
258{
259    if (_traverseOnlyActiveChildren)
260    {
261        if (sp.getActiveProperty()>=0 && sp.getActiveProperty()<static_cast<int>(sp.getNumProperties()))
262        {
263            sp.getProperty(sp.getActiveProperty())->accept(*this);
264        }
265    }
266    else
267    {
268        for(unsigned int i=0; i<sp.getNumProperties(); ++i)
269        {
270            sp.getProperty(i)->accept(*this);
271        }
272    }
273}
274
275
276/////////////////////////////////////////////////////////////////////////////
277//
278// CollectPropertiesVisitor
279//
280CollectPropertiesVisitor::CollectPropertiesVisitor(bool traverseOnlyActiveChildren):
281    PropertyVisitor(traverseOnlyActiveChildren)
282{
283}
284
285void CollectPropertiesVisitor::apply(Property&) {}
286void CollectPropertiesVisitor::apply(TransferFunctionProperty& tf) { _tfProperty = &tf; }
287void CollectPropertiesVisitor::apply(ScalarProperty&) {}
288void CollectPropertiesVisitor::apply(IsoSurfaceProperty& iso) { _isoProperty = &iso; }
289void CollectPropertiesVisitor::apply(AlphaFuncProperty& af) { _afProperty = &af; }
290void CollectPropertiesVisitor::apply(MaximumIntensityProjectionProperty& mip) { _mipProperty = &mip; }
291void CollectPropertiesVisitor::apply(LightingProperty& lp) { _lightingProperty = &lp; }
292void CollectPropertiesVisitor::apply(SampleDensityProperty& sdp) { _sampleDensityProperty = &sdp; }
293void CollectPropertiesVisitor::apply(SampleDensityWhenMovingProperty& sdp) { _sampleDensityWhenMovingProperty = &sdp; }
294void CollectPropertiesVisitor::apply(SampleRatioProperty& srp) { _sampleRatioProperty = &srp; }
295void CollectPropertiesVisitor::apply(SampleRatioWhenMovingProperty& srp) { _sampleRatioWhenMovingProperty = &srp; }
296void CollectPropertiesVisitor::apply(TransparencyProperty& tp) { _transparencyProperty = &tp; }
297
298
299class CycleSwitchVisitor : public osgVolume::PropertyVisitor
300{
301    public:
302
303        CycleSwitchVisitor(int delta):
304            PropertyVisitor(false),
305            _delta(delta),
306            _switchModified(true) {}
307
308        virtual void apply(SwitchProperty& sp)
309        {
310            if (sp.getNumProperties()>=2)
311            {
312                if (_delta>0)
313                {
314                    int newValue = sp.getActiveProperty()+_delta;
315                    if (newValue<static_cast<int>(sp.getNumProperties()))
316                    {
317                        sp.setActiveProperty(newValue);
318                    }
319                    else
320                    {
321                        sp.setActiveProperty(0);
322                    }
323
324                    _switchModified = true;
325                }
326                else // _delta<0
327                {
328                    int newValue = sp.getActiveProperty()+_delta;
329                    if (newValue>=0)
330                    {
331                        sp.setActiveProperty(newValue);
332                    }
333                    else
334                    {
335                        sp.setActiveProperty(sp.getNumProperties()-1);
336                    }
337
338                    _switchModified = true;
339                }
340            }
341
342            PropertyVisitor::apply(sp);
343        }
344
345        int     _delta;
346        bool    _switchModified;
347};
348
349/////////////////////////////////////////////////////////////////////////////
350//
351// PropertyAdjustmentCallback
352//
353PropertyAdjustmentCallback::PropertyAdjustmentCallback():
354    _cyleForwardKey('v'),
355    _cyleBackwardKey('V'),
356    _transparencyKey('t'),
357    _alphaFuncKey('a'),
358    _sampleDensityKey('d'),
359    _updateTransparency(false),
360    _updateAlphaCutOff(false),
361    _updateSampleDensity(false)
362{
363}
364
365PropertyAdjustmentCallback::PropertyAdjustmentCallback(const PropertyAdjustmentCallback& pac,const osg::CopyOp&):
366    _cyleForwardKey(pac._cyleForwardKey),
367    _cyleBackwardKey(pac._cyleBackwardKey),
368    _transparencyKey(pac._transparencyKey),
369    _alphaFuncKey(pac._alphaFuncKey),
370    _sampleDensityKey(pac._sampleDensityKey),
371    _updateTransparency(false),
372    _updateAlphaCutOff(false),
373    _updateSampleDensity(false)
374{
375}
376
377bool PropertyAdjustmentCallback::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&, osg::Object* object, osg::NodeVisitor*)
378{
379    osgVolume::VolumeTile* tile = dynamic_cast<osgVolume::VolumeTile*>(object);
380    osgVolume::Layer* layer = tile ? tile->getLayer() : 0;
381    osgVolume::Property* property = layer ? layer->getProperty() : 0;
382    if (!property) return false;
383
384    osgVolume::CollectPropertiesVisitor cpv;
385    property->accept(cpv);
386
387    bool passOnUpdates = false;
388
389    switch(ea.getEventType())
390    {
391        case(osgGA::GUIEventAdapter::MOVE):
392        case(osgGA::GUIEventAdapter::DRAG):
393        {
394            passOnUpdates = true;
395        }
396        case(osgGA::GUIEventAdapter::KEYDOWN):
397        {
398            if (ea.getKey()==_cyleForwardKey || ea.getKey()==_cyleBackwardKey)
399            {
400                CycleSwitchVisitor csv( (ea.getKey()==_cyleForwardKey) ? 1 : -1);
401                property->accept(csv);
402                if (csv._switchModified)
403                {
404                    tile->setDirty(true);
405                    tile->init();
406                }
407            }
408            else if (ea.getKey()==_transparencyKey) _updateTransparency = passOnUpdates = true;
409            else if (ea.getKey()==_alphaFuncKey) _updateAlphaCutOff = passOnUpdates = true;
410            else if (ea.getKey()==_sampleDensityKey) _updateSampleDensity = passOnUpdates = true;
411            break;
412        }
413        case(osgGA::GUIEventAdapter::KEYUP):
414        {
415            if (ea.getKey()==_transparencyKey) _updateTransparency = false;
416            else if (ea.getKey()==_alphaFuncKey) _updateAlphaCutOff = false;
417            else if (ea.getKey()==_sampleDensityKey) _updateSampleDensity = false;
418            break;
419        }
420        default:
421            break;
422    }
423
424    if (passOnUpdates)
425    {
426        float v = (ea.getY()-ea.getYmin())/(ea.getYmax()-ea.getYmin());
427        if (ea.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS) v = 1.0f-v;
428
429        float v2 = v*v;
430        float v4 = v2*v2;
431
432        if (_updateAlphaCutOff && cpv._isoProperty.valid())
433        {
434            OSG_NOTICE<<"Setting isoProperty to "<<v<<std::endl;
435            cpv._isoProperty->setValue(v);
436        }
437
438        if (_updateAlphaCutOff && cpv._afProperty.valid())
439        {
440            OSG_NOTICE<<"Setting afProperty to "<<v2<<std::endl;
441            cpv._afProperty->setValue(v2);
442        }
443
444        if (_updateTransparency && cpv._transparencyProperty.valid())
445        {
446            OSG_NOTICE<<"Setting transparency to "<<v2<<std::endl;
447            cpv._transparencyProperty->setValue(1.0f-v2);
448        }
449
450        if (_updateSampleDensity && cpv._sampleDensityProperty.valid())
451        {
452            OSG_NOTICE<<"Setting sample density to "<<v4<<std::endl;
453            cpv._sampleDensityProperty->setValue(v4);
454        }
455        if (_updateSampleDensity && cpv._sampleDensityWhenMovingProperty.valid())
456        {
457            OSG_INFO<<"Setting sample density when moving to "<<v4<<std::endl;
458            cpv._sampleDensityWhenMovingProperty->setValue(v4);
459        }
460
461        if (_updateSampleDensity && cpv._sampleRatioProperty.valid())
462        {
463            float sampleRatio = v2*4;
464            OSG_NOTICE<<"Setting sample ratio to "<<sampleRatio<<std::endl;
465            cpv._sampleRatioProperty->setValue(sampleRatio);
466        }
467
468        if (_updateSampleDensity && cpv._sampleRatioWhenMovingProperty.valid())
469        {
470            float sampleRatio = v2*4;
471            OSG_NOTICE<<"Setting sample ratio to "<<sampleRatio<<std::endl;
472            cpv._sampleRatioWhenMovingProperty->setValue(sampleRatio);
473        }
474    }
475
476
477    return false;
478}
Note: See TracBrowser for help on using the browser.