Revision: 2496
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2496&view=rev
Author:   ulteq
Date:     2012-05-03 20:59:40 +0000 (Thu, 03 May 2012)
Log Message:
-----------
-Cleanup: Improved collisions.h & collisions.cpp

Modified Paths:
--------------
    trunk/source/main/gameplay/RoRFrameListener.cpp
    trunk/source/main/physics/BeamForcesEuler.cpp
    trunk/source/main/physics/collision/collisions.cpp
    trunk/source/main/physics/collision/collisions.h

Modified: trunk/source/main/gameplay/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.cpp     2012-05-03 04:59:02 UTC 
(rev 2495)
+++ trunk/source/main/gameplay/RoRFrameListener.cpp     2012-05-03 20:59:40 UTC 
(rev 2496)
@@ -4326,7 +4326,7 @@
 
                if (!strncmp(line,"collision-tris", 14))
                {
-                       long amount = DEFAULT_MAX_COLLISION_TRIS;
+                       long amount = Collisions::MAX_COLLISION_TRIS;
                        int res = sscanf(line, "collision-tris %ld", &amount);
                        collisions->resizeMemory(amount);
                }

Modified: trunk/source/main/physics/BeamForcesEuler.cpp
===================================================================
--- trunk/source/main/physics/BeamForcesEuler.cpp       2012-05-03 04:59:02 UTC 
(rev 2495)
+++ trunk/source/main/physics/BeamForcesEuler.cpp       2012-05-03 20:59:40 UTC 
(rev 2496)
@@ -880,10 +880,10 @@
                                        //FX
                                        if (gm && doUpdate && dustp)
                                        {
-                                               if (gm->fx_type==FX_DUSTY && 
!nodes[i].disable_particles)
+                                               if 
(gm->fx_type==Collisions::FX_DUSTY && !nodes[i].disable_particles)
                                                {
                                                        if(dustp) 
dustp->malloc(nodes[i].AbsPosition, nodes[i].Velocity/2.0, gm->fx_colour);
-                                               }else if (gm->fx_type==FX_HARD 
&& !nodes[i].disable_particles)
+                                               }else if 
(gm->fx_type==Collisions::FX_HARD && !nodes[i].disable_particles)
                                                {
                                                        float thresold=10.0;
                                                        //smokey
@@ -902,7 +902,7 @@
                                                                // friction < 
10 will remove the 'f' nodes from the spark generation nodes
                                                                if(sparksp) 
sparksp->allocSparks(nodes[i].AbsPosition, nodes[i].Velocity);
                                                        }
-                                               } else if 
(gm->fx_type==FX_CLUMPY && !nodes[i].disable_particles)
+                                               } else if 
(gm->fx_type==Collisions::FX_CLUMPY && !nodes[i].disable_particles)
                                                {
                                                        if (clumpp && 
nodes[i].Velocity.squaredLength()>1.0) clumpp->allocClump(nodes[i].AbsPosition, 
nodes[i].Velocity/2.0, gm->fx_colour);
                                                }

Modified: trunk/source/main/physics/collision/collisions.cpp
===================================================================
--- trunk/source/main/physics/collision/collisions.cpp  2012-05-03 04:59:02 UTC 
(rev 2495)
+++ trunk/source/main/physics/collision/collisions.cpp  2012-05-03 20:59:40 UTC 
(rev 2496)
@@ -113,7 +113,6 @@
        , collision_count(0)
        , collision_tris(0)
        , forcecam(false)
-       , free_cell(0)
        , free_collision_box(0)
        , free_collision_tri(0)
        , free_eventsource(0)
@@ -123,26 +122,26 @@
        , largest_cellcount(0)
        , last_called_cbox(0)
        , last_used_ground_model(0)
-       , max_col_tris(DEFAULT_MAX_COLLISION_TRIS)
+       , max_col_tris(MAX_COLLISION_TRIS)
 {
-       for (int i=0; i < HASH_SIZE; i++)
+       for (int i=0; i < HASH_POWER; i++)
        {
                hashmask = hashmask << 1;
                hashmask++;
        }
 
-       for (int i=0; i < (1 << HASH_SIZE); i++)
+       for (int i=0; i < HASH_SIZE; i++)
        {
                hashtable[i].cellid = UNUSED_CELLID;
        }
 
-       collision_tris = (collision_tri_t*)malloc(sizeof(collision_tri_t) * 
DEFAULT_MAX_COLLISION_TRIS);
+       collision_tris = (collision_tri_t*)malloc(sizeof(collision_tri_t) * 
MAX_COLLISION_TRIS);
 
        loadDefaultModels();
        defaultgm = getGroundModelByString("concrete");
        defaultgroundgm = getGroundModelByString("gravel");
 
-       if ( debugMode )
+       if (debugMode)
        {
                debugmo = smgr->createManualObject();
                debugmo->begin("tracks/debug/collision/triangle", 
RenderOperation::OT_TRIANGLE_LIST);
@@ -151,7 +150,7 @@
 
 void Collisions::resizeMemory(long newSize)
 {
-       if(collision_tris)
+       if (collision_tris)
        {
                free(collision_tris);
                collision_tris = 0;
@@ -161,7 +160,6 @@
        free_collision_tri = 0;
        max_col_tris = newSize;
        collision_tris = (collision_tri_t*)malloc(sizeof(collision_tri_t) * 
newSize);
-
 }
 
 int Collisions::loadDefaultModels()
@@ -214,10 +212,10 @@
                parseGroundConfig(&cfg, it->first);
        }
        // check the version
-       if(this->collisionVersion != LATEST_GROUND_MODEL_VERSION)
+       if(this->collision_version != LATEST_GROUND_MODEL_VERSION)
        {
                // message box
-               String url = 
"http://wiki.rigsofrods.com/index.php?title=Error_Old_ground_model#"+TOSTRING(this->collisionVersion)+"to"+TOSTRING(LATEST_GROUND_MODEL_VERSION);
+               String url = 
"http://wiki.rigsofrods.com/index.php?title=Error_Old_ground_model#"+TOSTRING(this->collision_version)+"to"+TOSTRING(LATEST_GROUND_MODEL_VERSION);
                showOgreWebError(_L("Configuration error"), _L("Your ground 
configuration is too old, please copy skeleton/config/ground_models.cfg to My 
Documents/Rigs of Rods/config"), url);
                exit(124);
        }
@@ -246,7 +244,7 @@
                        if(secName == "general" || secName == "config")
                        {
                                // set some class properties accoring to the 
information in this section
-                               if(kname == "version") this->collisionVersion = 
StringConverter::parseInt(kvalue);
+                               if(kname == "version") this->collision_version 
= StringConverter::parseInt(kvalue);
                        } else
                        {
                                // we assume that all other sections are 
separate ground types!
@@ -352,8 +350,6 @@
        return newPos;
 }
 
-
-
 void Collisions::setupLandUse(const char *configfile)
 {
 #ifdef USE_PAGED
@@ -380,31 +376,28 @@
 unsigned int Collisions::hashfunc(unsigned int cellid)
 {
        unsigned int hash = 0;
-       for (int i=0; i<4; i++)
+       for (int i=0; i < 4; i++)
        {
-               hash^=sbox[((unsigned char*)&cellid)[i]];
-               hash*=3;
+               hash ^= sbox[((unsigned char*)&cellid)[i]];
+               hash *= 3;
        }
        return hash&hashmask;
 }
 
 int Collisions::removeCollisionTri(int number)
 {
-       if(number>free_collision_tri)
-               return -1;
+       if (number > free_collision_tri) return -1;
 
        Vector3 p1 = collision_tris[number].a;
        Vector3 p2 = collision_tris[number].b;
        Vector3 p3 = collision_tris[number].c;
-       // TODO: Unused Variable
-       //ground_model_t* gm = collision_tris[number].gm;
 
-       //compute tri AAB
+       // compute tri AAB
        AxisAlignedBox aab;
        aab.merge(p1);
        aab.merge(p2);
        aab.merge(p3);
-       //register this collision tri in the index
+       // register this collision tri in the index
        int ilox, ihix, iloz, ihiz;
        ilox=(int)(aab.getMinimum().x/(float)CELL_SIZE);
        if (ilox<0) ilox=0; if (ilox>MAXIMUM_CELL) ilox=MAXIMUM_CELL;
@@ -414,10 +407,9 @@
        if (iloz<0) iloz=0; if (iloz>MAXIMUM_CELL) iloz=MAXIMUM_CELL;
        ihiz=(int)(aab.getMaximum().z/(float)CELL_SIZE);
        if (ihiz<0) ihiz=0; if (ihiz>MAXIMUM_CELL) ihiz=MAXIMUM_CELL;
-       int i,j;
-       for (i=ilox; i<=ihix; i++)
+       for (int i=ilox; i <= ihix; i++)
        {
-               for (j=iloz; j<=ihiz; j++)
+               for (int j=iloz; j <= ihiz; j++)
                {
                        hash_free(i,j,number+MAX_COLLISION_BOXES);
                }
@@ -427,17 +419,17 @@
 
 void Collisions::hash_free(int cell_x, int cell_z, int value)
 {
-       unsigned int cellid=(cell_x<<16)+cell_z;
-       unsigned int pos=hashfunc(cellid);
+       unsigned int cellid = (cell_x << 16) + cell_z;
+       unsigned int pos    = hashfunc(cellid);
 
        // set cell to free state
-       if(hashtable[pos].cellid != UNUSED_CELLID)
+       if (hashtable[pos].cellid != UNUSED_CELLID)
        {
                cell_t *cell = hashtable[pos].cell;
                // cell has content, search it
-               for(unsigned int i=0;i<cell->size();i++)
+               for (unsigned int i=0; i < cell->size(); i++)
                {
-                       if((*cell)[i] == value)
+                       if ((*cell)[i] == value)
                        {
                                // remove that element
                                cell->erase(cell->begin() + i);
@@ -449,65 +441,67 @@
 
 void Collisions::hash_add(int cell_x, int cell_z, int value)
 {
-       unsigned int cellid=(cell_x<<16)+cell_z;
-       unsigned int hash=hashfunc(cellid);
-       //search the spot
-       unsigned int pos=hash;
-       unsigned int stop=hash-1;
-       if (hash==0) stop=(1<<HASH_SIZE)-1;
-//LOG("COLL: adding "+TOSTRING(cell_x)+", "+TOSTRING(cell_z)+" 
hash="+TOSTRING(hash));
+       unsigned int cellid = (cell_x << 16) + cell_z;
+       unsigned int pos    = hashfunc(cellid);
 
-       while (pos!=stop && hashtable[pos].cellid!=UNUSED_CELLID && 
hashtable[pos].cellid!=cellid)
+       // Cycle through hashtable: start at pos
+       for (unsigned int i=0; i < HASH_SIZE; i++)
        {
+               if (hashtable[pos].cellid == UNUSED_CELLID || 
hashtable[pos].cellid == cellid)
+                       break;
+
                pos++;
-               if (pos==(1<<HASH_SIZE)) pos=0;
+               if (pos >= HASH_SIZE) pos = 0;
        }
 
-       if (hashtable[pos].cellid==UNUSED_CELLID)
+       if (hashtable[pos].cellid == UNUSED_CELLID)
        {
-               //create a new cell
+               // create a new cell
                cell_t* newcell = new cell_t;
                
-               hashtable[pos].cellid=cellid;
-               hashtable[pos].cell=newcell;
+               hashtable[pos].cellid = cellid;
+               hashtable[pos].cell = newcell;
                newcell->push_back(value);
                cells.push_back(newcell);
-               if (pos!=hashfunc(cellid)) collision_count++;
-               if ((int)newcell->size()>largest_cellcount) 
largest_cellcount=(int)newcell->size();
+               if (pos != hashfunc(cellid))
+               {
+                       collision_count++;
+               }
+               largest_cellcount = std::max(largest_cellcount, 
(int)newcell->size());
        }
-       else if (hashtable[pos].cellid==cellid)
+       else if (hashtable[pos].cellid == cellid)
        {
-               //there is already a cell ready
-               cell_t *cell=hashtable[pos].cell;
-               cell->push_back(value);
-               if ((int)cell->size()>largest_cellcount) 
largest_cellcount=(int)cell->size();
+               // there is already a cell ready
+               hashtable[pos].cell->push_back(value);
+               largest_cellcount = std::max(largest_cellcount, 
(int)hashtable[pos].cell->size());
        }
        else
        {
-               //the hash table is full!!!
-               LOG("COLL: the hashtable is full!!!");
+               LOG("COLL: The hashtable is full.");
        }
 }
 
 cell_t *Collisions::hash_find(int cell_x, int cell_z)
 {
-       unsigned int cellid=(cell_x<<16)+cell_z;
-       unsigned int hash=hashfunc(cellid);
-       //search the spot
-       unsigned int pos=hash;
-       unsigned int stop=hash-1;
-       if (hash==0) stop=(1<<HASH_SIZE)-1;
+       unsigned int cellid = (cell_x << 16) + cell_z;
+       unsigned int pos    = hashfunc(cellid);
 
-       while (pos!=stop && hashtable[pos].cellid!=UNUSED_CELLID && 
hashtable[pos].cellid!=cellid)
+       // Cycle through hashtable: start at pos
+       for (unsigned int i=0; i < HASH_SIZE; i++)
        {
+               if (hashtable[pos].cellid == UNUSED_CELLID)
+                       return NULL;
+
+               if (hashtable[pos].cellid == cellid)
+                       return hashtable[pos].cell;
+
                pos++;
-               if (pos==(1<<HASH_SIZE)) pos=0;
+               if (pos >= HASH_SIZE) pos = 0;
        }
-       if (hashtable[pos].cellid==cellid) return hashtable[pos].cell;
+
        return NULL;
 }
 
-
 int Collisions::addCollisionBox(SceneNode *tenode, bool rotating, bool virt, 
float px, float py, float pz, float rx, float ry, float rz, float lx,float 
hx,float ly,float hy,float lz,float hz,float srx,float sry,float srz, const 
char* eventname, const char* instancename, bool forcecam, Vector3 campos, float 
scx, float scy, float scz, float drx, float dry, float drz, int event_filter, 
int scripthandler)
 {
        Quaternion      rotation=Quaternion(Degree(rx), 
Vector3::UNIT_X)*Quaternion(Degree(ry), Vector3::UNIT_Y)*Quaternion(Degree(rz), 
Vector3::UNIT_Z);
@@ -518,30 +512,30 @@
        Ogre::Vector3 sc(scx, scy, scz);
        collision_box_t& coll_box = collision_boxes[free_collision_box];
        coll_box.enabled = true;
-       //set refined box anyway
+       // set refined box anyway
        coll_box.relo = l*sc;
        coll_box.rehi = h*sc;
-       //calculate selfcenter anyway
+       // calculate selfcenter anyway
        coll_box.selfcenter = coll_box.relo;
        coll_box.selfcenter += coll_box.rehi;
        coll_box.selfcenter *= 0.5;
        
-       //and center too (we need it)
+       // and center too (we need it)
        coll_box.center = p;
        coll_box.virt=virt;
 
        coll_box.event_filter=event_filter;
-       //camera stuff
+       // camera stuff
        coll_box.camforced=forcecam;
        if (forcecam)
        {
                coll_box.campos=coll_box.center+rotation*campos;
        }
 
-       //first, selfrotate
+       // first, self-rotate
        if (rotating)
        {
-               //we have a self-rotated block
+               // we have a self-rotated block
                coll_box.selfrotated=true;
                coll_box.selfrot=Quaternion(Degree(srx), 
Vector3::UNIT_X)*Quaternion(Degree(sry), 
Vector3::UNIT_Y)*Quaternion(Degree(srz), Vector3::UNIT_Z);
                coll_box.selfunrot=coll_box.selfrot.Inverse();
@@ -552,7 +546,7 @@
        if (strlen(eventname)>0)
        {
 //LOG("COLL: adding "+TOSTRING(free_eventsource)+" "+String(instancename)+" 
"+String(eventname));
-               //this is envent-generating
+               // this is event-generating
                strcpy(eventsources[free_eventsource].boxname, eventname);
                strcpy(eventsources[free_eventsource].instancename, 
instancename);
                eventsources[free_eventsource].scripthandler = scripthandler;
@@ -564,16 +558,16 @@
                free_eventsource++;
        }
 
-       //next, global rotate
+       // next, global rotate
        if (fabs(rx)<0.0001f && fabs(ry)<0.0001f && fabs(rz)<0.0001f)
        {
-               //unrefined box
+               // unrefined box
                coll_box.refined=false;
        } else
        {
-               //refined box
+               // refined box
                coll_box.refined=true;
-               //build rotation
+               // build rotation
                coll_box.rot=rotation;
                coll_box.unrot=rotation.Inverse();
        }
@@ -582,7 +576,7 @@
        if(debugMode) debugsn = 
smgr->getRootSceneNode()->createChildSceneNode();
 
 
-       //set raw box
+       // set raw box
        // 8 points of a cube
        Vector3 cube_points[8];
        if (coll_box.selfrotated || coll_box.refined)
@@ -596,7 +590,7 @@
                cube_points[6] = Ogre::Vector3(lx, hy, hz) * sc;
                cube_points[7] = Ogre::Vector3(hx, hy, hz) * sc;
                int i;
-               //rotate box
+               // rotate box
                if (coll_box.selfrotated)
                        for (i=0; i<8; i++)
                        {
@@ -604,12 +598,7 @@
                                cube_points[i]=coll_box.selfrot*cube_points[i];
                                
cube_points[i]=cube_points[i]+coll_box.selfcenter;
                        }
-                       if (coll_box.refined)
-                       {
-                               for (i=0; i<8; i++) 
cube_points[i]=coll_box.rot*cube_points[i];
-//                                     if (coll_box.camerabox) 
coll_box.camerapos=coll_box.rot*coll_box.camerapos;
-                       }
-                       //find min/max
+                       // find min/max
                        coll_box.lo = cube_points[0];
                        coll_box.hi = cube_points[0];
                        for (i=1; i<8; i++)
@@ -617,13 +606,13 @@
                                coll_box.lo.makeFloor(cube_points[i]);
                                coll_box.hi.makeCeil(cube_points[i]);
                        }
-                       //set absolute coords
+                       // set absolute coords
                        coll_box.lo += p;
                        coll_box.hi += p;
        }
        else
        {
-               //unrefined box
+               // unrefined box
                coll_box.lo = p + coll_box.relo;
                coll_box.hi = p + coll_box.rehi;
                Vector3 d = (coll_box.rehi - coll_box.relo);
@@ -734,7 +723,7 @@
 
        }
 
-       //register this collision box in the index
+       // register this collision box in the index
        coll_box.ilo = Ogre::Vector3(coll_box.lo / Ogre::Real(CELL_SIZE));
        coll_box.ihi = Ogre::Vector3(coll_box.hi / Ogre::Real(CELL_SIZE));
        
@@ -793,31 +782,31 @@
 
 int Collisions::addCollisionTri(Vector3 p1, Vector3 p2, Vector3 p3, 
ground_model_t* gm)
 {
-       if(free_collision_tri >= max_col_tris) return -1;
+       if (free_collision_tri >= max_col_tris) return -1;
        collision_tris[free_collision_tri].a=p1;
        collision_tris[free_collision_tri].b=p2;
        collision_tris[free_collision_tri].c=p3;
        collision_tris[free_collision_tri].gm=gm;
        collision_tris[free_collision_tri].enabled=true;
-       //compute transformations
-       //base construction
+       // compute transformations
+       // base construction
        Vector3 bx=p2-p1;
        Vector3 by=p3-p1;
        Vector3 bz=bx.crossProduct(by);
        bz.normalise();
-       //coordinates change matrix
+       // coordinates change matrix
        collision_tris[free_collision_tri].reverse.SetColumn(0, bx);
        collision_tris[free_collision_tri].reverse.SetColumn(1, by);
        collision_tris[free_collision_tri].reverse.SetColumn(2, bz);
        
collision_tris[free_collision_tri].forward=collision_tris[free_collision_tri].reverse.Inverse();
 
-       //compute tri AAB
+       // compute tri AAB
        AxisAlignedBox aab;
        aab.merge(p1);
        aab.merge(p2);
        aab.merge(p3);
        
-       //register this collision tri in the index
+       // register this collision tri in the index
        Ogre::Vector3 ilo(aab.getMinimum() / Ogre::Real(CELL_SIZE));
        Ogre::Vector3 ihi(aab.getMaximum() / Ogre::Real(CELL_SIZE));
        
@@ -852,7 +841,6 @@
        LOG("COLL: Hashtable occupation: "+TOSTRING(cells.size()));
        LOG("COLL: Hashtable collisions: "+TOSTRING(collision_count));
        LOG("COLL: Largest cell: "+TOSTRING(largest_cellcount));
-
 }
 
 bool Collisions::envokeScriptCallback(collision_box_t *cbox, node_t *node)
@@ -885,7 +873,7 @@
 
 bool Collisions::collisionCorrect(Vector3 *refpos)
 {
-       //find the correct cell
+       // find the correct cell
        bool contacted=false;
        int refx, refz;
        unsigned int k;
@@ -910,7 +898,7 @@
 
                        if (cbox->refined || cbox->selfrotated)
                        {
-                               //we may have a collision, do a change of repere
+                               // we may have a collision, do a change of 
repere
                                Vector3 Pos=*refpos-cbox->center;
                                if (cbox->refined) Pos=cbox->unrot*Pos;
                                if (cbox->selfrotated)
@@ -919,7 +907,7 @@
                                        Pos=cbox->selfunrot*Pos;
                                        Pos=Pos+cbox->selfcenter;
                                }
-                               //now test with the inner box
+                               // now test with the inner box
                                if (Pos > cbox->relo && Pos < cbox->rehi)
                                {
                                        if (cbox->eventsourcenum!=-1 && 
permitEvent(cbox->event_filter))
@@ -933,13 +921,13 @@
                                        }
                                        if (!cbox->virt)
                                        {
-                                               //collision, process as usual
-                                               //we have a collision
+                                               // collision, process as usual
+                                               // we have a collision
                                                contacted = true;
-                                               //determine which side collided
+                                               // determine which side collided
                                                Pos = calcCollidedSide(Pos, 
cbox->relo, cbox->rehi);
                                                
-                                               //resume repere
+                                               // resume repere
                                                if (cbox->selfrotated)
                                                {
                                                        
Pos=Pos-cbox->selfcenter;
@@ -964,9 +952,9 @@
                                }
                                if (!cbox->virt)
                                {
-                                       //we have a collision
+                                       // we have a collision
                                        contacted=true;
-                                       //determine which side collided
+                                       // determine which side collided
                                        (*refpos) = calcCollidedSide((*refpos), 
cbox->lo, cbox->hi);
                                }
                        }
@@ -976,10 +964,10 @@
                        collision_tri_t 
*ctri=&collision_tris[(*cell)[k]-MAX_COLLISION_BOXES];
                        if(!ctri->enabled)
                                continue;
-                       //check if this tri is minimal
-                       //transform
+                       // check if this tri is minimal
+                       // transform
                        Vector3 point=ctri->forward*(*refpos-ctri->a);
-                       //test if within tri collision volume (potential cause 
of bug!)
+                       // test if within tri collision volume (potential cause 
of bug!)
                        if (point.x>=0 && point.y>=0 && (point.x+point.y)<=1.0 
&& point.z<0 && point.z>-0.1)
                        {
                                if (-point.z<minctridist)
@@ -992,14 +980,14 @@
                }
        }
                
-       //process minctri collision
+       // process minctri collision
        if (minctri)
        {
-               //we have a contact
+               // we have a contact
                contacted=true;
-               //correct point
+               // correct point
                minctripoint.z=0;
-               //reverse transform
+               // reverse transform
                *refpos=(minctri->reverse*minctripoint)+minctri->a;
        }
        return contacted;
@@ -1023,8 +1011,7 @@
 
 int Collisions::enableCollisionTri(int number, bool enable)
 {
-       if(number>free_collision_tri)
-               return -1;
+       if (number > free_collision_tri) return -1;
        collision_tris[number].enabled=enable;
        return 0;
 }
@@ -1032,13 +1019,13 @@
 bool Collisions::nodeCollision(node_t *node, bool iscinecam, int contacted, 
float dt, float* nso, ground_model_t** ogm, int *handlernum)
 {
        bool smoky=false;
-       //float corrf=1.0;
+       // float corrf=1.0;
        Vector3 oripos=node->AbsPosition;
        unsigned int k;
-       //find the correct cell
+       // find the correct cell
        int refx, refz;
-       refx=(int)(node->AbsPosition.x*inverse_CELL_SIZE);
-       refz=(int)(node->AbsPosition.z*inverse_CELL_SIZE);
+       refx=(int)(node->AbsPosition.x/CELL_SIZE);
+       refz=(int)(node->AbsPosition.z/CELL_SIZE);
        cell_t *cell=hash_find(refx, refz);
        //LOG("Checking cell "+TOSTRING(refx)+" "+TOSTRING(refz)+" total 
indexes: "+TOSTRING(num_cboxes_index[refp]));
 
@@ -1050,14 +1037,14 @@
        {
                for (k=0; k<cell->size(); k++)
                {
-                       if ((*cell)[k] != (int)UNUSED_CELLELEMENT && 
(*cell)[k]<MAX_COLLISION_BOXES)
+                       if ((*cell)[k] != (int)UNUSED_CELLELEMENT && (*cell)[k] 
< MAX_COLLISION_BOXES)
                        {
                                collision_box_t *cbox = 
&collision_boxes[(*cell)[k]];
                                if (node->AbsPosition > cbox->lo - 
node->collRadius && node->AbsPosition < cbox->hi + node->collRadius)
                                {
                                        if (cbox->refined || cbox->selfrotated)
                                        {
-                                               //we may have a collision, do a 
change of repere
+                                               // we may have a collision, do 
a change of repere
                                                Vector3 
Pos=node->AbsPosition-cbox->center;
                                                if (cbox->refined) 
Pos=cbox->unrot*Pos;
                                                if (cbox->selfrotated)
@@ -1066,7 +1053,7 @@
                                                        Pos=cbox->selfunrot*Pos;
                                                        
Pos=Pos+cbox->selfcenter;
                                                }
-                                               //now test with the inner box
+                                               // now test with the inner box
                                                if (Pos > cbox->relo - 
node->collRadius && Pos < cbox->rehi + node->collRadius)
                                                {
                                                        if 
(cbox->eventsourcenum!=-1 && permitEvent(cbox->event_filter))
@@ -1080,14 +1067,14 @@
                                                        }
                                                        if (!cbox->virt)
                                                        {
-                                                               //collision, 
process as usual
-                                                               //we have a 
collision
+                                                               // collision, 
process as usual
+                                                               // we have a 
collision
                                                                contacted++;
-                                                               //setup smoke
+                                                               // setup smoke
                                                                //float 
ns=node->Velocity.length();
                                                                smoky=true;
                                                                //*nso=ns;
-                                                               //determine 
which side collided
+                                                               // determine 
which side collided
                                                                float 
min=Pos.z-(cbox->relo - node->collRadius).z;
                                                                Vector3 
normal=Vector3(0,0,-1);
                                                                float 
t=(cbox->rehi + node->collRadius).z-Pos.z;
@@ -1101,8 +1088,8 @@
                                                                t=(cbox->rehi + 
node->collRadius).y-Pos.y;
                                                                if (t<min) 
{min=t; normal=Vector3(0,1,0);}; //up
 
-                                                               //we need the 
normal, and the depth
-                                                               //resume repere 
for the normal
+                                                               // we need the 
normal, and the depth
+                                                               // resume 
repere for the normal
                                                                if 
(cbox->selfrotated) normal=cbox->selfrot*normal;
                                                                if 
(cbox->refined) normal=cbox->rot*normal;
 
@@ -1125,13 +1112,13 @@
                                                }
                                                if (!cbox->virt)
                                                {
-                                                       //we have a collision
+                                                       // we have a collision
                                                        contacted++;
-                                                       //setup smoke
+                                                       // setup smoke
                                                        //float 
ns=node->Velocity.length();
                                                        smoky=true;
                                                        //*nso=ns;
-                                                       //determine which side 
collided
+                                                       // determine which side 
collided
                                                        float 
min=node->AbsPosition.z-cbox->lo.z;
                                                        Vector3 
normal=Vector3(0,0,-1);
                                                        float 
t=cbox->hi.z-node->AbsPosition.z;
@@ -1144,8 +1131,8 @@
                                                        if (t<min) {min=t; 
normal=Vector3(0,-1,0);}; //down
                                                        
t=cbox->hi.y-node->AbsPosition.y;
                                                        if (t<min) {min=t; 
normal=Vector3(0,1,0);}; //up
-                                                       //we need the normal
-                                                       //resume repere for the 
normal
+                                                       // we need the normal
+                                                       // resume repere for 
the normal
                                                        if (cbox->selfrotated) 
normal=cbox->selfrot*normal;
                                                        if (cbox->refined) 
normal=cbox->rot*normal;
                                                        
primitiveCollision(node, node->Forces, node->Velocity, normal, dt, defaultgm, 
nso);
@@ -1156,12 +1143,12 @@
                        }
                        else
                        {
-                               //tri collision
+                               // tri collision
                                collision_tri_t 
*ctri=&collision_tris[(*cell)[k]-MAX_COLLISION_BOXES];
-                               //check if this tri is minimal
-                               //transform
+                               // check if this tri is minimal
+                               // transform
                                Vector3 
point=ctri->forward*(node->AbsPosition-ctri->a);
-                               //test if within tri collision volume 
(potential cause of bug!)
+                               // test if within tri collision volume 
(potential cause of bug!)
                                if (point.x>=0 && point.y>=0 && 
(point.x+point.y)<=1.0 && point.z<0 && point.z>-0.1)
                                {
                                        if (-point.z<minctridist)
@@ -1174,26 +1161,26 @@
                        }
                }
        }
-       //process minctri collision
+       // process minctri collision
        if (minctri)
        {
-               //we have a contact
+               // we have a contact
                contacted++;
-               //setup smoke
+               // setup smoke
                //float ns=node->Velocity.length();
                smoky=true;
                //*nso=ns;
 
-               //we need the normal
-               //resume repere for the normal
+               // we need the normal
+               // resume repere for the normal
                Vector3 normal=minctri->reverse*Vector3::UNIT_Z;
                primitiveCollision(node, node->Forces, node->Velocity, normal, 
dt, minctri->gm, nso);
                if (ogm) *ogm=minctri->gm;
-               /*
+#if 0
                float depth=-minctripoint.z;
-               //compute slip velocity vector
+               // compute slip velocity vector
                Vector3 
slip=node->Velocity-node->Velocity.dotProduct(normal)*normal;
-               //remove the normal speed component
+               // remove the normal speed component
                node->Velocity=slip;
                float slipl=slip.length();
                if (slipl<0.5) node->Velocity=Vector3::ZERO;
@@ -1205,15 +1192,15 @@
                        if (slipfactor>1) slipfactor=1;
                        node->Velocity*=loadfactor*slipfactor;
                }
-               //correct point
+               // correct point
                minctripoint.z=0;
-               //reverse transform
+               // reverse transform
                node->AbsPosition=(minctri->reverse*minctripoint)+minctri->a;
-               //grip
+               // grip
                //node->Velocity=Vector3::ZERO;
-               */
+#endif
        }
-       //correct relative position too
+       // correct relative position too
        if (contacted) 
node->RelPosition=node->RelPosition+(node->AbsPosition-oripos);
        node->contacted=contacted;
        return smoky;
@@ -1304,7 +1291,7 @@
        {
                if (cbox->refined || cbox->selfrotated)
                {
-                       //we may have a collision, do a change of repere
+                       // we may have a collision, do a change of repere
                        Vector3 rpos=pos-cbox->center;
                        if (cbox->refined) rpos=cbox->unrot*rpos;
                        if (cbox->selfrotated)
@@ -1314,7 +1301,7 @@
                                rpos=rpos+cbox->selfcenter;
                        }
                        
-                       //now test with the inner box
+                       // now test with the inner box
                        if (rpos >cbox->relo
                        && rpos < cbox->rehi)
                        {
@@ -1334,12 +1321,12 @@
        if(!*ogm) *ogm = defaultgroundgm;
        last_used_ground_model = *ogm;
 
-       //new ground collision code
+       // new ground collision code
        Real v=hfinder->getHeightAt(node->AbsPosition.x, node->AbsPosition.z);
        if (v>node->AbsPosition.y)
        {
 
-               //collision!
+               // collision!
                Ogre::Vector3 normal = 
hfinder->getNormalAt(node->AbsPosition.x, v, node->AbsPosition.z);
                primitiveCollision(node, node->Forces, node->Velocity, normal, 
dt, *ogm, nso, v-node->AbsPosition.y);
                return true;
@@ -1349,7 +1336,7 @@
 
 void Collisions::primitiveCollision(node_t *node, Vector3 &force, Vector3 
&velocity, Vector3 &normal, float dt, ground_model_t* gm, float* nso, float 
penetration, float reaction)
 {
-       //normal velocity
+       // normal velocity
 
        float Vnormal = velocity.dotProduct(normal);
 
@@ -1362,11 +1349,11 @@
                // First of all calculate power law fluid viscosity
                float m = gm->flow_consistency_index * approx_pow(Vsquared, 
(gm->flow_behavior_index - 1.0f)*0.5f);
 
-               //Then calculate drag based on above. We'are using a simplified 
Stokes' drag.
+               // Then calculate drag based on above. We'are using a 
simplified Stokes' drag.
                // Per node fluid drag surface coefficient set by node property 
applies here
                Vector3 Fdrag = velocity * (-m * node->surface_coef);
 
-               //If we have anisotropic drag
+               // If we have anisotropic drag
                if (gm->drag_anisotropy < 1.0f && Vnormal > 0)
                {
                        float da_factor;
@@ -1378,9 +1365,9 @@
                }
                force += Fdrag;
 
-               //Now calculate upwards force based on a simplified boyancy 
equation;
-               //If the fluid is pseudoplastic then boyancy is constrained to 
only "stopping" a node from going downwards
-               //Buoyancy per node volume coefficient set by node property 
applies here
+               // Now calculate upwards force based on a simplified boyancy 
equation;
+               // If the fluid is pseudoplastic then boyancy is constrained to 
only "stopping" a node from going downwards
+               // Buoyancy per node volume coefficient set by node property 
applies here
                float Fboyancy = gm->fluid_density * penetration * 
(-DEFAULT_GRAVITY) * node->volume_coef;
                if (gm->flow_behavior_index < 1.0f && Vnormal >= 0.0f)
                {
@@ -1419,14 +1406,14 @@
                Fnormal = force.dotProduct(normal);
                Fdnormal = Fnormal;
 
-               //steady force
+               // steady force
                if (reaction < 0)
                {
                        Freaction = -Fnormal;
-                       //impact force
+                       // impact force
                        if (Vnormal < 0)
                        {
-                               Freaction += -Vnormal * node->mass / dt; 
//Newton's second law
+                               Freaction += -Vnormal * node->mass / dt; // 
Newton's second law
                        }
                        if (Freaction < 0) Freaction = 0.0f;
                }
@@ -1450,7 +1437,7 @@
                }
                else
                {
-                       //Stribek model. It also comes directly from textbooks.
+                       // Stribek model. It also comes directly from textbooks.
                        float g = gm->mc + (gm->ms - gm->mc) * std::min(1.0f, 
approx_exp(-approx_pow(slipv / gm->vs, gm->alpha)));
                        ff = -(g + gm->t2 * slipv) * Greaction;
                        force += Freaction * normal + ff*slip;
@@ -1463,15 +1450,14 @@
        return 0;
        static int loaded = 0;
        // prevent double calling
-       if(loaded != 0)
-               return -1;
+       if (loaded != 0) return -1;
 
        // create materials
        int i = 0;
        char bname[256];
        for(i=0;i<=100;i++)
        {
-               //register a material for skeleton view
+               // register a material for skeleton view
                sprintf(bname, "mat-coll-dbg-%d", i);
                MaterialPtr 
mat=(MaterialPtr)(MaterialManager::getSingleton().create(bname, 
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME));
                float f = fabs(((float)i)/100);
@@ -1565,7 +1551,7 @@
                                mo_node->attachObject(mo);
 
 
-                               /*
+#if 0
                                // setup the label
                                String labelName = "label_"+cell_name;
                                String labelCaption = cell_name+" 
"+TOSTRING(percent*100,2) + "% usage 
("+TOSTRING(cc)+"/"+TOSTRING(CELL_BLOCKSIZE)+") DEEP: " + TOSTRING(deep);
@@ -1577,7 +1563,7 @@
                                mt->setCharacterHeight(0.3);
                                mt->setColor(ColourValue::Black);
                                mo_node->attachObject(mt);
-                               */
+#endif
 
                                mo_node->setVisible(true);
                                
mo_node->setPosition(Vector3(x+CELL_SIZE/(float)2.0, groundheight, 
z+CELL_SIZE/(float)2.0));
@@ -1691,7 +1677,7 @@
 
        added_shared = false;
 
-       // Run through the submeshes again, adding the data into the arrays
+       // Run through the sub-meshes again, adding the data into the arrays
        for(int i = 0;i < mesh->getNumSubMeshes();i++)
        {
                SubMesh* submesh = mesh->getSubMesh(i);
@@ -1767,4 +1753,4 @@
                debugsn->setPosition(Vector3::ZERO);
                debugsn->attachObject(debugmo);
        }
-}
\ No newline at end of file
+}

Modified: trunk/source/main/physics/collision/collisions.h
===================================================================
--- trunk/source/main/physics/collision/collisions.h    2012-05-03 04:59:02 UTC 
(rev 2495)
+++ trunk/source/main/physics/collision/collisions.h    2012-05-03 20:59:40 UTC 
(rev 2496)
@@ -25,42 +25,6 @@
 #include "BeamData.h" // for collision_box_t
 #include "Ogre.h"
 
-#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
-#include <windows.h>
-#endif
-
-//these are absolute maximums per terrain
-#define MAX_COLLISION_BOXES 5000
-#define DEFAULT_MAX_COLLISION_TRIS 100000
-//this is a power of two! Change with caution
-#define HASH_SIZE 20
-//how many elements per cell? power of 2 minus 2 is better
-#define CELL_BLOCKSIZE 126
-//how many cells in the pool? Increase in case of sparce distribution of 
objects
-#define MAX_CELLS 10000
-#define UNUSED_CELLID 0xFFFFFFFF
-#define UNUSED_CELLELEMENT 0xFFFFFFFF
-//terrain size is limited to 327km x 327km:
-#define CELL_SIZE 2.0
-#define inverse_CELL_SIZE 0.5
-#define MAXIMUM_CELL 0x7FFF
-
-#define MAX_EVENTSOURCE 500
-
-#define LATEST_GROUND_MODEL_VERSION 3
-#define LATEST_LANDUSE_VERSION 1
-
-//nothing
-#define FX_NONE 0
-//hard surface: rubber burning and sparks
-#define FX_HARD 1
-//dusty surface (with dust colour)
-#define FX_DUSTY 2
-//throws clumps (e.g. snow, grass) with colour
-#define FX_CLUMPY 3
-
-#define FX_PARTICLE 4
-
 typedef struct _eventsource
 {
        char instancename[256];
@@ -72,115 +36,150 @@
        bool enabled;
 } eventsource_t;
 
-typedef struct _collision_tri
-{
-       Ogre::Vector3 a;
-       Ogre::Vector3 b;
-       Ogre::Vector3 c;
-       Ogre::Matrix3 forward;
-       Ogre::Matrix3 reverse;
-       ground_model_t* gm;
-       bool enabled;
-} collision_tri_t;
-
-//typedef struct _cell
-//{
-//     std::vector<int> element;//[CELL_BLOCKSIZE]; //value is stored in 
here...
-//} cell_t;
 typedef std::vector<int> cell_t;
 
-typedef struct _hash
-{
-       unsigned int cellid;
-       cell_t *cell;
-} hash_t;
-
 class Landusemap;
 
 class Collisions
 {
+public:
+
+       enum SurfaceType {
+               FX_NONE,
+               FX_HARD,    // hard surface: rubber burning and sparks
+               FX_DUSTY,   // dusty surface (with dust colour)
+               FX_CLUMPY,  // throws clumps (e.g. snow, grass) with colour
+               FX_PARTICLE
+       };
+
+       // these are absolute maximums per terrain
+       static const int MAX_COLLISION_BOXES = 5000;
+       static const int MAX_COLLISION_TRIS = 100000;
+
 private:
-       //collision boxes pool
+
+       typedef struct _hash
+       {
+               unsigned int cellid;
+               cell_t *cell;
+       } hash_t;
+
+       typedef struct _collision_tri
+       {
+               Ogre::Vector3 a;
+               Ogre::Vector3 b;
+               Ogre::Vector3 c;
+               Ogre::Matrix3 forward;
+               Ogre::Matrix3 reverse;
+               ground_model_t* gm;
+               bool enabled;
+       } collision_tri_t;
+
+
+       static const int LATEST_GROUND_MODEL_VERSION = 3;
+       static const int MAX_EVENT_SOURCE = 500;
+
+       // this is a power of two, change with caution
+       static const int HASH_POWER = 20;
+       static const int HASH_SIZE = 1 << HASH_POWER;
+
+       // how many elements per cell? power of 2 minus 2 is better
+       static const int CELL_BLOCKSIZE = 126;
+
+       // how many cells in the pool? Increase in case of sparse distribution 
of objects
+       //static const int MAX_CELLS = 10000;
+       static const int UNUSED_CELLID = 0xFFFFFFFF;
+       static const int UNUSED_CELLELEMENT = 0xFFFFFFFF;
+
+       // terrain size is limited to 327km x 327km:
+       static const int CELL_SIZE = 2.0; // we divide through this
+       static const int MAXIMUM_CELL = 0x7FFF;
+
+       // collision boxes pool
        collision_box_t collision_boxes[MAX_COLLISION_BOXES];
+       collision_box_t *last_called_cbox;
        int free_collision_box;
-       //collision tris pool;
+
+       // collision tris pool;
        collision_tri_t *collision_tris;
        int free_collision_tri;
-       //collision hashtable
-       hash_t hashtable[1<<HASH_SIZE];
-       //cell pool
-       std::vector<cell_t*> cells;//[MAX_CELLS];
-       int free_cell;
 
-       collision_box_t *last_called_cbox;
+       // collision hashtable
+       hash_t hashtable[HASH_SIZE];
 
-       eventsource_t eventsources[MAX_EVENTSOURCE];
+       // cell pool
+       std::vector<cell_t*> cells;
+
+       // ground models
+       std::map<Ogre::String, ground_model_t> ground_models;
+
+       // event sources
+       eventsource_t eventsources[MAX_EVENT_SOURCE];
        int free_eventsource;
 
        bool permitEvent(int filter);
        bool envokeScriptCallback(collision_box_t *cbox, node_t *node=0);
 
-       RoRFrameListener *mefl;
-       unsigned int hashmask;
        HeightFinder *hfinder;
-       int collision_count;
-       int largest_cellcount;
-       bool debugMode;
        Landusemap *landuse;
-       Ogre::SceneManager *smgr;
        Ogre::ManualObject *debugmo;
+       Ogre::SceneManager *smgr;
+       RoRFrameListener *mefl;
+       bool debugMode;
+       int collision_count;
+       int collision_version;
+       int largest_cellcount;
+       long max_col_tris;
+       unsigned int hashmask;
 
-private:
-       /// What is value for?? seams to be the array location where the items 
are stored
        void hash_add(int cell_x, int cell_z, int value);
        void hash_free(int cell_x, int cell_z, int value);
        cell_t *hash_find(int cell_x, int cell_z);
        unsigned int hashfunc(unsigned int cellid);
-       int collisionVersion;
-       std::map<Ogre::String, ground_model_t> ground_models;
        void parseGroundConfig(Ogre::ConfigFile *cfg, Ogre::String 
groundModel=Ogre::String());
 
        Ogre::Vector3 calcCollidedSide(const Ogre::Vector3& pos, Ogre::Vector3& 
lo, Ogre::Vector3& hi);
-       long max_col_tris;
+
 public:
+
        bool forcecam;
        Ogre::Vector3 forcecampos;
        ground_model_t *defaultgm, *defaultgroundgm;
 
        eventsource_t *getEvent(int eventID) { return &eventsources[eventID]; };
 
-       void clearEventCache();
-
        Collisions() {}; // for wrapper, DO NOT USE!
 
        Collisions(RoRFrameListener *efl, Ogre::SceneManager *mgr, bool 
debugMode);
 
-       int addCollisionBox(Ogre::SceneNode *tenode, bool rotating, bool virt, 
float px, float py, float pz, float rx, float ry, float rz, float lx, float hx, 
float ly, float hy, float lz, float hz, float srx, float sry, float srz, const 
char* eventname, const char* instancename, bool forcecam, Ogre::Vector3 campos, 
float scx=1.0f, float scy=1.0f, float scz=1.0f, float drx=0.0f, float dry=0.0f, 
float drz=0.0f, int event_filter=EVENT_ALL, int scripthandler=-1);
-       int addCollisionTri(Ogre::Vector3 p1, Ogre::Vector3 p2, Ogre::Vector3 
p3, ground_model_t* gm);
-       int addCollisionMesh(Ogre::String meshname, Ogre::Vector3 pos, 
Ogre::Quaternion q, Ogre::Vector3 scale, ground_model_t *gm=0, std::vector<int> 
*collTris=0);
-       bool collisionCorrect(Ogre::Vector3 *refpos);
-       bool nodeCollision(node_t *node, bool iscinecam, int contacted, float 
dt, float* nso, ground_model_t** ogm, int *handlernum=0);
+
        Ogre::Vector3 getPosition(char* instance, char* box);
        Ogre::Quaternion getDirection(char* instance, char* box);
        collision_box_t *getBox(char* instance, char* box);
+
+       void setHfinder(HeightFinder *hf);
+
        eventsource_t *isTruckInEventBox(Beam *truck);
+
+       bool collisionCorrect(Ogre::Vector3 *refpos);
+       bool groundCollision(node_t *node, float dt, ground_model_t** gm, float 
*nso=0);
        bool isInside(Ogre::Vector3 pos, char* instance, char* box, float 
border=0);
        bool isInside(Ogre::Vector3 pos, collision_box_t *cbox, float border=0);
-       bool groundCollision(node_t *node, float dt, ground_model_t** gm, float 
*nso=0);
+       bool nodeCollision(node_t *node, bool iscinecam, int contacted, float 
dt, float* nso, ground_model_t** ogm, int *handlernum=0);
+
+       void clearEventCache();
+       void finishLoadingTerrain();
        void primitiveCollision(node_t *node, Ogre::Vector3 &normal, 
Ogre::Vector3 &force, Ogre::Vector3 &velocity, float dt, ground_model_t* gm, 
float* nso, float penetration=0, float reaction=-1.0f);
-       void setHfinder(HeightFinder *hf);
        void printStats();
 
+       int addCollisionBox(Ogre::SceneNode *tenode, bool rotating, bool virt, 
float px, float py, float pz, float rx, float ry, float rz, float lx, float hx, 
float ly, float hy, float lz, float hz, float srx, float sry, float srz, const 
char* eventname, const char* instancename, bool forcecam, Ogre::Vector3 campos, 
float scx=1.0f, float scy=1.0f, float scz=1.0f, float drx=0.0f, float dry=0.0f, 
float drz=0.0f, int event_filter=EVENT_ALL, int scripthandler=-1);
+       int addCollisionMesh(Ogre::String meshname, Ogre::Vector3 pos, 
Ogre::Quaternion q, Ogre::Vector3 scale, ground_model_t *gm=0, std::vector<int> 
*collTris=0);
+       int addCollisionTri(Ogre::Vector3 p1, Ogre::Vector3 p2, Ogre::Vector3 
p3, ground_model_t* gm);
+       int createCollisionDebugVisualization();
        int enableCollisionTri(int number, bool enable);
+       int removeCollisionBox(int number);
        int removeCollisionTri(int number);
 
-       int removeCollisionBox(int number);
-
-       void finishLoadingTerrain();
-
-       int createCollisionDebugVisualization();
-
-
        // ground models things
        int loadDefaultModels();
        int loadGroundModelsConfigFile(Ogre::String filename);
@@ -190,9 +189,9 @@
        ground_model_t *last_used_ground_model;
 
        void getMeshInformation(Ogre::Mesh* mesh, size_t &vertex_count, 
Ogre::Vector3* &vertices,
-                       size_t &index_count, unsigned* &indices,
-                       const Ogre::Vector3 &position = Ogre::Vector3::ZERO,
-                       const Ogre::Quaternion &orient = 
Ogre::Quaternion::IDENTITY, const Ogre::Vector3 &scale = 
Ogre::Vector3::UNIT_SCALE);
+               size_t &index_count, unsigned* &indices,
+               const Ogre::Vector3 &position = Ogre::Vector3::ZERO,
+               const Ogre::Quaternion &orient = Ogre::Quaternion::IDENTITY, 
const Ogre::Vector3 &scale = Ogre::Vector3::UNIT_SCALE);
        void resizeMemory(long newSize);
 };
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to