Skip to content

Commit

Permalink
update GetB2Shapes to return as vector
Browse files Browse the repository at this point in the history
  • Loading branch information
wraikny committed Feb 9, 2021
1 parent 3e9df8e commit 9d32535
Show file tree
Hide file tree
Showing 10 changed files with 38 additions and 11 deletions.
1 change: 1 addition & 0 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 Down
4 changes: 3 additions & 1 deletion core/src/Physics/Collider/CircleCollider.h
Expand Up @@ -14,7 +14,9 @@ class CircleCollider : public Collider {
float radius_;

protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
CircleCollider();
Expand Down
8 changes: 4 additions & 4 deletions core/src/Physics/Collider/Collider.cpp
Expand Up @@ -40,13 +40,13 @@ void Collider::SetTransform(const Matrix44F& transform) {
rotation_ = r;
}

bool Collider::GetIsCollidedWith(std::shared_ptr<Collider> collider) {
bool Collider::GetIsCollidedWith(const 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_)) {
for (auto s1 : selfShapes) {
for (auto s2 : otherShapes) {
if (b2TestOverlap(s1, 0, s2, 0, transform_, collider->transform_)) {
return true;
}
}
Expand Down
6 changes: 4 additions & 2 deletions core/src/Physics/Collider/Collider.h
Expand Up @@ -19,11 +19,13 @@ class Collider : public BaseObject {
Vector2F position_;
float rotation_;

virtual std::pair<b2Shape*, int32_t> GetB2Shapes() { return {nullptr, 0}; }
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
1 change: 1 addition & 0 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 Down
4 changes: 3 additions & 1 deletion core/src/Physics/Collider/EdgeCollider.h
Expand Up @@ -15,7 +15,9 @@ class EdgeCollider : public Collider {
Vector2F point2_;

protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
EdgeCollider();
Expand Down
5 changes: 5 additions & 0 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 Down Expand Up @@ -47,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 @@ -68,6 +71,8 @@ void PolygonCollider::UpdateTriangles() {
triangle.m_vertices[2] = Box2DHelper::ToBox2D_Vec(vertexes_->GetVector()[ib3]);
triangles_[i] = triangle;
}

updatedTriangles_ = true;
}

} // namespace Altseed2
14 changes: 13 additions & 1 deletion core/src/Physics/Collider/PolygonCollider.h
Expand Up @@ -19,8 +19,20 @@ class PolygonCollider : public Collider {

void UpdateTriangles();

bool updatedTriangles_;

protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {triangles_.data(), triangles_.size()}; }
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
2 changes: 1 addition & 1 deletion core/src/Physics/Collider/ShapeCollider.cpp
Expand Up @@ -9,8 +9,8 @@ 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>(); }
Expand Down
4 changes: 3 additions & 1 deletion core/src/Physics/Collider/ShapeCollider.h
Expand Up @@ -14,7 +14,9 @@ class ShapeCollider : public Collider {
std::shared_ptr<Vector2FArray> vertexes_;

protected:
std::pair<b2Shape*, int32_t> GetB2Shapes() override { return {&shape_, 1}; }
const std::vector<const b2Shape*>& GetB2Shapes() override {
return shapesBuffer_;
}

public:
ShapeCollider();
Expand Down

0 comments on commit 9d32535

Please sign in to comment.