~holger-seelig/titania/0.5

« back to all changes in this revision

Viewing changes to libtitania-x3d/Titania/X3D/Components/Followers/TexCoordDamper2D.cpp

  • Committer: Holger Seelig
  • Date: 2013-11-11 05:36:47 UTC
  • Revision ID: holger.seelig@yahoo.de-20131111053647-rwld79xsmc2rr4o1
Implemented CoordinateDamper and TexCoordDamper2D.

Show diffs side-by-side

added added

removed removed

Lines of Context:
71
71
TexCoordDamper2D::TexCoordDamper2D (X3DExecutionContext* const executionContext) :
72
72
          X3DBaseNode (executionContext -> getBrowser (), executionContext),
73
73
        X3DDamperNode (),
74
 
               fields ()
 
74
               fields (),
 
75
                value ()
75
76
{
76
77
        addField (inputOutput,    "metadata",           metadata ());
77
78
        addField (inputOnly,      "set_value",          set_value ());
95
96
TexCoordDamper2D::initialize ()
96
97
{
97
98
        X3DDamperNode::initialize ();
98
 
}
99
 
 
 
99
 
 
100
        set_value ()       .addInterest (this, &TexCoordDamper2D::_set_value);
 
101
        set_destination () .addInterest (this, &TexCoordDamper2D::_set_destination);
 
102
        order ()           .addInterest (this, &TexCoordDamper2D::set_order);
 
103
 
 
104
        value .resize (getOrder () + 1);
 
105
 
 
106
        for (auto & v : basic::adapter (value .begin () + 1, value .end ()))
 
107
        {
 
108
                v .assign (initialValue () .begin (), initialValue () .end ());
 
109
                v .resize (initialDestination () .size ());
 
110
        }
 
111
 
 
112
        value [0] .assign (initialDestination () .begin (), initialDestination () .end ());
 
113
 
 
114
        set_active (not equals (initialDestination (), initialValue (), getTolerance ()));
 
115
}
 
116
 
 
117
void
 
118
TexCoordDamper2D::_set_value ()
 
119
{
 
120
        for (auto & v : basic::adapter (value .begin () + 1, value .end ()))
 
121
                v .assign (set_value () .begin (), set_value () .end ());
 
122
 
 
123
        value [0] .resize (set_value () .size ());
 
124
 
 
125
        value_changed () = set_value ();
 
126
 
 
127
        set_active (true);
 
128
}
 
129
 
100
130
void
101
131
TexCoordDamper2D::_set_destination ()
102
 
{ }
103
 
 
104
 
void
105
 
TexCoordDamper2D::_set_value ()
106
 
{ }
 
132
{
 
133
        if (not equals (value [0], set_destination (), getTolerance ()))
 
134
        {
 
135
                for (auto & v : basic::adapter (value .begin () + 1, value .end ()))
 
136
                        v .resize (set_destination () .size ());
 
137
 
 
138
                value [0] .assign (set_destination () .begin (), set_destination () .end ());
 
139
 
 
140
                set_active (true);
 
141
        }
 
142
}
107
143
 
108
144
void
109
145
TexCoordDamper2D::set_order ()
110
 
{ }
 
146
{
 
147
        value .resize (getOrder () + 1, value .back ());
 
148
}
111
149
 
112
150
void
113
151
TexCoordDamper2D::prepareEvents ()
114
 
{ }
 
152
{
 
153
        size_t order = value .size () - 1;
 
154
 
 
155
        if (tau ())
 
156
        {
 
157
                time_type delta = 1 / getBrowser () -> getCurrentFrameRate ();
 
158
 
 
159
                float alpha = std::exp (-delta / tau ());
 
160
                
 
161
                for (size_t i = 0; i < order; ++ i)
 
162
                {
 
163
                        for (size_t j = 0, s = value [i] .size (); j < s; ++ j)
 
164
                        {
 
165
                                value [i + 1] [j] = lerp (value [i] [j], value [i + 1] [j], alpha);
 
166
                        }
 
167
                }
 
168
 
 
169
                value_changed () .assign (value [order] .begin (), value [order] .end ());
 
170
 
 
171
                if (not equals (value [order], value [0], getTolerance ()))
 
172
                        return;
 
173
        }
 
174
        else
 
175
        {
 
176
                value_changed () .assign (value [0] .begin (), value [0] .end ());
 
177
                
 
178
                order = 0;
 
179
        }
 
180
 
 
181
        for (auto & v : basic::adapter (value .begin () + 1, value .end ()))
 
182
                v = value [order];
 
183
 
 
184
        set_active (false);
 
185
}
115
186
 
116
187
} // X3D
117
188
} // titania