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

Revision 13949, 13.9 kB (checked in by robert, 37 hours ago)

Added shaders to support experimental shader based displacement mapping technique osgTerrain::ShaderTerrain?.

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