Revision: 1589
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1589&view=rev
Author: rorthomas
Date: 2011-01-21 01:58:23 +0000 (Fri, 21 Jan 2011)
Log Message:
-----------
only animate props every frame
Modified Paths:
--------------
trunk/source/main/BeamForcesEuler.cpp
Modified: trunk/source/main/BeamForcesEuler.cpp
===================================================================
--- trunk/source/main/BeamForcesEuler.cpp 2011-01-20 06:38:06 UTC (rev
1588)
+++ trunk/source/main/BeamForcesEuler.cpp 2011-01-21 01:58:23 UTC (rev
1589)
@@ -259,288 +259,291 @@
BES_START(BES_CORE_AnimatedProps);
//animate props
- for (int propi=0; propi<free_prop; propi++)
+ if(doUpdate)
{
- int animnum=0;
- float rx = 0.0f;
- float ry = 0.0f;
- float rz = 0.0f;
+ for (int propi=0; propi<free_prop; propi++)
+ {
+ int animnum=0;
+ float rx = 0.0f;
+ float ry = 0.0f;
+ float rz = 0.0f;
- while (props[propi].animFlags[animnum])
- {
- if (props[propi].animFlags[animnum])
+ while (props[propi].animFlags[animnum])
{
- float cstate = 0.0f;
- int div = 0.0f;
- int flagstate = props[propi].animFlags[animnum];
- float animOpt1 =props[propi].animOpt1[animnum];
- float animOpt2 =props[propi].animOpt2[animnum];
- float animOpt3 =props[propi].animOpt3[animnum];
+ if (props[propi].animFlags[animnum])
+ {
+ float cstate = 0.0f;
+ int div = 0.0f;
+ int flagstate =
props[propi].animFlags[animnum];
+ float animOpt1
=props[propi].animOpt1[animnum];
+ float animOpt2
=props[propi].animOpt2[animnum];
+ float animOpt3
=props[propi].animOpt3[animnum];
- calcAnimators(flagstate, cstate, div, dt,
animOpt1, animOpt2, animOpt3);
+ calcAnimators(flagstate, cstate, div,
dt, animOpt1, animOpt2, animOpt3);
- // key triggered animations
- if ((props[propi].animFlags[animnum] &
ANIM_FLAG_EVENT) && props[propi].animKey[animnum] != -1)
- {
- if
(INPUTENGINE.getEventValue(props[propi].animKey[animnum]))
+ // key triggered animations
+ if ((props[propi].animFlags[animnum] &
ANIM_FLAG_EVENT) && props[propi].animKey[animnum] != -1)
{
- // keystatelock is disabled
then set cstate
- if
(props[propi].animKeyState[animnum] == -1.0f)
+ if
(INPUTENGINE.getEventValue(props[propi].animKey[animnum]))
{
- cstate +=
INPUTENGINE.getEventValue(props[propi].animKey[animnum]);
- } else if
(!props[propi].animKeyState[animnum])
- {
- // a key was pressed
and a toggle was done already, so bypass
- //toggle now
- if
(!props[propi].lastanimKS[animnum])
+ // keystatelock is
disabled then set cstate
+ if
(props[propi].animKeyState[animnum] == -1.0f)
{
-
props[propi].lastanimKS[animnum] = 1.0f;
- // use animkey
as bool to determine keypress / release state of inputengine
-
props[propi].animKeyState[animnum] = 1.0f;
- }
- else
+ cstate +=
INPUTENGINE.getEventValue(props[propi].animKey[animnum]);
+ } else if
(!props[propi].animKeyState[animnum])
{
-
props[propi].lastanimKS[animnum] = 0.0f;
- // use animkey
as bool to determine keypress / release state of inputengine
-
props[propi].animKeyState[animnum] = 1.0f;
+ // a key was
pressed and a toggle was done already, so bypass
+ //toggle now
+ if
(!props[propi].lastanimKS[animnum])
+ {
+
props[propi].lastanimKS[animnum] = 1.0f;
+ // use
animkey as bool to determine keypress / release state of inputengine
+
props[propi].animKeyState[animnum] = 1.0f;
+ }
+ else
+ {
+
props[propi].lastanimKS[animnum] = 0.0f;
+ // use
animkey as bool to determine keypress / release state of inputengine
+
props[propi].animKeyState[animnum] = 1.0f;
+ }
+ } else
+ {
+ // bypas mode,
get the last set position and set it
+ cstate
+=props[propi].lastanimKS[animnum];
}
} else
{
- // bypas mode, get the
last set position and set it
- cstate
+=props[propi].lastanimKS[animnum];
+ // keyevent exists and
keylock is enabled but the key isnt pressed right now = get lastanimkeystatus
for cstate and reset keypressed bool animkey
+ if
(props[propi].animKeyState[animnum] != -1.0f)
+ {
+ cstate
+=props[propi].lastanimKS[animnum];
+
props[propi].animKeyState[animnum] = 0.0f;
+ }
}
- } else
- {
- // keyevent exists and keylock
is enabled but the key isnt pressed right now = get lastanimkeystatus for
cstate and reset keypressed bool animkey
- if
(props[propi].animKeyState[animnum] != -1.0f)
- {
- cstate
+=props[propi].lastanimKS[animnum];
-
props[propi].animKeyState[animnum] = 0.0f;
- }
}
- }
- //propanimation placed here to avoid
interference with existing hydros(cstate) and permanent prop animation
- //truck steering
- if (props[propi].animFlags[animnum] &
ANIM_FLAG_STEERING) cstate += hydrodirstate;
- //aileron
- if (props[propi].animFlags[animnum] &
ANIM_FLAG_AILERONS) cstate += hydroaileronstate;
- //elevator
- if (props[propi].animFlags[animnum] &
ANIM_FLAG_ELEVATORS) cstate += hydroelevatorstate;
- //rudder Liftec
- if (props[propi].animFlags[animnum] &
ANIM_FLAG_ARUDDER) cstate += hydrorudderstate;
- //permanent
- if (props[propi].animFlags[animnum] &
ANIM_FLAG_PERMANENT) cstate += 1.0f;
+ //propanimation placed here to avoid
interference with existing hydros(cstate) and permanent prop animation
+ //truck steering
+ if (props[propi].animFlags[animnum] &
ANIM_FLAG_STEERING) cstate += hydrodirstate;
+ //aileron
+ if (props[propi].animFlags[animnum] &
ANIM_FLAG_AILERONS) cstate += hydroaileronstate;
+ //elevator
+ if (props[propi].animFlags[animnum] &
ANIM_FLAG_ELEVATORS) cstate += hydroelevatorstate;
+ //rudder Liftec
+ if (props[propi].animFlags[animnum] &
ANIM_FLAG_ARUDDER) cstate += hydrorudderstate;
+ //permanent
+ if (props[propi].animFlags[animnum] &
ANIM_FLAG_PERMANENT) cstate += 1.0f;
- cstate *= props[propi].animratio[animnum];
+ cstate *=
props[propi].animratio[animnum];
- // autoanimate noflip_bouncer
- if (props[propi].animOpt5[animnum]) cstate *=
(props[propi].animOpt5[animnum]);
+ // autoanimate noflip_bouncer
+ if (props[propi].animOpt5[animnum])
cstate *= (props[propi].animOpt5[animnum]);
- //rotate prop
- if (props[propi].animMode[animnum] &
ANIM_MODE_ROTA_X || props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y ||
props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z)
- {
- float limiter = 0.0f;
- if (props[propi].animMode[animnum] &
ANIM_MODE_AUTOANIMATE)
+ //rotate prop
+ if (props[propi].animMode[animnum] &
ANIM_MODE_ROTA_X || props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y ||
props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z)
{
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X)
+ float limiter = 0.0f;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
{
- props[propi].rot =
props[propi].rot * (Quaternion(Degree(0), Vector3::UNIT_Z) *
Quaternion(Degree(0), Vector3::UNIT_Y) * Quaternion(Degree(cstate),
Vector3::UNIT_X));
- props[propi].rotaX +=
cstate;
- limiter =
props[propi].rotaX;
- }
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y)
- {
- props[propi].rot =
props[propi].rot * (Quaternion(Degree(0), Vector3::UNIT_Z) *
Quaternion(Degree(cstate), Vector3::UNIT_Y) * Quaternion(Degree(0),
Vector3::UNIT_X));
- props[propi].rotaY +=
cstate;
- limiter =
props[propi].rotaY;
- }
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z)
- {
- props[propi].rot =
props[propi].rot * (Quaternion(Degree(cstate), Vector3::UNIT_Z) *
Quaternion(Degree(0), Vector3::UNIT_Y) * Quaternion(Degree(0),
Vector3::UNIT_X));
- props[propi].rotaZ +=
cstate;
- limiter =
props[propi].rotaZ;
- }
- } else
- {
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X) rx += cstate;
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y) ry += cstate;
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z) rz += cstate;
- }
-
- bool limiterchanged = false;
- // check if a positive custom limit is
set to evaluate/calc flip back
- if (props[propi].animOpt2[animnum] -
props[propi].animOpt4[animnum])
- {
- if (limiter >
props[propi].animOpt2[animnum])
- {
- if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X)
{
- limiter =
props[propi].animOpt2[animnum]; // stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
- limiterchanged
= true;
- } else
- {
- limiter =
props[propi].animOpt1[animnum]; // flip to other
side at limit
- limiterchanged
= true;
+
props[propi].rot = props[propi].rot * (Quaternion(Degree(0), Vector3::UNIT_Z) *
Quaternion(Degree(0), Vector3::UNIT_Y) * Quaternion(Degree(cstate),
Vector3::UNIT_X));
+
props[propi].rotaX += cstate;
+ limiter =
props[propi].rotaX;
}
- }
- } else
- {
// no custom limit set, use 360�
- while (limiter > 180.0f)
- {
- if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y)
{
- limiter =
180.0f;
// stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
- limiterchanged
= true;
- } else
- {
- limiter -=
360.0f;
// flip to other side at limit
- limiterchanged
= true;
+
props[propi].rot = props[propi].rot * (Quaternion(Degree(0), Vector3::UNIT_Z) *
Quaternion(Degree(cstate), Vector3::UNIT_Y) * Quaternion(Degree(0),
Vector3::UNIT_X));
+
props[propi].rotaY += cstate;
+ limiter =
props[propi].rotaY;
}
- }
- }
-
- // check if a negative custom limit is
set to evaluate/calc flip back
- if (props[propi].animOpt1[animnum] -
props[propi].animOpt4[animnum])
- {
- if (limiter <
(props[propi].animOpt1[animnum]))
- {
- if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z)
{
- limiter =
props[propi].animOpt1[animnum]; // stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
- limiterchanged
= true;
- } else
- {
- limiter =
props[propi].animOpt2[animnum]; // flip to other
side at limit
- limiterchanged
= true;
+
props[propi].rot = props[propi].rot * (Quaternion(Degree(cstate),
Vector3::UNIT_Z) * Quaternion(Degree(0), Vector3::UNIT_Y) *
Quaternion(Degree(0), Vector3::UNIT_X));
+
props[propi].rotaZ += cstate;
+ limiter =
props[propi].rotaZ;
}
- }
- } else
// no custom limit set, use 360�
- {
- while (limiter < -180.0f)
+ } else
{
- if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
- {
- limiter =
-180.0f;
// stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
- limiterchanged
= true;
- } else
- {
- limiter +=
360.0f;
// flip to other side at limit including overflow
- limiterchanged
= true;
- }
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X) rx += cstate;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y) ry += cstate;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z) rz += cstate;
}
- }
- if (limiterchanged)
- {
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X) props[propi].rotaX =
limiter;
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y) props[propi].rotaY =
limiter;
- if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z) props[propi].rotaZ =
limiter;
- }
- }
-
- //offset prop
-
- // TODO Unused Varaible
- //float ox = props[propi].orgoffsetX;
-
- // TODO Unused Varaible
- //float oy = props[propi].orgoffsetY;
-
- // TODO Unused Varaible
- //float oz = props[propi].orgoffsetZ;
-
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_X || props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Y ||
props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Z)
- {
- float offset = 0.0f;
- float autooffset = 0.0f;
-
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_X) offset = props[propi].orgoffsetX;
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_Y) offset = props[propi].orgoffsetY;
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_Z) offset = props[propi].orgoffsetZ;
-
- offset += cstate;
- if (props[propi].animMode[animnum] &
ANIM_MODE_AUTOANIMATE)
- {
- autooffset = offset;
-
// check if a positive custom limit is set to
evaluate/calc flip back
+ bool limiterchanged = false;
+ // check if a positive custom
limit is set to evaluate/calc flip back
if
(props[propi].animOpt2[animnum] - props[propi].animOpt4[animnum])
{
- if (autooffset >
props[propi].animOpt2[animnum])
+ if (limiter >
props[propi].animOpt2[animnum])
{
if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
{
-
autooffset = props[propi].animOpt2[animnum]; // stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
+ limiter
= props[propi].animOpt2[animnum]; // stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
+
limiterchanged = true;
} else
-
autooffset = props[propi].animOpt1[animnum]; // flip to
other side at limit
+ {
+ limiter
= props[propi].animOpt1[animnum]; // flip to
other side at limit
+
limiterchanged = true;
+ }
}
- } else
// no custom limit set, use 10x as default
- while (autooffset >
10.0f)
+ } else
+ {
// no custom limit set, use 360�
+ while (limiter > 180.0f)
{
if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
{
-
autooffset = 10.0f;
// stop at limit
+ limiter
= 180.0f;
// stop at limit
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
+
limiterchanged = true;
} else
-
autooffset -= 20.0f;
// flip to other side at limit including overflow
+ {
+ limiter
-= 360.0f;
// flip to other side at limit
+
limiterchanged = true;
+ }
}
+ }
-
// check if a negative custom limit is set to
evaluate/calc flip back
+ // check if a negative custom
limit is set to evaluate/calc flip back
if
(props[propi].animOpt1[animnum] - props[propi].animOpt4[animnum])
{
- if (autooffset <
(props[propi].animOpt1[animnum]))
+ if (limiter <
(props[propi].animOpt1[animnum]))
{
if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
{
-
autooffset = props[propi].animOpt1[animnum]; // stop at limit
+ limiter
= props[propi].animOpt1[animnum]; // stop at limit
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
+
limiterchanged = true;
} else
-
autooffset = props[propi].animOpt2[animnum]; // flip to
other side at limit
+ {
+ limiter
= props[propi].animOpt2[animnum]; // flip to
other side at limit
+
limiterchanged = true;
+ }
}
- } else
// no custom limit set, use -10x�
- while (autooffset <
-10.0f)
+ } else
// no custom limit set, use 360�
+ {
+ while (limiter <
-180.0f)
{
if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
{
-
autooffset = -10.0f;
// stop at limit
-
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
+ limiter
= -180.0f;
// stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
+
limiterchanged = true;
} else
-
autooffset += 20.0f;
// flip to other side at limit including overflow
+ {
+ limiter
+= 360.0f;
// flip to other side at limit including overflow
+
limiterchanged = true;
+ }
}
+ }
+
+ if (limiterchanged)
+ {
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_X) props[propi].rotaX =
limiter;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Y) props[propi].rotaY =
limiter;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_ROTA_Z) props[propi].rotaZ =
limiter;
+ }
}
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_X)
+ //offset prop
+
+ // TODO Unused Varaible
+ //float ox = props[propi].orgoffsetX;
+
+ // TODO Unused Varaible
+ //float oy = props[propi].orgoffsetY;
+
+ // TODO Unused Varaible
+ //float oz = props[propi].orgoffsetZ;
+
+ if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_X || props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Y ||
props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Z)
{
- props[propi].offsetx = offset;
+ float offset = 0.0f;
+ float autooffset = 0.0f;
+
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_X) offset =
props[propi].orgoffsetX;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Y) offset =
props[propi].orgoffsetY;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Z) offset =
props[propi].orgoffsetZ;
+
+ offset += cstate;
if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
- props[propi].orgoffsetX
= autooffset;
+ {
+ autooffset = offset;
+
// check if a positive custom limit is set to
evaluate/calc flip back
+ if
(props[propi].animOpt2[animnum] - props[propi].animOpt4[animnum])
+ {
+ if (autooffset
> props[propi].animOpt2[animnum])
+ {
+ if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ {
+
autooffset = props[propi].animOpt2[animnum]; // stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
+ } else
+
autooffset = props[propi].animOpt1[animnum]; // flip to
other side at limit
+ }
+ } else
// no custom limit set, use 10x as default
+ while
(autooffset > 10.0f)
+ {
+ if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ {
+
autooffset = 10.0f;
// stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
+ } else
+
autooffset -= 20.0f;
// flip to other side at limit including overflow
+ }
+
+
// check if a negative custom limit is set to
evaluate/calc flip back
+ if
(props[propi].animOpt1[animnum] - props[propi].animOpt4[animnum])
+ {
+ if (autooffset
< (props[propi].animOpt1[animnum]))
+ {
+ if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ {
+
autooffset = props[propi].animOpt1[animnum]; // stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if active
+ } else
+
autooffset = props[propi].animOpt2[animnum]; // flip to
other side at limit
+ }
+ } else
// no custom limit set, use -10x�
+ while
(autooffset < -10.0f)
+ {
+ if
(props[propi].animMode[animnum] & ANIM_MODE_NOFLIP)
+ {
+
autooffset = -10.0f;
// stop at limit
+
props[propi].animOpt5[animnum] *= -1.0f; //
change cstate multiplier if bounce is set
+ } else
+
autooffset += 20.0f;
// flip to other side at limit including overflow
+ }
+ }
+
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_X)
+ {
+ props[propi].offsetx =
offset;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
+
props[propi].orgoffsetX = autooffset;
+ }
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Y)
+ {
+ props[propi].offsety =
offset;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
+
props[propi].orgoffsetY = autooffset;
+ }
+ if
(props[propi].animMode[animnum] & ANIM_MODE_OFFSET_Z)
+ {
+ props[propi].offsetz =
offset;
+ if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
+
props[propi].orgoffsetZ = autooffset;
+ }
}
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_Y)
- {
- props[propi].offsety = offset;
- if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
- props[propi].orgoffsetY
= autooffset;
- }
- if (props[propi].animMode[animnum] &
ANIM_MODE_OFFSET_Z)
- {
- props[propi].offsetz = offset;
- if
(props[propi].animMode[animnum] & ANIM_MODE_AUTOANIMATE)
- props[propi].orgoffsetZ
= autooffset;
- }
}
+ animnum++;
}
- animnum++;
+ //recalc the quaternions with final stacked rotation values (
rx, ry, rz )
+ rx += props[propi].rotaX;
+ ry += props[propi].rotaY;
+ rz += props[propi].rotaZ;
+ props[propi].rot = Quaternion(Degree(rz), Vector3::UNIT_Z) *
Quaternion(Degree(ry), Vector3::UNIT_Y) * Quaternion(Degree(rx),
Vector3::UNIT_X);
}
- //recalc the quaternions with final stacked rotation values ( rx, ry,
rz )
- rx += props[propi].rotaX;
- ry += props[propi].rotaY;
- rz += props[propi].rotaZ;
- props[propi].rot = Quaternion(Degree(rz), Vector3::UNIT_Z) *
Quaternion(Degree(ry), Vector3::UNIT_Y) * Quaternion(Degree(rx),
Vector3::UNIT_X);
}
BES_STOP(BES_CORE_AnimatedProps);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel
