This commit is contained in:
blueloveTH 2023-08-05 17:02:30 +08:00
parent 945407b3e3
commit 9998adcecd
4 changed files with 55 additions and 40 deletions

View File

@ -1,8 +1,6 @@
#pragma once
#include "box2d/b2_world.h"
#include "box2d/box2d.h"
#include "pocketpy/common.h"
#include "pocketpy/pocketpy.h"
namespace pkpy{
@ -33,30 +31,17 @@ struct PyDebugDraw: b2Draw{
PK_ALWAYS_PASS_BY_POINTER(PyDebugDraw)
VM* vm;
PyObject* draw_like;
PyObject* draw_like; // world will mark this
PyDebugDraw(VM* vm): vm(vm){}
void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) override{
}
void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) override{
}
void DrawCircle(const b2Vec2& center, float radius, const b2Color& color) override{
}
void DrawSolidCircle(const b2Vec2& center, float radius, const b2Vec2& axis, const b2Color& color) override{
}
void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) override{
}
void DrawTransform(const b2Transform& xf) override{
}
void DrawPoint(const b2Vec2& p, float size, const b2Color& color) override{
}
void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) override;
void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) override;
void DrawCircle(const b2Vec2& center, float radius, const b2Color& color) override;
void DrawSolidCircle(const b2Vec2& center, float radius, const b2Vec2& axis, const b2Color& color) override;
void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) override;
void DrawTransform(const b2Transform& xf) override;
void DrawPoint(const b2Vec2& p, float size, const b2Color& color) override;
};
struct PyContactListener: b2ContactListener{
@ -64,18 +49,7 @@ struct PyContactListener: b2ContactListener{
VM* vm;
PyContactListener(VM* vm): vm(vm){}
void _contact_f(b2Contact* contact, StrName name){
b2Body* bodyA = contact->GetFixtureA()->GetBody();
b2Body* bodyB = contact->GetFixtureB()->GetBody();
PyObject* a = get_body_object(bodyA);
PyObject* b = get_body_object(bodyB);
PyObject* self;
PyObject* f;
f = vm->get_unbound_method(a, name, &self, false);
if(f != nullptr) vm->call_method(self, f, b);
f = vm->get_unbound_method(b, name, &self, false);
if(f != nullptr) vm->call_method(self, f, a);
}
void _contact_f(b2Contact* contact, StrName name);
void BeginContact(b2Contact* contact) override {
DEF_SNAME(on_contact_begin);

View File

@ -1,7 +1,4 @@
#include "box2d/b2_world.h"
#include "box2d/b2_world_callbacks.h"
#include "box2d_bindings.hpp"
#include "pocketpy/bindings.h"
namespace pkpy{

View File

@ -0,0 +1,33 @@
#include "box2d_bindings.hpp"
namespace pkpy{
void PyDebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color){
}
void PyDebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color){
}
void PyDebugDraw::DrawCircle(const b2Vec2& center, float radius, const b2Color& color){
}
void PyDebugDraw::DrawSolidCircle(const b2Vec2& center, float radius, const b2Vec2& axis, const b2Color& color){
}
void PyDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color){
}
void PyDebugDraw::DrawTransform(const b2Transform& xf){
}
void PyDebugDraw::DrawPoint(const b2Vec2& p, float size, const b2Color& color){
}
}

View File

@ -1,5 +1,3 @@
#include "box2d/b2_world.h"
#include "box2d/b2_world_callbacks.h"
#include "box2d_bindings.hpp"
namespace pkpy{
@ -31,6 +29,19 @@ struct MyBoxCastCallback: b2QueryCallback{
}
};
void PyContactListener::_contact_f(b2Contact* contact, StrName name){
PyObject* a = get_body_object(contact->GetFixtureA()->GetBody());
PyObject* b = get_body_object(contact->GetFixtureB()->GetBody());
PyBody& bodyA = PK_OBJ_GET(PyBody, a);
PyBody& bodyB = PK_OBJ_GET(PyBody, b);
PyObject* self;
PyObject* f;
f = vm->get_unbound_method(bodyA.node_like, name, &self, false);
if(f != nullptr) vm->call_method(self, f, b);
f = vm->get_unbound_method(bodyB.node_like, name, &self, false);
if(f != nullptr) vm->call_method(self, f, a);
}
/****************** PyWorld ******************/
PyWorld::PyWorld(VM* vm): world(b2Vec2(0, 0)), _contact_listener(vm), _debug_draw(vm){
_debug_draw.draw_like = vm->None;