Cleanup ctypes bindings.
This commit is contained in:
		
							
								
								
									
										231
									
								
								__init__.py
									
									
									
									
									
								
							
							
						
						
									
										231
									
								
								__init__.py
									
									
									
									
									
								
							@ -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 = (
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user