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