Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactoring GetIsCollidedWith #670

Merged
merged 3 commits into from Feb 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 9 additions & 5 deletions core/src/Physics/Collider/Box2DHelper.cpp
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
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
28 changes: 1 addition & 27 deletions core/src/Physics/Collider/CircleCollider.cpp
Expand Up @@ -8,6 +8,7 @@ CircleCollider::CircleCollider() {

shape_.m_p = b2Vec2_zero;
shape_.m_radius = 0;
shapesBuffer_.emplace_back(&shape_);
}

std::shared_ptr<CircleCollider> CircleCollider::Create() { return MakeAsdShared<CircleCollider>(); }
Expand All @@ -18,31 +19,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
10 changes: 4 additions & 6 deletions core/src/Physics/Collider/CircleCollider.h
Expand Up @@ -9,16 +9,14 @@
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:
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
CircleCollider();
Expand Down
17 changes: 15 additions & 2 deletions core/src/Physics/Collider/Collider.cpp
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(const std::shared_ptr<Collider>& collider) {
auto selfShapes = GetB2Shapes();
auto otherShapes = collider->GetB2Shapes();

for (auto s1 : selfShapes) {
for (auto s2 : otherShapes) {
if (b2TestOverlap(s1, 0, s2, 0, transform_, collider->transform_)) {
return true;
}
}
}

return false;
}

} // namespace Altseed2
7 changes: 4 additions & 3 deletions core/src/Physics/Collider/Collider.h
Expand Up @@ -19,12 +19,13 @@ class Collider : public BaseObject {
Vector2F position_;
float rotation_;

virtual bool GetIsCollidedWith_(std::shared_ptr<Collider> collider) { throw "Not implemented."; }
std::vector<const b2Shape*> shapesBuffer_;

virtual const std::vector<const b2Shape*>& GetB2Shapes() { throw "Not implemented."; }

public:
Collider();

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

// 位置
Vector2F GetPosition() const;
Expand Down
28 changes: 1 addition & 27 deletions core/src/Physics/Collider/EdgeCollider.cpp
Expand Up @@ -9,6 +9,7 @@ EdgeCollider::EdgeCollider() {
point2_ = Vector2F();
shape_.m_vertex1 = b2Vec2_zero;
shape_.m_vertex2 = b2Vec2_zero;
shapesBuffer_.emplace_back(&shape_);
}

std::shared_ptr<EdgeCollider> EdgeCollider::Create() { return MakeAsdShared<EdgeCollider>(); }
Expand All @@ -25,31 +26,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
9 changes: 4 additions & 5 deletions core/src/Physics/Collider/EdgeCollider.h
Expand Up @@ -9,16 +9,15 @@
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:
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
EdgeCollider();
Expand Down
43 changes: 5 additions & 38 deletions core/src/Physics/Collider/PolygonCollider.cpp
Expand Up @@ -9,6 +9,7 @@ PolygonCollider::PolygonCollider() {
vertexes_ = Vector2FArray::Create(0);
position_ = Vector2F(0, 0);
rotation_ = 0;
updatedTriangles_ = false;
}

std::shared_ptr<PolygonCollider> PolygonCollider::Create() { return MakeAsdShared<PolygonCollider>(); }
Expand All @@ -25,44 +26,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 All @@ -85,6 +48,8 @@ void PolygonCollider::SetDefaultIndexBuffer() {
triangle.m_vertices[2] = Box2DHelper::ToBox2D_Vec(vertexes_->GetVector()[i + 2]);
triangles_[i] = triangle;
}

updatedTriangles_ = true;
}

void PolygonCollider::UpdateTriangles() {
Expand All @@ -106,6 +71,8 @@ void PolygonCollider::UpdateTriangles() {
triangle.m_vertices[2] = Box2DHelper::ToBox2D_Vec(vertexes_->GetVector()[ib3]);
triangles_[i] = triangle;
}

updatedTriangles_ = true;
}

} // namespace Altseed2
20 changes: 14 additions & 6 deletions core/src/Physics/Collider/PolygonCollider.h
Expand Up @@ -10,21 +10,29 @@
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();

bool updatedTriangles_;

protected:
const std::vector<const b2Shape*>& GetB2Shapes() override {
if (updatedTriangles_) {
shapesBuffer_.clear();
for (int i = 0; i < triangles_.size(); i++) {
shapesBuffer_.emplace_back(&triangles_[i]);
}
updatedTriangles_ = false;
}
return shapesBuffer_;
}

public:
PolygonCollider();

Expand Down
29 changes: 1 addition & 28 deletions core/src/Physics/Collider/ShapeCollider.cpp
Expand Up @@ -9,39 +9,12 @@ ShapeCollider::ShapeCollider() {
position_ = Vector2F(0, 0);
rotation_ = 0;
vertexes_ = Vector2FArray::Create(0);

shape_.m_count = 0;
shapesBuffer_.emplace_back(&shape_);
}

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
9 changes: 4 additions & 5 deletions core/src/Physics/Collider/ShapeCollider.h
Expand Up @@ -9,15 +9,14 @@
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:
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
ShapeCollider();
Expand Down