Revision: 1684
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1684&view=rev
Author:   rorthomas
Date:     2011-02-17 20:57:21 +0000 (Thu, 17 Feb 2011)

Log Message:
-----------
merged detacher group patch

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-17 00:33:04 UTC (rev 1683)
+++ trunk/source/main/physics/Beam.cpp  2011-02-17 20:57:21 UTC (rev 1684)
@@ -474,6 +474,7 @@
        default_node_volume=NODE_VOLUME_COEF_DEFAULT;
        default_node_surface=NODE_SURFACE_COEF_DEFAULT;
        default_node_loadweight=NODE_LOADWEIGHT_DEFAULT;
+       detacher_group_state=DEFAULT_DETACHER_GROUP; // initialize default(0) 
var for detacher_group_state
        default_plastic_coef=0.0f;
        strcpy(default_beam_material, "tracks/beam");
        driversseatfound=false;
@@ -976,7 +977,7 @@
 
        int pos=add_beam(&nodes[id1], &nodes[id2], tsm, \
                        beamsRoot, type, default_break * default_break_scale, 
default_spring * default_spring_scale, \
-                       default_damp * default_damp_scale, -1, -1, -1, 1, \
+                       default_damp * default_damp_scale, 
detacher_group_state,-1, -1, -1, 1, \
                        default_beam_diameter);
 
        beams[pos].type=BEAM_NORMAL;
@@ -1956,9 +1957,9 @@
        for (i=0; i<rays; i++)
        {
                //bounded
-               add_beam(&nodes[node1], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp, -1.0, 0.66, 0.0);
+               add_beam(&nodes[node1], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp, DEFAULT_DETACHER_GROUP, -1.0, 
0.66, 0.0);
                //bounded
-               add_beam(&nodes[node2], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp, -1.0, 0.66, 0.0);
+               add_beam(&nodes[node2], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp, DEFAULT_DETACHER_GROUP, 
-1.0, 0.66, 0.0);
                add_beam(&nodes[node2], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp);
                add_beam(&nodes[node1], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp);
                //reinforcement
@@ -2166,8 +2167,8 @@
        {
                //rim
                //bounded
-               add_beam(&nodes[node1], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp, -1.0, 0.66, 0.0);
-               add_beam(&nodes[node2], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp, -1.0, 0.66, 0.0);
+               add_beam(&nodes[node1], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp, DEFAULT_DETACHER_GROUP, -1.0, 
0.66, 0.0);
+               add_beam(&nodes[node2], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp, DEFAULT_DETACHER_GROUP, 
-1.0, 0.66, 0.0);
                add_beam(&nodes[node2], &nodes[nodebase+i*2], manager, parent, 
BEAM_INVISIBLE, default_break, wspring, wdamp);
                add_beam(&nodes[node1], &nodes[nodebase+i*2+1], manager, 
parent, BEAM_INVISIBLE, default_break, wspring, wdamp);
                //reinforcement
@@ -2215,9 +2216,9 @@
                pos=add_beam(&nodes[nodebase+2*rays+i*2+1], 
&nodes[nodebase+((i+1)%rays)*2], manager, parent, BEAM_INVISIBLE, 
default_break, wspring2, wdamp2);
                pressure_beams[free_pressure_beam]=pos; free_pressure_beam++;
                //backpressure, bounded
-               pos=add_beam(&nodes[node1], &nodes[nodebase+2*rays+i*2], 
manager, parent, BEAM_INVISIBLE, default_break, wspring2, wdamp2, -1.0, 
radius/radius2, 0.0);
+               pos=add_beam(&nodes[node1], &nodes[nodebase+2*rays+i*2], 
manager, parent, BEAM_INVISIBLE, default_break, wspring2, wdamp2, 
DEFAULT_DETACHER_GROUP, -1.0, radius/radius2, 0.0);
                pressure_beams[free_pressure_beam]=pos; free_pressure_beam++;
-               pos=add_beam(&nodes[node2], &nodes[nodebase+2*rays+i*2+1], 
manager, parent, BEAM_INVISIBLE, default_break, wspring2, wdamp2, -1.0, 
radius/radius2, 0.0);
+               pos=add_beam(&nodes[node2], &nodes[nodebase+2*rays+i*2+1], 
manager, parent, BEAM_INVISIBLE, default_break, wspring2, wdamp2, 
DEFAULT_DETACHER_GROUP, -1.0, radius/radius2, 0.0);
                pressure_beams[free_pressure_beam]=pos; free_pressure_beam++;
        }
        //wheel object
@@ -2318,7 +2319,7 @@
        if (type==NODE_LOADED) masscount++;
 }
 
-int Beam::add_beam(node_t *p1, node_t *p2, SceneManager *manager, SceneNode 
*parent, int type, Real strength, Real spring, Real damp, Real length, float 
shortbound, float longbound, float precomp,float diameter)
+int Beam::add_beam(node_t *p1, node_t *p2, SceneManager *manager, SceneNode 
*parent, int type, Real strength, Real spring, Real damp, int detachgroupstate, 
Real length, float shortbound, float longbound, float precomp,float diameter)
 {
        int pos=free_beam;
 
@@ -2326,6 +2327,7 @@
        beams[pos].p2=p2;
        beams[pos].p2truck=0;
        beams[pos].type=type;
+       beams[pos].detacher_group=detachgroupstate;
        if (length<0.0)
        {
                //calculate the length

Modified: trunk/source/main/physics/Beam.h
===================================================================
--- trunk/source/main/physics/Beam.h    2011-02-17 00:33:04 UTC (rev 1683)
+++ trunk/source/main/physics/Beam.h    2011-02-17 20:57:21 UTC (rev 1684)
@@ -197,6 +197,7 @@
                , Real strength
                , Real spring
                , Real damp
+               , int detachgroupstate=DEFAULT_DETACHER_GROUP
                , Real length=-1.0
                , float shortbound=-1.0
                , float longbound=-1.0
@@ -485,6 +486,7 @@
        blinktype blinkingtype;
        Light *cablight;
 
+       int detacher_group_state; // current detacher group for the next beam 
generated
        bool enable_wheel2;
        bool deleting;
 

Modified: trunk/source/main/physics/BeamData.h
===================================================================
--- trunk/source/main/physics/BeamData.h        2011-02-17 00:33:04 UTC (rev 
1683)
+++ trunk/source/main/physics/BeamData.h        2011-02-17 20:57:21 UTC (rev 
1684)
@@ -235,6 +235,10 @@
        SHOCK_FLAG_SOFTBUMP     = BITMASK(6),
 };
 
+enum { 
+       DEFAULT_DETACHER_GROUP  = 0, // default for detaching beam group
+};
+
 /* some info holding arrays */
 static const float flapangles[6] = {0.0, -0.07, -0.17, -0.33, -0.67, -1.0};
 
@@ -336,6 +340,7 @@
        Ogre::Real commandLong;
        Ogre::Real maxtiestress;
        Ogre::Real diameter;
+       int detacher_group;     // detacher group number (integer)
        Ogre::Vector3 lastforce;
        bool iscentering;
        int isOnePressMode;

Modified: trunk/source/main/physics/BeamForcesEuler.cpp
===================================================================
--- trunk/source/main/physics/BeamForcesEuler.cpp       2011-02-17 00:33:04 UTC 
(rev 1683)
+++ trunk/source/main/physics/BeamForcesEuler.cpp       2011-02-17 20:57:21 UTC 
(rev 1684)
@@ -241,16 +241,36 @@
                                        //connected to it.
                                        if (!((beams[i].p1->contacter && 
nodeBeamConnections(beams[i].p1->pos)<3) || (beams[i].p2->contacter && 
nodeBeamConnections(beams[i].p2->pos)<3)))
                                        {
-                                               beams[i].broken=1;
-                                               beams[i].disabled=true;
-                                               sflen=0.0f;
-                                               beams[i].p1->isSkin=true;
-                                               beams[i].p2->isSkin=true;
+                                               sflen = 0.0f;
+                                               beams[i].broken     = true;
+                                               beams[i].disabled   = true;
+                                               beams[i].p1->isSkin = true;
+                                               beams[i].p2->isSkin = true;
 
                                                if(beambreakdebug)
                                                {
                                                        
LogManager::getSingleton().logMessage(" XXX Beam " + 
StringConverter::toString(i) + " just broke with force " + 
StringConverter::toString(flen) + " / " + 
StringConverter::toString(beams[i].strength) + ". It was between nodes " + 
StringConverter::toString(beams[i].p1->id) + " and " + 
StringConverter::toString(beams[i].p2->id) + ".");
                                                }
+                                               //detachergroup check: beam[i] 
is already broken, check detacher group# == 0/default skip the check ( 
performance bypass for beams with default setting )
+                                               if (beams[i].detacher_group)
+                                               {
+                                                       //cycle once through 
the other beams
+                                                       for (int j = 0; j < 
free_beam; j++)
+                                                       {
+                                                               // beam[i] 
detacher group# == checked beams detacher group# -> delete & disable checked 
beam
+                                                               if 
(beams[j].detacher_group == beams[i].detacher_group)
+                                                               {
+                                                                       
beams[j].broken     = true;
+                                                                       
beams[j].disabled   = true;
+                                                                       
beams[j].p1->isSkin = true;
+                                                                       
beams[j].p2->isSkin = true;
+                                                                       
if(beambreakdebug)
+                                                                       {
+                                                                               
LogManager::getSingleton().logMessage("Deleting Detacher BeamID: " + 
StringConverter::toString(j) + ", Detacher Group: " + 
StringConverter::toString(beams[i].detacher_group)+  ", trucknum: " + 
StringConverter::toString(trucknum));
+                                                                       }
+                                                               }
+                                                       }
+                                               }
                                        } else 
beams[i].strength=2.0f*beams[i].minmaxposnegstress;
 
                                        //something broke, check buoyant hull

Modified: trunk/source/main/physics/input_output/BeamLoadTruck.cpp
===================================================================
--- trunk/source/main/physics/input_output/BeamLoadTruck.cpp    2011-02-17 
00:33:04 UTC (rev 1683)
+++ trunk/source/main/physics/input_output/BeamLoadTruck.cpp    2011-02-17 
20:57:21 UTC (rev 1684)
@@ -211,6 +211,20 @@
                if (!strcmp("flares2",line)) {mode=65;continue;};
                if (!strcmp("animators",line)) {mode=66;continue;};
                if (!strcmp("nodecollision",line)) {mode=68;continue;};
+               if (!strncmp("detacher_group", line, 14))
+               {
+                       int detgroup = DEFAULT_DETACHER_GROUP;
+                       int result = sscanf(line,"detacher_group %i", 
&detgroup);
+                       if (result < 1 || result == EOF) 
+                       {
+                               // set default (0) as var for the 
add_beam(detacher_group) until a new valid detacher group# is parsed
+                               detacher_group_state = DEFAULT_DETACHER_GROUP;
+                               continue;
+                       }
+                       // valid truck line input ( int >= 1 ), set it as var 
for the add_beam(detacher_group) until a new valid detacher group# is parsed
+                       detacher_group_state = detgroup;
+                       continue;
+               }
                if (!strncmp("enable_advanced_deformation", line, 27))
                {
                        // parse the optional threshold value
@@ -1006,7 +1020,7 @@
 
                        int pos=add_beam(&nodes[id1], &nodes[id2], manager, \
                                parent, type, default_break * 
default_break_scale, default_spring * default_spring_scale, \
-                               default_damp * default_damp_scale, -1, -1, -1, 
1, \
+                               default_damp * default_damp_scale, 
detacher_group_state, -1, -1, -1, 1, \
                                default_beam_diameter);
 
                        // now 'parse' the options
@@ -1099,7 +1113,7 @@
                                }
                                options_pointer++;
                        }
-                       int pos = add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break*4.0, s, d, -1.0, sbound, lbound, precomp);
+                       int pos = add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break*4.0, s, d, detacher_group_state, -1.0, sbound, 
lbound, precomp);
                        beams[pos].shock = &shocks[free_shock];
                        shocks[free_shock].beamid = pos;
                        shocks[free_shock].flags = shockflag;
@@ -1192,7 +1206,7 @@
                                }
                                options_pointer++;
                        }
-                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break*4.0, sin, din, -1.0, sbound, lbound, precomp);
+                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break*4.0, sin, din, detacher_group_state, -1.0, sbound, 
lbound, precomp);
                        beams[pos].bounded=SHOCK2;
                        beams[pos].shock = &shocks[free_shock];
                        shocks[free_shock].springin = sin;
@@ -1284,7 +1298,7 @@
                                
hydroInertia->setCmdKeyDelay(free_hydro,inertia_startDelay,inertia_stopDelay, 
String (inertia_default_startFunction), String (inertia_default_stopFunction));
 
 
-                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale);
+                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale, detacher_group_state);
                        hydro[free_hydro]=pos;free_hydro++;
                        beams[pos].Lhydro=beams[pos].L;
                        beams[pos].hydroRatio=ratio;
@@ -1390,7 +1404,7 @@
                        if(hydroInertia && (inertia_startDelay > 0 || 
inertia_stopDelay > 0))
                                
hydroInertia->setCmdKeyDelay(free_hydro,inertia_startDelay,inertia_stopDelay, 
String (inertia_default_startFunction), String (inertia_default_stopFunction));
 
-                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale);
+                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale, detacher_group_state);
                        hydro[free_hydro]=pos;
                        free_hydro++;
                        beams[pos].Lhydro=beams[pos].L;
@@ -1751,7 +1765,7 @@
                                continue;
                        }
 
-                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale, -1, -1, -1, 1, 
default_beam_diameter);
+                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, htype, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale, detacher_group_state, 
-1, -1, -1, 1, default_beam_diameter);
                        // now 'parse' the options
                        options_pointer = options;
                        while (*options_pointer != 0)
@@ -1889,7 +1903,7 @@
                                LogManager::getSingleton().logMessage("cannot 
create rope: beams limit reached ("+StringConverter::toString(MAX_BEAMS)+"): " 
+ String(fname) +" line " + StringConverter::toString(linecounter) + ". trying 
to continue ...");
                                continue;
                        }
-                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, BEAM_NORMAL, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale);
+                       int pos=add_beam(&nodes[id1], &nodes[id2], manager, 
parent, BEAM_NORMAL, default_break * default_break_scale, default_spring * 
default_spring_scale, default_damp * default_damp_scale, detacher_group_state);
                        beams[pos].bounded=ROPE;
 
                        rope_t r;


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