示例#1
0
 def getter(self):
     ret = godot_variant_alloc()
     lib.godot_variant_new_nil(ret)
     args = ffi.new("void*[]", [self._gd_ptr, gd_propname])
     lib.godot_method_bind_ptrcall(cls._meth_get_property,
                                   cls._instance, args, ret)
     return variant_to_pyobj(ret)
示例#2
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]
示例#3
0
 def setter(self, value):
     gd_value = pyobj_to_variant(value)
     args = ffi.new("void*[]", [self._gd_ptr, gd_propname, gd_value])
     ret = godot_variant_alloc()
     lib.godot_variant_new_nil(ret)
     lib.godot_method_bind_ptrcall(cls._meth_set_property,
                                   cls._instance, args, ret)
     return variant_to_pyobj(ret)
示例#4
0
 def __getitem__(self, idx):
     if isinstance(idx, slice):
         return Array(list(self)[idx])
     size = len(self)
     idx = size + idx if idx < 0 else idx
     if abs(idx) >= size:
         raise IndexError('list index out of range')
     ret = lib.godot_array_get(self._gd_ptr, idx)
     return variant_to_pyobj(ffi.addressof(ret))
示例#5
0
def pybind_instance_set_prop(instance_handle, p_name, p_value):
    instance = ffi.from_handle(instance_handle)
    try:
        pyval = variant_to_pyobj(p_value)
        name = godot_string_to_pyobj(p_name)
        # print('[GD->PY] Set %s to %s (%s)' % (name, pyval, p_value))
        setattr(instance, name, pyval)
        return True
    except Exception:
        traceback.print_exc()
        return False
示例#6
0
 def bind(self, *args):
     # print('[PY->GD] Varargs call %s.%s (%s) on %s with %s' % (classname, methname, meth, self, args))
     vaargs = [
         convert_arg(meth_arg["type"], meth_arg["name"], arg, to_variant=True)
         for arg, meth_arg in zip(args, meth["args"])
     ]
     vaargs += [pyobj_to_variant(arg) for arg in args[fixargs_count:]]
     vavaargs = ffi.new("godot_variant*[]", vaargs) if vaargs else ffi.NULL
     # TODO: use `godot_variant_call_error` to raise exceptions
     varret = lib.godot_method_bind_call(
         methbind, self._gd_ptr, vavaargs, len(args), ffi.NULL
     )
     ret = variant_to_pyobj(ffi.addressof(varret))
     lib.godot_variant_destroy(ffi.addressof(varret))
     # print('[PY->GD] returned:', ret)
     return ret
示例#7
0
 def __getitem__(self, key):
     var = pyobj_to_variant(key)
     gdvar = lib.godot_dictionary_get(self._gd_ptr, var)
     ret = variant_to_pyobj(ffi.addressof(gdvar))
     lib.godot_variant_destroy(ffi.addressof(gdvar))
     return ret
示例#8
0
 def pop_front(self):
     gdvar = lib.godot_array_pop_front(self._gd_ptr)
     ret = variant_to_pyobj(ffi.addressof(gdvar))
     lib.godot_variant_destroy(ffi.addressof(gdvar))
     return ret
示例#9
0
def pybind_add_global_constant(handle, name, value):
    name = godot_string_to_pyobj(name)
    value = variant_to_pyobj(value)
    globals()[name] = value
示例#10
0
def pybind_add_global_constant(handle, name, value):
    name = godot_string_to_pyobj(name)
    value = variant_to_pyobj(value)
    # Update `godot.globals` module here
    godot.globals.__dict__[name] = value
示例#11
0
 def pop_front(self):
     ret = lib.godot_array_pop_front(self._gd_ptr)
     return variant_to_pyobj(ffi.addressof(ret))
示例#12
0
 def back(self):
     ret = lib.godot_array_back(self._gd_ptr)
     return variant_to_pyobj(ffi.addressof(ret))
示例#13
0
 def __getitem__(self, key):
     var = pyobj_to_variant(key)
     retvar = lib.godot_dictionary_get(self._gd_ptr, var)
     return variant_to_pyobj(ffi.addressof(retvar))