Revision: 1690
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1690&view=rev
Author: rorthomas
Date: 2011-02-20 11:50:21 +0000 (Sun, 20 Feb 2011)
Log Message:
-----------
merged trigger beams
Modified Paths:
--------------
trunk/source/main/physics/Beam.cpp
trunk/source/main/physics/Beam.h
trunk/source/main/physics/BeamData.h
trunk/source/main/physics/BeamForcesEuler.cpp
trunk/source/main/physics/input_output/BeamLoadTruck.cpp
Modified: trunk/source/main/physics/Beam.cpp
===================================================================
--- trunk/source/main/physics/Beam.cpp 2011-02-20 11:33:19 UTC (rev 1689)
+++ trunk/source/main/physics/Beam.cpp 2011-02-20 11:50:21 UTC (rev 1690)
@@ -371,6 +371,7 @@
networkAuthlevel = 0;
beambreakdebug = (SETTINGS.getSetting("Beam Break Debug") == "Yes");
beamdeformdebug = (SETTINGS.getSetting("Beam Deform Debug") == "Yes");
+ triggerdebug = (SETTINGS.getSetting("Trigger Debug") == "Yes");
freePositioned = freeposition;
free_axle=0;
slideNodesConnectInstantly=false;
@@ -3425,7 +3426,7 @@
}
-void Beam::calcShocks2(int beam_i, Real difftoBeamL, Real &k, Real &d)
+void Beam::calcShocks2(int beam_i, Real difftoBeamL, Real &k, Real &d, Real dt)
{
if(!beams[beam_i].shock) return;
@@ -3557,12 +3558,109 @@
{
if (difftoBeamL > beams[i].longbound*beams[i].L || difftoBeamL
< -beams[i].shortbound*beams[i].L)
{
- // hard (normal) shock bump
- k=DEFAULT_SPRING;
- d=DEFAULT_DAMP;
+ if (beams[i].shock && beams[i].shock->flags &
!SHOCK_FLAG_ISTRIGGER) // this is NOT a trigger beam
+ {
+ // hard (normal) shock bump
+ k=DEFAULT_SPRING;
+ d=DEFAULT_DAMP;
+ }
}
+ if (beams[i].shock && beams[i].shock->flags &
SHOCK_FLAG_ISTRIGGER && beams[i].shock->trigger_enabled) // this is a trigger
and its enabled
+ {
+ if (difftoBeamL > beams[i].longbound*beams[i].L ||
difftoBeamL < -beams[i].shortbound*beams[i].L) // that has hit boundary
+ {
+ beams[i].shock->trigger_switch_state -= dt;
+ if (beams[i].shock->trigger_switch_state <=
0.0f) // emergency release for deadswitched trigger
+ beams[i].shock->trigger_switch_state =
0.0f;
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_BLOCKER) // this is an enabled blocker and past boundary
+ {
+ for (int scount = i + 1; scount <= i +
beams[i].shock->trigger_cmdshort; scount++) // (cylce blockerbeamID +1) to
(blockerbeamID + beams tob lock)
+ {
+ if (beams[scount].shock &&
beams[scount].shock->flags & SHOCK_FLAG_ISTRIGGER) // dont mess anything up if
the user set the number too big
+ {
+ if (triggerdebug &&
!beams[scount].shock->trigger_enabled)
+
LogManager::getSingleton().logMessage(" Trigger enabled. Blocker BeamID " +
StringConverter::toString(i) + " enabled trigger " +
StringConverter::toString(scount));
+
beams[scount].shock->trigger_enabled = true; // enable the trigger
+ }
+ }
+ } else
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_CMD_BLOCKER) // this an enabled cmd-key-blocker and past a
boundary
+ {
+
commandkey[beams[i].shock->trigger_cmdshort].trigger_cmdkeyblock_state = false;
// Release the cmdKey
+ if (triggerdebug)
+
LogManager::getSingleton().logMessage(" F-key trigger block released. Blocker
BeamID " + StringConverter::toString(i) + " Released F" +
StringConverter::toString(beams[i].shock->trigger_cmdshort));
+ } else
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_CMD_SWITCH) // this is an enabled cmdkey swictch and past a
boundary
+ {
+ if
(!beams[i].shock->trigger_switch_state)// this switch is triggered first time
in this boundary
+ {
+ for (int scount=0;
scount<free_shock; scount++)
+ {
+ int short1 =
beams[shocks[scount].beamid].shock->trigger_cmdshort; // cmdshort of checked
trigger beam
+ int short2 =
beams[i].shock->trigger_cmdshort; //
cmdshort of switch beam
+ int long1 =
beams[shocks[scount].beamid].shock->trigger_cmdlong; // cmdlong of
checked trigger beam
+ int long2 =
beams[i].shock->trigger_cmdlong; //
cmdlong of switch beam
+ int tmpi =
beams[shocks[scount].beamid].shock->beamid; // beamID
global of checked trigger beam
+ if (((short1 == short2
&& long1 == long2) || (short1 == long2 && long1 == short2)) && i != tmpi) //
found both command triggers then swap if its not the switching trigger
+ {
+ int tmpcmdkey =
beams[shocks[scount].beamid].shock->trigger_cmdlong;
+
beams[shocks[scount]. beamid].shock->trigger_cmdlong =
beams[shocks[scount].beamid].shock->trigger_cmdshort;
+
beams[shocks[scount].beamid].shock->trigger_cmdshort = tmpcmdkey;
+
beams[i].shock->trigger_switch_state = beams[i].shock->trigger_boundary_t ;
//prevent trigger switching again before leaving boundaries or timeout
+ if(triggerdebug)
+
LogManager::getSingleton().logMessage(" Trigger F-key commands switched. Switch
BeamID " + StringConverter::toString(i)+ " switched commands of Trigger BeamID
" + StringConverter::toString(beams[shocks[scount].beamid].shock->beamid) + "
to cmdShort: F" +
StringConverter::toString(beams[shocks[scount].beamid].shock->trigger_cmdshort)
+ ", cmdlong: F" +
StringConverter::toString(beams[shocks[scount].beamid].shock->trigger_cmdlong));
+ }
+ }
+ }
+ } else
+ { // just a trigger, check high/low boundary
and set action
+ if (difftoBeamL >
beams[i].longbound*beams[i].L) // trigger past longbound
+ {
+ if
(!commandkey[beams[i].shock->trigger_cmdlong].trigger_cmdkeyblock_state) //
related cmdkey is not blocked
+ {
+
commandkey[beams[i].shock->trigger_cmdlong].commandValue = 1;
+ if(triggerdebug)
+
LogManager::getSingleton().logMessage(" Trigger Longbound activated. Trigger
BeamID " + StringConverter::toString(i) + " Triggered F" +
StringConverter::toString(beams[i].shock->trigger_cmdlong));
+ }
+ } else // trigger past short bound
+ {
+ if
(!commandkey[beams[i].shock->trigger_cmdshort].trigger_cmdkeyblock_state) //
related cmdkey is not blocked
+ {
+
commandkey[beams[i].shock->trigger_cmdshort].commandValue = 1;
+ if(triggerdebug)
+
LogManager::getSingleton().logMessage(" Trigger Shortbound activated. Trigger
BeamID " + StringConverter::toString(i) + " Triggered F" +
StringConverter::toString(beams[i].shock->trigger_cmdshort));
+ }
+ }
+ }
+ } else // this is a trigger inside boundaries and its
enabled
+ {
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_BLOCKER) // this is an enabled blocker and inside boundary
+ {
+ for (int scount = i + 1; scount <= i +
beams[i].shock->trigger_cmdlong; scount++) // (cylce blockerbeamID + 1) to
(blockerbeamID + beams to release)
+ {
+ if (beams[scount].shock &&
beams[scount].shock->flags & SHOCK_FLAG_ISTRIGGER) // dont mess anything up if
the user set the number too big
+ {
+ if(triggerdebug &&
beams[scount].shock->trigger_enabled)
+
LogManager::getSingleton().logMessage(" Trigger disabled. Blocker BeamID " +
StringConverter::toString(i) + " disabled trigger " +
StringConverter::toString(scount));
+
beams[scount].shock->trigger_enabled = false; // disable the triggers
+ }
+ }
+ } else
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_CMD_SWITCH && beams[i].shock->trigger_switch_state) // this is a
switch that was activated and is back inside boundaries again
+ {
+ beams[i].shock->trigger_switch_state =
0.0f; //trigger_switch resetted
+ if(triggerdebug)
+
LogManager::getSingleton().logMessage(" Trigger switch resetted. Switch BeamID
" + StringConverter::toString(i));
+ } else
+ if (beams[i].shock->flags &
SHOCK_FLAG_TRG_CMD_BLOCKER &&
!commandkey[beams[i].shock->trigger_cmdshort].trigger_cmdkeyblock_state) //
this cmdkeyblocker is inside boundaries and cmdkeystate is diabled
+ {
+ if(triggerdebug)
+
LogManager::getSingleton().logMessage(" F-key trigger blocked. Blocker BeamID "
+ StringConverter::toString(i) + " Blocked F" +
StringConverter::toString(beams[i].shock->trigger_cmdshort));
+
commandkey[beams[i].shock->trigger_cmdshort].trigger_cmdkeyblock_state = true;
// activate trigger blocking
+ }
+ }
+ }
}
-
// save beam position for next sim cycle
beams[i].shock->lastpos=difftoBeamL;
}
Modified: trunk/source/main/physics/Beam.h
===================================================================
--- trunk/source/main/physics/Beam.h 2011-02-20 11:33:19 UTC (rev 1689)
+++ trunk/source/main/physics/Beam.h 2011-02-20 11:50:21 UTC (rev 1690)
@@ -129,7 +129,7 @@
int truckSteps;
void calcForcesEuler(int doUpdate, Real dt, int step, int maxsteps,
Beam** trucks, int numtrucks);
void truckTruckCollisions(Real dt, Beam** trucks, int numtrucks);
- void calcShocks2(int beam_i, Real difftoBeamL, Real &k, Real &d);
+ void calcShocks2(int beam_i, Real difftoBeamL, Real &k, Real &d, Real
dt);
void calcAnimators(int flagstate, float &cstate, int &div, float timer,
float opt1, float opt2, float opt3);
//! @}
@@ -409,7 +409,7 @@
int free_axle;
//! @}
- bool beambreakdebug, beamdeformdebug;
+ bool beambreakdebug, beamdeformdebug, triggerdebug;
// this must be in the header as the network stuff is using it...
Modified: trunk/source/main/physics/BeamData.h
===================================================================
--- trunk/source/main/physics/BeamData.h 2011-02-20 11:33:19 UTC (rev
1689)
+++ trunk/source/main/physics/BeamData.h 2011-02-20 11:50:21 UTC (rev
1690)
@@ -227,12 +227,17 @@
};
enum {
- SHOCK_FLAG_NORMAL = BITMASK(1),
- SHOCK_FLAG_INVISIBLE = BITMASK(2),
- SHOCK_FLAG_LACTIVE = BITMASK(3),
- SHOCK_FLAG_RACTIVE = BITMASK(4),
- SHOCK_FLAG_ISSHOCK2 = BITMASK(5),
- SHOCK_FLAG_SOFTBUMP = BITMASK(6),
+ SHOCK_FLAG_NORMAL = BITMASK(1),
+ SHOCK_FLAG_INVISIBLE = BITMASK(2),
+ SHOCK_FLAG_LACTIVE = BITMASK(3),
+ SHOCK_FLAG_RACTIVE = BITMASK(4),
+ SHOCK_FLAG_ISSHOCK2 = BITMASK(5),
+ SHOCK_FLAG_SOFTBUMP = BITMASK(6),
+ SHOCK_FLAG_ISTRIGGER = BITMASK(7),
+ SHOCK_FLAG_TRG_BLOCKER = BITMASK(8),
+ SHOCK_FLAG_TRG_CMD_SWITCH = BITMASK(9),
+ SHOCK_FLAG_TRG_CMD_BLOCKER = BITMASK(10),
+
};
enum {
@@ -299,7 +304,11 @@
float dampout;
float sprogout;
float dprogout;
-
+ int trigger_cmdlong; // F-key for trigger injection
longbound-check
+ int trigger_cmdshort; // F-key for trigger injection
shortbound-check
+ bool trigger_enabled; // general trigger,switch and
blocker state
+ float trigger_switch_state; // needed to avoid
doubleswitch, bool and timer in one
+ float trigger_boundary_t; // optional value to tune
trigger_switch_state autorelease
};
struct collcab_rate
@@ -483,6 +492,7 @@
struct command
{
float commandValue;
+ bool trigger_cmdkeyblock_state; //identifies blocked F-commands for
triggers
std::vector<int> beams;
std::vector<int> rotators;
Ogre::String description;
Modified: trunk/source/main/physics/BeamForcesEuler.cpp
===================================================================
--- trunk/source/main/physics/BeamForcesEuler.cpp 2011-02-20 11:33:19 UTC
(rev 1689)
+++ trunk/source/main/physics/BeamForcesEuler.cpp 2011-02-20 11:50:21 UTC
(rev 1690)
@@ -118,7 +118,7 @@
}
else // We assume the bounded=SHOCK2
case
{
- calcShocks2(i, difftoBeamL, k,
d);
+ calcShocks2(i, difftoBeamL, k,
d, dt);
}
}
else
Modified: trunk/source/main/physics/input_output/BeamLoadTruck.cpp
===================================================================
--- trunk/source/main/physics/input_output/BeamLoadTruck.cpp 2011-02-20
11:33:19 UTC (rev 1689)
+++ trunk/source/main/physics/input_output/BeamLoadTruck.cpp 2011-02-20
11:50:21 UTC (rev 1690)
@@ -206,6 +206,7 @@
if (!strcmp("advdrag",line)) {mode=54;continue;};
if (!strcmp("axles",line)) {mode=55;continue;};
if (!strcmp("shocks2",line)) {mode=56;continue;};
+ if (!strcmp("triggers",line)) {mode=57;continue;};
if (!strcmp("railgroups",line)) {mode=63;continue;}
if (!strcmp("slidenodes",line)) {mode=64;continue;}
if (!strcmp("flares2",line)) {mode=65;continue;};
@@ -1045,6 +1046,107 @@
options_pointer++;
}
}
+ else if (mode==57)
+ {
+ //parse triggers
+ int id1, id2, triggershort, triggerlong;
+ float sbound, lbound, boundarytimer = 1.0f;
+ char options[50]="n";
+ int result = sscanf(line,"%i, %i, %f, %f, %i, %i, %s
&f", &id1, &id2, &sbound, &lbound, &triggershort, &triggerlong, options,
boundarytimer);
+ if (result < 6 || result == EOF)
+ {
+ LogManager::getSingleton().logMessage("Error
parsing File (Triggers) " + String(fname) +" line " +
StringConverter::toString(linecounter) + ". trying to continue ...");
+ continue;
+ }
+ // checks ...
+ if(free_beam >= MAX_BEAMS)
+ {
+
LogManager::getSingleton().logMessage("Triggers, beams limit reached
("+StringConverter::toString(MAX_BEAMS)+"): " + String(fname) +" line " +
StringConverter::toString(linecounter) + ". trying to continue ...");
+ continue;
+ }
+ if(free_shock >= MAX_BEAMS)
+ {
+ LogManager::getSingleton().logMessage("Triggers
limit reached ("+StringConverter::toString(MAX_SHOCKS)+"): " + String(fname) +"
line " + StringConverter::toString(linecounter) + ". trying to continue ...");
+ continue;
+ }
+ if (id1>=free_node || id2>=free_node)
+ {
+ LogManager::getSingleton().logMessage("Error:
unknown node number in Triggers section
("+StringConverter::toString(id1)+","+StringConverter::toString(id2)+")");
+ exit(576);
+ }
+ if ((triggershort < 1 || triggershort > MAX_COMMANDS)
|| ((triggerlong < 1 || triggerlong > MAX_COMMANDS) && triggerlong !=-1 &&
triggerlong !=0))
+ {
+ LogManager::getSingleton().logMessage("Error:
Wrong command-eventnumber (Triggers) line " +
StringConverter::toString(linecounter) + ". Trigger deactivated.");
+ continue;
+ }
+ // options
+ int htype=BEAM_HYDRO;
+ int shockflag = SHOCK_FLAG_NORMAL |
SHOCK_FLAG_ISTRIGGER;
+ shocks[free_shock].trigger_enabled = true;
+ bool triggerblocker = false;
+ bool cmdkeyblock = false;
+ commandkey[triggershort].trigger_cmdkeyblock_state =
false;
+ if (triggerlong != -1)
commandkey[triggerlong].trigger_cmdkeyblock_state = false;
+
+ // now 'parse' the options
+ char *options_pointer = options;
+ while (*options_pointer != 0)
+ {
+ switch (*options_pointer)
+ {
+ case 'i': // invisible
+ htype=BEAM_INVISIBLE_HYDRO;
+ shockflag |=
SHOCK_FLAG_INVISIBLE;
+ break;
+ case 'x': // this trigger is
disabled on startup, default is enabled
+
shocks[free_shock].trigger_enabled = false;
+ break;
+ case 'B': // Blocker that
enable/disable other triggers
+ shockflag |=
SHOCK_FLAG_TRG_BLOCKER;
+ triggerblocker = true;
+ break;
+ case 'b': // Set the CommandKeys
that are set in a commandkeyblocker or trigger to blocked on startup, default
is released
+ cmdkeyblock = true;
+ break;
+ case 's': // switch that
exchanges cmdshort/cmdshort for all triggers with the same commandnumbers,
default false
+ shockflag |=
SHOCK_FLAG_TRG_CMD_SWITCH;
+ break;
+ case 'c': // trigger is set with
commandstyle boundaries instead of shocksytle
+ sbound = abs(sbound-1);
+ lbound = lbound-1;
+ break;
+ }
+ options_pointer++;
+ }
+ int pos=add_beam(&nodes[id1], &nodes[id2], manager,
parent, htype, default_break, 0.0f, 0.0f, -1.0, sbound, lbound, 1.0f);
+
+ if (triggerdebug)
+ LogManager::getSingleton().logMessage("Trigger
added. BeamID " + StringConverter::toString(pos) + " Line#: " +
StringConverter::toString(linecounter));
+ beams[pos].shock = &shocks[free_shock];
+ shocks[free_shock].beamid = pos;
+ shocks[free_shock].trigger_switch_state = 0.0f; //
used as bool and countdowntimer, dont touch!
+ if (!triggerblocker) // this is no triggerblocker (B)
+ {
+ shocks[free_shock].trigger_cmdshort =
triggershort;
+
+ if (triggerlong != -1) // this is a trigger
+ shocks[free_shock].trigger_cmdlong =
triggerlong;
+ else // this is a commandkeyblocker
+ shockflag |= SHOCK_FLAG_TRG_CMD_BLOCKER;
+ }
+ if (cmdkeyblock && !triggerblocker)
+ {
+
commandkey[triggershort].trigger_cmdkeyblock_state = true;
+ if (triggerlong != -1)
commandkey[triggerlong].trigger_cmdkeyblock_state = true;
+ }
+ if (boundarytimer > 0)
+ shocks[free_shock].trigger_boundary_t =
boundarytimer;
+ else
+ shocks[free_shock].trigger_boundary_t = 1.0f;
+ shocks[free_shock].flags = shockflag;
+ free_shock++;
+ }
+
else if (mode==4)
{
//parse shocks
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
The ultimate all-in-one performance toolkit: Intel(R) Parallel Studio XE:
Pinpoint memory and threading errors before they happen.
Find and fix more than 250 security defects in the development cycle.
Locate bottlenecks in serial and parallel code that limit performance.
http://p.sf.net/sfu/intel-dev2devfeb
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel