Пример #1
0
def pybind_instance_call_method(handle, p_method, p_args, p_argcount, r_error):
    instance = ffi.from_handle(handle)
    # TODO: improve this by using a dict lookup using string_name
    method = lib.godot_string_name_get_name(p_method)
    methname = godot_string_to_pyobj(ffi.addressof(method))
    lib.godot_string_destroy(ffi.addressof(method))
    try:
        meth = getattr(instance, methname)
    except AttributeError:
        r_error.error = lib.GODOT_CALL_ERROR_CALL_ERROR_INVALID_METHOD
        # TODO: Keep this object cached instead of recreating everytime
        return pyobj_to_variant(None, for_ffi_return=True)[0]

    # print('[GD->PY] Calling %s on %s ==> %s' % (methname, instance, meth))
    pyargs = [variant_to_pyobj(p_args[i]) for i in range(p_argcount)]
    try:
        pyret = meth(*pyargs)
        ret = pyobj_to_variant(pyret, for_ffi_return=True)
        r_error.error = lib.GODOT_CALL_ERROR_CALL_OK
        # print('[GD->PY] result: %s (%s)' % (pyret, ret[0]))
        return ret[0]

    except NotImplementedError:
        # print('[GD->PY] not implemented !')
        r_error.error = lib.GODOT_CALL_ERROR_CALL_ERROR_INVALID_METHOD
    except TypeError:
        traceback.print_exc()
        # TODO: handle errors here
        r_error.error = lib.GODOT_CALL_ERROR_CALL_ERROR_INVALID_ARGUMENT
        r_error.argument = 1
        r_error.expected = lib.GODOT_VARIANT_TYPE_NIL
    # Something bad occured, return a default None variant
    # TODO: Keep this object cached instead of recreating it everytime
    return pyobj_to_variant(None, for_ffi_return=True)[0]
Пример #2
0
def pybind_auto_indent_code(handle, code, from_line, to_line):
    try:
        import autopep8
    except ImportError:
        print("[Pythonscript] Auto indent requires module `autopep8`, "
              "install it with `pip install autopep8`")
    pycode = godot_string_to_pyobj(code).splitlines()
    before = '\n'.join(pycode[:from_line])
    to_fix = '\n'.join(pycode[from_line:to_line])
    after = '\n'.join(pycode[to_line:])
    fixed = autopep8.fix_code(to_fix)
    final_code = '\n'.join((before, fixed, after))
    # TODO: modify code instead of replace it when binding on godot_string
    # operation is available
    lib.godot_string_destroy(code)
    lib.godot_string_new_unicode_data(code, final_code, len(final_code))
Пример #3
0
def variant_to_pyobj(p_gdvar):
    """
    Convert Godot variant to regular Python object
    :param p_gdvar: Godot variant as ``<cdata 'struct godot_variant *'>`` (note the pointer)
    """
    gdtype = lib.godot_variant_get_type(p_gdvar)
    if gdtype == lib.GODOT_VARIANT_TYPE_NIL:
        return None

    elif gdtype == lib.GODOT_VARIANT_TYPE_BOOL:
        return bool(lib.godot_variant_as_bool(p_gdvar))

    elif gdtype == lib.GODOT_VARIANT_TYPE_INT:
        return int(lib.godot_variant_as_int(p_gdvar))

    elif gdtype == lib.GODOT_VARIANT_TYPE_REAL:
        return float(lib.godot_variant_as_real(p_gdvar))

    elif gdtype == lib.GODOT_VARIANT_TYPE_STRING:
        raw = lib.godot_variant_as_string(p_gdvar)
        ret = godot_string_to_pyobj(ffi.addressof(raw))
        lib.godot_string_destroy(ffi.addressof(raw))
        return ret

    elif gdtype == lib.GODOT_VARIANT_TYPE_VECTOR2:
        raw = lib.godot_variant_as_vector2(p_gdvar)
        return godot_bindings_module.Vector2.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_RECT2:
        raw = lib.godot_variant_as_rect2(p_gdvar)
        return godot_bindings_module.Rect2.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_VECTOR3:
        raw = lib.godot_variant_as_vector3(p_gdvar)
        return godot_bindings_module.Vector3.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_TRANSFORM2D:
        raw = lib.godot_variant_as_transform2d(p_gdvar)
        return godot_bindings_module.Transform2D.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_PLANE:
        raw = lib.godot_variant_as_plane(p_gdvar)
        return godot_bindings_module.Plane.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_QUAT:
        raw = lib.godot_variant_as_quat(p_gdvar)
        return godot_bindings_module.Quat.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_AABB:
        raw = lib.godot_variant_as_aabb(p_gdvar)
        return godot_bindings_module.AABB.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_BASIS:
        raw = lib.godot_variant_as_basis(p_gdvar)
        return godot_bindings_module.Basis.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_TRANSFORM:
        raw = lib.godot_variant_as_transform(p_gdvar)
        return godot_bindings_module.Transform.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_COLOR:
        raw = lib.godot_variant_as_color(p_gdvar)
        return godot_bindings_module.Color.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_NODE_PATH:
        p_raw = godot_node_path_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_node_path(p_gdvar)
        return godot_bindings_module.NodePath.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_RID:
        raw = lib.godot_variant_as_rid(p_gdvar)
        return godot_bindings_module.RID.build_from_gdobj(raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_OBJECT:
        p_raw = lib.godot_variant_as_object(p_gdvar)
        # TODO: optimize this
        tmpobj = godot_bindings_module.Object(p_raw)
        return getattr(godot_bindings_module, tmpobj.get_class())(p_raw)

    elif gdtype == lib.GODOT_VARIANT_TYPE_DICTIONARY:
        p_raw = godot_dictionary_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_dictionary(p_gdvar)
        return godot_bindings_module.Dictionary.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_ARRAY:
        p_raw = godot_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_array(p_gdvar)
        return godot_bindings_module.Array.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_BYTE_ARRAY:
        p_raw = godot_pool_byte_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_byte_array(p_gdvar)
        return godot_bindings_module.PoolByteArray.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_INT_ARRAY:
        p_raw = godot_pool_int_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_int_array(p_gdvar)
        return godot_bindings_module.PoolIntArray.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_REAL_ARRAY:
        p_raw = godot_pool_real_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_real_array(p_gdvar)
        return godot_bindings_module.PoolRealArray.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_STRING_ARRAY:
        p_raw = godot_pool_string_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_string_array(p_gdvar)
        return godot_bindings_module.PoolStringArray.build_from_gdobj(p_raw, steal=True)

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_VECTOR2_ARRAY:
        p_raw = godot_pool_vector2_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_vector2_array(p_gdvar)
        return godot_bindings_module.PoolVector2Array.build_from_gdobj(
            p_raw, steal=True
        )

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_VECTOR3_ARRAY:
        p_raw = godot_pool_vector3_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_vector3_array(p_gdvar)
        return godot_bindings_module.PoolVector3Array.build_from_gdobj(
            p_raw, steal=True
        )

    elif gdtype == lib.GODOT_VARIANT_TYPE_POOL_COLOR_ARRAY:
        p_raw = godot_pool_color_array_alloc(initialized=False)
        p_raw[0] = lib.godot_variant_as_pool_color_array(p_gdvar)
        return godot_bindings_module.PoolColorArray.build_from_gdobj(p_raw, steal=True)

    else:
        raise TypeError(
            "Unknown Variant type `%s` (this should never happen !)" % gdtype
        )