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

Reply via email to