#pragma once #include "Common.h" #include "Python.h" #include #include // Forward declarations class PyScene; // Python object structure for Scene typedef struct { PyObject_HEAD std::string name; std::shared_ptr scene; // Reference to the C++ scene bool initialized; } PySceneObject; // C++ interface for Python Scene class class PySceneClass { public: // Type methods static PyObject* __new__(PyTypeObject* type, PyObject* args, PyObject* kwds); static int __init__(PySceneObject* self, PyObject* args, PyObject* kwds); static void __dealloc(PyObject* self); static PyObject* __repr__(PySceneObject* self); // Scene methods static PyObject* activate(PySceneObject* self, PyObject* args); static PyObject* get_ui(PySceneObject* self, PyObject* args); static PyObject* register_keyboard(PySceneObject* self, PyObject* args); // Properties static PyObject* get_name(PySceneObject* self, void* closure); static PyObject* get_active(PySceneObject* self, void* closure); // Lifecycle callbacks (called from C++) static void call_on_enter(PySceneObject* self); static void call_on_exit(PySceneObject* self); static void call_on_keypress(PySceneObject* self, std::string key, std::string action); static void call_update(PySceneObject* self, float dt); static void call_on_resize(PySceneObject* self, int width, int height); static PyGetSetDef getsetters[]; static PyMethodDef methods[]; }; namespace mcrfpydef { static PyTypeObject PySceneType = { .ob_base = {.ob_base = {.ob_refcnt = 1, .ob_type = NULL}, .ob_size = 0}, .tp_name = "mcrfpy.Scene", .tp_basicsize = sizeof(PySceneObject), .tp_itemsize = 0, .tp_dealloc = (destructor)PySceneClass::__dealloc, .tp_repr = (reprfunc)PySceneClass::__repr__, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // Allow subclassing .tp_doc = PyDoc_STR("Base class for object-oriented scenes"), .tp_methods = nullptr, // Set in McRFPy_API.cpp .tp_getset = nullptr, // Set in McRFPy_API.cpp .tp_init = (initproc)PySceneClass::__init__, .tp_new = PySceneClass::__new__, }; }