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 #pragma once
#include "box2d/b2_world.h"
#include "box2d/box2d.h" #include "box2d/box2d.h"
#include "pocketpy/common.h"
#include "pocketpy/pocketpy.h" #include "pocketpy/pocketpy.h"
namespace pkpy{ namespace pkpy{
@ -33,30 +31,17 @@ struct PyDebugDraw: b2Draw{
PK_ALWAYS_PASS_BY_POINTER(PyDebugDraw) PK_ALWAYS_PASS_BY_POINTER(PyDebugDraw)
VM* vm; VM* vm;
PyObject* draw_like; PyObject* draw_like; // world will mark this
PyDebugDraw(VM* vm): vm(vm){} PyDebugDraw(VM* vm): vm(vm){}
void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, 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 DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, 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 DrawCircle(const b2Vec2& center, float radius, const b2Color& color) override{ void DrawPoint(const b2Vec2& p, float size, 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{ struct PyContactListener: b2ContactListener{
@ -64,18 +49,7 @@ struct PyContactListener: b2ContactListener{
VM* vm; VM* vm;
PyContactListener(VM* vm): vm(vm){} PyContactListener(VM* vm): vm(vm){}
void _contact_f(b2Contact* contact, StrName name){ 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 BeginContact(b2Contact* contact) override { void BeginContact(b2Contact* contact) override {
DEF_SNAME(on_contact_begin); 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 "box2d_bindings.hpp"
#include "pocketpy/bindings.h"
namespace pkpy{ 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" #include "box2d_bindings.hpp"
namespace pkpy{ 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::PyWorld(VM* vm): world(b2Vec2(0, 0)), _contact_listener(vm), _debug_draw(vm){ PyWorld::PyWorld(VM* vm): world(b2Vec2(0, 0)), _contact_listener(vm), _debug_draw(vm){
_debug_draw.draw_like = vm->None; _debug_draw.draw_like = vm->None;