Skip to content

Commit

Permalink
fix #5480
Browse files Browse the repository at this point in the history
  • Loading branch information
rtri committed Feb 15, 2017
1 parent 1fe4ebb commit d4dcac0
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 29 deletions.
9 changes: 4 additions & 5 deletions rts/Sim/Features/Feature.cpp
Expand Up @@ -204,7 +204,7 @@ void CFeature::Initialize(const FeatureLoadParams& params)
} break;

case DRAWTYPE_MODEL: {
if ((model = def->LoadModel()) != NULL) {
if ((model = def->LoadModel()) != nullptr) {
SetMidAndAimPos(model->relMidPos, model->relMidPos, true);
SetRadiusAndHeight(model);

Expand All @@ -230,13 +230,12 @@ void CFeature::Initialize(const FeatureLoadParams& params)
UpdateMidAndAimPos();
UpdateTransformAndPhysState();


collisionVolume = def->collisionVolume;
selectionVolume = def->selectionVolume;

if (collisionVolume.DefaultToSphere())
collisionVolume.InitSphere(radius);
if (collisionVolume.DefaultToFootPrint())
collisionVolume.InitBox(float3(xsize * SQUARE_SIZE, height, zsize * SQUARE_SIZE));
collisionVolume.InitDefault(float4(radius, height, xsize * SQUARE_SIZE, zsize * SQUARE_SIZE));
selectionVolume.InitDefault(float4(radius, height, xsize * SQUARE_SIZE, zsize * SQUARE_SIZE));


// feature does not have an assigned ID yet
Expand Down
12 changes: 0 additions & 12 deletions rts/Sim/Misc/CollisionVolume.cpp
Expand Up @@ -111,18 +111,6 @@ void CollisionVolume::PostLoad()
}


void CollisionVolume::InitSphere(float radius)
{
// <r> is the object's default RADIUS (not its diameter),
// so we need to double it to get the full-length scales
InitShape(OnesVector * radius * 2.0f, ZeroVector, COLVOL_TYPE_SPHERE, COLVOL_HITTEST_CONT, COLVOL_AXIS_Z);
}

void CollisionVolume::InitBox(const float3& scales, const float3& offsets)
{
InitShape(scales, offsets, COLVOL_TYPE_BOX, COLVOL_HITTEST_CONT, COLVOL_AXIS_Z);
}

void CollisionVolume::InitShape(
const float3& scales,
const float3& offsets,
Expand Down
23 changes: 19 additions & 4 deletions rts/Sim/Misc/CollisionVolume.h
Expand Up @@ -3,7 +3,7 @@
#ifndef COLLISION_VOLUME_H
#define COLLISION_VOLUME_H

#include "System/float3.h"
#include "System/float4.h"
#include "System/creg/creg_cond.h"

// the positive x-axis points to the "left" in object-space and to the "right" in world-space
Expand Down Expand Up @@ -52,12 +52,26 @@ struct CollisionVolume

CollisionVolume& operator = (const CollisionVolume&);


/**
* Called if a unit or feature does not define a custom volume.
* @param radius the object's default radius
*/
void InitSphere(float radius);
void InitBox(const float3& scales, const float3& offsets = ZeroVector);
bool InitDefault(const float4& params) {
if (DefaultToSphere()) { InitSphere(params.x); return true; }
if (DefaultToFootPrint()) { InitBox(float3(params.z, params.y, params.w)); return true; }
return false;
}

// <r> is the object's default RADIUS (not its diameter),
// so we need to double it to get the full-length scales
void InitSphere(float radius) {
InitShape(OnesVector * radius * 2.0f, ZeroVector, COLVOL_TYPE_SPHERE, COLVOL_HITTEST_CONT, COLVOL_AXIS_Z);
}

void InitBox(const float3& scales, const float3& offsets = ZeroVector) {
InitShape(scales, offsets, COLVOL_TYPE_BOX, COLVOL_HITTEST_CONT, COLVOL_AXIS_Z);
}

void InitShape(
const float3& scales,
const float3& offsets,
Expand All @@ -66,6 +80,7 @@ struct CollisionVolume
const int pAxis
);


void RescaleAxes(const float3& scales);
void SetAxisScales(const float3& scales);
void FixTypeAndScale(float3& scales);
Expand Down
13 changes: 5 additions & 8 deletions rts/Sim/Units/Unit.cpp
Expand Up @@ -304,17 +304,14 @@ void CUnit::PreInit(const UnitLoadParams& params)
zsize = ((buildFacing & 1) == 1) ? unitDef->xsize : unitDef->zsize;


// copy the UnitDef volume instance
model = unitDef->LoadModel();
localModel.SetModel(model = unitDef->LoadModel());

collisionVolume = unitDef->collisionVolume;
selectionVolume = unitDef->selectionVolume;

localModel.SetModel(model);

if (collisionVolume.DefaultToSphere())
collisionVolume.InitSphere(model->radius);
if (collisionVolume.DefaultToFootPrint())
collisionVolume.InitBox(float3(xsize * SQUARE_SIZE, model->height, zsize * SQUARE_SIZE));
// specialize defaults if non-custom sphere or footprint-box
collisionVolume.InitDefault(float4(model->radius, model->height, xsize * SQUARE_SIZE, zsize * SQUARE_SIZE));
selectionVolume.InitDefault(float4(model->radius, model->height, xsize * SQUARE_SIZE, zsize * SQUARE_SIZE));


mapSquare = CGround::GetSquare((params.pos).cClampInMap());
Expand Down

0 comments on commit d4dcac0

Please sign in to comment.