2025-07-16 16:48 CEST

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0000440Spring engineGeneralpublic2007-03-08 07:26
ReporterFLOZi 
Assigned ToILMTitan 
PrioritynormalSeverityfeatureReproducibilityN/A
StatusresolvedResolutionfixed 
Product Version 
Target VersionFixed in Version 
Summary0000440: Added CollisionSphereOffset=x y z; FBI tag
DescriptionOffsets a 3do models' hitsphere by the given vector.
TagsNo tags attached.
Checked infolog.txt for Errors
Attached Files
  • diff file icon 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)
    
    diff file icon collisionSphereOffset.diff (5,372 bytes) 2007-02-13 23:24 +
  • diff file icon 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)
    
    diff file icon collisionSphereOffsetBoth.diff (6,571 bytes) 2007-02-14 17:10 +
  • diff file icon 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");
    
    diff file icon patchForFeatures.diff (2,180 bytes) 2007-02-16 01:29 +

-Relationships
related to 0000322closed aircraft have halfed hitspheres/groundplates 
+Relationships

-Notes

~0000716

FLOZi (reporter)

The new file now makes the tag apply to both 3do and s3o unit models.

~0000717

FLOZi (reporter)

patchForFeatures.diff applies the two tags collisionSphereScale (already comitted to SVN) and collisionSphereOffset to feature models (be they 3do or s3o).

~0000736

ILMTitan (reporter)

Has anyone committed these?

~0000737

FLOZi (reporter)

AFAIK, no. I forget if it was tobi or Trepan i discussed them with, whichever they said they would not commit until it was 'complete'.

collisionSphereScale (3do and s3o unit models) was committed when i first wrote it.

collisionSphereOffsetBoth.diff applies the offset tag to both 3do and s3o unit models (ignore collisionSphereOffset.diff) as a unit FBI tag.

patchForFeatures.diff applies both collisionSphereScale and collisionSphereOffset to both s3o and 3do *feature* models, as a feature TDF tag.

i.e. with the combination of the latest 2 diffs here, it's pretty much *complete*

~0000772

ILMTitan (reporter)

Revision 3464
Committed. Thank you.
+Notes

-Issue History
Date Modified Username Field Change
2007-02-13 23:24 FLOZi New Issue
2007-02-13 23:24 FLOZi File Added: collisionSphereOffset.diff
2007-02-13 23:30 trepan Relationship added related to 0000322
2007-02-14 17:10 FLOZi File Added: collisionSphereOffsetBoth.diff
2007-02-14 17:10 FLOZi Note Added: 0000716
2007-02-16 01:29 FLOZi File Added: patchForFeatures.diff
2007-02-16 01:31 FLOZi Note Added: 0000717
2007-02-24 06:41 ILMTitan Note Added: 0000736
2007-02-24 06:41 ILMTitan Assigned To => ILMTitan
2007-02-24 06:41 ILMTitan Status new => feedback
2007-02-25 01:52 FLOZi Note Added: 0000737
2007-03-08 07:26 ILMTitan Status feedback => resolved
2007-03-08 07:26 ILMTitan Resolution open => fixed
2007-03-08 07:26 ILMTitan Note Added: 0000772
+Issue History