Cleanup ctypes bindings.

This commit is contained in:
Roz K 2022-12-20 13:34:07 +01:00
parent eaff99a5b6
commit 84ea17f1cc
Signed by: roz
GPG Key ID: 51FBF4E483E1C822

View File

@ -14,12 +14,38 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import ctypes import ctypes
import struct
from array import array from array import array
from pathlib import Path from pathlib import Path
_lib = ctypes.cdll.LoadLibrary(Path(__file__).parent / "engine.so") _lib = ctypes.cdll.LoadLibrary(Path(__file__).parent / "engine.so")
class vec3(ctypes.Structure):
_fields_ = ('x', ctypes.c_float), ('y', ctypes.c_float), ('z', ctypes.c_float)
def set(self, x, y, z):
self.x = x
self.y = y
self.z = z
class vec4(ctypes.Structure):
_fields_ = ('x', ctypes.c_float), ('y', ctypes.c_float), ('z', ctypes.c_float), ('w', ctypes.c_float)
def set(self, x, y, z, w):
self.x = x
self.y = y
self.z = z
self.w = w
class mat3(ctypes.Structure):
_fields_ = ('x', vec3), ('y', vec3), ('z', vec3)
class mat4(ctypes.Structure):
_fields_ = ('x', vec4), ('y', vec4), ('z', vec4), ('w', vec4)
vec3_right = vec3(1.0, 0.0, 0.0)
vec3_forward = vec3(0.0, 1.0, 0.0)
vec3_up = vec3(0.0, 0.0, 1.0)
def _flag(x): def _flag(x):
return 1 << x return 1 << x
@ -59,57 +85,10 @@ INSTANCE_FLAG_VISIBLE = _flag(1)
BATCH_MAX_SIZE = 65536 BATCH_MAX_SIZE = 65536
#TODO: remove from engine _vec3p = ctypes.POINTER(vec3)
vec2_zero = (0.0, 0.0) _vec4p = ctypes.POINTER(vec4)
vec3_zero = (0.0, 0.0, 0.0) _mat3p = ctypes.POINTER(mat3)
vec3_right = (1.0, 0.0, 0.0) _mat4p = ctypes.POINTER(mat4)
vec3_forward = (0.0, 1.0, 0.0)
vec3_up = (0.0, 0.0, 1.0)
vec4_zero = (0.0, 0.0, 0.0, 1.0)
mat3_identity = (
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0)
mat4_identity = (
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0)
def vec2(v = vec2_zero):
assert len(v) == 2
return array('f', v)
def vec3(v = vec3_zero):
assert len(v) == 3
return array('f', v)
def vec4(v = vec4_zero):
assert len(v) == 4
return array('f', v)
def mat3(m = mat3_identity):
assert len(m) == 9
return array('f', m)
def mat4(m = mat4_identity):
assert len(m) == 16
return array('f', m)
_vec2_t = (ctypes.c_float * 2)
_vec2 = _vec2_t.from_buffer
_vec3_t = (ctypes.c_float * 3)
_vec3 = _vec3_t.from_buffer
_vec4_t = (ctypes.c_float * 4)
_vec4 = _vec4_t.from_buffer
_mat3_t = (ctypes.c_float * 9)
_mat3 = _mat3_t.from_buffer
_mat4_t = (ctypes.c_float * 16)
_mat4 = _mat4_t.from_buffer
def _voidp(x): def _voidp(x):
return x.buffer_info()[0] return x.buffer_info()[0]
@ -130,88 +109,56 @@ def _floatp(x):
assert x.typecode == 'f' assert x.typecode == 'f'
return x.buffer_info()[0] return x.buffer_info()[0]
_mat3_rotation = _lib.rk_mat3_rotation mat3_rotation = _lib.rk_mat3_rotation
_mat3_rotation.argtypes = ( mat3_rotation.argtypes = (
_mat3_t, # ret _mat3p, # ret
_vec3_t, # axis _vec3p, # axis
ctypes.c_float) # angle ctypes.c_float) # angle
def mat3_rotation(ret, axis, angle): mat3_mul_vec3 = _lib.rk_mat3_mul_vec3
assert len(ret) == 9 and len(axis) == 3 mat3_mul_vec3.argtypes = (
_mat3_rotation(_mat3(ret), _vec3(axis), angle) _vec3p, # ret
_mat3p, # a
_vec3p) # b
_mat3_mul_vec3 = _lib.rk_mat3_mul_vec3 mat3_mul_mat3 = _lib.rk_mat3_mul_mat3
_mat3_mul_vec3.argtypes = ( mat3_mul_mat3.argtypes = (
_vec3_t, # ret _mat3p, # ret
_mat3_t, # a _mat3p, # a
_vec3_t) # b _mat3p) # b
def mat3_mul_vec3(ret, a, b): mat4_projection = _lib.rk_mat4_projection
assert len(ret) == 3 and len(a) == 9 and len(b) == 3 mat4_projection.argtypes = (
_mat3_mul_vec3(_vec3(ret), _mat3(a), _vec3(b)) _mat4p, # ret
_mat3_mul_mat3 = _lib.rk_mat3_mul_mat3
_mat3_mul_mat3.argtypes = (
_mat3_t, # ret
_mat3_t, # a
_mat3_t) # b
def mat3_mul_mat3(ret, a, b):
assert len(ret) == 9 and len(a) == 9 and len(b) == 9
_mat3_mul_mat3(_mat3(ret), _mat3(a), _mat3(b))
_mat4_projection = _lib.rk_mat4_projection
_mat4_projection.argtypes = (
_mat4_t, # ret
ctypes.c_float, # hfov ctypes.c_float, # hfov
ctypes.c_float, # ratio ctypes.c_float, # ratio
ctypes.c_float, # near ctypes.c_float, # near
ctypes.c_float) # far ctypes.c_float) # far
def mat4_projection(ret, hfov, ratio, near, far): mat4_lookat = _lib.rk_mat4_lookat
assert len(ret) == 16 mat4_lookat.argtypes = (
_mat4_projection(_mat4(ret), hfov, ratio, near, far) _mat4p, # ret
_vec3p, # position
_vec3p) # lookat
_mat4_lookat = _lib.rk_mat4_lookat mat4_mul_vec3 = _lib.rk_mat4_mul_vec3
_mat4_lookat.argtypes = ( mat4_mul_vec3.argtypes = (
_mat4_t, # ret _vec3p, # ret
_vec3_t, # position _mat4p, # a
_vec3_t) # lookat _vec3p, # b
def mat4_lookat(ret, position, lookat):
assert len(ret) == 16 and len(position) == 3 and len(lookat) == 3
_mat4_lookat(_mat4(ret), _vec3(position), _vec3(lookat))
_mat4_mul_vec3 = _lib.rk_mat4_mul_vec3
_mat4_mul_vec3.argtypes = (
_vec3_t, # ret
_mat4_t, # a
_vec3_t, # b
ctypes.c_float) # w ctypes.c_float) # w
def mat4_mul_vec3(ret, a, b, w): mat4_mul_vec4 = _lib.rk_mat4_mul_vec4
assert len(ret) == 3 and len(a) == 16 and len(b) == 3 mat4_mul_vec4.argtypes = (
_mat4_mul_vec3(_vec3(ret), _mat4(a), _vec3(b), w) _vec4p, # ret
_mat4p, # a
_vec4p) # b
_mat4_mul_vec4 = _lib.rk_mat4_mul_vec4 mat4_mul_mat4 = _lib.rk_mat4_mul_mat4
_mat4_mul_vec4.argtypes = ( mat4_mul_mat4.argtypes = (
_vec4_t, # ret _mat4p, # ret
_mat4_t, # a _mat4p, # a
_vec4_t) # b _mat4p) # b
def mat4_mul_vec4(ret, a, b):
assert len(ret) == 4 and len(a) == 16 and len(b) == 4
_mat4_mul_vec4(_vec4(ret), _mat4(a), _vec4(b))
_mat4_mul_mat4 = _lib.rk_mat4_mul_mat4
_mat4_mul_mat4.argtypes = (
_mat4_t, # ret
_mat4_t, # a
_mat4_t) # b
def mat4_mul_mat4(ret, a, b):
assert len(ret) == 16 and len(a) == 16 and len(b) == 16
_mat4_mul_mat4(_mat4(ret), _mat4(a), _mat4(b))
initialize = _lib.rk_initialize initialize = _lib.rk_initialize
initialize.restype = ctypes.c_void_p initialize.restype = ctypes.c_void_p
@ -306,41 +253,25 @@ set_input_float.argtypes = (
ctypes.c_void_p, # input ctypes.c_void_p, # input
ctypes.c_float) # value ctypes.c_float) # value
_set_input_vec3 = _lib.rk_set_input_vec3 set_input_vec3 = _lib.rk_set_input_vec3
_set_input_vec3.argtypes = ( set_input_vec3.argtypes = (
ctypes.c_void_p, # input ctypes.c_void_p, # input
_vec3_t) # value _vec3p) # value
def set_input_vec3(input, value): set_input_mat3 = _lib.rk_set_input_mat3
assert len(value) == 3 set_input_mat3.argtypes = (
_set_input_vec3(input, _vec3(value))
_set_input_mat3 = _lib.rk_set_input_mat3
_set_input_mat3.argtypes = (
ctypes.c_void_p, # input ctypes.c_void_p, # input
_mat3_t) # value _mat3p) # value
def set_input_mat3(input, value): set_input_mat4 = _lib.rk_set_input_mat4
assert len(value) == 9 set_input_mat4.argtypes = (
_set_input_mat3(input, _mat3(value))
_set_input_mat4 = _lib.rk_set_input_mat4
_set_input_mat4.argtypes = (
ctypes.c_void_p, # input ctypes.c_void_p, # input
_mat4_t) # value _mat4p) # value
def set_input_mat4(input, value): set_param_vec3 = _lib.rk_set_param_vec3
assert len(value) == 16 set_param_vec3.argtypes = (
_set_input_mat4(input, _mat4(value))
_set_param_vec3 = _lib.rk_set_param_vec3
_set_param_vec3.argtypes = (
ctypes.c_uint, # layout ctypes.c_uint, # layout
_vec3_t) # value _vec3p) # value
def set_param_vec3(param, value):
assert len(value) == 3
_set_param_vec3(param, _vec3(value))
select_texture = _lib.rk_select_texture select_texture = _lib.rk_select_texture
select_texture.argtypes = ( select_texture.argtypes = (
@ -367,7 +298,7 @@ _draw_batch.argtypes = (
def draw_batch(batch, flags, meshes, params): def draw_batch(batch, flags, meshes, params):
size = len(flags) size = len(flags)
assert len(meshes) == size assert len(meshes) == size
_draw_batch(batch, size, _ubytep(flags), _uintp(meshes), _voidp(params)) _draw_batch(batch, size, _ubytep(flags), _uintp(meshes), params)
unselect_vertices = _lib.rk_unselect_vertices unselect_vertices = _lib.rk_unselect_vertices
unselect_vertices.argtypes = ( unselect_vertices.argtypes = (