root/OpenSceneGraph/trunk/src/osgPlugins/osg/AutoTransform.cpp @ 7968

Revision 7968, 5.2 kB (checked in by robert, 7 years ago)

To osg::AutoTransform? added support for MinimumScale?, MaximumScale? and AutoScaleTransitionWidth? parameters
and a new scheme for computing the scaling when using autoscale that introduces smooth
transitions to the scaling of the subgraph so that it looks more natural.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <osg/AutoTransform>
2#include <osg/io_utils>
3
4#include <osgDB/Registry>
5#include <osgDB/Input>
6#include <osgDB/Output>
7
8using namespace osg;
9using namespace osgDB;
10
11// forward declare functions to use later.
12bool AutoTransform_readLocalData(Object& obj, Input& fr);
13bool AutoTransform_writeLocalData(const Object& obj, Output& fw);
14
15// register the read and write functions with the osgDB::Registry.
16RegisterDotOsgWrapperProxy g_AutoTransformProxy
17(
18    new osg::AutoTransform,
19    "AutoTransform",
20    "Object Node Transform AutoTransform Group",
21    &AutoTransform_readLocalData,
22    &AutoTransform_writeLocalData,
23    DotOsgWrapper::READ_AND_WRITE
24);
25
26bool AutoTransform_readLocalData(Object& obj, Input& fr)
27{
28    bool iteratorAdvanced = false;
29
30    AutoTransform& transform = static_cast<AutoTransform&>(obj);
31
32    if (fr.matchSequence("position %f %f %f"))
33    {
34        osg::Vec3 pos;
35        fr[1].getFloat(pos[0]);
36        fr[2].getFloat(pos[1]);
37        fr[3].getFloat(pos[2]);
38       
39        transform.setPosition(pos);
40
41        fr += 4;
42        iteratorAdvanced = true;
43    }
44
45    if (fr.matchSequence("rotation %f %f %f %f"))
46    {
47        osg::Quat att;
48        fr[1].getFloat(att[0]);
49        fr[2].getFloat(att[1]);
50        fr[3].getFloat(att[2]);
51        fr[4].getFloat(att[3]);
52       
53        transform.setRotation(att);
54       
55        fr += 5;
56        iteratorAdvanced = true;
57    }
58
59    if (fr.matchSequence("scale %f %f %f"))
60    {
61        osg::Vec3 scale;
62        fr[1].getFloat(scale[0]);
63        fr[2].getFloat(scale[1]);
64        fr[3].getFloat(scale[2]);
65       
66        transform.setScale(scale);
67
68        fr += 4;
69        iteratorAdvanced = true;
70    }
71
72    if (fr.matchSequence("minimumScale %f"))
73    {
74        float scale;
75        fr[1].getFloat(scale);
76       
77        transform.setMinimumScale(scale);
78
79        fr += 2;
80        iteratorAdvanced = true;
81    }
82
83    if (fr.matchSequence("maximumScale %f"))
84    {
85        float scale;
86        fr[1].getFloat(scale);
87       
88        transform.setMaximumScale(scale);
89
90        fr += 2;
91        iteratorAdvanced = true;
92    }
93
94    if (fr.matchSequence("pivotPoint %f %f %f"))
95    {
96        osg::Vec3 pivot;
97        fr[1].getFloat(pivot[0]);
98        fr[2].getFloat(pivot[1]);
99        fr[3].getFloat(pivot[2]);
100       
101        transform.setPivotPoint(pivot);
102       
103        fr += 4;
104        iteratorAdvanced = true;
105    }
106
107    if (fr.matchSequence("autoUpdateEyeMovementTolerance %f"))
108    {
109        float f;
110        fr[1].getFloat(f);
111        transform.setAutoUpdateEyeMovementTolerance(f);
112        fr += 2;
113        iteratorAdvanced = true;
114    }
115
116    if (fr.matchSequence("autoRotateToScreen %w"))
117    {
118        std::string w(fr[1].getStr());
119        transform.setAutoRotateMode((w == "TRUE") ? osg::AutoTransform::ROTATE_TO_SCREEN : osg::AutoTransform::NO_ROTATION);
120        fr += 2;
121        iteratorAdvanced = true;
122    }
123
124    if (fr.matchSequence("autoRotateMode %w"))
125    {
126        std::string w(fr[1].getStr());
127                if (w=="ROTATE_TO_SCREEN") transform.setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);
128                else if (w=="ROTATE_TO_CAMERA") transform.setAutoRotateMode(osg::AutoTransform::ROTATE_TO_CAMERA);
129                else if (w=="NO_ROTATION") transform.setAutoRotateMode(osg::AutoTransform::NO_ROTATION);
130               
131        fr += 2;
132        iteratorAdvanced = true;
133    }
134
135    if (fr.matchSequence("autoScaleToScreen %w"))
136    {
137        std::string w(fr[1].getStr());
138        transform.setAutoScaleToScreen(w == "TRUE");
139        fr += 2;
140        iteratorAdvanced = true;
141    }
142
143    if (fr.matchSequence("autoScaleTransistionWidthRatio %f"))
144    {
145        float ratio;
146        fr[1].getFloat(ratio);
147       
148        transform.setAutoScaleTransistionWidthRatio(ratio);
149
150        fr += 2;
151        iteratorAdvanced = true;
152    }
153
154
155    return iteratorAdvanced;
156}
157
158
159bool AutoTransform_writeLocalData(const Object& obj, Output& fw)
160{
161    const AutoTransform& transform = static_cast<const AutoTransform&>(obj);
162
163    fw.indent()<<"position "<<transform.getPosition()<<std::endl;
164    fw.indent()<<"rotation "<<transform.getRotation()<<std::endl;
165    fw.indent()<<"scale "<<transform.getScale()<<std::endl;
166
167    if (transform.getMinimumScale()>0.0) fw.indent()<<"minimumScale "<<transform.getMinimumScale()<<std::endl;
168    if (transform.getMaximumScale()<FLT_MAX) fw.indent()<<"maximumScale "<<transform.getMaximumScale()<<std::endl;
169   
170   
171    fw.indent()<<"pivotPoint "<<transform.getPivotPoint()<<std::endl;
172    fw.indent()<<"autoUpdateEyeMovementTolerance "<<transform.getAutoUpdateEyeMovementTolerance()<<std::endl;
173    fw.indent()<<"autoRotateMode ";
174    switch(transform.getAutoRotateMode())
175    {
176      case(osg::AutoTransform::ROTATE_TO_SCREEN): fw<<"ROTATE_TO_SCREEN"<<std::endl; break;
177      case(osg::AutoTransform::ROTATE_TO_CAMERA): fw<<"ROTATE_TO_CAMERA"<<std::endl; break;
178      case(osg::AutoTransform::NO_ROTATION):
179      default: fw<<"NO_ROTATION"<<std::endl; break;
180    }
181
182    fw.indent()<<"autoScaleToScreen "<<(transform.getAutoScaleToScreen()?"TRUE":"FALSE")<<std::endl;
183   
184    if (transform.getAutoScaleTransistionWidthRatio()!=0.25)
185    {
186            fw.indent()<<"autoScaleTransistionWidthRatio "<<transform.getAutoScaleTransistionWidthRatio()<<std::endl;
187    }
188   
189    return true;
190}
Note: See TracBrowser for help on using the browser.