Skip to content

Commit

Permalink
refactoring GetIsCollidedWith
Browse files Browse the repository at this point in the history
  • Loading branch information
wraikny committed Feb 9, 2021
1 parent e510c5c commit 3e9df8e
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 151 deletions.
14 changes: 9 additions & 5 deletions core/src/Physics/Collider/Box2DHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

namespace Altseed2 {

b2Transform Box2DHelper::ToBox2D_Mat(const Matrix44F& transform) {
b2Transform ret;
void Box2DHelper::SetMat(b2Transform& transform, const Matrix44F& mat) {
Matrix44F rotation;
Vector2F position;
Vector2F scale;
Matrix44F::CalcFromTransform2D(transform, rotation, position, scale);
ret.p = ToBox2D_Vec(position);
ret.q = ToBox2D_Rot(rotation);
Matrix44F::CalcFromTransform2D(mat, rotation, position, scale);
transform.p = ToBox2D_Vec(position);
transform.q = ToBox2D_Rot(rotation);
}

b2Transform Box2DHelper::ToBox2D_Mat(const Matrix44F& transform) {
b2Transform ret;
SetMat(ret, transform);
return ret;
}

Expand Down
9 changes: 8 additions & 1 deletion core/src/Physics/Collider/Box2DHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,21 @@ namespace Altseed2 {

class Box2DHelper {
public:
/**
@brief 変形行列をb2Transformにset
@param transform 対象のb2transform
@param mat 変形行列
*/
static void SetMat(b2Transform& transform, const Matrix44F& mat);

/**
@brief 変形行列をAltseed2->Box2Dに変換
@param transform 変換したいAltseed2の変形行列
@return Box2Dの変形行列
*/
static b2Transform ToBox2D_Mat(const Matrix44F& transform);
/**

/**
@brief 変形行列をBox2D->Altseed2に変換
@param transform 変換したいBox2Dの変形行列
@return Altseed2の変形行列
Expand Down
27 changes: 0 additions & 27 deletions core/src/Physics/Collider/CircleCollider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,4 @@ void CircleCollider::SetRadius(float radius) {
shape_.m_radius = radius;
}

bool CircleCollider::GetIsCollidedWith_(std::shared_ptr<Collider> collider) {
auto circle = std::dynamic_pointer_cast<CircleCollider>(collider);
if (circle != nullptr) {
return b2TestOverlap(&shape_, 0, &circle->shape_, 0, transform_, circle->transform_);
}

auto edge = std::dynamic_pointer_cast<EdgeCollider>(collider);
if (edge != nullptr) {
return b2TestOverlap(&shape_, 0, &edge->shape_, 0, transform_, edge->transform_);
}

auto shape = std::dynamic_pointer_cast<ShapeCollider>(collider);
if (shape != nullptr) {
return b2TestOverlap(&shape_, 0, &shape->shape_, 0, transform_, shape->transform_);
}

auto polygon = std::dynamic_pointer_cast<PolygonCollider>(collider);
if (polygon != nullptr) {
for (auto triangle : polygon->triangles_) {
if (b2TestOverlap(&shape_, 0, &triangle, 0, transform_, polygon->transform_)) return true;
}
return false;
}

return false;
}

} // namespace Altseed2
8 changes: 2 additions & 6 deletions core/src/Physics/Collider/CircleCollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,12 @@
namespace Altseed2 {

class CircleCollider : public Collider {
friend class EdgeCollider;
friend class PolygonCollider;
friend class ShapeCollider;

private:
b2CircleShape shape_;

float radius_;

bool GetIsCollidedWith_(std::shared_ptr<Collider> shape) override;
protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }

public:
CircleCollider();
Expand Down
17 changes: 15 additions & 2 deletions core/src/Physics/Collider/Collider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void Collider::SetRotation(float rotation) {

Matrix44F Collider::GetTransform() const { return transformMatrix_; }
void Collider::SetTransform(const Matrix44F& transform) {
transform_ = Box2DHelper::ToBox2D_Mat(transform);
Box2DHelper::SetMat(transform_, transform);
transformMatrix_ = transform;
double r;
Vector2F p, s;
Expand All @@ -40,6 +40,19 @@ void Collider::SetTransform(const Matrix44F& transform) {
rotation_ = r;
}

bool Collider::GetIsCollidedWith(std::shared_ptr<Collider> collider) { return GetIsCollidedWith_(collider); }
bool Collider::GetIsCollidedWith(std::shared_ptr<Collider> collider) {
auto selfShapes = GetB2Shapes();
auto otherShapes = collider->GetB2Shapes();

for (int i = 0; i < selfShapes.second; i++) {
for (int j = 0; j < otherShapes.second; j++) {
if (b2TestOverlap(selfShapes.first + i, 0, otherShapes.first + j, 0, transform_, collider->transform_)) {
return true;
}
}
}

return false;
}

} // namespace Altseed2
3 changes: 1 addition & 2 deletions core/src/Physics/Collider/Collider.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ class Collider : public BaseObject {
Vector2F position_;
float rotation_;

virtual bool GetIsCollidedWith_(std::shared_ptr<Collider> collider) { throw "Not implemented."; }
virtual std::pair<b2Shape*, int32_t> GetB2Shapes() { return {nullptr, 0}; }

public:
Collider();

bool GetIsCollidedWith(std::shared_ptr<Collider> collider);

// 位置
Expand Down
27 changes: 0 additions & 27 deletions core/src/Physics/Collider/EdgeCollider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,31 +25,4 @@ void EdgeCollider::SetPoint2(const Vector2F& point) {
shape_.m_vertex2 = Box2DHelper::ToBox2D_Vec(point);
}

bool EdgeCollider::GetIsCollidedWith_(std::shared_ptr<Collider> collider) {
auto circle = std::dynamic_pointer_cast<CircleCollider>(collider);
if (circle != nullptr) {
return b2TestOverlap(&shape_, 0, &circle->shape_, 0, transform_, circle->transform_);
}

auto edge = std::dynamic_pointer_cast<EdgeCollider>(collider);
if (edge != nullptr) {
return b2TestOverlap(&shape_, 0, &edge->shape_, 0, transform_, edge->transform_);
}

auto shape = std::dynamic_pointer_cast<ShapeCollider>(collider);
if (shape != nullptr) {
return b2TestOverlap(&shape_, 0, &shape->shape_, 0, transform_, shape->transform_);
}

auto polygon = std::dynamic_pointer_cast<PolygonCollider>(collider);
if (polygon != nullptr) {
for (auto triangle : polygon->triangles_) {
if (b2TestOverlap(&shape_, 0, &triangle, 0, transform_, polygon->transform_)) return true;
}
return false;
}

return false;
}

} // namespace Altseed2
7 changes: 2 additions & 5 deletions core/src/Physics/Collider/EdgeCollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,13 @@
namespace Altseed2 {

class EdgeCollider : public Collider {
friend class CircleCollider;
friend class PolygonCollider;
friend class ShapeCollider;

private:
b2EdgeShape shape_;
Vector2F point1_;
Vector2F point2_;

bool GetIsCollidedWith_(std::shared_ptr<Collider> shape) override;
protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }

public:
EdgeCollider();
Expand Down
38 changes: 0 additions & 38 deletions core/src/Physics/Collider/PolygonCollider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,44 +25,6 @@ void PolygonCollider::SetVertexes(std::shared_ptr<Vector2FArray> vertexes) {
UpdateTriangles();
}

bool PolygonCollider::GetIsCollidedWith_(std::shared_ptr<Collider> collider) {
auto circle = std::dynamic_pointer_cast<CircleCollider>(collider);
if (circle != nullptr) {
for (auto triangle : triangles_) {
if (b2TestOverlap(&triangle, 0, &circle->shape_, 0, transform_, circle->transform_)) return true;
}
return false;
}

auto edge = std::dynamic_pointer_cast<EdgeCollider>(collider);
if (edge != nullptr) {
for (auto triangle : triangles_) {
if (b2TestOverlap(&triangle, 0, &edge->shape_, 0, transform_, edge->transform_)) return true;
}
return false;
}

auto shape = std::dynamic_pointer_cast<ShapeCollider>(collider);
if (shape != nullptr) {
for (auto triangle : triangles_) {
if (b2TestOverlap(&triangle, 0, &shape->shape_, 0, transform_, shape->transform_)) return true;
}
return false;
}

auto polygon = std::dynamic_pointer_cast<PolygonCollider>(collider);
if (polygon != nullptr) {
for (auto triangle1 : triangles_) {
for (auto triangle2 : polygon->triangles_) {
if (b2TestOverlap(&triangle1, 0, &triangle2, 0, transform_, polygon->transform_)) return true;
}
}
return false;
}

return false;
}

void PolygonCollider::SetDefaultIndexBuffer() {
auto vs = vertexes_->GetVector();
if (vs.size() < 3) {
Expand Down
9 changes: 3 additions & 6 deletions core/src/Physics/Collider/PolygonCollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,18 @@
namespace Altseed2 {

class PolygonCollider : public Collider {
friend class CircleCollider;
friend class EdgeCollider;
friend class ShapeCollider;

private:
std::shared_ptr<Int32Array> buffers_;

std::vector<b2PolygonShape> triangles_;

std::shared_ptr<Vector2FArray> vertexes_;

bool GetIsCollidedWith_(std::shared_ptr<Collider> collider) override;

void UpdateTriangles();

protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {triangles_.data(), triangles_.size()}; }

public:
PolygonCollider();

Expand Down
27 changes: 0 additions & 27 deletions core/src/Physics/Collider/ShapeCollider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,6 @@ ShapeCollider::ShapeCollider() {

std::shared_ptr<ShapeCollider> ShapeCollider::Create() { return MakeAsdShared<ShapeCollider>(); }

bool ShapeCollider::GetIsCollidedWith_(std::shared_ptr<Collider> collider) {
auto circle = std::dynamic_pointer_cast<CircleCollider>(collider);
if (circle != nullptr) {
return b2TestOverlap(&shape_, 0, &circle->shape_, 0, transform_, circle->transform_);
}

auto edge = std::dynamic_pointer_cast<EdgeCollider>(collider);
if (edge != nullptr) {
return b2TestOverlap(&shape_, 0, &edge->shape_, 0, transform_, edge->transform_);
}

auto shape = std::dynamic_pointer_cast<ShapeCollider>(collider);
if (shape != nullptr) {
return b2TestOverlap(&shape_, 0, &shape->shape_, 0, transform_, shape->transform_);
}

auto polygon = std::dynamic_pointer_cast<PolygonCollider>(collider);
if (polygon != nullptr) {
for (auto triangle : polygon->triangles_) {
if (b2TestOverlap(&shape_, 0, &triangle, 0, transform_, polygon->transform_)) return true;
}
return false;
}

return false;
}

std::shared_ptr<Vector2FArray> ShapeCollider::GetVertexes() const { return vertexes_; }
void ShapeCollider::SetVertexes(const std::shared_ptr<Vector2FArray>& vertexes) {
if (vertexes->GetVector().size() > b2_maxPolygonVertices) {
Expand Down
7 changes: 2 additions & 5 deletions core/src/Physics/Collider/ShapeCollider.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@
namespace Altseed2 {

class ShapeCollider : public Collider {
friend class CircleCollider;
friend class EdgeCollider;
friend class PolygonCollider;

private:
b2PolygonShape shape_;
std::shared_ptr<Vector2FArray> vertexes_;

bool GetIsCollidedWith_(std::shared_ptr<Collider> collider) override;
protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }

public:
ShapeCollider();
Expand Down

0 comments on commit 3e9df8e

Please sign in to comment.