Attached Files |
-
collisionSphereOffset.diff (5,372 bytes) 2007-02-13 23:24
Index: Rendering/UnitModels/3DModelParser.cpp
===================================================================
--- Rendering/UnitModels/3DModelParser.cpp (revision 3407)
+++ Rendering/UnitModels/3DModelParser.cpp (working copy)
@@ -28,6 +28,15 @@
return unit3doparser->Load3DO(name,scale,side);
}
+S3DOModel* C3DModelParser::Load3DO(string name,float scale,int side,const float3& offsets)
+{
+ StringToLowerInPlace(name);
+ if(name.find(".s3o")!=string::npos)
+ return units3oparser->Load3DO(name,scale,side);
+ else
+ return unit3doparser->Load3DO(name,scale,side,offsets);
+}
+
LocalS3DOModel *C3DModelParser::CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces)
{
if(model->rootobject3do)
Index: Rendering/UnitModels/3DModelParser.h
===================================================================
--- Rendering/UnitModels/3DModelParser.h (revision 3407)
+++ Rendering/UnitModels/3DModelParser.h (working copy)
@@ -72,6 +72,7 @@
~C3DModelParser(void);
S3DOModel* Load3DO(string name,float scale=1,int side=1);
+ S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);
C3DOParser* unit3doparser;
Index: Rendering/UnitModels/3DOParser.cpp
===================================================================
--- Rendering/UnitModels/3DOParser.cpp (revision 3407)
+++ Rendering/UnitModels/3DOParser.cpp (working copy)
@@ -248,6 +248,17 @@
return model;
}
+S3DOModel* C3DOParser::Load3DO(string name,float scale,int team,const float3& offsets)
+{
+ S3DOModel *model = C3DOParser::Load3DO(name, scale, team);
+ model->rootobject3do->relMidPos.x=offsets.x;
+ model->rootobject3do->relMidPos.y=offsets.y;
+ model->rootobject3do->relMidPos.z=offsets.z;
+ model->relMidPos = model->rootobject3do->relMidPos;
+
+ return model;
+}
+
void C3DOParser::GetVertexes(_3DObject* o,S3DO* object)
{
curOffset=o->OffsetToVertexArray;
Index: Rendering/UnitModels/3DOParser.h
===================================================================
--- Rendering/UnitModels/3DOParser.h (revision 3407)
+++ Rendering/UnitModels/3DOParser.h (working copy)
@@ -94,6 +94,7 @@
C3DOParser();
virtual ~C3DOParser();
S3DOModel* Load3DO(string name,float scale=1,int side=1);
+ S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);
private:
Index: Sim/Units/Unit.cpp
===================================================================
--- Sim/Units/Unit.cpp (revision 3407)
+++ Sim/Units/Unit.cpp (working copy)
@@ -937,7 +937,12 @@
radarhandler->MoveUnit(this);
//model=unitModelLoader->GetModel(model->name,newteam);
- model = modelParser->Load3DO(model->name.c_str(), 1, newteam);
+ if (unitDef->useCSOffset) {
+ model = modelParser->Load3DO(model->name.c_str(),unitDef->collisionSphereScale,newteam, unitDef->collisionSphereOffset);
+ }
+ else {
+ model = modelParser->Load3DO(model->name.c_str(),unitDef->collisionSphereScale,newteam);
+ }
delete localmodel;
localmodel = modelParser->CreateLocalModel(model, &cob->pieces);
Index: Sim/Units/UnitDef.h
===================================================================
--- Sim/Units/UnitDef.h (revision 3407)
+++ Sim/Units/UnitDef.h (working copy)
@@ -104,6 +104,8 @@
UnitModelDef model;
float collisionSphereScale;
+ float3 collisionSphereOffset;
+ bool useCSOffset;
struct UnitDefWeapon {
UnitDefWeapon(std::string name,WeaponDef* def,int slavedTo,float3 mainDir,float maxAngleDif,unsigned int badTargetCat,unsigned int onlyTargetCat,float fuelUse)
Index: Sim/Units/UnitDefHandler.cpp
===================================================================
--- Sim/Units/UnitDefHandler.cpp (revision 3407)
+++ Sim/Units/UnitDefHandler.cpp (working copy)
@@ -652,6 +652,16 @@
const char* defScale = ud.canfly ? "0.5" : "1";
ud.collisionSphereScale = atof(tdfparser.SGetValueDef(defScale, "UNITINFO\\CollisionSphereScale").c_str());
+ float3 cso = ZeroVector;
+ const char* strCSOffset = tdfparser.SGetValueDef("default", "UNITINFO\\CollisionSphereOffset").c_str();
+ if (sscanf(strCSOffset, "%f %f %f", &cso.x, &cso.y, &cso.z) == 3) {
+ ud.useCSOffset = true;
+ ud.collisionSphereOffset = cso;
+ }
+ else {
+ ud.useCSOffset = false;
+ }
+
ud.seismicRadius=atoi(tdfparser.SGetValueDef("0", "UNITINFO\\seismicDistance").c_str());
ud.seismicSignature=atoi(tdfparser.SGetValueDef("-1", "UNITINFO\\seismicSignature").c_str());
if(ud.seismicSignature==-1)
Index: Sim/Units/UnitLoader.cpp
===================================================================
--- Sim/Units/UnitLoader.cpp (revision 3407)
+++ Sim/Units/UnitLoader.cpp (working copy)
@@ -268,7 +268,12 @@
if(ud->tidalGenerator>0)
unit->energyTickMake += ud->tidalGenerator*readmap->tidalStrength;
- unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side);
+ if (ud->useCSOffset) {
+ unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side, ud->collisionSphereOffset);
+ }
+ else {
+ unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side);
+ };
unit->SetRadius(unit->model->radius);
if(ud->floater)
-
collisionSphereOffsetBoth.diff (6,571 bytes) 2007-02-14 17:10
Index: Rendering/UnitModels/3DModelParser.cpp
===================================================================
--- Rendering/UnitModels/3DModelParser.cpp (revision 3407)
+++ Rendering/UnitModels/3DModelParser.cpp (working copy)
@@ -28,6 +28,15 @@
return unit3doparser->Load3DO(name,scale,side);
}
+S3DOModel* C3DModelParser::Load3DO(string name,float scale,int side,const float3& offsets)
+{
+ StringToLowerInPlace(name);
+ if(name.find(".s3o")!=string::npos)
+ return units3oparser->Load3DO(name,scale,side,offsets);
+ else
+ return unit3doparser->Load3DO(name,scale,side,offsets);
+}
+
LocalS3DOModel *C3DModelParser::CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces)
{
if(model->rootobject3do)
Index: Rendering/UnitModels/3DModelParser.h
===================================================================
--- Rendering/UnitModels/3DModelParser.h (revision 3407)
+++ Rendering/UnitModels/3DModelParser.h (working copy)
@@ -72,6 +72,7 @@
~C3DModelParser(void);
S3DOModel* Load3DO(string name,float scale=1,int side=1);
+ S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);
C3DOParser* unit3doparser;
Index: Rendering/UnitModels/3DOParser.cpp
===================================================================
--- Rendering/UnitModels/3DOParser.cpp (revision 3407)
+++ Rendering/UnitModels/3DOParser.cpp (working copy)
@@ -248,6 +248,17 @@
return model;
}
+S3DOModel* C3DOParser::Load3DO(string name,float scale,int team,const float3& offsets)
+{
+ S3DOModel *model = C3DOParser::Load3DO(name, scale, team);
+ model->rootobject3do->relMidPos.x=offsets.x;
+ model->rootobject3do->relMidPos.y=offsets.y;
+ model->rootobject3do->relMidPos.z=offsets.z;
+ model->relMidPos = model->rootobject3do->relMidPos;
+
+ return model;
+}
+
void C3DOParser::GetVertexes(_3DObject* o,S3DO* object)
{
curOffset=o->OffsetToVertexArray;
Index: Rendering/UnitModels/3DOParser.h
===================================================================
--- Rendering/UnitModels/3DOParser.h (revision 3407)
+++ Rendering/UnitModels/3DOParser.h (working copy)
@@ -94,6 +94,7 @@
C3DOParser();
virtual ~C3DOParser();
S3DOModel* Load3DO(string name,float scale=1,int side=1);
+ S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);
private:
Index: Rendering/UnitModels/s3oParser.cpp
===================================================================
--- Rendering/UnitModels/s3oParser.cpp (revision 3407)
+++ Rendering/UnitModels/s3oParser.cpp (working copy)
@@ -121,6 +121,16 @@
return model;
}
+S3DOModel* CS3OParser::Load3DO(string name,float scale,int team,const float3& offsets)
+{
+ S3DOModel *model = CS3OParser::Load3DO(name, scale, team);
+ model->relMidPos.x=offsets.x;
+ model->relMidPos.y=offsets.y;
+ model->relMidPos.z=offsets.z;
+
+ return model;
+}
+
LocalS3DOModel* CS3OParser::CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces)
{
LocalS3DOModel *lmodel = SAFE_NEW LocalS3DOModel;
Index: Rendering/UnitModels/s3oParser.h
===================================================================
--- Rendering/UnitModels/s3oParser.h (revision 3407)
+++ Rendering/UnitModels/s3oParser.h (working copy)
@@ -39,6 +39,7 @@
virtual ~CS3OParser();
S3DOModel* Load3DO(string name,float scale=1,int side=1);
+ S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);
private:
Index: Sim/Units/Unit.cpp
===================================================================
--- Sim/Units/Unit.cpp (revision 3407)
+++ Sim/Units/Unit.cpp (working copy)
@@ -937,7 +937,12 @@
radarhandler->MoveUnit(this);
//model=unitModelLoader->GetModel(model->name,newteam);
- model = modelParser->Load3DO(model->name.c_str(), 1, newteam);
+ if (unitDef->useCSOffset) {
+ model = modelParser->Load3DO(model->name.c_str(),unitDef->collisionSphereScale,newteam, unitDef->collisionSphereOffset);
+ }
+ else {
+ model = modelParser->Load3DO(model->name.c_str(),unitDef->collisionSphereScale,newteam);
+ }
delete localmodel;
localmodel = modelParser->CreateLocalModel(model, &cob->pieces);
Index: Sim/Units/UnitDef.h
===================================================================
--- Sim/Units/UnitDef.h (revision 3407)
+++ Sim/Units/UnitDef.h (working copy)
@@ -104,6 +104,8 @@
UnitModelDef model;
float collisionSphereScale;
+ float3 collisionSphereOffset;
+ bool useCSOffset;
struct UnitDefWeapon {
UnitDefWeapon(std::string name,WeaponDef* def,int slavedTo,float3 mainDir,float maxAngleDif,unsigned int badTargetCat,unsigned int onlyTargetCat,float fuelUse)
Index: Sim/Units/UnitDefHandler.cpp
===================================================================
--- Sim/Units/UnitDefHandler.cpp (revision 3407)
+++ Sim/Units/UnitDefHandler.cpp (working copy)
@@ -652,6 +652,16 @@
const char* defScale = ud.canfly ? "0.5" : "1";
ud.collisionSphereScale = atof(tdfparser.SGetValueDef(defScale, "UNITINFO\\CollisionSphereScale").c_str());
+ float3 cso = ZeroVector;
+ const char* strCSOffset = tdfparser.SGetValueDef("default", "UNITINFO\\CollisionSphereOffset").c_str();
+ if (sscanf(strCSOffset, "%f %f %f", &cso.x, &cso.y, &cso.z) == 3) {
+ ud.useCSOffset = true;
+ ud.collisionSphereOffset = cso;
+ }
+ else {
+ ud.useCSOffset = false;
+ }
+
ud.seismicRadius=atoi(tdfparser.SGetValueDef("0", "UNITINFO\\seismicDistance").c_str());
ud.seismicSignature=atoi(tdfparser.SGetValueDef("-1", "UNITINFO\\seismicSignature").c_str());
if(ud.seismicSignature==-1)
Index: Sim/Units/UnitLoader.cpp
===================================================================
--- Sim/Units/UnitLoader.cpp (revision 3407)
+++ Sim/Units/UnitLoader.cpp (working copy)
@@ -268,7 +268,12 @@
if(ud->tidalGenerator>0)
unit->energyTickMake += ud->tidalGenerator*readmap->tidalStrength;
- unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side);
+ if (ud->useCSOffset) {
+ unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side, ud->collisionSphereOffset);
+ }
+ else {
+ unit->model = modelParser->Load3DO((ud->model.modelpath).c_str(),ud->collisionSphereScale,side);
+ };
unit->SetRadius(unit->model->radius);
if(ud->floater)
-
patchForFeatures.diff (2,180 bytes) 2007-02-16 01:29
Index: Sim/Misc/Feature.cpp
===================================================================
--- Sim/Misc/Feature.cpp (revision 3407)
+++ Sim/Misc/Feature.cpp (working copy)
@@ -95,10 +95,15 @@
if(def->drawType==DRAWTYPE_3DO){
if(def->model==0){
- def->model=modelParser->Load3DO(def->modelname.c_str());
+ if(!def->useCSOffset) {
+ def->model=modelParser->Load3DO(def->modelname.c_str(),def->collisionSphereScale);
+ } else {
+ def->model=modelParser->Load3DO(def->modelname.c_str(),def->collisionSphereScale,1,
+ def->collisionSphereOffset);
+ }
height=def->model->height;
def->radius=def->model->radius;
- SetRadius(def->radius);
+ SetRadius(def->radius);
}
midPos=pos+def->model->relMidPos;
} else if(def->drawType==DRAWTYPE_TREE){
Index: Sim/Misc/FeatureDef.h
===================================================================
--- Sim/Misc/FeatureDef.h (revision 3407)
+++ Sim/Misc/FeatureDef.h (working copy)
@@ -28,6 +28,9 @@
float radius;
float mass; //used to see if the object can be overrun
+ float collisionSphereScale;
+ float3 collisionSphereOffset;
+ bool useCSOffset;
bool upright;
int drawType;
Index: Sim/Misc/FeatureHandler.cpp
===================================================================
--- Sim/Misc/FeatureHandler.cpp (revision 3407)
+++ Sim/Misc/FeatureHandler.cpp (working copy)
@@ -511,6 +511,16 @@
fd->modelname=string("objects3d/")+fd->modelname;
}
fd->radius=0;
+ fd->collisionSphereScale=atof(wreckParser.SGetValueDef("1",name+"\\collisionspherescale").c_str());
+ float3 cso = ZeroVector;
+ const char* strCSOffset = wreckParser.SGetValueDef("default",name+"\\CollisionSphereOffset").c_str();
+ if (sscanf(strCSOffset, "%f %f %f", &cso.x, &cso.y, &cso.z) == 3) {
+ fd->useCSOffset = true;
+ fd->collisionSphereOffset = cso;
+ }
+ else {
+ fd->useCSOffset = false;
+ }
fd->xsize=atoi(wreckParser.SGetValueDef("1",name+"\\FootprintX").c_str())*2; //our res is double TAs
fd->ysize=atoi(wreckParser.SGetValueDef("1",name+"\\FootprintZ").c_str())*2;
const string massStr = wreckParser.SGetValueDef("", name + "\\mass");
|
---|