// Copyright (C) 2018-2024, Tellusim Technologies Inc. All rights reserved
// https://tellusim.com/

#include "../include/TellusimPyMath.h"
#include "../include/TellusimPyAPI.h"

#include <structmember.h>

/*
 */
namespace Tellusim {
	
	// Tellusim Types
	TS_PYAPI PyTypeObject PYString_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYString_number = {};
	TS_PYAPI Array<PyMethodDef> PYString_methods;
	TS_PYAPI Array<PyGetSetDef> PYString_getsets;
	TS_PYAPI PyTypeObject PYApp_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYApp_number = {};
	TS_PYAPI Array<PyMethodDef> PYApp_methods;
	TS_PYAPI Array<PyGetSetDef> PYApp_getsets;
	TS_PYAPI PyTypeObject PYAsync_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYAsync_number = {};
	TS_PYAPI Array<PyMethodDef> PYAsync_methods;
	TS_PYAPI Array<PyGetSetDef> PYAsync_getsets;
	TS_PYAPI PyTypeObject PYStream_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYStream_number = {};
	TS_PYAPI Array<PyMethodDef> PYStream_methods;
	TS_PYAPI Array<PyGetSetDef> PYStream_getsets;
	TS_PYAPI PyTypeObject PYBlob_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYBlob_number = {};
	TS_PYAPI Array<PyMethodDef> PYBlob_methods;
	TS_PYAPI Array<PyGetSetDef> PYBlob_getsets;
	TS_PYAPI PyTypeObject PYFile_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFile_number = {};
	TS_PYAPI Array<PyMethodDef> PYFile_methods;
	TS_PYAPI Array<PyGetSetDef> PYFile_getsets;
	TS_PYAPI PyTypeObject PYSocket_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSocket_number = {};
	TS_PYAPI Array<PyMethodDef> PYSocket_methods;
	TS_PYAPI Array<PyGetSetDef> PYSocket_getsets;
	TS_PYAPI PyTypeObject PYSocketSSL_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSocketSSL_number = {};
	TS_PYAPI Array<PyMethodDef> PYSocketSSL_methods;
	TS_PYAPI Array<PyGetSetDef> PYSocketSSL_getsets;
	TS_PYAPI PyTypeObject PYSource_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSource_number = {};
	TS_PYAPI Array<PyMethodDef> PYSource_methods;
	TS_PYAPI Array<PyGetSetDef> PYSource_getsets;
	TS_PYAPI PyTypeObject PYDate_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDate_number = {};
	TS_PYAPI Array<PyMethodDef> PYDate_methods;
	TS_PYAPI Array<PyGetSetDef> PYDate_getsets;
	TS_PYAPI PyTypeObject PYInfo_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYInfo_number = {};
	TS_PYAPI Array<PyMethodDef> PYInfo_methods;
	TS_PYAPI Array<PyGetSetDef> PYInfo_getsets;
	TS_PYAPI PyTypeObject PYDirectory_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDirectory_number = {};
	TS_PYAPI Array<PyMethodDef> PYDirectory_methods;
	TS_PYAPI Array<PyGetSetDef> PYDirectory_getsets;
	TS_PYAPI PyTypeObject PYArchive_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYArchive_number = {};
	TS_PYAPI Array<PyMethodDef> PYArchive_methods;
	TS_PYAPI Array<PyGetSetDef> PYArchive_getsets;
	TS_PYAPI PyTypeObject PYImage_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYImage_number = {};
	TS_PYAPI Array<PyMethodDef> PYImage_methods;
	TS_PYAPI Array<PyGetSetDef> PYImage_getsets;
	TS_PYAPI PyBufferProcs PYImage_buffer = {};
	TS_PYAPI PyTypeObject PYImageSampler_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYImageSampler_number = {};
	TS_PYAPI Array<PyMethodDef> PYImageSampler_methods;
	TS_PYAPI Array<PyGetSetDef> PYImageSampler_getsets;
	TS_PYAPI PyBufferProcs PYImageSampler_buffer = {};
	TS_PYAPI PyTypeObject PYMeshNode_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshNode_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshNode_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshNode_getsets;
	TS_PYAPI PyTypeObject PYMeshIndices_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshIndices_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshIndices_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshIndices_getsets;
	TS_PYAPI PyBufferProcs PYMeshIndices_buffer = {};
	TS_PYAPI PyTypeObject PYMeshAttribute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshAttribute_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshAttribute_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshAttribute_getsets;
	TS_PYAPI PyBufferProcs PYMeshAttribute_buffer = {};
	TS_PYAPI PyTypeObject PYMeshJoint_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshJoint_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshJoint_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshJoint_getsets;
	TS_PYAPI PyTypeObject PYMeshMaterial_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshMaterial_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshMaterial_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshMaterial_getsets;
	TS_PYAPI PyTypeObject PYMeshGeometry_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshGeometry_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshGeometry_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshGeometry_getsets;
	TS_PYAPI PyTypeObject PYMeshTransform_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshTransform_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshTransform_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshTransform_getsets;
	TS_PYAPI PyTypeObject PYMeshAnimation_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshAnimation_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshAnimation_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshAnimation_getsets;
	TS_PYAPI PyTypeObject PYMeshAttachment_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshAttachment_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshAttachment_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshAttachment_getsets;
	TS_PYAPI PyTypeObject PYMesh_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMesh_number = {};
	TS_PYAPI Array<PyMethodDef> PYMesh_methods;
	TS_PYAPI Array<PyGetSetDef> PYMesh_getsets;
	TS_PYAPI PyTypeObject PYJson_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYJson_number = {};
	TS_PYAPI Array<PyMethodDef> PYJson_methods;
	TS_PYAPI Array<PyGetSetDef> PYJson_getsets;
	TS_PYAPI PyTypeObject PYXml_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYXml_number = {};
	TS_PYAPI Array<PyMethodDef> PYXml_methods;
	TS_PYAPI Array<PyGetSetDef> PYXml_getsets;
	TS_PYAPI PyTypeObject PYBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYBuffer_getsets;
	TS_PYAPI PyTypeObject PYBufferTable_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYBufferTable_number = {};
	TS_PYAPI Array<PyMethodDef> PYBufferTable_methods;
	TS_PYAPI Array<PyGetSetDef> PYBufferTable_getsets;
	TS_PYAPI PyTypeObject PYD3D12Buffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Buffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Buffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Buffer_getsets;
	TS_PYAPI PyTypeObject PYD3D11Buffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Buffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Buffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Buffer_getsets;
	TS_PYAPI PyTypeObject PYMTLBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLBuffer_getsets;
	TS_PYAPI PyTypeObject PYVKBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKBuffer_getsets;
	TS_PYAPI PyTypeObject PYGLBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLBuffer_getsets;
	TS_PYAPI PyTypeObject PYGLESBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESBuffer_getsets;
	TS_PYAPI PyTypeObject PYCUBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCUBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYCUBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYCUBuffer_getsets;
	TS_PYAPI PyTypeObject PYHIPBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYHIPBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYHIPBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYHIPBuffer_getsets;
	TS_PYAPI PyTypeObject PYFUBuffer_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUBuffer_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUBuffer_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUBuffer_getsets;
	TS_PYAPI PyTypeObject PYCommand_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCommand_number = {};
	TS_PYAPI Array<PyMethodDef> PYCommand_methods;
	TS_PYAPI Array<PyGetSetDef> PYCommand_getsets;
	TS_PYAPI PyTypeObject PYCommandDrawArraysIndirect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCommandDrawArraysIndirect_number = {};
	TS_PYAPI PyBufferProcs PYCommandDrawArraysIndirect_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYCommandDrawArraysIndirect_methods;
	TS_PYAPI Array<PyMemberDef> PYCommandDrawArraysIndirect_members;
	TS_PYAPI Array<PyGetSetDef> PYCommandDrawArraysIndirect_getsets;
	TS_PYAPI PyTypeObject PYCommandDrawElementsIndirect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCommandDrawElementsIndirect_number = {};
	TS_PYAPI PyBufferProcs PYCommandDrawElementsIndirect_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYCommandDrawElementsIndirect_methods;
	TS_PYAPI Array<PyMemberDef> PYCommandDrawElementsIndirect_members;
	TS_PYAPI Array<PyGetSetDef> PYCommandDrawElementsIndirect_getsets;
	TS_PYAPI PyTypeObject PYCommandDrawMeshIndirect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCommandDrawMeshIndirect_number = {};
	TS_PYAPI PyBufferProcs PYCommandDrawMeshIndirect_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYCommandDrawMeshIndirect_methods;
	TS_PYAPI Array<PyMemberDef> PYCommandDrawMeshIndirect_members;
	TS_PYAPI Array<PyGetSetDef> PYCommandDrawMeshIndirect_getsets;
	TS_PYAPI PyTypeObject PYD3D12Command_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Command_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Command_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Command_getsets;
	TS_PYAPI PyTypeObject PYMTLCommand_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLCommand_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLCommand_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLCommand_getsets;
	TS_PYAPI PyTypeObject PYVKCommand_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKCommand_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKCommand_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKCommand_getsets;
	TS_PYAPI PyTypeObject PYFUCommand_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUCommand_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUCommand_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUCommand_getsets;
	TS_PYAPI PyTypeObject PYCompute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCompute_number = {};
	TS_PYAPI Array<PyMethodDef> PYCompute_methods;
	TS_PYAPI Array<PyGetSetDef> PYCompute_getsets;
	TS_PYAPI PyTypeObject PYComputeDispatchIndirect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYComputeDispatchIndirect_number = {};
	TS_PYAPI PyBufferProcs PYComputeDispatchIndirect_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYComputeDispatchIndirect_methods;
	TS_PYAPI Array<PyMemberDef> PYComputeDispatchIndirect_members;
	TS_PYAPI Array<PyGetSetDef> PYComputeDispatchIndirect_getsets;
	TS_PYAPI PyTypeObject PYD3D12Compute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Compute_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Compute_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Compute_getsets;
	TS_PYAPI PyTypeObject PYMTLCompute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLCompute_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLCompute_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLCompute_getsets;
	TS_PYAPI PyTypeObject PYVKCompute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKCompute_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKCompute_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKCompute_getsets;
	TS_PYAPI PyTypeObject PYFUCompute_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUCompute_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUCompute_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUCompute_getsets;
	TS_PYAPI PyTypeObject PYContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYContext_getsets;
	TS_PYAPI PyTypeObject PYD3D12Context_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Context_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Context_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Context_getsets;
	TS_PYAPI PyTypeObject PYD3D11Context_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Context_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Context_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Context_getsets;
	TS_PYAPI PyTypeObject PYMTLContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLContext_getsets;
	TS_PYAPI PyTypeObject PYVKContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKContext_getsets;
	TS_PYAPI PyTypeObject PYGLContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLContext_getsets;
	TS_PYAPI PyTypeObject PYGLESContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESContext_getsets;
	TS_PYAPI PyTypeObject PYWGContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYWGContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYWGContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYWGContext_getsets;
	TS_PYAPI PyTypeObject PYCUContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCUContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYCUContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYCUContext_getsets;
	TS_PYAPI PyTypeObject PYHIPContext_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYHIPContext_number = {};
	TS_PYAPI Array<PyMethodDef> PYHIPContext_methods;
	TS_PYAPI Array<PyGetSetDef> PYHIPContext_getsets;
	TS_PYAPI PyTypeObject PYQuery_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYQuery_number = {};
	TS_PYAPI Array<PyMethodDef> PYQuery_methods;
	TS_PYAPI Array<PyGetSetDef> PYQuery_getsets;
	TS_PYAPI PyTypeObject PYQueryStatistics_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYQueryStatistics_number = {};
	TS_PYAPI PyBufferProcs PYQueryStatistics_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYQueryStatistics_methods;
	TS_PYAPI Array<PyMemberDef> PYQueryStatistics_members;
	TS_PYAPI Array<PyGetSetDef> PYQueryStatistics_getsets;
	TS_PYAPI PyTypeObject PYFUQuery_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUQuery_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUQuery_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUQuery_getsets;
	TS_PYAPI PyTypeObject PYFence_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFence_number = {};
	TS_PYAPI Array<PyMethodDef> PYFence_methods;
	TS_PYAPI Array<PyGetSetDef> PYFence_getsets;
	TS_PYAPI PyTypeObject PYVKFence_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKFence_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKFence_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKFence_getsets;
	TS_PYAPI PyTypeObject PYFUFence_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUFence_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUFence_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUFence_getsets;
	TS_PYAPI PyTypeObject PYShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYShader_getsets;
	TS_PYAPI PyTypeObject PYShaderCompiler_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYShaderCompiler_number = {};
	TS_PYAPI Array<PyMethodDef> PYShaderCompiler_methods;
	TS_PYAPI Array<PyGetSetDef> PYShaderCompiler_getsets;
	TS_PYAPI PyTypeObject PYD3D12Shader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Shader_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Shader_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Shader_getsets;
	TS_PYAPI PyTypeObject PYD3D11Shader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Shader_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Shader_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Shader_getsets;
	TS_PYAPI PyTypeObject PYMTLShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLShader_getsets;
	TS_PYAPI PyTypeObject PYVKShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKShader_getsets;
	TS_PYAPI PyTypeObject PYGLShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLShader_getsets;
	TS_PYAPI PyTypeObject PYGLESShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESShader_getsets;
	TS_PYAPI PyTypeObject PYCUShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCUShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYCUShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYCUShader_getsets;
	TS_PYAPI PyTypeObject PYHIPShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYHIPShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYHIPShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYHIPShader_getsets;
	TS_PYAPI PyTypeObject PYFUShader_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUShader_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUShader_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUShader_getsets;
	TS_PYAPI PyTypeObject PYSampler_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSampler_number = {};
	TS_PYAPI Array<PyMethodDef> PYSampler_methods;
	TS_PYAPI Array<PyGetSetDef> PYSampler_getsets;
	TS_PYAPI PyTypeObject PYMTLSampler_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLSampler_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLSampler_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLSampler_getsets;
	TS_PYAPI PyTypeObject PYFUSampler_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUSampler_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUSampler_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUSampler_getsets;
	TS_PYAPI PyTypeObject PYTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYTexture_getsets;
	TS_PYAPI PyTypeObject PYTextureTable_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTextureTable_number = {};
	TS_PYAPI Array<PyMethodDef> PYTextureTable_methods;
	TS_PYAPI Array<PyGetSetDef> PYTextureTable_getsets;
	TS_PYAPI PyTypeObject PYD3D12Texture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Texture_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Texture_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Texture_getsets;
	TS_PYAPI PyTypeObject PYD3D11Texture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Texture_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Texture_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Texture_getsets;
	TS_PYAPI PyTypeObject PYMTLTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLTexture_getsets;
	TS_PYAPI PyTypeObject PYVKTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKTexture_getsets;
	TS_PYAPI PyTypeObject PYGLTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLTexture_getsets;
	TS_PYAPI PyTypeObject PYGLESTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESTexture_getsets;
	TS_PYAPI PyTypeObject PYCUTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCUTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYCUTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYCUTexture_getsets;
	TS_PYAPI PyTypeObject PYHIPTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYHIPTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYHIPTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYHIPTexture_getsets;
	TS_PYAPI PyTypeObject PYFUTexture_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUTexture_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUTexture_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUTexture_getsets;
	TS_PYAPI PyTypeObject PYTracing_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTracing_number = {};
	TS_PYAPI Array<PyMethodDef> PYTracing_methods;
	TS_PYAPI Array<PyGetSetDef> PYTracing_getsets;
	TS_PYAPI PyTypeObject PYTracingInstance_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTracingInstance_number = {};
	TS_PYAPI PyBufferProcs PYTracingInstance_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYTracingInstance_methods;
	TS_PYAPI Array<PyMemberDef> PYTracingInstance_members;
	TS_PYAPI Array<PyGetSetDef> PYTracingInstance_getsets;
	TS_PYAPI PyTypeObject PYTracingBuildIndirect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTracingBuildIndirect_number = {};
	TS_PYAPI PyBufferProcs PYTracingBuildIndirect_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYTracingBuildIndirect_methods;
	TS_PYAPI Array<PyMemberDef> PYTracingBuildIndirect_members;
	TS_PYAPI Array<PyGetSetDef> PYTracingBuildIndirect_getsets;
	TS_PYAPI PyTypeObject PYD3D12Tracing_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Tracing_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Tracing_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Tracing_getsets;
	TS_PYAPI PyTypeObject PYMTLTracing_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLTracing_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLTracing_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLTracing_getsets;
	TS_PYAPI PyTypeObject PYVKTracing_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKTracing_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKTracing_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKTracing_getsets;
	TS_PYAPI PyTypeObject PYFUTracing_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUTracing_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUTracing_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUTracing_getsets;
	TS_PYAPI PyTypeObject PYTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYTarget_getsets;
	TS_PYAPI PyTypeObject PYD3D12Target_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Target_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Target_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Target_getsets;
	TS_PYAPI PyTypeObject PYD3D11Target_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Target_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Target_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Target_getsets;
	TS_PYAPI PyTypeObject PYMTLTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLTarget_getsets;
	TS_PYAPI PyTypeObject PYVKTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKTarget_getsets;
	TS_PYAPI PyTypeObject PYGLTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLTarget_getsets;
	TS_PYAPI PyTypeObject PYGLESTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESTarget_getsets;
	TS_PYAPI PyTypeObject PYFUTarget_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUTarget_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUTarget_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUTarget_getsets;
	TS_PYAPI PyTypeObject PYDevice_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDevice_number = {};
	TS_PYAPI Array<PyMethodDef> PYDevice_methods;
	TS_PYAPI Array<PyGetSetDef> PYDevice_getsets;
	TS_PYAPI PyTypeObject PYDeviceFeatures_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDeviceFeatures_number = {};
	TS_PYAPI PyBufferProcs PYDeviceFeatures_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYDeviceFeatures_methods;
	TS_PYAPI Array<PyMemberDef> PYDeviceFeatures_members;
	TS_PYAPI Array<PyGetSetDef> PYDeviceFeatures_getsets;
	TS_PYAPI PyTypeObject PYD3D12Device_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Device_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Device_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Device_getsets;
	TS_PYAPI PyTypeObject PYD3D11Device_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Device_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Device_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Device_getsets;
	TS_PYAPI PyTypeObject PYMTLDevice_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLDevice_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLDevice_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLDevice_getsets;
	TS_PYAPI PyTypeObject PYVKDevice_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKDevice_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKDevice_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKDevice_getsets;
	TS_PYAPI PyTypeObject PYFUDevice_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUDevice_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUDevice_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUDevice_getsets;
	TS_PYAPI PyTypeObject PYKernel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYKernel_number = {};
	TS_PYAPI Array<PyMethodDef> PYKernel_methods;
	TS_PYAPI Array<PyGetSetDef> PYKernel_getsets;
	TS_PYAPI PyTypeObject PYD3D12Kernel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Kernel_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Kernel_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Kernel_getsets;
	TS_PYAPI PyTypeObject PYMTLKernel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLKernel_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLKernel_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLKernel_getsets;
	TS_PYAPI PyTypeObject PYFUKernel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUKernel_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUKernel_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUKernel_getsets;
	TS_PYAPI PyTypeObject PYPipeline_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYPipeline_number = {};
	TS_PYAPI Array<PyMethodDef> PYPipeline_methods;
	TS_PYAPI Array<PyGetSetDef> PYPipeline_getsets;
	TS_PYAPI PyTypeObject PYD3D12Pipeline_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Pipeline_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Pipeline_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Pipeline_getsets;
	TS_PYAPI PyTypeObject PYMTLPipeline_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLPipeline_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLPipeline_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLPipeline_getsets;
	TS_PYAPI PyTypeObject PYFUPipeline_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUPipeline_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUPipeline_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUPipeline_getsets;
	TS_PYAPI PyTypeObject PYTraversal_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTraversal_number = {};
	TS_PYAPI Array<PyMethodDef> PYTraversal_methods;
	TS_PYAPI Array<PyGetSetDef> PYTraversal_getsets;
	TS_PYAPI PyTypeObject PYD3D12Traversal_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Traversal_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Traversal_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Traversal_getsets;
	TS_PYAPI PyTypeObject PYFUTraversal_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFUTraversal_number = {};
	TS_PYAPI Array<PyMethodDef> PYFUTraversal_methods;
	TS_PYAPI Array<PyGetSetDef> PYFUTraversal_getsets;
	TS_PYAPI PyTypeObject PYSurface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSurface_number = {};
	TS_PYAPI Array<PyMethodDef> PYSurface_methods;
	TS_PYAPI Array<PyGetSetDef> PYSurface_getsets;
	TS_PYAPI PyTypeObject PYD3D12Surface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D12Surface_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D12Surface_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D12Surface_getsets;
	TS_PYAPI PyTypeObject PYD3D11Surface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYD3D11Surface_number = {};
	TS_PYAPI Array<PyMethodDef> PYD3D11Surface_methods;
	TS_PYAPI Array<PyGetSetDef> PYD3D11Surface_getsets;
	TS_PYAPI PyTypeObject PYMTLSurface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMTLSurface_number = {};
	TS_PYAPI Array<PyMethodDef> PYMTLSurface_methods;
	TS_PYAPI Array<PyGetSetDef> PYMTLSurface_getsets;
	TS_PYAPI PyTypeObject PYVKSurface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYVKSurface_number = {};
	TS_PYAPI Array<PyMethodDef> PYVKSurface_methods;
	TS_PYAPI Array<PyGetSetDef> PYVKSurface_getsets;
	TS_PYAPI PyTypeObject PYGLSurface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLSurface_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLSurface_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLSurface_getsets;
	TS_PYAPI PyTypeObject PYGLESSurface_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYGLESSurface_number = {};
	TS_PYAPI Array<PyMethodDef> PYGLESSurface_methods;
	TS_PYAPI Array<PyGetSetDef> PYGLESSurface_getsets;
	TS_PYAPI PyTypeObject PYWindow_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYWindow_number = {};
	TS_PYAPI Array<PyMethodDef> PYWindow_methods;
	TS_PYAPI Array<PyGetSetDef> PYWindow_getsets;
	TS_PYAPI PyTypeObject PYFont_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFont_number = {};
	TS_PYAPI Array<PyMethodDef> PYFont_methods;
	TS_PYAPI Array<PyGetSetDef> PYFont_getsets;
	TS_PYAPI PyTypeObject PYCanvasElement_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasElement_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasElement_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasElement_getsets;
	TS_PYAPI PyTypeObject PYCanvasText_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasText_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasText_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasText_getsets;
	TS_PYAPI PyTypeObject PYCanvasMesh_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasMesh_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasMesh_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasMesh_getsets;
	TS_PYAPI PyTypeObject PYCanvasRect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasRect_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasRect_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasRect_getsets;
	TS_PYAPI PyTypeObject PYCanvasTriangle_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasTriangle_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasTriangle_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasTriangle_getsets;
	TS_PYAPI PyTypeObject PYCanvasEllipse_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasEllipse_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasEllipse_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasEllipse_getsets;
	TS_PYAPI PyTypeObject PYCanvasShape_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasShape_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasShape_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasShape_getsets;
	TS_PYAPI PyTypeObject PYCanvasStrip_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvasStrip_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvasStrip_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvasStrip_getsets;
	TS_PYAPI PyTypeObject PYCanvas_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCanvas_number = {};
	TS_PYAPI Array<PyMethodDef> PYCanvas_methods;
	TS_PYAPI Array<PyGetSetDef> PYCanvas_getsets;
	TS_PYAPI PyTypeObject PYControl_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControl_number = {};
	TS_PYAPI Array<PyMethodDef> PYControl_methods;
	TS_PYAPI Array<PyGetSetDef> PYControl_getsets;
	TS_PYAPI PyTypeObject PYControlRoot_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlRoot_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlRoot_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlRoot_getsets;
	TS_PYAPI PyTypeObject PYControlText_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlText_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlText_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlText_getsets;
	TS_PYAPI PyTypeObject PYControlRect_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlRect_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlRect_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlRect_getsets;
	TS_PYAPI PyTypeObject PYControlGrid_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlGrid_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlGrid_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlGrid_getsets;
	TS_PYAPI PyTypeObject PYControlGroup_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlGroup_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlGroup_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlGroup_getsets;
	TS_PYAPI PyTypeObject PYControlPanel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlPanel_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlPanel_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlPanel_getsets;
	TS_PYAPI PyTypeObject PYControlDialog_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlDialog_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlDialog_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlDialog_getsets;
	TS_PYAPI PyTypeObject PYControlWindow_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlWindow_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlWindow_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlWindow_getsets;
	TS_PYAPI PyTypeObject PYControlCheck_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlCheck_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlCheck_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlCheck_getsets;
	TS_PYAPI PyTypeObject PYControlCombo_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlCombo_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlCombo_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlCombo_getsets;
	TS_PYAPI PyTypeObject PYControlButton_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlButton_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlButton_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlButton_getsets;
	TS_PYAPI PyTypeObject PYControlSlider_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlSlider_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlSlider_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlSlider_getsets;
	TS_PYAPI PyTypeObject PYControlScroll_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlScroll_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlScroll_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlScroll_getsets;
	TS_PYAPI PyTypeObject PYControlSplit_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlSplit_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlSplit_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlSplit_getsets;
	TS_PYAPI PyTypeObject PYControlArea_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlArea_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlArea_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlArea_getsets;
	TS_PYAPI PyTypeObject PYControlTree_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlTree_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlTree_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlTree_getsets;
	TS_PYAPI PyTypeObject PYControlEdit_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYControlEdit_number = {};
	TS_PYAPI Array<PyMethodDef> PYControlEdit_methods;
	TS_PYAPI Array<PyGetSetDef> PYControlEdit_getsets;
	TS_PYAPI PyTypeObject PYDialogMessage_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogMessage_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogMessage_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogMessage_getsets;
	TS_PYAPI PyTypeObject PYDialogFileOpen_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogFileOpen_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogFileOpen_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogFileOpen_getsets;
	TS_PYAPI PyTypeObject PYDialogFileSave_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogFileSave_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogFileSave_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogFileSave_getsets;
	TS_PYAPI PyTypeObject PYDialogDirectory_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogDirectory_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogDirectory_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogDirectory_getsets;
	TS_PYAPI PyTypeObject PYDialogProgress_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogProgress_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogProgress_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogProgress_getsets;
	TS_PYAPI PyTypeObject PYDialogColor_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogColor_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogColor_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogColor_getsets;
	TS_PYAPI PyTypeObject PYDialogMenu_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDialogMenu_number = {};
	TS_PYAPI Array<PyMethodDef> PYDialogMenu_methods;
	TS_PYAPI Array<PyGetSetDef> PYDialogMenu_getsets;
	TS_PYAPI PyTypeObject PYCubeFilter_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYCubeFilter_number = {};
	TS_PYAPI Array<PyMethodDef> PYCubeFilter_methods;
	TS_PYAPI Array<PyGetSetDef> PYCubeFilter_getsets;
	TS_PYAPI PyTypeObject PYDecoderJPEG_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDecoderJPEG_number = {};
	TS_PYAPI Array<PyMethodDef> PYDecoderJPEG_methods;
	TS_PYAPI Array<PyGetSetDef> PYDecoderJPEG_getsets;
	TS_PYAPI PyTypeObject PYEncoderBC15_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYEncoderBC15_number = {};
	TS_PYAPI Array<PyMethodDef> PYEncoderBC15_methods;
	TS_PYAPI Array<PyGetSetDef> PYEncoderBC15_getsets;
	TS_PYAPI PyTypeObject PYEncoderBC67_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYEncoderBC67_number = {};
	TS_PYAPI Array<PyMethodDef> PYEncoderBC67_methods;
	TS_PYAPI Array<PyGetSetDef> PYEncoderBC67_getsets;
	TS_PYAPI PyTypeObject PYEncoderASTC_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYEncoderASTC_number = {};
	TS_PYAPI Array<PyMethodDef> PYEncoderASTC_methods;
	TS_PYAPI Array<PyGetSetDef> PYEncoderASTC_getsets;
	TS_PYAPI PyTypeObject PYMeshModel_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYMeshModel_number = {};
	TS_PYAPI Array<PyMethodDef> PYMeshModel_methods;
	TS_PYAPI Array<PyGetSetDef> PYMeshModel_getsets;
	TS_PYAPI PyTypeObject PYSeparableFilter_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSeparableFilter_number = {};
	TS_PYAPI Array<PyMethodDef> PYSeparableFilter_methods;
	TS_PYAPI Array<PyGetSetDef> PYSeparableFilter_getsets;
	TS_PYAPI PyTypeObject PYPrefixScan_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYPrefixScan_number = {};
	TS_PYAPI Array<PyMethodDef> PYPrefixScan_methods;
	TS_PYAPI Array<PyGetSetDef> PYPrefixScan_getsets;
	TS_PYAPI PyTypeObject PYPrefixScanDispatchParameters_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYPrefixScanDispatchParameters_number = {};
	TS_PYAPI PyBufferProcs PYPrefixScanDispatchParameters_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYPrefixScanDispatchParameters_methods;
	TS_PYAPI Array<PyMemberDef> PYPrefixScanDispatchParameters_members;
	TS_PYAPI Array<PyGetSetDef> PYPrefixScanDispatchParameters_getsets;
	TS_PYAPI PyTypeObject PYRadixSort_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYRadixSort_number = {};
	TS_PYAPI Array<PyMethodDef> PYRadixSort_methods;
	TS_PYAPI Array<PyGetSetDef> PYRadixSort_getsets;
	TS_PYAPI PyTypeObject PYRadixSortDispatchParameters_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYRadixSortDispatchParameters_number = {};
	TS_PYAPI PyBufferProcs PYRadixSortDispatchParameters_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYRadixSortDispatchParameters_methods;
	TS_PYAPI Array<PyMemberDef> PYRadixSortDispatchParameters_members;
	TS_PYAPI Array<PyGetSetDef> PYRadixSortDispatchParameters_getsets;
	TS_PYAPI PyTypeObject PYBitonicSort_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYBitonicSort_number = {};
	TS_PYAPI Array<PyMethodDef> PYBitonicSort_methods;
	TS_PYAPI Array<PyGetSetDef> PYBitonicSort_getsets;
	TS_PYAPI PyTypeObject PYBitonicSortDispatchParameters_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYBitonicSortDispatchParameters_number = {};
	TS_PYAPI PyBufferProcs PYBitonicSortDispatchParameters_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYBitonicSortDispatchParameters_methods;
	TS_PYAPI Array<PyMemberDef> PYBitonicSortDispatchParameters_members;
	TS_PYAPI Array<PyGetSetDef> PYBitonicSortDispatchParameters_getsets;
	TS_PYAPI PyTypeObject PYSpatialGrid_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSpatialGrid_number = {};
	TS_PYAPI Array<PyMethodDef> PYSpatialGrid_methods;
	TS_PYAPI Array<PyGetSetDef> PYSpatialGrid_getsets;
	TS_PYAPI PyTypeObject PYSpatialGridDispatchParameters_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSpatialGridDispatchParameters_number = {};
	TS_PYAPI PyBufferProcs PYSpatialGridDispatchParameters_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYSpatialGridDispatchParameters_methods;
	TS_PYAPI Array<PyMemberDef> PYSpatialGridDispatchParameters_members;
	TS_PYAPI Array<PyGetSetDef> PYSpatialGridDispatchParameters_getsets;
	TS_PYAPI PyTypeObject PYSpatialTree_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSpatialTree_number = {};
	TS_PYAPI Array<PyMethodDef> PYSpatialTree_methods;
	TS_PYAPI Array<PyGetSetDef> PYSpatialTree_getsets;
	TS_PYAPI PyTypeObject PYSpatialTreeNode_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSpatialTreeNode_number = {};
	TS_PYAPI PyBufferProcs PYSpatialTreeNode_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYSpatialTreeNode_methods;
	TS_PYAPI Array<PyMemberDef> PYSpatialTreeNode_members;
	TS_PYAPI Array<PyGetSetDef> PYSpatialTreeNode_getsets;
	TS_PYAPI PyTypeObject PYSpatialTreeDispatchParameters_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYSpatialTreeDispatchParameters_number = {};
	TS_PYAPI PyBufferProcs PYSpatialTreeDispatchParameters_buffer = {};
	TS_PYAPI Array<PyMethodDef> PYSpatialTreeDispatchParameters_methods;
	TS_PYAPI Array<PyMemberDef> PYSpatialTreeDispatchParameters_members;
	TS_PYAPI Array<PyGetSetDef> PYSpatialTreeDispatchParameters_getsets;
	TS_PYAPI PyTypeObject PYFourierTransform_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYFourierTransform_number = {};
	TS_PYAPI Array<PyMethodDef> PYFourierTransform_methods;
	TS_PYAPI Array<PyGetSetDef> PYFourierTransform_getsets;
	TS_PYAPI PyTypeObject PYTensorGraph_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYTensorGraph_number = {};
	TS_PYAPI Array<PyMethodDef> PYTensorGraph_methods;
	TS_PYAPI Array<PyGetSetDef> PYTensorGraph_getsets;
	TS_PYAPI PyTypeObject PYDesktop_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI PyNumberMethods PYDesktop_number = {};
	TS_PYAPI Array<PyMethodDef> PYDesktop_methods;
	TS_PYAPI Array<PyGetSetDef> PYDesktop_getsets;
	
	// Tellusim::Allocator
	TS_PYAPI PyTypeObject PYAllocator_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYAllocator_methods;
	
	// Tellusim::Log
	TS_PYAPI PyTypeObject PYLog_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYLog_methods;
	
	// Tellusim::Time
	TS_PYAPI PyTypeObject PYTime_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYTime_methods;
	
	// Tellusim::System
	TS_PYAPI PyTypeObject PYSystem_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYSystem_methods;
	
	// Tellusim::MeshGraph
	TS_PYAPI PyTypeObject PYMeshGraph_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYMeshGraph_methods;
	
	// Tellusim::MeshReduce
	TS_PYAPI PyTypeObject PYMeshReduce_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYMeshReduce_methods;
	
	// Tellusim::MeshRefine
	TS_PYAPI PyTypeObject PYMeshRefine_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYMeshRefine_methods;
	
	// Tellusim::MeshSolid
	TS_PYAPI PyTypeObject PYMeshSolid_Type = {
		PyVarObject_HEAD_INIT(nullptr, 0)
	};
	TS_PYAPI Array<PyMethodDef> PYMeshSolid_methods;
	
	// Tellusim::String
	TS_PYAPI bool isPYString(PyObject *object) {
		return (object && Py_TYPE(object) == &PYString_Type);
	}
	TS_PYAPI String &pyString_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYString_Type) return ((PYString*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "String_get(): can't get String from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "String_get(): can't get String from None");
		static String ret;
		return ret;
	}
	TS_PYAPI PyObject *pyString_new(const String &ptr) {
		PYString *ret = (PYString*)PyObject_New(PYString, &PYString_Type);
		new(&ret->ptr) String(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyString_new(String &&ptr) {
		PYString *ret = (PYString*)PyObject_New(PYString, &PYString_Type);
		new(&ret->ptr) String(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyString_init(PYString *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) String();
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t size = {};
			char c = 0;
			static const char *kwlist[] = { "size", "c", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|b", (char**)kwlist, &size, &c)) {
				new(&self->ptr) String(size, c);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &length)) {
				new(&self->ptr) String(str, length);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const wchar_t *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "u|I", (char**)kwlist, &str, &length)) {
				new(&self->ptr) String(str, length);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const uint32_t *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|I", (char**)kwlist, &str, &length)) {
				new(&self->ptr) String(str, length);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::String(): unknown arguments:\n(void)\n(uint32_t size, char c)\n(const char* str, uint32_t length)\n(const wchar_t* str, uint32_t length)\n(const uint32_t* str, uint32_t length)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyString_dealloc(PYString *self) {
		self->ptr.~String();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *String_reserve(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		int32_t discard = false;
		static const char *kwlist[] = { "size", "discard", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &size, &discard)) {
			self->ptr.reserve(size, (discard != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::reserve(): unknown arguments:\n(uint32_t size, bool discard) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_resize(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		char c = 0;
		int32_t reserve = false;
		static const char *kwlist[] = { "size", "c", "reserve", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|bi", (char**)kwlist, &size, &c, &reserve)) {
			self->ptr.resize(size, c, (reserve != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::resize(): unknown arguments:\n(uint32_t size, char c, bool reserve) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_release(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.release();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::release(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_clear(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_copy(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "str", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &length)) {
			self->ptr.copy(str, length);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const wchar_t *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "u|I", (char**)kwlist, &str, &length)) {
				self->ptr.copy(str, length);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const uint32_t *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|I", (char**)kwlist, &str, &length)) {
				self->ptr.copy(str, length);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *string_ = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "string", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &string_, &length)) {
				if(!isPYString(string_)) break;
				const String &string = (string_) ? ((PyUnicode_Check(string_)) ? String(PyUnicode_AsUTF8(string_)) : (String)pyString_get(string_)) : String::null;
				self->ptr.copy(string, length);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::copy(): unknown arguments:\n(const char* str, uint32_t length) -> void\n(const wchar_t* str, uint32_t length) -> void\n(const uint32_t* str, uint32_t length) -> void\n(const String string, uint32_t length) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_append(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "str", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &length)) {
			self->ptr.append(str, length);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *string_ = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "string", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &string_, &length)) {
				if(!isPYString(string_)) break;
				const String &string = (string_) ? ((PyUnicode_Check(string_)) ? String(PyUnicode_AsUTF8(string_)) : (String)pyString_get(string_)) : String::null;
				self->ptr.append(string, length);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			char c = {};
			static const char *kwlist[] = { "c", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "b", (char**)kwlist, &c)) {
				self->ptr.append(c);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::append(): unknown arguments:\n(const char* str, uint32_t length) -> String\n(const String string, uint32_t length) -> String\n(char c) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_insert(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = {};
		const char *str = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "pos", "str", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|I", (char**)kwlist, &pos, &str, &length)) {
			self->ptr.insert(pos, str, length);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t pos = {};
			PyObject *string_ = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "pos", "string", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|I", (char**)kwlist, &pos, &string_, &length)) {
				if(!isPYString(string_)) break;
				const String &string = (string_) ? ((PyUnicode_Check(string_)) ? String(PyUnicode_AsUTF8(string_)) : (String)pyString_get(string_)) : String::null;
				self->ptr.insert(pos, string, length);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::insert(): unknown arguments:\n(uint32_t pos, const char* str, uint32_t length) -> String\n(uint32_t pos, const String string, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_removeBack(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t length = 1;
		static const char *kwlist[] = { "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &length)) {
			self->ptr.removeBack(length);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::removeBack(): unknown arguments:\n(uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_remove(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = {};
		uint32_t length = 1;
		static const char *kwlist[] = { "pos", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &pos, &length)) {
			self->ptr.remove(pos, length);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::remove(): unknown arguments:\n(uint32_t pos, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_reverse(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = 0;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "pos", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &pos, &length)) {
			self->ptr.reverse(pos, length);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::reverse(): unknown arguments:\n(uint32_t pos, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_size(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.size());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::size(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_empty(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.empty());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::empty(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_get(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.get(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return PyLong_FromLong(self->ptr.get(index));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::get(): unknown arguments:\n(uint32_t index) -> char\n(uint32_t index) -> char\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_find(PYString *self, PyObject *args, PyObject *kwargs) {
		char c = {};
		uint32_t pos = 0;
		static const char *kwlist[] = { "c", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b|I", (char**)kwlist, &c, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.find(c, pos));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t pos = 0;
			static const char *kwlist[] = { "str", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &pos)) {
				return PyLong_FromUnsignedLong(self->ptr.find(str, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::find(): unknown arguments:\n(char c, uint32_t pos) -> uint32_t\n(const char* str, uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_rfind(PYString *self, PyObject *args, PyObject *kwargs) {
		char c = {};
		uint32_t pos = Maxu32;
		static const char *kwlist[] = { "c", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b|I", (char**)kwlist, &c, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.rfind(c, pos));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t pos = Maxu32;
			static const char *kwlist[] = { "str", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &pos)) {
				return PyLong_FromUnsignedLong(self->ptr.rfind(str, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::rfind(): unknown arguments:\n(char c, uint32_t pos) -> uint32_t\n(const char* str, uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_count(PYString *self, PyObject *args, PyObject *kwargs) {
		char c = {};
		uint32_t pos = 0;
		static const char *kwlist[] = { "c", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b|I", (char**)kwlist, &c, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.count(c, pos));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t pos = 0;
			static const char *kwlist[] = { "str", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &pos)) {
				return PyLong_FromUnsignedLong(self->ptr.count(str, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::count(): unknown arguments:\n(char c, uint32_t pos) -> uint32_t\n(const char* str, uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_begins(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		uint32_t pos = 0;
		static const char *kwlist[] = { "str", "length", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &str, &length, &pos)) {
			return PyLong_FromLong(self->ptr.begins(str, length, pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::begins(): unknown arguments:\n(const char* str, uint32_t length, uint32_t pos) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_contains(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		uint32_t pos = 0;
		static const char *kwlist[] = { "str", "length", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &str, &length, &pos)) {
			return PyLong_FromLong(self->ptr.contains(str, length, pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::contains(): unknown arguments:\n(const char* str, uint32_t length, uint32_t pos) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_match(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		uint32_t pos = 0;
		static const char *kwlist[] = { "str", "length", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &str, &length, &pos)) {
			return PyLong_FromLong(self->ptr.match(str, length, pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::match(): unknown arguments:\n(const char* str, uint32_t length, uint32_t pos) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_compare(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t pos = 0;
		static const char *kwlist[] = { "str", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &pos)) {
			return PyLong_FromLong(self->ptr.compare(str, pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::compare(): unknown arguments:\n(const char* str, uint32_t pos) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_distance(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		int32_t scan = false;
		uint32_t pos = 0;
		static const char *kwlist[] = { "str", "scan", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|iI", (char**)kwlist, &str, &scan, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.distance(str, (scan != 0), pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::distance(): unknown arguments:\n(const char* str, bool scan, uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_begin(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.begin());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::begin(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_end(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.end());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::end(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_front(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = 0;
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.front(index));
		}
		PyErr_Clear();
		{
			uint32_t index = 0;
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
				return PyLong_FromLong(self->ptr.front(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::front(): unknown arguments:\n(uint32_t index) -> char\n(uint32_t index) -> char\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_back(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = 0;
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.back(index));
		}
		PyErr_Clear();
		{
			uint32_t index = 0;
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
				return PyLong_FromLong(self->ptr.back(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::back(): unknown arguments:\n(uint32_t index) -> char\n(uint32_t index) -> char\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_substring(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = {};
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "pos", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &pos, &length)) {
			return PyUnicode_FromString(self->ptr.substring(pos, length).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::substring(): unknown arguments:\n(uint32_t pos, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_replace(PYString *self, PyObject *args, PyObject *kwargs) {
		char before = {};
		char after = {};
		uint32_t pos = 0;
		static const char *kwlist[] = { "before", "after", "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "bb|I", (char**)kwlist, &before, &after, &pos)) {
			return PyUnicode_FromString(self->ptr.replace(before, after, pos).get());
		}
		PyErr_Clear();
		{
			const char *before = nullptr;
			const char *after = nullptr;
			uint32_t pos = 0;
			static const char *kwlist[] = { "before", "after", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss|I", (char**)kwlist, &before, &after, &pos)) {
				return PyUnicode_FromString(self->ptr.replace(before, after, pos).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::replace(): unknown arguments:\n(char before, char after, uint32_t pos) -> String\n(const char* before, const char* after, uint32_t pos) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_split(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *delimiters = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "delimiters", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &delimiters, &length)) {
			auto ret_ = self->ptr.split(delimiters, length);
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
		}
		PyErr_Clear();
		{
			PyObject *delimiters_ = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "delimiters", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &delimiters_, &length)) {
				if(!isPYString(delimiters_)) break;
				const String &delimiters = (delimiters_) ? ((PyUnicode_Check(delimiters_)) ? String(PyUnicode_AsUTF8(delimiters_)) : (String)pyString_get(delimiters_)) : String::null;
				auto ret_ = self->ptr.split(delimiters, length);
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::split(): unknown arguments:\n(const char* delimiters, uint32_t length) -> const Array<String>\n(const String delimiters, uint32_t length) -> const Array<String>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_extension(PYString *self, PyObject *args, PyObject *kwargs) {
		if(args && PyTuple_Size(args) == 1 && PyTuple_GetItem(args, 0) == Py_None) {
			return PyUnicode_FromString(self->ptr.extension(nullptr).get());
		}
		PyErr_Clear();
		{
			const char *extension = nullptr;
			static const char *kwlist[] = { "extension", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &extension)) {
				return PyUnicode_FromString(self->ptr.extension(extension).get());
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.extension().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::extension(): unknown arguments:\n(const char* extension) -> String\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_pathname(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.pathname().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::pathname(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_basename(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.basename().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::basename(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_dirname(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.dirname().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::dirname(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_relname(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *path = nullptr;
		const char *str = nullptr;
		static const char *kwlist[] = { "path", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &path, &str)) {
			return PyUnicode_FromString(String::relname(path, str).get());
		}
		PyErr_Clear();
		{
			PyObject *path_ = nullptr;
			PyObject *str_ = nullptr;
			static const char *kwlist[] = { "path", "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &path_, &str_)) {
				if(!isPYString(path_)) break;
				const String &path = (path_) ? ((PyUnicode_Check(path_)) ? String(PyUnicode_AsUTF8(path_)) : (String)pyString_get(path_)) : String::null;
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyUnicode_FromString(String::relname(path, str).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::relname(): unknown arguments:\n(const char* path, const char* str) -> String\n(const String path, const String str) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_capitalize(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *delimiters = nullptr;
		const char *spaces = nullptr;
		static const char *kwlist[] = { "delimiters", "spaces", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &delimiters, &spaces)) {
			return PyUnicode_FromString(self->ptr.capitalize(delimiters, spaces).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::capitalize(): unknown arguments:\n(const char* delimiters, const char* spaces) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_lower(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.lower().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::lower(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_upper(PYString *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.upper().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::upper(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toUtf32(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t code = {};
		static const char *kwlist[] = { "str", "code", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &str, &code)) {
			return PyLong_FromUnsignedLong(String::toUtf32(str, code));
		}
		PyErr_Clear();
		{
			uint32_t *d = nullptr;
			uint32_t length = {};
			static const char *kwlist[] = { "d", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &d, &length)) {
				return PyLong_FromUnsignedLong(self->ptr.toUtf32(d, length));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toUtf32(): unknown arguments:\n(const char* str, uint32_t code) -> uint32_t\n(uint32_t* d, uint32_t length) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toUtf16(PYString *self, PyObject *args, PyObject *kwargs) {
		wchar_t *d = nullptr;
		uint32_t length = {};
		static const char *kwlist[] = { "d", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &d, &length)) {
			return PyLong_FromUnsignedLong(self->ptr.toUtf16(d, length));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toUtf16(): unknown arguments:\n(wchar_t* d, uint32_t length) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromUtf32(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		uint32_t code = {};
		static const char *kwlist[] = { "d", "code", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &d_, &code)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyLong_FromUnsignedLong(String::fromUtf32(d, code));
		}
		PyErr_Clear();
		{
			const uint32_t *str = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "str", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|I", (char**)kwlist, &str, &length)) {
				return PyUnicode_FromString(String::fromUtf32(str, length).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromUtf32(): unknown arguments:\n(String d, uint32_t code) -> uint32_t\n(const uint32_t* str, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromUtf16(PYString *self, PyObject *args, PyObject *kwargs) {
		const wchar_t *str = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "str", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "u|I", (char**)kwlist, &str, &length)) {
			return PyUnicode_FromString(String::fromUtf16(str, length).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromUtf16(): unknown arguments:\n(const wchar_t* str, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromUrl(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t length = Maxu32;
		static const char *kwlist[] = { "str", "length", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &str, &length)) {
			return PyUnicode_FromString(String::fromUrl(str, length).get());
		}
		PyErr_Clear();
		{
			PyObject *string_ = nullptr;
			uint32_t length = Maxu32;
			static const char *kwlist[] = { "string", "length", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &string_, &length)) {
				if(!isPYString(string_)) break;
				const String &string = (string_) ? ((PyUnicode_Check(string_)) ? String(PyUnicode_AsUTF8(string_)) : (String)pyString_get(string_)) : String::null;
				return PyUnicode_FromString(String::fromUrl(string, length).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromUrl(): unknown arguments:\n(const char* str, uint32_t length) -> String\n(const String string, uint32_t length) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromi32(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		int32_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "d", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|I", (char**)kwlist, &d_, &value, &radix)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromi32(d, value, radix).get());
		}
		PyErr_Clear();
		{
			int32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|I", (char**)kwlist, &value, &radix)) {
				return PyUnicode_FromString(String::fromi32(value, radix).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromi32(): unknown arguments:\n(String d, int32_t value, uint32_t radix) -> String\n(int32_t value, uint32_t radix) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromi64(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		int64_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "d", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OL|I", (char**)kwlist, &d_, &value, &radix)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromi64(d, value, radix).get());
		}
		PyErr_Clear();
		{
			int64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "L|I", (char**)kwlist, &value, &radix)) {
				return PyUnicode_FromString(String::fromi64(value, radix).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromi64(): unknown arguments:\n(String d, int64_t value, uint32_t radix) -> String\n(int64_t value, uint32_t radix) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromu32(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		uint32_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "d", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|I", (char**)kwlist, &d_, &value, &radix)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromu32(d, value, radix).get());
		}
		PyErr_Clear();
		{
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &value, &radix)) {
				return PyUnicode_FromString(String::fromu32(value, radix).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromu32(): unknown arguments:\n(String d, uint32_t value, uint32_t radix) -> String\n(uint32_t value, uint32_t radix) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromu64(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		uint64_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "d", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OK|I", (char**)kwlist, &d_, &value, &radix)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromu64(d, value, radix).get());
		}
		PyErr_Clear();
		{
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &value, &radix)) {
				return PyUnicode_FromString(String::fromu64(value, radix).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromu64(): unknown arguments:\n(String d, uint64_t value, uint32_t radix) -> String\n(uint64_t value, uint32_t radix) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromf32(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		float32_t value = {};
		uint32_t digits = 6;
		int32_t compact = false;
		int32_t exponent = false;
		static const char *kwlist[] = { "d", "value", "digits", "compact", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of|Iii", (char**)kwlist, &d_, &value, &digits, &compact, &exponent)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromf32(d, value, digits, (compact != 0), (exponent != 0)).get());
		}
		PyErr_Clear();
		{
			float32_t value = {};
			uint32_t digits = 6;
			int32_t compact = false;
			int32_t exponent = false;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				return PyUnicode_FromString(String::fromf32(value, digits, (compact != 0), (exponent != 0)).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromf32(): unknown arguments:\n(String d, float32_t value, uint32_t digits, bool compact, bool exponent) -> String\n(float32_t value, uint32_t digits, bool compact, bool exponent) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromf64(PYString *self, PyObject *args, PyObject *kwargs) {
		PyObject *d_ = nullptr;
		float64_t value = {};
		uint32_t digits = 12;
		int32_t compact = false;
		int32_t exponent = false;
		static const char *kwlist[] = { "d", "value", "digits", "compact", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Od|Iii", (char**)kwlist, &d_, &value, &digits, &compact, &exponent)) {
			if(!isPYString(d_)) break;
			String &d = pyString_get(d_);
			return PyUnicode_FromString(String::fromf64(d, value, digits, (compact != 0), (exponent != 0)).get());
		}
		PyErr_Clear();
		{
			float64_t value = {};
			uint32_t digits = 12;
			int32_t compact = false;
			int32_t exponent = false;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				return PyUnicode_FromString(String::fromf64(value, digits, (compact != 0), (exponent != 0)).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromf64(): unknown arguments:\n(String d, float64_t value, uint32_t digits, bool compact, bool exponent) -> String\n(float64_t value, uint32_t digits, bool compact, bool exponent) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toi32(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t radix = 10;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "radix", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|In", (char**)kwlist, &str, &radix, &size)) {
			return PyLong_FromLong(String::toi32(str, radix, size));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "str", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sn", (char**)kwlist, &str, &size)) {
				return PyLong_FromLong(String::toi32(str, size));
			}
		}
		PyErr_Clear();
		{
			uint32_t radix = 10;
			uint32_t pos = 0;
			static const char *kwlist[] = { "radix", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &radix, &pos)) {
				return PyLong_FromLong(self->ptr.toi32(radix, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toi32(): unknown arguments:\n(const char* str, uint32_t radix, uint32_t* size) -> int32_t\n(const char* str, uint32_t* size) -> int32_t\n(uint32_t radix, uint32_t pos) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toi64(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t radix = 10;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "radix", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|In", (char**)kwlist, &str, &radix, &size)) {
			return PyLong_FromLongLong(String::toi64(str, radix, size));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "str", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sn", (char**)kwlist, &str, &size)) {
				return PyLong_FromLongLong(String::toi64(str, size));
			}
		}
		PyErr_Clear();
		{
			uint32_t radix = 10;
			uint32_t pos = 0;
			static const char *kwlist[] = { "radix", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &radix, &pos)) {
				return PyLong_FromLongLong(self->ptr.toi64(radix, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toi64(): unknown arguments:\n(const char* str, uint32_t radix, uint32_t* size) -> int64_t\n(const char* str, uint32_t* size) -> int64_t\n(uint32_t radix, uint32_t pos) -> int64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_tou32(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t radix = 10;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "radix", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|In", (char**)kwlist, &str, &radix, &size)) {
			return PyLong_FromUnsignedLong(String::tou32(str, radix, size));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "str", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sn", (char**)kwlist, &str, &size)) {
				return PyLong_FromUnsignedLong(String::tou32(str, size));
			}
		}
		PyErr_Clear();
		{
			uint32_t radix = 10;
			uint32_t pos = 0;
			static const char *kwlist[] = { "radix", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &radix, &pos)) {
				return PyLong_FromUnsignedLong(self->ptr.tou32(radix, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::tou32(): unknown arguments:\n(const char* str, uint32_t radix, uint32_t* size) -> uint32_t\n(const char* str, uint32_t* size) -> uint32_t\n(uint32_t radix, uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_tou64(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t radix = 10;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "radix", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|In", (char**)kwlist, &str, &radix, &size)) {
			return PyLong_FromUnsignedLongLong(String::tou64(str, radix, size));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "str", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sn", (char**)kwlist, &str, &size)) {
				return PyLong_FromUnsignedLongLong(String::tou64(str, size));
			}
		}
		PyErr_Clear();
		{
			uint32_t radix = 10;
			uint32_t pos = 0;
			static const char *kwlist[] = { "radix", "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &radix, &pos)) {
				return PyLong_FromUnsignedLongLong(self->ptr.tou64(radix, pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::tou64(): unknown arguments:\n(const char* str, uint32_t radix, uint32_t* size) -> uint64_t\n(const char* str, uint32_t* size) -> uint64_t\n(uint32_t radix, uint32_t pos) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_tof32(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyFloat_FromDouble(String::tof32(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			static const char *kwlist[] = { "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &pos)) {
				return PyFloat_FromDouble(self->ptr.tof32(pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::tof32(): unknown arguments:\n(const char* str, uint32_t* size) -> float32_t\n(uint32_t pos) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_tof64(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyFloat_FromDouble(String::tof64(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			static const char *kwlist[] = { "pos", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &pos)) {
				return PyFloat_FromDouble(self->ptr.tof64(pos));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::tof64(): unknown arguments:\n(const char* str, uint32_t* size) -> float64_t\n(uint32_t pos) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toHashu32(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = 0;
		static const char *kwlist[] = { "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.toHashu32(pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toHashu32(): unknown arguments:\n(uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toHashu64(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = 0;
		static const char *kwlist[] = { "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &pos)) {
			return PyLong_FromUnsignedLongLong(self->ptr.toHashu64(pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toHashu64(): unknown arguments:\n(uint32_t pos) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toRGBAu8(PYString *self, PyObject *args, PyObject *kwargs) {
		uint32_t pos = 0;
		static const char *kwlist[] = { "pos", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &pos)) {
			return PyLong_FromUnsignedLong(self->ptr.toRGBAu8(pos));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toRGBAu8(): unknown arguments:\n(uint32_t pos) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromTime(PYString *self, PyObject *args, PyObject *kwargs) {
		uint64_t usec = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "usec", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &usec, &digits)) {
			return PyUnicode_FromString(String::fromTime(usec, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromTime(): unknown arguments:\n(uint64_t usec, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromBytes(PYString *self, PyObject *args, PyObject *kwargs) {
		uint64_t bytes = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "bytes", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &bytes, &digits)) {
			return PyUnicode_FromString(String::fromBytes(bytes, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromBytes(): unknown arguments:\n(uint64_t bytes, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromNumber(PYString *self, PyObject *args, PyObject *kwargs) {
		uint64_t value = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "value", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &value, &digits)) {
			return PyUnicode_FromString(String::fromNumber(value, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromNumber(): unknown arguments:\n(uint64_t value, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromFrequency(PYString *self, PyObject *args, PyObject *kwargs) {
		uint64_t hz = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "hz", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &hz, &digits)) {
			return PyUnicode_FromString(String::fromFrequency(hz, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromFrequency(): unknown arguments:\n(uint64_t hz, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromLength(PYString *self, PyObject *args, PyObject *kwargs) {
		float64_t distance = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "distance", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|I", (char**)kwlist, &distance, &digits)) {
			return PyUnicode_FromString(String::fromLength(distance, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromLength(): unknown arguments:\n(float64_t distance, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_fromAngle(PYString *self, PyObject *args, PyObject *kwargs) {
		float64_t angle = {};
		uint32_t digits = 2;
		static const char *kwlist[] = { "angle", "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|I", (char**)kwlist, &angle, &digits)) {
			return PyUnicode_FromString(String::fromAngle(angle, digits).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::fromAngle(): unknown arguments:\n(float64_t angle, uint32_t digits) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toBytes(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyLong_FromUnsignedLongLong(String::toBytes(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "pos", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|In", (char**)kwlist, &pos, &size)) {
				return PyLong_FromUnsignedLongLong(self->ptr.toBytes(pos, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toBytes(): unknown arguments:\n(const char* str, uint32_t* size) -> uint64_t\n(uint32_t pos, uint32_t* size) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toNumber(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyLong_FromUnsignedLongLong(String::toNumber(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "pos", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|In", (char**)kwlist, &pos, &size)) {
				return PyLong_FromUnsignedLongLong(self->ptr.toNumber(pos, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toNumber(): unknown arguments:\n(const char* str, uint32_t* size) -> uint64_t\n(uint32_t pos, uint32_t* size) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toFrequency(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyLong_FromUnsignedLongLong(String::toFrequency(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "pos", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|In", (char**)kwlist, &pos, &size)) {
				return PyLong_FromUnsignedLongLong(self->ptr.toFrequency(pos, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toFrequency(): unknown arguments:\n(const char* str, uint32_t* size) -> uint64_t\n(uint32_t pos, uint32_t* size) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *String_toLength(PYString *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		uint32_t *size = nullptr;
		static const char *kwlist[] = { "str", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|n", (char**)kwlist, &str, &size)) {
			return PyFloat_FromDouble(String::toLength(str, size));
		}
		PyErr_Clear();
		{
			uint32_t pos = 0;
			uint32_t *size = nullptr;
			static const char *kwlist[] = { "pos", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|In", (char**)kwlist, &pos, &size)) {
				return PyFloat_FromDouble(self->ptr.toLength(pos, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "String::toLength(): unknown arguments:\n(const char* str, uint32_t* size) -> float64_t\n(uint32_t pos, uint32_t* size) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyString_str(PYString *self) {
		return PyUnicode_FromString("String");
	}
	static int32_t pyString_bool(PYString *self) {
		return 1;
	}
	
	// Tellusim::App
	TS_PYAPI bool isPYApp(PyObject *object) {
		return (object && Py_TYPE(object) == &PYApp_Type);
	}
	TS_PYAPI App &pyApp_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYApp_Type) return ((PYApp*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "App_get(): can't get App from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "App_get(): can't get App from None");
		return *(App*)nullptr;
	}
	static int32_t pyApp_init(PYApp *self, PyObject *args, PyObject *kwargs) {
		int32_t argc = {};
		PyObject *argv_ = nullptr;
		static const char *kwlist[] = { "argv", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &argv_)) {
			char **argv; Array<const char*> argv__;
			pyArray_get(argv_, argv__); argv = (char**)argv__.get();
			new(&self->ptr) App(argc = argv__.size(), argv);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::App(): unknown arguments:\n(int32_t argc, char** argv)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyApp_dealloc(PYApp *self) {
		self->ptr.~App();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *App_clear(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getPlatform(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getDevice(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getDevice(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getWidth(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getHeight(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getMultisample(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getNumArguments(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumArguments());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getNumArguments(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getArgument(PYApp *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return PyUnicode_FromString(self->ptr.getArgument(num).get());
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyUnicode_FromString(self->ptr.getArgument(name).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getArgument(): unknown arguments:\n(uint32_t num) -> const String\n(const char* name) -> const String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getArguments(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getArguments();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getArguments(): unknown arguments:\n(void) -> const Array<String>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_isArgument(PYApp *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isArgument(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::isArgument(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_create(PYApp *self, PyObject *args, PyObject *kwargs) {
		uint32_t platform = PlatformUnknown;
		uint32_t version = App::Version;
		static const char *kwlist[] = { "platform", "version", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &platform, &version)) {
			return PyLong_FromLong(self->ptr.create((Platform)platform, version));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::create(): unknown arguments:\n(Platform platform, uint32_t version) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_setPlatform(PYApp *self, PyObject *args, PyObject *kwargs) {
		uint32_t platform = 0;
		uint32_t device = Maxu32;
		static const char *kwlist[] = { "platform", "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &platform, &device)) {
			App::setPlatform((Platform)platform, device);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::setPlatform(): unknown arguments:\n(Platform platform, uint32_t device) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_setSize(PYApp *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = {};
		uint32_t multisample = 0;
		static const char *kwlist[] = { "width", "height", "multisample", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &width, &height, &multisample)) {
			App::setSize(width, height, multisample);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::setSize(): unknown arguments:\n(uint32_t width, uint32_t height, uint32_t multisample) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_isBuildDebug(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(App::isBuildDebug());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::isBuildDebug(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_isBuildFloat64(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(App::isBuildFloat64());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::isBuildFloat64(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getBuildDate(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(App::getBuildDate().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getBuildDate(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getBuildInfo(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(App::getBuildInfo().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getBuildInfo(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getVersion(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(App::getVersion());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getVersion(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_getAPIHash(PYApp *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(App::getAPIHash());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "App::getAPIHash(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *App_get_platform(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *App_get_device(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDevice());
	}
	static PyObject *App_get_width(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *App_get_height(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *App_get_multisample(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *App_get_num_arguments(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumArguments());
	}
	static PyObject *App_get_build_date(PYApp *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getBuildDate().get());
	}
	static PyObject *App_get_build_info(PYApp *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getBuildInfo().get());
	}
	static PyObject *App_get_version(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getVersion());
	}
	static PyObject *App_get_api_hash(PYApp *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getAPIHash());
	}
	static PyObject *pyApp_str(PYApp *self) {
		return PyUnicode_FromString("App");
	}
	static int32_t pyApp_bool(PYApp *self) {
		return 1;
	}
	
	// Tellusim::Async
	TS_PYAPI bool isPYAsync(PyObject *object) {
		return (object && Py_TYPE(object) == &PYAsync_Type);
	}
	TS_PYAPI Async &pyAsync_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYAsync_Type) return ((PYAsync*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Async_get(): can't get Async from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Async_get(): can't get Async from None");
		static Async ret;
		return ret;
	}
	TS_PYAPI PyObject *pyAsync_new(const Async &ptr) {
		PYAsync *ret = (PYAsync*)PyObject_New(PYAsync, &PYAsync_Type);
		new(&ret->ptr) Async(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyAsync_new(Async &&ptr) {
		PYAsync *ret = (PYAsync*)PyObject_New(PYAsync, &PYAsync_Type);
		new(&ret->ptr) Async(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyAsync_init(PYAsync *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Async();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::Async(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyAsync_dealloc(PYAsync *self) {
		self->ptr.~Async();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyAsync_equalPtr(PYAsync *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyAsync_clonePtr(PYAsync *self, PyObject *args) {
		return pyAsync_new(self->ptr.clonePtr());
	}
	static PyObject *pyAsync_clearPtr(PYAsync *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyAsync_destroyPtr(PYAsync *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyAsync_acquirePtr(PYAsync *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyAsync_unacquirePtr(PYAsync *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyAsync_isValidPtr(PYAsync *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyAsync_isOwnerPtr(PYAsync *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyAsync_isConstPtr(PYAsync *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyAsync_getCountPtr(PYAsync *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyAsync_getInternalPtr(PYAsync *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Async_init(PYAsync *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = 0;
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &num)) {
			return PyLong_FromLong(self->ptr.init(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::init(): unknown arguments:\n(uint32_t num) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_shutdown(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.shutdown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::shutdown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_isInitialized(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isInitialized());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::isInitialized(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_getNumCores(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(Async::getNumCores());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::getNumCores(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_getNumThreads(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumThreads());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::getNumThreads(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_clear(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_getNumTasks(PYAsync *self, PyObject *args, PyObject *kwargs) {
		int32_t check = false;
		static const char *kwlist[] = { "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &check)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTasks((check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::getNumTasks(): unknown arguments:\n(bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_check(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.check());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::check(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_wait(PYAsync *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.wait());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Async::wait(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Async_get_num_cores(PYAsync *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumCores());
	}
	static PyObject *Async_get_num_threads(PYAsync *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumThreads());
	}
	static PyObject *Async_get_num_tasks(PYAsync *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTasks());
	}
	static PyObject *pyAsync_str(PYAsync *self) {
		return PyUnicode_FromString(String::format("Async Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyAsync_bool(PYAsync *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Stream
	TS_PYAPI bool isPYStream(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYStream_Type || type == &PYBlob_Type || type == &PYFile_Type || type == &PYSocket_Type || type == &PYSocketSSL_Type || type == &PYSource_Type);
	}
	TS_PYAPI Stream &pyStream_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYStream_Type || type == &PYBlob_Type || type == &PYFile_Type || type == &PYSocket_Type || type == &PYSocketSSL_Type || type == &PYSource_Type) return ((PYStream*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Stream_get(): can't get Stream from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Stream_get(): can't get Stream from None");
		static Stream ret;
		return ret;
	}
	TS_PYAPI PyObject *pyStream_new(const Stream &ptr) {
		PYStream *ret = (PYStream*)PyObject_New(PYStream, &PYStream_Type);
		new(&ret->ptr) Stream(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyStream_new(Stream &&ptr) {
		PYStream *ret = (PYStream*)PyObject_New(PYStream, &PYStream_Type);
		new(&ret->ptr) Stream(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyStream_init(PYStream *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Stream();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::Stream(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyStream_dealloc(PYStream *self) {
		self->ptr.~Stream();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyStream_equalPtr(PYStream *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyStream_clonePtr(PYStream *self, PyObject *args) {
		return pyStream_new(self->ptr.clonePtr());
	}
	static PyObject *pyStream_clearPtr(PYStream *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyStream_destroyPtr(PYStream *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyStream_acquirePtr(PYStream *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyStream_unacquirePtr(PYStream *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyStream_isValidPtr(PYStream *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyStream_isOwnerPtr(PYStream *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyStream_isConstPtr(PYStream *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyStream_getCountPtr(PYStream *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyStream_getInternalPtr(PYStream *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Stream_move(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStream_new(self->ptr.move());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::move(): unknown arguments:\n(void) -> Stream\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_isOpened(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isOpened());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::isOpened(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_isMapped(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMapped());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::isMapped(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_isAvailable(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAvailable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::isAvailable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_getSize(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::getSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_getName(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_tell(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.tell());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::tell(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_seek(PYStream *self, PyObject *args, PyObject *kwargs) {
		size_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &offset)) {
			return PyLong_FromLong(self->ptr.seek(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::seek(): unknown arguments:\n(size_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_seekBack(PYStream *self, PyObject *args, PyObject *kwargs) {
		size_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &offset)) {
			return PyLong_FromLong(self->ptr.seekBack(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::seekBack(): unknown arguments:\n(size_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_seekCur(PYStream *self, PyObject *args, PyObject *kwargs) {
		int64_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "L", (char**)kwlist, &offset)) {
			return PyLong_FromLong(self->ptr.seekCur(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::seekCur(): unknown arguments:\n(int64_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_getData(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getData());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::getData(): unknown arguments:\n(void) -> const uint8_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_read(PYStream *self, PyObject *args, PyObject *kwargs) {
		void *dest = nullptr;
		size_t size = {};
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &dest_buffer)) {
			if(dest_buffer.readonly) break;
			return PyLong_FromSize_t(self->ptr.read(dest = dest_buffer.buf, size = dest_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::read(): unknown arguments:\n(void* dest, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_write(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyLong_FromSize_t(self->ptr.write(src = src_buffer.buf, size = src_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::write(): unknown arguments:\n(const void* src, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_flush(PYStream *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flush());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::flush(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_puts(PYStream *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		static const char *kwlist[] = { "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &str)) {
			return PyLong_FromLong(self->ptr.puts(str));
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &str_)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyLong_FromLong(self->ptr.puts(str));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::puts(): unknown arguments:\n(const char* str) -> bool\n(const String str) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_gets(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyUnicode_FromString(self->ptr.gets(status).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::gets(): unknown arguments:\n(bool* status) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi8(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLong(self->ptr.readi8(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi8(): unknown arguments:\n(bool* status) -> int8_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei8(PYStream *self, PyObject *args, PyObject *kwargs) {
		int8_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei8(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei8(): unknown arguments:\n(int8_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu8(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLong(self->ptr.readu8(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu8(): unknown arguments:\n(bool* status) -> uint8_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu8(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint8_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu8(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu8(): unknown arguments:\n(uint8_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi16(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLong(self->ptr.readi16(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi16(): unknown arguments:\n(bool* status) -> int16_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei16(PYStream *self, PyObject *args, PyObject *kwargs) {
		int16_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "h", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei16(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei16(): unknown arguments:\n(int16_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu16(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLong(self->ptr.readu16(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu16(): unknown arguments:\n(bool* status) -> uint16_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu16(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint16_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "H", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu16(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu16(): unknown arguments:\n(uint16_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi32(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLong(self->ptr.readi32(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi32(): unknown arguments:\n(bool* status) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei32(PYStream *self, PyObject *args, PyObject *kwargs) {
		int32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei32(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei32(): unknown arguments:\n(int32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu32(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLong(self->ptr.readu32(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu32(): unknown arguments:\n(bool* status) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu32(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu32(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu32(): unknown arguments:\n(uint32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi64(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLongLong(self->ptr.readi64(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi64(): unknown arguments:\n(bool* status) -> int64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei64(PYStream *self, PyObject *args, PyObject *kwargs) {
		int64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "L", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei64(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei64(): unknown arguments:\n(int64_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu64(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLongLong(self->ptr.readu64(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu64(): unknown arguments:\n(bool* status) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu64(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu64(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu64(): unknown arguments:\n(uint64_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readf32(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyFloat_FromDouble(self->ptr.readf32(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readf32(): unknown arguments:\n(bool* status) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writef32(PYStream *self, PyObject *args, PyObject *kwargs) {
		float32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writef32(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writef32(): unknown arguments:\n(float32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readf64(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyFloat_FromDouble(self->ptr.readf64(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readf64(): unknown arguments:\n(bool* status) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writef64(PYStream *self, PyObject *args, PyObject *kwargs) {
		float64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writef64(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writef64(): unknown arguments:\n(float64_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi32e(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLong(self->ptr.readi32e(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi32e(): unknown arguments:\n(bool* status) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei32e(PYStream *self, PyObject *args, PyObject *kwargs) {
		int32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei32e(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei32e(): unknown arguments:\n(int32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu32e(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLong(self->ptr.readu32e(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu32e(): unknown arguments:\n(bool* status) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu32e(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu32e(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu32e(): unknown arguments:\n(uint32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readi64e(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromLongLong(self->ptr.readi64e(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readi64e(): unknown arguments:\n(bool* status) -> int64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writei64e(PYStream *self, PyObject *args, PyObject *kwargs) {
		int64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "L", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writei64e(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writei64e(): unknown arguments:\n(int64_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readu64e(PYStream *self, PyObject *args, PyObject *kwargs) {
		bool *status = nullptr;
		static const char *kwlist[] = { "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
			return PyLong_FromUnsignedLongLong(self->ptr.readu64e(status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readu64e(): unknown arguments:\n(bool* status) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeu64e(PYStream *self, PyObject *args, PyObject *kwargs) {
		uint64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "K", (char**)kwlist, &value)) {
			return PyLong_FromLong(self->ptr.writeu64e(value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeu64e(): unknown arguments:\n(uint64_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readString(PYStream *self, PyObject *args, PyObject *kwargs) {
		char term = {};
		bool *status = nullptr;
		uint32_t size = Maxu32;
		static const char *kwlist[] = { "term", "status", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "b|OI", (char**)kwlist, &term, &status, &size)) {
			return PyUnicode_FromString(self->ptr.readString(term, status, size).get());
		}
		PyErr_Clear();
		{
			bool *status = nullptr;
			static const char *kwlist[] = { "status", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
				return PyUnicode_FromString(self->ptr.readString(status).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readString(): unknown arguments:\n(char term, bool* status, uint32_t size) -> String\n(bool* status) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeString(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *str_ = nullptr;
		char term = {};
		static const char *kwlist[] = { "str", "term", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ob", (char**)kwlist, &str_, &term)) {
			if(!isPYString(str_)) break;
			const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
			return PyLong_FromLong(self->ptr.writeString(str, term));
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			char term = {};
			static const char *kwlist[] = { "str", "term", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sb", (char**)kwlist, &str, &term)) {
				return PyLong_FromLong(self->ptr.writeString(str, term));
			}
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &str_)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyLong_FromLong(self->ptr.writeString(str));
			}
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &str)) {
				return PyLong_FromLong(self->ptr.writeString(str));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeString(): unknown arguments:\n(const String str, char term) -> bool\n(const char* str, char term) -> bool\n(const String str) -> bool\n(const char* str) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readToken(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		int32_t clear = true;
		static const char *kwlist[] = { "dest", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &dest_, &clear)) {
			if(!isPYString(dest_)) break;
			String &dest = pyString_get(dest_);
			return PyLong_FromLong(self->ptr.readToken(dest, (clear != 0)));
		}
		PyErr_Clear();
		{
			bool *status = nullptr;
			static const char *kwlist[] = { "status", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
				return PyUnicode_FromString(self->ptr.readToken(status).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readToken(): unknown arguments:\n(String dest, bool clear) -> bool\n(bool* status) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readLine(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		int32_t empty = false;
		int32_t clear = true;
		static const char *kwlist[] = { "dest", "empty", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|ii", (char**)kwlist, &dest_, &empty, &clear)) {
			if(!isPYString(dest_)) break;
			String &dest = pyString_get(dest_);
			return PyLong_FromLong(self->ptr.readLine(dest, (empty != 0), (clear != 0)));
		}
		PyErr_Clear();
		{
			bool *status = nullptr;
			static const char *kwlist[] = { "status", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &status)) {
				return PyUnicode_FromString(self->ptr.readLine(status).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readLine(): unknown arguments:\n(String dest, bool empty, bool clear) -> bool\n(bool* status) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readStream(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "dest", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &dest_, &size, &status)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.readStream(dest, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readStream(): unknown arguments:\n(Stream dest, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeStream(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *src_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "src", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &src_, &size, &status)) {
			if(!isPYStream(src_)) break;
			Stream &src = pyStream_get(src_);
			return PyLong_FromSize_t(self->ptr.writeStream(src, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeStream(): unknown arguments:\n(Stream src, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readZip(PYStream *self, PyObject *args, PyObject *kwargs) {
		void *dest = nullptr;
		size_t size = {};
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &dest_buffer)) {
			if(dest_buffer.readonly) break;
			return PyLong_FromSize_t(self->ptr.readZip(dest = dest_buffer.buf, size = dest_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readZip(): unknown arguments:\n(void* dest, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeZip(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		int32_t level = -1;
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", "level", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", (char**)kwlist, &src_buffer, &level)) {
			return PyLong_FromSize_t(self->ptr.writeZip(src = src_buffer.buf, size = src_buffer.len, level));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeZip(): unknown arguments:\n(const void* src, size_t size, int32_t level) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeZipFast(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyLong_FromSize_t(self->ptr.writeZipFast(src = src_buffer.buf, size = src_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeZipFast(): unknown arguments:\n(const void* src, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeZipBest(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyLong_FromSize_t(self->ptr.writeZipBest(src = src_buffer.buf, size = src_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeZipBest(): unknown arguments:\n(const void* src, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_readLz4(PYStream *self, PyObject *args, PyObject *kwargs) {
		void *dest = nullptr;
		size_t size = {};
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &dest_buffer)) {
			if(dest_buffer.readonly) break;
			return PyLong_FromSize_t(self->ptr.readLz4(dest = dest_buffer.buf, size = dest_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::readLz4(): unknown arguments:\n(void* dest, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeLz4(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		int32_t level = -1;
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", "level", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", (char**)kwlist, &src_buffer, &level)) {
			return PyLong_FromSize_t(self->ptr.writeLz4(src = src_buffer.buf, size = src_buffer.len, level));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeLz4(): unknown arguments:\n(const void* src, size_t size, int32_t level) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeLz4Fast(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyLong_FromSize_t(self->ptr.writeLz4Fast(src = src_buffer.buf, size = src_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeLz4Fast(): unknown arguments:\n(const void* src, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_writeLz4Best(PYStream *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyLong_FromSize_t(self->ptr.writeLz4Best(src = src_buffer.buf, size = src_buffer.len));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::writeLz4Best(): unknown arguments:\n(const void* src, size_t size) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_decodeZip(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *src_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		int32_t window = 15;
		static const char *kwlist[] = { "src", "size", "status", "window", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nOi", (char**)kwlist, &src_, &size, &status, &window)) {
			if(!isPYStream(src_)) break;
			Stream &src = pyStream_get(src_);
			return PyLong_FromSize_t(self->ptr.decodeZip(src, size, status, window));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::decodeZip(): unknown arguments:\n(Stream src, size_t size, bool* status, int32_t window) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeZip(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		int32_t level = -1;
		static const char *kwlist[] = { "dest", "size", "status", "level", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nOi", (char**)kwlist, &dest_, &size, &status, &level)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeZip(dest, size, status, level));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeZip(): unknown arguments:\n(Stream dest, size_t size, bool* status, int32_t level) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeZipFast(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "dest", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &dest_, &size, &status)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeZipFast(dest, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeZipFast(): unknown arguments:\n(Stream dest, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeZipBest(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "dest", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &dest_, &size, &status)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeZipBest(dest, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeZipBest(): unknown arguments:\n(Stream dest, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_decodeLz4(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *src_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "src", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &src_, &size, &status)) {
			if(!isPYStream(src_)) break;
			Stream &src = pyStream_get(src_);
			return PyLong_FromSize_t(self->ptr.decodeLz4(src, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::decodeLz4(): unknown arguments:\n(Stream src, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeLz4(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		int32_t level = -1;
		static const char *kwlist[] = { "dest", "size", "status", "level", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nOi", (char**)kwlist, &dest_, &size, &status, &level)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeLz4(dest, size, status, level));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeLz4(): unknown arguments:\n(Stream dest, size_t size, bool* status, int32_t level) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeLz4Fast(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "dest", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &dest_, &size, &status)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeLz4Fast(dest, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeLz4Fast(): unknown arguments:\n(Stream dest, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_encodeLz4Best(PYStream *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		size_t size = 0;
		bool *status = nullptr;
		static const char *kwlist[] = { "dest", "size", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|nO", (char**)kwlist, &dest_, &size, &status)) {
			if(!isPYStream(dest_)) break;
			Stream &dest = pyStream_get(dest_);
			return PyLong_FromSize_t(self->ptr.encodeLz4Best(dest, size, status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Stream::encodeLz4Best(): unknown arguments:\n(Stream dest, size_t size, bool* status) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Stream_get_size(PYStream *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getSize());
	}
	static PyObject *Stream_get_name(PYStream *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Stream_get_data(PYStream *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getData());
	}
	static PyObject *pyStream_str(PYStream *self) {
		return PyUnicode_FromString(String::format("Stream Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyStream_bool(PYStream *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Blob
	static void pyBlob_base(PYBlob *self) {
		memcpy((void*)&self->base.ptr, (const void*)&self->ptr, sizeof(Stream));
	}
	TS_PYAPI bool isPYBlob(PyObject *object) {
		return (object && Py_TYPE(object) == &PYBlob_Type);
	}
	TS_PYAPI Blob &pyBlob_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYBlob_Type) return ((PYBlob*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Blob_get(): can't get Blob from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Blob_get(): can't get Blob from None");
		static Blob ret;
		return ret;
	}
	TS_PYAPI PyObject *pyBlob_new(const Blob &ptr) {
		PYBlob *ret = (PYBlob*)PyObject_New(PYBlob, &PYBlob_Type);
		new(&ret->ptr) Blob(ptr); pyBlob_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyBlob_new(Blob &&ptr) {
		PYBlob *ret = (PYBlob*)PyObject_New(PYBlob, &PYBlob_Type);
		new(&ret->ptr) Blob(move(ptr)); pyBlob_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyBlob_init(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) Blob(name);
			pyBlob_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) Blob(name);
				pyBlob_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const uint8_t *data = nullptr;
			size_t size = {};
			const char *name = nullptr;
			static const char *kwlist[] = { "data", "size", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn|s", (char**)kwlist, &data, &size, &name)) {
				new(&self->ptr) Blob(data, size, name);
				pyBlob_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const uint8_t (*blob)[256] = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "blob", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &blob, &name)) {
				new(&self->ptr) Blob(nullptr, name);
				pyBlob_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *blob_ = nullptr;
			int32_t move = {};
			static const char *kwlist[] = { "blob", "move", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oi", (char**)kwlist, &blob_, &move)) {
				if(!isPYBlob(blob_)) break;
				const Blob &blob = pyBlob_get(blob_);
				new(&self->ptr) Blob(blob, (move != 0));
				pyBlob_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::Blob(): unknown arguments:\n(const char* name)\n(const String name)\n(const uint8_t* data, size_t size, const char* name)\n(const uint8_t(*)[256] blob, const char* name)\n(const Blob blob, bool move)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyBlob_dealloc(PYBlob *self) {
		self->ptr.~Blob();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyBlob_equalPtr(PYBlob *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyBlob_clonePtr(PYBlob *self, PyObject *args) {
		return pyBlob_new(self->ptr.clonePtr());
	}
	static PyObject *pyBlob_clearPtr(PYBlob *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBlob_destroyPtr(PYBlob *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBlob_acquirePtr(PYBlob *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBlob_unacquirePtr(PYBlob *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBlob_isValidPtr(PYBlob *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyBlob_isOwnerPtr(PYBlob *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyBlob_isConstPtr(PYBlob *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyBlob_getCountPtr(PYBlob *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyBlob_getInternalPtr(PYBlob *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Blob_release(PYBlob *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.release();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::release(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_clear(PYBlob *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_setName(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::setName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_setSize(PYBlob *self, PyObject *args, PyObject *kwargs) {
		size_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &size)) {
			self->ptr.setSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::setSize(): unknown arguments:\n(size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_setCapacity(PYBlob *self, PyObject *args, PyObject *kwargs) {
		size_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &size)) {
			self->ptr.setCapacity(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::setCapacity(): unknown arguments:\n(size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_getCapacity(PYBlob *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getCapacity());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::getCapacity(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_setData(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const uint8_t *data = nullptr;
		size_t size = {};
		static const char *kwlist[] = { "data", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn", (char**)kwlist, &data, &size)) {
			return PyLong_FromLong(self->ptr.setData(data, size));
		}
		PyErr_Clear();
		{
			const uint8_t (*blob)[256] = nullptr;
			static const char *kwlist[] = { "blob", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &blob)) {
				return PyLong_FromLong(self->ptr.setData(nullptr));
			}
		}
		PyErr_Clear();
		{
			PyObject *blob_ = nullptr;
			static const char *kwlist[] = { "blob", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &blob_)) {
				if(!isPYBlob(blob_)) break;
				const Blob &blob = pyBlob_get(blob_);
				return PyLong_FromLong(self->ptr.setData(blob));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::setData(): unknown arguments:\n(const uint8_t* data, size_t size) -> bool\n(const uint8_t(*)[256] blob) -> bool\n(const Blob blob) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_getData(PYBlob *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getData());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getData());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::getData(): unknown arguments:\n(void) -> const uint8_t*\n(void) -> uint8_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_encodeBase64(PYBlob *self, PyObject *args, PyObject *kwargs) {
		size_t size = 0;
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|n", (char**)kwlist, &size)) {
			return PyUnicode_FromString(self->ptr.encodeBase64(size).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::encodeBase64(): unknown arguments:\n(size_t size) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_decodeBase64(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const char *src = nullptr;
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &src)) {
			return PyLong_FromLong(self->ptr.decodeBase64(src));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::decodeBase64(): unknown arguments:\n(const char* src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_getMD5(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyUnicode_FromString(Blob::getMD5(src = src_buffer.buf, size = src_buffer.len).get());
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			size_t size = 0;
			static const char *kwlist[] = { "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &src_, &size)) {
				if(!isPYStream(src_)) break;
				Stream &src = pyStream_get(src_);
				return PyUnicode_FromString(Blob::getMD5(src, size).get());
			}
		}
		PyErr_Clear();
		{
			size_t size = 0;
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|n", (char**)kwlist, &size)) {
				return PyUnicode_FromString(self->ptr.getMD5(size).get());
			}
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &str_)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyUnicode_FromString(Blob::getMD5(str).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::getMD5(): unknown arguments:\n(const void* src, size_t size) -> String\n(Stream src, size_t size) -> String\n(size_t size) -> String\n(const String str) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_getSHA1(PYBlob *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			return PyUnicode_FromString(Blob::getSHA1(src = src_buffer.buf, size = src_buffer.len).get());
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			size_t size = 0;
			static const char *kwlist[] = { "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &src_, &size)) {
				if(!isPYStream(src_)) break;
				Stream &src = pyStream_get(src_);
				return PyUnicode_FromString(Blob::getSHA1(src, size).get());
			}
		}
		PyErr_Clear();
		{
			size_t size = 0;
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|n", (char**)kwlist, &size)) {
				return PyUnicode_FromString(self->ptr.getSHA1(size).get());
			}
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &str_)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyUnicode_FromString(Blob::getSHA1(str).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Blob::getSHA1(): unknown arguments:\n(const void* src, size_t size) -> String\n(Stream src, size_t size) -> String\n(size_t size) -> String\n(const String str) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Blob_get_capacity(PYBlob *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getCapacity());
	}
	static PyObject *Blob_get_data(PYBlob *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getData());
	}
	static PyObject *Blob_get_md5(PYBlob *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getMD5().get());
	}
	static PyObject *Blob_get_sha1(PYBlob *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getSHA1().get());
	}
	static PyObject *pyBlob_str(PYBlob *self) {
		return PyUnicode_FromString(String::format("Blob Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyBlob_bool(PYBlob *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::File
	static void pyFile_base(PYFile *self) {
		memcpy((void*)&self->base.ptr, (const void*)&self->ptr, sizeof(Stream));
	}
	TS_PYAPI bool isPYFile(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFile_Type);
	}
	TS_PYAPI File &pyFile_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFile_Type) return ((PYFile*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "File_get(): can't get File from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "File_get(): can't get File from None");
		static File ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFile_new(const File &ptr) {
		PYFile *ret = (PYFile*)PyObject_New(PYFile, &PYFile_Type);
		new(&ret->ptr) File(ptr); pyFile_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFile_new(File &&ptr) {
		PYFile *ret = (PYFile*)PyObject_New(PYFile, &PYFile_Type);
		new(&ret->ptr) File(move(ptr)); pyFile_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFile_init(PYFile *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) File();
			pyFile_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::File(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFile_dealloc(PYFile *self) {
		self->ptr.~File();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFile_equalPtr(PYFile *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFile_clonePtr(PYFile *self, PyObject *args) {
		return pyFile_new(self->ptr.clonePtr());
	}
	static PyObject *pyFile_clearPtr(PYFile *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFile_destroyPtr(PYFile *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFile_acquirePtr(PYFile *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFile_unacquirePtr(PYFile *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFile_isValidPtr(PYFile *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFile_isOwnerPtr(PYFile *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFile_isConstPtr(PYFile *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFile_getCountPtr(PYFile *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFile_getInternalPtr(PYFile *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *File_open(PYFile *self, PyObject *args, PyObject *kwargs) {
		int32_t fd = {};
		const char *name = nullptr;
		const char *mode = nullptr;
		static const char *kwlist[] = { "fd", "name", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "iss", (char**)kwlist, &fd, &name, &mode)) {
			return PyLong_FromLong(self->ptr.open(fd, name, mode));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			const char *mode = nullptr;
			static const char *kwlist[] = { "name", "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &name, &mode)) {
				return PyLong_FromLong(self->ptr.open(name, mode));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			const char *mode = nullptr;
			static const char *kwlist[] = { "name", "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &name_, &mode)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.open(name, mode));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::open(): unknown arguments:\n(int32_t fd, const char* name, const char* mode) -> bool\n(const char* name, const char* mode) -> bool\n(const String name, const char* mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_popen(PYFile *self, PyObject *args, PyObject *kwargs) {
		const char *command = nullptr;
		const char *mode = nullptr;
		static const char *kwlist[] = { "command", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &command, &mode)) {
			return PyLong_FromLong(self->ptr.popen(command, mode));
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			const char *mode = nullptr;
			static const char *kwlist[] = { "command", "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &command_, &mode)) {
				if(!isPYString(command_)) break;
				const String &command = (command_) ? ((PyUnicode_Check(command_)) ? String(PyUnicode_AsUTF8(command_)) : (String)pyString_get(command_)) : String::null;
				return PyLong_FromLong(self->ptr.popen(command, mode));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::popen(): unknown arguments:\n(const char* command, const char* mode) -> bool\n(const String command, const char* mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_close(PYFile *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_isFile(PYFile *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(File::isFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(File::isFile(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::isFile(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_getMTime(PYFile *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLongLong(File::getMTime(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::getMTime(): unknown arguments:\n(const char* name) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_getSize(PYFile *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromSize_t(File::getSize(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::getSize(): unknown arguments:\n(const char* name) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *File_remove(PYFile *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(File::remove(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "File::remove(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyFile_str(PYFile *self) {
		return PyUnicode_FromString(String::format("File Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFile_bool(PYFile *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Socket
	static void pySocket_base(PYSocket *self) {
		memcpy((void*)&self->base.ptr, (const void*)&self->ptr, sizeof(Stream));
	}
	TS_PYAPI bool isPYSocket(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYSocket_Type || type == &PYSocketSSL_Type);
	}
	TS_PYAPI Socket &pySocket_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYSocket_Type || type == &PYSocketSSL_Type) return ((PYSocket*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Socket_get(): can't get Socket from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Socket_get(): can't get Socket from None");
		static Socket ret;
		return ret;
	}
	TS_PYAPI PyObject *pySocket_new(const Socket &ptr) {
		PYSocket *ret = (PYSocket*)PyObject_New(PYSocket, &PYSocket_Type);
		new(&ret->ptr) Socket(ptr); pySocket_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySocket_new(Socket &&ptr) {
		PYSocket *ret = (PYSocket*)PyObject_New(PYSocket, &PYSocket_Type);
		new(&ret->ptr) Socket(move(ptr)); pySocket_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pySocket_init(PYSocket *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = Socket::TypeStream;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &type)) {
			new(&self->ptr) Socket((Socket::Type)type);
			pySocket_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::Socket(): unknown arguments:\n(Socket.Type type)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySocket_dealloc(PYSocket *self) {
		self->ptr.~Socket();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySocket_equalPtr(PYSocket *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySocket_clonePtr(PYSocket *self, PyObject *args) {
		return pySocket_new(self->ptr.clonePtr());
	}
	static PyObject *pySocket_clearPtr(PYSocket *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocket_destroyPtr(PYSocket *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocket_acquirePtr(PYSocket *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocket_unacquirePtr(PYSocket *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocket_isValidPtr(PYSocket *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySocket_isOwnerPtr(PYSocket *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySocket_isConstPtr(PYSocket *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySocket_getCountPtr(PYSocket *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySocket_getInternalPtr(PYSocket *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Socket_open(PYSocket *self, PyObject *args, PyObject *kwargs) {
		uint16_t port = {};
		uint16_t num = 32;
		static const char *kwlist[] = { "port", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "H|H", (char**)kwlist, &port, &num)) {
			return PyLong_FromLong(self->ptr.open(port, num));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint16_t port = {};
			static const char *kwlist[] = { "name", "port", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sH", (char**)kwlist, &name, &port)) {
				return PyLong_FromLong(self->ptr.open(name, port));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint16_t port = {};
			static const char *kwlist[] = { "name", "port", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OH", (char**)kwlist, &name_, &port)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.open(name, port));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::open(): unknown arguments:\n(uint16_t port, uint16_t num) -> bool\n(const char* name, uint16_t port) -> bool\n(const String name, uint16_t port) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_close(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_connect(PYSocket *self, PyObject *args, PyObject *kwargs) {
		uint32_t sec = {};
		uint32_t usec = 0;
		static const char *kwlist[] = { "sec", "usec", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &sec, &usec)) {
			return PyLong_FromLong(self->ptr.connect(sec, usec));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::connect(): unknown arguments:\n(uint32_t sec, uint32_t usec) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_accept(PYSocket *self, PyObject *args, PyObject *kwargs) {
		PyObject *socket_ = nullptr;
		static const char *kwlist[] = { "socket", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &socket_)) {
			if(!isPYSocket(socket_)) break;
			Socket &socket = pySocket_get(socket_);
			return PyLong_FromLong(self->ptr.accept(socket));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::accept(): unknown arguments:\n(Socket socket) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_select(PYSocket *self, PyObject *args, PyObject *kwargs) {
		uint32_t sec = {};
		uint32_t usec = 0;
		static const char *kwlist[] = { "sec", "usec", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &sec, &usec)) {
			return PyLong_FromLong(self->ptr.select(sec, usec));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::select(): unknown arguments:\n(uint32_t sec, uint32_t usec) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_setTimeout(PYSocket *self, PyObject *args, PyObject *kwargs) {
		uint32_t sec = {};
		static const char *kwlist[] = { "sec", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &sec)) {
			return PyLong_FromLong(self->ptr.setTimeout(sec));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::setTimeout(): unknown arguments:\n(uint32_t sec) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getTimeout(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTimeout());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getTimeout(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_setBlock(PYSocket *self, PyObject *args, PyObject *kwargs) {
		int32_t block = {};
		static const char *kwlist[] = { "block", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &block)) {
			return PyLong_FromLong(self->ptr.setBlock((block != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::setBlock(): unknown arguments:\n(bool block) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getBlock(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getBlock());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getBlock(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_setDelay(PYSocket *self, PyObject *args, PyObject *kwargs) {
		int32_t delay = {};
		static const char *kwlist[] = { "delay", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &delay)) {
			return PyLong_FromLong(self->ptr.setDelay((delay != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::setDelay(): unknown arguments:\n(bool delay) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getDelay(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDelay());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getDelay(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_setName(PYSocket *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::setName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getPort(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPort());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getPort(): unknown arguments:\n(void) -> uint16_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getFD(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getFD());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getFD(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getType(PYSocket *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getType(): unknown arguments:\n(void) -> Socket::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_getAddress(PYSocket *self, PyObject *args, PyObject *kwargs) {
		const char *delimiter = nullptr;
		static const char *kwlist[] = { "delimiter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &delimiter)) {
			return PyUnicode_FromString(Socket::getAddress(delimiter).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Socket::getAddress(): unknown arguments:\n(const char* delimiter) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Socket_get_timeout(PYSocket *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTimeout());
	}
	static PyObject *Socket_get_block(PYSocket *self, void *offset) {
		return PyLong_FromLong(self->ptr.getBlock());
	}
	static PyObject *Socket_get_delay(PYSocket *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDelay());
	}
	static PyObject *Socket_get_port(PYSocket *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPort());
	}
	static PyObject *Socket_get_fd(PYSocket *self, void *offset) {
		return PyLong_FromLong(self->ptr.getFD());
	}
	static PyObject *Socket_get_type(PYSocket *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Socket_get_address(PYSocket *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getAddress().get());
	}
	static PyObject *pySocket_str(PYSocket *self) {
		return PyUnicode_FromString(String::format("Socket Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySocket_bool(PYSocket *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::SocketSSL
	static void pySocketSSL_base(PYSocketSSL *self) {
		new(&self->base.ptr) Socket(self->ptr);
	}
	TS_PYAPI bool isPYSocketSSL(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSocketSSL_Type);
	}
	TS_PYAPI SocketSSL &pySocketSSL_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSocketSSL_Type) return ((PYSocketSSL*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SocketSSL_get(): can't get SocketSSL from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SocketSSL_get(): can't get SocketSSL from None");
		static SocketSSL ret;
		return ret;
	}
	TS_PYAPI PyObject *pySocketSSL_new(const SocketSSL &ptr) {
		PYSocketSSL *ret = (PYSocketSSL*)PyObject_New(PYSocketSSL, &PYSocketSSL_Type);
		new(&ret->ptr) SocketSSL(ptr); pySocketSSL_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySocketSSL_new(SocketSSL &&ptr) {
		PYSocketSSL *ret = (PYSocketSSL*)PyObject_New(PYSocketSSL, &PYSocketSSL_Type);
		new(&ret->ptr) SocketSSL(move(ptr)); pySocketSSL_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pySocketSSL_init(PYSocketSSL *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSocket(object)) {
				new(&self->ptr) SocketSSL(((PYSocket*)object)->ptr);
				pySocketSSL_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) SocketSSL();
			pySocketSSL_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SocketSSL::SocketSSL(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySocketSSL_dealloc(PYSocketSSL *self) {
		self->ptr.~SocketSSL();
		self->base.ptr.~Socket();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySocketSSL_equalPtr(PYSocketSSL *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySocketSSL_clonePtr(PYSocketSSL *self, PyObject *args) {
		return pySocketSSL_new(self->ptr.clonePtr());
	}
	static PyObject *pySocketSSL_clearPtr(PYSocketSSL *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocketSSL_destroyPtr(PYSocketSSL *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocketSSL_acquirePtr(PYSocketSSL *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocketSSL_unacquirePtr(PYSocketSSL *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySocketSSL_isValidPtr(PYSocketSSL *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySocketSSL_isOwnerPtr(PYSocketSSL *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySocketSSL_isConstPtr(PYSocketSSL *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySocketSSL_getCountPtr(PYSocketSSL *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySocketSSL_getInternalPtr(PYSocketSSL *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pySocketSSL_getSocket(PYSocketSSL *self, PyObject *args) {
		return pySocket_new(self->ptr.getSocket());
	}
	static PyObject *SocketSSL_handshake(PYSocketSSL *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.handshake(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SocketSSL::handshake(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SocketSSL_accept(PYSocketSSL *self, PyObject *args, PyObject *kwargs) {
		PyObject *socket_ = nullptr;
		static const char *kwlist[] = { "socket", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &socket_)) {
			if(!isPYSocketSSL(socket_)) break;
			SocketSSL &socket = pySocketSSL_get(socket_);
			return PyLong_FromLong(self->ptr.accept(socket));
		}
		PyErr_Clear();
		{
			PyObject *socket_ = nullptr;
			static const char *kwlist[] = { "socket", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &socket_)) {
				if(!isPYSocket(socket_)) break;
				Socket &socket = pySocket_get(socket_);
				return PyLong_FromLong(self->ptr.accept(socket));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SocketSSL::accept(): unknown arguments:\n(SocketSSL socket) -> bool\n(Socket socket) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SocketSSL_load(PYSocketSSL *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.load(stream));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromLong(self->ptr.load(name));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.load(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SocketSSL::load(): unknown arguments:\n(Stream stream) -> bool\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SocketSSL_isConnected(PYSocketSSL *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isConnected());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SocketSSL::isConnected(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pySocketSSL_str(PYSocketSSL *self) {
		return PyUnicode_FromString(String::format("SocketSSL Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySocketSSL_bool(PYSocketSSL *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Source
	static void pySource_base(PYSource *self) {
		memcpy((void*)&self->base.ptr, (const void*)&self->ptr, sizeof(Stream));
	}
	TS_PYAPI bool isPYSource(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSource_Type);
	}
	TS_PYAPI Source &pySource_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSource_Type) return ((PYSource*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Source_get(): can't get Source from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Source_get(): can't get Source from None");
		static Source ret;
		return ret;
	}
	TS_PYAPI PyObject *pySource_new(const Source &ptr) {
		PYSource *ret = (PYSource*)PyObject_New(PYSource, &PYSource_Type);
		new(&ret->ptr) Source(ptr); pySource_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySource_new(Source &&ptr) {
		PYSource *ret = (PYSource*)PyObject_New(PYSource, &PYSource_Type);
		new(&ret->ptr) Source(move(ptr)); pySource_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pySource_init(PYSource *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Source();
			pySource_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			const uint8_t *data = nullptr;
			size_t size = {};
			const char *name = nullptr;
			static const char *kwlist[] = { "data", "size", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn|s", (char**)kwlist, &data, &size, &name)) {
				new(&self->ptr) Source(data, size, name);
				pySource_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::Source(): unknown arguments:\n(void)\n(const uint8_t* data, size_t size, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySource_dealloc(PYSource *self) {
		self->ptr.~Source();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySource_equalPtr(PYSource *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySource_clonePtr(PYSource *self, PyObject *args) {
		return pySource_new(self->ptr.clonePtr());
	}
	static PyObject *pySource_clearPtr(PYSource *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySource_destroyPtr(PYSource *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySource_acquirePtr(PYSource *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySource_unacquirePtr(PYSource *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySource_isValidPtr(PYSource *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySource_isOwnerPtr(PYSource *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySource_isConstPtr(PYSource *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySource_getCountPtr(PYSource *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySource_getInternalPtr(PYSource *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Source_open(PYSource *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t callback = true;
		int32_t write = false;
		static const char *kwlist[] = { "name", "callback", "write", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|ii", (char**)kwlist, &name, &callback, &write)) {
			return PyLong_FromLong(self->ptr.open(name, (callback != 0), (write != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t callback = true;
			int32_t write = false;
			static const char *kwlist[] = { "name", "callback", "write", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|ii", (char**)kwlist, &name_, &callback, &write)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.open(name, (callback != 0), (write != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::open(): unknown arguments:\n(const char* name, bool callback, bool write) -> bool\n(const String name, bool callback, bool write) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_close(PYSource *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_setName(PYSource *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		size_t offset = {};
		size_t size = {};
		static const char *kwlist[] = { "name", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "snn", (char**)kwlist, &name, &offset, &size)) {
			self->ptr.setName(name, offset, size);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			size_t offset = {};
			size_t size = {};
			static const char *kwlist[] = { "name", "offset", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Onn", (char**)kwlist, &name_, &offset, &size)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setName(name, offset, size);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::setName(): unknown arguments:\n(const char* name, size_t offset, size_t size) -> void\n(const String name, size_t offset, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_setData(PYSource *self, PyObject *args, PyObject *kwargs) {
		const uint8_t *data = nullptr;
		size_t size = {};
		const char *name = nullptr;
		static const char *kwlist[] = { "data", "size", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn|s", (char**)kwlist, &data, &size, &name)) {
			self->ptr.setData(data, size, name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::setData(): unknown arguments:\n(const uint8_t* data, size_t size, const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_isSource(PYSource *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Source::isSource(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Source::isSource(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::isSource(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_getMTime(PYSource *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLongLong(Source::getMTime(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::getMTime(): unknown arguments:\n(const char* name) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Source_getSize(PYSource *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromSize_t(Source::getSize(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Source::getSize(): unknown arguments:\n(const char* name) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pySource_str(PYSource *self) {
		return PyUnicode_FromString(String::format("Source Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySource_bool(PYSource *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Date
	TS_PYAPI bool isPYDate(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDate_Type);
	}
	TS_PYAPI Date &pyDate_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDate_Type) return ((PYDate*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Date_get(): can't get Date from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Date_get(): can't get Date from None");
		static Date ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDate_new(const Date &ptr) {
		PYDate *ret = (PYDate*)PyObject_New(PYDate, &PYDate_Type);
		new(&ret->ptr) Date(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDate_new(Date &&ptr) {
		PYDate *ret = (PYDate*)PyObject_New(PYDate, &PYDate_Type);
		new(&ret->ptr) Date(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDate_init(PYDate *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Date();
			return 0;
		}
		PyErr_Clear();
		{
			int64_t time = {};
			int32_t local = true;
			static const char *kwlist[] = { "time", "local", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "L|i", (char**)kwlist, &time, &local)) {
				new(&self->ptr) Date(time, (local != 0));
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			const char *format = nullptr;
			static const char *kwlist[] = { "str", "format", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &str, &format)) {
				new(&self->ptr) Date(str, format);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::Date(): unknown arguments:\n(void)\n(int64_t time, bool local)\n(const char* str, const char* format)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDate_dealloc(PYDate *self) {
		self->ptr.~Date();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDate_equalPtr(PYDate *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDate_clonePtr(PYDate *self, PyObject *args) {
		return pyDate_new(self->ptr.clonePtr());
	}
	static PyObject *pyDate_clearPtr(PYDate *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDate_destroyPtr(PYDate *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDate_acquirePtr(PYDate *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDate_unacquirePtr(PYDate *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDate_isValidPtr(PYDate *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDate_isOwnerPtr(PYDate *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDate_isConstPtr(PYDate *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDate_getCountPtr(PYDate *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDate_getInternalPtr(PYDate *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Date_clear(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setTime(PYDate *self, PyObject *args, PyObject *kwargs) {
		int64_t time = {};
		int32_t local = true;
		static const char *kwlist[] = { "time", "local", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "L|i", (char**)kwlist, &time, &local)) {
			self->ptr.setTime(time, (local != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setTime(): unknown arguments:\n(int64_t time, bool local) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getTime(PYDate *self, PyObject *args, PyObject *kwargs) {
		int32_t local = true;
		static const char *kwlist[] = { "local", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &local)) {
			return PyLong_FromLongLong(self->ptr.getTime((local != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getTime(): unknown arguments:\n(bool local) -> int64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setString(PYDate *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		const char *format = nullptr;
		static const char *kwlist[] = { "str", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &str, &format)) {
			return PyLong_FromLong(self->ptr.setString(str, format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setString(): unknown arguments:\n(const char* str, const char* format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getString(PYDate *self, PyObject *args, PyObject *kwargs) {
		const char *format = nullptr;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &format)) {
			return PyUnicode_FromString(self->ptr.getString(format).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getString(): unknown arguments:\n(const char* format) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setYear(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t year = {};
		static const char *kwlist[] = { "year", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &year)) {
			self->ptr.setYear(year);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setYear(): unknown arguments:\n(uint32_t year) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setMonth(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t month = {};
		static const char *kwlist[] = { "month", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &month)) {
			self->ptr.setMonth(month);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setMonth(): unknown arguments:\n(uint32_t month) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setDate(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t date = {};
		static const char *kwlist[] = { "date", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &date)) {
			self->ptr.setDate(date);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setDate(): unknown arguments:\n(uint32_t date) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setDay(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t day = {};
		static const char *kwlist[] = { "day", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &day)) {
			self->ptr.setDay(day);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setDay(): unknown arguments:\n(uint32_t day) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setHours(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t hours = {};
		static const char *kwlist[] = { "hours", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &hours)) {
			self->ptr.setHours(hours);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setHours(): unknown arguments:\n(uint32_t hours) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setMinutes(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t minutes = {};
		static const char *kwlist[] = { "minutes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &minutes)) {
			self->ptr.setMinutes(minutes);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setMinutes(): unknown arguments:\n(uint32_t minutes) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_setSeconds(PYDate *self, PyObject *args, PyObject *kwargs) {
		uint32_t seconds = {};
		static const char *kwlist[] = { "seconds", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &seconds)) {
			self->ptr.setSeconds(seconds);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::setSeconds(): unknown arguments:\n(uint32_t seconds) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getYear(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getYear());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getYear(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getMonth(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMonth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getMonth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getDate(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDate());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getDate(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getDay(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDay());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getDay(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getHours(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHours());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getHours(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getMinutes(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMinutes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getMinutes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getSeconds(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSeconds());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getSeconds(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_getTimeZone(PYDate *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(Date::getTimeZone());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Date::getTimeZone(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Date_get_time(PYDate *self, void *offset) {
		return PyLong_FromLongLong(self->ptr.getTime());
	}
	static PyObject *Date_get_string(PYDate *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getString().get());
	}
	static PyObject *Date_get_year(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getYear());
	}
	static PyObject *Date_get_month(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMonth());
	}
	static PyObject *Date_get_date(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDate());
	}
	static PyObject *Date_get_day(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDay());
	}
	static PyObject *Date_get_hours(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHours());
	}
	static PyObject *Date_get_minutes(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMinutes());
	}
	static PyObject *Date_get_seconds(PYDate *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSeconds());
	}
	static PyObject *Date_get_time_zone(PYDate *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTimeZone());
	}
	static PyObject *pyDate_str(PYDate *self) {
		return PyUnicode_FromString(String::format("Date Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDate_bool(PYDate *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Info
	TS_PYAPI bool isPYInfo(PyObject *object) {
		return (object && Py_TYPE(object) == &PYInfo_Type);
	}
	TS_PYAPI Info &pyInfo_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYInfo_Type) return ((PYInfo*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Info_get(): can't get Info from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Info_get(): can't get Info from None");
		static Info ret;
		return ret;
	}
	TS_PYAPI PyObject *pyInfo_new(const Info &ptr) {
		PYInfo *ret = (PYInfo*)PyObject_New(PYInfo, &PYInfo_Type);
		new(&ret->ptr) Info(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyInfo_new(Info &&ptr) {
		PYInfo *ret = (PYInfo*)PyObject_New(PYInfo, &PYInfo_Type);
		new(&ret->ptr) Info(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyInfo_init(PYInfo *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Info();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::Info(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyInfo_dealloc(PYInfo *self) {
		self->ptr.~Info();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyInfo_equalPtr(PYInfo *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyInfo_clonePtr(PYInfo *self, PyObject *args) {
		return pyInfo_new(self->ptr.clonePtr());
	}
	static PyObject *pyInfo_clearPtr(PYInfo *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyInfo_destroyPtr(PYInfo *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyInfo_acquirePtr(PYInfo *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyInfo_unacquirePtr(PYInfo *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyInfo_isValidPtr(PYInfo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyInfo_isOwnerPtr(PYInfo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyInfo_isConstPtr(PYInfo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyInfo_getCountPtr(PYInfo *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyInfo_getInternalPtr(PYInfo *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Info_getSystemMemory(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getSystemMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getSystemMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getSystemUptime(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(self->ptr.getSystemUptime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getSystemUptime(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getSystemName(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getSystemName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getSystemName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getSystemVersion(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getSystemVersion().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getSystemVersion(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getKernelVersion(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getKernelVersion().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getKernelVersion(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUCount(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUCount());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUCount(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUName(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getCPUName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUVendor(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getCPUVendor(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUVendor(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUCores(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUCores(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUCores(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUThreads(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUThreads(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUThreads(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUFrequency(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getCPUFrequency(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUFrequency(): unknown arguments:\n(uint32_t index) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUTemperature(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUTemperature(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUTemperature(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUUtilization(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUUtilization(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUUtilization(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUFanSpeed(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUFanSpeed(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUFanSpeed(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getCPUPower(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getCPUPower(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getCPUPower(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUCount(PYInfo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUCount());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUCount(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUName(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getGPUName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUVendor(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getGPUVendor(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUVendor(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUSerial(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getGPUSerial(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUSerial(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUDevice(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getGPUDevice(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUDevice(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUVersion(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getGPUVersion(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUVersion(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUMemory(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getGPUMemory(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUMemory(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUScreens(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUScreens(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUScreens(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUFrequency(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getGPUFrequency(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUFrequency(): unknown arguments:\n(uint32_t index) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUTemperature(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUTemperature(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUTemperature(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUUtilization(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUUtilization(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUUtilization(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUFanSpeed(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUFanSpeed(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUFanSpeed(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_getGPUPower(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getGPUPower(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::getGPUPower(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_isGPUThrottling(PYInfo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isGPUThrottling(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Info::isGPUThrottling(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Info_get_system_memory(PYInfo *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getSystemMemory());
	}
	static PyObject *Info_get_system_uptime(PYInfo *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getSystemUptime());
	}
	static PyObject *Info_get_system_name(PYInfo *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getSystemName().get());
	}
	static PyObject *Info_get_system_version(PYInfo *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getSystemVersion().get());
	}
	static PyObject *Info_get_kernel_version(PYInfo *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getKernelVersion().get());
	}
	static PyObject *Info_get_cpu_count(PYInfo *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCPUCount());
	}
	static PyObject *Info_get_gpu_count(PYInfo *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGPUCount());
	}
	static PyObject *pyInfo_str(PYInfo *self) {
		return PyUnicode_FromString(String::format("Info Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyInfo_bool(PYInfo *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Directory
	TS_PYAPI bool isPYDirectory(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDirectory_Type);
	}
	TS_PYAPI Directory &pyDirectory_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDirectory_Type) return ((PYDirectory*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Directory_get(): can't get Directory from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Directory_get(): can't get Directory from None");
		static Directory ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDirectory_new(const Directory &ptr) {
		PYDirectory *ret = (PYDirectory*)PyObject_New(PYDirectory, &PYDirectory_Type);
		new(&ret->ptr) Directory(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDirectory_new(Directory &&ptr) {
		PYDirectory *ret = (PYDirectory*)PyObject_New(PYDirectory, &PYDirectory_Type);
		new(&ret->ptr) Directory(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDirectory_init(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Directory();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::Directory(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDirectory_dealloc(PYDirectory *self) {
		self->ptr.~Directory();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDirectory_equalPtr(PYDirectory *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDirectory_clonePtr(PYDirectory *self, PyObject *args) {
		return pyDirectory_new(self->ptr.clonePtr());
	}
	static PyObject *pyDirectory_clearPtr(PYDirectory *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDirectory_destroyPtr(PYDirectory *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDirectory_acquirePtr(PYDirectory *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDirectory_unacquirePtr(PYDirectory *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDirectory_isValidPtr(PYDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDirectory_isOwnerPtr(PYDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDirectory_isConstPtr(PYDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDirectory_getCountPtr(PYDirectory *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDirectory_getInternalPtr(PYDirectory *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Directory_open(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t children = false;
		static const char *kwlist[] = { "name", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &children)) {
			return PyLong_FromLong(self->ptr.open(name, (children != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t children = false;
			static const char *kwlist[] = { "name", "children", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &name_, &children)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.open(name, (children != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::open(): unknown arguments:\n(const char* name, bool children) -> bool\n(const String name, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_close(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_isOpened(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isOpened());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::isOpened(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getName(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getNumFiles(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumFiles());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getNumFiles(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileName(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getFileName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileAttributes(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getFileAttributes(index));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(Directory::getFileAttributes(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileAttributes(): unknown arguments:\n(uint32_t index) -> Directory::Attributes\n(const char* name) -> Directory::Attributes\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileMTime(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getFileMTime(index));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLongLong(Directory::getFileMTime(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileMTime(): unknown arguments:\n(uint32_t index) -> uint64_t\n(const char* name) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileATime(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getFileATime(index));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLongLong(Directory::getFileATime(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileATime(): unknown arguments:\n(uint32_t index) -> uint64_t\n(const char* name) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileCTime(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getFileCTime(index));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLongLong(Directory::getFileCTime(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileCTime(): unknown arguments:\n(uint32_t index) -> uint64_t\n(const char* name) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFileSize(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getFileSize(index));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromSize_t(Directory::getFileSize(name));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromSize_t(Directory::getFileSize(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFileSize(): unknown arguments:\n(uint32_t index) -> size_t\n(const char* name) -> size_t\n(const String name) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getFiles(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getFiles();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getFiles(): unknown arguments:\n(void) -> const Array<String>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getNumDirectories(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumDirectories());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getNumDirectories(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDirectoryName(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getDirectoryName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDirectoryName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDirectoryAttributes(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getDirectoryAttributes(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDirectoryAttributes(): unknown arguments:\n(uint32_t index) -> Directory::Attributes\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDirectoryCTime(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getDirectoryCTime(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDirectoryCTime(): unknown arguments:\n(uint32_t index) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDirectorySize(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getDirectorySize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDirectorySize(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDirectories(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getDirectories();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDirectories(): unknown arguments:\n(void) -> const Array<String>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_isFile(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Directory::isFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::isFile(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::isFile(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_setFileAttributes(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t attributes = 0;
		static const char *kwlist[] = { "name", "attributes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &name, &attributes)) {
			return PyLong_FromLong(Directory::setFileAttributes(name, (Directory::Attributes)attributes));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::setFileAttributes(): unknown arguments:\n(const char* name, Directory.Attributes attributes) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_setFileMTime(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint64_t time = {};
		static const char *kwlist[] = { "name", "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sK", (char**)kwlist, &name, &time)) {
			return PyLong_FromLong(Directory::setFileMTime(name, time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::setFileMTime(): unknown arguments:\n(const char* name, uint64_t time) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_removeFile(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Directory::removeFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::removeFile(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::removeFile(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_copyFile(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		const char *new_name = nullptr;
		int32_t attributes = false;
		static const char *kwlist[] = { "name", "new_name", "attributes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss|i", (char**)kwlist, &name, &new_name, &attributes)) {
			return PyLong_FromLong(Directory::copyFile(name, new_name, (attributes != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *new_name_ = nullptr;
			int32_t attributes = false;
			static const char *kwlist[] = { "name", "new_name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &name_, &new_name_, &attributes)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYString(new_name_)) break;
				const String &new_name = (new_name_) ? ((PyUnicode_Check(new_name_)) ? String(PyUnicode_AsUTF8(new_name_)) : (String)pyString_get(new_name_)) : String::null;
				return PyLong_FromLong(Directory::copyFile(name, new_name, (attributes != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::copyFile(): unknown arguments:\n(const char* name, const char* new_name, bool attributes) -> bool\n(const String name, const String new_name, bool attributes) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_isDirectory(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Directory::isDirectory(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::isDirectory(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::isDirectory(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_changeDirectory(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Directory::changeDirectory(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::changeDirectory(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::changeDirectory(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_createDirectory(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t children = false;
		static const char *kwlist[] = { "name", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &children)) {
			return PyLong_FromLong(Directory::createDirectory(name, (children != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t children = false;
			static const char *kwlist[] = { "name", "children", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &name_, &children)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::createDirectory(name, (children != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::createDirectory(): unknown arguments:\n(const char* name, bool children) -> bool\n(const String name, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_removeDirectory(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t children = false;
		static const char *kwlist[] = { "name", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &children)) {
			return PyLong_FromLong(Directory::removeDirectory(name, (children != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t children = false;
			static const char *kwlist[] = { "name", "children", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &name_, &children)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(Directory::removeDirectory(name, (children != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::removeDirectory(): unknown arguments:\n(const char* name, bool children) -> bool\n(const String name, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_copyDirectory(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		const char *new_name = nullptr;
		int32_t attributes = false;
		static const char *kwlist[] = { "name", "new_name", "attributes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss|i", (char**)kwlist, &name, &new_name, &attributes)) {
			return PyLong_FromLong(Directory::copyDirectory(name, new_name, (attributes != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *new_name_ = nullptr;
			int32_t attributes = false;
			static const char *kwlist[] = { "name", "new_name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &name_, &new_name_, &attributes)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYString(new_name_)) break;
				const String &new_name = (new_name_) ? ((PyUnicode_Check(new_name_)) ? String(PyUnicode_AsUTF8(new_name_)) : (String)pyString_get(new_name_)) : String::null;
				return PyLong_FromLong(Directory::copyDirectory(name, new_name, (attributes != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::copyDirectory(): unknown arguments:\n(const char* name, const char* new_name, bool attributes) -> bool\n(const String name, const String new_name, bool attributes) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_rename(PYDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		const char *new_name = nullptr;
		static const char *kwlist[] = { "name", "new_name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &name, &new_name)) {
			return PyLong_FromLong(Directory::rename(name, new_name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *new_name_ = nullptr;
			static const char *kwlist[] = { "name", "new_name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &name_, &new_name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYString(new_name_)) break;
				const String &new_name = (new_name_) ? ((PyUnicode_Check(new_name_)) ? String(PyUnicode_AsUTF8(new_name_)) : (String)pyString_get(new_name_)) : String::null;
				return PyLong_FromLong(Directory::rename(name, new_name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::rename(): unknown arguments:\n(const char* name, const char* new_name) -> bool\n(const String name, const String new_name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getCurrentDirectory(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(Directory::getCurrentDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getCurrentDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getHomeDirectory(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(Directory::getHomeDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getHomeDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getTempDirectory(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(Directory::getTempDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getTempDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getConfigDirectory(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(Directory::getConfigDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getConfigDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDocumentsDirectory(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(Directory::getDocumentsDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDocumentsDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_getDriveNames(PYDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = Directory::getDriveNames();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyUnicode_FromString(ret_[i].get()));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Directory::getDriveNames(): unknown arguments:\n(void) -> const Array<String>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Directory_get_name(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Directory_get_num_files(PYDirectory *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumFiles());
	}
	static PyObject *Directory_get_num_directories(PYDirectory *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumDirectories());
	}
	static PyObject *Directory_get_current_directory(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getCurrentDirectory().get());
	}
	static PyObject *Directory_get_home_directory(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getHomeDirectory().get());
	}
	static PyObject *Directory_get_temp_directory(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTempDirectory().get());
	}
	static PyObject *Directory_get_config_directory(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getConfigDirectory().get());
	}
	static PyObject *Directory_get_documents_directory(PYDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDocumentsDirectory().get());
	}
	static PyObject *pyDirectory_str(PYDirectory *self) {
		return PyUnicode_FromString(String::format("Directory Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDirectory_bool(PYDirectory *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Archive
	TS_PYAPI bool isPYArchive(PyObject *object) {
		return (object && Py_TYPE(object) == &PYArchive_Type);
	}
	TS_PYAPI Archive &pyArchive_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYArchive_Type) return ((PYArchive*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Archive_get(): can't get Archive from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Archive_get(): can't get Archive from None");
		return *(Archive*)nullptr;
	}
	static int32_t pyArchive_init(PYArchive *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Archive();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::Archive(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyArchive_dealloc(PYArchive *self) {
		self->ptr.~Archive();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *Archive_open(PYArchive *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		const char *type = nullptr;
		static const char *kwlist[] = { "name", "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &name, &type)) {
			return PyLong_FromLong(self->ptr.open(name, type));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			const char *type = nullptr;
			static const char *kwlist[] = { "name", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &name_, &type)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.open(name, type));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			const char *type = nullptr;
			static const char *kwlist[] = { "stream", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &stream_, &type)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.open(stream, type));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::open(): unknown arguments:\n(const char* name, const char* type) -> bool\n(const String name, const char* type) -> bool\n(Stream stream, const char* type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_close(PYArchive *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_isOpened(PYArchive *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isOpened());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::isOpened(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_getName(PYArchive *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_getNumFiles(PYArchive *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumFiles());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::getNumFiles(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_getFileName(PYArchive *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getFileName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::getFileName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_getFileMTime(PYArchive *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getFileMTime(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::getFileMTime(): unknown arguments:\n(uint32_t index) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_getFileSize(PYArchive *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getFileSize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::getFileSize(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_findFile(PYArchive *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(self->ptr.findFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.findFile(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::findFile(): unknown arguments:\n(const char* name) -> uint32_t\n(const String name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_isFile(PYArchive *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.isFile(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::isFile(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_openFile(PYArchive *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return pyStream_new(self->ptr.openFile(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return pyStream_new(self->ptr.openFile(name));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyStream_new(self->ptr.openFile(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Archive::openFile(): unknown arguments:\n(const char* name) -> Stream\n(const String name) -> Stream\n(uint32_t index) -> Stream\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Archive_get_name(PYArchive *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Archive_get_num_files(PYArchive *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumFiles());
	}
	static PyObject *pyArchive_str(PYArchive *self) {
		return PyUnicode_FromString("Archive");
	}
	static int32_t pyArchive_bool(PYArchive *self) {
		return 1;
	}
	
	// Tellusim::Image
	TS_PYAPI bool isPYImage(PyObject *object) {
		return (object && Py_TYPE(object) == &PYImage_Type);
	}
	TS_PYAPI Image &pyImage_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYImage_Type) return ((PYImage*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Image_get(): can't get Image from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Image_get(): can't get Image from None");
		static Image ret;
		return ret;
	}
	TS_PYAPI PyObject *pyImage_new(const Image &ptr) {
		PYImage *ret = (PYImage*)PyObject_New(PYImage, &PYImage_Type);
		new(&ret->ptr) Image(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyImage_new(Image &&ptr) {
		PYImage *ret = (PYImage*)PyObject_New(PYImage, &PYImage_Type);
		new(&ret->ptr) Image(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyImage_init(PYImage *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Image();
			return 0;
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			static const char *kwlist[] = { "name", "flags", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &name, &flags, &offset)) {
				new(&self->ptr) Image(name, (Image::Flags)flags, offset);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			static const char *kwlist[] = { "stream", "flags", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|II", (char**)kwlist, &stream_, &flags, &offset)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				new(&self->ptr) Image(stream, (Image::Flags)flags, offset);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "type", "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|I", (char**)kwlist, &type, &format, &size_, &flags)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				new(&self->ptr) Image((Image::Type)type, (Format)format, size, (Image::Flags)flags);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			uint32_t layers = {};
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "type", "format", "size", "layers", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOI|I", (char**)kwlist, &type, &format, &size_, &layers, &flags)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				new(&self->ptr) Image((Image::Type)type, (Format)format, size, layers, (Image::Flags)flags);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::Image(): unknown arguments:\n(void)\n(const char* name, Image.Flags flags, uint32_t offset)\n(Stream stream, Image.Flags flags, uint32_t offset)\n(Image.Type type, Format format, const Size size, Image.Flags flags)\n(Image.Type type, Format format, const Size size, uint32_t layers, Image.Flags flags)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyImage_dealloc(PYImage *self) {
		self->ptr.~Image();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyImage_equalPtr(PYImage *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyImage_clonePtr(PYImage *self, PyObject *args) {
		return pyImage_new(self->ptr.clonePtr());
	}
	static PyObject *pyImage_clearPtr(PYImage *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyImage_destroyPtr(PYImage *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyImage_acquirePtr(PYImage *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyImage_unacquirePtr(PYImage *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyImage_isValidPtr(PYImage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyImage_isOwnerPtr(PYImage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyImage_isConstPtr(PYImage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyImage_getCountPtr(PYImage *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyImage_getInternalPtr(PYImage *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Image_clear(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isLoaded(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isLoaded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isLoaded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isAllocated(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAllocated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isAllocated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getType(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getType(): unknown arguments:\n(void) -> Image::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getTypeName(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Image::getTypeName((Image::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getTypeName(): unknown arguments:\n(Image.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is2DType(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is2DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is2DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is3DType(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is3DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is3DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isCubeType(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCubeType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isCubeType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getFormatName(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isColorFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isColorFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isColorFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isDepthFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isDepthFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isPixelFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isPixelFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isPlainFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPlainFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isPlainFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isMixedFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMixedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isMixedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isBlockFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBlockFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isBlockFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isStencilFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isStencilFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isStencilFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isNormFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNormFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isNormFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isSRGBFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSRGBFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isSRGBFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isFloatFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFloatFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isFloatFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isSignedFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSignedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isSignedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isUnsignedFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnsignedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isUnsignedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isIntegerFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIntegerFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isIntegerFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isi8Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi8Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isi8Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isu8Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu8Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isu8Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is8BitFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is8BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is8BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isi16Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isi16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isu16Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isu16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isf16Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isf16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is16BitFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is16BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is16BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isi32Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isi32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isu32Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isu32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isf32Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isf32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is32BitFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is32BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is32BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isi64Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isi64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isu64Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isu64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isf64Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isf64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_is64BitFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is64BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::is64BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isBC15Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBC15Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isBC15Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isBC67Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBC67Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isBC67Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isETC2Format(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isETC2Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isETC2Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_isASTCFormat(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isASTCFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::isASTCFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getComponents(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getComponents());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getComponents(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getPixelSize(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getPixelSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getBlockSize(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getBlockSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getBlockWidth(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getBlockWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getBlockHeight(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getBlockHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getWidth(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getWidth(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getHeight(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getHeight(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getDepth(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getDepth(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getFaces(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getFaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getLayers(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getLayers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getMipmaps(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getMipmaps(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_findMipmap(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *size_ = nullptr;
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &size_)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return PyLong_FromUnsignedLong(self->ptr.findMipmap(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::findMipmap(): unknown arguments:\n(const Size size) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_hasLayers(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::hasLayers(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_hasMipmaps(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::hasMipmaps(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getSize(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return pySize_new(self->ptr.getSize(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pySize_new(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getSize(): unknown arguments:\n(uint32_t mipmap) -> Size\n(void) -> Size\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getRegion(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *region_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "region", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &region_, &slice_)) {
			if(!isPYRegion(region_)) break;
			const Region &region = pyRegion_get(region_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return pyImage_new(self->ptr.getRegion(region, slice));
		}
		PyErr_Clear();
		{
			uint32_t mipmap = {};
			static const char *kwlist[] = { "mipmap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
				return pyRegion_new(self->ptr.getRegion(mipmap));
			}
		}
		PyErr_Clear();
		{
			PyObject *region_ = nullptr;
			static const char *kwlist[] = { "region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &region_)) {
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				return pyImage_new(self->ptr.getRegion(region));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyRegion_new(self->ptr.getRegion());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getRegion(): unknown arguments:\n(const Region region, const Slice slice) -> Image\n(uint32_t mipmap) -> Region\n(const Region region) -> Image\n(void) -> Region\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getSlice(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return pySlice_new(self->ptr.getSlice(mipmap));
		}
		PyErr_Clear();
		{
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &slice_)) {
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				return pyImage_new(self->ptr.getSlice(slice));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pySlice_new(self->ptr.getSlice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getSlice(): unknown arguments:\n(uint32_t mipmap) -> Slice\n(const Slice slice) -> Image\n(void) -> Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_setMetaInfo(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *str_ = nullptr;
		static const char *kwlist[] = { "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &str_)) {
			if(!isPYString(str_)) break;
			const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
			self->ptr.setMetaInfo(str);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::setMetaInfo(): unknown arguments:\n(const String str) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getMetaInfo(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getMetaInfo().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getMetaInfo(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getDescription(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDescription().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getDescription(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getOffset(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *slice_ = nullptr;
		uint32_t alignment = 1;
		static const char *kwlist[] = { "slice", "alignment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &slice_, &alignment)) {
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromSize_t(self->ptr.getOffset(slice, alignment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getOffset(): unknown arguments:\n(const Slice slice, uint32_t alignment) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getStride(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = 0;
		uint32_t alignment = 1;
		static const char *kwlist[] = { "mipmap", "alignment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|II", (char**)kwlist, &mipmap, &alignment)) {
			return PyLong_FromSize_t(self->ptr.getStride(mipmap, alignment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getStride(): unknown arguments:\n(uint32_t mipmap, uint32_t alignment) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getMipmapSize(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		uint32_t alignment = 1;
		static const char *kwlist[] = { "mipmap", "alignment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &mipmap, &alignment)) {
			return PyLong_FromSize_t(self->ptr.getMipmapSize(mipmap, alignment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getMipmapSize(): unknown arguments:\n(uint32_t mipmap, uint32_t alignment) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getLayerSize(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t alignment = 1;
		static const char *kwlist[] = { "alignment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &alignment)) {
			return PyLong_FromSize_t(self->ptr.getLayerSize(alignment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getLayerSize(): unknown arguments:\n(uint32_t alignment) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getDataSize(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t alignment = 1;
		static const char *kwlist[] = { "alignment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &alignment)) {
			return PyLong_FromSize_t(self->ptr.getDataSize(alignment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getDataSize(): unknown arguments:\n(uint32_t alignment) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_create(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		PyObject *size_ = nullptr;
		uint32_t layers = {};
		uint32_t flags = Image::FlagNone;
		static const char *kwlist[] = { "type", "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOI|I", (char**)kwlist, &type, &format, &size_, &layers, &flags)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, layers, (Image::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "type", "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|I", (char**)kwlist, &type, &format, &size_, &flags)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, (Image::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::create(): unknown arguments:\n(Image.Type type, Format format, const Size size, uint32_t layers, Image.Flags flags) -> bool\n(Image.Type type, Format format, const Size size, Image.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_create2D(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t layers = {};
		uint32_t flags = Image::FlagNone;
		static const char *kwlist[] = { "format", "width", "height", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &layers, &flags)) {
			return PyLong_FromLong(self->ptr.create2D((Format)format, width, height, layers, (Image::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t width = {};
			uint32_t height = {};
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "format", "width", "height", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &width, &height, &flags)) {
				return PyLong_FromLong(self->ptr.create2D((Format)format, width, height, (Image::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.create2D((Format)format, size, (Image::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::create2D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t layers, Image.Flags flags) -> bool\n(Format format, uint32_t width, uint32_t height, Image.Flags flags) -> bool\n(Format format, uint32_t size, Image.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_create3D(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t depth = {};
		uint32_t flags = Image::FlagNone;
		static const char *kwlist[] = { "format", "width", "height", "depth", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &depth, &flags)) {
			return PyLong_FromLong(self->ptr.create3D((Format)format, width, height, depth, (Image::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.create3D((Format)format, size, (Image::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::create3D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t depth, Image.Flags flags) -> bool\n(Format format, uint32_t size, Image.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_createCube(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t size = {};
		uint32_t layers = {};
		uint32_t flags = Image::FlagNone;
		static const char *kwlist[] = { "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &size, &layers, &flags)) {
			return PyLong_FromLong(self->ptr.createCube((Format)format, size, layers, (Image::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Image::FlagNone;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.createCube((Format)format, size, (Image::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::createCube(): unknown arguments:\n(Format format, uint32_t size, uint32_t layers, Image.Flags flags) -> bool\n(Format format, uint32_t size, Image.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_info(PYImage *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Image::FlagNone;
		uint32_t offset = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "name", "flags", "offset", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IIO", (char**)kwlist, &name, &flags, &offset, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.info(name, (Image::Flags)flags, offset, async));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIO", (char**)kwlist, &name_, &flags, &offset, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, (Image::Flags)flags, offset, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIO", (char**)kwlist, &stream_, &flags, &offset, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(stream, (Image::Flags)flags, offset, async));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &async_)) {
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &name_, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &stream_, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(stream, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::info(): unknown arguments:\n(const char* name, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(const String name, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(Stream stream, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(const char* name, Async* async) -> bool\n(const String name, Async* async) -> bool\n(Stream stream, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_load(PYImage *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Image::FlagNone;
		uint32_t offset = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "name", "flags", "offset", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IIO", (char**)kwlist, &name, &flags, &offset, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.load(name, (Image::Flags)flags, offset, async));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIO", (char**)kwlist, &name_, &flags, &offset, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, (Image::Flags)flags, offset, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIO", (char**)kwlist, &stream_, &flags, &offset, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(stream, (Image::Flags)flags, offset, async));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &async_)) {
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &name_, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &stream_, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(stream, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::load(): unknown arguments:\n(const char* name, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(const String name, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(Stream stream, Image.Flags flags, uint32_t offset, Async* async) -> bool\n(const char* name, Async* async) -> bool\n(const String name, Async* async) -> bool\n(Stream stream, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_save(PYImage *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Image::FlagNone;
		uint32_t quality = 95;
		static const char *kwlist[] = { "name", "flags", "quality", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &name, &flags, &quality)) {
			return PyLong_FromLong(self->ptr.save(name, (Image::Flags)flags, quality));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t quality = 95;
			static const char *kwlist[] = { "name", "flags", "quality", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|II", (char**)kwlist, &name_, &flags, &quality)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.save(name, (Image::Flags)flags, quality));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Image::FlagNone;
			uint32_t quality = 95;
			static const char *kwlist[] = { "stream", "flags", "quality", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|II", (char**)kwlist, &stream_, &flags, &quality)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.save(stream, (Image::Flags)flags, quality));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::save(): unknown arguments:\n(const char* name, Image.Flags flags, uint32_t quality) -> bool\n(const String name, Image.Flags flags, uint32_t quality) -> bool\n(Stream stream, Image.Flags flags, uint32_t quality) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_swap(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t component_0 = {};
		uint32_t component_1 = {};
		static const char *kwlist[] = { "component_0", "component_1", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &component_0, &component_1)) {
			return PyLong_FromLong(self->ptr.swap(component_0, component_1));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::swap(): unknown arguments:\n(uint32_t component_0, uint32_t component_1) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_copy(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *src_ = nullptr;
		PyObject *dest_origin_ = nullptr;
		PyObject *src_region_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "src", "dest_origin", "src_region", "dest_slice", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOO", (char**)kwlist, &src_, &dest_origin_, &src_region_, &dest_slice_, &src_slice_)) {
			if(!isPYImage(src_)) break;
			const Image &src = pyImage_get(src_);
			if(!isPYOrigin(dest_origin_)) break;
			const Origin &dest_origin = pyOrigin_get(dest_origin_);
			if(!isPYRegion(src_region_)) break;
			const Region &src_region = pyRegion_get(src_region_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.copy(src, dest_origin, src_region, dest_slice, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			uint32_t dest_component = {};
			uint32_t src_component = {};
			static const char *kwlist[] = { "src", "dest_component", "src_component", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII", (char**)kwlist, &src_, &dest_component, &src_component)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				return PyLong_FromLong(self->ptr.copy(src, dest_component, src_component));
			}
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *src_region_ = nullptr;
			static const char *kwlist[] = { "src", "dest_origin", "src_region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &src_, &dest_origin_, &src_region_)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYRegion(src_region_)) break;
				const Region &src_region = pyRegion_get(src_region_);
				return PyLong_FromLong(self->ptr.copy(src, dest_origin, src_region));
			}
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			static const char *kwlist[] = { "src", "dest_origin", "dest_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &src_, &dest_origin_, &dest_slice_)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				return PyLong_FromLong(self->ptr.copy(src, dest_origin, dest_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "src", "dest_slice", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &src_, &dest_slice_, &src_slice_)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.copy(src, dest_slice, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			static const char *kwlist[] = { "src", "dest_origin", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &src_, &dest_origin_)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				return PyLong_FromLong(self->ptr.copy(src, dest_origin));
			}
		}
		PyErr_Clear();
		{
			PyObject *src_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			static const char *kwlist[] = { "src", "dest_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &src_, &dest_slice_)) {
				if(!isPYImage(src_)) break;
				const Image &src = pyImage_get(src_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				return PyLong_FromLong(self->ptr.copy(src, dest_slice));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::copy(): unknown arguments:\n(const Image src, const Origin dest_origin, const Region src_region, const Slice dest_slice, const Slice src_slice) -> bool\n(const Image src, uint32_t dest_component, uint32_t src_component) -> bool\n(const Image src, const Origin dest_origin, const Region src_region) -> bool\n(const Image src, const Origin dest_origin, const Slice dest_slice) -> bool\n(const Image src, const Slice dest_slice, const Slice src_slice) -> bool\n(const Image src, const Origin dest_origin) -> bool\n(const Image src, const Slice dest_slice) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_flipX(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *region_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "region", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &region_, &slice_)) {
			if(!isPYRegion(region_)) break;
			const Region &region = pyRegion_get(region_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.flipX(region, slice));
		}
		PyErr_Clear();
		{
			PyObject *region_ = nullptr;
			static const char *kwlist[] = { "region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &region_)) {
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				return PyLong_FromLong(self->ptr.flipX(region));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flipX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::flipX(): unknown arguments:\n(const Region region, const Slice slice) -> bool\n(const Region region) -> bool\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_flipY(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *region_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "region", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &region_, &slice_)) {
			if(!isPYRegion(region_)) break;
			const Region &region = pyRegion_get(region_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.flipY(region, slice));
		}
		PyErr_Clear();
		{
			PyObject *region_ = nullptr;
			static const char *kwlist[] = { "region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &region_)) {
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				return PyLong_FromLong(self->ptr.flipY(region));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flipY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::flipY(): unknown arguments:\n(const Region region, const Slice slice) -> bool\n(const Region region) -> bool\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_toType(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t flags = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "type", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|O", (char**)kwlist, &type, &flags, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return pyImage_new(self->ptr.toType((Image::Type)type, (Image::Flags)flags, async));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "type", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &type, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.toType((Image::Type)type, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::toType(): unknown arguments:\n(Image.Type type, Image.Flags flags, Async* async) -> Image\n(Image.Type type, Async* async) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_toFormat(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t flags = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "format", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|O", (char**)kwlist, &format, &flags, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return pyImage_new(self->ptr.toFormat((Format)format, (Image::Flags)flags, async));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "format", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &format, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.toFormat((Format)format, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::toFormat(): unknown arguments:\n(Format format, Image.Flags flags, Async* async) -> Image\n(Format format, Async* async) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getComponent(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t component = {};
		static const char *kwlist[] = { "component", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &component)) {
			return pyImage_new(self->ptr.getComponent(component));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getComponent(): unknown arguments:\n(uint32_t component) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getRotated(PYImage *self, PyObject *args, PyObject *kwargs) {
		int32_t angle = {};
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "angle", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "iO", (char**)kwlist, &angle, &slice_)) {
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return pyImage_new(self->ptr.getRotated(angle, slice));
		}
		PyErr_Clear();
		{
			int32_t angle = {};
			static const char *kwlist[] = { "angle", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &angle)) {
				return pyImage_new(self->ptr.getRotated(angle));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getRotated(): unknown arguments:\n(int32_t angle, const Slice slice) -> Image\n(int32_t angle) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getResized(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *size_ = nullptr;
		uint32_t min = 0;
		uint32_t mag = 0;
		uint32_t flags = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "size", "min", "mag", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIII|O", (char**)kwlist, &size_, &min, &mag, &flags, &async_)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return pyImage_new(self->ptr.getResized(size, (Image::Filter)min, (Image::Filter)mag, (Image::Flags)flags, async));
		}
		PyErr_Clear();
		{
			PyObject *size_ = nullptr;
			uint32_t min = 0;
			uint32_t mag = Image::FilterCubic;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "size", "min", "mag", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|IO", (char**)kwlist, &size_, &min, &mag, &async_)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.getResized(size, (Image::Filter)min, (Image::Filter)mag, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *size_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "size", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &size_, &async_)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.getResized(size, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getResized(): unknown arguments:\n(const Size size, Image.Filter min, Image.Filter mag, Image.Flags flags, Async* async) -> Image\n(const Size size, Image.Filter min, Image.Filter mag, Async* async) -> Image\n(const Size size, Async* async) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getMipmapped(PYImage *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		uint32_t flags = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "filter", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|O", (char**)kwlist, &filter, &flags, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return pyImage_new(self->ptr.getMipmapped((Image::Filter)filter, (Image::Flags)flags, async));
		}
		PyErr_Clear();
		{
			uint32_t filter = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "filter", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &filter, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.getMipmapped((Image::Filter)filter, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyImage_new(self->ptr.getMipmapped(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getMipmapped(): unknown arguments:\n(Image.Filter filter, Image.Flags flags, Async* async) -> Image\n(Image.Filter filter, Async* async) -> Image\n(Async* async) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_compare(PYImage *self, PyObject *args, PyObject *kwargs) {
		PyObject *image_ = nullptr;
		static const char *kwlist[] = { "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &image_)) {
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			return PyLong_FromLong(self->ptr.compare(image));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::compare(): unknown arguments:\n(const Image image) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_getMemory(PYImage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Image::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Image_get_type(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Image_get_format(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *Image_get_format_name(PYImage *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *Image_get_components(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getComponents());
	}
	static PyObject *Image_get_pixel_size(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
	}
	static PyObject *Image_get_block_size(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockSize());
	}
	static PyObject *Image_get_block_width(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockWidth());
	}
	static PyObject *Image_get_block_height(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockHeight());
	}
	static PyObject *Image_get_width(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Image_get_height(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Image_get_depth(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepth());
	}
	static PyObject *Image_get_faces(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFaces());
	}
	static PyObject *Image_get_layers(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getLayers());
	}
	static PyObject *Image_get_mipmaps(PYImage *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
	}
	static PyObject *Image_get_size(PYImage *self, void *offset) {
		return pySize_new(self->ptr.getSize());
	}
	static PyObject *Image_get_region(PYImage *self, void *offset) {
		return pyRegion_new(self->ptr.getRegion());
	}
	static PyObject *Image_get_slice(PYImage *self, void *offset) {
		return pySlice_new(self->ptr.getSlice());
	}
	static PyObject *Image_get_meta_info(PYImage *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getMetaInfo().get());
	}
	static PyObject *Image_get_description(PYImage *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDescription().get());
	}
	static PyObject *Image_get_stride(PYImage *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getStride());
	}
	static PyObject *Image_get_layer_size(PYImage *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getLayerSize());
	}
	static PyObject *Image_get_data_size(PYImage *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getDataSize());
	}
	static PyObject *Image_get_memory(PYImage *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyImage_str(PYImage *self) {
		return PyUnicode_FromString(String::format("Image Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyImage_bool(PYImage *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ImageSampler
	TS_PYAPI bool isPYImageSampler(PyObject *object) {
		return (object && Py_TYPE(object) == &PYImageSampler_Type);
	}
	TS_PYAPI ImageSampler &pyImageSampler_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYImageSampler_Type) return ((PYImageSampler*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ImageSampler_get(): can't get ImageSampler from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ImageSampler_get(): can't get ImageSampler from None");
		static ImageSampler ret;
		return ret;
	}
	TS_PYAPI PyObject *pyImageSampler_new(const ImageSampler &ptr) {
		PYImageSampler *ret = (PYImageSampler*)PyObject_New(PYImageSampler, &PYImageSampler_Type);
		new(&ret->ptr) ImageSampler(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyImageSampler_new(ImageSampler &&ptr) {
		PYImageSampler *ret = (PYImageSampler*)PyObject_New(PYImageSampler, &PYImageSampler_Type);
		new(&ret->ptr) ImageSampler(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyImageSampler_init(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ImageSampler();
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *image_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "image", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &image_, &slice_)) {
				if(!isPYImage(image_)) break;
				Image &image = pyImage_get(image_);
				const Slice &slice = pySlice_get(slice_);
				new(&self->ptr) ImageSampler(image, slice);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *image_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "image", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &image_, &slice_)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				const Slice &slice = pySlice_get(slice_);
				new(&self->ptr) ImageSampler(image, slice);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::ImageSampler(): unknown arguments:\n(void)\n(Image image, const Slice slice)\n(const Image image, const Slice slice)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyImageSampler_dealloc(PYImageSampler *self) {
		self->ptr.~ImageSampler();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *ImageSampler_clear(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			return PyLong_FromLong(self->ptr.clear(color));
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYImageColor(color_)) break;
				const ImageColor &color = pyImageColor_get(color_);
				return PyLong_FromLong(self->ptr.clear(color));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::clear(): unknown arguments:\n(const Color color) -> bool\n(const ImageColor color) -> bool\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_isCreated(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getType(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getType(): unknown arguments:\n(void) -> Image::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_is2DType(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is2DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::is2DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_is3DType(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is3DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::is3DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_isCubeType(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCubeType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::isCubeType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getFormat(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getFormatName(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getWidth(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getHeight(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getDepth(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getDepth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getFaces(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getFaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getTexels(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getTexels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getTexels(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getSize(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySize_new(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getSize(): unknown arguments:\n(void) -> Size\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getRegion(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRegion_new(self->ptr.getRegion());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getRegion(): unknown arguments:\n(void) -> Region\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getStride(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getStride());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getStride(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getLayerSize(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getLayerSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getLayerSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getPixelSize(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getPixelSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getComponents(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getComponents());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getComponents(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getData(PYImageSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getData());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getData());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getData(): unknown arguments:\n(void) -> const uint8_t*\n(void) -> uint8_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_create(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		PyObject *size_ = nullptr;
		size_t stride = {};
		size_t layer_size = {};
		void *data = nullptr;
		static const char *kwlist[] = { "type", "format", "size", "stride", "layer_size", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOnnn", (char**)kwlist, &type, &format, &size_, &stride, &layer_size, &data)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, stride, layer_size, data));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			size_t stride = {};
			size_t layer_size = {};
			const void *data = nullptr;
			static const char *kwlist[] = { "type", "format", "size", "stride", "layer_size", "data", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOnnn", (char**)kwlist, &type, &format, &size_, &stride, &layer_size, &data)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, stride, layer_size, data));
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			size_t stride = {};
			void *data = nullptr;
			static const char *kwlist[] = { "type", "format", "size", "stride", "data", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOnn", (char**)kwlist, &type, &format, &size_, &stride, &data)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, stride, data));
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			size_t stride = {};
			const void *data = nullptr;
			static const char *kwlist[] = { "type", "format", "size", "stride", "data", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOnn", (char**)kwlist, &type, &format, &size_, &stride, &data)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				return PyLong_FromLong(self->ptr.create((Image::Type)type, (Format)format, size, stride, data));
			}
		}
		PyErr_Clear();
		{
			PyObject *image_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "image", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &image_, &slice_)) {
				if(!isPYImage(image_)) break;
				Image &image = pyImage_get(image_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.create(image, slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *image_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "image", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &image_, &slice_)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.create(image, slice));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::create(): unknown arguments:\n(Image.Type type, Format format, const Size size, size_t stride, size_t layer_size, void* data) -> bool\n(Image.Type type, Format format, const Size size, size_t stride, size_t layer_size, const void* data) -> bool\n(Image.Type type, Format format, const Size size, size_t stride, void* data) -> bool\n(Image.Type type, Format format, const Size size, size_t stride, const void* data) -> bool\n(Image image, const Slice slice) -> bool\n(const Image image, const Slice slice) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_mad(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		PyObject *m_ = nullptr;
		PyObject *a_ = nullptr;
		static const char *kwlist[] = { "m", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &m_, &a_)) {
			if(!isPYColor(m_)) break;
			const Color &m = pyColor_get(m_);
			if(!isPYColor(a_)) break;
			const Color &a = pyColor_get(a_);
			return PyLong_FromLong(self->ptr.mad(m, a));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::mad(): unknown arguments:\n(const Color m, const Color a) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_set2D(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t x = {};
		uint32_t y = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "x", "y", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO", (char**)kwlist, &x, &y, &color_)) {
			if(!isPYImageColor(color_)) break;
			const ImageColor &color = pyImageColor_get(color_);
			self->ptr.set2D(x, y, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::set2D(): unknown arguments:\n(uint32_t x, uint32_t y, const ImageColor color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_get2D(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		float64_t x = {};
		float64_t y = {};
		int32_t repeat = false;
		uint32_t filter = Image::FilterLinear;
		static const char *kwlist[] = { "x", "y", "repeat", "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dd|iI", (char**)kwlist, &x, &y, &repeat, &filter)) {
			return pyImageColor_new(self->ptr.get2D(x, y, (repeat != 0), (Image::Filter)filter));
		}
		PyErr_Clear();
		{
			uint32_t x = {};
			uint32_t y = {};
			int32_t repeat = false;
			static const char *kwlist[] = { "x", "y", "repeat", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|i", (char**)kwlist, &x, &y, &repeat)) {
				return pyImageColor_new(self->ptr.get2D(x, y, (repeat != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::get2D(): unknown arguments:\n(float64_t x, float64_t y, bool repeat, Image.Filter filter) -> ImageColor\n(uint32_t x, uint32_t y, bool repeat) -> ImageColor\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_set3D(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t x = {};
		uint32_t y = {};
		uint32_t z = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "x", "y", "z", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIIO", (char**)kwlist, &x, &y, &z, &color_)) {
			if(!isPYImageColor(color_)) break;
			const ImageColor &color = pyImageColor_get(color_);
			self->ptr.set3D(x, y, z, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::set3D(): unknown arguments:\n(uint32_t x, uint32_t y, uint32_t z, const ImageColor color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_get3D(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = {};
		int32_t repeat = false;
		uint32_t filter = Image::FilterLinear;
		static const char *kwlist[] = { "x", "y", "z", "repeat", "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fff|iI", (char**)kwlist, &x, &y, &z, &repeat, &filter)) {
			return pyImageColor_new(self->ptr.get3D(x, y, z, (repeat != 0), (Image::Filter)filter));
		}
		PyErr_Clear();
		{
			uint32_t x = {};
			uint32_t y = {};
			uint32_t z = {};
			int32_t repeat = false;
			static const char *kwlist[] = { "x", "y", "z", "repeat", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &x, &y, &z, &repeat)) {
				return pyImageColor_new(self->ptr.get3D(x, y, z, (repeat != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::get3D(): unknown arguments:\n(float32_t x, float32_t y, float32_t z, bool repeat, Image.Filter filter) -> ImageColor\n(uint32_t x, uint32_t y, uint32_t z, bool repeat) -> ImageColor\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_setCube(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "x", "y", "z", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fffO", (char**)kwlist, &x, &y, &z, &color_)) {
			if(!isPYImageColor(color_)) break;
			const ImageColor &color = pyImageColor_get(color_);
			self->ptr.setCube(x, y, z, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::setCube(): unknown arguments:\n(float32_t x, float32_t y, float32_t z, const ImageColor color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getCube(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = {};
		uint32_t filter = Image::FilterLinear;
		static const char *kwlist[] = { "x", "y", "z", "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fff|I", (char**)kwlist, &x, &y, &z, &filter)) {
			return pyImageColor_new(self->ptr.getCube(x, y, z, (Image::Filter)filter));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getCube(): unknown arguments:\n(float32_t x, float32_t y, float32_t z, Image.Filter filter) -> ImageColor\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getCubeFace(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = {};
		float32_t tx = {};
		float32_t ty = {};
		static const char *kwlist[] = { "x", "y", "z", "tx", "ty", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fffff", (char**)kwlist, &x, &y, &z, &tx, &ty)) {
			return PyLong_FromUnsignedLong(self->ptr.getCubeFace(x, y, z, tx, ty));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getCubeFace(): unknown arguments:\n(float32_t x, float32_t y, float32_t z, float32_t tx, float32_t ty) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_setTexel(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		size_t t = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "t", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nO", (char**)kwlist, &t, &color_)) {
			if(!isPYImageColor(color_)) break;
			const ImageColor &color = pyImageColor_get(color_);
			self->ptr.setTexel(t, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::setTexel(): unknown arguments:\n(size_t t, const ImageColor color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_getTexel(PYImageSampler *self, PyObject *args, PyObject *kwargs) {
		size_t t = {};
		static const char *kwlist[] = { "t", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &t)) {
			return pyImageColor_new(self->ptr.getTexel(t));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ImageSampler::getTexel(): unknown arguments:\n(size_t t) -> ImageColor\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ImageSampler_get_type(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *ImageSampler_get_format(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *ImageSampler_get_format_name(PYImageSampler *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *ImageSampler_get_width(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *ImageSampler_get_height(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *ImageSampler_get_depth(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepth());
	}
	static PyObject *ImageSampler_get_faces(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFaces());
	}
	static PyObject *ImageSampler_get_texels(PYImageSampler *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getTexels());
	}
	static PyObject *ImageSampler_get_size(PYImageSampler *self, void *offset) {
		return pySize_new(self->ptr.getSize());
	}
	static PyObject *ImageSampler_get_region(PYImageSampler *self, void *offset) {
		return pyRegion_new(self->ptr.getRegion());
	}
	static PyObject *ImageSampler_get_stride(PYImageSampler *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getStride());
	}
	static PyObject *ImageSampler_get_layer_size(PYImageSampler *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getLayerSize());
	}
	static PyObject *ImageSampler_get_pixel_size(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
	}
	static PyObject *ImageSampler_get_components(PYImageSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getComponents());
	}
	static PyObject *ImageSampler_get_data(PYImageSampler *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getData());
	}
	static PyObject *pyImageSampler_str(PYImageSampler *self) {
		return PyUnicode_FromString("ImageSampler");
	}
	static int32_t pyImageSampler_bool(PYImageSampler *self) {
		return 1;
	}
	
	// Tellusim::MeshNode
	TS_PYAPI bool isPYMeshNode(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshNode_Type);
	}
	TS_PYAPI MeshNode &pyMeshNode_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshNode_Type) return ((PYMeshNode*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshNode_get(): can't get MeshNode from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshNode_get(): can't get MeshNode from None");
		static MeshNode ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshNode_new(const MeshNode &ptr) {
		PYMeshNode *ret = (PYMeshNode*)PyObject_New(PYMeshNode, &PYMeshNode_Type);
		new(&ret->ptr) MeshNode(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshNode_new(MeshNode &&ptr) {
		PYMeshNode *ret = (PYMeshNode*)PyObject_New(PYMeshNode, &PYMeshNode_Type);
		new(&ret->ptr) MeshNode(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshNode_init(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshNode(name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *mesh_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "mesh", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &mesh_, &name)) {
				if(!isPYMesh(mesh_)) break;
				Mesh &mesh = pyMesh_get(mesh_);
				new(&self->ptr) MeshNode(mesh, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "parent", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &parent_, &name)) {
				if(!isPYMeshNode(parent_)) break;
				MeshNode *parent = (parent_) ? &pyMeshNode_get(parent_) : nullptr;
				new(&self->ptr) MeshNode(parent, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *mesh_ = nullptr;
			PyObject *parent_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "mesh", "parent", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|s", (char**)kwlist, &mesh_, &parent_, &name)) {
				if(!isPYMesh(mesh_)) break;
				Mesh &mesh = pyMesh_get(mesh_);
				if(!isPYMeshNode(parent_)) break;
				MeshNode *parent = (parent_) ? &pyMeshNode_get(parent_) : nullptr;
				new(&self->ptr) MeshNode(mesh, parent, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::MeshNode(): unknown arguments:\n(const char* name)\n(Mesh mesh, const char* name)\n(MeshNode* parent, const char* name)\n(Mesh mesh, MeshNode* parent, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshNode_dealloc(PYMeshNode *self) {
		self->ptr.~MeshNode();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshNode_equalPtr(PYMeshNode *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshNode_clonePtr(PYMeshNode *self, PyObject *args) {
		return pyMeshNode_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshNode_clearPtr(PYMeshNode *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshNode_destroyPtr(PYMeshNode *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshNode_acquirePtr(PYMeshNode *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshNode_unacquirePtr(PYMeshNode *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshNode_isValidPtr(PYMeshNode *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshNode_isOwnerPtr(PYMeshNode *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshNode_isConstPtr(PYMeshNode *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshNode_getCountPtr(PYMeshNode *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshNode_getInternalPtr(PYMeshNode *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshNode_clear(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_clone(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *mesh_ = nullptr;
		static const char *kwlist[] = { "mesh", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &mesh_)) {
			if(!isPYMesh(mesh_)) break;
			Mesh &mesh = pyMesh_get(mesh_);
			return pyMeshNode_new(self->ptr.clone(mesh));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::clone(): unknown arguments:\n(Mesh mesh) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setName(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getName(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getIndex(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setMesh(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *mesh_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "mesh", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &mesh_, &check)) {
			if(!isPYMesh(mesh_)) break;
			Mesh &mesh = pyMesh_get(mesh_);
			self->ptr.setMesh(mesh, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setMesh(): unknown arguments:\n(Mesh mesh, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getMesh(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getMesh(): unknown arguments:\n(void) -> const Mesh\n(void) -> Mesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setParent(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "parent", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &check)) {
			if(!isPYMeshNode(parent_)) break;
			MeshNode &parent = pyMeshNode_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent(parent, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setParent(): unknown arguments:\n(MeshNode parent, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getParent(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getParent());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getParent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getParent(): unknown arguments:\n(void) -> const MeshNode\n(void) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_isRoot(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::isRoot(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_reserveChildren(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_children = {};
		static const char *kwlist[] = { "num_children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_children)) {
			self->ptr.reserveChildren(num_children);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::reserveChildren(): unknown arguments:\n(uint32_t num_children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_addChild(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "child", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &child_, &check)) {
			if(!isPYMeshNode(child_)) break;
			MeshNode &child = pyMeshNode_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.addChild(child, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::addChild(): unknown arguments:\n(MeshNode child, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_removeChild(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYMeshNode(child_)) break;
			MeshNode &child = pyMeshNode_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::removeChild(): unknown arguments:\n(MeshNode child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_releaseChildren(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_findChild(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYMeshNode(child_)) break;
			const MeshNode &child = pyMeshNode_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.findChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::findChild(): unknown arguments:\n(const MeshNode child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getNumChildren(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getChildren(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshNode_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshNode_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getChildren(): unknown arguments:\n(void) -> const Array<MeshNode>\n(void) -> Array<MeshNode>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getChild(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshNode_new(self->ptr.getChild(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshNode_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getChild(): unknown arguments:\n(uint32_t index) -> const MeshNode\n(uint32_t index) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_clearGeometries(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearGeometries();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::clearGeometries(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_reserveGeometries(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_geometries = {};
		static const char *kwlist[] = { "num_geometries", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_geometries)) {
			self->ptr.reserveGeometries(num_geometries);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::reserveGeometries(): unknown arguments:\n(uint32_t num_geometries) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_addGeometry(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromUnsignedLong(self->ptr.addGeometry(geometry, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::addGeometry(): unknown arguments:\n(MeshGeometry geometry, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_removeGeometry(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromLong(self->ptr.removeGeometry(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::removeGeometry(): unknown arguments:\n(MeshGeometry geometry) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_replaceGeometry(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_geometry_ = nullptr;
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "old_geometry", "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_geometry_, &geometry_)) {
			if(!isPYMeshGeometry(old_geometry_)) break;
			MeshGeometry &old_geometry = pyMeshGeometry_get(old_geometry_);
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromLong(self->ptr.replaceGeometry(old_geometry, geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::replaceGeometry(): unknown arguments:\n(MeshGeometry old_geometry, MeshGeometry geometry) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_findGeometry(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
			if(!isPYMeshGeometry(geometry_)) break;
			const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromUnsignedLong(self->ptr.findGeometry(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::findGeometry(): unknown arguments:\n(const MeshGeometry geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getNumGeometries(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getNumGeometries(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getGeometries(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getGeometries();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getGeometries();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getGeometries(): unknown arguments:\n(void) -> const Array<MeshGeometry>\n(void) -> Array<MeshGeometry>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getGeometry(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshGeometry_new(self->ptr.getGeometry(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshGeometry_new(self->ptr.getGeometry(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getGeometry(): unknown arguments:\n(uint32_t index) -> const MeshGeometry\n(uint32_t index) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_clearAttachments(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearAttachments();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::clearAttachments(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_reserveAttachments(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_attachments = {};
		static const char *kwlist[] = { "num_attachments", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_attachments)) {
			self->ptr.reserveAttachments(num_attachments);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::reserveAttachments(): unknown arguments:\n(uint32_t num_attachments) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_addAttachment(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *attachment_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "attachment", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &attachment_, &check)) {
			if(!isPYMeshAttachment(attachment_)) break;
			MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			return PyLong_FromUnsignedLong(self->ptr.addAttachment(attachment, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::addAttachment(): unknown arguments:\n(MeshAttachment attachment, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_removeAttachment(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *attachment_ = nullptr;
		static const char *kwlist[] = { "attachment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attachment_)) {
			if(!isPYMeshAttachment(attachment_)) break;
			MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			return PyLong_FromLong(self->ptr.removeAttachment(attachment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::removeAttachment(): unknown arguments:\n(MeshAttachment attachment) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_replaceAttachment(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_attachment_ = nullptr;
		PyObject *attachment_ = nullptr;
		static const char *kwlist[] = { "old_attachment", "attachment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_attachment_, &attachment_)) {
			if(!isPYMeshAttachment(old_attachment_)) break;
			MeshAttachment &old_attachment = pyMeshAttachment_get(old_attachment_);
			if(!isPYMeshAttachment(attachment_)) break;
			MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			return PyLong_FromLong(self->ptr.replaceAttachment(old_attachment, attachment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::replaceAttachment(): unknown arguments:\n(MeshAttachment old_attachment, MeshAttachment attachment) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_findAttachment(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *attachment_ = nullptr;
		static const char *kwlist[] = { "attachment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attachment_)) {
			if(!isPYMeshAttachment(attachment_)) break;
			const MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			return PyLong_FromUnsignedLong(self->ptr.findAttachment(attachment));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findAttachment(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::findAttachment(): unknown arguments:\n(const MeshAttachment attachment) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getNumAttachments(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAttachments());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getNumAttachments(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getAttachments(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAttachments();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAttachment_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAttachments();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAttachment_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getAttachments(): unknown arguments:\n(void) -> const Array<MeshAttachment>\n(void) -> Array<MeshAttachment>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getAttachment(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshAttachment_new(self->ptr.getAttachment(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshAttachment_new(self->ptr.getAttachment(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getAttachment(): unknown arguments:\n(uint32_t index) -> const MeshAttachment\n(uint32_t index) -> MeshAttachment\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setLocalTransform(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYMatrix4x3d(transform_)) break;
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setLocalTransform(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setLocalTransform(): unknown arguments:\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getLocalTransform(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3d_new(self->ptr.getLocalTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getLocalTransform(): unknown arguments:\n(void) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setGlobalTransform(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYMatrix4x3d(transform_)) break;
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setGlobalTransform(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setGlobalTransform(): unknown arguments:\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getGlobalTransform(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3d_new(self->ptr.getGlobalTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getGlobalTransform(): unknown arguments:\n(void) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setPivotTransform(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYMatrix4x3d(transform_)) break;
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setPivotTransform(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setPivotTransform(): unknown arguments:\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getPivotTransform(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3d_new(self->ptr.getPivotTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getPivotTransform(): unknown arguments:\n(void) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setMorphTransform(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYVector4f(transform_)) break;
			const Vector4f &transform = pyVector4f_get(transform_);
			self->ptr.setMorphTransform(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setMorphTransform(): unknown arguments:\n(const Vector4f transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getMorphTransform(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector4f_new(self->ptr.getMorphTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getMorphTransform(): unknown arguments:\n(void) -> const Vector4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_createLocalTransforms(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *itransform_ = nullptr;
		static const char *kwlist[] = { "itransform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &itransform_)) {
			const Matrix4x3d &itransform = pyMatrix4x3d_get(itransform_);
			self->ptr.createLocalTransforms(itransform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::createLocalTransforms(): unknown arguments:\n(const Matrix4x3d itransform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_createGlobalTransforms(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &transform_)) {
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.createGlobalTransforms(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::createGlobalTransforms(): unknown arguments:\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_setTransform(PYMeshNode *self, PyObject *args, PyObject *kwargs) {
		PyObject *scale_ = nullptr;
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
			if(!isPYVector3d(scale_)) break;
			const Vector3d &scale = pyVector3d_get(scale_);
			self->ptr.setTransform(scale);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::setTransform(): unknown arguments:\n(const Vector3d scale) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_getMemory(PYMeshNode *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshNode::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshNode_get_name(PYMeshNode *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshNode_get_index(PYMeshNode *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *MeshNode_get_mesh(PYMeshNode *self, void *offset) {
		return pyMesh_new(self->ptr.getMesh());
	}
	static PyObject *MeshNode_get_parent(PYMeshNode *self, void *offset) {
		return pyMeshNode_new(self->ptr.getParent());
	}
	static PyObject *MeshNode_get_num_children(PYMeshNode *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *MeshNode_get_num_geometries(PYMeshNode *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
	}
	static PyObject *MeshNode_get_num_attachments(PYMeshNode *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumAttachments());
	}
	static PyObject *MeshNode_get_local_transform(PYMeshNode *self, void *offset) {
		return pyMatrix4x3d_new(self->ptr.getLocalTransform());
	}
	static PyObject *MeshNode_get_global_transform(PYMeshNode *self, void *offset) {
		return pyMatrix4x3d_new(self->ptr.getGlobalTransform());
	}
	static PyObject *MeshNode_get_pivot_transform(PYMeshNode *self, void *offset) {
		return pyMatrix4x3d_new(self->ptr.getPivotTransform());
	}
	static PyObject *MeshNode_get_morph_transform(PYMeshNode *self, void *offset) {
		return pyVector4f_new(self->ptr.getMorphTransform());
	}
	static PyObject *MeshNode_get_memory(PYMeshNode *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshNode_str(PYMeshNode *self) {
		return PyUnicode_FromString(String::format("MeshNode Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshNode_bool(PYMeshNode *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshIndices
	TS_PYAPI bool isPYMeshIndices(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshIndices_Type);
	}
	TS_PYAPI MeshIndices &pyMeshIndices_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshIndices_Type) return ((PYMeshIndices*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshIndices_get(): can't get MeshIndices from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshIndices_get(): can't get MeshIndices from None");
		static MeshIndices ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshIndices_new(const MeshIndices &ptr) {
		PYMeshIndices *ret = (PYMeshIndices*)PyObject_New(PYMeshIndices, &PYMeshIndices_Type);
		new(&ret->ptr) MeshIndices(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshIndices_new(MeshIndices &&ptr) {
		PYMeshIndices *ret = (PYMeshIndices*)PyObject_New(PYMeshIndices, &PYMeshIndices_Type);
		new(&ret->ptr) MeshIndices(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshIndices_init(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshIndices(name);
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			const char *name = nullptr;
			static const char *kwlist[] = { "type", "format", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|s", (char**)kwlist, &type, &format, &name)) {
				new(&self->ptr) MeshIndices((MeshIndices::Type)type, (Format)format, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			uint32_t size = {};
			const char *name = nullptr;
			static const char *kwlist[] = { "type", "format", "size", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|s", (char**)kwlist, &type, &format, &size, &name)) {
				new(&self->ptr) MeshIndices((MeshIndices::Type)type, (Format)format, size, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::MeshIndices(): unknown arguments:\n(const char* name)\n(MeshIndices.Type type, Format format, const char* name)\n(MeshIndices.Type type, Format format, uint32_t size, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshIndices_dealloc(PYMeshIndices *self) {
		self->ptr.~MeshIndices();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshIndices_equalPtr(PYMeshIndices *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshIndices_clonePtr(PYMeshIndices *self, PyObject *args) {
		return pyMeshIndices_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshIndices_clearPtr(PYMeshIndices *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshIndices_destroyPtr(PYMeshIndices *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshIndices_acquirePtr(PYMeshIndices *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshIndices_unacquirePtr(PYMeshIndices *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshIndices_isValidPtr(PYMeshIndices *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshIndices_isOwnerPtr(PYMeshIndices *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshIndices_isConstPtr(PYMeshIndices *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshIndices_getCountPtr(PYMeshIndices *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshIndices_getInternalPtr(PYMeshIndices *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshIndices_clear(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_setName(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getName(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_create(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "format", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &type, &format, &size)) {
			self->ptr.create((MeshIndices::Type)type, (Format)format, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::create(): unknown arguments:\n(MeshIndices.Type type, Format format, uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getType(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getType(): unknown arguments:\n(void) -> MeshIndices::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getTypeName(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(MeshIndices::getTypeName((MeshIndices::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getTypeName(): unknown arguments:\n(MeshIndices.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isUnknown(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnknown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isUnknown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isPoint(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPoint());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isPoint(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isLine(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isLine());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isLine(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isTriangle(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTriangle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isTriangle(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isQuadrilateral(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isQuadrilateral());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isQuadrilateral(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isTetrahedron(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTetrahedron());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isTetrahedron(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isPrimitive(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPrimitive());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isPrimitive(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isSolid(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSolid());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isSolid(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isVolume(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVolume());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isVolume(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isMaterial(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMaterial());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isMaterial(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isGroup(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGroup());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isGroup(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isJoint(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isJoint());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isJoint(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isEdge(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEdge());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isEdge(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getPrimitiveSize(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPrimitiveSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getPrimitiveSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getFormat(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getFormatName(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_setGeometry(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			self->ptr.setGeometry(geometry, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::setGeometry(): unknown arguments:\n(MeshGeometry geometry, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getGeometry(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getGeometry(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_setSize(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		int32_t discard = true;
		int32_t clear = false;
		static const char *kwlist[] = { "size", "discard", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|ii", (char**)kwlist, &size, &discard, &clear)) {
			self->ptr.setSize(size, (discard != 0), (clear != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::setSize(): unknown arguments:\n(uint32_t size, bool discard, bool clear) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getSize(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getStride(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStride());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getStride(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getBytes(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getBytes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getBytes(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_set(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t value_0 = {};
		uint32_t value_1 = {};
		uint32_t value_2 = {};
		uint32_t value_3 = {};
		static const char *kwlist[] = { "index", "value_0", "value_1", "value_2", "value_3", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIIII", (char**)kwlist, &index, &value_0, &value_1, &value_2, &value_3)) {
			self->ptr.set(index, value_0, value_1, value_2, value_3);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value_0 = {};
			uint32_t value_1 = {};
			uint32_t value_2 = {};
			static const char *kwlist[] = { "index", "value_0", "value_1", "value_2", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &index, &value_0, &value_1, &value_2)) {
				self->ptr.set(index, value_0, value_1, value_2);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value_0 = {};
			uint32_t value_1 = {};
			static const char *kwlist[] = { "index", "value_0", "value_1", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &value_0, &value_1)) {
				self->ptr.set(index, value_0, value_1);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value = {};
			static const char *kwlist[] = { "index", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &value)) {
				self->ptr.set(index, value);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::set(): unknown arguments:\n(uint32_t index, uint32_t value_0, uint32_t value_1, uint32_t value_2, uint32_t value_3) -> void\n(uint32_t index, uint32_t value_0, uint32_t value_1, uint32_t value_2) -> void\n(uint32_t index, uint32_t value_0, uint32_t value_1) -> void\n(uint32_t index, uint32_t value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_get(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t value_0 = {};
		uint32_t value_1 = {};
		uint32_t value_2 = {};
		uint32_t value_3 = {};
		static const char *kwlist[] = { "index", "value_0", "value_1", "value_2", "value_3", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIIII", (char**)kwlist, &index, &value_0, &value_1, &value_2, &value_3)) {
			self->ptr.get(index, value_0, value_1, value_2, value_3);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value_0 = {};
			uint32_t value_1 = {};
			uint32_t value_2 = {};
			static const char *kwlist[] = { "index", "value_0", "value_1", "value_2", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &index, &value_0, &value_1, &value_2)) {
				self->ptr.get(index, value_0, value_1, value_2);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value_0 = {};
			uint32_t value_1 = {};
			static const char *kwlist[] = { "index", "value_0", "value_1", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &value_0, &value_1)) {
				self->ptr.get(index, value_0, value_1);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return PyLong_FromUnsignedLong(self->ptr.get(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::get(): unknown arguments:\n(uint32_t index, uint32_t value_0, uint32_t value_1, uint32_t value_2, uint32_t value_3) -> void\n(uint32_t index, uint32_t value_0, uint32_t value_1, uint32_t value_2) -> void\n(uint32_t index, uint32_t value_0, uint32_t value_1) -> void\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getPtr(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr((void*)self->ptr.getPtr(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return PyLong_FromVoidPtr(self->ptr.getPtr(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getPtr(): unknown arguments:\n(uint32_t index) -> const void*\n(uint32_t index) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isDirect(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isDirect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isDirect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_isUniform(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUniform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::isUniform(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getMinIndex(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMinIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getMinIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getMaxIndex(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getMaxIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_compare(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			const MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromLong(self->ptr.compare(indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::compare(): unknown arguments:\n(const MeshIndices indices) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_addIndices(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		uint32_t offset = {};
		int32_t expand = false;
		static const char *kwlist[] = { "indices", "offset", "expand", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|i", (char**)kwlist, &indices_, &offset, &expand)) {
			if(!isPYMeshIndices(indices_)) break;
			const MeshIndices &indices = pyMeshIndices_get(indices_);
			self->ptr.addIndices(indices, offset, (expand != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::addIndices(): unknown arguments:\n(const MeshIndices indices, uint32_t offset, bool expand) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_toFormat(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return pyMeshIndices_new(self->ptr.toFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::toFormat(): unknown arguments:\n(Format format) -> MeshIndices\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_toType(PYMeshIndices *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		PyObject *position_attribute_ = nullptr;
		static const char *kwlist[] = { "type", "position_attribute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &type, &position_attribute_)) {
			if(!isPYMeshAttribute(position_attribute_)) break;
			const MeshAttribute &position_attribute = pyMeshAttribute_get(position_attribute_);
			return pyMeshIndices_new(self->ptr.toType((MeshIndices::Type)type, position_attribute));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
				return pyMeshIndices_new(self->ptr.toType((MeshIndices::Type)type));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::toType(): unknown arguments:\n(MeshIndices.Type type, const MeshAttribute position_attribute) -> MeshIndices\n(MeshIndices.Type type) -> MeshIndices\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_getMemory(PYMeshIndices *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshIndices::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshIndices_get_name(PYMeshIndices *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshIndices_get_type(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *MeshIndices_get_primitive_size(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPrimitiveSize());
	}
	static PyObject *MeshIndices_get_format(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *MeshIndices_get_format_name(PYMeshIndices *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *MeshIndices_get_geometry(PYMeshIndices *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getGeometry());
	}
	static PyObject *MeshIndices_get_size(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSize());
	}
	static PyObject *MeshIndices_get_stride(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStride());
	}
	static PyObject *MeshIndices_get_bytes(PYMeshIndices *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getBytes());
	}
	static PyObject *MeshIndices_get_min_index(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMinIndex());
	}
	static PyObject *MeshIndices_get_max_index(PYMeshIndices *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxIndex());
	}
	static PyObject *MeshIndices_get_memory(PYMeshIndices *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshIndices_str(PYMeshIndices *self) {
		return PyUnicode_FromString(String::format("MeshIndices Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshIndices_bool(PYMeshIndices *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshAttribute
	TS_PYAPI bool isPYMeshAttribute(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshAttribute_Type);
	}
	TS_PYAPI MeshAttribute &pyMeshAttribute_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshAttribute_Type) return ((PYMeshAttribute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshAttribute_get(): can't get MeshAttribute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshAttribute_get(): can't get MeshAttribute from None");
		static MeshAttribute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshAttribute_new(const MeshAttribute &ptr) {
		PYMeshAttribute *ret = (PYMeshAttribute*)PyObject_New(PYMeshAttribute, &PYMeshAttribute_Type);
		new(&ret->ptr) MeshAttribute(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshAttribute_new(MeshAttribute &&ptr) {
		PYMeshAttribute *ret = (PYMeshAttribute*)PyObject_New(PYMeshAttribute, &PYMeshAttribute_Type);
		new(&ret->ptr) MeshAttribute(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshAttribute_init(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t index = 0;
		static const char *kwlist[] = { "name", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|sI", (char**)kwlist, &name, &index)) {
			new(&self->ptr) MeshAttribute(name, index);
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			const char *name = nullptr;
			uint32_t index = 0;
			static const char *kwlist[] = { "type", "format", "name", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|sI", (char**)kwlist, &type, &format, &name, &index)) {
				new(&self->ptr) MeshAttribute((MeshAttribute::Type)type, (Format)format, name, index);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			uint32_t size = {};
			const char *name = nullptr;
			uint32_t index = 0;
			static const char *kwlist[] = { "type", "format", "size", "name", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|sI", (char**)kwlist, &type, &format, &size, &name, &index)) {
				new(&self->ptr) MeshAttribute((MeshAttribute::Type)type, (Format)format, size, name, index);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t index = {};
			static const char *kwlist[] = { "type", "format", "size", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &type, &format, &size, &index)) {
				new(&self->ptr) MeshAttribute((MeshAttribute::Type)type, (Format)format, size, index);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::MeshAttribute(): unknown arguments:\n(const char* name, uint32_t index)\n(MeshAttribute.Type type, Format format, const char* name, uint32_t index)\n(MeshAttribute.Type type, Format format, uint32_t size, const char* name, uint32_t index)\n(MeshAttribute.Type type, Format format, uint32_t size, uint32_t index)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshAttribute_dealloc(PYMeshAttribute *self) {
		self->ptr.~MeshAttribute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshAttribute_equalPtr(PYMeshAttribute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshAttribute_clonePtr(PYMeshAttribute *self, PyObject *args) {
		return pyMeshAttribute_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshAttribute_clearPtr(PYMeshAttribute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttribute_destroyPtr(PYMeshAttribute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttribute_acquirePtr(PYMeshAttribute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttribute_unacquirePtr(PYMeshAttribute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttribute_isValidPtr(PYMeshAttribute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshAttribute_isOwnerPtr(PYMeshAttribute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshAttribute_isConstPtr(PYMeshAttribute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshAttribute_getCountPtr(PYMeshAttribute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshAttribute_getInternalPtr(PYMeshAttribute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshAttribute_clear(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setName(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getName(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_create(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "format", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &type, &format, &size)) {
			self->ptr.create((MeshAttribute::Type)type, (Format)format, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::create(): unknown arguments:\n(MeshAttribute.Type type, Format format, uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getType(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getType(): unknown arguments:\n(void) -> MeshAttribute::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getTypeName(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(MeshAttribute::getTypeName((MeshAttribute::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getTypeName(): unknown arguments:\n(MeshAttribute.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isUnknown(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnknown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isUnknown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isPosition(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPosition());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isPosition(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isBasis(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBasis());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isBasis(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isNormal(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNormal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isNormal(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isTangent(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTangent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isTangent(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isBinormal(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBinormal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isBinormal(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isSpatial(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSpatial());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isSpatial(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isNormalized(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNormalized());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isNormalized(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isTexCoord(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTexCoord());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isTexCoord(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isWeights(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isWeights());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isWeights(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isJoints(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isJoints());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isJoints(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isColor(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isColor(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isVertex(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVertex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isVertex(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isCrease(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCrease());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isCrease(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getFormat(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getFormatName(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getComponents(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getComponents());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getComponents(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_isPacked(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPacked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::isPacked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setIndex(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			self->ptr.setIndex(index);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setIndex(): unknown arguments:\n(uint32_t index) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getIndex(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setIndices(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			self->ptr.setIndices(indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setIndices(): unknown arguments:\n(MeshIndices indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getIndices(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getIndices(): unknown arguments:\n(void) -> const MeshIndices\n(void) -> MeshIndices\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setGeometry(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			self->ptr.setGeometry(geometry, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setGeometry(): unknown arguments:\n(MeshGeometry geometry, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getGeometry(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getGeometry(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setSize(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		int32_t discard = true;
		int32_t clear = false;
		static const char *kwlist[] = { "size", "discard", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|ii", (char**)kwlist, &size, &discard, &clear)) {
			self->ptr.setSize(size, (discard != 0), (clear != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setSize(): unknown arguments:\n(uint32_t size, bool discard, bool clear) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getSize(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getStride(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStride());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getStride(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getBytes(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getBytes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getBytes(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setValue(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setValue(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setValue(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getValue(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		void *dest = nullptr;
		size_t size = {};
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "index", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &dest_buffer)) {
			if(dest_buffer.readonly) break;
			self->ptr.getValue(index, dest = dest_buffer.buf, size = dest_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getValue(): unknown arguments:\n(uint32_t index, void* dest, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getPtr(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr((void*)self->ptr.getPtr(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return PyLong_FromVoidPtr(self->ptr.getPtr(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getPtr(): unknown arguments:\n(uint32_t index) -> const void*\n(uint32_t index) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_compare(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_ = nullptr;
		PyObject *transform_ = nullptr;
		float32_t threshold = 1e-6f;
		int32_t spatial = true;
		static const char *kwlist[] = { "attribute", "transform", "threshold", "spatial", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|Ofi", (char**)kwlist, &attribute_, &transform_, &threshold, &spatial)) {
			if(!isPYMeshAttribute(attribute_)) break;
			const MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			const Matrix4x3f &transform = pyMatrix4x3f_get(transform_);
			return PyLong_FromLong(self->ptr.compare(attribute, transform, threshold, (spatial != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::compare(): unknown arguments:\n(const MeshAttribute attribute, const Matrix4x3f transform, float32_t threshold, bool spatial) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_addAttribute(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_ = nullptr;
		static const char *kwlist[] = { "attribute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attribute_)) {
			if(!isPYMeshAttribute(attribute_)) break;
			const MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			self->ptr.addAttribute(attribute);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::addAttribute(): unknown arguments:\n(const MeshAttribute attribute) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_setTransform(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYMatrix4x3f(transform_)) break;
			const Matrix4x3f &transform = pyMatrix4x3f_get(transform_);
			return PyLong_FromLong(self->ptr.setTransform(transform));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::setTransform(): unknown arguments:\n(const Matrix4x3f transform) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_morphAttribute(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_ = nullptr;
		float32_t k = {};
		static const char *kwlist[] = { "attribute", "k", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of", (char**)kwlist, &attribute_, &k)) {
			if(!isPYMeshAttribute(attribute_)) break;
			const MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			return PyLong_FromLong(self->ptr.morphAttribute(attribute, k));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::morphAttribute(): unknown arguments:\n(const MeshAttribute attribute, float32_t k) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_packAttributes(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_0_ = nullptr;
		PyObject *attribute_1_ = nullptr;
		uint32_t format = 0;
		static const char *kwlist[] = { "attribute_0", "attribute_1", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOI", (char**)kwlist, &attribute_0_, &attribute_1_, &format)) {
			if(!isPYMeshAttribute(attribute_0_)) break;
			const MeshAttribute &attribute_0 = pyMeshAttribute_get(attribute_0_);
			if(!isPYMeshAttribute(attribute_1_)) break;
			const MeshAttribute &attribute_1 = pyMeshAttribute_get(attribute_1_);
			return PyLong_FromLong(self->ptr.packAttributes(attribute_0, attribute_1, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::packAttributes(): unknown arguments:\n(const MeshAttribute attribute_0, const MeshAttribute attribute_1, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_unpackAttributes(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_0_ = nullptr;
		PyObject *attribute_1_ = nullptr;
		static const char *kwlist[] = { "attribute_0", "attribute_1", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &attribute_0_, &attribute_1_)) {
			if(!isPYMeshAttribute(attribute_0_)) break;
			MeshAttribute &attribute_0 = pyMeshAttribute_get(attribute_0_);
			if(!isPYMeshAttribute(attribute_1_)) break;
			MeshAttribute &attribute_1 = pyMeshAttribute_get(attribute_1_);
			return PyLong_FromLong(self->ptr.unpackAttributes(attribute_0, attribute_1));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::unpackAttributes(): unknown arguments:\n(MeshAttribute attribute_0, MeshAttribute attribute_1) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_optimizeAttribute(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return pyMeshAttribute_new(self->ptr.optimizeAttribute(indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::optimizeAttribute(): unknown arguments:\n(MeshIndices indices) -> MeshAttribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_toDirect(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			const MeshIndices &indices = pyMeshIndices_get(indices_);
			return pyMeshAttribute_new(self->ptr.toDirect(indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::toDirect(): unknown arguments:\n(const MeshIndices indices) -> MeshAttribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_toFormat(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return pyMeshAttribute_new(self->ptr.toFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::toFormat(): unknown arguments:\n(Format format) -> MeshAttribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_toType(PYMeshAttribute *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return pyMeshAttribute_new(self->ptr.toType((MeshAttribute::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::toType(): unknown arguments:\n(MeshAttribute.Type type) -> MeshAttribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getCovarianceMatrix(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getCovarianceMatrix());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getCovarianceMatrix(): unknown arguments:\n(void) -> Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getMinTransform(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getMinTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getMinTransform(): unknown arguments:\n(void) -> Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getBoundBox(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundBoxf_new(self->ptr.getBoundBox());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getBoundBox(): unknown arguments:\n(void) -> BoundBoxf\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getBoundSphere(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundSpheref_new(self->ptr.getBoundSphere());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getBoundSphere(): unknown arguments:\n(void) -> BoundSpheref\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_getMemory(PYMeshAttribute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttribute::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttribute_get_name(PYMeshAttribute *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshAttribute_get_type(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *MeshAttribute_get_format(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *MeshAttribute_get_format_name(PYMeshAttribute *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *MeshAttribute_get_components(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getComponents());
	}
	static PyObject *MeshAttribute_get_index(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *MeshAttribute_get_indices(PYMeshAttribute *self, void *offset) {
		return pyMeshIndices_new(self->ptr.getIndices());
	}
	static PyObject *MeshAttribute_get_geometry(PYMeshAttribute *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getGeometry());
	}
	static PyObject *MeshAttribute_get_size(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSize());
	}
	static PyObject *MeshAttribute_get_stride(PYMeshAttribute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStride());
	}
	static PyObject *MeshAttribute_get_bytes(PYMeshAttribute *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getBytes());
	}
	static PyObject *MeshAttribute_get_covariance_matrix(PYMeshAttribute *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getCovarianceMatrix());
	}
	static PyObject *MeshAttribute_get_min_transform(PYMeshAttribute *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getMinTransform());
	}
	static PyObject *MeshAttribute_get_bound_box(PYMeshAttribute *self, void *offset) {
		return pyBoundBoxf_new(self->ptr.getBoundBox());
	}
	static PyObject *MeshAttribute_get_bound_sphere(PYMeshAttribute *self, void *offset) {
		return pyBoundSpheref_new(self->ptr.getBoundSphere());
	}
	static PyObject *MeshAttribute_get_memory(PYMeshAttribute *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshAttribute_str(PYMeshAttribute *self) {
		return PyUnicode_FromString(String::format("MeshAttribute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshAttribute_bool(PYMeshAttribute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshJoint
	TS_PYAPI bool isPYMeshJoint(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshJoint_Type);
	}
	TS_PYAPI MeshJoint &pyMeshJoint_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshJoint_Type) return ((PYMeshJoint*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshJoint_get(): can't get MeshJoint from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshJoint_get(): can't get MeshJoint from None");
		static MeshJoint ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshJoint_new(const MeshJoint &ptr) {
		PYMeshJoint *ret = (PYMeshJoint*)PyObject_New(PYMeshJoint, &PYMeshJoint_Type);
		new(&ret->ptr) MeshJoint(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshJoint_new(MeshJoint &&ptr) {
		PYMeshJoint *ret = (PYMeshJoint*)PyObject_New(PYMeshJoint, &PYMeshJoint_Type);
		new(&ret->ptr) MeshJoint(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshJoint_init(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshJoint(name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *geometry_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "geometry", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &geometry_, &name)) {
				if(!isPYMeshGeometry(geometry_)) break;
				MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				new(&self->ptr) MeshJoint(geometry, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::MeshJoint(): unknown arguments:\n(const char* name)\n(MeshGeometry geometry, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshJoint_dealloc(PYMeshJoint *self) {
		self->ptr.~MeshJoint();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshJoint_equalPtr(PYMeshJoint *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshJoint_clonePtr(PYMeshJoint *self, PyObject *args) {
		return pyMeshJoint_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshJoint_clearPtr(PYMeshJoint *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshJoint_destroyPtr(PYMeshJoint *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshJoint_acquirePtr(PYMeshJoint *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshJoint_unacquirePtr(PYMeshJoint *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshJoint_isValidPtr(PYMeshJoint *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshJoint_isOwnerPtr(PYMeshJoint *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshJoint_isConstPtr(PYMeshJoint *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshJoint_getCountPtr(PYMeshJoint *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshJoint_getInternalPtr(PYMeshJoint *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshJoint_clear(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setName(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getName(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setNode(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			self->ptr.setNode(node);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setNode(): unknown arguments:\n(MeshNode node) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getNode(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getNode());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getNode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getNode(): unknown arguments:\n(void) -> const MeshNode\n(void) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getNodeIndex(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNodeIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getNodeIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getLocalTransform(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3d_new(self->ptr.getLocalTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getLocalTransform(): unknown arguments:\n(void) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getGlobalTransform(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3d_new(self->ptr.getGlobalTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getGlobalTransform(): unknown arguments:\n(void) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setIndices(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			self->ptr.setIndices(indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setIndices(): unknown arguments:\n(MeshIndices indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getIndices(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getIndices(): unknown arguments:\n(void) -> const MeshIndices\n(void) -> MeshIndices\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setGeometry(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			self->ptr.setGeometry(geometry, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setGeometry(): unknown arguments:\n(MeshGeometry geometry, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getGeometry(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getGeometry(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setBoundBox(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *box_ = nullptr;
		static const char *kwlist[] = { "box", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &box_)) {
			if(!isPYBoundBoxf(box_)) break;
			const BoundBoxf &box = pyBoundBoxf_get(box_);
			self->ptr.setBoundBox(box);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setBoundBox(): unknown arguments:\n(const BoundBoxf box) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getBoundBox(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundBoxf_new(self->ptr.getBoundBox());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getBoundBox(): unknown arguments:\n(void) -> const BoundBoxf\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setBoundSphere(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *sphere_ = nullptr;
		static const char *kwlist[] = { "sphere", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sphere_)) {
			if(!isPYBoundSpheref(sphere_)) break;
			const BoundSpheref &sphere = pyBoundSpheref_get(sphere_);
			self->ptr.setBoundSphere(sphere);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setBoundSphere(): unknown arguments:\n(const BoundSpheref sphere) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getBoundSphere(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundSpheref_new(self->ptr.getBoundSphere());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getBoundSphere(): unknown arguments:\n(void) -> const BoundSpheref\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_setITransform(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *itransform_ = nullptr;
		static const char *kwlist[] = { "itransform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &itransform_)) {
			if(!isPYMatrix4x3f(itransform_)) break;
			const Matrix4x3f &itransform = pyMatrix4x3f_get(itransform_);
			self->ptr.setITransform(itransform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::setITransform(): unknown arguments:\n(const Matrix4x3f itransform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getITransform(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getITransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getITransform(): unknown arguments:\n(void) -> const Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_compare(PYMeshJoint *self, PyObject *args, PyObject *kwargs) {
		PyObject *joint_ = nullptr;
		static const char *kwlist[] = { "joint", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &joint_)) {
			if(!isPYMeshJoint(joint_)) break;
			const MeshJoint &joint = pyMeshJoint_get(joint_);
			return PyLong_FromLong(self->ptr.compare(joint));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::compare(): unknown arguments:\n(const MeshJoint joint) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_getMemory(PYMeshJoint *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshJoint::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshJoint_get_name(PYMeshJoint *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshJoint_get_node(PYMeshJoint *self, void *offset) {
		return pyMeshNode_new(self->ptr.getNode());
	}
	static PyObject *MeshJoint_get_node_index(PYMeshJoint *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNodeIndex());
	}
	static PyObject *MeshJoint_get_local_transform(PYMeshJoint *self, void *offset) {
		return pyMatrix4x3d_new(self->ptr.getLocalTransform());
	}
	static PyObject *MeshJoint_get_global_transform(PYMeshJoint *self, void *offset) {
		return pyMatrix4x3d_new(self->ptr.getGlobalTransform());
	}
	static PyObject *MeshJoint_get_indices(PYMeshJoint *self, void *offset) {
		return pyMeshIndices_new(self->ptr.getIndices());
	}
	static PyObject *MeshJoint_get_geometry(PYMeshJoint *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getGeometry());
	}
	static PyObject *MeshJoint_get_bound_box(PYMeshJoint *self, void *offset) {
		return pyBoundBoxf_new(self->ptr.getBoundBox());
	}
	static PyObject *MeshJoint_get_bound_sphere(PYMeshJoint *self, void *offset) {
		return pyBoundSpheref_new(self->ptr.getBoundSphere());
	}
	static PyObject *MeshJoint_get_itransform(PYMeshJoint *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getITransform());
	}
	static PyObject *MeshJoint_get_memory(PYMeshJoint *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshJoint_str(PYMeshJoint *self) {
		return PyUnicode_FromString(String::format("MeshJoint Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshJoint_bool(PYMeshJoint *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshMaterial
	TS_PYAPI bool isPYMeshMaterial(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshMaterial_Type);
	}
	TS_PYAPI MeshMaterial &pyMeshMaterial_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshMaterial_Type) return ((PYMeshMaterial*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshMaterial_get(): can't get MeshMaterial from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshMaterial_get(): can't get MeshMaterial from None");
		static MeshMaterial ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshMaterial_new(const MeshMaterial &ptr) {
		PYMeshMaterial *ret = (PYMeshMaterial*)PyObject_New(PYMeshMaterial, &PYMeshMaterial_Type);
		new(&ret->ptr) MeshMaterial(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshMaterial_new(MeshMaterial &&ptr) {
		PYMeshMaterial *ret = (PYMeshMaterial*)PyObject_New(PYMeshMaterial, &PYMeshMaterial_Type);
		new(&ret->ptr) MeshMaterial(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshMaterial_init(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshMaterial(name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *geometry_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "geometry", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &geometry_, &name)) {
				if(!isPYMeshGeometry(geometry_)) break;
				MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				new(&self->ptr) MeshMaterial(geometry, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::MeshMaterial(): unknown arguments:\n(const char* name)\n(MeshGeometry geometry, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshMaterial_dealloc(PYMeshMaterial *self) {
		self->ptr.~MeshMaterial();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshMaterial_equalPtr(PYMeshMaterial *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshMaterial_clonePtr(PYMeshMaterial *self, PyObject *args) {
		return pyMeshMaterial_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshMaterial_clearPtr(PYMeshMaterial *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshMaterial_destroyPtr(PYMeshMaterial *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshMaterial_acquirePtr(PYMeshMaterial *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshMaterial_unacquirePtr(PYMeshMaterial *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshMaterial_isValidPtr(PYMeshMaterial *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshMaterial_isOwnerPtr(PYMeshMaterial *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshMaterial_isConstPtr(PYMeshMaterial *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshMaterial_getCountPtr(PYMeshMaterial *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshMaterial_getInternalPtr(PYMeshMaterial *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshMaterial_clear(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_setName(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getName(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getIndex(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_setIndices(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			self->ptr.setIndices(indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::setIndices(): unknown arguments:\n(MeshIndices indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getIndices(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshIndices_new(self->ptr.getIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getIndices(): unknown arguments:\n(void) -> const MeshIndices\n(void) -> MeshIndices\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_setGeometry(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			self->ptr.setGeometry(geometry, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::setGeometry(): unknown arguments:\n(MeshGeometry geometry, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getGeometry(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getGeometry());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getGeometry(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_setData(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *data = nullptr;
		static const char *kwlist[] = { "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &data)) {
			self->ptr.setData(data);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *data_ = nullptr;
			static const char *kwlist[] = { "data", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &data_)) {
				if(!isPYString(data_)) break;
				const String &data = (data_) ? ((PyUnicode_Check(data_)) ? String(PyUnicode_AsUTF8(data_)) : (String)pyString_get(data_)) : String::null;
				self->ptr.setData(data);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::setData(): unknown arguments:\n(const char* data) -> void\n(const String data) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getData(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getData().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getData(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_clearParameters(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearParameters();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::clearParameters(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_removeParameter(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.removeParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::removeParameter(): unknown arguments:\n(const char* type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_copyParameters(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		PyObject *material_ = nullptr;
		static const char *kwlist[] = { "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &material_)) {
			if(!isPYMeshMaterial(material_)) break;
			const MeshMaterial &material = pyMeshMaterial_get(material_);
			self->ptr.copyParameters(material);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::copyParameters(): unknown arguments:\n(const MeshMaterial material) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_findParameter(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromUnsignedLong(self->ptr.findParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::findParameter(): unknown arguments:\n(const char* type) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_hasParameter(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::hasParameter(): unknown arguments:\n(const char* type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getNumParameters(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumParameters());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getNumParameters(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterType(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getParameterType(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterType(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_addParameter(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		const char *name = nullptr;
		const char *layout = nullptr;
		static const char *kwlist[] = { "type", "name", "layout", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss|s", (char**)kwlist, &type, &name, &layout)) {
			self->ptr.addParameter(type, name, layout);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *name_ = nullptr;
			const char *layout = nullptr;
			static const char *kwlist[] = { "type", "name", "layout", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO|s", (char**)kwlist, &type, &name_, &layout)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.addParameter(type, name, layout);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *image_ = nullptr;
			const char *layout = nullptr;
			static const char *kwlist[] = { "type", "image", "layout", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO|s", (char**)kwlist, &type, &image_, &layout)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				self->ptr.addParameter(type, image, layout);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *blob_ = nullptr;
			const char *layout = nullptr;
			static const char *kwlist[] = { "type", "blob", "layout", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO|s", (char**)kwlist, &type, &blob_, &layout)) {
				if(!isPYBlob(blob_)) break;
				Blob &blob = pyBlob_get(blob_);
				self->ptr.addParameter(type, blob, layout);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			int32_t value = {};
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &type, &value)) {
				self->ptr.addParameter(type, (value != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			float32_t value = {};
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sf", (char**)kwlist, &type, &value)) {
				self->ptr.addParameter(type, value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &value_)) {
				if(!isPYVector4f(value_)) break;
				const Vector4f &value = pyVector4f_get(value_);
				self->ptr.addParameter(type, value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &value_)) {
				if(!isPYMatrix3x2f(value_)) break;
				const Matrix3x2f &value = pyMatrix3x2f_get(value_);
				self->ptr.addParameter(type, value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "type", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.addParameter(type, color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::addParameter(): unknown arguments:\n(const char* type, const char* name, const char* layout) -> void\n(const char* type, const String name, const char* layout) -> void\n(const char* type, const Image image, const char* layout) -> void\n(const char* type, Blob blob, const char* layout) -> void\n(const char* type, bool value) -> void\n(const char* type, float32_t value) -> void\n(const char* type, const Vector4f value) -> void\n(const char* type, const Matrix3x2f value) -> void\n(const char* type, const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterFlags(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getParameterFlags(index));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
				return PyLong_FromUnsignedLong(self->ptr.getParameterFlags(type));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterFlags(): unknown arguments:\n(uint32_t index) -> MeshMaterial::Flags\n(const char* type) -> MeshMaterial::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_hasParameterFlag(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return PyLong_FromLong(self->ptr.hasParameterFlag(index, (MeshMaterial::Flags)flags));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "type", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &type, &flags)) {
				return PyLong_FromLong(self->ptr.hasParameterFlag(type, (MeshMaterial::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::hasParameterFlag(): unknown arguments:\n(uint32_t index, MeshMaterial.Flags flags) -> bool\n(const char* type, MeshMaterial.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_hasParameterFlags(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return PyLong_FromLong(self->ptr.hasParameterFlags(index, (MeshMaterial::Flags)flags));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "type", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &type, &flags)) {
				return PyLong_FromLong(self->ptr.hasParameterFlags(type, (MeshMaterial::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::hasParameterFlags(): unknown arguments:\n(uint32_t index, MeshMaterial.Flags flags) -> bool\n(const char* type, MeshMaterial.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterBool(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t value = false;
		static const char *kwlist[] = { "index", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &index, &value)) {
			return PyLong_FromLong(self->ptr.getParameterBool(index, (value != 0)));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			int32_t value = false;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &type, &value)) {
				return PyLong_FromLong(self->ptr.getParameterBool(type, (value != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterBool(): unknown arguments:\n(uint32_t index, bool value) -> bool\n(const char* type, bool value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterScalarf32(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t value = 0.0f;
		static const char *kwlist[] = { "index", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|f", (char**)kwlist, &index, &value)) {
			return PyFloat_FromDouble(self->ptr.getParameterScalarf32(index, value));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			float32_t value = 0.0f;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|f", (char**)kwlist, &type, &value)) {
				return PyFloat_FromDouble(self->ptr.getParameterScalarf32(type, value));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterScalarf32(): unknown arguments:\n(uint32_t index, float32_t value) -> float32_t\n(const char* type, float32_t value) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterVector4f(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *vector_ = nullptr;
		static const char *kwlist[] = { "index", "vector", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &vector_)) {
			const Vector4f &vector = pyVector4f_get(vector_);
			return pyVector4f_new(self->ptr.getParameterVector4f(index, vector));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *vector_ = nullptr;
			static const char *kwlist[] = { "type", "vector", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &vector_)) {
				const Vector4f &vector = pyVector4f_get(vector_);
				return pyVector4f_new(self->ptr.getParameterVector4f(type, vector));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterVector4f(): unknown arguments:\n(uint32_t index, const Vector4f vector) -> const Vector4f\n(const char* type, const Vector4f vector) -> const Vector4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterMatrix3x2f(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *matrix_ = nullptr;
		static const char *kwlist[] = { "index", "matrix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &matrix_)) {
			const Matrix3x2f &matrix = pyMatrix3x2f_get(matrix_);
			return pyMatrix3x2f_new(self->ptr.getParameterMatrix3x2f(index, matrix));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *matrix_ = nullptr;
			static const char *kwlist[] = { "type", "matrix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &matrix_)) {
				const Matrix3x2f &matrix = pyMatrix3x2f_get(matrix_);
				return pyMatrix3x2f_new(self->ptr.getParameterMatrix3x2f(type, matrix));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterMatrix3x2f(): unknown arguments:\n(uint32_t index, const Matrix3x2f matrix) -> const Matrix3x2f\n(const char* type, const Matrix3x2f matrix) -> const Matrix3x2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterColor(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "index", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &color_)) {
			const Color &color = pyColor_get(color_);
			return pyColor_new(self->ptr.getParameterColor(index, color));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "type", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &color_)) {
				const Color &color = pyColor_get(color_);
				return pyColor_new(self->ptr.getParameterColor(type, color));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterColor(): unknown arguments:\n(uint32_t index, const Color color) -> const Color\n(const char* type, const Color color) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterName(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *name_ = nullptr;
		static const char *kwlist[] = { "index", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &name_)) {
			const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
			return PyUnicode_FromString(self->ptr.getParameterName(index, name).get());
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "type", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &name_)) {
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyUnicode_FromString(self->ptr.getParameterName(type, name).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterName(): unknown arguments:\n(uint32_t index, const String name) -> String\n(const char* type, const String name) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterLayout(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *layout_ = nullptr;
		static const char *kwlist[] = { "index", "layout", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &layout_)) {
			const String &layout = (layout_) ? ((PyUnicode_Check(layout_)) ? String(PyUnicode_AsUTF8(layout_)) : (String)pyString_get(layout_)) : String::null;
			return PyUnicode_FromString(self->ptr.getParameterLayout(index, layout).get());
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *layout_ = nullptr;
			static const char *kwlist[] = { "type", "layout", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &layout_)) {
				const String &layout = (layout_) ? ((PyUnicode_Check(layout_)) ? String(PyUnicode_AsUTF8(layout_)) : (String)pyString_get(layout_)) : String::null;
				return PyUnicode_FromString(self->ptr.getParameterLayout(type, layout).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterLayout(): unknown arguments:\n(uint32_t index, const String layout) -> String\n(const char* type, const String layout) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterImage(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyImage_new(self->ptr.getParameterImage(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyImage_new(self->ptr.getParameterImage(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterImage(): unknown arguments:\n(uint32_t index) -> const Image\n(uint32_t index) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getParameterBlob(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBlob_new(self->ptr.getParameterBlob(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyBlob_new(self->ptr.getParameterBlob(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getParameterBlob(): unknown arguments:\n(uint32_t index) -> Blob\n(uint32_t index) -> Blob\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_compare(PYMeshMaterial *self, PyObject *args, PyObject *kwargs) {
		PyObject *material_ = nullptr;
		static const char *kwlist[] = { "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &material_)) {
			if(!isPYMeshMaterial(material_)) break;
			const MeshMaterial &material = pyMeshMaterial_get(material_);
			return PyLong_FromLong(self->ptr.compare(material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::compare(): unknown arguments:\n(const MeshMaterial material) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_getMemory(PYMeshMaterial *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshMaterial::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshMaterial_get_name(PYMeshMaterial *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshMaterial_get_index(PYMeshMaterial *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *MeshMaterial_get_indices(PYMeshMaterial *self, void *offset) {
		return pyMeshIndices_new(self->ptr.getIndices());
	}
	static PyObject *MeshMaterial_get_geometry(PYMeshMaterial *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getGeometry());
	}
	static PyObject *MeshMaterial_get_data(PYMeshMaterial *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getData().get());
	}
	static PyObject *MeshMaterial_get_num_parameters(PYMeshMaterial *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumParameters());
	}
	static PyObject *MeshMaterial_get_memory(PYMeshMaterial *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshMaterial_str(PYMeshMaterial *self) {
		return PyUnicode_FromString(String::format("MeshMaterial Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshMaterial_bool(PYMeshMaterial *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshGeometry
	TS_PYAPI bool isPYMeshGeometry(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshGeometry_Type);
	}
	TS_PYAPI MeshGeometry &pyMeshGeometry_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshGeometry_Type) return ((PYMeshGeometry*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshGeometry_get(): can't get MeshGeometry from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshGeometry_get(): can't get MeshGeometry from None");
		static MeshGeometry ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshGeometry_new(const MeshGeometry &ptr) {
		PYMeshGeometry *ret = (PYMeshGeometry*)PyObject_New(PYMeshGeometry, &PYMeshGeometry_Type);
		new(&ret->ptr) MeshGeometry(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshGeometry_new(MeshGeometry &&ptr) {
		PYMeshGeometry *ret = (PYMeshGeometry*)PyObject_New(PYMeshGeometry, &PYMeshGeometry_Type);
		new(&ret->ptr) MeshGeometry(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshGeometry_init(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshGeometry(name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *mesh_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "mesh", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &mesh_, &name)) {
				if(!isPYMesh(mesh_)) break;
				Mesh &mesh = pyMesh_get(mesh_);
				new(&self->ptr) MeshGeometry(mesh, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::MeshGeometry(): unknown arguments:\n(const char* name)\n(Mesh mesh, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshGeometry_dealloc(PYMeshGeometry *self) {
		self->ptr.~MeshGeometry();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshGeometry_equalPtr(PYMeshGeometry *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshGeometry_clonePtr(PYMeshGeometry *self, PyObject *args) {
		return pyMeshGeometry_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshGeometry_clearPtr(PYMeshGeometry *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshGeometry_destroyPtr(PYMeshGeometry *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshGeometry_acquirePtr(PYMeshGeometry *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshGeometry_unacquirePtr(PYMeshGeometry *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshGeometry_isValidPtr(PYMeshGeometry *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshGeometry_isOwnerPtr(PYMeshGeometry *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshGeometry_isConstPtr(PYMeshGeometry *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshGeometry_getCountPtr(PYMeshGeometry *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshGeometry_getInternalPtr(PYMeshGeometry *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshGeometry_clear(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setName(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getName(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getIndex(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setMesh(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *mesh_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "mesh", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &mesh_, &check)) {
			if(!isPYMesh(mesh_)) break;
			Mesh &mesh = pyMesh_get(mesh_);
			self->ptr.setMesh(mesh, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setMesh(): unknown arguments:\n(Mesh mesh, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMesh(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMesh(): unknown arguments:\n(void) -> const Mesh\n(void) -> Mesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setParent0(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "parent", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &check)) {
			if(!isPYMeshGeometry(parent_)) break;
			MeshGeometry &parent = pyMeshGeometry_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent0(parent, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setParent0(): unknown arguments:\n(MeshGeometry parent, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setParent1(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "parent", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &check)) {
			if(!isPYMeshGeometry(parent_)) break;
			MeshGeometry &parent = pyMeshGeometry_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent1(parent, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setParent1(): unknown arguments:\n(MeshGeometry parent, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getParent0(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getParent0());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getParent0());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getParent0(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getParent1(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getParent1());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshGeometry_new(self->ptr.getParent1());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getParent1(): unknown arguments:\n(void) -> const MeshGeometry\n(void) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_isRoot(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::isRoot(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_reserveChildren(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_children = {};
		static const char *kwlist[] = { "num_children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_children)) {
			self->ptr.reserveChildren(num_children);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::reserveChildren(): unknown arguments:\n(uint32_t num_children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addChild0(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "child", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &child_, &check)) {
			if(!isPYMeshGeometry(child_)) break;
			MeshGeometry &child = pyMeshGeometry_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.addChild0(child, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addChild0(): unknown arguments:\n(MeshGeometry child, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addChild1(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "child", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &child_, &check)) {
			if(!isPYMeshGeometry(child_)) break;
			MeshGeometry &child = pyMeshGeometry_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.addChild1(child, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addChild1(): unknown arguments:\n(MeshGeometry child, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_removeChild(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYMeshGeometry(child_)) break;
			MeshGeometry &child = pyMeshGeometry_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::removeChild(): unknown arguments:\n(MeshGeometry child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_releaseChildren(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_findChild(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYMeshGeometry(child_)) break;
			const MeshGeometry &child = pyMeshGeometry_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.findChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::findChild(): unknown arguments:\n(const MeshGeometry child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getNumChildren(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getChildren(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getChildren(): unknown arguments:\n(void) -> const Array<MeshGeometry>\n(void) -> Array<MeshGeometry>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getChild(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshGeometry_new(self->ptr.getChild(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshGeometry_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getChild(): unknown arguments:\n(uint32_t index) -> const MeshGeometry\n(uint32_t index) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_clearIndices(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearIndices();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::clearIndices(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_reserveIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		static const char *kwlist[] = { "num_indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_indices)) {
			self->ptr.reserveIndices(num_indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::reserveIndices(): unknown arguments:\n(uint32_t num_indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "indices", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &indices_, &check)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromUnsignedLong(self->ptr.addIndices(indices, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addIndices(): unknown arguments:\n(MeshIndices indices, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_removeIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromLong(self->ptr.removeIndices(indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::removeIndices(): unknown arguments:\n(MeshIndices indices) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_replaceIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_indices_ = nullptr;
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "old_indices", "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_indices_, &indices_)) {
			if(!isPYMeshIndices(old_indices_)) break;
			MeshIndices &old_indices = pyMeshIndices_get(old_indices_);
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromLong(self->ptr.replaceIndices(old_indices, indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::replaceIndices(): unknown arguments:\n(MeshIndices old_indices, MeshIndices indices) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_findIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
			if(!isPYMeshIndices(indices_)) break;
			const MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromUnsignedLong(self->ptr.findIndices(indices));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
				return PyLong_FromUnsignedLong(self->ptr.findIndices((MeshIndices::Type)type));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::findIndices(): unknown arguments:\n(const MeshIndices indices) -> uint32_t\n(MeshIndices.Type type) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_hasIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasIndices((MeshIndices::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::hasIndices(): unknown arguments:\n(MeshIndices.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_hasSolidIndices(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasSolidIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::hasSolidIndices(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getNumIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumIndices((MeshIndices::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getNumIndices(): unknown arguments:\n(MeshIndices.Type type) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return pyMeshIndices_new(self->ptr.getIndices((MeshIndices::Type)type));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
				return pyMeshIndices_new(self->ptr.getIndices((MeshIndices::Type)type));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshIndices_new(self->ptr.getIndices(index));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshIndices_new(self->ptr.getIndices(index));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getIndices();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshIndices_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getIndices();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshIndices_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getIndices(): unknown arguments:\n(MeshIndices.Type type) -> const MeshIndices\n(MeshIndices.Type type) -> MeshIndices\n(uint32_t index) -> const MeshIndices\n(uint32_t index) -> MeshIndices\n(void) -> const Array<MeshIndices>\n(void) -> Array<MeshIndices>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_clearAttributes(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearAttributes();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::clearAttributes(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_reserveAttributes(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_attributes = {};
		static const char *kwlist[] = { "num_attributes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_attributes)) {
			self->ptr.reserveAttributes(num_attributes);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::reserveAttributes(): unknown arguments:\n(uint32_t num_attributes) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_ = nullptr;
		PyObject *indices_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "attribute", "indices", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &attribute_, &indices_, &check)) {
			if(!isPYMeshAttribute(attribute_)) break;
			MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromUnsignedLong(self->ptr.addAttribute(attribute, indices, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *attribute_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "attribute", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &attribute_, &check)) {
				if(!isPYMeshAttribute(attribute_)) break;
				MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
				return PyLong_FromUnsignedLong(self->ptr.addAttribute(attribute, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addAttribute(): unknown arguments:\n(MeshAttribute attribute, MeshIndices indices, bool check) -> uint32_t\n(MeshAttribute attribute, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_removeAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *attribute_ = nullptr;
		static const char *kwlist[] = { "attribute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attribute_)) {
			if(!isPYMeshAttribute(attribute_)) break;
			MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			return PyLong_FromLong(self->ptr.removeAttribute(attribute));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::removeAttribute(): unknown arguments:\n(MeshAttribute attribute) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_replaceAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_attribute_ = nullptr;
		PyObject *attribute_ = nullptr;
		static const char *kwlist[] = { "old_attribute", "attribute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_attribute_, &attribute_)) {
			if(!isPYMeshAttribute(old_attribute_)) break;
			MeshAttribute &old_attribute = pyMeshAttribute_get(old_attribute_);
			if(!isPYMeshAttribute(attribute_)) break;
			MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
			return PyLong_FromLong(self->ptr.replaceAttribute(old_attribute, attribute));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::replaceAttribute(): unknown arguments:\n(MeshAttribute old_attribute, MeshAttribute attribute) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_replaceAttributeIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_indices_ = nullptr;
		PyObject *indices_ = nullptr;
		static const char *kwlist[] = { "old_indices", "indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_indices_, &indices_)) {
			if(!isPYMeshIndices(old_indices_)) break;
			const MeshIndices &old_indices = pyMeshIndices_get(old_indices_);
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromLong(self->ptr.replaceAttributeIndices(old_indices, indices));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::replaceAttributeIndices(): unknown arguments:\n(const MeshIndices old_indices, MeshIndices indices) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_findAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		uint32_t index = 0;
		static const char *kwlist[] = { "type", "format", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &type, &format, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.findAttribute((MeshAttribute::Type)type, (Format)format, index));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t index = 0;
			static const char *kwlist[] = { "type", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &type, &index)) {
				return PyLong_FromUnsignedLong(self->ptr.findAttribute((MeshAttribute::Type)type, index));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t index = 0;
			static const char *kwlist[] = { "name", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &name, &index)) {
				return PyLong_FromUnsignedLong(self->ptr.findAttribute(name, index));
			}
		}
		PyErr_Clear();
		{
			PyObject *attribute_ = nullptr;
			static const char *kwlist[] = { "attribute", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attribute_)) {
				if(!isPYMeshAttribute(attribute_)) break;
				const MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
				return PyLong_FromUnsignedLong(self->ptr.findAttribute(attribute));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::findAttribute(): unknown arguments:\n(MeshAttribute.Type type, Format format, uint32_t index) -> uint32_t\n(MeshAttribute.Type type, uint32_t index) -> uint32_t\n(const char* name, uint32_t index) -> uint32_t\n(const MeshAttribute attribute) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_hasAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		uint32_t index = 0;
		static const char *kwlist[] = { "type", "format", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &type, &format, &index)) {
			return PyLong_FromLong(self->ptr.hasAttribute((MeshAttribute::Type)type, (Format)format, index));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t index = 0;
			static const char *kwlist[] = { "type", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &type, &index)) {
				return PyLong_FromLong(self->ptr.hasAttribute((MeshAttribute::Type)type, index));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t index = 0;
			static const char *kwlist[] = { "name", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &name, &index)) {
				return PyLong_FromLong(self->ptr.hasAttribute(name, index));
			}
		}
		PyErr_Clear();
		{
			PyObject *attribute_ = nullptr;
			static const char *kwlist[] = { "attribute", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attribute_)) {
				if(!isPYMeshAttribute(attribute_)) break;
				const MeshAttribute &attribute = pyMeshAttribute_get(attribute_);
				return PyLong_FromLong(self->ptr.hasAttribute(attribute));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::hasAttribute(): unknown arguments:\n(MeshAttribute.Type type, Format format, uint32_t index) -> bool\n(MeshAttribute.Type type, uint32_t index) -> bool\n(const char* name, uint32_t index) -> bool\n(const MeshAttribute attribute) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getNumAttributes(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAttributes((MeshAttribute::Type)type));
		}
		PyErr_Clear();
		{
			PyObject *indices_ = nullptr;
			static const char *kwlist[] = { "indices", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &indices_)) {
				if(!isPYMeshIndices(indices_)) break;
				const MeshIndices &indices = pyMeshIndices_get(indices_);
				return PyLong_FromUnsignedLong(self->ptr.getNumAttributes(indices));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAttributes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getNumAttributes(): unknown arguments:\n(MeshAttribute.Type type) -> uint32_t\n(const MeshIndices indices) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getAttribute(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t index = 0;
		static const char *kwlist[] = { "type", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &type, &index)) {
			return pyMeshAttribute_new(self->ptr.getAttribute((MeshAttribute::Type)type, index));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t index = 0;
			static const char *kwlist[] = { "type", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &type, &index)) {
				return pyMeshAttribute_new(self->ptr.getAttribute((MeshAttribute::Type)type, index));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshAttribute_new(self->ptr.getAttribute(index));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshAttribute_new(self->ptr.getAttribute(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getAttribute(): unknown arguments:\n(MeshAttribute.Type type, uint32_t index) -> const MeshAttribute\n(MeshAttribute.Type type, uint32_t index) -> MeshAttribute\n(uint32_t index) -> const MeshAttribute\n(uint32_t index) -> MeshAttribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getAttributes(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAttributes();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAttribute_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAttributes();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAttribute_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getAttributes(): unknown arguments:\n(void) -> const Array<MeshAttribute>\n(void) -> Array<MeshAttribute>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_clearJoints(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearJoints();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::clearJoints(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_reserveJoints(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_joints = {};
		static const char *kwlist[] = { "num_joints", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_joints)) {
			self->ptr.reserveJoints(num_joints);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::reserveJoints(): unknown arguments:\n(uint32_t num_joints) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addJoint(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *joint_ = nullptr;
		PyObject *node_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "joint", "node", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &joint_, &node_, &check)) {
			if(!isPYMeshJoint(joint_)) break;
			MeshJoint &joint = pyMeshJoint_get(joint_);
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			return PyLong_FromUnsignedLong(self->ptr.addJoint(joint, node, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *joint_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "joint", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &joint_, &check)) {
				if(!isPYMeshJoint(joint_)) break;
				MeshJoint &joint = pyMeshJoint_get(joint_);
				return PyLong_FromUnsignedLong(self->ptr.addJoint(joint, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addJoint(): unknown arguments:\n(MeshJoint joint, MeshNode node, bool check) -> uint32_t\n(MeshJoint joint, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_removeJoint(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *joint_ = nullptr;
		static const char *kwlist[] = { "joint", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &joint_)) {
			if(!isPYMeshJoint(joint_)) break;
			MeshJoint &joint = pyMeshJoint_get(joint_);
			return PyLong_FromLong(self->ptr.removeJoint(joint));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::removeJoint(): unknown arguments:\n(MeshJoint joint) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_replaceJoint(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_joint_ = nullptr;
		PyObject *joint_ = nullptr;
		static const char *kwlist[] = { "old_joint", "joint", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_joint_, &joint_)) {
			if(!isPYMeshJoint(old_joint_)) break;
			MeshJoint &old_joint = pyMeshJoint_get(old_joint_);
			if(!isPYMeshJoint(joint_)) break;
			MeshJoint &joint = pyMeshJoint_get(joint_);
			return PyLong_FromLong(self->ptr.replaceJoint(old_joint, joint));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::replaceJoint(): unknown arguments:\n(MeshJoint old_joint, MeshJoint joint) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_findJoint(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *joint_ = nullptr;
		static const char *kwlist[] = { "joint", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &joint_)) {
			if(!isPYMeshJoint(joint_)) break;
			const MeshJoint &joint = pyMeshJoint_get(joint_);
			return PyLong_FromUnsignedLong(self->ptr.findJoint(joint));
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
				if(!isPYMeshNode(node_)) break;
				const MeshNode &node = pyMeshNode_get(node_);
				return PyLong_FromUnsignedLong(self->ptr.findJoint(node));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findJoint(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::findJoint(): unknown arguments:\n(const MeshJoint joint) -> uint32_t\n(const MeshNode node) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getNumJoints(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumJoints());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getNumJoints(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getJoints(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getJoints();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshJoint_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getJoints();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshJoint_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getJoints(): unknown arguments:\n(void) -> const Array<MeshJoint>\n(void) -> Array<MeshJoint>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getJoint(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshJoint_new(self->ptr.getJoint(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshJoint_new(self->ptr.getJoint(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getJoint(): unknown arguments:\n(uint32_t index) -> const MeshJoint\n(uint32_t index) -> MeshJoint\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_clearMaterials(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearMaterials();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::clearMaterials(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_reserveMaterials(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_materials = {};
		static const char *kwlist[] = { "num_materials", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_materials)) {
			self->ptr.reserveMaterials(num_materials);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::reserveMaterials(): unknown arguments:\n(uint32_t num_materials) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_addMaterial(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *material_ = nullptr;
		PyObject *indices_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "material", "indices", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &material_, &indices_, &check)) {
			if(!isPYMeshMaterial(material_)) break;
			MeshMaterial &material = pyMeshMaterial_get(material_);
			if(!isPYMeshIndices(indices_)) break;
			MeshIndices &indices = pyMeshIndices_get(indices_);
			return PyLong_FromUnsignedLong(self->ptr.addMaterial(material, indices, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *material_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "material", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &material_, &check)) {
				if(!isPYMeshMaterial(material_)) break;
				MeshMaterial &material = pyMeshMaterial_get(material_);
				return PyLong_FromUnsignedLong(self->ptr.addMaterial(material, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::addMaterial(): unknown arguments:\n(MeshMaterial material, MeshIndices indices, bool check) -> uint32_t\n(MeshMaterial material, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_removeMaterial(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *material_ = nullptr;
		static const char *kwlist[] = { "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &material_)) {
			if(!isPYMeshMaterial(material_)) break;
			MeshMaterial &material = pyMeshMaterial_get(material_);
			return PyLong_FromLong(self->ptr.removeMaterial(material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::removeMaterial(): unknown arguments:\n(MeshMaterial material) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_replaceMaterial(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_material_ = nullptr;
		PyObject *material_ = nullptr;
		static const char *kwlist[] = { "old_material", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_material_, &material_)) {
			if(!isPYMeshMaterial(old_material_)) break;
			MeshMaterial &old_material = pyMeshMaterial_get(old_material_);
			if(!isPYMeshMaterial(material_)) break;
			MeshMaterial &material = pyMeshMaterial_get(material_);
			return PyLong_FromLong(self->ptr.replaceMaterial(old_material, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::replaceMaterial(): unknown arguments:\n(MeshMaterial old_material, MeshMaterial material) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_findMaterial(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *material_ = nullptr;
		static const char *kwlist[] = { "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &material_)) {
			if(!isPYMeshMaterial(material_)) break;
			const MeshMaterial &material = pyMeshMaterial_get(material_);
			return PyLong_FromUnsignedLong(self->ptr.findMaterial(material));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findMaterial(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::findMaterial(): unknown arguments:\n(const MeshMaterial material) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getNumMaterials(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMaterials());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getNumMaterials(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMaterials(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getMaterials();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshMaterial_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getMaterials();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshMaterial_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMaterials(): unknown arguments:\n(void) -> const Array<MeshMaterial>\n(void) -> Array<MeshMaterial>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMaterial(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshMaterial_new(self->ptr.getMaterial(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshMaterial_new(self->ptr.getMaterial(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMaterial(): unknown arguments:\n(uint32_t index) -> const MeshMaterial\n(uint32_t index) -> MeshMaterial\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setBoundBox(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *box_ = nullptr;
		static const char *kwlist[] = { "box", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &box_)) {
			if(!isPYBoundBoxf(box_)) break;
			const BoundBoxf &box = pyBoundBoxf_get(box_);
			self->ptr.setBoundBox(box);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setBoundBox(): unknown arguments:\n(const BoundBoxf box) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getBoundBox(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundBoxf_new(self->ptr.getBoundBox());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getBoundBox(): unknown arguments:\n(void) -> const BoundBoxf\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setBoundSphere(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *sphere_ = nullptr;
		static const char *kwlist[] = { "sphere", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sphere_)) {
			if(!isPYBoundSpheref(sphere_)) break;
			const BoundSpheref &sphere = pyBoundSpheref_get(sphere_);
			self->ptr.setBoundSphere(sphere);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setBoundSphere(): unknown arguments:\n(const BoundSpheref sphere) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getBoundSphere(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundSpheref_new(self->ptr.getBoundSphere());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getBoundSphere(): unknown arguments:\n(void) -> const BoundSpheref\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setTransform(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		int32_t apply = false;
		static const char *kwlist[] = { "transform", "apply", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &transform_, &apply)) {
			if(!isPYMatrix4x3f(transform_)) break;
			const Matrix4x3f &transform = pyMatrix4x3f_get(transform_);
			return PyLong_FromLong(self->ptr.setTransform(transform, (apply != 0)));
		}
		PyErr_Clear();
		{
			PyObject *scale_ = nullptr;
			static const char *kwlist[] = { "scale", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
				if(!isPYVector3f(scale_)) break;
				const Vector3f &scale = pyVector3f_get(scale_);
				return PyLong_FromLong(self->ptr.setTransform(scale));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setTransform(): unknown arguments:\n(const Matrix4x3f transform, bool apply) -> bool\n(const Vector3f scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getTransform(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getTransform(): unknown arguments:\n(void) -> const Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setJointITransform(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *itransform_ = nullptr;
		static const char *kwlist[] = { "itransform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &itransform_)) {
			if(!isPYMatrix4x3f(itransform_)) break;
			const Matrix4x3f &itransform = pyMatrix4x3f_get(itransform_);
			self->ptr.setJointITransform(itransform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setJointITransform(): unknown arguments:\n(const Matrix4x3f itransform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getJointITransform(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getJointITransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getJointITransform(): unknown arguments:\n(void) -> const Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setMinVisibility(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t distance = {};
		static const char *kwlist[] = { "distance", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &distance)) {
			self->ptr.setMinVisibility(distance);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setMinVisibility(): unknown arguments:\n(float32_t distance) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setMaxVisibility(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t distance = {};
		static const char *kwlist[] = { "distance", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &distance)) {
			self->ptr.setMaxVisibility(distance);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setMaxVisibility(): unknown arguments:\n(float32_t distance) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setVisibilityRange(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t min = {};
		float32_t max = {};
		static const char *kwlist[] = { "min", "max", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &min, &max)) {
			self->ptr.setVisibilityRange(min, max);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setVisibilityRange(): unknown arguments:\n(float32_t min, float32_t max) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMinVisibility(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMinVisibility());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMinVisibility(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMaxVisibility(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMaxVisibility());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMaxVisibility(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_hasVisibilityRange(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasVisibilityRange());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::hasVisibilityRange(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_setVisibilityError(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t error = {};
		static const char *kwlist[] = { "error", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &error)) {
			self->ptr.setVisibilityError(error);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::setVisibilityError(): unknown arguments:\n(float32_t error) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getVisibilityError(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getVisibilityError());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getVisibilityError(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_createBounds(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		int32_t force = false;
		uint32_t position = Maxu32;
		static const char *kwlist[] = { "force", "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iI", (char**)kwlist, &force, &position)) {
			return PyLong_FromLong(self->ptr.createBounds((force != 0), position));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::createBounds(): unknown arguments:\n(bool force, uint32_t position) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_createBasis(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t angle = {};
		int32_t force = false;
		uint32_t position = Maxu32;
		uint32_t normal = Maxu32;
		uint32_t tangent = Maxu32;
		int32_t append = false;
		static const char *kwlist[] = { "angle", "force", "position", "normal", "tangent", "append", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|iIIIi", (char**)kwlist, &angle, &force, &position, &normal, &tangent, &append)) {
			return PyLong_FromUnsignedLong(self->ptr.createBasis(angle, (force != 0), position, normal, tangent, (append != 0)));
		}
		PyErr_Clear();
		{
			int32_t force = false;
			uint32_t position = Maxu32;
			uint32_t normal = Maxu32;
			uint32_t tangent = Maxu32;
			int32_t append = false;
			static const char *kwlist[] = { "force", "position", "normal", "tangent", "append", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iIIIi", (char**)kwlist, &force, &position, &normal, &tangent, &append)) {
				return PyLong_FromUnsignedLong(self->ptr.createBasis((force != 0), position, normal, tangent, (append != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::createBasis(): unknown arguments:\n(float32_t angle, bool force, uint32_t position, uint32_t normal, uint32_t tangent, bool append) -> uint32_t\n(bool force, uint32_t position, uint32_t normal, uint32_t tangent, bool append) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_createNormals(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		float32_t angle = {};
		int32_t force = false;
		uint32_t position = Maxu32;
		int32_t append = false;
		static const char *kwlist[] = { "angle", "force", "position", "append", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|iIi", (char**)kwlist, &angle, &force, &position, &append)) {
			return PyLong_FromUnsignedLong(self->ptr.createNormals(angle, (force != 0), position, (append != 0)));
		}
		PyErr_Clear();
		{
			int32_t force = false;
			uint32_t position = Maxu32;
			int32_t append = false;
			static const char *kwlist[] = { "force", "position", "append", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iIi", (char**)kwlist, &force, &position, &append)) {
				return PyLong_FromUnsignedLong(self->ptr.createNormals((force != 0), position, (append != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::createNormals(): unknown arguments:\n(float32_t angle, bool force, uint32_t position, bool append) -> uint32_t\n(bool force, uint32_t position, bool append) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_createTangents(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		int32_t force = false;
		uint32_t position = Maxu32;
		uint32_t normal = Maxu32;
		uint32_t texcoord = Maxu32;
		int32_t append = false;
		static const char *kwlist[] = { "force", "position", "normal", "texcoord", "append", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iIIIi", (char**)kwlist, &force, &position, &normal, &texcoord, &append)) {
			return PyLong_FromUnsignedLong(self->ptr.createTangents((force != 0), position, normal, texcoord, (append != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::createTangents(): unknown arguments:\n(bool force, uint32_t position, uint32_t normal, uint32_t texcoord, bool append) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_createIslands(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t max_attributes = {};
		uint32_t max_primitives = {};
		int32_t force = false;
		uint32_t index = Maxu32;
		uint32_t position = Maxu32;
		int32_t append = false;
		static const char *kwlist[] = { "max_attributes", "max_primitives", "force", "index", "position", "append", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|iIIi", (char**)kwlist, &max_attributes, &max_primitives, &force, &index, &position, &append)) {
			return PyLong_FromUnsignedLong(self->ptr.createIslands(max_attributes, max_primitives, (force != 0), index, position, (append != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::createIslands(): unknown arguments:\n(uint32_t max_attributes, uint32_t max_primitives, bool force, uint32_t index, uint32_t position, bool append) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_optimizeIndices(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t cache = 32;
		int32_t transparent = false;
		uint32_t index = Maxu32;
		uint32_t position = Maxu32;
		static const char *kwlist[] = { "cache", "transparent", "index", "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|IiII", (char**)kwlist, &cache, &transparent, &index, &position)) {
			return PyLong_FromLong(self->ptr.optimizeIndices(cache, (transparent != 0), index, position));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::optimizeIndices(): unknown arguments:\n(uint32_t cache, bool transparent, uint32_t index, uint32_t position) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_optimizeAttributes(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		uint32_t material = Maxu32;
		static const char *kwlist[] = { "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &material)) {
			return PyLong_FromLong(self->ptr.optimizeAttributes(material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::optimizeAttributes(): unknown arguments:\n(uint32_t material) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_optimizeMaterials(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.optimizeMaterials();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::optimizeMaterials(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_packAttributes(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		int32_t remove = true;
		static const char *kwlist[] = { "remove", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &remove)) {
			return PyLong_FromLong(self->ptr.packAttributes((remove != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::packAttributes(): unknown arguments:\n(bool remove) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_unpackAttributes(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		int32_t remove = true;
		static const char *kwlist[] = { "remove", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &remove)) {
			return PyLong_FromLong(self->ptr.unpackAttributes((remove != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::unpackAttributes(): unknown arguments:\n(bool remove) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_compare(PYMeshGeometry *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		PyObject *transform_ = nullptr;
		float32_t threshold = 1e-6f;
		int32_t spatial = true;
		static const char *kwlist[] = { "geometry", "transform", "threshold", "spatial", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|Ofi", (char**)kwlist, &geometry_, &transform_, &threshold, &spatial)) {
			if(!isPYMeshGeometry(geometry_)) break;
			const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			const Matrix4x3f &transform = pyMatrix4x3f_get(transform_);
			return PyLong_FromLong(self->ptr.compare(geometry, transform, threshold, (spatial != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::compare(): unknown arguments:\n(const MeshGeometry geometry, const Matrix4x3f transform, float32_t threshold, bool spatial) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_isOptimized(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isOptimized());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::isOptimized(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_validate(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.validate());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::validate(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_getMemory(PYMeshGeometry *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGeometry::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshGeometry_get_name(PYMeshGeometry *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshGeometry_get_index(PYMeshGeometry *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *MeshGeometry_get_mesh(PYMeshGeometry *self, void *offset) {
		return pyMesh_new(self->ptr.getMesh());
	}
	static PyObject *MeshGeometry_get_parent0(PYMeshGeometry *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getParent0());
	}
	static PyObject *MeshGeometry_get_parent1(PYMeshGeometry *self, void *offset) {
		return pyMeshGeometry_new(self->ptr.getParent1());
	}
	static PyObject *MeshGeometry_get_num_children(PYMeshGeometry *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *MeshGeometry_get_num_joints(PYMeshGeometry *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumJoints());
	}
	static PyObject *MeshGeometry_get_num_materials(PYMeshGeometry *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumMaterials());
	}
	static PyObject *MeshGeometry_get_bound_box(PYMeshGeometry *self, void *offset) {
		return pyBoundBoxf_new(self->ptr.getBoundBox());
	}
	static PyObject *MeshGeometry_get_bound_sphere(PYMeshGeometry *self, void *offset) {
		return pyBoundSpheref_new(self->ptr.getBoundSphere());
	}
	static PyObject *MeshGeometry_get_transform(PYMeshGeometry *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getTransform());
	}
	static PyObject *MeshGeometry_get_joint_itransform(PYMeshGeometry *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getJointITransform());
	}
	static PyObject *MeshGeometry_get_min_visibility(PYMeshGeometry *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMinVisibility());
	}
	static PyObject *MeshGeometry_get_max_visibility(PYMeshGeometry *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMaxVisibility());
	}
	static PyObject *MeshGeometry_get_visibility_error(PYMeshGeometry *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getVisibilityError());
	}
	static PyObject *MeshGeometry_get_memory(PYMeshGeometry *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshGeometry_str(PYMeshGeometry *self) {
		return PyUnicode_FromString(String::format("MeshGeometry Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshGeometry_bool(PYMeshGeometry *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshTransform
	TS_PYAPI bool isPYMeshTransform(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshTransform_Type);
	}
	TS_PYAPI MeshTransform &pyMeshTransform_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshTransform_Type) return ((PYMeshTransform*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshTransform_get(): can't get MeshTransform from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshTransform_get(): can't get MeshTransform from None");
		static MeshTransform ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshTransform_new(const MeshTransform &ptr) {
		PYMeshTransform *ret = (PYMeshTransform*)PyObject_New(PYMeshTransform, &PYMeshTransform_Type);
		new(&ret->ptr) MeshTransform(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshTransform_new(MeshTransform &&ptr) {
		PYMeshTransform *ret = (PYMeshTransform*)PyObject_New(PYMeshTransform, &PYMeshTransform_Type);
		new(&ret->ptr) MeshTransform(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshTransform_init(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MeshTransform();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::MeshTransform(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshTransform_dealloc(PYMeshTransform *self) {
		self->ptr.~MeshTransform();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshTransform_equalPtr(PYMeshTransform *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshTransform_clonePtr(PYMeshTransform *self, PyObject *args) {
		return pyMeshTransform_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshTransform_clearPtr(PYMeshTransform *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshTransform_destroyPtr(PYMeshTransform *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshTransform_acquirePtr(PYMeshTransform *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshTransform_unacquirePtr(PYMeshTransform *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshTransform_isValidPtr(PYMeshTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshTransform_isOwnerPtr(PYMeshTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshTransform_isConstPtr(PYMeshTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshTransform_getCountPtr(PYMeshTransform *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshTransform_getInternalPtr(PYMeshTransform *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshTransform_clear(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getMinTime(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMinTime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getMinTime(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getMaxTime(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMaxTime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getMaxTime(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_setTransform(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *transform_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "transform", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dO|f", (char**)kwlist, &time, &transform_, &threshold)) {
			if(!isPYMatrix4x3d(transform_)) break;
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setTransform(time, transform, threshold);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *scale_ = nullptr;
			static const char *kwlist[] = { "scale", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
				if(!isPYVector3d(scale_)) break;
				const Vector3d &scale = pyVector3d_get(scale_);
				self->ptr.setTransform(scale);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *transform_ = nullptr;
			static const char *kwlist[] = { "transform", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
				if(!isPYMatrix4x3d(transform_)) break;
				const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
				self->ptr.setTransform(transform);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::setTransform(): unknown arguments:\n(float64_t time, const Matrix4x3d transform, float32_t threshold) -> void\n(const Vector3d scale) -> void\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_setTranslate(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *translate_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "translate", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dO|f", (char**)kwlist, &time, &translate_, &threshold)) {
			if(!isPYVector3d(translate_)) break;
			const Vector3d &translate = pyVector3d_get(translate_);
			self->ptr.setTranslate(time, translate, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::setTranslate(): unknown arguments:\n(float64_t time, const Vector3d translate, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_setRotate(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *rotate_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "rotate", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dO|f", (char**)kwlist, &time, &rotate_, &threshold)) {
			if(!isPYQuaternionf(rotate_)) break;
			const Quaternionf &rotate = pyQuaternionf_get(rotate_);
			self->ptr.setRotate(time, rotate, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::setRotate(): unknown arguments:\n(float64_t time, const Quaternionf rotate, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_setScale(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *scale_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "scale", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dO|f", (char**)kwlist, &time, &scale_, &threshold)) {
			if(!isPYVector3f(scale_)) break;
			const Vector3f &scale = pyVector3f_get(scale_);
			self->ptr.setScale(time, scale, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::setScale(): unknown arguments:\n(float64_t time, const Vector3f scale, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_setMorph(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *morph_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "morph", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dO|f", (char**)kwlist, &time, &morph_, &threshold)) {
			if(!isPYVector4f(morph_)) break;
			const Vector4f &morph = pyVector4f_get(morph_);
			self->ptr.setMorph(time, morph, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::setMorph(): unknown arguments:\n(float64_t time, const Vector4f morph, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getTransform(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		static const char *kwlist[] = { "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &time)) {
			return pyMatrix4x3d_new(self->ptr.getTransform(time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getTransform(): unknown arguments:\n(float64_t time) -> Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getTranslate(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		static const char *kwlist[] = { "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &time)) {
			return pyVector3d_new(self->ptr.getTranslate(time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getTranslate(): unknown arguments:\n(float64_t time) -> Vector3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getRotate(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		static const char *kwlist[] = { "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &time)) {
			return pyQuaternionf_new(self->ptr.getRotate(time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getRotate(): unknown arguments:\n(float64_t time) -> Quaternionf\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getScale(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		static const char *kwlist[] = { "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &time)) {
			return pyVector3f_new(self->ptr.getScale(time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getScale(): unknown arguments:\n(float64_t time) -> Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getMorph(PYMeshTransform *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		static const char *kwlist[] = { "time", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &time)) {
			return pyVector4f_new(self->ptr.getMorph(time));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getMorph(): unknown arguments:\n(float64_t time) -> Vector4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_hasTransformKeys(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasTransformKeys());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::hasTransformKeys(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_hasTranslateKeys(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasTranslateKeys());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::hasTranslateKeys(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_hasRotateKeys(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasRotateKeys());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::hasRotateKeys(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_hasScaleKeys(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasScaleKeys());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::hasScaleKeys(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_hasMorphKeys(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMorphKeys());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::hasMorphKeys(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_getMemory(PYMeshTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshTransform::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshTransform_get_min_time(PYMeshTransform *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMinTime());
	}
	static PyObject *MeshTransform_get_max_time(PYMeshTransform *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMaxTime());
	}
	static PyObject *MeshTransform_get_memory(PYMeshTransform *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshTransform_str(PYMeshTransform *self) {
		return PyUnicode_FromString(String::format("MeshTransform Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshTransform_bool(PYMeshTransform *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshAnimation
	TS_PYAPI bool isPYMeshAnimation(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshAnimation_Type);
	}
	TS_PYAPI MeshAnimation &pyMeshAnimation_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshAnimation_Type) return ((PYMeshAnimation*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshAnimation_get(): can't get MeshAnimation from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshAnimation_get(): can't get MeshAnimation from None");
		static MeshAnimation ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshAnimation_new(const MeshAnimation &ptr) {
		PYMeshAnimation *ret = (PYMeshAnimation*)PyObject_New(PYMeshAnimation, &PYMeshAnimation_Type);
		new(&ret->ptr) MeshAnimation(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshAnimation_new(MeshAnimation &&ptr) {
		PYMeshAnimation *ret = (PYMeshAnimation*)PyObject_New(PYMeshAnimation, &PYMeshAnimation_Type);
		new(&ret->ptr) MeshAnimation(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshAnimation_init(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshAnimation(name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *mesh_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "mesh", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &mesh_, &name)) {
				if(!isPYMesh(mesh_)) break;
				Mesh &mesh = pyMesh_get(mesh_);
				new(&self->ptr) MeshAnimation(mesh, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::MeshAnimation(): unknown arguments:\n(const char* name)\n(Mesh mesh, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshAnimation_dealloc(PYMeshAnimation *self) {
		self->ptr.~MeshAnimation();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshAnimation_equalPtr(PYMeshAnimation *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshAnimation_clonePtr(PYMeshAnimation *self, PyObject *args) {
		return pyMeshAnimation_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshAnimation_clearPtr(PYMeshAnimation *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAnimation_destroyPtr(PYMeshAnimation *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAnimation_acquirePtr(PYMeshAnimation *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAnimation_unacquirePtr(PYMeshAnimation *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAnimation_isValidPtr(PYMeshAnimation *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshAnimation_isOwnerPtr(PYMeshAnimation *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshAnimation_isConstPtr(PYMeshAnimation *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshAnimation_getCountPtr(PYMeshAnimation *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshAnimation_getInternalPtr(PYMeshAnimation *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshAnimation_clear(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getIndex(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setName(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getName(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setMesh(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		PyObject *mesh_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "mesh", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &mesh_, &check)) {
			if(!isPYMesh(mesh_)) break;
			Mesh &mesh = pyMesh_get(mesh_);
			self->ptr.setMesh(mesh, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setMesh(): unknown arguments:\n(Mesh mesh, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getMesh(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMesh_new(self->ptr.getMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getMesh(): unknown arguments:\n(void) -> const Mesh\n(void) -> Mesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getMinTime(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMinTime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getMinTime(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getMaxTime(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMaxTime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getMaxTime(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setNumTransforms(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_transforms = {};
		static const char *kwlist[] = { "num_transforms", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_transforms)) {
			self->ptr.setNumTransforms(num_transforms);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setNumTransforms(): unknown arguments:\n(uint32_t num_transforms) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getNumTransforms(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTransforms());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getNumTransforms(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getTransforms(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getTransforms();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshTransform_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getTransforms();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshTransform_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getTransforms(): unknown arguments:\n(void) -> const Array<MeshTransform>\n(void) -> Array<MeshTransform>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getTransform(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		uint32_t node = {};
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &node)) {
			return pyMeshTransform_new(self->ptr.getTransform(node));
		}
		PyErr_Clear();
		{
			uint32_t node = {};
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &node)) {
				return pyMeshTransform_new(self->ptr.getTransform(node));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getTransform(): unknown arguments:\n(uint32_t node) -> const MeshTransform\n(uint32_t node) -> MeshTransform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setTransform(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		uint32_t node = {};
		PyObject *transform_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "node", "transform", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dIO|f", (char**)kwlist, &time, &node, &transform_, &threshold)) {
			if(!isPYMatrix4x3d(transform_)) break;
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setTransform(time, node, transform, threshold);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *scale_ = nullptr;
			static const char *kwlist[] = { "scale", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
				if(!isPYVector3d(scale_)) break;
				const Vector3d &scale = pyVector3d_get(scale_);
				self->ptr.setTransform(scale);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *transform_ = nullptr;
			static const char *kwlist[] = { "transform", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
				if(!isPYMatrix4x3d(transform_)) break;
				const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
				self->ptr.setTransform(transform);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setTransform(): unknown arguments:\n(float64_t time, uint32_t node, const Matrix4x3d transform, float32_t threshold) -> void\n(const Vector3d scale) -> void\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setTranslate(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		uint32_t node = {};
		PyObject *translate_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "node", "translate", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dIO|f", (char**)kwlist, &time, &node, &translate_, &threshold)) {
			if(!isPYVector3d(translate_)) break;
			const Vector3d &translate = pyVector3d_get(translate_);
			self->ptr.setTranslate(time, node, translate, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setTranslate(): unknown arguments:\n(float64_t time, uint32_t node, const Vector3d translate, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setRotate(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		uint32_t node = {};
		PyObject *rotate_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "node", "rotate", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dIO|f", (char**)kwlist, &time, &node, &rotate_, &threshold)) {
			if(!isPYQuaternionf(rotate_)) break;
			const Quaternionf &rotate = pyQuaternionf_get(rotate_);
			self->ptr.setRotate(time, node, rotate, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setRotate(): unknown arguments:\n(float64_t time, uint32_t node, const Quaternionf rotate, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setScale(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		uint32_t node = {};
		PyObject *scale_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "node", "scale", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dIO|f", (char**)kwlist, &time, &node, &scale_, &threshold)) {
			if(!isPYVector3f(scale_)) break;
			const Vector3f &scale = pyVector3f_get(scale_);
			self->ptr.setScale(time, node, scale, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setScale(): unknown arguments:\n(float64_t time, uint32_t node, const Vector3f scale, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setMorph(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		uint32_t node = {};
		PyObject *morph_ = nullptr;
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "time", "node", "morph", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dIO|f", (char**)kwlist, &time, &node, &morph_, &threshold)) {
			if(!isPYVector4f(morph_)) break;
			const Vector4f &morph = pyVector4f_get(morph_);
			self->ptr.setMorph(time, node, morph, threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setMorph(): unknown arguments:\n(float64_t time, uint32_t node, const Vector4f morph, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_setTime(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float64_t time = {};
		PyObject *transform_ = nullptr;
		int32_t loop = true;
		float64_t from = -Maxf32;
		float64_t to = Maxf32;
		static const char *kwlist[] = { "time", "transform", "loop", "from", "to", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|Oidd", (char**)kwlist, &time, &transform_, &loop, &from, &to)) {
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.setTime(time, transform, (loop != 0), from, to);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float64_t time = {};
			int32_t loop = {};
			float64_t from = -Maxf32;
			float64_t to = Maxf32;
			static const char *kwlist[] = { "time", "loop", "from", "to", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "di|dd", (char**)kwlist, &time, &loop, &from, &to)) {
				self->ptr.setTime(time, (loop != 0), from, to);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::setTime(): unknown arguments:\n(float64_t time, const Matrix4x3d transform, bool loop, float64_t from, float64_t to) -> void\n(float64_t time, bool loop, float64_t from, float64_t to) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getLocalTransform(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		uint32_t node = {};
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &node)) {
			return pyMatrix4x3d_new(self->ptr.getLocalTransform(node));
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
				if(!isPYMeshNode(node_)) break;
				const MeshNode &node = pyMeshNode_get(node_);
				return pyMatrix4x3d_new(self->ptr.getLocalTransform(node));
			}
		}
		PyErr_Clear();
		{
			PyObject *joint_ = nullptr;
			static const char *kwlist[] = { "joint", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &joint_)) {
				if(!isPYMeshJoint(joint_)) break;
				const MeshJoint &joint = pyMeshJoint_get(joint_);
				return pyMatrix4x3d_new(self->ptr.getLocalTransform(joint));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getLocalTransform(): unknown arguments:\n(uint32_t node) -> const Matrix4x3d\n(const MeshNode node) -> const Matrix4x3d\n(const MeshJoint joint) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getGlobalTransform(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		uint32_t node = {};
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &node)) {
			return pyMatrix4x3d_new(self->ptr.getGlobalTransform(node));
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
				if(!isPYMeshNode(node_)) break;
				const MeshNode &node = pyMeshNode_get(node_);
				return pyMatrix4x3d_new(self->ptr.getGlobalTransform(node));
			}
		}
		PyErr_Clear();
		{
			PyObject *joint_ = nullptr;
			static const char *kwlist[] = { "joint", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &joint_)) {
				if(!isPYMeshJoint(joint_)) break;
				const MeshJoint &joint = pyMeshJoint_get(joint_);
				return pyMatrix4x3d_new(self->ptr.getGlobalTransform(joint));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getGlobalTransform(): unknown arguments:\n(uint32_t node) -> const Matrix4x3d\n(const MeshNode node) -> const Matrix4x3d\n(const MeshJoint joint) -> const Matrix4x3d\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getMorphTransform(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		uint32_t node = {};
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &node)) {
			return pyVector4f_new(self->ptr.getMorphTransform(node));
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
				if(!isPYMeshNode(node_)) break;
				const MeshNode &node = pyMeshNode_get(node_);
				return pyVector4f_new(self->ptr.getMorphTransform(node));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getMorphTransform(): unknown arguments:\n(uint32_t node) -> const Vector4f\n(const MeshNode node) -> const Vector4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getBoundBox(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		PyObject *morph_ = nullptr;
		static const char *kwlist[] = { "geometry", "morph", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &geometry_, &morph_)) {
			if(!isPYMeshGeometry(geometry_)) break;
			const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			if(!isPYVector4f(morph_)) break;
			const Vector4f &morph = pyVector4f_get(morph_);
			return pyBoundBoxd_new(self->ptr.getBoundBox(geometry, morph));
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			static const char *kwlist[] = { "node", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
				if(!isPYMeshNode(node_)) break;
				const MeshNode &node = pyMeshNode_get(node_);
				return pyBoundBoxd_new(self->ptr.getBoundBox(node));
			}
		}
		PyErr_Clear();
		{
			PyObject *geometry_ = nullptr;
			static const char *kwlist[] = { "geometry", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
				if(!isPYMeshGeometry(geometry_)) break;
				const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				return pyBoundBoxd_new(self->ptr.getBoundBox(geometry));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundBoxd_new(self->ptr.getBoundBox());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getBoundBox(): unknown arguments:\n(const MeshGeometry geometry, const Vector4f morph) -> BoundBoxd\n(const MeshNode node) -> BoundBoxd\n(const MeshGeometry geometry) -> BoundBoxd\n(void) -> BoundBoxd\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_optimizeTransforms(PYMeshAnimation *self, PyObject *args, PyObject *kwargs) {
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|f", (char**)kwlist, &threshold)) {
			self->ptr.optimizeTransforms(threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::optimizeTransforms(): unknown arguments:\n(float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_getMemory(PYMeshAnimation *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAnimation::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAnimation_get_index(PYMeshAnimation *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *MeshAnimation_get_name(PYMeshAnimation *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshAnimation_get_mesh(PYMeshAnimation *self, void *offset) {
		return pyMesh_new(self->ptr.getMesh());
	}
	static PyObject *MeshAnimation_get_min_time(PYMeshAnimation *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMinTime());
	}
	static PyObject *MeshAnimation_get_max_time(PYMeshAnimation *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMaxTime());
	}
	static PyObject *MeshAnimation_get_num_transforms(PYMeshAnimation *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTransforms());
	}
	static PyObject *MeshAnimation_get_bound_box(PYMeshAnimation *self, void *offset) {
		return pyBoundBoxd_new(self->ptr.getBoundBox());
	}
	static PyObject *MeshAnimation_get_memory(PYMeshAnimation *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshAnimation_str(PYMeshAnimation *self) {
		return PyUnicode_FromString(String::format("MeshAnimation Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshAnimation_bool(PYMeshAnimation *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshAttachment
	TS_PYAPI bool isPYMeshAttachment(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshAttachment_Type);
	}
	TS_PYAPI MeshAttachment &pyMeshAttachment_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshAttachment_Type) return ((PYMeshAttachment*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshAttachment_get(): can't get MeshAttachment from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshAttachment_get(): can't get MeshAttachment from None");
		static MeshAttachment ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMeshAttachment_new(const MeshAttachment &ptr) {
		PYMeshAttachment *ret = (PYMeshAttachment*)PyObject_New(PYMeshAttachment, &PYMeshAttachment_Type);
		new(&ret->ptr) MeshAttachment(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMeshAttachment_new(MeshAttachment &&ptr) {
		PYMeshAttachment *ret = (PYMeshAttachment*)PyObject_New(PYMeshAttachment, &PYMeshAttachment_Type);
		new(&ret->ptr) MeshAttachment(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMeshAttachment_init(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|s", (char**)kwlist, &name)) {
			new(&self->ptr) MeshAttachment(name);
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			const char *name = nullptr;
			static const char *kwlist[] = { "type", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|s", (char**)kwlist, &type, &name)) {
				new(&self->ptr) MeshAttachment((MeshAttachment::Type)type, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *node_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "node", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &node_, &name)) {
				if(!isPYMeshNode(node_)) break;
				MeshNode &node = pyMeshNode_get(node_);
				new(&self->ptr) MeshAttachment(node, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::MeshAttachment(): unknown arguments:\n(const char* name)\n(MeshAttachment.Type type, const char* name)\n(MeshNode node, const char* name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshAttachment_dealloc(PYMeshAttachment *self) {
		self->ptr.~MeshAttachment();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMeshAttachment_equalPtr(PYMeshAttachment *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMeshAttachment_clonePtr(PYMeshAttachment *self, PyObject *args) {
		return pyMeshAttachment_new(self->ptr.clonePtr());
	}
	static PyObject *pyMeshAttachment_clearPtr(PYMeshAttachment *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttachment_destroyPtr(PYMeshAttachment *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttachment_acquirePtr(PYMeshAttachment *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttachment_unacquirePtr(PYMeshAttachment *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMeshAttachment_isValidPtr(PYMeshAttachment *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMeshAttachment_isOwnerPtr(PYMeshAttachment *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMeshAttachment_isConstPtr(PYMeshAttachment *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMeshAttachment_getCountPtr(PYMeshAttachment *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMeshAttachment_getInternalPtr(PYMeshAttachment *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *MeshAttachment_clear(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_setType(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			self->ptr.setType((MeshAttachment::Type)type);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::setType(): unknown arguments:\n(MeshAttachment.Type type) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getType(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getType(): unknown arguments:\n(void) -> MeshAttachment::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getTypeName(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(MeshAttachment::getTypeName((MeshAttachment::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getTypeName(): unknown arguments:\n(MeshAttachment.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_isUnknown(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnknown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::isUnknown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_isLight(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isLight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::isLight(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_isCamera(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCamera());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::isCamera(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_setName(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getName(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_setNode(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "node", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &node_, &check)) {
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			self->ptr.setNode(node, (check != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::setNode(): unknown arguments:\n(MeshNode node, bool check) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getNode(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getNode());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyMeshNode_new(self->ptr.getNode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getNode(): unknown arguments:\n(void) -> const MeshNode\n(void) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_setData(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *data = nullptr;
		static const char *kwlist[] = { "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &data)) {
			self->ptr.setData(data);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *data_ = nullptr;
			static const char *kwlist[] = { "data", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &data_)) {
				if(!isPYString(data_)) break;
				const String &data = (data_) ? ((PyUnicode_Check(data_)) ? String(PyUnicode_AsUTF8(data_)) : (String)pyString_get(data_)) : String::null;
				self->ptr.setData(data);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::setData(): unknown arguments:\n(const char* data) -> void\n(const String data) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getData(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getData().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getData(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_clearParameters(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearParameters();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::clearParameters(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_removeParameter(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.removeParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::removeParameter(): unknown arguments:\n(const char* type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_copyParameters(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		PyObject *attachment_ = nullptr;
		static const char *kwlist[] = { "attachment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attachment_)) {
			if(!isPYMeshAttachment(attachment_)) break;
			const MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			self->ptr.copyParameters(attachment);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::copyParameters(): unknown arguments:\n(const MeshAttachment attachment) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_findParameter(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromUnsignedLong(self->ptr.findParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::findParameter(): unknown arguments:\n(const char* type) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_hasParameter(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasParameter(type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::hasParameter(): unknown arguments:\n(const char* type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getNumParameters(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumParameters());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getNumParameters(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterType(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getParameterType(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterType(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_addParameter(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		const char *type = nullptr;
		int32_t value = {};
		static const char *kwlist[] = { "type", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &type, &value)) {
			self->ptr.addParameter(type, (value != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			float32_t value = {};
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sf", (char**)kwlist, &type, &value)) {
				self->ptr.addParameter(type, value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *vector_ = nullptr;
			static const char *kwlist[] = { "type", "vector", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &vector_)) {
				if(!isPYVector4f(vector_)) break;
				const Vector4f &vector = pyVector4f_get(vector_);
				self->ptr.addParameter(type, vector);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "type", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.addParameter(type, color);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "type", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &type, &name)) {
				self->ptr.addParameter(type, name);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "type", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &type, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.addParameter(type, name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::addParameter(): unknown arguments:\n(const char* type, bool value) -> void\n(const char* type, float32_t value) -> void\n(const char* type, const Vector4f vector) -> void\n(const char* type, const Color color) -> void\n(const char* type, const char* name) -> void\n(const char* type, const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterFlags(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getParameterFlags(index));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &type)) {
				return PyLong_FromUnsignedLong(self->ptr.getParameterFlags(type));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterFlags(): unknown arguments:\n(uint32_t index) -> MeshAttachment::Flags\n(const char* type) -> MeshAttachment::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_hasParameterFlag(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return PyLong_FromLong(self->ptr.hasParameterFlag(index, (MeshAttachment::Flags)flags));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "type", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &type, &flags)) {
				return PyLong_FromLong(self->ptr.hasParameterFlag(type, (MeshAttachment::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::hasParameterFlag(): unknown arguments:\n(uint32_t index, MeshAttachment.Flags flags) -> bool\n(const char* type, MeshAttachment.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_hasParameterFlags(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return PyLong_FromLong(self->ptr.hasParameterFlags(index, (MeshAttachment::Flags)flags));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "type", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &type, &flags)) {
				return PyLong_FromLong(self->ptr.hasParameterFlags(type, (MeshAttachment::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::hasParameterFlags(): unknown arguments:\n(uint32_t index, MeshAttachment.Flags flags) -> bool\n(const char* type, MeshAttachment.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterBool(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t value = false;
		static const char *kwlist[] = { "index", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &index, &value)) {
			return PyLong_FromLong(self->ptr.getParameterBool(index, (value != 0)));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			int32_t value = false;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &type, &value)) {
				return PyLong_FromLong(self->ptr.getParameterBool(type, (value != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterBool(): unknown arguments:\n(uint32_t index, bool value) -> bool\n(const char* type, bool value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterScalarf32(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t value = 0.0f;
		static const char *kwlist[] = { "index", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|f", (char**)kwlist, &index, &value)) {
			return PyFloat_FromDouble(self->ptr.getParameterScalarf32(index, value));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			float32_t value = 0.0f;
			static const char *kwlist[] = { "type", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|f", (char**)kwlist, &type, &value)) {
				return PyFloat_FromDouble(self->ptr.getParameterScalarf32(type, value));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterScalarf32(): unknown arguments:\n(uint32_t index, float32_t value) -> float32_t\n(const char* type, float32_t value) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterVector4f(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *vector_ = nullptr;
		static const char *kwlist[] = { "index", "vector", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &vector_)) {
			const Vector4f &vector = pyVector4f_get(vector_);
			return pyVector4f_new(self->ptr.getParameterVector4f(index, vector));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *vector_ = nullptr;
			static const char *kwlist[] = { "type", "vector", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &vector_)) {
				const Vector4f &vector = pyVector4f_get(vector_);
				return pyVector4f_new(self->ptr.getParameterVector4f(type, vector));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterVector4f(): unknown arguments:\n(uint32_t index, const Vector4f vector) -> const Vector4f\n(const char* type, const Vector4f vector) -> const Vector4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterColor(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "index", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &color_)) {
			const Color &color = pyColor_get(color_);
			return pyColor_new(self->ptr.getParameterColor(index, color));
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "type", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &color_)) {
				const Color &color = pyColor_get(color_);
				return pyColor_new(self->ptr.getParameterColor(type, color));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterColor(): unknown arguments:\n(uint32_t index, const Color color) -> const Color\n(const char* type, const Color color) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getParameterName(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *name_ = nullptr;
		static const char *kwlist[] = { "index", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &index, &name_)) {
			const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
			return PyUnicode_FromString(self->ptr.getParameterName(index, name).get());
		}
		PyErr_Clear();
		{
			const char *type = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "type", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &type, &name_)) {
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyUnicode_FromString(self->ptr.getParameterName(type, name).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getParameterName(): unknown arguments:\n(uint32_t index, const String name) -> String\n(const char* type, const String name) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_setTransform(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		PyObject *scale_ = nullptr;
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
			if(!isPYVector3f(scale_)) break;
			const Vector3f &scale = pyVector3f_get(scale_);
			self->ptr.setTransform(scale);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *transform_ = nullptr;
			static const char *kwlist[] = { "transform", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
				if(!isPYMatrix4x3f(transform_)) break;
				const Matrix4x3f &transform = pyMatrix4x3f_get(transform_);
				self->ptr.setTransform(transform);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::setTransform(): unknown arguments:\n(const Vector3f scale) -> void\n(const Matrix4x3f transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getTransform(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x3f_new(self->ptr.getTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getTransform(): unknown arguments:\n(void) -> const Matrix4x3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_compare(PYMeshAttachment *self, PyObject *args, PyObject *kwargs) {
		PyObject *attachment_ = nullptr;
		static const char *kwlist[] = { "attachment", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &attachment_)) {
			if(!isPYMeshAttachment(attachment_)) break;
			const MeshAttachment &attachment = pyMeshAttachment_get(attachment_);
			return PyLong_FromLong(self->ptr.compare(attachment));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::compare(): unknown arguments:\n(const MeshAttachment attachment) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_getMemory(PYMeshAttachment *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshAttachment::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshAttachment_get_type(PYMeshAttachment *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *MeshAttachment_get_name(PYMeshAttachment *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *MeshAttachment_get_node(PYMeshAttachment *self, void *offset) {
		return pyMeshNode_new(self->ptr.getNode());
	}
	static PyObject *MeshAttachment_get_data(PYMeshAttachment *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getData().get());
	}
	static PyObject *MeshAttachment_get_num_parameters(PYMeshAttachment *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumParameters());
	}
	static PyObject *MeshAttachment_get_transform(PYMeshAttachment *self, void *offset) {
		return pyMatrix4x3f_new(self->ptr.getTransform());
	}
	static PyObject *MeshAttachment_get_memory(PYMeshAttachment *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshAttachment_str(PYMeshAttachment *self) {
		return PyUnicode_FromString(String::format("MeshAttachment Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMeshAttachment_bool(PYMeshAttachment *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Mesh
	TS_PYAPI bool isPYMesh(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMesh_Type);
	}
	TS_PYAPI Mesh &pyMesh_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMesh_Type) return ((PYMesh*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Mesh_get(): can't get Mesh from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Mesh_get(): can't get Mesh from None");
		static Mesh ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMesh_new(const Mesh &ptr) {
		PYMesh *ret = (PYMesh*)PyObject_New(PYMesh, &PYMesh_Type);
		new(&ret->ptr) Mesh(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMesh_new(Mesh &&ptr) {
		PYMesh *ret = (PYMesh*)PyObject_New(PYMesh, &PYMesh_Type);
		new(&ret->ptr) Mesh(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyMesh_init(PYMesh *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Mesh();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::Mesh(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMesh_dealloc(PYMesh *self) {
		self->ptr.~Mesh();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMesh_equalPtr(PYMesh *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMesh_clonePtr(PYMesh *self, PyObject *args) {
		return pyMesh_new(self->ptr.clonePtr());
	}
	static PyObject *pyMesh_clearPtr(PYMesh *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMesh_destroyPtr(PYMesh *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMesh_acquirePtr(PYMesh *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMesh_unacquirePtr(PYMesh *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMesh_isValidPtr(PYMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMesh_isOwnerPtr(PYMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMesh_isConstPtr(PYMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMesh_getCountPtr(PYMesh *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMesh_getInternalPtr(PYMesh *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Mesh_clear(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_isLoaded(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isLoaded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::isLoaded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_info(PYMesh *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Mesh::FlagNone;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "name", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IO", (char**)kwlist, &name, &flags, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.info(name, (Mesh::Flags)flags, async));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &name_, &flags, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, (Mesh::Flags)flags, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &stream_, &flags, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(stream, (Mesh::Flags)flags, async));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &async_)) {
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &name_, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &stream_, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.info(stream, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::info(): unknown arguments:\n(const char* name, Mesh.Flags flags, Async* async) -> bool\n(const String name, Mesh.Flags flags, Async* async) -> bool\n(Stream stream, Mesh.Flags flags, Async* async) -> bool\n(const char* name, Async* async) -> bool\n(const String name, Async* async) -> bool\n(Stream stream, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_load(PYMesh *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Mesh::FlagNone;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "name", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IO", (char**)kwlist, &name, &flags, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.load(name, (Mesh::Flags)flags, async));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &name_, &flags, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, (Mesh::Flags)flags, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &stream_, &flags, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(stream, (Mesh::Flags)flags, async));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &async_)) {
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &name_, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(name, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &stream_, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				if(!isPYAsync(async_)) break;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(stream, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::load(): unknown arguments:\n(const char* name, Mesh.Flags flags, Async* async) -> bool\n(const String name, Mesh.Flags flags, Async* async) -> bool\n(Stream stream, Mesh.Flags flags, Async* async) -> bool\n(const char* name, Async* async) -> bool\n(const String name, Async* async) -> bool\n(Stream stream, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_save(PYMesh *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Mesh::FlagNone;
		static const char *kwlist[] = { "name", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &name, &flags)) {
			return PyLong_FromLong(self->ptr.save(name, (Mesh::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			static const char *kwlist[] = { "name", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &name_, &flags)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.save(name, (Mesh::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Mesh::FlagNone;
			static const char *kwlist[] = { "stream", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &stream_, &flags)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.save(stream, (Mesh::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::save(): unknown arguments:\n(const char* name, Mesh.Flags flags) -> bool\n(const String name, Mesh.Flags flags) -> bool\n(Stream stream, Mesh.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_setName(PYMesh *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getName(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_setBasis(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t front = 0;
		uint32_t right = 0;
		uint32_t up = 0;
		static const char *kwlist[] = { "front", "right", "up", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &front, &right, &up)) {
			return PyLong_FromLong(self->ptr.setBasis((Mesh::Axis)front, (Mesh::Axis)right, (Mesh::Axis)up));
		}
		PyErr_Clear();
		{
			uint32_t basis = 0;
			static const char *kwlist[] = { "basis", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &basis)) {
				return PyLong_FromLong(self->ptr.setBasis((Mesh::Basis)basis));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::setBasis(): unknown arguments:\n(Mesh.Axis front, Mesh.Axis right, Mesh.Axis up) -> bool\n(Mesh.Basis basis) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getFrontAxis(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFrontAxis());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getFrontAxis(): unknown arguments:\n(void) -> Mesh::Axis\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getRightAxis(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getRightAxis());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getRightAxis(): unknown arguments:\n(void) -> Mesh::Axis\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getUpAxis(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getUpAxis());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getUpAxis(): unknown arguments:\n(void) -> Mesh::Axis\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getBasis(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBasis());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getBasis(): unknown arguments:\n(void) -> Mesh::Basis\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getFrontAxisName(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFrontAxisName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getFrontAxisName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getRightAxisName(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getRightAxisName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getRightAxisName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getUpAxisName(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getUpAxisName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getUpAxisName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getBasisName(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getBasisName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getBasisName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_clearNodes(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearNodes();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::clearNodes(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_reserveNodes(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_nodes = {};
		static const char *kwlist[] = { "num_nodes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_nodes)) {
			self->ptr.reserveNodes(num_nodes);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::reserveNodes(): unknown arguments:\n(uint32_t num_nodes) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_addNode(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "node", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &node_, &check)) {
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			return PyLong_FromUnsignedLong(self->ptr.addNode(node, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::addNode(): unknown arguments:\n(MeshNode node, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_removeNode(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			return PyLong_FromLong(self->ptr.removeNode(node));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::removeNode(): unknown arguments:\n(MeshNode node) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_findNode(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
			if(!isPYMeshNode(node_)) break;
			const MeshNode &node = pyMeshNode_get(node_);
			return PyLong_FromUnsignedLong(self->ptr.findNode(node));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findNode(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::findNode(): unknown arguments:\n(const MeshNode node) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNumNodes(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumNodes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNumNodes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNodes(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getNodes();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshNode_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getNodes();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshNode_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNodes(): unknown arguments:\n(void) -> const Array<MeshNode>\n(void) -> Array<MeshNode>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNode(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshNode_new(self->ptr.getNode(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshNode_new(self->ptr.getNode(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNode(): unknown arguments:\n(uint32_t index) -> const MeshNode\n(uint32_t index) -> MeshNode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createLocalTransforms(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *itransform_ = nullptr;
		static const char *kwlist[] = { "itransform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &itransform_)) {
			const Matrix4x3d &itransform = pyMatrix4x3d_get(itransform_);
			self->ptr.createLocalTransforms(itransform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createLocalTransforms(): unknown arguments:\n(const Matrix4x3d itransform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createGlobalTransforms(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &transform_)) {
			const Matrix4x3d &transform = pyMatrix4x3d_get(transform_);
			self->ptr.createGlobalTransforms(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createGlobalTransforms(): unknown arguments:\n(const Matrix4x3d transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_clearGeometries(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearGeometries();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::clearGeometries(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_reserveGeometries(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_geometries = {};
		static const char *kwlist[] = { "num_geometries", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_geometries)) {
			self->ptr.reserveGeometries(num_geometries);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::reserveGeometries(): unknown arguments:\n(uint32_t num_geometries) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_addGeometry(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		PyObject *node_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "geometry", "node", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &geometry_, &node_, &check)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			if(!isPYMeshNode(node_)) break;
			MeshNode &node = pyMeshNode_get(node_);
			return PyLong_FromUnsignedLong(self->ptr.addGeometry(geometry, node, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *geometry_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "geometry", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &geometry_, &check)) {
				if(!isPYMeshGeometry(geometry_)) break;
				MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				return PyLong_FromUnsignedLong(self->ptr.addGeometry(geometry, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::addGeometry(): unknown arguments:\n(MeshGeometry geometry, MeshNode node, bool check) -> uint32_t\n(MeshGeometry geometry, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_removeGeometry(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromLong(self->ptr.removeGeometry(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::removeGeometry(): unknown arguments:\n(MeshGeometry geometry) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_replaceGeometry(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_geometry_ = nullptr;
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "old_geometry", "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_geometry_, &geometry_)) {
			if(!isPYMeshGeometry(old_geometry_)) break;
			MeshGeometry &old_geometry = pyMeshGeometry_get(old_geometry_);
			if(!isPYMeshGeometry(geometry_)) break;
			MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromLong(self->ptr.replaceGeometry(old_geometry, geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::replaceGeometry(): unknown arguments:\n(MeshGeometry old_geometry, MeshGeometry geometry) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_findGeometry(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *geometry_ = nullptr;
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
			if(!isPYMeshGeometry(geometry_)) break;
			const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
			return PyLong_FromUnsignedLong(self->ptr.findGeometry(geometry));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findGeometry(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::findGeometry(): unknown arguments:\n(const MeshGeometry geometry) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNumGeometries(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNumGeometries(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getGeometries(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getGeometries();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getGeometries();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshGeometry_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getGeometries(): unknown arguments:\n(void) -> const Array<MeshGeometry>\n(void) -> Array<MeshGeometry>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getGeometry(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshGeometry_new(self->ptr.getGeometry(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshGeometry_new(self->ptr.getGeometry(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getGeometry(): unknown arguments:\n(uint32_t index) -> const MeshGeometry\n(uint32_t index) -> MeshGeometry\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_hasGeometryIndices(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasGeometryIndices((MeshIndices::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::hasGeometryIndices(): unknown arguments:\n(MeshIndices.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_hasGeometryAttribute(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasGeometryAttribute((MeshAttribute::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::hasGeometryAttribute(): unknown arguments:\n(MeshAttribute.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNumGeometryPositions(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getNumGeometryPositions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNumGeometryPositions(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNumGeometryPrimitives(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getNumGeometryPrimitives());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNumGeometryPrimitives(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_clearAnimations(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearAnimations();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::clearAnimations(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_reserveAnimations(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_animations = {};
		static const char *kwlist[] = { "num_animations", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_animations)) {
			self->ptr.reserveAnimations(num_animations);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::reserveAnimations(): unknown arguments:\n(uint32_t num_animations) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_addAnimation(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *animation_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "animation", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &animation_, &check)) {
			if(!isPYMeshAnimation(animation_)) break;
			MeshAnimation &animation = pyMeshAnimation_get(animation_);
			return PyLong_FromUnsignedLong(self->ptr.addAnimation(animation, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::addAnimation(): unknown arguments:\n(MeshAnimation animation, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_removeAnimation(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *animation_ = nullptr;
		static const char *kwlist[] = { "animation", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &animation_)) {
			if(!isPYMeshAnimation(animation_)) break;
			MeshAnimation &animation = pyMeshAnimation_get(animation_);
			return PyLong_FromLong(self->ptr.removeAnimation(animation));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::removeAnimation(): unknown arguments:\n(MeshAnimation animation) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_replaceAnimation(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *old_animation_ = nullptr;
		PyObject *animation_ = nullptr;
		static const char *kwlist[] = { "old_animation", "animation", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &old_animation_, &animation_)) {
			if(!isPYMeshAnimation(old_animation_)) break;
			MeshAnimation &old_animation = pyMeshAnimation_get(old_animation_);
			if(!isPYMeshAnimation(animation_)) break;
			MeshAnimation &animation = pyMeshAnimation_get(animation_);
			return PyLong_FromLong(self->ptr.replaceAnimation(old_animation, animation));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::replaceAnimation(): unknown arguments:\n(MeshAnimation old_animation, MeshAnimation animation) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_findAnimation(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *animation_ = nullptr;
		static const char *kwlist[] = { "animation", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &animation_)) {
			if(!isPYMeshAnimation(animation_)) break;
			const MeshAnimation &animation = pyMeshAnimation_get(animation_);
			return PyLong_FromUnsignedLong(self->ptr.findAnimation(animation));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return PyLong_FromUnsignedLong(self->ptr.findAnimation(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::findAnimation(): unknown arguments:\n(const MeshAnimation animation) -> uint32_t\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getNumAnimations(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAnimations());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getNumAnimations(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getAnimations(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAnimations();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAnimation_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getAnimations();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyMeshAnimation_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getAnimations(): unknown arguments:\n(void) -> const Array<MeshAnimation>\n(void) -> Array<MeshAnimation>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getAnimation(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyMeshAnimation_new(self->ptr.getAnimation(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyMeshAnimation_new(self->ptr.getAnimation(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getAnimation(): unknown arguments:\n(uint32_t index) -> const MeshAnimation\n(uint32_t index) -> MeshAnimation\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getBoundBox(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *node_ = nullptr;
		static const char *kwlist[] = { "node", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &node_)) {
			if(!isPYMeshNode(node_)) break;
			const MeshNode &node = pyMeshNode_get(node_);
			return pyBoundBoxd_new(self->ptr.getBoundBox(node));
		}
		PyErr_Clear();
		{
			PyObject *geometry_ = nullptr;
			static const char *kwlist[] = { "geometry", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &geometry_)) {
				if(!isPYMeshGeometry(geometry_)) break;
				const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				return pyBoundBoxd_new(self->ptr.getBoundBox(geometry));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyBoundBoxd_new(self->ptr.getBoundBox());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getBoundBox(): unknown arguments:\n(const MeshNode node) -> BoundBoxd\n(const MeshGeometry geometry) -> BoundBoxd\n(void) -> BoundBoxd\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createBounds(PYMesh *self, PyObject *args, PyObject *kwargs) {
		int32_t force = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "force", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|O", (char**)kwlist, &force, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.createBounds((force != 0), async));
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createBounds(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createBounds(): unknown arguments:\n(bool force, Async* async) -> bool\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createBasis(PYMesh *self, PyObject *args, PyObject *kwargs) {
		float32_t angle = {};
		int32_t force = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "angle", "force", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fi|O", (char**)kwlist, &angle, &force, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.createBasis(angle, (force != 0), async));
		}
		PyErr_Clear();
		{
			int32_t force = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "force", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|O", (char**)kwlist, &force, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createBasis((force != 0), async));
			}
		}
		PyErr_Clear();
		{
			float32_t angle = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "angle", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|O", (char**)kwlist, &angle, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createBasis(angle, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createBasis(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createBasis(): unknown arguments:\n(float32_t angle, bool force, Async* async) -> bool\n(bool force, Async* async) -> bool\n(float32_t angle, Async* async) -> bool\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createNormals(PYMesh *self, PyObject *args, PyObject *kwargs) {
		float32_t angle = {};
		int32_t force = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "angle", "force", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fi|O", (char**)kwlist, &angle, &force, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.createNormals(angle, (force != 0), async));
		}
		PyErr_Clear();
		{
			int32_t force = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "force", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|O", (char**)kwlist, &force, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createNormals((force != 0), async));
			}
		}
		PyErr_Clear();
		{
			float32_t angle = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "angle", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|O", (char**)kwlist, &angle, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createNormals(angle, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createNormals(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createNormals(): unknown arguments:\n(float32_t angle, bool force, Async* async) -> bool\n(bool force, Async* async) -> bool\n(float32_t angle, Async* async) -> bool\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createTangents(PYMesh *self, PyObject *args, PyObject *kwargs) {
		int32_t force = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "force", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|O", (char**)kwlist, &force, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.createTangents((force != 0), async));
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createTangents(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createTangents(): unknown arguments:\n(bool force, Async* async) -> bool\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_createIslands(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t max_attributes = {};
		uint32_t max_primitives = {};
		int32_t force = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "max_attributes", "max_primitives", "force", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi|O", (char**)kwlist, &max_attributes, &max_primitives, &force, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.createIslands(max_attributes, max_primitives, (force != 0), async));
		}
		PyErr_Clear();
		{
			uint32_t max_attributes = {};
			uint32_t max_primitives = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "max_attributes", "max_primitives", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|O", (char**)kwlist, &max_attributes, &max_primitives, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.createIslands(max_attributes, max_primitives, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::createIslands(): unknown arguments:\n(uint32_t max_attributes, uint32_t max_primitives, bool force, Async* async) -> bool\n(uint32_t max_attributes, uint32_t max_primitives, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeIndices(PYMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t cache = {};
		int32_t transparent = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "cache", "transparent", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|O", (char**)kwlist, &cache, &transparent, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.optimizeIndices(cache, (transparent != 0), async));
		}
		PyErr_Clear();
		{
			uint32_t cache = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "cache", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|O", (char**)kwlist, &cache, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.optimizeIndices(cache, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.optimizeIndices(async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeIndices(): unknown arguments:\n(uint32_t cache, bool transparent, Async* async) -> bool\n(uint32_t cache, Async* async) -> bool\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeAttributes(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|O", (char**)kwlist, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.optimizeAttributes(async));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeAttributes(): unknown arguments:\n(Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeMaterials(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.optimizeMaterials();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeMaterials(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeWinding(PYMesh *self, PyObject *args, PyObject *kwargs) {
		int32_t clockwise = false;
		static const char *kwlist[] = { "clockwise", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &clockwise)) {
			return PyLong_FromLong(self->ptr.optimizeWinding((clockwise != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeWinding(): unknown arguments:\n(bool clockwise) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeGeometries(PYMesh *self, PyObject *args, PyObject *kwargs) {
		float32_t threshold = 1e-3f;
		uint32_t depth = 16;
		static const char *kwlist[] = { "threshold", "depth", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|fI", (char**)kwlist, &threshold, &depth)) {
			self->ptr.optimizeGeometries(threshold, depth);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeGeometries(): unknown arguments:\n(float32_t threshold, uint32_t depth) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeAnimations(PYMesh *self, PyObject *args, PyObject *kwargs) {
		float32_t threshold = 1e-6f;
		static const char *kwlist[] = { "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|f", (char**)kwlist, &threshold)) {
			self->ptr.optimizeAnimations(threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeAnimations(): unknown arguments:\n(float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_optimizeOrder(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.optimizeOrder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::optimizeOrder(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_mergeGeometries(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.mergeGeometries();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::mergeGeometries(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_packAttributes(PYMesh *self, PyObject *args, PyObject *kwargs) {
		int32_t remove = true;
		static const char *kwlist[] = { "remove", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &remove)) {
			return PyLong_FromLong(self->ptr.packAttributes((remove != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::packAttributes(): unknown arguments:\n(bool remove) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_unpackAttributes(PYMesh *self, PyObject *args, PyObject *kwargs) {
		int32_t remove = true;
		static const char *kwlist[] = { "remove", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &remove)) {
			return PyLong_FromLong(self->ptr.unpackAttributes((remove != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::unpackAttributes(): unknown arguments:\n(bool remove) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_setTransform(PYMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *scale_ = nullptr;
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scale_)) {
			if(!isPYVector3d(scale_)) break;
			const Vector3d &scale = pyVector3d_get(scale_);
			return PyLong_FromLong(self->ptr.setTransform(scale));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::setTransform(): unknown arguments:\n(const Vector3d scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_getMemory(PYMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Mesh::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Mesh_get_name(PYMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Mesh_get_front_axis(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFrontAxis());
	}
	static PyObject *Mesh_get_right_axis(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getRightAxis());
	}
	static PyObject *Mesh_get_up_axis(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getUpAxis());
	}
	static PyObject *Mesh_get_basis(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBasis());
	}
	static PyObject *Mesh_get_front_axis_name(PYMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFrontAxisName());
	}
	static PyObject *Mesh_get_right_axis_name(PYMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getRightAxisName());
	}
	static PyObject *Mesh_get_up_axis_name(PYMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getUpAxisName());
	}
	static PyObject *Mesh_get_basis_name(PYMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getBasisName().get());
	}
	static PyObject *Mesh_get_num_nodes(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumNodes());
	}
	static PyObject *Mesh_get_num_geometries(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
	}
	static PyObject *Mesh_get_num_geometry_positions(PYMesh *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getNumGeometryPositions());
	}
	static PyObject *Mesh_get_num_geometry_primitives(PYMesh *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getNumGeometryPrimitives());
	}
	static PyObject *Mesh_get_num_animations(PYMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumAnimations());
	}
	static PyObject *Mesh_get_bound_box(PYMesh *self, void *offset) {
		return pyBoundBoxd_new(self->ptr.getBoundBox());
	}
	static PyObject *Mesh_get_memory(PYMesh *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMesh_str(PYMesh *self) {
		return PyUnicode_FromString(String::format("Mesh Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMesh_bool(PYMesh *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Json
	TS_PYAPI bool isPYJson(PyObject *object) {
		return (object && Py_TYPE(object) == &PYJson_Type);
	}
	TS_PYAPI Json &pyJson_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYJson_Type) return ((PYJson*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Json_get(): can't get Json from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Json_get(): can't get Json from None");
		static Json ret;
		return ret;
	}
	TS_PYAPI PyObject *pyJson_new(const Json &ptr) {
		PYJson *ret = (PYJson*)PyObject_New(PYJson, &PYJson_Type);
		new(&ret->ptr) Json(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyJson_new(Json &&ptr) {
		PYJson *ret = (PYJson*)PyObject_New(PYJson, &PYJson_Type);
		new(&ret->ptr) Json(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyJson_init(PYJson *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Json();
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			static const char *kwlist[] = { "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
				new(&self->ptr) Json((Json::Type)type);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t type = Json::TypeUnknown;
			static const char *kwlist[] = { "name", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &name, &type)) {
				new(&self->ptr) Json(name, (Json::Type)type);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t type = Json::TypeUnknown;
			static const char *kwlist[] = { "name", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &name_, &type)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) Json(name, (Json::Type)type);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *name = nullptr;
			uint32_t type = Json::TypeUnknown;
			static const char *kwlist[] = { "parent", "name", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os|I", (char**)kwlist, &parent_, &name, &type)) {
				if(!isPYJson(parent_)) break;
				Json *parent = (parent_) ? &pyJson_get(parent_) : nullptr;
				new(&self->ptr) Json(parent, name, (Json::Type)type);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *name_ = nullptr;
			uint32_t type = Json::TypeUnknown;
			static const char *kwlist[] = { "parent", "name", "type", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &parent_, &name_, &type)) {
				if(!isPYJson(parent_)) break;
				Json *parent = (parent_) ? &pyJson_get(parent_) : nullptr;
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) Json(parent, name, (Json::Type)type);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::Json(): unknown arguments:\n(void)\n(Json.Type type)\n(const char* name, Json.Type type)\n(const String name, Json.Type type)\n(Json* parent, const char* name, Json.Type type)\n(Json* parent, const String name, Json.Type type)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyJson_dealloc(PYJson *self) {
		self->ptr.~Json();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyJson_equalPtr(PYJson *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyJson_clonePtr(PYJson *self, PyObject *args) {
		return pyJson_new(self->ptr.clonePtr());
	}
	static PyObject *pyJson_clearPtr(PYJson *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyJson_destroyPtr(PYJson *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyJson_acquirePtr(PYJson *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyJson_unacquirePtr(PYJson *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyJson_isValidPtr(PYJson *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyJson_isOwnerPtr(PYJson *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyJson_isConstPtr(PYJson *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyJson_getCountPtr(PYJson *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyJson_getInternalPtr(PYJson *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Json_clear(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_create(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		size_t size = 0;
		int32_t owner = false;
		static const char *kwlist[] = { "str", "size", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|ni", (char**)kwlist, &str, &size, &owner)) {
			return PyLong_FromLong(self->ptr.create(str, size, (owner != 0)));
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			size_t size = 0;
			int32_t owner = false;
			static const char *kwlist[] = { "str", "size", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|ni", (char**)kwlist, &str_, &size, &owner)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyLong_FromLong(self->ptr.create(str, size, (owner != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::create(): unknown arguments:\n(const char* str, size_t size, bool owner) -> bool\n(const String str, size_t size, bool owner) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_load(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.load(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.load(name));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			static const char *kwlist[] = { "stream", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.load(stream));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::load(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_save(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t compact = false;
		static const char *kwlist[] = { "name", "compact", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &compact)) {
			return PyLong_FromLong(self->ptr.save(name, (compact != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t compact = false;
			static const char *kwlist[] = { "name", "compact", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &name_, &compact)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.save(name, (compact != 0)));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			int32_t compact = false;
			static const char *kwlist[] = { "stream", "compact", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &stream_, &compact)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.save(stream, (compact != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::save(): unknown arguments:\n(const char* name, bool compact) -> bool\n(const String name, bool compact) -> bool\n(Stream stream, bool compact) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getRoot(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyJson_new(self->ptr.getRoot());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyJson_new(self->ptr.getRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getRoot(): unknown arguments:\n(void) -> const Json\n(void) -> Json\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_setParent(PYJson *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "parent", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &check)) {
			if(!isPYJson(parent_)) break;
			Json &parent = pyJson_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent(parent, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::setParent(): unknown arguments:\n(Json parent, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getParent(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyJson_new(self->ptr.getParent());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyJson_new(self->ptr.getParent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getParent(): unknown arguments:\n(void) -> const Json\n(void) -> Json\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_addChild(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t type = Json::TypeUnknown;
		int32_t check = true;
		static const char *kwlist[] = { "name", "type", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|Ii", (char**)kwlist, &name, &type, &check)) {
			return pyJson_new(self->ptr.addChild(name, (Json::Type)type, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *child_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "child", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &child_, &check)) {
				if(!isPYJson(child_)) break;
				Json &child = pyJson_get(child_);
				return PyLong_FromUnsignedLong(self->ptr.addChild(child, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::addChild(): unknown arguments:\n(const char* name, Json.Type type, bool check) -> Json\n(Json child, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_removeChild(PYJson *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYJson(child_)) break;
			Json &child = pyJson_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::removeChild(): unknown arguments:\n(Json child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_releaseChildren(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_findChild(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(self->ptr.findChild(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::findChild(): unknown arguments:\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isChild(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isChild(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isChild(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getChild(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return pyJson_new(self->ptr.getChild(name));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return pyJson_new(self->ptr.getChild(name));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyJson_new(self->ptr.getChild(index));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyJson_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getChild(): unknown arguments:\n(const char* name) -> const Json\n(const char* name) -> Json\n(uint32_t index) -> const Json\n(uint32_t index) -> Json\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getNumChildren(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getChildren(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyJson_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyJson_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getChildren(): unknown arguments:\n(void) -> const Array<Json>\n(void) -> Array<Json>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getPathName(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPathName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getPathName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_setName(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::setName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getName(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_setType(PYJson *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			self->ptr.setType((Json::Type)type);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::setType(): unknown arguments:\n(Json.Type type) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getType(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getType(): unknown arguments:\n(void) -> Json::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getTypeName(PYJson *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Json::getTypeName((Json::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getTypeName(): unknown arguments:\n(Json.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isUnknown(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnknown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isUnknown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isNull(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNull());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isNull(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isBool(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBool());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isBool(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isNumber(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNumber());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isNumber(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isString(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isString());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isString(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isObject(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isObject());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isObject(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_isArray(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isArray());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::isArray(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_setData(PYJson *self, PyObject *args, PyObject *kwargs) {
		const float32_t *values = nullptr;
		uint32_t size = {};
		uint32_t digits = 6;
		int32_t compact = true;
		int32_t exponent = true;
		static const char *kwlist[] = { "values", "size", "digits", "compact", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|Iii", (char**)kwlist, &values, &size, &digits, &compact, &exponent)) {
			self->ptr.setData(values, size, digits, (compact != 0), (exponent != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const float64_t *values = nullptr;
			uint32_t size = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "values", "size", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|Iii", (char**)kwlist, &values, &size, &digits, &compact, &exponent)) {
				self->ptr.setData(values, size, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			float32_t value = {};
			uint32_t digits = 6;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				self->ptr.setData(value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			float64_t value = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				self->ptr.setData(value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				self->ptr.setData(values, size, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				self->ptr.setData(values, size, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			int32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &values_, &size)) {
				const char **values; Array<const char*> values__;
				pyArray_get(values_, values__); values = values__.get();
				self->ptr.setData(values, size);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &values_, &size)) {
				if(!isPYString(values_)) break;
				const String *values = (values_) ? &pyString_get(values_) : nullptr;
				self->ptr.setData(values, size);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			int32_t value = {};
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &value)) {
				self->ptr.setData((value != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *value = nullptr;
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &value)) {
				self->ptr.setData(value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &value_)) {
				if(!isPYString(value_)) break;
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				self->ptr.setData(value);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::setData(): unknown arguments:\n(const float32_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent) -> void\n(const float64_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent) -> void\n(float32_t value, uint32_t digits, bool compact, bool exponent) -> void\n(float64_t value, uint32_t digits, bool compact, bool exponent) -> void\n(const int32_t* values, uint32_t size, uint32_t radix) -> void\n(const uint32_t* values, uint32_t size, uint32_t radix) -> void\n(int32_t value, uint32_t radix) -> void\n(uint32_t value, uint32_t radix) -> void\n(uint64_t value, uint32_t radix) -> void\n(const char** values, uint32_t size) -> void\n(const String* values, uint32_t size) -> void\n(bool value) -> void\n(const char* value) -> void\n(const String value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getData(PYJson *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "name", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "si|I", (char**)kwlist, &name, &value, &radix)) {
			return PyLong_FromLong(self->ptr.getData(name, value, radix));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sK|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLongLong(self->ptr.getData(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size, radix));
			}
		}
		PyErr_Clear();
		{
			uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			int32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &name, &value)) {
				return PyLong_FromLong(self->ptr.getData(name, (value != 0)));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sf", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getData(name, value));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float64_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sd", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getData(name, value));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &name, &value_)) {
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				return PyUnicode_FromString(self->ptr.getData(name, value).get());
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &values_, &size)) {
				if(!isPYString(values_)) break;
				String *values = (values_) ? &pyString_get(values_) : nullptr;
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		{
			float32_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		{
			float64_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getData().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getData(): unknown arguments:\n(const char* name, int32_t value, uint32_t radix) -> int32_t\n(const char* name, uint32_t value, uint32_t radix) -> uint32_t\n(const char* name, uint64_t value, uint32_t radix) -> uint64_t\n(int32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(uint32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(const char* name, bool value) -> bool\n(const char* name, float32_t value) -> float32_t\n(const char* name, float64_t value) -> float64_t\n(const char* name, const String value) -> String\n(String* values, uint32_t size) -> uint32_t\n(float32_t* values, uint32_t size) -> uint32_t\n(float64_t* values, uint32_t size) -> uint32_t\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDataBool(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDataBool());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDataBool(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDatai32(PYJson *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromLong(self->ptr.getDatai32(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDatai32(): unknown arguments:\n(uint32_t radix) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDatau32(PYJson *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromUnsignedLong(self->ptr.getDatau32(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDatau32(): unknown arguments:\n(uint32_t radix) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDatau64(PYJson *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getDatau64(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDatau64(): unknown arguments:\n(uint32_t radix) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDataf32(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDataf32());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDataf32(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getDataf64(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDataf64());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getDataf64(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getNumber(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getNumber().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getNumber(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_getString(PYJson *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getString().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Json::getString(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Json_get_root(PYJson *self, void *offset) {
		return pyJson_new(self->ptr.getRoot());
	}
	static PyObject *Json_get_parent(PYJson *self, void *offset) {
		return pyJson_new(self->ptr.getParent());
	}
	static PyObject *Json_get_num_children(PYJson *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *Json_get_path_name(PYJson *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPathName().get());
	}
	static PyObject *Json_get_name(PYJson *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Json_get_type(PYJson *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Json_get_data(PYJson *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getData().get());
	}
	static PyObject *Json_get_data_bool(PYJson *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDataBool());
	}
	static PyObject *Json_get_datai32(PYJson *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDatai32());
	}
	static PyObject *Json_get_datau32(PYJson *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDatau32());
	}
	static PyObject *Json_get_datau64(PYJson *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getDatau64());
	}
	static PyObject *Json_get_dataf32(PYJson *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDataf32());
	}
	static PyObject *Json_get_dataf64(PYJson *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDataf64());
	}
	static PyObject *Json_get_number(PYJson *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getNumber().get());
	}
	static PyObject *Json_get_string(PYJson *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getString().get());
	}
	static PyObject *pyJson_str(PYJson *self) {
		return PyUnicode_FromString(String::format("Json Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyJson_bool(PYJson *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Xml
	TS_PYAPI bool isPYXml(PyObject *object) {
		return (object && Py_TYPE(object) == &PYXml_Type);
	}
	TS_PYAPI Xml &pyXml_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYXml_Type) return ((PYXml*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Xml_get(): can't get Xml from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Xml_get(): can't get Xml from None");
		static Xml ret;
		return ret;
	}
	TS_PYAPI PyObject *pyXml_new(const Xml &ptr) {
		PYXml *ret = (PYXml*)PyObject_New(PYXml, &PYXml_Type);
		new(&ret->ptr) Xml(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyXml_new(Xml &&ptr) {
		PYXml *ret = (PYXml*)PyObject_New(PYXml, &PYXml_Type);
		new(&ret->ptr) Xml(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyXml_init(PYXml *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Xml();
			return 0;
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			const char *attributes = nullptr;
			static const char *kwlist[] = { "name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &name, &attributes)) {
				new(&self->ptr) Xml(name, attributes);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			const char *attributes = nullptr;
			static const char *kwlist[] = { "name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &name_, &attributes)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) Xml(name, attributes);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *name = nullptr;
			const char *attributes = nullptr;
			static const char *kwlist[] = { "parent", "name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os|s", (char**)kwlist, &parent_, &name, &attributes)) {
				if(!isPYXml(parent_)) break;
				Xml *parent = (parent_) ? &pyXml_get(parent_) : nullptr;
				new(&self->ptr) Xml(parent, name, attributes);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *name_ = nullptr;
			const char *attributes = nullptr;
			static const char *kwlist[] = { "parent", "name", "attributes", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|s", (char**)kwlist, &parent_, &name_, &attributes)) {
				if(!isPYXml(parent_)) break;
				Xml *parent = (parent_) ? &pyXml_get(parent_) : nullptr;
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) Xml(parent, name, attributes);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::Xml(): unknown arguments:\n(void)\n(const char* name, const char* attributes)\n(const String name, const char* attributes)\n(Xml* parent, const char* name, const char* attributes)\n(Xml* parent, const String name, const char* attributes)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyXml_dealloc(PYXml *self) {
		self->ptr.~Xml();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyXml_equalPtr(PYXml *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyXml_clonePtr(PYXml *self, PyObject *args) {
		return pyXml_new(self->ptr.clonePtr());
	}
	static PyObject *pyXml_clearPtr(PYXml *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyXml_destroyPtr(PYXml *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyXml_acquirePtr(PYXml *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyXml_unacquirePtr(PYXml *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyXml_isValidPtr(PYXml *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyXml_isOwnerPtr(PYXml *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyXml_isConstPtr(PYXml *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyXml_getCountPtr(PYXml *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyXml_getInternalPtr(PYXml *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Xml_clear(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_create(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		size_t size = 0;
		int32_t owner = false;
		static const char *kwlist[] = { "str", "size", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|ni", (char**)kwlist, &str, &size, &owner)) {
			return PyLong_FromLong(self->ptr.create(str, size, (owner != 0)));
		}
		PyErr_Clear();
		{
			PyObject *str_ = nullptr;
			size_t size = 0;
			int32_t owner = false;
			static const char *kwlist[] = { "str", "size", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|ni", (char**)kwlist, &str_, &size, &owner)) {
				if(!isPYString(str_)) break;
				const String &str = (str_) ? ((PyUnicode_Check(str_)) ? String(PyUnicode_AsUTF8(str_)) : (String)pyString_get(str_)) : String::null;
				return PyLong_FromLong(self->ptr.create(str, size, (owner != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::create(): unknown arguments:\n(const char* str, size_t size, bool owner) -> bool\n(const String str, size_t size, bool owner) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_load(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.load(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.load(name));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			static const char *kwlist[] = { "stream", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.load(stream));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::load(): unknown arguments:\n(const char* name) -> bool\n(const String name) -> bool\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_save(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t compact = false;
		static const char *kwlist[] = { "name", "compact", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &compact)) {
			return PyLong_FromLong(self->ptr.save(name, (compact != 0)));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			int32_t compact = false;
			static const char *kwlist[] = { "name", "compact", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &name_, &compact)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.save(name, (compact != 0)));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			int32_t compact = false;
			static const char *kwlist[] = { "stream", "compact", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &stream_, &compact)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.save(stream, (compact != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::save(): unknown arguments:\n(const char* name, bool compact) -> bool\n(const String name, bool compact) -> bool\n(Stream stream, bool compact) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getRoot(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyXml_new(self->ptr.getRoot());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyXml_new(self->ptr.getRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getRoot(): unknown arguments:\n(void) -> const Xml\n(void) -> Xml\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_setParent(PYXml *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "parent", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &check)) {
			if(!isPYXml(parent_)) break;
			Xml &parent = pyXml_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent(parent, (check != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::setParent(): unknown arguments:\n(Xml parent, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getParent(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyXml_new(self->ptr.getParent());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyXml_new(self->ptr.getParent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getParent(): unknown arguments:\n(void) -> const Xml\n(void) -> Xml\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_addChild(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t check = true;
		static const char *kwlist[] = { "name", "check", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &name, &check)) {
			return pyXml_new(self->ptr.addChild(name, (check != 0)));
		}
		PyErr_Clear();
		{
			PyObject *child_ = nullptr;
			int32_t check = true;
			static const char *kwlist[] = { "child", "check", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &child_, &check)) {
				if(!isPYXml(child_)) break;
				Xml &child = pyXml_get(child_);
				return PyLong_FromUnsignedLong(self->ptr.addChild(child, (check != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::addChild(): unknown arguments:\n(const char* name, bool check) -> Xml\n(Xml child, bool check) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_removeChild(PYXml *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYXml(child_)) break;
			Xml &child = pyXml_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::removeChild(): unknown arguments:\n(Xml child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_releaseChildren(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_findChild(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(self->ptr.findChild(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::findChild(): unknown arguments:\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_isChild(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isChild(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::isChild(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getChild(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return pyXml_new(self->ptr.getChild(name));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
				return pyXml_new(self->ptr.getChild(name));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyXml_new(self->ptr.getChild(index));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyXml_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getChild(): unknown arguments:\n(const char* name) -> const Xml\n(const char* name) -> Xml\n(uint32_t index) -> const Xml\n(uint32_t index) -> Xml\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getNumChildren(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getChildren(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyXml_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyXml_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getChildren(): unknown arguments:\n(void) -> const Array<Xml>\n(void) -> Array<Xml>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getPathName(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPathName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getPathName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_setName(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::setName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getName(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_setData(PYXml *self, PyObject *args, PyObject *kwargs) {
		const float32_t *values = nullptr;
		uint32_t size = {};
		uint32_t digits = 6;
		int32_t compact = true;
		int32_t exponent = true;
		uint32_t wrap = Maxu32;
		static const char *kwlist[] = { "values", "size", "digits", "compact", "exponent", "wrap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|IiiI", (char**)kwlist, &values, &size, &digits, &compact, &exponent, &wrap)) {
			self->ptr.setData(values, size, digits, (compact != 0), (exponent != 0), wrap);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const float64_t *values = nullptr;
			uint32_t size = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			uint32_t wrap = Maxu32;
			static const char *kwlist[] = { "values", "size", "digits", "compact", "exponent", "wrap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|IiiI", (char**)kwlist, &values, &size, &digits, &compact, &exponent, &wrap)) {
				self->ptr.setData(values, size, digits, (compact != 0), (exponent != 0), wrap);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			float32_t value = {};
			uint32_t digits = 6;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				self->ptr.setData(value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			float64_t value = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|Iii", (char**)kwlist, &value, &digits, &compact, &exponent)) {
				self->ptr.setData(value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			uint32_t wrap = Maxu32;
			static const char *kwlist[] = { "values", "size", "radix", "wrap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|II", (char**)kwlist, &values, &size, &radix, &wrap)) {
				self->ptr.setData(values, size, radix, wrap);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			uint32_t wrap = Maxu32;
			static const char *kwlist[] = { "values", "size", "radix", "wrap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|II", (char**)kwlist, &values, &size, &radix, &wrap)) {
				self->ptr.setData(values, size, radix, wrap);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			uint32_t wrap = Maxu32;
			static const char *kwlist[] = { "values", "size", "wrap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|I", (char**)kwlist, &values_, &size, &wrap)) {
				const char **values; Array<const char*> values__;
				pyArray_get(values_, values__); values = values__.get();
				self->ptr.setData(values, size, wrap);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			uint32_t wrap = Maxu32;
			static const char *kwlist[] = { "values", "size", "wrap", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|I", (char**)kwlist, &values_, &size, &wrap)) {
				if(!isPYString(values_)) break;
				const String *values = (values_) ? &pyString_get(values_) : nullptr;
				self->ptr.setData(values, size, wrap);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			int32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "K|I", (char**)kwlist, &value, &radix)) {
				self->ptr.setData(value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			int32_t value = {};
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &value)) {
				self->ptr.setData((value != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *value = nullptr;
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &value)) {
				self->ptr.setData(value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &value_)) {
				if(!isPYString(value_)) break;
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				self->ptr.setData(value);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::setData(): unknown arguments:\n(const float32_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent, uint32_t wrap) -> void\n(const float64_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent, uint32_t wrap) -> void\n(float32_t value, uint32_t digits, bool compact, bool exponent) -> void\n(float64_t value, uint32_t digits, bool compact, bool exponent) -> void\n(const int32_t* values, uint32_t size, uint32_t radix, uint32_t wrap) -> void\n(const uint32_t* values, uint32_t size, uint32_t radix, uint32_t wrap) -> void\n(const char** values, uint32_t size, uint32_t wrap) -> void\n(const String* values, uint32_t size, uint32_t wrap) -> void\n(int32_t value, uint32_t radix) -> void\n(uint32_t value, uint32_t radix) -> void\n(uint64_t value, uint32_t radix) -> void\n(bool value) -> void\n(const char* value) -> void\n(const String value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getData(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t value = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "name", "value", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "si|I", (char**)kwlist, &name, &value, &radix)) {
			return PyLong_FromLong(self->ptr.getData(name, value, radix));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sK|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLongLong(self->ptr.getData(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size, radix));
			}
		}
		PyErr_Clear();
		{
			uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI|I", (char**)kwlist, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &name, &value_)) {
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				return PyUnicode_FromString(self->ptr.getData(name, value).get());
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			int32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &name, &value)) {
				return PyLong_FromLong(self->ptr.getData(name, (value != 0)));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sf", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getData(name, value));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float64_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sd", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getData(name, value));
			}
		}
		PyErr_Clear();
		{
			PyObject *values_ = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &values_, &size)) {
				if(!isPYString(values_)) break;
				String *values = (values_) ? &pyString_get(values_) : nullptr;
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		{
			float32_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		{
			float64_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getData(values, size));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getData().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getData(): unknown arguments:\n(const char* name, int32_t value, uint32_t radix) -> int32_t\n(const char* name, uint32_t value, uint32_t radix) -> uint32_t\n(const char* name, uint64_t value, uint32_t radix) -> uint64_t\n(int32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(uint32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(const char* name, const String value) -> String\n(const char* name, bool value) -> bool\n(const char* name, float32_t value) -> float32_t\n(const char* name, float64_t value) -> float64_t\n(String* values, uint32_t size) -> uint32_t\n(float32_t* values, uint32_t size) -> uint32_t\n(float64_t* values, uint32_t size) -> uint32_t\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDataBool(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDataBool());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDataBool(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDatai32(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromLong(self->ptr.getDatai32(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDatai32(): unknown arguments:\n(uint32_t radix) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDatau32(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromUnsignedLong(self->ptr.getDatau32(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDatau32(): unknown arguments:\n(uint32_t radix) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDatau64(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t radix = 10;
		static const char *kwlist[] = { "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &radix)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getDatau64(radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDatau64(): unknown arguments:\n(uint32_t radix) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDataf32(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDataf32());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDataf32(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getDataf64(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDataf64());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getDataf64(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_addAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(self->ptr.addAttribute(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::addAttribute(): unknown arguments:\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_removeAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.removeAttribute(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::removeAttribute(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_findAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(self->ptr.findAttribute(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::findAttribute(): unknown arguments:\n(const char* name) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_isAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isAttribute(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::isAttribute(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_removeAttributes(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.removeAttributes();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::removeAttributes(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getNumAttributes(PYXml *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAttributes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getNumAttributes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributeName(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getAttributeName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributeName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_setAttributes(PYXml *self, PyObject *args, PyObject *kwargs) {
		const char *str = nullptr;
		static const char *kwlist[] = { "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &str)) {
			return PyLong_FromLong(self->ptr.setAttributes(str));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::setAttributes(): unknown arguments:\n(const char* str) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_setAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const float32_t *values = nullptr;
		uint32_t size = {};
		uint32_t digits = 6;
		int32_t compact = true;
		int32_t exponent = true;
		static const char *kwlist[] = { "index", "values", "size", "digits", "compact", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|Iii", (char**)kwlist, &index, &values, &size, &digits, &compact, &exponent)) {
			self->ptr.setAttribute(index, values, size, digits, (compact != 0), (exponent != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			const float64_t *values = nullptr;
			uint32_t size = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "index", "values", "size", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|Iii", (char**)kwlist, &index, &values, &size, &digits, &compact, &exponent)) {
				self->ptr.setAttribute(index, values, size, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			float32_t value = {};
			uint32_t digits = 6;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "index", "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "If|Iii", (char**)kwlist, &index, &value, &digits, &compact, &exponent)) {
				self->ptr.setAttribute(index, value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			float64_t value = {};
			uint32_t digits = 12;
			int32_t compact = true;
			int32_t exponent = true;
			static const char *kwlist[] = { "index", "value", "digits", "compact", "exponent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Id|Iii", (char**)kwlist, &index, &value, &digits, &compact, &exponent)) {
				self->ptr.setAttribute(index, value, digits, (compact != 0), (exponent != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *values_ = nullptr;
			uint32_t size = {};
			const char *delimiter = nullptr;
			static const char *kwlist[] = { "index", "values", "size", "delimiter", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOI|s", (char**)kwlist, &index, &values_, &size, &delimiter)) {
				const char **values; Array<const char*> values__;
				pyArray_get(values_, values__); values = values__.get();
				self->ptr.setAttribute(index, values, size, delimiter);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *values_ = nullptr;
			uint32_t size = {};
			const char *delimiter = nullptr;
			static const char *kwlist[] = { "index", "values", "size", "delimiter", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOI|s", (char**)kwlist, &index, &values_, &size, &delimiter)) {
				if(!isPYString(values_)) break;
				const String *values = (values_) ? &pyString_get(values_) : nullptr;
				self->ptr.setAttribute(index, values, size, delimiter);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			const int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|I", (char**)kwlist, &index, &values, &size, &radix)) {
				self->ptr.setAttribute(index, values, size, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			const uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|I", (char**)kwlist, &index, &values, &size, &radix)) {
				self->ptr.setAttribute(index, values, size, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			int32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|I", (char**)kwlist, &index, &value, &radix)) {
				self->ptr.setAttribute(index, value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &value, &radix)) {
				self->ptr.setAttribute(index, value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IK|I", (char**)kwlist, &index, &value, &radix)) {
				self->ptr.setAttribute(index, value, radix);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			int32_t value = {};
			static const char *kwlist[] = { "index", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &index, &value)) {
				self->ptr.setAttribute(index, (value != 0));
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			const char *value = nullptr;
			static const char *kwlist[] = { "index", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &index, &value)) {
				self->ptr.setAttribute(index, value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "index", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &value_)) {
				if(!isPYString(value_)) break;
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				self->ptr.setAttribute(index, value);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::setAttribute(): unknown arguments:\n(uint32_t index, const float32_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent) -> void\n(uint32_t index, const float64_t* values, uint32_t size, uint32_t digits, bool compact, bool exponent) -> void\n(uint32_t index, float32_t value, uint32_t digits, bool compact, bool exponent) -> void\n(uint32_t index, float64_t value, uint32_t digits, bool compact, bool exponent) -> void\n(uint32_t index, const char** values, uint32_t size, const char* delimiter) -> void\n(uint32_t index, const String* values, uint32_t size, const char* delimiter) -> void\n(uint32_t index, const int32_t* values, uint32_t size, uint32_t radix) -> void\n(uint32_t index, const uint32_t* values, uint32_t size, uint32_t radix) -> void\n(uint32_t index, int32_t value, uint32_t radix) -> void\n(uint32_t index, uint32_t value, uint32_t radix) -> void\n(uint32_t index, uint64_t value, uint32_t radix) -> void\n(uint32_t index, bool value) -> void\n(uint32_t index, const char* value) -> void\n(uint32_t index, const String value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttribute(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *values_ = nullptr;
		uint32_t size = {};
		const char *delimiter = nullptr;
		static const char *kwlist[] = { "index", "values", "size", "delimiter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOI|s", (char**)kwlist, &index, &values_, &size, &delimiter)) {
			if(!isPYString(values_)) break;
			String *values = (values_) ? &pyString_get(values_) : nullptr;
			return PyLong_FromUnsignedLong(self->ptr.getAttribute(index, values, size, delimiter));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			int32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|I", (char**)kwlist, &index, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getAttribute(index, values, size, radix));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t *values = nullptr;
			uint32_t size = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "index", "values", "size", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|I", (char**)kwlist, &index, &values, &size, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getAttribute(index, values, size, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			int32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "si|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromLong(self->ptr.getAttribute(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLong(self->ptr.getAttribute(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint64_t value = {};
			uint32_t radix = 10;
			static const char *kwlist[] = { "name", "value", "radix", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sK|I", (char**)kwlist, &name, &value, &radix)) {
				return PyLong_FromUnsignedLongLong(self->ptr.getAttribute(name, value, radix));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			float32_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "index", "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI", (char**)kwlist, &index, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getAttribute(index, values, size));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			float64_t *values = nullptr;
			uint32_t size = {};
			static const char *kwlist[] = { "index", "values", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI", (char**)kwlist, &index, &values, &size)) {
				return PyLong_FromUnsignedLong(self->ptr.getAttribute(index, values, size));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *value_ = nullptr;
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|O", (char**)kwlist, &name, &value_)) {
				const String &value = (value_) ? ((PyUnicode_Check(value_)) ? String(PyUnicode_AsUTF8(value_)) : (String)pyString_get(value_)) : String::null;
				return PyUnicode_FromString(self->ptr.getAttribute(name, value).get());
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			int32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &name, &value)) {
				return PyLong_FromLong(self->ptr.getAttribute(name, (value != 0)));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sf", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getAttribute(name, value));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			float64_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sd", (char**)kwlist, &name, &value)) {
				return PyFloat_FromDouble(self->ptr.getAttribute(name, value));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return PyUnicode_FromString(self->ptr.getAttribute(index).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttribute(): unknown arguments:\n(uint32_t index, String* values, uint32_t size, const char* delimiter) -> uint32_t\n(uint32_t index, int32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(uint32_t index, uint32_t* values, uint32_t size, uint32_t radix) -> uint32_t\n(const char* name, int32_t value, uint32_t radix) -> int32_t\n(const char* name, uint32_t value, uint32_t radix) -> uint32_t\n(const char* name, uint64_t value, uint32_t radix) -> uint64_t\n(uint32_t index, float32_t* values, uint32_t size) -> uint32_t\n(uint32_t index, float64_t* values, uint32_t size) -> uint32_t\n(const char* name, const String value) -> String\n(const char* name, bool value) -> bool\n(const char* name, float32_t value) -> float32_t\n(const char* name, float64_t value) -> float64_t\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributei32(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "index", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &index, &radix)) {
			return PyLong_FromLong(self->ptr.getAttributei32(index, radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributei32(): unknown arguments:\n(uint32_t index, uint32_t radix) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributeu32(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "index", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &index, &radix)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeu32(index, radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributeu32(): unknown arguments:\n(uint32_t index, uint32_t radix) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributeu64(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t radix = 10;
		static const char *kwlist[] = { "index", "radix", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &index, &radix)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getAttributeu64(index, radix));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributeu64(): unknown arguments:\n(uint32_t index, uint32_t radix) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributef32(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getAttributef32(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributef32(): unknown arguments:\n(uint32_t index) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_getAttributef64(PYXml *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getAttributef64(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Xml::getAttributef64(): unknown arguments:\n(uint32_t index) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Xml_get_root(PYXml *self, void *offset) {
		return pyXml_new(self->ptr.getRoot());
	}
	static PyObject *Xml_get_parent(PYXml *self, void *offset) {
		return pyXml_new(self->ptr.getParent());
	}
	static PyObject *Xml_get_num_children(PYXml *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *Xml_get_path_name(PYXml *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPathName().get());
	}
	static PyObject *Xml_get_name(PYXml *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Xml_get_data(PYXml *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getData().get());
	}
	static PyObject *Xml_get_data_bool(PYXml *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDataBool());
	}
	static PyObject *Xml_get_datai32(PYXml *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDatai32());
	}
	static PyObject *Xml_get_datau32(PYXml *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDatau32());
	}
	static PyObject *Xml_get_datau64(PYXml *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getDatau64());
	}
	static PyObject *Xml_get_dataf32(PYXml *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDataf32());
	}
	static PyObject *Xml_get_dataf64(PYXml *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDataf64());
	}
	static PyObject *Xml_get_num_attributes(PYXml *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumAttributes());
	}
	static PyObject *pyXml_str(PYXml *self) {
		return PyUnicode_FromString(String::format("Xml Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyXml_bool(PYXml *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Buffer
	TS_PYAPI bool isPYBuffer(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYBuffer_Type || type == &PYD3D12Buffer_Type || type == &PYD3D11Buffer_Type || type == &PYMTLBuffer_Type || type == &PYVKBuffer_Type || type == &PYGLBuffer_Type || type == &PYGLESBuffer_Type || type == &PYCUBuffer_Type || type == &PYHIPBuffer_Type || type == &PYFUBuffer_Type);
	}
	TS_PYAPI Buffer &pyBuffer_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYBuffer_Type || type == &PYD3D12Buffer_Type || type == &PYD3D11Buffer_Type || type == &PYMTLBuffer_Type || type == &PYVKBuffer_Type || type == &PYGLBuffer_Type || type == &PYGLESBuffer_Type || type == &PYCUBuffer_Type || type == &PYHIPBuffer_Type || type == &PYFUBuffer_Type) return ((PYBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Buffer_get(): can't get Buffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Buffer_get(): can't get Buffer from None");
		static Buffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyBuffer_new(const Buffer &ptr) {
		PYBuffer *ret = (PYBuffer*)PyObject_New(PYBuffer, &PYBuffer_Type);
		new(&ret->ptr) Buffer(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyBuffer_new(Buffer &&ptr) {
		PYBuffer *ret = (PYBuffer*)PyObject_New(PYBuffer, &PYBuffer_Type);
		new(&ret->ptr) Buffer(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyBuffer_init(PYBuffer *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Buffer();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::Buffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyBuffer_dealloc(PYBuffer *self) {
		self->ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyBuffer_equalPtr(PYBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyBuffer_clonePtr(PYBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyBuffer_clearPtr(PYBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBuffer_destroyPtr(PYBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBuffer_acquirePtr(PYBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBuffer_unacquirePtr(PYBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBuffer_isValidPtr(PYBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyBuffer_isOwnerPtr(PYBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyBuffer_isConstPtr(PYBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyBuffer_getCountPtr(PYBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyBuffer_getInternalPtr(PYBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Buffer_getPlatform(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getPlatformName(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getIndex(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_clear(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_isCreated(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_setName(PYBuffer *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getName(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_create(PYBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		size_t size = {};
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "flags", "size", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|I", (char**)kwlist, &flags, &size, &format)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, size, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::create(): unknown arguments:\n(Buffer.Flags flags, size_t size, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_isMapped(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMapped());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::isMapped(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getFlags(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getFlags(): unknown arguments:\n(void) -> Buffer::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_hasFlag(PYBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlag((Buffer::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::hasFlag(): unknown arguments:\n(Buffer.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_hasFlags(PYBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlags((Buffer::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::hasFlags(): unknown arguments:\n(Buffer.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getFlagsName(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFlagsName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getFlagsName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getFormat(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getFormatName(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getComponents(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getComponents());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getComponents(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getPixelSize(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getPixelSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getSize(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getPageSize(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getPageSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getPageSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_getDescription(PYBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDescription().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Buffer::getDescription(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Buffer_get_platform(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Buffer_get_platform_name(PYBuffer *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Buffer_get_index(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Buffer_get_name(PYBuffer *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Buffer_get_flags(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *Buffer_get_flags_name(PYBuffer *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFlagsName().get());
	}
	static PyObject *Buffer_get_format(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *Buffer_get_format_name(PYBuffer *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *Buffer_get_components(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getComponents());
	}
	static PyObject *Buffer_get_pixel_size(PYBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
	}
	static PyObject *Buffer_get_size(PYBuffer *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getSize());
	}
	static PyObject *Buffer_get_page_size(PYBuffer *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getPageSize());
	}
	static PyObject *Buffer_get_description(PYBuffer *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDescription().get());
	}
	static PyObject *pyBuffer_str(PYBuffer *self) {
		return PyUnicode_FromString(String::format("Buffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyBuffer_bool(PYBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::BufferTable
	TS_PYAPI bool isPYBufferTable(PyObject *object) {
		return (object && Py_TYPE(object) == &PYBufferTable_Type);
	}
	TS_PYAPI BufferTable &pyBufferTable_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYBufferTable_Type) return ((PYBufferTable*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "BufferTable_get(): can't get BufferTable from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "BufferTable_get(): can't get BufferTable from None");
		static BufferTable ret;
		return ret;
	}
	TS_PYAPI PyObject *pyBufferTable_new(const BufferTable &ptr) {
		PYBufferTable *ret = (PYBufferTable*)PyObject_New(PYBufferTable, &PYBufferTable_Type);
		new(&ret->ptr) BufferTable(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyBufferTable_new(BufferTable &&ptr) {
		PYBufferTable *ret = (PYBufferTable*)PyObject_New(PYBufferTable, &PYBufferTable_Type);
		new(&ret->ptr) BufferTable(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyBufferTable_init(PYBufferTable *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) BufferTable();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::BufferTable(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyBufferTable_dealloc(PYBufferTable *self) {
		self->ptr.~BufferTable();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyBufferTable_equalPtr(PYBufferTable *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyBufferTable_clonePtr(PYBufferTable *self, PyObject *args) {
		return pyBufferTable_new(self->ptr.clonePtr());
	}
	static PyObject *pyBufferTable_clearPtr(PYBufferTable *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBufferTable_destroyPtr(PYBufferTable *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBufferTable_acquirePtr(PYBufferTable *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBufferTable_unacquirePtr(PYBufferTable *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBufferTable_isValidPtr(PYBufferTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyBufferTable_isOwnerPtr(PYBufferTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyBufferTable_isConstPtr(PYBufferTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyBufferTable_getCountPtr(PYBufferTable *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyBufferTable_getInternalPtr(PYBufferTable *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *BufferTable_getPlatform(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_getPlatformName(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_getIndex(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_clear(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_isCreated(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_setName(PYBufferTable *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_getName(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_create(PYBufferTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			return PyLong_FromLong(self->ptr.create(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::create(): unknown arguments:\n(uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_getSize(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_get(PYBufferTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBuffer_new(self->ptr.get(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::get(): unknown arguments:\n(uint32_t index) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_isOwner(PYBufferTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isOwner(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::isOwner(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_getMemory(PYBufferTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BufferTable::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BufferTable_get_platform(PYBufferTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *BufferTable_get_platform_name(PYBufferTable *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *BufferTable_get_index(PYBufferTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *BufferTable_get_name(PYBufferTable *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *BufferTable_get_size(PYBufferTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSize());
	}
	static PyObject *BufferTable_get_memory(PYBufferTable *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyBufferTable_str(PYBufferTable *self) {
		return PyUnicode_FromString(String::format("BufferTable Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyBufferTable_bool(PYBufferTable *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Buffer
	static void pyD3D12Buffer_base(PYD3D12Buffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Buffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Buffer_Type);
	}
	TS_PYAPI D3D12Buffer &pyD3D12Buffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Buffer_Type) return ((PYD3D12Buffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Buffer_get(): can't get D3D12Buffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Buffer_get(): can't get D3D12Buffer from None");
		static D3D12Buffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Buffer_new(const D3D12Buffer &ptr) {
		PYD3D12Buffer *ret = (PYD3D12Buffer*)PyObject_New(PYD3D12Buffer, &PYD3D12Buffer_Type);
		new(&ret->ptr) D3D12Buffer(ptr); pyD3D12Buffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Buffer_new(D3D12Buffer &&ptr) {
		PYD3D12Buffer *ret = (PYD3D12Buffer*)PyObject_New(PYD3D12Buffer, &PYD3D12Buffer_Type);
		new(&ret->ptr) D3D12Buffer(move(ptr)); pyD3D12Buffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Buffer_init(PYD3D12Buffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) D3D12Buffer(((PYBuffer*)object)->ptr);
				pyD3D12Buffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Buffer();
			pyD3D12Buffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::D3D12Buffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Buffer_dealloc(PYD3D12Buffer *self) {
		self->ptr.~D3D12Buffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Buffer_equalPtr(PYD3D12Buffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Buffer_clonePtr(PYD3D12Buffer *self, PyObject *args) {
		return pyD3D12Buffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Buffer_clearPtr(PYD3D12Buffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Buffer_destroyPtr(PYD3D12Buffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Buffer_acquirePtr(PYD3D12Buffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Buffer_unacquirePtr(PYD3D12Buffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Buffer_isValidPtr(PYD3D12Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Buffer_isOwnerPtr(PYD3D12Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Buffer_isConstPtr(PYD3D12Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Buffer_getCountPtr(PYD3D12Buffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Buffer_getInternalPtr(PYD3D12Buffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Buffer_getBuffer(PYD3D12Buffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *D3D12Buffer_create(PYD3D12Buffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		ID3D12Resource *buffer = nullptr;
		uint32_t state = {};
		static const char *kwlist[] = { "flags", "buffer", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI", (char**)kwlist, &flags, &buffer, &state)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, buffer, state));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::create(): unknown arguments:\n(Buffer.Flags flags, ID3D12Resource* buffer, uint32_t state) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getD3D12Buffer(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D12Buffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getD3D12Buffer(): unknown arguments:\n(void) -> ID3D12Resource*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getUnorderedAccessView(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getUnorderedAccessView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getUnorderedAccessView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getShaderResourceView(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getShaderResourceView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getShaderResourceView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getBufferAddress(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(self->ptr.getBufferAddress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getBufferAddress(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_setBufferState(PYD3D12Buffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t state = {};
		static const char *kwlist[] = { "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &state)) {
			self->ptr.setBufferState(state);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::setBufferState(): unknown arguments:\n(uint32_t state) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getBufferState(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBufferState());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getBufferState(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getSharedHandle(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getSharedHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_getInteropHandle(PYD3D12Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Buffer::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Buffer_get_d3d12_buffer(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D12Buffer());
	}
	static PyObject *D3D12Buffer_get_unordered_access_view(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getUnorderedAccessView());
	}
	static PyObject *D3D12Buffer_get_shader_resource_view(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getShaderResourceView());
	}
	static PyObject *D3D12Buffer_get_buffer_address(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getBufferAddress());
	}
	static PyObject *D3D12Buffer_get_buffer_state(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBufferState());
	}
	static PyObject *D3D12Buffer_get_shared_handle(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
	}
	static PyObject *D3D12Buffer_get_interop_handle(PYD3D12Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyD3D12Buffer_str(PYD3D12Buffer *self) {
		return PyUnicode_FromString(String::format("D3D12Buffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Buffer_bool(PYD3D12Buffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Buffer
	static void pyD3D11Buffer_base(PYD3D11Buffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Buffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Buffer_Type);
	}
	TS_PYAPI D3D11Buffer &pyD3D11Buffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Buffer_Type) return ((PYD3D11Buffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Buffer_get(): can't get D3D11Buffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Buffer_get(): can't get D3D11Buffer from None");
		static D3D11Buffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Buffer_new(const D3D11Buffer &ptr) {
		PYD3D11Buffer *ret = (PYD3D11Buffer*)PyObject_New(PYD3D11Buffer, &PYD3D11Buffer_Type);
		new(&ret->ptr) D3D11Buffer(ptr); pyD3D11Buffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Buffer_new(D3D11Buffer &&ptr) {
		PYD3D11Buffer *ret = (PYD3D11Buffer*)PyObject_New(PYD3D11Buffer, &PYD3D11Buffer_Type);
		new(&ret->ptr) D3D11Buffer(move(ptr)); pyD3D11Buffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Buffer_init(PYD3D11Buffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) D3D11Buffer(((PYBuffer*)object)->ptr);
				pyD3D11Buffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Buffer();
			pyD3D11Buffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::D3D11Buffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Buffer_dealloc(PYD3D11Buffer *self) {
		self->ptr.~D3D11Buffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Buffer_equalPtr(PYD3D11Buffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Buffer_clonePtr(PYD3D11Buffer *self, PyObject *args) {
		return pyD3D11Buffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Buffer_clearPtr(PYD3D11Buffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Buffer_destroyPtr(PYD3D11Buffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Buffer_acquirePtr(PYD3D11Buffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Buffer_unacquirePtr(PYD3D11Buffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Buffer_isValidPtr(PYD3D11Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Buffer_isOwnerPtr(PYD3D11Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Buffer_isConstPtr(PYD3D11Buffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Buffer_getCountPtr(PYD3D11Buffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Buffer_getInternalPtr(PYD3D11Buffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Buffer_getBuffer(PYD3D11Buffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *D3D11Buffer_create(PYD3D11Buffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		ID3D11Buffer *buffer = nullptr;
		static const char *kwlist[] = { "flags", "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &flags, &buffer)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, buffer));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::create(): unknown arguments:\n(Buffer.Flags flags, ID3D11Buffer* buffer) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Buffer_getD3D11Buffer(PYD3D11Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D11Buffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::getD3D11Buffer(): unknown arguments:\n(void) -> ID3D11Buffer*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Buffer_getUnorderedAccessView(PYD3D11Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getUnorderedAccessView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::getUnorderedAccessView(): unknown arguments:\n(void) -> ID3D11UnorderedAccessView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Buffer_getShaderResourceView(PYD3D11Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getShaderResourceView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::getShaderResourceView(): unknown arguments:\n(void) -> ID3D11ShaderResourceView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Buffer_getInteropHandle(PYD3D11Buffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Buffer::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Buffer_get_d3d11_buffer(PYD3D11Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D11Buffer());
	}
	static PyObject *D3D11Buffer_get_unordered_access_view(PYD3D11Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getUnorderedAccessView());
	}
	static PyObject *D3D11Buffer_get_shader_resource_view(PYD3D11Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getShaderResourceView());
	}
	static PyObject *D3D11Buffer_get_interop_handle(PYD3D11Buffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyD3D11Buffer_str(PYD3D11Buffer *self) {
		return PyUnicode_FromString(String::format("D3D11Buffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Buffer_bool(PYD3D11Buffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLBuffer
	static void pyMTLBuffer_base(PYMTLBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYMTLBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLBuffer_Type);
	}
	TS_PYAPI MTLBuffer &pyMTLBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLBuffer_Type) return ((PYMTLBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLBuffer_get(): can't get MTLBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLBuffer_get(): can't get MTLBuffer from None");
		static MTLBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLBuffer_new(const MTLBuffer &ptr) {
		PYMTLBuffer *ret = (PYMTLBuffer*)PyObject_New(PYMTLBuffer, &PYMTLBuffer_Type);
		new(&ret->ptr) MTLBuffer(ptr); pyMTLBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLBuffer_new(MTLBuffer &&ptr) {
		PYMTLBuffer *ret = (PYMTLBuffer*)PyObject_New(PYMTLBuffer, &PYMTLBuffer_Type);
		new(&ret->ptr) MTLBuffer(move(ptr)); pyMTLBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLBuffer_init(PYMTLBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) MTLBuffer(((PYBuffer*)object)->ptr);
				pyMTLBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLBuffer();
			pyMTLBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLBuffer::MTLBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLBuffer_dealloc(PYMTLBuffer *self) {
		self->ptr.~MTLBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLBuffer_equalPtr(PYMTLBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLBuffer_clonePtr(PYMTLBuffer *self, PyObject *args) {
		return pyMTLBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLBuffer_clearPtr(PYMTLBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLBuffer_destroyPtr(PYMTLBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLBuffer_acquirePtr(PYMTLBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLBuffer_unacquirePtr(PYMTLBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLBuffer_isValidPtr(PYMTLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLBuffer_isOwnerPtr(PYMTLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLBuffer_isConstPtr(PYMTLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLBuffer_getCountPtr(PYMTLBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLBuffer_getInternalPtr(PYMTLBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLBuffer_getBuffer(PYMTLBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *MTLBuffer_create(PYMTLBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		void *buffer = nullptr;
		static const char *kwlist[] = { "flags", "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &flags, &buffer)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, buffer));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLBuffer::create(): unknown arguments:\n(Buffer.Flags flags, void* buffer) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLBuffer_getMTLBuffer(PYMTLBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getMTLBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLBuffer::getMTLBuffer(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLBuffer_getSharedPtr(PYMTLBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLBuffer::getSharedPtr(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLBuffer_get_mtl_buffer(PYMTLBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getMTLBuffer());
	}
	static PyObject *MTLBuffer_get_shared_ptr(PYMTLBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
	}
	static PyObject *pyMTLBuffer_str(PYMTLBuffer *self) {
		return PyUnicode_FromString(String::format("MTLBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLBuffer_bool(PYMTLBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKBuffer
	static void pyVKBuffer_base(PYVKBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYVKBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKBuffer_Type);
	}
	TS_PYAPI VKBuffer &pyVKBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKBuffer_Type) return ((PYVKBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKBuffer_get(): can't get VKBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKBuffer_get(): can't get VKBuffer from None");
		static VKBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKBuffer_new(const VKBuffer &ptr) {
		PYVKBuffer *ret = (PYVKBuffer*)PyObject_New(PYVKBuffer, &PYVKBuffer_Type);
		new(&ret->ptr) VKBuffer(ptr); pyVKBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKBuffer_new(VKBuffer &&ptr) {
		PYVKBuffer *ret = (PYVKBuffer*)PyObject_New(PYVKBuffer, &PYVKBuffer_Type);
		new(&ret->ptr) VKBuffer(move(ptr)); pyVKBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKBuffer_init(PYVKBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) VKBuffer(((PYBuffer*)object)->ptr);
				pyVKBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKBuffer();
			pyVKBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::VKBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKBuffer_dealloc(PYVKBuffer *self) {
		self->ptr.~VKBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKBuffer_equalPtr(PYVKBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKBuffer_clonePtr(PYVKBuffer *self, PyObject *args) {
		return pyVKBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKBuffer_clearPtr(PYVKBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKBuffer_destroyPtr(PYVKBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKBuffer_acquirePtr(PYVKBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKBuffer_unacquirePtr(PYVKBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKBuffer_isValidPtr(PYVKBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKBuffer_isOwnerPtr(PYVKBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKBuffer_isConstPtr(PYVKBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKBuffer_getCountPtr(PYVKBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKBuffer_getInternalPtr(PYVKBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKBuffer_getBuffer(PYVKBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *VKBuffer_create(PYVKBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		size_t size = {};
		VkBuffer buffer = {};
		uint32_t access = {};
		static const char *kwlist[] = { "flags", "size", "buffer", "access", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "InnI", (char**)kwlist, &flags, &size, &buffer, &access)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, size, buffer, access));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::create(): unknown arguments:\n(Buffer.Flags flags, size_t size, VkBuffer buffer, uint32_t access) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getVKBuffer(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVKBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getVKBuffer(): unknown arguments:\n(void) -> VkBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getBufferView(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getBufferView(): unknown arguments:\n(void) -> VkBufferView\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getBufferAddress(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(self->ptr.getBufferAddress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getBufferAddress(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_setBufferAccess(PYVKBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t access = {};
		static const char *kwlist[] = { "access", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &access)) {
			self->ptr.setBufferAccess(access);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::setBufferAccess(): unknown arguments:\n(uint32_t access) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getBufferAccess(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBufferAccess());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getBufferAccess(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getSharedPtr(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getSharedPtr(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_getInteropHandle(PYVKBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKBuffer::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKBuffer_get_vk_buffer(PYVKBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVKBuffer());
	}
	static PyObject *VKBuffer_get_buffer_view(PYVKBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferView());
	}
	static PyObject *VKBuffer_get_buffer_address(PYVKBuffer *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getBufferAddress());
	}
	static PyObject *VKBuffer_get_buffer_access(PYVKBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBufferAccess());
	}
	static PyObject *VKBuffer_get_shared_ptr(PYVKBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
	}
	static PyObject *VKBuffer_get_interop_handle(PYVKBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyVKBuffer_str(PYVKBuffer *self) {
		return PyUnicode_FromString(String::format("VKBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKBuffer_bool(PYVKBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLBuffer
	static void pyGLBuffer_base(PYGLBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYGLBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLBuffer_Type);
	}
	TS_PYAPI GLBuffer &pyGLBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLBuffer_Type) return ((PYGLBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLBuffer_get(): can't get GLBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLBuffer_get(): can't get GLBuffer from None");
		static GLBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLBuffer_new(const GLBuffer &ptr) {
		PYGLBuffer *ret = (PYGLBuffer*)PyObject_New(PYGLBuffer, &PYGLBuffer_Type);
		new(&ret->ptr) GLBuffer(ptr); pyGLBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLBuffer_new(GLBuffer &&ptr) {
		PYGLBuffer *ret = (PYGLBuffer*)PyObject_New(PYGLBuffer, &PYGLBuffer_Type);
		new(&ret->ptr) GLBuffer(move(ptr)); pyGLBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLBuffer_init(PYGLBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) GLBuffer(((PYBuffer*)object)->ptr);
				pyGLBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLBuffer();
			pyGLBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLBuffer::GLBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLBuffer_dealloc(PYGLBuffer *self) {
		self->ptr.~GLBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLBuffer_equalPtr(PYGLBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLBuffer_clonePtr(PYGLBuffer *self, PyObject *args) {
		return pyGLBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLBuffer_clearPtr(PYGLBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLBuffer_destroyPtr(PYGLBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLBuffer_acquirePtr(PYGLBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLBuffer_unacquirePtr(PYGLBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLBuffer_isValidPtr(PYGLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLBuffer_isOwnerPtr(PYGLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLBuffer_isConstPtr(PYGLBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLBuffer_getCountPtr(PYGLBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLBuffer_getInternalPtr(PYGLBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLBuffer_getBuffer(PYGLBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *GLBuffer_create(PYGLBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		uint32_t target = {};
		uint32_t buffer_id = {};
		static const char *kwlist[] = { "flags", "target", "buffer_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &flags, &target, &buffer_id)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, target, buffer_id));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLBuffer::create(): unknown arguments:\n(Buffer.Flags flags, uint32_t target, uint32_t buffer_id) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLBuffer_getTarget(PYGLBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLBuffer::getTarget(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLBuffer_getBufferID(PYGLBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLBuffer::getBufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLBuffer_get_target(PYGLBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTarget());
	}
	static PyObject *GLBuffer_get_buffer_id(PYGLBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBufferID());
	}
	static PyObject *pyGLBuffer_str(PYGLBuffer *self) {
		return PyUnicode_FromString(String::format("GLBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLBuffer_bool(PYGLBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESBuffer
	static void pyGLESBuffer_base(PYGLESBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYGLESBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESBuffer_Type);
	}
	TS_PYAPI GLESBuffer &pyGLESBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESBuffer_Type) return ((PYGLESBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESBuffer_get(): can't get GLESBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESBuffer_get(): can't get GLESBuffer from None");
		static GLESBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESBuffer_new(const GLESBuffer &ptr) {
		PYGLESBuffer *ret = (PYGLESBuffer*)PyObject_New(PYGLESBuffer, &PYGLESBuffer_Type);
		new(&ret->ptr) GLESBuffer(ptr); pyGLESBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESBuffer_new(GLESBuffer &&ptr) {
		PYGLESBuffer *ret = (PYGLESBuffer*)PyObject_New(PYGLESBuffer, &PYGLESBuffer_Type);
		new(&ret->ptr) GLESBuffer(move(ptr)); pyGLESBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESBuffer_init(PYGLESBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) GLESBuffer(((PYBuffer*)object)->ptr);
				pyGLESBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESBuffer();
			pyGLESBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESBuffer::GLESBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESBuffer_dealloc(PYGLESBuffer *self) {
		self->ptr.~GLESBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESBuffer_equalPtr(PYGLESBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESBuffer_clonePtr(PYGLESBuffer *self, PyObject *args) {
		return pyGLESBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESBuffer_clearPtr(PYGLESBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESBuffer_destroyPtr(PYGLESBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESBuffer_acquirePtr(PYGLESBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESBuffer_unacquirePtr(PYGLESBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESBuffer_isValidPtr(PYGLESBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESBuffer_isOwnerPtr(PYGLESBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESBuffer_isConstPtr(PYGLESBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESBuffer_getCountPtr(PYGLESBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESBuffer_getInternalPtr(PYGLESBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESBuffer_getBuffer(PYGLESBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *GLESBuffer_create(PYGLESBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		uint32_t target = {};
		uint32_t buffer_id = {};
		static const char *kwlist[] = { "flags", "target", "buffer_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &flags, &target, &buffer_id)) {
			return PyLong_FromLong(self->ptr.create((Buffer::Flags)flags, target, buffer_id));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESBuffer::create(): unknown arguments:\n(Buffer.Flags flags, uint32_t target, uint32_t buffer_id) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESBuffer_getTarget(PYGLESBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESBuffer::getTarget(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESBuffer_getBufferID(PYGLESBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESBuffer::getBufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESBuffer_get_target(PYGLESBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTarget());
	}
	static PyObject *GLESBuffer_get_buffer_id(PYGLESBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBufferID());
	}
	static PyObject *pyGLESBuffer_str(PYGLESBuffer *self) {
		return PyUnicode_FromString(String::format("GLESBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESBuffer_bool(PYGLESBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CUBuffer
	static void pyCUBuffer_base(PYCUBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYCUBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCUBuffer_Type);
	}
	TS_PYAPI CUBuffer &pyCUBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCUBuffer_Type) return ((PYCUBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CUBuffer_get(): can't get CUBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CUBuffer_get(): can't get CUBuffer from None");
		static CUBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCUBuffer_new(const CUBuffer &ptr) {
		PYCUBuffer *ret = (PYCUBuffer*)PyObject_New(PYCUBuffer, &PYCUBuffer_Type);
		new(&ret->ptr) CUBuffer(ptr); pyCUBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCUBuffer_new(CUBuffer &&ptr) {
		PYCUBuffer *ret = (PYCUBuffer*)PyObject_New(PYCUBuffer, &PYCUBuffer_Type);
		new(&ret->ptr) CUBuffer(move(ptr)); pyCUBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCUBuffer_init(PYCUBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) CUBuffer(((PYBuffer*)object)->ptr);
				pyCUBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CUBuffer();
			pyCUBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::CUBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCUBuffer_dealloc(PYCUBuffer *self) {
		self->ptr.~CUBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCUBuffer_equalPtr(PYCUBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCUBuffer_clonePtr(PYCUBuffer *self, PyObject *args) {
		return pyCUBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyCUBuffer_clearPtr(PYCUBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUBuffer_destroyPtr(PYCUBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUBuffer_acquirePtr(PYCUBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUBuffer_unacquirePtr(PYCUBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUBuffer_isValidPtr(PYCUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCUBuffer_isOwnerPtr(PYCUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCUBuffer_isConstPtr(PYCUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCUBuffer_getCountPtr(PYCUBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCUBuffer_getInternalPtr(PYCUBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCUBuffer_getBuffer(PYCUBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *CUBuffer_getBufferPtr(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getBufferPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getBufferPtr(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_getBufferData(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferData());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getBufferData(): unknown arguments:\n(void) -> uint8_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_getBufferEvent(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferEvent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getBufferEvent(): unknown arguments:\n(void) -> CUevent\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_getArrayFormat(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getArrayFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_getArrayChannels(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getArrayChannels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_getSharedMemory(PYCUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUBuffer::getSharedMemory(): unknown arguments:\n(void) -> CUexternalMemory\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUBuffer_get_buffer_ptr(PYCUBuffer *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getBufferPtr());
	}
	static PyObject *CUBuffer_get_buffer_data(PYCUBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferData());
	}
	static PyObject *CUBuffer_get_buffer_event(PYCUBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferEvent());
	}
	static PyObject *CUBuffer_get_array_format(PYCUBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
	}
	static PyObject *CUBuffer_get_array_channels(PYCUBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
	}
	static PyObject *CUBuffer_get_shared_memory(PYCUBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
	}
	static PyObject *pyCUBuffer_str(PYCUBuffer *self) {
		return PyUnicode_FromString(String::format("CUBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCUBuffer_bool(PYCUBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::HIPBuffer
	static void pyHIPBuffer_base(PYHIPBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYHIPBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYHIPBuffer_Type);
	}
	TS_PYAPI HIPBuffer &pyHIPBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYHIPBuffer_Type) return ((PYHIPBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "HIPBuffer_get(): can't get HIPBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "HIPBuffer_get(): can't get HIPBuffer from None");
		static HIPBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyHIPBuffer_new(const HIPBuffer &ptr) {
		PYHIPBuffer *ret = (PYHIPBuffer*)PyObject_New(PYHIPBuffer, &PYHIPBuffer_Type);
		new(&ret->ptr) HIPBuffer(ptr); pyHIPBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyHIPBuffer_new(HIPBuffer &&ptr) {
		PYHIPBuffer *ret = (PYHIPBuffer*)PyObject_New(PYHIPBuffer, &PYHIPBuffer_Type);
		new(&ret->ptr) HIPBuffer(move(ptr)); pyHIPBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyHIPBuffer_init(PYHIPBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) HIPBuffer(((PYBuffer*)object)->ptr);
				pyHIPBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) HIPBuffer();
			pyHIPBuffer_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::HIPBuffer(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyHIPBuffer_dealloc(PYHIPBuffer *self) {
		self->ptr.~HIPBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyHIPBuffer_equalPtr(PYHIPBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyHIPBuffer_clonePtr(PYHIPBuffer *self, PyObject *args) {
		return pyHIPBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyHIPBuffer_clearPtr(PYHIPBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPBuffer_destroyPtr(PYHIPBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPBuffer_acquirePtr(PYHIPBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPBuffer_unacquirePtr(PYHIPBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPBuffer_isValidPtr(PYHIPBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyHIPBuffer_isOwnerPtr(PYHIPBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyHIPBuffer_isConstPtr(PYHIPBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyHIPBuffer_getCountPtr(PYHIPBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyHIPBuffer_getInternalPtr(PYHIPBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyHIPBuffer_getBuffer(PYHIPBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *HIPBuffer_getBufferPtr(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getBufferPtr(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_getBufferData(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferData());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getBufferData(): unknown arguments:\n(void) -> uint8_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_getBufferEvent(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferEvent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getBufferEvent(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_getArrayFormat(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getArrayFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_getArrayChannels(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getArrayChannels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_getSharedMemory(PYHIPBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPBuffer::getSharedMemory(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPBuffer_get_buffer_ptr(PYHIPBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferPtr());
	}
	static PyObject *HIPBuffer_get_buffer_data(PYHIPBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferData());
	}
	static PyObject *HIPBuffer_get_buffer_event(PYHIPBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferEvent());
	}
	static PyObject *HIPBuffer_get_array_format(PYHIPBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
	}
	static PyObject *HIPBuffer_get_array_channels(PYHIPBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
	}
	static PyObject *HIPBuffer_get_shared_memory(PYHIPBuffer *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
	}
	static PyObject *pyHIPBuffer_str(PYHIPBuffer *self) {
		return PyUnicode_FromString(String::format("HIPBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyHIPBuffer_bool(PYHIPBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUBuffer
	static void pyFUBuffer_base(PYFUBuffer *self) {
		new(&self->base.ptr) Buffer(self->ptr);
	}
	TS_PYAPI bool isPYFUBuffer(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUBuffer_Type);
	}
	TS_PYAPI FUBuffer &pyFUBuffer_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUBuffer_Type) return ((PYFUBuffer*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUBuffer_get(): can't get FUBuffer from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUBuffer_get(): can't get FUBuffer from None");
		static FUBuffer ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUBuffer_new(const FUBuffer &ptr) {
		PYFUBuffer *ret = (PYFUBuffer*)PyObject_New(PYFUBuffer, &PYFUBuffer_Type);
		new(&ret->ptr) FUBuffer(ptr); pyFUBuffer_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUBuffer_new(FUBuffer &&ptr) {
		PYFUBuffer *ret = (PYFUBuffer*)PyObject_New(PYFUBuffer, &PYFUBuffer_Type);
		new(&ret->ptr) FUBuffer(move(ptr)); pyFUBuffer_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUBuffer_init(PYFUBuffer *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYBuffer(object)) {
				new(&self->ptr) FUBuffer(((PYBuffer*)object)->ptr);
				pyFUBuffer_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUBuffer();
			pyFUBuffer_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *buffers_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "buffers", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &buffers_, &owner)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				new(&self->ptr) FUBuffer(buffers, (owner != 0));
				pyFUBuffer_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUBuffer::FUBuffer(): unknown arguments:\n(void)\n(Array<Buffer> buffers, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUBuffer_dealloc(PYFUBuffer *self) {
		self->ptr.~FUBuffer();
		self->base.ptr.~Buffer();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUBuffer_equalPtr(PYFUBuffer *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUBuffer_clonePtr(PYFUBuffer *self, PyObject *args) {
		return pyFUBuffer_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUBuffer_clearPtr(PYFUBuffer *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUBuffer_destroyPtr(PYFUBuffer *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUBuffer_acquirePtr(PYFUBuffer *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUBuffer_unacquirePtr(PYFUBuffer *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUBuffer_isValidPtr(PYFUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUBuffer_isOwnerPtr(PYFUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUBuffer_isConstPtr(PYFUBuffer *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUBuffer_getCountPtr(PYFUBuffer *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUBuffer_getInternalPtr(PYFUBuffer *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUBuffer_getBuffer(PYFUBuffer *self, PyObject *args) {
		return pyBuffer_new(self->ptr.getBuffer());
	}
	static PyObject *FUBuffer_setMask(PYFUBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUBuffer::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUBuffer_getMask(PYFUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUBuffer::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUBuffer_getNumBuffers(PYFUBuffer *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumBuffers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUBuffer::getNumBuffers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUBuffer_getBuffer(PYFUBuffer *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBuffer_new(self->ptr.getBuffer(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyBuffer_new(self->ptr.getBuffer(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUBuffer::getBuffer(): unknown arguments:\n(uint32_t index) -> const Buffer\n(uint32_t index) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUBuffer_get_mask(PYFUBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUBuffer_get_num_buffers(PYFUBuffer *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumBuffers());
	}
	static PyObject *pyFUBuffer_str(PYFUBuffer *self) {
		return PyUnicode_FromString(String::format("FUBuffer Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUBuffer_bool(PYFUBuffer *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Command
	TS_PYAPI bool isPYCommand(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYCommand_Type || type == &PYD3D12Command_Type || type == &PYMTLCommand_Type || type == &PYVKCommand_Type || type == &PYFUCommand_Type);
	}
	TS_PYAPI Command &pyCommand_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYCommand_Type || type == &PYD3D12Command_Type || type == &PYMTLCommand_Type || type == &PYVKCommand_Type || type == &PYFUCommand_Type) return ((PYCommand*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Command_get(): can't get Command from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Command_get(): can't get Command from None");
		static Command ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCommand_new(const Command &ptr) {
		PYCommand *ret = (PYCommand*)PyObject_New(PYCommand, &PYCommand_Type);
		new(&ret->ptr) Command(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCommand_new(Command &&ptr) {
		PYCommand *ret = (PYCommand*)PyObject_New(PYCommand, &PYCommand_Type);
		new(&ret->ptr) Command(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyCommand_init(PYCommand *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Command();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::Command(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCommand_dealloc(PYCommand *self) {
		self->ptr.~Command();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCommand_equalPtr(PYCommand *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCommand_clonePtr(PYCommand *self, PyObject *args) {
		return pyCommand_new(self->ptr.clonePtr());
	}
	static PyObject *pyCommand_clearPtr(PYCommand *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCommand_destroyPtr(PYCommand *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCommand_acquirePtr(PYCommand *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCommand_unacquirePtr(PYCommand *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCommand_isValidPtr(PYCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCommand_isOwnerPtr(PYCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCommand_isConstPtr(PYCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCommand_getCountPtr(PYCommand *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCommand_getInternalPtr(PYCommand *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Command_getPlatform(PYCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getPlatformName(PYCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getIndex(PYCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setPipeline(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
			if(!isPYPipeline(pipeline_)) break;
			Pipeline &pipeline = pyPipeline_get(pipeline_);
			self->ptr.setPipeline(pipeline);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setPipeline(): unknown arguments:\n(Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getPipeline(PYCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyPipeline_new(self->ptr.getPipeline());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getPipeline(): unknown arguments:\n(void) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setViewport(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *viewport_ = nullptr;
		static const char *kwlist[] = { "index", "viewport", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &viewport_)) {
			if(!isPYViewport(viewport_)) break;
			const Viewport &viewport = pyViewport_get(viewport_);
			self->ptr.setViewport(index, viewport);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setViewport(): unknown arguments:\n(uint32_t index, const Viewport viewport) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setViewports(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *viewports_ = nullptr;
		uint32_t num_viewports = {};
		static const char *kwlist[] = { "viewports", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &viewports_)) {
			if(!isPYArray(viewports_)) break;
			Array<Viewport> viewports(pyArray_size(viewports_));
			for(uint32_t i = 0; i < viewports.size(); i++) viewports[i] = pyViewport_get(pyArray_get(viewports_, i));
			self->ptr.setViewports(viewports.get(), num_viewports = viewports.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setViewports(): unknown arguments:\n(const Viewport viewports[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setScissor(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *scissor_ = nullptr;
		static const char *kwlist[] = { "index", "scissor", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &scissor_)) {
			if(!isPYScissor(scissor_)) break;
			const Scissor &scissor = pyScissor_get(scissor_);
			self->ptr.setScissor(index, scissor);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setScissor(): unknown arguments:\n(uint32_t index, const Scissor scissor) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setScissors(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *scissors_ = nullptr;
		uint32_t num_scissors = {};
		static const char *kwlist[] = { "scissors", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scissors_)) {
			if(!isPYArray(scissors_)) break;
			Array<Scissor> scissors(pyArray_size(scissors_));
			for(uint32_t i = 0; i < scissors.size(); i++) scissors[i] = pyScissor_get(pyArray_get(scissors_, i));
			self->ptr.setScissors(scissors.get(), num_scissors = scissors.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setScissors(): unknown arguments:\n(const Scissor scissors[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setSampler(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *sampler_ = nullptr;
		static const char *kwlist[] = { "index", "sampler", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &sampler_)) {
			if(!isPYSampler(sampler_)) break;
			Sampler &sampler = pySampler_get(sampler_);
			self->ptr.setSampler(index, sampler);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setSampler(): unknown arguments:\n(uint32_t index, Sampler sampler) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setSamplers(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *samplers_ = nullptr;
		static const char *kwlist[] = { "index", "samplers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &samplers_)) {
			if(!isPYArray(samplers_)) break;
			Array<Sampler> samplers; Array<PyObject*> samplers__; pyArray_get(samplers_, samplers__);
			for(PyObject *object : samplers__) samplers.append(pySampler_get(object));
			self->ptr.setSamplers(index, samplers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setSamplers(): unknown arguments:\n(uint32_t index, Array<Sampler> samplers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTexture(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "index", "texture", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &texture_, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setTexture(index, texture, slice);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "index", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				self->ptr.setTexture(index, texture);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTexture(): unknown arguments:\n(uint32_t index, Texture texture, const Slice slice) -> void\n(uint32_t index, Texture texture) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTextures(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *textures_ = nullptr;
		static const char *kwlist[] = { "index", "textures", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &textures_)) {
			if(!isPYArray(textures_)) break;
			Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
			for(PyObject *object : textures__) textures.append(pyTexture_get(object));
			self->ptr.setTextures(index, textures);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTextures(): unknown arguments:\n(uint32_t index, Array<Texture> textures) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setSurfaceTexture(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "index", "texture", "slice", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO|I", (char**)kwlist, &index, &texture_, &slice_, &format)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setSurfaceTexture(index, texture, slice, (Format)format);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "index", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				self->ptr.setSurfaceTexture(index, texture);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setSurfaceTexture(): unknown arguments:\n(uint32_t index, Texture texture, const Slice slice, Format format) -> void\n(uint32_t index, Texture texture) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setSurfaceTextures(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *textures_ = nullptr;
		static const char *kwlist[] = { "index", "textures", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &textures_)) {
			if(!isPYArray(textures_)) break;
			Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
			for(PyObject *object : textures__) textures.append(pyTexture_get(object));
			self->ptr.setSurfaceTextures(index, textures);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setSurfaceTextures(): unknown arguments:\n(uint32_t index, Array<Texture> textures) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getUniformData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getUniformData(index, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getUniformData(): unknown arguments:\n(uint32_t index, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setUniformData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setUniformData(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setUniformData(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setUniformBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		size_t size = 0;
		static const char *kwlist[] = { "index", "buffer", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|nn", (char**)kwlist, &index, &buffer_, &offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setUniformBuffer(index, buffer, offset, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setUniformBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer, size_t offset, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setUniformOffset(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "index", "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|i", (char**)kwlist, &index, &offset, &relative)) {
			self->ptr.setUniformOffset(index, offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setUniformOffset(): unknown arguments:\n(uint32_t index, size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setUniformBuffers(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		PyObject *offsets_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", "offsets", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &buffers_, &offsets_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			if(!isPYArray(offsets_)) break;
			Array<size_t> offsets; pyArray_get(offsets_, offsets);
			self->ptr.setUniformBuffers(index, buffers, offsets);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "index", "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.setUniformBuffers(index, buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setUniformBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers, Array<size_t> offsets) -> void\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getStorageData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getStorageData(index, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getStorageData(): unknown arguments:\n(uint32_t index, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setStorageData(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageData(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		size_t size = 0;
		static const char *kwlist[] = { "index", "buffer", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|nn", (char**)kwlist, &index, &buffer_, &offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setStorageBuffer(index, buffer, offset, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer, size_t offset, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageOffset(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "index", "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|i", (char**)kwlist, &index, &offset, &relative)) {
			self->ptr.setStorageOffset(index, offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageOffset(): unknown arguments:\n(uint32_t index, size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageBuffers(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		PyObject *offsets_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", "offsets", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &buffers_, &offsets_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			if(!isPYArray(offsets_)) break;
			Array<size_t> offsets; pyArray_get(offsets_, offsets);
			self->ptr.setStorageBuffers(index, buffers, offsets);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "index", "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.setStorageBuffers(index, buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers, Array<size_t> offsets) -> void\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTracing(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tracing_ = nullptr;
		static const char *kwlist[] = { "index", "tracing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tracing_)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			self->ptr.setTracing(index, tracing);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTracing(): unknown arguments:\n(uint32_t index, Tracing tracing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTracings(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tracings_ = nullptr;
		static const char *kwlist[] = { "index", "tracings", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tracings_)) {
			if(!isPYArray(tracings_)) break;
			Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
			for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
			self->ptr.setTracings(index, tracings);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTracings(): unknown arguments:\n(uint32_t index, Array<Tracing> tracings) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTexelBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		static const char *kwlist[] = { "index", "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffer_)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setTexelBuffer(index, buffer);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTexelBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTexelBuffers(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			self->ptr.setTexelBuffers(index, buffers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTexelBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTextureTable(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "index", "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &table_)) {
			if(!isPYTextureTable(table_)) break;
			TextureTable &table = pyTextureTable_get(table_);
			self->ptr.setTextureTable(index, table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTextureTable(): unknown arguments:\n(uint32_t index, TextureTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setTextureTables(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tables_ = nullptr;
		static const char *kwlist[] = { "index", "tables", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tables_)) {
			if(!isPYArray(tables_)) break;
			Array<TextureTable> tables; Array<PyObject*> tables__; pyArray_get(tables_, tables__);
			for(PyObject *object : tables__) tables.append(pyTextureTable_get(object));
			self->ptr.setTextureTables(index, tables);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setTextureTables(): unknown arguments:\n(uint32_t index, Array<TextureTable> tables) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageTable(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "index", "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &table_)) {
			if(!isPYBufferTable(table_)) break;
			BufferTable &table = pyBufferTable_get(table_);
			self->ptr.setStorageTable(index, table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageTable(): unknown arguments:\n(uint32_t index, BufferTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStorageTables(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tables_ = nullptr;
		static const char *kwlist[] = { "index", "tables", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tables_)) {
			if(!isPYArray(tables_)) break;
			Array<BufferTable> tables; Array<PyObject*> tables__; pyArray_get(tables_, tables__);
			for(PyObject *object : tables__) tables.append(pyBufferTable_get(object));
			self->ptr.setStorageTables(index, tables);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStorageTables(): unknown arguments:\n(uint32_t index, Array<BufferTable> tables) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getVertexData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getVertexData(index, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getVertexData(): unknown arguments:\n(uint32_t index, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setVertexData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setVertexData(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setVertexData(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setVertexBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "index", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &index, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setVertexBuffer(index, buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setVertexBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setVertexOffset(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "index", "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|i", (char**)kwlist, &index, &offset, &relative)) {
			self->ptr.setVertexOffset(index, offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setVertexOffset(): unknown arguments:\n(uint32_t index, size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setVertexBuffers(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		PyObject *offsets_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", "offsets", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &buffers_, &offsets_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			if(!isPYArray(offsets_)) break;
			Array<size_t> offsets; pyArray_get(offsets_, offsets);
			self->ptr.setVertexBuffers(index, buffers, offsets);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "index", "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.setVertexBuffers(index, buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setVertexBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers, Array<size_t> offsets) -> void\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getIndexData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		size_t size = {};
		static const char *kwlist[] = { "format", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &format, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getIndexData((Format)format, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getIndexData(): unknown arguments:\n(Format format, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndexData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "format", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &format, &src_buffer)) {
			self->ptr.setIndexData((Format)format, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndexData(): unknown arguments:\n(Format format, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndexBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "format", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &format, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setIndexBuffer((Format)format, buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndexBuffer(): unknown arguments:\n(Format format, Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndexOffset(PYCommand *self, PyObject *args, PyObject *kwargs) {
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|i", (char**)kwlist, &offset, &relative)) {
			self->ptr.setIndexOffset(offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndexOffset(): unknown arguments:\n(size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_getIndirectData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		size_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getIndirectData(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::getIndirectData(): unknown arguments:\n(size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndirectData(PYCommand *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			self->ptr.setIndirectData(src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndirectData(): unknown arguments:\n(const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndirectBuffer(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setIndirectBuffer(buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndirectBuffer(): unknown arguments:\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setIndirectOffset(PYCommand *self, PyObject *args, PyObject *kwargs) {
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|i", (char**)kwlist, &offset, &relative)) {
			self->ptr.setIndirectOffset(offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setIndirectOffset(): unknown arguments:\n(size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setBlendColor(PYCommand *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
			self->ptr.setBlendColor(r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setBlendColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setBlendColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_setStencilRef(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t ref = {};
		static const char *kwlist[] = { "ref", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &ref)) {
			self->ptr.setStencilRef(ref);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::setStencilRef(): unknown arguments:\n(uint32_t ref) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawArrays(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		uint32_t base_vertex = 0;
		static const char *kwlist[] = { "num_vertices", "base_vertex", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &num_vertices, &base_vertex)) {
			self->ptr.drawArrays(num_vertices, base_vertex);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawArrays(): unknown arguments:\n(uint32_t num_vertices, uint32_t base_vertex) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawArraysInstanced(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		uint32_t base_vertex = {};
		uint32_t num_instances = {};
		uint32_t base_instance = 0;
		static const char *kwlist[] = { "num_vertices", "base_vertex", "num_instances", "base_instance", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &num_vertices, &base_vertex, &num_instances, &base_instance)) {
			self->ptr.drawArraysInstanced(num_vertices, base_vertex, num_instances, base_instance);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawArraysInstanced(): unknown arguments:\n(uint32_t num_vertices, uint32_t base_vertex, uint32_t num_instances, uint32_t base_instance) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawArraysIndirect(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		uint32_t num_draws = {};
		size_t stride = sizeof(Command::DrawArraysIndirect);
		static const char *kwlist[] = { "buffer", "offset", "num_draws", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnI|n", (char**)kwlist, &buffer_, &offset, &num_draws, &stride)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.drawArraysIndirect(buffer, offset, num_draws, stride);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t num_draws = {};
			size_t stride = sizeof(Command::DrawArraysIndirect);
			static const char *kwlist[] = { "num_draws", "stride", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|n", (char**)kwlist, &num_draws, &stride)) {
				self->ptr.drawArraysIndirect(num_draws, stride);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawArraysIndirect(): unknown arguments:\n(Buffer buffer, size_t offset, uint32_t num_draws, size_t stride) -> void\n(uint32_t num_draws, size_t stride) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawElements(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		uint32_t base_index = 0;
		int32_t base_vertex = 0;
		static const char *kwlist[] = { "num_indices", "base_index", "base_vertex", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|Ii", (char**)kwlist, &num_indices, &base_index, &base_vertex)) {
			self->ptr.drawElements(num_indices, base_index, base_vertex);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawElements(): unknown arguments:\n(uint32_t num_indices, uint32_t base_index, int32_t base_vertex) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawElementsInstanced(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		uint32_t base_index = {};
		int32_t base_vertex = {};
		uint32_t num_instances = {};
		uint32_t base_instance = 0;
		static const char *kwlist[] = { "num_indices", "base_index", "base_vertex", "num_instances", "base_instance", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIiI|I", (char**)kwlist, &num_indices, &base_index, &base_vertex, &num_instances, &base_instance)) {
			self->ptr.drawElementsInstanced(num_indices, base_index, base_vertex, num_instances, base_instance);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t num_indices = {};
			uint32_t base_index = {};
			uint32_t num_instances = {};
			static const char *kwlist[] = { "num_indices", "base_index", "num_instances", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &num_indices, &base_index, &num_instances)) {
				self->ptr.drawElementsInstanced(num_indices, base_index, num_instances);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawElementsInstanced(): unknown arguments:\n(uint32_t num_indices, uint32_t base_index, int32_t base_vertex, uint32_t num_instances, uint32_t base_instance) -> void\n(uint32_t num_indices, uint32_t base_index, uint32_t num_instances) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawElementsIndirect(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		uint32_t num_draws = {};
		size_t stride = sizeof(Command::DrawElementsIndirect);
		static const char *kwlist[] = { "buffer", "offset", "num_draws", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnI|n", (char**)kwlist, &buffer_, &offset, &num_draws, &stride)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.drawElementsIndirect(buffer, offset, num_draws, stride);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t num_draws = {};
			size_t stride = sizeof(Command::DrawElementsIndirect);
			static const char *kwlist[] = { "num_draws", "stride", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|n", (char**)kwlist, &num_draws, &stride)) {
				self->ptr.drawElementsIndirect(num_draws, stride);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawElementsIndirect(): unknown arguments:\n(Buffer buffer, size_t offset, uint32_t num_draws, size_t stride) -> void\n(uint32_t num_draws, size_t stride) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawMesh(PYCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = 1;
		uint32_t depth = 1;
		static const char *kwlist[] = { "width", "height", "depth", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|II", (char**)kwlist, &width, &height, &depth)) {
			self->ptr.drawMesh(width, height, depth);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawMesh(): unknown arguments:\n(uint32_t width, uint32_t height, uint32_t depth) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_drawMeshIndirect(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		uint32_t num_draws = {};
		size_t stride = sizeof(Command::DrawMeshIndirect);
		static const char *kwlist[] = { "buffer", "offset", "num_draws", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnI|n", (char**)kwlist, &buffer_, &offset, &num_draws, &stride)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.drawMeshIndirect(buffer, offset, num_draws, stride);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t num_draws = {};
			size_t stride = sizeof(Command::DrawMeshIndirect);
			static const char *kwlist[] = { "num_draws", "stride", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|n", (char**)kwlist, &num_draws, &stride)) {
				self->ptr.drawMeshIndirect(num_draws, stride);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::drawMeshIndirect(): unknown arguments:\n(Buffer buffer, size_t offset, uint32_t num_draws, size_t stride) -> void\n(uint32_t num_draws, size_t stride) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_beginConditional(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		static const char *kwlist[] = { "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.beginConditional(buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::beginConditional(): unknown arguments:\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_endConditional(PYCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.endConditional();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::endConditional(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_beginQuery(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			return PyLong_FromLong(self->ptr.beginQuery(query));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::beginQuery(): unknown arguments:\n(Query query) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_endQuery(PYCommand *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			self->ptr.endQuery(query);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Command::endQuery(): unknown arguments:\n(Query query) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Command_get_platform(PYCommand *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Command_get_platform_name(PYCommand *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Command_get_index(PYCommand *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Command_get_pipeline(PYCommand *self, void *offset) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *pyCommand_str(PYCommand *self) {
		return PyUnicode_FromString(String::format("Command Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCommand_bool(PYCommand *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Command::DrawArraysIndirect
	TS_PYAPI bool isPYCommandDrawArraysIndirect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCommandDrawArraysIndirect_Type);
	}
	TS_PYAPI Command::DrawArraysIndirect &pyCommandDrawArraysIndirect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCommandDrawArraysIndirect_Type) return ((PYCommandDrawArraysIndirect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CommandDrawArraysIndirect_get(): can't get CommandDrawArraysIndirect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CommandDrawArraysIndirect_get(): can't get CommandDrawArraysIndirect from None");
		static Command::DrawArraysIndirect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCommandDrawArraysIndirect_new(const Command::DrawArraysIndirect &ptr) {
		PYCommandDrawArraysIndirect *ret = (PYCommandDrawArraysIndirect*)PyObject_New(PYCommandDrawArraysIndirect, &PYCommandDrawArraysIndirect_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyCommandDrawArraysIndirect_buffer(PYCommandDrawArraysIndirect *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Command::DrawArraysIndirect);
			view->itemsize = sizeof(Command::DrawArraysIndirect);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::Command::DrawElementsIndirect
	TS_PYAPI bool isPYCommandDrawElementsIndirect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCommandDrawElementsIndirect_Type);
	}
	TS_PYAPI Command::DrawElementsIndirect &pyCommandDrawElementsIndirect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCommandDrawElementsIndirect_Type) return ((PYCommandDrawElementsIndirect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CommandDrawElementsIndirect_get(): can't get CommandDrawElementsIndirect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CommandDrawElementsIndirect_get(): can't get CommandDrawElementsIndirect from None");
		static Command::DrawElementsIndirect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCommandDrawElementsIndirect_new(const Command::DrawElementsIndirect &ptr) {
		PYCommandDrawElementsIndirect *ret = (PYCommandDrawElementsIndirect*)PyObject_New(PYCommandDrawElementsIndirect, &PYCommandDrawElementsIndirect_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyCommandDrawElementsIndirect_buffer(PYCommandDrawElementsIndirect *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Command::DrawElementsIndirect);
			view->itemsize = sizeof(Command::DrawElementsIndirect);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::Command::DrawMeshIndirect
	TS_PYAPI bool isPYCommandDrawMeshIndirect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCommandDrawMeshIndirect_Type);
	}
	TS_PYAPI Command::DrawMeshIndirect &pyCommandDrawMeshIndirect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCommandDrawMeshIndirect_Type) return ((PYCommandDrawMeshIndirect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CommandDrawMeshIndirect_get(): can't get CommandDrawMeshIndirect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CommandDrawMeshIndirect_get(): can't get CommandDrawMeshIndirect from None");
		static Command::DrawMeshIndirect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCommandDrawMeshIndirect_new(const Command::DrawMeshIndirect &ptr) {
		PYCommandDrawMeshIndirect *ret = (PYCommandDrawMeshIndirect*)PyObject_New(PYCommandDrawMeshIndirect, &PYCommandDrawMeshIndirect_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyCommandDrawMeshIndirect_buffer(PYCommandDrawMeshIndirect *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Command::DrawMeshIndirect);
			view->itemsize = sizeof(Command::DrawMeshIndirect);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::D3D12Command
	static void pyD3D12Command_base(PYD3D12Command *self) {
		new(&self->base.ptr) Command(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Command(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Command_Type);
	}
	TS_PYAPI D3D12Command &pyD3D12Command_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Command_Type) return ((PYD3D12Command*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Command_get(): can't get D3D12Command from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Command_get(): can't get D3D12Command from None");
		static D3D12Command ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Command_new(const D3D12Command &ptr) {
		PYD3D12Command *ret = (PYD3D12Command*)PyObject_New(PYD3D12Command, &PYD3D12Command_Type);
		new(&ret->ptr) D3D12Command(ptr); pyD3D12Command_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Command_new(D3D12Command &&ptr) {
		PYD3D12Command *ret = (PYD3D12Command*)PyObject_New(PYD3D12Command, &PYD3D12Command_Type);
		new(&ret->ptr) D3D12Command(move(ptr)); pyD3D12Command_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Command_init(PYD3D12Command *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCommand(object)) {
				new(&self->ptr) D3D12Command(((PYCommand*)object)->ptr);
				pyD3D12Command_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Command();
			pyD3D12Command_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Command::D3D12Command(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Command_dealloc(PYD3D12Command *self) {
		self->ptr.~D3D12Command();
		self->base.ptr.~Command();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Command_equalPtr(PYD3D12Command *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Command_clonePtr(PYD3D12Command *self, PyObject *args) {
		return pyD3D12Command_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Command_clearPtr(PYD3D12Command *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Command_destroyPtr(PYD3D12Command *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Command_acquirePtr(PYD3D12Command *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Command_unacquirePtr(PYD3D12Command *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Command_isValidPtr(PYD3D12Command *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Command_isOwnerPtr(PYD3D12Command *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Command_isConstPtr(PYD3D12Command *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Command_getCountPtr(PYD3D12Command *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Command_getInternalPtr(PYD3D12Command *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Command_getCommand(PYD3D12Command *self, PyObject *args) {
		return pyCommand_new(self->ptr.getCommand());
	}
	static PyObject *D3D12Command_getD3D12Command(PYD3D12Command *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D12Command());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Command::getD3D12Command(): unknown arguments:\n(void) -> ID3D12GraphicsCommandList*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Command_update(PYD3D12Command *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Command::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Command_get_d3d12_command(PYD3D12Command *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D12Command());
	}
	static PyObject *pyD3D12Command_str(PYD3D12Command *self) {
		return PyUnicode_FromString(String::format("D3D12Command Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Command_bool(PYD3D12Command *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLCommand
	static void pyMTLCommand_base(PYMTLCommand *self) {
		new(&self->base.ptr) Command(self->ptr);
	}
	TS_PYAPI bool isPYMTLCommand(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLCommand_Type);
	}
	TS_PYAPI MTLCommand &pyMTLCommand_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLCommand_Type) return ((PYMTLCommand*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLCommand_get(): can't get MTLCommand from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLCommand_get(): can't get MTLCommand from None");
		static MTLCommand ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLCommand_new(const MTLCommand &ptr) {
		PYMTLCommand *ret = (PYMTLCommand*)PyObject_New(PYMTLCommand, &PYMTLCommand_Type);
		new(&ret->ptr) MTLCommand(ptr); pyMTLCommand_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLCommand_new(MTLCommand &&ptr) {
		PYMTLCommand *ret = (PYMTLCommand*)PyObject_New(PYMTLCommand, &PYMTLCommand_Type);
		new(&ret->ptr) MTLCommand(move(ptr)); pyMTLCommand_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLCommand_init(PYMTLCommand *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCommand(object)) {
				new(&self->ptr) MTLCommand(((PYCommand*)object)->ptr);
				pyMTLCommand_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLCommand();
			pyMTLCommand_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCommand::MTLCommand(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLCommand_dealloc(PYMTLCommand *self) {
		self->ptr.~MTLCommand();
		self->base.ptr.~Command();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLCommand_equalPtr(PYMTLCommand *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLCommand_clonePtr(PYMTLCommand *self, PyObject *args) {
		return pyMTLCommand_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLCommand_clearPtr(PYMTLCommand *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCommand_destroyPtr(PYMTLCommand *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCommand_acquirePtr(PYMTLCommand *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCommand_unacquirePtr(PYMTLCommand *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCommand_isValidPtr(PYMTLCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLCommand_isOwnerPtr(PYMTLCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLCommand_isConstPtr(PYMTLCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLCommand_getCountPtr(PYMTLCommand *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLCommand_getInternalPtr(PYMTLCommand *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLCommand_getCommand(PYMTLCommand *self, PyObject *args) {
		return pyCommand_new(self->ptr.getCommand());
	}
	static PyObject *MTLCommand_getEncoder(PYMTLCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCommand::getEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCommand_flush(PYMTLCommand *self, PyObject *args, PyObject *kwargs) {
		void *encoder = nullptr;
		int32_t enqueue = false;
		static const char *kwlist[] = { "encoder", "enqueue", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|i", (char**)kwlist, &encoder, &enqueue)) {
			self->ptr.flush(encoder, (enqueue != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			int32_t create = false;
			int32_t enqueue = false;
			static const char *kwlist[] = { "create", "enqueue", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", (char**)kwlist, &create, &enqueue)) {
				self->ptr.flush((create != 0), (enqueue != 0));
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCommand::flush(): unknown arguments:\n(void* encoder, bool enqueue) -> void\n(bool create, bool enqueue) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCommand_update(PYMTLCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCommand::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCommand_get_encoder(PYMTLCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getEncoder());
	}
	static PyObject *pyMTLCommand_str(PYMTLCommand *self) {
		return PyUnicode_FromString(String::format("MTLCommand Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLCommand_bool(PYMTLCommand *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKCommand
	static void pyVKCommand_base(PYVKCommand *self) {
		new(&self->base.ptr) Command(self->ptr);
	}
	TS_PYAPI bool isPYVKCommand(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKCommand_Type);
	}
	TS_PYAPI VKCommand &pyVKCommand_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKCommand_Type) return ((PYVKCommand*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKCommand_get(): can't get VKCommand from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKCommand_get(): can't get VKCommand from None");
		static VKCommand ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKCommand_new(const VKCommand &ptr) {
		PYVKCommand *ret = (PYVKCommand*)PyObject_New(PYVKCommand, &PYVKCommand_Type);
		new(&ret->ptr) VKCommand(ptr); pyVKCommand_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKCommand_new(VKCommand &&ptr) {
		PYVKCommand *ret = (PYVKCommand*)PyObject_New(PYVKCommand, &PYVKCommand_Type);
		new(&ret->ptr) VKCommand(move(ptr)); pyVKCommand_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKCommand_init(PYVKCommand *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCommand(object)) {
				new(&self->ptr) VKCommand(((PYCommand*)object)->ptr);
				pyVKCommand_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKCommand();
			pyVKCommand_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::VKCommand(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKCommand_dealloc(PYVKCommand *self) {
		self->ptr.~VKCommand();
		self->base.ptr.~Command();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKCommand_equalPtr(PYVKCommand *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKCommand_clonePtr(PYVKCommand *self, PyObject *args) {
		return pyVKCommand_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKCommand_clearPtr(PYVKCommand *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCommand_destroyPtr(PYVKCommand *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCommand_acquirePtr(PYVKCommand *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCommand_unacquirePtr(PYVKCommand *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCommand_isValidPtr(PYVKCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKCommand_isOwnerPtr(PYVKCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKCommand_isConstPtr(PYVKCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKCommand_getCountPtr(PYVKCommand *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKCommand_getInternalPtr(PYVKCommand *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKCommand_getCommand(PYVKCommand *self, PyObject *args) {
		return pyCommand_new(self->ptr.getCommand());
	}
	static PyObject *VKCommand_getVKCommand(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVKCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getVKCommand(): unknown arguments:\n(void) -> VkCommandBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_getSamplerDescriptor(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSamplerDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getSamplerDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_getImageDescriptor(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getImageDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getImageDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_getBufferDescriptor(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getBufferDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_getTracingDescriptor(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTracingDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getTracingDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_getTexelDescriptor(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTexelDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::getTexelDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_update(PYVKCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCommand::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCommand_get_vk_command(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVKCommand());
	}
	static PyObject *VKCommand_get_sampler_descriptor(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSamplerDescriptor());
	}
	static PyObject *VKCommand_get_image_descriptor(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getImageDescriptor());
	}
	static PyObject *VKCommand_get_buffer_descriptor(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferDescriptor());
	}
	static PyObject *VKCommand_get_tracing_descriptor(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTracingDescriptor());
	}
	static PyObject *VKCommand_get_texel_descriptor(PYVKCommand *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTexelDescriptor());
	}
	static PyObject *pyVKCommand_str(PYVKCommand *self) {
		return PyUnicode_FromString(String::format("VKCommand Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKCommand_bool(PYVKCommand *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUCommand
	static void pyFUCommand_base(PYFUCommand *self) {
		new(&self->base.ptr) Command(self->ptr);
	}
	TS_PYAPI bool isPYFUCommand(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUCommand_Type);
	}
	TS_PYAPI FUCommand &pyFUCommand_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUCommand_Type) return ((PYFUCommand*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUCommand_get(): can't get FUCommand from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUCommand_get(): can't get FUCommand from None");
		static FUCommand ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUCommand_new(const FUCommand &ptr) {
		PYFUCommand *ret = (PYFUCommand*)PyObject_New(PYFUCommand, &PYFUCommand_Type);
		new(&ret->ptr) FUCommand(ptr); pyFUCommand_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUCommand_new(FUCommand &&ptr) {
		PYFUCommand *ret = (PYFUCommand*)PyObject_New(PYFUCommand, &PYFUCommand_Type);
		new(&ret->ptr) FUCommand(move(ptr)); pyFUCommand_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUCommand_init(PYFUCommand *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCommand(object)) {
				new(&self->ptr) FUCommand(((PYCommand*)object)->ptr);
				pyFUCommand_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUCommand();
			pyFUCommand_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *commands_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "commands", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &commands_, &owner)) {
				if(!isPYArray(commands_)) break;
				Array<Command> commands; Array<PyObject*> commands__; pyArray_get(commands_, commands__);
				for(PyObject *object : commands__) commands.append(pyCommand_get(object));
				new(&self->ptr) FUCommand(commands, (owner != 0));
				pyFUCommand_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCommand::FUCommand(): unknown arguments:\n(void)\n(Array<Command> commands, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUCommand_dealloc(PYFUCommand *self) {
		self->ptr.~FUCommand();
		self->base.ptr.~Command();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUCommand_equalPtr(PYFUCommand *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUCommand_clonePtr(PYFUCommand *self, PyObject *args) {
		return pyFUCommand_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUCommand_clearPtr(PYFUCommand *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCommand_destroyPtr(PYFUCommand *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCommand_acquirePtr(PYFUCommand *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCommand_unacquirePtr(PYFUCommand *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCommand_isValidPtr(PYFUCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUCommand_isOwnerPtr(PYFUCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUCommand_isConstPtr(PYFUCommand *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUCommand_getCountPtr(PYFUCommand *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUCommand_getInternalPtr(PYFUCommand *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUCommand_getCommand(PYFUCommand *self, PyObject *args) {
		return pyCommand_new(self->ptr.getCommand());
	}
	static PyObject *FUCommand_setMask(PYFUCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCommand::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCommand_getMask(PYFUCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCommand::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCommand_getNumCommands(PYFUCommand *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumCommands());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCommand::getNumCommands(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCommand_getCommand(PYFUCommand *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyCommand_new(self->ptr.getCommand(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyCommand_new(self->ptr.getCommand(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCommand::getCommand(): unknown arguments:\n(uint32_t index) -> const Command\n(uint32_t index) -> Command\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCommand_get_mask(PYFUCommand *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUCommand_get_num_commands(PYFUCommand *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumCommands());
	}
	static PyObject *pyFUCommand_str(PYFUCommand *self) {
		return PyUnicode_FromString(String::format("FUCommand Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUCommand_bool(PYFUCommand *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Compute
	TS_PYAPI bool isPYCompute(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYCompute_Type || type == &PYD3D12Compute_Type || type == &PYMTLCompute_Type || type == &PYVKCompute_Type || type == &PYFUCompute_Type);
	}
	TS_PYAPI Compute &pyCompute_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYCompute_Type || type == &PYD3D12Compute_Type || type == &PYMTLCompute_Type || type == &PYVKCompute_Type || type == &PYFUCompute_Type) return ((PYCompute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Compute_get(): can't get Compute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Compute_get(): can't get Compute from None");
		static Compute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCompute_new(const Compute &ptr) {
		PYCompute *ret = (PYCompute*)PyObject_New(PYCompute, &PYCompute_Type);
		new(&ret->ptr) Compute(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCompute_new(Compute &&ptr) {
		PYCompute *ret = (PYCompute*)PyObject_New(PYCompute, &PYCompute_Type);
		new(&ret->ptr) Compute(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyCompute_init(PYCompute *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Compute();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::Compute(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCompute_dealloc(PYCompute *self) {
		self->ptr.~Compute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCompute_equalPtr(PYCompute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCompute_clonePtr(PYCompute *self, PyObject *args) {
		return pyCompute_new(self->ptr.clonePtr());
	}
	static PyObject *pyCompute_clearPtr(PYCompute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCompute_destroyPtr(PYCompute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCompute_acquirePtr(PYCompute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCompute_unacquirePtr(PYCompute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCompute_isValidPtr(PYCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCompute_isOwnerPtr(PYCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCompute_isConstPtr(PYCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCompute_getCountPtr(PYCompute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCompute_getInternalPtr(PYCompute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Compute_getPlatform(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getPlatformName(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getIndex(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setKernel(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *kernel_ = nullptr;
		static const char *kwlist[] = { "kernel", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &kernel_)) {
			if(!isPYKernel(kernel_)) break;
			Kernel &kernel = pyKernel_get(kernel_);
			self->ptr.setKernel(kernel);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setKernel(): unknown arguments:\n(Kernel kernel) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getKernel(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyKernel_new(self->ptr.getKernel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getKernel(): unknown arguments:\n(void) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTraversal(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *traversal_ = nullptr;
		static const char *kwlist[] = { "traversal", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &traversal_)) {
			if(!isPYTraversal(traversal_)) break;
			Traversal &traversal = pyTraversal_get(traversal_);
			self->ptr.setTraversal(traversal);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTraversal(): unknown arguments:\n(Traversal traversal) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getTraversal(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTraversal_new(self->ptr.getTraversal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getTraversal(): unknown arguments:\n(void) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setSampler(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *sampler_ = nullptr;
		static const char *kwlist[] = { "index", "sampler", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &sampler_)) {
			if(!isPYSampler(sampler_)) break;
			Sampler &sampler = pySampler_get(sampler_);
			self->ptr.setSampler(index, sampler);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setSampler(): unknown arguments:\n(uint32_t index, Sampler sampler) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setSamplers(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *samplers_ = nullptr;
		static const char *kwlist[] = { "index", "samplers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &samplers_)) {
			if(!isPYArray(samplers_)) break;
			Array<Sampler> samplers; Array<PyObject*> samplers__; pyArray_get(samplers_, samplers__);
			for(PyObject *object : samplers__) samplers.append(pySampler_get(object));
			self->ptr.setSamplers(index, samplers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setSamplers(): unknown arguments:\n(uint32_t index, Array<Sampler> samplers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTexture(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *dest_origin_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *image_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "texture", "dest_origin", "dest_slice", "image", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOO", (char**)kwlist, &texture_, &dest_origin_, &dest_slice_, &image_, &src_slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYOrigin(dest_origin_)) break;
			const Origin &dest_origin = pyOrigin_get(dest_origin_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.setTexture(texture, dest_origin, dest_slice, image, src_slice));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texture_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "index", "texture", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &texture_, &slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				self->ptr.setTexture(index, texture, slice);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_origin", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &texture_, &dest_origin_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, dest_origin, image));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_slice", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &texture_, &dest_slice_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, dest_slice, image));
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "index", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				self->ptr.setTexture(index, texture);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, image));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTexture(): unknown arguments:\n(Texture texture, const Origin dest_origin, const Slice dest_slice, const Image image, const Slice src_slice) -> bool\n(uint32_t index, Texture texture, const Slice slice) -> void\n(Texture texture, const Origin dest_origin, const Image image) -> bool\n(Texture texture, const Slice dest_slice, const Image image) -> bool\n(uint32_t index, Texture texture) -> void\n(Texture texture, const Image image) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTextures(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *textures_ = nullptr;
		static const char *kwlist[] = { "index", "textures", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &textures_)) {
			if(!isPYArray(textures_)) break;
			Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
			for(PyObject *object : textures__) textures.append(pyTexture_get(object));
			self->ptr.setTextures(index, textures);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTextures(): unknown arguments:\n(uint32_t index, Array<Texture> textures) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setSurfaceTexture(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "index", "texture", "slice", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO|I", (char**)kwlist, &index, &texture_, &slice_, &format)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setSurfaceTexture(index, texture, slice, (Format)format);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "index", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				self->ptr.setSurfaceTexture(index, texture);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setSurfaceTexture(): unknown arguments:\n(uint32_t index, Texture texture, const Slice slice, Format format) -> void\n(uint32_t index, Texture texture) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setSurfaceTextures(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *textures_ = nullptr;
		static const char *kwlist[] = { "index", "textures", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &textures_)) {
			if(!isPYArray(textures_)) break;
			Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
			for(PyObject *object : textures__) textures.append(pyTexture_get(object));
			self->ptr.setSurfaceTextures(index, textures);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setSurfaceTextures(): unknown arguments:\n(uint32_t index, Array<Texture> textures) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getUniformData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getUniformData(index, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getUniformData(): unknown arguments:\n(uint32_t index, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setUniformData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setUniformData(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setUniformData(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setUniformBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		size_t size = 0;
		static const char *kwlist[] = { "index", "buffer", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|nn", (char**)kwlist, &index, &buffer_, &offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setUniformBuffer(index, buffer, offset, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setUniformBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer, size_t offset, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setUniformOffset(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "index", "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|i", (char**)kwlist, &index, &offset, &relative)) {
			self->ptr.setUniformOffset(index, offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setUniformOffset(): unknown arguments:\n(uint32_t index, size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setUniformBuffers(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		PyObject *offsets_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", "offsets", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &buffers_, &offsets_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			if(!isPYArray(offsets_)) break;
			Array<size_t> offsets; pyArray_get(offsets_, offsets);
			self->ptr.setUniformBuffers(index, buffers, offsets);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "index", "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.setUniformBuffers(index, buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setUniformBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers, Array<size_t> offsets) -> void\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getStorageData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getStorageData(index, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getStorageData(): unknown arguments:\n(uint32_t index, size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "index", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*", (char**)kwlist, &index, &src_buffer)) {
			self->ptr.setStorageData(index, src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageData(): unknown arguments:\n(uint32_t index, const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		size_t size = 0;
		static const char *kwlist[] = { "index", "buffer", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|nn", (char**)kwlist, &index, &buffer_, &offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setStorageBuffer(index, buffer, offset, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer, size_t offset, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageOffset(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "index", "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|i", (char**)kwlist, &index, &offset, &relative)) {
			self->ptr.setStorageOffset(index, offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageOffset(): unknown arguments:\n(uint32_t index, size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageBuffers(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		PyObject *offsets_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", "offsets", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOO", (char**)kwlist, &index, &buffers_, &offsets_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			if(!isPYArray(offsets_)) break;
			Array<size_t> offsets; pyArray_get(offsets_, offsets);
			self->ptr.setStorageBuffers(index, buffers, offsets);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "index", "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.setStorageBuffers(index, buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers, Array<size_t> offsets) -> void\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTracing(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tracing_ = nullptr;
		static const char *kwlist[] = { "index", "tracing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tracing_)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			self->ptr.setTracing(index, tracing);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTracing(): unknown arguments:\n(uint32_t index, Tracing tracing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTracings(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tracings_ = nullptr;
		static const char *kwlist[] = { "index", "tracings", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tracings_)) {
			if(!isPYArray(tracings_)) break;
			Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
			for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
			self->ptr.setTracings(index, tracings);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTracings(): unknown arguments:\n(uint32_t index, Array<Tracing> tracings) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTexelBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		static const char *kwlist[] = { "index", "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffer_)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setTexelBuffer(index, buffer);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTexelBuffer(): unknown arguments:\n(uint32_t index, Buffer buffer) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTexelBuffers(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *buffers_ = nullptr;
		static const char *kwlist[] = { "index", "buffers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &buffers_)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			self->ptr.setTexelBuffers(index, buffers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTexelBuffers(): unknown arguments:\n(uint32_t index, Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTextureTable(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "index", "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &table_)) {
			if(!isPYTextureTable(table_)) break;
			TextureTable &table = pyTextureTable_get(table_);
			self->ptr.setTextureTable(index, table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTextureTable(): unknown arguments:\n(uint32_t index, TextureTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setTextureTables(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tables_ = nullptr;
		static const char *kwlist[] = { "index", "tables", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tables_)) {
			if(!isPYArray(tables_)) break;
			Array<TextureTable> tables; Array<PyObject*> tables__; pyArray_get(tables_, tables__);
			for(PyObject *object : tables__) tables.append(pyTextureTable_get(object));
			self->ptr.setTextureTables(index, tables);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setTextureTables(): unknown arguments:\n(uint32_t index, Array<TextureTable> tables) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageTable(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "index", "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &table_)) {
			if(!isPYBufferTable(table_)) break;
			BufferTable &table = pyBufferTable_get(table_);
			self->ptr.setStorageTable(index, table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageTable(): unknown arguments:\n(uint32_t index, BufferTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setStorageTables(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *tables_ = nullptr;
		static const char *kwlist[] = { "index", "tables", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &tables_)) {
			if(!isPYArray(tables_)) break;
			Array<BufferTable> tables; Array<PyObject*> tables__; pyArray_get(tables_, tables__);
			for(PyObject *object : tables__) tables.append(pyBufferTable_get(object));
			self->ptr.setStorageTables(index, tables);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setStorageTables(): unknown arguments:\n(uint32_t index, Array<BufferTable> tables) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_getIndirectData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		size_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &size)) {
			return PyLong_FromVoidPtr(self->ptr.getIndirectData(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::getIndirectData(): unknown arguments:\n(size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setIndirectData(PYCompute *self, PyObject *args, PyObject *kwargs) {
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*", (char**)kwlist, &src_buffer)) {
			self->ptr.setIndirectData(src = src_buffer.buf, size = src_buffer.len);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setIndirectData(): unknown arguments:\n(const void* src, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setIndirectBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setIndirectBuffer(buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setIndirectBuffer(): unknown arguments:\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setIndirectOffset(PYCompute *self, PyObject *args, PyObject *kwargs) {
		size_t offset = {};
		int32_t relative = false;
		static const char *kwlist[] = { "offset", "relative", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|i", (char**)kwlist, &offset, &relative)) {
			self->ptr.setIndirectOffset(offset, (relative != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setIndirectOffset(): unknown arguments:\n(size_t offset, bool relative) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_dispatch(PYCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = 1;
		uint32_t depth = 1;
		static const char *kwlist[] = { "width", "height", "depth", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|II", (char**)kwlist, &width, &height, &depth)) {
			self->ptr.dispatch(width, height, depth);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texture_)) {
				if(!isPYTexture(texture_)) break;
				const Texture &texture = pyTexture_get(texture_);
				self->ptr.dispatch(texture);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *size_ = nullptr;
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &size_)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				self->ptr.dispatch(size);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::dispatch(): unknown arguments:\n(uint32_t width, uint32_t height, uint32_t depth) -> void\n(const Texture texture) -> void\n(const Size size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_dispatchIndirect(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.dispatchIndirect();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::dispatchIndirect(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_setBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "buffer", "offset", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ony*", (char**)kwlist, &buffer_, &offset, &src_buffer)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.setBuffer(buffer, offset, src = src_buffer.buf, size = src_buffer.len));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			const void *src = nullptr;
			size_t size = {};
			Py_buffer src_buffer = {};
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oy*", (char**)kwlist, &buffer_, &src_buffer)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.setBuffer(buffer, src = src_buffer.buf, size = src_buffer.len));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &src)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.setBuffer(buffer, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::setBuffer(): unknown arguments:\n(Buffer buffer, size_t offset, const void* src, size_t size) -> bool\n(Buffer buffer, const void* src, size_t size) -> bool\n(Buffer buffer, const void* src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_copyBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t dest_offset = {};
		PyObject *src_ = nullptr;
		size_t src_offset = {};
		size_t size = {};
		static const char *kwlist[] = { "buffer", "dest_offset", "src", "src_offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnOnn", (char**)kwlist, &buffer_, &dest_offset, &src_, &src_offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			if(!isPYBuffer(src_)) break;
			Buffer &src = pyBuffer_get(src_);
			return PyLong_FromLong(self->ptr.copyBuffer(buffer, dest_offset, src, src_offset, size));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			size_t dest_offset = {};
			PyObject *src_ = nullptr;
			size_t size = {};
			static const char *kwlist[] = { "buffer", "dest_offset", "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnOn", (char**)kwlist, &buffer_, &dest_offset, &src_, &size)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, dest_offset, src, size));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			PyObject *src_ = nullptr;
			size_t size = {};
			static const char *kwlist[] = { "buffer", "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &buffer_, &src_, &size)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, src, size));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &buffer_, &src_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::copyBuffer(): unknown arguments:\n(Buffer buffer, size_t dest_offset, Buffer src, size_t src_offset, size_t size) -> bool\n(Buffer buffer, size_t dest_offset, Buffer src, size_t size) -> bool\n(Buffer buffer, Buffer src, size_t size) -> bool\n(Buffer buffer, Buffer src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_clearBuffer(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		uint32_t format = 0;
		size_t offset = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "buffer", "format", "offset", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIny*", (char**)kwlist, &buffer_, &format, &offset, &src_buffer)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, offset, src = src_buffer.buf, size = src_buffer.len));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			uint32_t format = 0;
			const void *src = nullptr;
			size_t size = {};
			Py_buffer src_buffer = {};
			static const char *kwlist[] = { "buffer", "format", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIy*", (char**)kwlist, &buffer_, &format, &src_buffer)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, src = src_buffer.buf, size = src_buffer.len));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			uint32_t format = 0;
			const void *src = nullptr;
			static const char *kwlist[] = { "buffer", "format", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIn", (char**)kwlist, &buffer_, &format, &src)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			static const char *kwlist[] = { "buffer", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::clearBuffer(): unknown arguments:\n(Buffer buffer, Format format, size_t offset, const void* src, size_t size) -> bool\n(Buffer buffer, Format format, const void* src, size_t size) -> bool\n(Buffer buffer, Format format, const void* src) -> bool\n(Buffer buffer) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_copyTexture(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *dest_origin_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *src_region_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "texture", "dest_origin", "dest_slice", "src", "src_region", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOOO", (char**)kwlist, &texture_, &dest_origin_, &dest_slice_, &src_, &src_region_, &src_slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYOrigin(dest_origin_)) break;
			const Origin &dest_origin = pyOrigin_get(dest_origin_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYRegion(src_region_)) break;
			const Region &src_region = pyRegion_get(src_region_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.copyTexture(texture, dest_origin, dest_slice, src, src_region, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_region_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_origin", "src", "src_region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", (char**)kwlist, &texture_, &dest_origin_, &src_, &src_region_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYRegion(src_region_)) break;
				const Region &src_region = pyRegion_get(src_region_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, dest_origin, src, src_region));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_slice", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", (char**)kwlist, &texture_, &dest_slice_, &src_, &src_slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, dest_slice, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "texture", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &src_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::copyTexture(): unknown arguments:\n(Texture texture, const Origin dest_origin, const Slice dest_slice, Texture src, const Region src_region, const Slice src_slice) -> bool\n(Texture texture, const Origin dest_origin, Texture src, const Region src_region) -> bool\n(Texture texture, const Slice dest_slice, Texture src, const Slice src_slice) -> bool\n(Texture texture, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_clearTexture(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *region_ = nullptr;
		PyObject *slice_ = nullptr;
		const void *src = nullptr;
		static const char *kwlist[] = { "texture", "region", "slice", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOn", (char**)kwlist, &texture_, &region_, &slice_, &src)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYRegion(region_)) break;
			const Region &region = pyRegion_get(region_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.clearTexture(texture, region, slice, src));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *region_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "region", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &texture_, &region_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, region, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *slice_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "slice", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &texture_, &slice_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, slice, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &texture_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::clearTexture(): unknown arguments:\n(Texture texture, const Region region, const Slice slice, const void* src) -> bool\n(Texture texture, const Region region, const void* src) -> bool\n(Texture texture, const Slice slice, const void* src) -> bool\n(Texture texture, const void* src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_barrier(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		static const char *kwlist[] = { "texture", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texture_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.barrier(texture);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			static const char *kwlist[] = { "buffer", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				self->ptr.barrier(buffer);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *textures_ = nullptr;
			static const char *kwlist[] = { "textures", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &textures_)) {
				if(!isPYArray(textures_)) break;
				Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
				for(PyObject *object : textures__) textures.append(pyTexture_get(object));
				self->ptr.barrier(textures);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *buffers_ = nullptr;
			static const char *kwlist[] = { "buffers", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffers_)) {
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				self->ptr.barrier(buffers);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::barrier(): unknown arguments:\n(Texture texture) -> void\n(Buffer buffer) -> void\n(Array<Texture> textures) -> void\n(Array<Buffer> buffers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_beginConditional(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		static const char *kwlist[] = { "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.beginConditional(buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::beginConditional(): unknown arguments:\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_endConditional(PYCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.endConditional();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::endConditional(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_beginQuery(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			return PyLong_FromLong(self->ptr.beginQuery(query));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::beginQuery(): unknown arguments:\n(Query query) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_endQuery(PYCompute *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			self->ptr.endQuery(query);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Compute::endQuery(): unknown arguments:\n(Query query) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Compute_get_platform(PYCompute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Compute_get_platform_name(PYCompute *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Compute_get_index(PYCompute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Compute_get_kernel(PYCompute *self, void *offset) {
		return pyKernel_new(self->ptr.getKernel());
	}
	static PyObject *Compute_get_traversal(PYCompute *self, void *offset) {
		return pyTraversal_new(self->ptr.getTraversal());
	}
	static PyObject *pyCompute_str(PYCompute *self) {
		return PyUnicode_FromString(String::format("Compute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCompute_bool(PYCompute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Compute::DispatchIndirect
	TS_PYAPI bool isPYComputeDispatchIndirect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYComputeDispatchIndirect_Type);
	}
	TS_PYAPI Compute::DispatchIndirect &pyComputeDispatchIndirect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYComputeDispatchIndirect_Type) return ((PYComputeDispatchIndirect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ComputeDispatchIndirect_get(): can't get ComputeDispatchIndirect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ComputeDispatchIndirect_get(): can't get ComputeDispatchIndirect from None");
		static Compute::DispatchIndirect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyComputeDispatchIndirect_new(const Compute::DispatchIndirect &ptr) {
		PYComputeDispatchIndirect *ret = (PYComputeDispatchIndirect*)PyObject_New(PYComputeDispatchIndirect, &PYComputeDispatchIndirect_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyComputeDispatchIndirect_buffer(PYComputeDispatchIndirect *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Compute::DispatchIndirect);
			view->itemsize = sizeof(Compute::DispatchIndirect);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::D3D12Compute
	static void pyD3D12Compute_base(PYD3D12Compute *self) {
		new(&self->base.ptr) Compute(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Compute(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Compute_Type);
	}
	TS_PYAPI D3D12Compute &pyD3D12Compute_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Compute_Type) return ((PYD3D12Compute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Compute_get(): can't get D3D12Compute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Compute_get(): can't get D3D12Compute from None");
		static D3D12Compute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Compute_new(const D3D12Compute &ptr) {
		PYD3D12Compute *ret = (PYD3D12Compute*)PyObject_New(PYD3D12Compute, &PYD3D12Compute_Type);
		new(&ret->ptr) D3D12Compute(ptr); pyD3D12Compute_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Compute_new(D3D12Compute &&ptr) {
		PYD3D12Compute *ret = (PYD3D12Compute*)PyObject_New(PYD3D12Compute, &PYD3D12Compute_Type);
		new(&ret->ptr) D3D12Compute(move(ptr)); pyD3D12Compute_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Compute_init(PYD3D12Compute *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCompute(object)) {
				new(&self->ptr) D3D12Compute(((PYCompute*)object)->ptr);
				pyD3D12Compute_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Compute();
			pyD3D12Compute_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Compute::D3D12Compute(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Compute_dealloc(PYD3D12Compute *self) {
		self->ptr.~D3D12Compute();
		self->base.ptr.~Compute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Compute_equalPtr(PYD3D12Compute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Compute_clonePtr(PYD3D12Compute *self, PyObject *args) {
		return pyD3D12Compute_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Compute_clearPtr(PYD3D12Compute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Compute_destroyPtr(PYD3D12Compute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Compute_acquirePtr(PYD3D12Compute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Compute_unacquirePtr(PYD3D12Compute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Compute_isValidPtr(PYD3D12Compute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Compute_isOwnerPtr(PYD3D12Compute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Compute_isConstPtr(PYD3D12Compute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Compute_getCountPtr(PYD3D12Compute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Compute_getInternalPtr(PYD3D12Compute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Compute_getCompute(PYD3D12Compute *self, PyObject *args) {
		return pyCompute_new(self->ptr.getCompute());
	}
	static PyObject *D3D12Compute_getCommand(PYD3D12Compute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Compute::getCommand(): unknown arguments:\n(void) -> ID3D12GraphicsCommandList*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Compute_update(PYD3D12Compute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Compute::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Compute_get_command(PYD3D12Compute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *pyD3D12Compute_str(PYD3D12Compute *self) {
		return PyUnicode_FromString(String::format("D3D12Compute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Compute_bool(PYD3D12Compute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLCompute
	static void pyMTLCompute_base(PYMTLCompute *self) {
		new(&self->base.ptr) Compute(self->ptr);
	}
	TS_PYAPI bool isPYMTLCompute(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLCompute_Type);
	}
	TS_PYAPI MTLCompute &pyMTLCompute_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLCompute_Type) return ((PYMTLCompute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLCompute_get(): can't get MTLCompute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLCompute_get(): can't get MTLCompute from None");
		static MTLCompute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLCompute_new(const MTLCompute &ptr) {
		PYMTLCompute *ret = (PYMTLCompute*)PyObject_New(PYMTLCompute, &PYMTLCompute_Type);
		new(&ret->ptr) MTLCompute(ptr); pyMTLCompute_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLCompute_new(MTLCompute &&ptr) {
		PYMTLCompute *ret = (PYMTLCompute*)PyObject_New(PYMTLCompute, &PYMTLCompute_Type);
		new(&ret->ptr) MTLCompute(move(ptr)); pyMTLCompute_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLCompute_init(PYMTLCompute *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCompute(object)) {
				new(&self->ptr) MTLCompute(((PYCompute*)object)->ptr);
				pyMTLCompute_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLCompute();
			pyMTLCompute_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCompute::MTLCompute(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLCompute_dealloc(PYMTLCompute *self) {
		self->ptr.~MTLCompute();
		self->base.ptr.~Compute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLCompute_equalPtr(PYMTLCompute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLCompute_clonePtr(PYMTLCompute *self, PyObject *args) {
		return pyMTLCompute_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLCompute_clearPtr(PYMTLCompute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCompute_destroyPtr(PYMTLCompute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCompute_acquirePtr(PYMTLCompute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCompute_unacquirePtr(PYMTLCompute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLCompute_isValidPtr(PYMTLCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLCompute_isOwnerPtr(PYMTLCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLCompute_isConstPtr(PYMTLCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLCompute_getCountPtr(PYMTLCompute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLCompute_getInternalPtr(PYMTLCompute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLCompute_getCompute(PYMTLCompute *self, PyObject *args) {
		return pyCompute_new(self->ptr.getCompute());
	}
	static PyObject *MTLCompute_getEncoder(PYMTLCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCompute::getEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCompute_flush(PYMTLCompute *self, PyObject *args, PyObject *kwargs) {
		void *encoder = nullptr;
		int32_t enqueue = false;
		static const char *kwlist[] = { "encoder", "enqueue", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|i", (char**)kwlist, &encoder, &enqueue)) {
			self->ptr.flush(encoder, (enqueue != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			int32_t create = false;
			int32_t enqueue = false;
			static const char *kwlist[] = { "create", "enqueue", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", (char**)kwlist, &create, &enqueue)) {
				self->ptr.flush((create != 0), (enqueue != 0));
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCompute::flush(): unknown arguments:\n(void* encoder, bool enqueue) -> void\n(bool create, bool enqueue) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCompute_update(PYMTLCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLCompute::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLCompute_get_encoder(PYMTLCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getEncoder());
	}
	static PyObject *pyMTLCompute_str(PYMTLCompute *self) {
		return PyUnicode_FromString(String::format("MTLCompute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLCompute_bool(PYMTLCompute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKCompute
	static void pyVKCompute_base(PYVKCompute *self) {
		new(&self->base.ptr) Compute(self->ptr);
	}
	TS_PYAPI bool isPYVKCompute(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKCompute_Type);
	}
	TS_PYAPI VKCompute &pyVKCompute_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKCompute_Type) return ((PYVKCompute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKCompute_get(): can't get VKCompute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKCompute_get(): can't get VKCompute from None");
		static VKCompute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKCompute_new(const VKCompute &ptr) {
		PYVKCompute *ret = (PYVKCompute*)PyObject_New(PYVKCompute, &PYVKCompute_Type);
		new(&ret->ptr) VKCompute(ptr); pyVKCompute_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKCompute_new(VKCompute &&ptr) {
		PYVKCompute *ret = (PYVKCompute*)PyObject_New(PYVKCompute, &PYVKCompute_Type);
		new(&ret->ptr) VKCompute(move(ptr)); pyVKCompute_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKCompute_init(PYVKCompute *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCompute(object)) {
				new(&self->ptr) VKCompute(((PYCompute*)object)->ptr);
				pyVKCompute_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKCompute();
			pyVKCompute_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::VKCompute(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKCompute_dealloc(PYVKCompute *self) {
		self->ptr.~VKCompute();
		self->base.ptr.~Compute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKCompute_equalPtr(PYVKCompute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKCompute_clonePtr(PYVKCompute *self, PyObject *args) {
		return pyVKCompute_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKCompute_clearPtr(PYVKCompute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCompute_destroyPtr(PYVKCompute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCompute_acquirePtr(PYVKCompute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCompute_unacquirePtr(PYVKCompute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKCompute_isValidPtr(PYVKCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKCompute_isOwnerPtr(PYVKCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKCompute_isConstPtr(PYVKCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKCompute_getCountPtr(PYVKCompute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKCompute_getInternalPtr(PYVKCompute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKCompute_getCompute(PYVKCompute *self, PyObject *args) {
		return pyCompute_new(self->ptr.getCompute());
	}
	static PyObject *VKCompute_getCommand(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getCommand(): unknown arguments:\n(void) -> VkCommandBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_getSamplerDescriptor(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSamplerDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getSamplerDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_getImageDescriptor(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getImageDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getImageDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_getBufferDescriptor(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBufferDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getBufferDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_getTracingDescriptor(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTracingDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getTracingDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_getTexelDescriptor(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTexelDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::getTexelDescriptor(): unknown arguments:\n(void) -> VkDescriptorSet\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_update(PYVKCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.update();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKCompute::update(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKCompute_get_command(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *VKCompute_get_sampler_descriptor(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSamplerDescriptor());
	}
	static PyObject *VKCompute_get_image_descriptor(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getImageDescriptor());
	}
	static PyObject *VKCompute_get_buffer_descriptor(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBufferDescriptor());
	}
	static PyObject *VKCompute_get_tracing_descriptor(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTracingDescriptor());
	}
	static PyObject *VKCompute_get_texel_descriptor(PYVKCompute *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTexelDescriptor());
	}
	static PyObject *pyVKCompute_str(PYVKCompute *self) {
		return PyUnicode_FromString(String::format("VKCompute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKCompute_bool(PYVKCompute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUCompute
	static void pyFUCompute_base(PYFUCompute *self) {
		new(&self->base.ptr) Compute(self->ptr);
	}
	TS_PYAPI bool isPYFUCompute(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUCompute_Type);
	}
	TS_PYAPI FUCompute &pyFUCompute_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUCompute_Type) return ((PYFUCompute*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUCompute_get(): can't get FUCompute from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUCompute_get(): can't get FUCompute from None");
		static FUCompute ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUCompute_new(const FUCompute &ptr) {
		PYFUCompute *ret = (PYFUCompute*)PyObject_New(PYFUCompute, &PYFUCompute_Type);
		new(&ret->ptr) FUCompute(ptr); pyFUCompute_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUCompute_new(FUCompute &&ptr) {
		PYFUCompute *ret = (PYFUCompute*)PyObject_New(PYFUCompute, &PYFUCompute_Type);
		new(&ret->ptr) FUCompute(move(ptr)); pyFUCompute_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUCompute_init(PYFUCompute *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCompute(object)) {
				new(&self->ptr) FUCompute(((PYCompute*)object)->ptr);
				pyFUCompute_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUCompute();
			pyFUCompute_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *computes_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "computes", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &computes_, &owner)) {
				if(!isPYArray(computes_)) break;
				Array<Compute> computes; Array<PyObject*> computes__; pyArray_get(computes_, computes__);
				for(PyObject *object : computes__) computes.append(pyCompute_get(object));
				new(&self->ptr) FUCompute(computes, (owner != 0));
				pyFUCompute_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCompute::FUCompute(): unknown arguments:\n(void)\n(Array<Compute> computes, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUCompute_dealloc(PYFUCompute *self) {
		self->ptr.~FUCompute();
		self->base.ptr.~Compute();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUCompute_equalPtr(PYFUCompute *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUCompute_clonePtr(PYFUCompute *self, PyObject *args) {
		return pyFUCompute_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUCompute_clearPtr(PYFUCompute *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCompute_destroyPtr(PYFUCompute *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCompute_acquirePtr(PYFUCompute *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCompute_unacquirePtr(PYFUCompute *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUCompute_isValidPtr(PYFUCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUCompute_isOwnerPtr(PYFUCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUCompute_isConstPtr(PYFUCompute *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUCompute_getCountPtr(PYFUCompute *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUCompute_getInternalPtr(PYFUCompute *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUCompute_getCompute(PYFUCompute *self, PyObject *args) {
		return pyCompute_new(self->ptr.getCompute());
	}
	static PyObject *FUCompute_setMask(PYFUCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCompute::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCompute_getMask(PYFUCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCompute::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCompute_getNumComputes(PYFUCompute *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumComputes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCompute::getNumComputes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCompute_getCompute(PYFUCompute *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyCompute_new(self->ptr.getCompute(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyCompute_new(self->ptr.getCompute(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUCompute::getCompute(): unknown arguments:\n(uint32_t index) -> const Compute\n(uint32_t index) -> Compute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUCompute_get_mask(PYFUCompute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUCompute_get_num_computes(PYFUCompute *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumComputes());
	}
	static PyObject *pyFUCompute_str(PYFUCompute *self) {
		return PyUnicode_FromString(String::format("FUCompute Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUCompute_bool(PYFUCompute *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Context
	TS_PYAPI bool isPYContext(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYContext_Type || type == &PYD3D12Context_Type || type == &PYD3D11Context_Type || type == &PYMTLContext_Type || type == &PYVKContext_Type || type == &PYGLContext_Type || type == &PYGLESContext_Type || type == &PYWGContext_Type || type == &PYCUContext_Type || type == &PYHIPContext_Type);
	}
	TS_PYAPI Context &pyContext_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYContext_Type || type == &PYD3D12Context_Type || type == &PYD3D11Context_Type || type == &PYMTLContext_Type || type == &PYVKContext_Type || type == &PYGLContext_Type || type == &PYGLESContext_Type || type == &PYWGContext_Type || type == &PYCUContext_Type || type == &PYHIPContext_Type) return ((PYContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Context_get(): can't get Context from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Context_get(): can't get Context from None");
		static Context ret;
		return ret;
	}
	TS_PYAPI PyObject *pyContext_new(const Context &ptr) {
		PYContext *ret = (PYContext*)PyObject_New(PYContext, &PYContext_Type);
		new(&ret->ptr) Context(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyContext_new(Context &&ptr) {
		PYContext *ret = (PYContext*)PyObject_New(PYContext, &PYContext_Type);
		new(&ret->ptr) Context(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyContext_init(PYContext *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Context();
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t platform = 0;
			uint32_t index = Maxu32;
			static const char *kwlist[] = { "platform", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &platform, &index)) {
				new(&self->ptr) Context((Platform)platform, index);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::Context(): unknown arguments:\n(void)\n(Platform platform, uint32_t index)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyContext_dealloc(PYContext *self) {
		self->ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyContext_equalPtr(PYContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyContext_clonePtr(PYContext *self, PyObject *args) {
		return pyContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyContext_clearPtr(PYContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyContext_destroyPtr(PYContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyContext_acquirePtr(PYContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyContext_unacquirePtr(PYContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyContext_isValidPtr(PYContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyContext_isOwnerPtr(PYContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyContext_isConstPtr(PYContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyContext_getCountPtr(PYContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyContext_getInternalPtr(PYContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Context_getPlatform(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_getPlatformName(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_getIndex(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_isCreated(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_create(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.create());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::create(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_flush(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flush());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::flush(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_finish(PYContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.finish());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Context::finish(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Context_get_platform(PYContext *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Context_get_platform_name(PYContext *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Context_get_index(PYContext *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *pyContext_str(PYContext *self) {
		return PyUnicode_FromString(String::format("Context Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyContext_bool(PYContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Context
	static void pyD3D12Context_base(PYD3D12Context *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Context(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Context_Type);
	}
	TS_PYAPI D3D12Context &pyD3D12Context_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Context_Type) return ((PYD3D12Context*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Context_get(): can't get D3D12Context from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Context_get(): can't get D3D12Context from None");
		static D3D12Context ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Context_new(const D3D12Context &ptr) {
		PYD3D12Context *ret = (PYD3D12Context*)PyObject_New(PYD3D12Context, &PYD3D12Context_Type);
		new(&ret->ptr) D3D12Context(ptr); pyD3D12Context_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Context_new(D3D12Context &&ptr) {
		PYD3D12Context *ret = (PYD3D12Context*)PyObject_New(PYD3D12Context, &PYD3D12Context_Type);
		new(&ret->ptr) D3D12Context(move(ptr)); pyD3D12Context_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Context_init(PYD3D12Context *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) D3D12Context(((PYContext*)object)->ptr);
				pyD3D12Context_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Context();
			pyD3D12Context_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::D3D12Context(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Context_dealloc(PYD3D12Context *self) {
		self->ptr.~D3D12Context();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Context_equalPtr(PYD3D12Context *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Context_clonePtr(PYD3D12Context *self, PyObject *args) {
		return pyD3D12Context_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Context_clearPtr(PYD3D12Context *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Context_destroyPtr(PYD3D12Context *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Context_acquirePtr(PYD3D12Context *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Context_unacquirePtr(PYD3D12Context *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Context_isValidPtr(PYD3D12Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Context_isOwnerPtr(PYD3D12Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Context_isConstPtr(PYD3D12Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Context_getCountPtr(PYD3D12Context *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Context_getInternalPtr(PYD3D12Context *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Context_getContext(PYD3D12Context *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *D3D12Context_create(PYD3D12Context *self, PyObject *args, PyObject *kwargs) {
		ID3D12Device *device = nullptr;
		ID3D12CommandQueue *queue = nullptr;
		static const char *kwlist[] = { "device", "queue", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn", (char**)kwlist, &device, &queue)) {
			return PyLong_FromLong(self->ptr.create(device, queue));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::create(): unknown arguments:\n(ID3D12Device* device, ID3D12CommandQueue* queue) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_getFactory(PYD3D12Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFactory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::getFactory(): unknown arguments:\n(void) -> IDXGIFactory4*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_getDevice(PYD3D12Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::getDevice(): unknown arguments:\n(void) -> ID3D12Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_getQueue(PYD3D12Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::getQueue(): unknown arguments:\n(void) -> ID3D12CommandQueue*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_getCommand(PYD3D12Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::getCommand(): unknown arguments:\n(void) -> ID3D12GraphicsCommandList*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_getProcAddress(PYD3D12Context *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(D3D12Context::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_error(PYD3D12Context *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(D3D12Context::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Context::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Context_get_factory(PYD3D12Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFactory());
	}
	static PyObject *D3D12Context_get_device(PYD3D12Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *D3D12Context_get_queue(PYD3D12Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *D3D12Context_get_command(PYD3D12Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *pyD3D12Context_str(PYD3D12Context *self) {
		return PyUnicode_FromString(String::format("D3D12Context Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Context_bool(PYD3D12Context *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Context
	static void pyD3D11Context_base(PYD3D11Context *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Context(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Context_Type);
	}
	TS_PYAPI D3D11Context &pyD3D11Context_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Context_Type) return ((PYD3D11Context*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Context_get(): can't get D3D11Context from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Context_get(): can't get D3D11Context from None");
		static D3D11Context ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Context_new(const D3D11Context &ptr) {
		PYD3D11Context *ret = (PYD3D11Context*)PyObject_New(PYD3D11Context, &PYD3D11Context_Type);
		new(&ret->ptr) D3D11Context(ptr); pyD3D11Context_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Context_new(D3D11Context &&ptr) {
		PYD3D11Context *ret = (PYD3D11Context*)PyObject_New(PYD3D11Context, &PYD3D11Context_Type);
		new(&ret->ptr) D3D11Context(move(ptr)); pyD3D11Context_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Context_init(PYD3D11Context *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) D3D11Context(((PYContext*)object)->ptr);
				pyD3D11Context_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Context();
			pyD3D11Context_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::D3D11Context(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Context_dealloc(PYD3D11Context *self) {
		self->ptr.~D3D11Context();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Context_equalPtr(PYD3D11Context *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Context_clonePtr(PYD3D11Context *self, PyObject *args) {
		return pyD3D11Context_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Context_clearPtr(PYD3D11Context *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Context_destroyPtr(PYD3D11Context *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Context_acquirePtr(PYD3D11Context *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Context_unacquirePtr(PYD3D11Context *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Context_isValidPtr(PYD3D11Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Context_isOwnerPtr(PYD3D11Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Context_isConstPtr(PYD3D11Context *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Context_getCountPtr(PYD3D11Context *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Context_getInternalPtr(PYD3D11Context *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Context_getContext(PYD3D11Context *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *D3D11Context_create(PYD3D11Context *self, PyObject *args, PyObject *kwargs) {
		ID3D11Device *device = nullptr;
		static const char *kwlist[] = { "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &device)) {
			return PyLong_FromLong(self->ptr.create(device));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::create(): unknown arguments:\n(ID3D11Device* device) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_getFactory(PYD3D11Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFactory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::getFactory(): unknown arguments:\n(void) -> IDXGIFactory*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_getDevice(PYD3D11Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::getDevice(): unknown arguments:\n(void) -> ID3D11Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_getD3D11Context(PYD3D11Context *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D11Context());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::getD3D11Context(): unknown arguments:\n(void) -> ID3D11DeviceContext*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_getProcAddress(PYD3D11Context *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(D3D11Context::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_error(PYD3D11Context *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(D3D11Context::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Context::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Context_get_factory(PYD3D11Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFactory());
	}
	static PyObject *D3D11Context_get_device(PYD3D11Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *D3D11Context_get_d3d11_context(PYD3D11Context *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D11Context());
	}
	static PyObject *pyD3D11Context_str(PYD3D11Context *self) {
		return PyUnicode_FromString(String::format("D3D11Context Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Context_bool(PYD3D11Context *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLContext
	static void pyMTLContext_base(PYMTLContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYMTLContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLContext_Type);
	}
	TS_PYAPI MTLContext &pyMTLContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLContext_Type) return ((PYMTLContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLContext_get(): can't get MTLContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLContext_get(): can't get MTLContext from None");
		static MTLContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLContext_new(const MTLContext &ptr) {
		PYMTLContext *ret = (PYMTLContext*)PyObject_New(PYMTLContext, &PYMTLContext_Type);
		new(&ret->ptr) MTLContext(ptr); pyMTLContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLContext_new(MTLContext &&ptr) {
		PYMTLContext *ret = (PYMTLContext*)PyObject_New(PYMTLContext, &PYMTLContext_Type);
		new(&ret->ptr) MTLContext(move(ptr)); pyMTLContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLContext_init(PYMTLContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) MTLContext(((PYContext*)object)->ptr);
				pyMTLContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLContext();
			pyMTLContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::MTLContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLContext_dealloc(PYMTLContext *self) {
		self->ptr.~MTLContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLContext_equalPtr(PYMTLContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLContext_clonePtr(PYMTLContext *self, PyObject *args) {
		return pyMTLContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLContext_clearPtr(PYMTLContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLContext_destroyPtr(PYMTLContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLContext_acquirePtr(PYMTLContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLContext_unacquirePtr(PYMTLContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLContext_isValidPtr(PYMTLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLContext_isOwnerPtr(PYMTLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLContext_isConstPtr(PYMTLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLContext_getCountPtr(PYMTLContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLContext_getInternalPtr(PYMTLContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLContext_getContext(PYMTLContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *MTLContext_create(PYMTLContext *self, PyObject *args, PyObject *kwargs) {
		void *device = nullptr;
		void *queue = nullptr;
		static const char *kwlist[] = { "device", "queue", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn", (char**)kwlist, &device, &queue)) {
			return PyLong_FromLong(self->ptr.create(device, queue));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::create(): unknown arguments:\n(void* device, void* queue) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getDevice(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getDevice(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getQueue(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getQueue(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getCommand(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getCommand(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getEncoder(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getRenderEncoder(PYMTLContext *self, PyObject *args, PyObject *kwargs) {
		void *descriptor = nullptr;
		static const char *kwlist[] = { "descriptor", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &descriptor)) {
			return PyLong_FromVoidPtr(self->ptr.getRenderEncoder(descriptor));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getRenderEncoder(): unknown arguments:\n(void* descriptor) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getComputeEncoder(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getComputeEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getComputeEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getTracingEncoder(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTracingEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getTracingEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_getBlitEncoder(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBlitEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::getBlitEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_endEncoder(PYMTLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.endEncoder();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLContext::endEncoder(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLContext_get_device(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *MTLContext_get_queue(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *MTLContext_get_command(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *MTLContext_get_encoder(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getEncoder());
	}
	static PyObject *MTLContext_get_compute_encoder(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getComputeEncoder());
	}
	static PyObject *MTLContext_get_tracing_encoder(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTracingEncoder());
	}
	static PyObject *MTLContext_get_blit_encoder(PYMTLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBlitEncoder());
	}
	static PyObject *pyMTLContext_str(PYMTLContext *self) {
		return PyUnicode_FromString(String::format("MTLContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLContext_bool(PYMTLContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKContext
	static void pyVKContext_base(PYVKContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYVKContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKContext_Type);
	}
	TS_PYAPI VKContext &pyVKContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKContext_Type) return ((PYVKContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKContext_get(): can't get VKContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKContext_get(): can't get VKContext from None");
		static VKContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKContext_new(const VKContext &ptr) {
		PYVKContext *ret = (PYVKContext*)PyObject_New(PYVKContext, &PYVKContext_Type);
		new(&ret->ptr) VKContext(ptr); pyVKContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKContext_new(VKContext &&ptr) {
		PYVKContext *ret = (PYVKContext*)PyObject_New(PYVKContext, &PYVKContext_Type);
		new(&ret->ptr) VKContext(move(ptr)); pyVKContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKContext_init(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) VKContext(((PYContext*)object)->ptr);
				pyVKContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKContext();
			pyVKContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::VKContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKContext_dealloc(PYVKContext *self) {
		self->ptr.~VKContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKContext_equalPtr(PYVKContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKContext_clonePtr(PYVKContext *self, PyObject *args) {
		return pyVKContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKContext_clearPtr(PYVKContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKContext_destroyPtr(PYVKContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKContext_acquirePtr(PYVKContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKContext_unacquirePtr(PYVKContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKContext_isValidPtr(PYVKContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKContext_isOwnerPtr(PYVKContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKContext_isConstPtr(PYVKContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKContext_getCountPtr(PYVKContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKContext_getInternalPtr(PYVKContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKContext_getContext(PYVKContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *VKContext_create(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		VkInstance instance = {};
		PFN_vkGetInstanceProcAddr func = {};
		VkPhysicalDevice adapter = {};
		VkDevice device = {};
		uint32_t family = {};
		uint32_t index = {};
		static const char *kwlist[] = { "instance", "func", "adapter", "device", "family", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nnnnII", (char**)kwlist, &instance, &func, &adapter, &device, &family, &index)) {
			return PyLong_FromLong(self->ptr.create(instance, func, adapter, device, family, index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::create(): unknown arguments:\n(VkInstance instance, PFN_vkGetInstanceProcAddr func, VkPhysicalDevice adapter, VkDevice device, uint32_t family, uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getInstance(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInstance());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getInstance(): unknown arguments:\n(void) -> VkInstance\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getAdapter(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAdapter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getAdapter(): unknown arguments:\n(void) -> VkPhysicalDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getDevice(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getDevice(): unknown arguments:\n(void) -> VkDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getQueue(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getQueue(): unknown arguments:\n(void) -> VkQueue\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getCommand(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getCommand(): unknown arguments:\n(void) -> VkCommandBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getFamily(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFamily());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getFamily(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getNumQueues(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumQueues());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getNumQueues(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getQueueFlags(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getQueueFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getQueueFlags(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getQueueFamily(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getQueueFamily(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getQueueFamily(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_addContextExtension(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			VKContext::addContextExtension(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::addContextExtension(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_addAdapterExtension(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			VKContext::addAdapterExtension(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::addAdapterExtension(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_addAdapterFeatures(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		void *features = nullptr;
		static const char *kwlist[] = { "features", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &features)) {
			VKContext::addAdapterFeatures(features);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::addAdapterFeatures(): unknown arguments:\n(void* features) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getInstanceProcAddress(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)VKContext::getInstanceProcAddress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getInstanceProcAddress(): unknown arguments:\n(void) -> PFN_vkGetInstanceProcAddr\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getDeviceProcAddress(PYVKContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)VKContext::getDeviceProcAddress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getDeviceProcAddress(): unknown arguments:\n(void) -> PFN_vkGetDeviceProcAddr\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_getProcAddress(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(VKContext::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_error(PYVKContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(VKContext::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKContext::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKContext_get_instance(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInstance());
	}
	static PyObject *VKContext_get_adapter(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAdapter());
	}
	static PyObject *VKContext_get_device(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *VKContext_get_queue(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *VKContext_get_command(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *VKContext_get_family(PYVKContext *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFamily());
	}
	static PyObject *VKContext_get_num_queues(PYVKContext *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumQueues());
	}
	static PyObject *VKContext_get_instance_proc_address(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInstanceProcAddress());
	}
	static PyObject *VKContext_get_device_proc_address(PYVKContext *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getDeviceProcAddress());
	}
	static PyObject *pyVKContext_str(PYVKContext *self) {
		return PyUnicode_FromString(String::format("VKContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKContext_bool(PYVKContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLContext
	static void pyGLContext_base(PYGLContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYGLContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLContext_Type);
	}
	TS_PYAPI GLContext &pyGLContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLContext_Type) return ((PYGLContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLContext_get(): can't get GLContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLContext_get(): can't get GLContext from None");
		static GLContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLContext_new(const GLContext &ptr) {
		PYGLContext *ret = (PYGLContext*)PyObject_New(PYGLContext, &PYGLContext_Type);
		new(&ret->ptr) GLContext(ptr); pyGLContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLContext_new(GLContext &&ptr) {
		PYGLContext *ret = (PYGLContext*)PyObject_New(PYGLContext, &PYGLContext_Type);
		new(&ret->ptr) GLContext(move(ptr)); pyGLContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLContext_init(PYGLContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) GLContext(((PYContext*)object)->ptr);
				pyGLContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLContext();
			pyGLContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::GLContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLContext_dealloc(PYGLContext *self) {
		self->ptr.~GLContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLContext_equalPtr(PYGLContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLContext_clonePtr(PYGLContext *self, PyObject *args) {
		return pyGLContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLContext_clearPtr(PYGLContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLContext_destroyPtr(PYGLContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLContext_acquirePtr(PYGLContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLContext_unacquirePtr(PYGLContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLContext_isValidPtr(PYGLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLContext_isOwnerPtr(PYGLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLContext_isConstPtr(PYGLContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLContext_getCountPtr(PYGLContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLContext_getInternalPtr(PYGLContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLContext_getContext(PYGLContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *GLContext_create(PYGLContext *self, PyObject *args, PyObject *kwargs) {
		void *context = nullptr;
		static const char *kwlist[] = { "context", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &context)) {
			return PyLong_FromLong(self->ptr.create(context));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::create(): unknown arguments:\n(void* context) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getGLDisplay(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLDisplay());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getGLDisplay(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getGLVisual(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLVisual());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getGLVisual(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getGLConfig(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLConfig());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getGLConfig(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getGLSurface(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLSurface());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getGLSurface(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getGLContext(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getGLContext(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_getProcAddress(PYGLContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(GLContext::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_error(PYGLContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(GLContext::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_check(PYGLContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(GLContext::check());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLContext::check(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLContext_get_gl_display(PYGLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLDisplay());
	}
	static PyObject *GLContext_get_gl_visual(PYGLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLVisual());
	}
	static PyObject *GLContext_get_gl_config(PYGLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLConfig());
	}
	static PyObject *GLContext_get_gl_surface(PYGLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLSurface());
	}
	static PyObject *GLContext_get_gl_context(PYGLContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLContext());
	}
	static PyObject *pyGLContext_str(PYGLContext *self) {
		return PyUnicode_FromString(String::format("GLContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLContext_bool(PYGLContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESContext
	static void pyGLESContext_base(PYGLESContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYGLESContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESContext_Type);
	}
	TS_PYAPI GLESContext &pyGLESContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESContext_Type) return ((PYGLESContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESContext_get(): can't get GLESContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESContext_get(): can't get GLESContext from None");
		static GLESContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESContext_new(const GLESContext &ptr) {
		PYGLESContext *ret = (PYGLESContext*)PyObject_New(PYGLESContext, &PYGLESContext_Type);
		new(&ret->ptr) GLESContext(ptr); pyGLESContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESContext_new(GLESContext &&ptr) {
		PYGLESContext *ret = (PYGLESContext*)PyObject_New(PYGLESContext, &PYGLESContext_Type);
		new(&ret->ptr) GLESContext(move(ptr)); pyGLESContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESContext_init(PYGLESContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) GLESContext(((PYContext*)object)->ptr);
				pyGLESContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESContext();
			pyGLESContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::GLESContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESContext_dealloc(PYGLESContext *self) {
		self->ptr.~GLESContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESContext_equalPtr(PYGLESContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESContext_clonePtr(PYGLESContext *self, PyObject *args) {
		return pyGLESContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESContext_clearPtr(PYGLESContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESContext_destroyPtr(PYGLESContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESContext_acquirePtr(PYGLESContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESContext_unacquirePtr(PYGLESContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESContext_isValidPtr(PYGLESContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESContext_isOwnerPtr(PYGLESContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESContext_isConstPtr(PYGLESContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESContext_getCountPtr(PYGLESContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESContext_getInternalPtr(PYGLESContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESContext_getContext(PYGLESContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *GLESContext_create(PYGLESContext *self, PyObject *args, PyObject *kwargs) {
		void *context = nullptr;
		static const char *kwlist[] = { "context", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &context)) {
			return PyLong_FromLong(self->ptr.create(context));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::create(): unknown arguments:\n(void* context) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_getGLESDisplay(PYGLESContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLESDisplay());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::getGLESDisplay(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_getGLESConfig(PYGLESContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLESConfig());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::getGLESConfig(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_getGLESContext(PYGLESContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getGLESContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::getGLESContext(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_getProcAddress(PYGLESContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(GLESContext::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_error(PYGLESContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(GLESContext::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_check(PYGLESContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(GLESContext::check());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESContext::check(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESContext_get_gles_display(PYGLESContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLESDisplay());
	}
	static PyObject *GLESContext_get_gles_config(PYGLESContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLESConfig());
	}
	static PyObject *GLESContext_get_gles_context(PYGLESContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getGLESContext());
	}
	static PyObject *pyGLESContext_str(PYGLESContext *self) {
		return PyUnicode_FromString(String::format("GLESContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESContext_bool(PYGLESContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::WGContext
	static void pyWGContext_base(PYWGContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYWGContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYWGContext_Type);
	}
	TS_PYAPI WGContext &pyWGContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYWGContext_Type) return ((PYWGContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "WGContext_get(): can't get WGContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "WGContext_get(): can't get WGContext from None");
		static WGContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyWGContext_new(const WGContext &ptr) {
		PYWGContext *ret = (PYWGContext*)PyObject_New(PYWGContext, &PYWGContext_Type);
		new(&ret->ptr) WGContext(ptr); pyWGContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyWGContext_new(WGContext &&ptr) {
		PYWGContext *ret = (PYWGContext*)PyObject_New(PYWGContext, &PYWGContext_Type);
		new(&ret->ptr) WGContext(move(ptr)); pyWGContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyWGContext_init(PYWGContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) WGContext(((PYContext*)object)->ptr);
				pyWGContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) WGContext();
			pyWGContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::WGContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyWGContext_dealloc(PYWGContext *self) {
		self->ptr.~WGContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyWGContext_equalPtr(PYWGContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyWGContext_clonePtr(PYWGContext *self, PyObject *args) {
		return pyWGContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyWGContext_clearPtr(PYWGContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWGContext_destroyPtr(PYWGContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWGContext_acquirePtr(PYWGContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWGContext_unacquirePtr(PYWGContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWGContext_isValidPtr(PYWGContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyWGContext_isOwnerPtr(PYWGContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyWGContext_isConstPtr(PYWGContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyWGContext_getCountPtr(PYWGContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyWGContext_getInternalPtr(PYWGContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyWGContext_getContext(PYWGContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *WGContext_open(PYWGContext *self, PyObject *args, PyObject *kwargs) {
		WGPUInstance instance = {};
		WGPUAdapter adapter = {};
		WGPUDevice device = {};
		static const char *kwlist[] = { "instance", "adapter", "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nnn", (char**)kwlist, &instance, &adapter, &device)) {
			return PyLong_FromLong(WGContext::open(instance, adapter, device));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::open(): unknown arguments:\n(WGPUInstance instance, WGPUAdapter adapter, WGPUDevice device) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *WGContext_create(PYWGContext *self, PyObject *args, PyObject *kwargs) {
		WGPUInstance instance = {};
		WGPUAdapter adapter = {};
		WGPUDevice device = {};
		static const char *kwlist[] = { "instance", "adapter", "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nnn", (char**)kwlist, &instance, &adapter, &device)) {
			return PyLong_FromLong(self->ptr.create(instance, adapter, device));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::create(): unknown arguments:\n(WGPUInstance instance, WGPUAdapter adapter, WGPUDevice device) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *WGContext_getInstance(PYWGContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInstance());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::getInstance(): unknown arguments:\n(void) -> WGPUInstance\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *WGContext_getAdapter(PYWGContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAdapter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::getAdapter(): unknown arguments:\n(void) -> WGPUAdapter\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *WGContext_getDevice(PYWGContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "WGContext::getDevice(): unknown arguments:\n(void) -> WGPUDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *WGContext_get_instance(PYWGContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInstance());
	}
	static PyObject *WGContext_get_adapter(PYWGContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAdapter());
	}
	static PyObject *WGContext_get_device(PYWGContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *pyWGContext_str(PYWGContext *self) {
		return PyUnicode_FromString(String::format("WGContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyWGContext_bool(PYWGContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CUContext
	static void pyCUContext_base(PYCUContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYCUContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCUContext_Type);
	}
	TS_PYAPI CUContext &pyCUContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCUContext_Type) return ((PYCUContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CUContext_get(): can't get CUContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CUContext_get(): can't get CUContext from None");
		static CUContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCUContext_new(const CUContext &ptr) {
		PYCUContext *ret = (PYCUContext*)PyObject_New(PYCUContext, &PYCUContext_Type);
		new(&ret->ptr) CUContext(ptr); pyCUContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCUContext_new(CUContext &&ptr) {
		PYCUContext *ret = (PYCUContext*)PyObject_New(PYCUContext, &PYCUContext_Type);
		new(&ret->ptr) CUContext(move(ptr)); pyCUContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCUContext_init(PYCUContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) CUContext(((PYContext*)object)->ptr);
				pyCUContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CUContext();
			pyCUContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::CUContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCUContext_dealloc(PYCUContext *self) {
		self->ptr.~CUContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCUContext_equalPtr(PYCUContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCUContext_clonePtr(PYCUContext *self, PyObject *args) {
		return pyCUContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyCUContext_clearPtr(PYCUContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUContext_destroyPtr(PYCUContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUContext_acquirePtr(PYCUContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUContext_unacquirePtr(PYCUContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUContext_isValidPtr(PYCUContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCUContext_isOwnerPtr(PYCUContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCUContext_isConstPtr(PYCUContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCUContext_getCountPtr(PYCUContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCUContext_getInternalPtr(PYCUContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCUContext_getContext(PYCUContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *CUContext_getDevice(PYCUContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::getDevice(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUContext_getCUContext(PYCUContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCUContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::getCUContext(): unknown arguments:\n(void) -> CUcontext\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUContext_getStream(PYCUContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getStream());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::getStream(): unknown arguments:\n(void) -> CUstream\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUContext_getProcAddress(PYCUContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(CUContext::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUContext_error(PYCUContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(CUContext::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUContext::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUContext_get_device(PYCUContext *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDevice());
	}
	static PyObject *CUContext_get_cu_context(PYCUContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCUContext());
	}
	static PyObject *CUContext_get_stream(PYCUContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getStream());
	}
	static PyObject *pyCUContext_str(PYCUContext *self) {
		return PyUnicode_FromString(String::format("CUContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCUContext_bool(PYCUContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::HIPContext
	static void pyHIPContext_base(PYHIPContext *self) {
		new(&self->base.ptr) Context(self->ptr);
	}
	TS_PYAPI bool isPYHIPContext(PyObject *object) {
		return (object && Py_TYPE(object) == &PYHIPContext_Type);
	}
	TS_PYAPI HIPContext &pyHIPContext_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYHIPContext_Type) return ((PYHIPContext*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "HIPContext_get(): can't get HIPContext from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "HIPContext_get(): can't get HIPContext from None");
		static HIPContext ret;
		return ret;
	}
	TS_PYAPI PyObject *pyHIPContext_new(const HIPContext &ptr) {
		PYHIPContext *ret = (PYHIPContext*)PyObject_New(PYHIPContext, &PYHIPContext_Type);
		new(&ret->ptr) HIPContext(ptr); pyHIPContext_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyHIPContext_new(HIPContext &&ptr) {
		PYHIPContext *ret = (PYHIPContext*)PyObject_New(PYHIPContext, &PYHIPContext_Type);
		new(&ret->ptr) HIPContext(move(ptr)); pyHIPContext_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyHIPContext_init(PYHIPContext *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYContext(object)) {
				new(&self->ptr) HIPContext(((PYContext*)object)->ptr);
				pyHIPContext_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) HIPContext();
			pyHIPContext_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::HIPContext(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyHIPContext_dealloc(PYHIPContext *self) {
		self->ptr.~HIPContext();
		self->base.ptr.~Context();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyHIPContext_equalPtr(PYHIPContext *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyHIPContext_clonePtr(PYHIPContext *self, PyObject *args) {
		return pyHIPContext_new(self->ptr.clonePtr());
	}
	static PyObject *pyHIPContext_clearPtr(PYHIPContext *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPContext_destroyPtr(PYHIPContext *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPContext_acquirePtr(PYHIPContext *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPContext_unacquirePtr(PYHIPContext *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPContext_isValidPtr(PYHIPContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyHIPContext_isOwnerPtr(PYHIPContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyHIPContext_isConstPtr(PYHIPContext *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyHIPContext_getCountPtr(PYHIPContext *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyHIPContext_getInternalPtr(PYHIPContext *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyHIPContext_getContext(PYHIPContext *self, PyObject *args) {
		return pyContext_new(self->ptr.getContext());
	}
	static PyObject *HIPContext_getDevice(PYHIPContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::getDevice(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPContext_getHIPContext(PYHIPContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getHIPContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::getHIPContext(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPContext_getStream(PYHIPContext *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getStream());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::getStream(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPContext_getProcAddress(PYHIPContext *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(HIPContext::getProcAddress(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::getProcAddress(): unknown arguments:\n(const char* name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPContext_error(PYHIPContext *self, PyObject *args, PyObject *kwargs) {
		uint32_t result = {};
		static const char *kwlist[] = { "result", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &result)) {
			return PyLong_FromLong(HIPContext::error(result));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPContext::error(): unknown arguments:\n(uint32_t result) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPContext_get_device(PYHIPContext *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDevice());
	}
	static PyObject *HIPContext_get_hip_context(PYHIPContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getHIPContext());
	}
	static PyObject *HIPContext_get_stream(PYHIPContext *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getStream());
	}
	static PyObject *pyHIPContext_str(PYHIPContext *self) {
		return PyUnicode_FromString(String::format("HIPContext Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyHIPContext_bool(PYHIPContext *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Query
	TS_PYAPI bool isPYQuery(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYQuery_Type || type == &PYFUQuery_Type);
	}
	TS_PYAPI Query &pyQuery_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYQuery_Type || type == &PYFUQuery_Type) return ((PYQuery*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Query_get(): can't get Query from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Query_get(): can't get Query from None");
		static Query ret;
		return ret;
	}
	TS_PYAPI PyObject *pyQuery_new(const Query &ptr) {
		PYQuery *ret = (PYQuery*)PyObject_New(PYQuery, &PYQuery_Type);
		new(&ret->ptr) Query(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyQuery_new(Query &&ptr) {
		PYQuery *ret = (PYQuery*)PyObject_New(PYQuery, &PYQuery_Type);
		new(&ret->ptr) Query(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyQuery_init(PYQuery *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Query();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::Query(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyQuery_dealloc(PYQuery *self) {
		self->ptr.~Query();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyQuery_equalPtr(PYQuery *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyQuery_clonePtr(PYQuery *self, PyObject *args) {
		return pyQuery_new(self->ptr.clonePtr());
	}
	static PyObject *pyQuery_clearPtr(PYQuery *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyQuery_destroyPtr(PYQuery *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyQuery_acquirePtr(PYQuery *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyQuery_unacquirePtr(PYQuery *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyQuery_isValidPtr(PYQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyQuery_isOwnerPtr(PYQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyQuery_isConstPtr(PYQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyQuery_getCountPtr(PYQuery *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyQuery_getInternalPtr(PYQuery *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Query_getPlatform(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getPlatformName(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getIndex(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_clear(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isCreated(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isAvailable(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAvailable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isAvailable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isBegan(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBegan());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isBegan(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isEnded(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEnded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isEnded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_create(PYQuery *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.create((Query::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::create(): unknown arguments:\n(Query.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getType(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getType(): unknown arguments:\n(void) -> Query::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getTypeName(PYQuery *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Query::getTypeName((Query::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getTypeName(): unknown arguments:\n(Query.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getTypeSize(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getTypeSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getTypeSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isTime(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTime());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isTime(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isClock(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClock());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isClock(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isSamples(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSamples());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isSamples(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isSamples1(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSamples1());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isSamples1(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isStatistics(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isStatistics());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isStatistics(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isTimeType(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTimeType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isTimeType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_isSamplesType(PYQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSamplesType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::isSamplesType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_get(PYQuery *self, PyObject *args, PyObject *kwargs) {
		void *dest = nullptr;
		size_t size = {};
		int32_t wait = true;
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "dest", "wait", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "y*|i", (char**)kwlist, &dest_buffer, &wait)) {
			if(dest_buffer.readonly) break;
			return PyLong_FromLong(self->ptr.get(dest = dest_buffer.buf, size = dest_buffer.len, (wait != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::get(): unknown arguments:\n(void* dest, size_t size, bool wait) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getTime(PYQuery *self, PyObject *args, PyObject *kwargs) {
		int32_t wait = true;
		bool *status = nullptr;
		static const char *kwlist[] = { "wait", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iO", (char**)kwlist, &wait, &status)) {
			return PyLong_FromUnsignedLongLong(self->ptr.getTime((wait != 0), status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getTime(): unknown arguments:\n(bool wait, bool* status) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getSamples(PYQuery *self, PyObject *args, PyObject *kwargs) {
		int32_t wait = true;
		bool *status = nullptr;
		static const char *kwlist[] = { "wait", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iO", (char**)kwlist, &wait, &status)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamples((wait != 0), status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getSamples(): unknown arguments:\n(bool wait, bool* status) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_getStatistics(PYQuery *self, PyObject *args, PyObject *kwargs) {
		int32_t wait = true;
		bool *status = nullptr;
		static const char *kwlist[] = { "wait", "status", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|iO", (char**)kwlist, &wait, &status)) {
			return pyQueryStatistics_new(self->ptr.getStatistics((wait != 0), status));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Query::getStatistics(): unknown arguments:\n(bool wait, bool* status) -> Query::Statistics\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Query_get_platform(PYQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Query_get_platform_name(PYQuery *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Query_get_index(PYQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Query_get_type(PYQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Query_get_type_size(PYQuery *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getTypeSize());
	}
	static PyObject *Query_get_time(PYQuery *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getTime());
	}
	static PyObject *Query_get_samples(PYQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSamples());
	}
	static PyObject *Query_get_statistics(PYQuery *self, void *offset) {
		return pyQueryStatistics_new(self->ptr.getStatistics());
	}
	static PyObject *pyQuery_str(PYQuery *self) {
		return PyUnicode_FromString(String::format("Query Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyQuery_bool(PYQuery *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Query::Statistics
	TS_PYAPI bool isPYQueryStatistics(PyObject *object) {
		return (object && Py_TYPE(object) == &PYQueryStatistics_Type);
	}
	TS_PYAPI Query::Statistics &pyQueryStatistics_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYQueryStatistics_Type) return ((PYQueryStatistics*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "QueryStatistics_get(): can't get QueryStatistics from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "QueryStatistics_get(): can't get QueryStatistics from None");
		static Query::Statistics ret;
		return ret;
	}
	TS_PYAPI PyObject *pyQueryStatistics_new(const Query::Statistics &ptr) {
		PYQueryStatistics *ret = (PYQueryStatistics*)PyObject_New(PYQueryStatistics, &PYQueryStatistics_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyQueryStatistics_buffer(PYQueryStatistics *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Query::Statistics);
			view->itemsize = sizeof(Query::Statistics);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	static PyObject *pyQueryStatistics_str(PYQueryStatistics *self) {
		String ret;
		ret += String::format("num_vertices: %" TS_FORMAT_64 "u\n", self->ptr.num_vertices);
		ret += String::format("num_primitives: %" TS_FORMAT_64 "u\n", self->ptr.num_primitives);
		ret += String::format("vertex_invocations: %" TS_FORMAT_64 "u\n", self->ptr.vertex_invocations);
		ret += String::format("control_invocations: %" TS_FORMAT_64 "u\n", self->ptr.control_invocations);
		ret += String::format("evaluate_invocations: %" TS_FORMAT_64 "u\n", self->ptr.evaluate_invocations);
		ret += String::format("geometry_invocations: %" TS_FORMAT_64 "u\n", self->ptr.geometry_invocations);
		ret += String::format("geometry_primitives: %" TS_FORMAT_64 "u\n", self->ptr.geometry_primitives);
		ret += String::format("fragment_invocations: %" TS_FORMAT_64 "u\n", self->ptr.fragment_invocations);
		ret += String::format("compute_invocations: %" TS_FORMAT_64 "u\n", self->ptr.compute_invocations);
		ret += String::format("clipping_invocations: %" TS_FORMAT_64 "u\n", self->ptr.clipping_invocations);
		ret += String::format("clipping_primitives: %" TS_FORMAT_64 "u", self->ptr.clipping_primitives);
		return PyUnicode_FromString(ret.get());
	}
	
	// Tellusim::FUQuery
	static void pyFUQuery_base(PYFUQuery *self) {
		new(&self->base.ptr) Query(self->ptr);
	}
	TS_PYAPI bool isPYFUQuery(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUQuery_Type);
	}
	TS_PYAPI FUQuery &pyFUQuery_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUQuery_Type) return ((PYFUQuery*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUQuery_get(): can't get FUQuery from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUQuery_get(): can't get FUQuery from None");
		static FUQuery ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUQuery_new(const FUQuery &ptr) {
		PYFUQuery *ret = (PYFUQuery*)PyObject_New(PYFUQuery, &PYFUQuery_Type);
		new(&ret->ptr) FUQuery(ptr); pyFUQuery_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUQuery_new(FUQuery &&ptr) {
		PYFUQuery *ret = (PYFUQuery*)PyObject_New(PYFUQuery, &PYFUQuery_Type);
		new(&ret->ptr) FUQuery(move(ptr)); pyFUQuery_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUQuery_init(PYFUQuery *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYQuery(object)) {
				new(&self->ptr) FUQuery(((PYQuery*)object)->ptr);
				pyFUQuery_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUQuery();
			pyFUQuery_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *queries_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "queries", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &queries_, &owner)) {
				if(!isPYArray(queries_)) break;
				Array<Query> queries; Array<PyObject*> queries__; pyArray_get(queries_, queries__);
				for(PyObject *object : queries__) queries.append(pyQuery_get(object));
				new(&self->ptr) FUQuery(queries, (owner != 0));
				pyFUQuery_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUQuery::FUQuery(): unknown arguments:\n(void)\n(Array<Query> queries, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUQuery_dealloc(PYFUQuery *self) {
		self->ptr.~FUQuery();
		self->base.ptr.~Query();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUQuery_equalPtr(PYFUQuery *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUQuery_clonePtr(PYFUQuery *self, PyObject *args) {
		return pyFUQuery_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUQuery_clearPtr(PYFUQuery *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUQuery_destroyPtr(PYFUQuery *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUQuery_acquirePtr(PYFUQuery *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUQuery_unacquirePtr(PYFUQuery *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUQuery_isValidPtr(PYFUQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUQuery_isOwnerPtr(PYFUQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUQuery_isConstPtr(PYFUQuery *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUQuery_getCountPtr(PYFUQuery *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUQuery_getInternalPtr(PYFUQuery *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUQuery_getQuery(PYFUQuery *self, PyObject *args) {
		return pyQuery_new(self->ptr.getQuery());
	}
	static PyObject *FUQuery_setMask(PYFUQuery *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUQuery::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUQuery_getMask(PYFUQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUQuery::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUQuery_getNumQueries(PYFUQuery *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumQueries());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUQuery::getNumQueries(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUQuery_getQuery(PYFUQuery *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyQuery_new(self->ptr.getQuery(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyQuery_new(self->ptr.getQuery(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUQuery::getQuery(): unknown arguments:\n(uint32_t index) -> const Query\n(uint32_t index) -> Query\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUQuery_get_mask(PYFUQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUQuery_get_num_queries(PYFUQuery *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumQueries());
	}
	static PyObject *pyFUQuery_str(PYFUQuery *self) {
		return PyUnicode_FromString(String::format("FUQuery Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUQuery_bool(PYFUQuery *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Fence
	TS_PYAPI bool isPYFence(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYFence_Type || type == &PYVKFence_Type || type == &PYFUFence_Type);
	}
	TS_PYAPI Fence &pyFence_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYFence_Type || type == &PYVKFence_Type || type == &PYFUFence_Type) return ((PYFence*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Fence_get(): can't get Fence from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Fence_get(): can't get Fence from None");
		static Fence ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFence_new(const Fence &ptr) {
		PYFence *ret = (PYFence*)PyObject_New(PYFence, &PYFence_Type);
		new(&ret->ptr) Fence(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFence_new(Fence &&ptr) {
		PYFence *ret = (PYFence*)PyObject_New(PYFence, &PYFence_Type);
		new(&ret->ptr) Fence(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyFence_init(PYFence *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Fence();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::Fence(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFence_dealloc(PYFence *self) {
		self->ptr.~Fence();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFence_equalPtr(PYFence *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFence_clonePtr(PYFence *self, PyObject *args) {
		return pyFence_new(self->ptr.clonePtr());
	}
	static PyObject *pyFence_clearPtr(PYFence *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFence_destroyPtr(PYFence *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFence_acquirePtr(PYFence *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFence_unacquirePtr(PYFence *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFence_isValidPtr(PYFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFence_isOwnerPtr(PYFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFence_isConstPtr(PYFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFence_getCountPtr(PYFence *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFence_getInternalPtr(PYFence *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Fence_getPlatform(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_getPlatformName(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_getIndex(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_clear(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_isCreated(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_create(PYFence *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = Fence::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.create((Fence::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::create(): unknown arguments:\n(Fence.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_getFlags(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getFlags(): unknown arguments:\n(void) -> Fence::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_hasFlag(PYFence *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlag((Fence::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::hasFlag(): unknown arguments:\n(Fence.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_hasFlags(PYFence *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlags((Fence::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::hasFlags(): unknown arguments:\n(Fence.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_getFlagsName(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFlagsName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getFlagsName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_getDescription(PYFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDescription().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Fence::getDescription(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Fence_get_platform(PYFence *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Fence_get_platform_name(PYFence *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Fence_get_index(PYFence *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Fence_get_flags(PYFence *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *Fence_get_flags_name(PYFence *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFlagsName().get());
	}
	static PyObject *Fence_get_description(PYFence *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDescription().get());
	}
	static PyObject *pyFence_str(PYFence *self) {
		return PyUnicode_FromString(String::format("Fence Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFence_bool(PYFence *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKFence
	static void pyVKFence_base(PYVKFence *self) {
		new(&self->base.ptr) Fence(self->ptr);
	}
	TS_PYAPI bool isPYVKFence(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKFence_Type);
	}
	TS_PYAPI VKFence &pyVKFence_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKFence_Type) return ((PYVKFence*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKFence_get(): can't get VKFence from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKFence_get(): can't get VKFence from None");
		static VKFence ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKFence_new(const VKFence &ptr) {
		PYVKFence *ret = (PYVKFence*)PyObject_New(PYVKFence, &PYVKFence_Type);
		new(&ret->ptr) VKFence(ptr); pyVKFence_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKFence_new(VKFence &&ptr) {
		PYVKFence *ret = (PYVKFence*)PyObject_New(PYVKFence, &PYVKFence_Type);
		new(&ret->ptr) VKFence(move(ptr)); pyVKFence_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKFence_init(PYVKFence *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYFence(object)) {
				new(&self->ptr) VKFence(((PYFence*)object)->ptr);
				pyVKFence_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKFence();
			pyVKFence_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKFence::VKFence(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKFence_dealloc(PYVKFence *self) {
		self->ptr.~VKFence();
		self->base.ptr.~Fence();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKFence_equalPtr(PYVKFence *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKFence_clonePtr(PYVKFence *self, PyObject *args) {
		return pyVKFence_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKFence_clearPtr(PYVKFence *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKFence_destroyPtr(PYVKFence *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKFence_acquirePtr(PYVKFence *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKFence_unacquirePtr(PYVKFence *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKFence_isValidPtr(PYVKFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKFence_isOwnerPtr(PYVKFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKFence_isConstPtr(PYVKFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKFence_getCountPtr(PYVKFence *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKFence_getInternalPtr(PYVKFence *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKFence_getFence(PYVKFence *self, PyObject *args) {
		return pyFence_new(self->ptr.getFence());
	}
	static PyObject *VKFence_getVKFence(PYVKFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVKFence());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKFence::getVKFence(): unknown arguments:\n(void) -> VkFence\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKFence_getSemaphore(PYVKFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSemaphore());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKFence::getSemaphore(): unknown arguments:\n(void) -> VkSemaphore\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKFence_getSharedHandle(PYVKFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKFence::getSharedHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKFence_get_vk_fence(PYVKFence *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVKFence());
	}
	static PyObject *VKFence_get_semaphore(PYVKFence *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSemaphore());
	}
	static PyObject *VKFence_get_shared_handle(PYVKFence *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
	}
	static PyObject *pyVKFence_str(PYVKFence *self) {
		return PyUnicode_FromString(String::format("VKFence Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKFence_bool(PYVKFence *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUFence
	static void pyFUFence_base(PYFUFence *self) {
		new(&self->base.ptr) Fence(self->ptr);
	}
	TS_PYAPI bool isPYFUFence(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUFence_Type);
	}
	TS_PYAPI FUFence &pyFUFence_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUFence_Type) return ((PYFUFence*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUFence_get(): can't get FUFence from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUFence_get(): can't get FUFence from None");
		static FUFence ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUFence_new(const FUFence &ptr) {
		PYFUFence *ret = (PYFUFence*)PyObject_New(PYFUFence, &PYFUFence_Type);
		new(&ret->ptr) FUFence(ptr); pyFUFence_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUFence_new(FUFence &&ptr) {
		PYFUFence *ret = (PYFUFence*)PyObject_New(PYFUFence, &PYFUFence_Type);
		new(&ret->ptr) FUFence(move(ptr)); pyFUFence_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUFence_init(PYFUFence *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYFence(object)) {
				new(&self->ptr) FUFence(((PYFence*)object)->ptr);
				pyFUFence_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUFence();
			pyFUFence_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *fences_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "fences", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &fences_, &owner)) {
				if(!isPYArray(fences_)) break;
				Array<Fence> fences; Array<PyObject*> fences__; pyArray_get(fences_, fences__);
				for(PyObject *object : fences__) fences.append(pyFence_get(object));
				new(&self->ptr) FUFence(fences, (owner != 0));
				pyFUFence_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUFence::FUFence(): unknown arguments:\n(void)\n(Array<Fence> fences, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUFence_dealloc(PYFUFence *self) {
		self->ptr.~FUFence();
		self->base.ptr.~Fence();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUFence_equalPtr(PYFUFence *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUFence_clonePtr(PYFUFence *self, PyObject *args) {
		return pyFUFence_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUFence_clearPtr(PYFUFence *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUFence_destroyPtr(PYFUFence *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUFence_acquirePtr(PYFUFence *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUFence_unacquirePtr(PYFUFence *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUFence_isValidPtr(PYFUFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUFence_isOwnerPtr(PYFUFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUFence_isConstPtr(PYFUFence *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUFence_getCountPtr(PYFUFence *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUFence_getInternalPtr(PYFUFence *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUFence_getFence(PYFUFence *self, PyObject *args) {
		return pyFence_new(self->ptr.getFence());
	}
	static PyObject *FUFence_setMask(PYFUFence *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUFence::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUFence_getMask(PYFUFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUFence::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUFence_getNumFences(PYFUFence *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumFences());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUFence::getNumFences(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUFence_getFence(PYFUFence *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyFence_new(self->ptr.getFence(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyFence_new(self->ptr.getFence(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUFence::getFence(): unknown arguments:\n(uint32_t index) -> const Fence\n(uint32_t index) -> Fence\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUFence_get_mask(PYFUFence *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUFence_get_num_fences(PYFUFence *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumFences());
	}
	static PyObject *pyFUFence_str(PYFUFence *self) {
		return PyUnicode_FromString(String::format("FUFence Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUFence_bool(PYFUFence *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Shader
	TS_PYAPI bool isPYShader(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYShader_Type || type == &PYShaderCompiler_Type || type == &PYD3D12Shader_Type || type == &PYD3D11Shader_Type || type == &PYMTLShader_Type || type == &PYVKShader_Type || type == &PYGLShader_Type || type == &PYGLESShader_Type || type == &PYCUShader_Type || type == &PYHIPShader_Type || type == &PYFUShader_Type);
	}
	TS_PYAPI Shader &pyShader_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYShader_Type || type == &PYShaderCompiler_Type || type == &PYD3D12Shader_Type || type == &PYD3D11Shader_Type || type == &PYMTLShader_Type || type == &PYVKShader_Type || type == &PYGLShader_Type || type == &PYGLESShader_Type || type == &PYCUShader_Type || type == &PYHIPShader_Type || type == &PYFUShader_Type) return ((PYShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Shader_get(): can't get Shader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Shader_get(): can't get Shader from None");
		static Shader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyShader_new(const Shader &ptr) {
		PYShader *ret = (PYShader*)PyObject_New(PYShader, &PYShader_Type);
		new(&ret->ptr) Shader(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyShader_new(Shader &&ptr) {
		PYShader *ret = (PYShader*)PyObject_New(PYShader, &PYShader_Type);
		new(&ret->ptr) Shader(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyShader_init(PYShader *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Shader();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::Shader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyShader_dealloc(PYShader *self) {
		self->ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyShader_equalPtr(PYShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyShader_clonePtr(PYShader *self, PyObject *args) {
		return pyShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyShader_clearPtr(PYShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShader_destroyPtr(PYShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShader_acquirePtr(PYShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShader_unacquirePtr(PYShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShader_isValidPtr(PYShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyShader_isOwnerPtr(PYShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyShader_isConstPtr(PYShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyShader_getCountPtr(PYShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyShader_getInternalPtr(PYShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Shader_getPlatform(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getPlatformName(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getIndex(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_clear(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isCreated(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_saveState(PYShader *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.saveState(stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::saveState(): unknown arguments:\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getType(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getType(): unknown arguments:\n(void) -> Shader::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getTypeName(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Shader::getTypeName((Shader::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getTypeName(): unknown arguments:\n(Shader.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isVertex(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVertex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isVertex(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isControl(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isControl(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isEvaluate(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEvaluate());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isEvaluate(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isGeometry(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGeometry());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isGeometry(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isFragment(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFragment());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isFragment(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isCompute(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCompute());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isCompute(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isTask(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isTask(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isMesh(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isMesh(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isRayGen(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRayGen());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isRayGen(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isRayMiss(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRayMiss());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isRayMiss(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isClosest(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClosest());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isClosest(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isFirstHit(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFirstHit());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isFirstHit(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isIntersection(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIntersection());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isIntersection(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isCallable(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCallable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isCallable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isGraphicsType(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGraphicsType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isGraphicsType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isTessellationType(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTessellationType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isTessellationType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isTracingType(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTracingType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isTracingType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isMeshType(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMeshType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isMeshType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getName(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getMacros(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getMacros().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getMacros(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setSamplerOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setSamplerOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setSamplerOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getSamplerOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getSamplerOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getSamplerOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setTextureOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setTextureOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setTextureOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getTextureOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getTextureOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setSurfaceOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setSurfaceOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setSurfaceOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getSurfaceOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getSurfaceOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getSurfaceOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setUniformOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setUniformOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setUniformOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getUniformOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getUniformOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getUniformOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setStorageOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setStorageOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setStorageOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getStorageOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getStorageOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getStorageOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setTracingOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setTracingOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setTracingOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getTracingOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTracingOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getTracingOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setTexelOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setTexelOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setTexelOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getTexelOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTexelOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getTexelOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setTableOffset(PYShader *self, PyObject *args, PyObject *kwargs) {
		int32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &offset)) {
			self->ptr.setTableOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setTableOffset(): unknown arguments:\n(int32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getTableOffset(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTableOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getTableOffset(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setPatchSize(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setPatchSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setPatchSize(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getPatchSize(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPatchSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getPatchSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setInputSize(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setInputSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setInputSize(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getInputSize(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getInputSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getInputSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setOutputSize(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setOutputSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setOutputSize(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_getOutputSize(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getOutputSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::getOutputSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_load(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.load((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::load(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_create(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.create((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::create(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_loadGLSL(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadGLSL((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::loadGLSL(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_createGLSL(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createGLSL((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::createGLSL(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_loadSPIRV(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		static const char *kwlist[] = { "type", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &type, &name)) {
			return PyLong_FromLong(self->ptr.loadSPIRV((Shader::Type)type, name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::loadSPIRV(): unknown arguments:\n(Shader.Type type, const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_createSPIRV(PYShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		PyObject *data_ = nullptr;
		static const char *kwlist[] = { "type", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &type, &data_)) {
			if(!isPYArray(data_)) break;
			Array<uint32_t> data; pyArray_get(data_, data);
			return PyLong_FromLong(self->ptr.createSPIRV((Shader::Type)type, data));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::createSPIRV(): unknown arguments:\n(Shader.Type type, Array<uint32_t> data) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_hasCache(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(Shader::hasCache());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::hasCache(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setCache(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Shader::setCache(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setCache(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_loadCache(PYShader *self, PyObject *args, PyObject *kwargs) {
		PyObject *hash_ = nullptr;
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "hash", "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &hash_, &stream_)) {
			if(!isPYString(hash_)) break;
			const String &hash = (hash_) ? ((PyUnicode_Check(hash_)) ? String(PyUnicode_AsUTF8(hash_)) : (String)pyString_get(hash_)) : String::null;
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(Shader::loadCache(hash, stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::loadCache(): unknown arguments:\n(const String hash, Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_saveCache(PYShader *self, PyObject *args, PyObject *kwargs) {
		PyObject *hash_ = nullptr;
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "hash", "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &hash_, &stream_)) {
			if(!isPYString(hash_)) break;
			const String &hash = (hash_) ? ((PyUnicode_Check(hash_)) ? String(PyUnicode_AsUTF8(hash_)) : (String)pyString_get(hash_)) : String::null;
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(Shader::saveCache(hash, stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::saveCache(): unknown arguments:\n(const String hash, Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_clearCache(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			Shader::clearCache();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::clearCache(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isMacro(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Shader::isMacro(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isMacro(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setMacro(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		int32_t value = {};
		static const char *kwlist[] = { "name", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "si", (char**)kwlist, &name, &value)) {
			return PyLong_FromLong(Shader::setMacro(name, value));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			uint32_t value = {};
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sI", (char**)kwlist, &name, &value)) {
				return PyLong_FromLong(Shader::setMacro(name, value));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			const char *value = nullptr;
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &name, &value)) {
				return PyLong_FromLong(Shader::setMacro(name, value));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setMacro(): unknown arguments:\n(const char* name, int32_t value) -> bool\n(const char* name, uint32_t value) -> bool\n(const char* name, const char* value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setMacros(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *macros = nullptr;
		static const char *kwlist[] = { "macros", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &macros)) {
			return PyLong_FromLong(Shader::setMacros(macros));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setMacros(): unknown arguments:\n(const char* macros) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_removeMacro(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Shader::removeMacro(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::removeMacro(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_clearMacros(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			Shader::clearMacros();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::clearMacros(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_isInclude(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Shader::isInclude(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::isInclude(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_setInclude(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *src_ = nullptr;
		static const char *kwlist[] = { "name", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &src_)) {
			if(!isPYString(src_)) break;
			const String &src = (src_) ? ((PyUnicode_Check(src_)) ? String(PyUnicode_AsUTF8(src_)) : (String)pyString_get(src_)) : String::null;
			return PyLong_FromLong(Shader::setInclude(name, src));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::setInclude(): unknown arguments:\n(const char* name, const String src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_removeInclude(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(Shader::removeInclude(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::removeInclude(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_clearIncludes(PYShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			Shader::clearIncludes();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::clearIncludes(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_preprocessor(PYShader *self, PyObject *args, PyObject *kwargs) {
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", (char**)kwlist, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyUnicode_FromString(Shader::preprocessor(src, macros, includes, size = includes__.size()).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Shader::preprocessor(): unknown arguments:\n(const char* src, const String macros, const char** includes, uint32_t size) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Shader_get_platform(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Shader_get_platform_name(PYShader *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Shader_get_index(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Shader_get_type(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Shader_get_name(PYShader *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Shader_get_macros(PYShader *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getMacros().get());
	}
	static PyObject *Shader_get_sampler_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getSamplerOffset());
	}
	static PyObject *Shader_get_texture_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureOffset());
	}
	static PyObject *Shader_get_surface_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getSurfaceOffset());
	}
	static PyObject *Shader_get_uniform_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getUniformOffset());
	}
	static PyObject *Shader_get_storage_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getStorageOffset());
	}
	static PyObject *Shader_get_tracing_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTracingOffset());
	}
	static PyObject *Shader_get_texel_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTexelOffset());
	}
	static PyObject *Shader_get_table_offset(PYShader *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTableOffset());
	}
	static PyObject *Shader_get_patch_size(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPatchSize());
	}
	static PyObject *Shader_get_input_size(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getInputSize());
	}
	static PyObject *Shader_get_output_size(PYShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getOutputSize());
	}
	static PyObject *pyShader_str(PYShader *self) {
		return PyUnicode_FromString(String::format("Shader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyShader_bool(PYShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ShaderCompiler
	static void pyShaderCompiler_base(PYShaderCompiler *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYShaderCompiler(PyObject *object) {
		return (object && Py_TYPE(object) == &PYShaderCompiler_Type);
	}
	TS_PYAPI ShaderCompiler &pyShaderCompiler_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYShaderCompiler_Type) return ((PYShaderCompiler*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ShaderCompiler_get(): can't get ShaderCompiler from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ShaderCompiler_get(): can't get ShaderCompiler from None");
		static ShaderCompiler ret;
		return ret;
	}
	TS_PYAPI PyObject *pyShaderCompiler_new(const ShaderCompiler &ptr) {
		PYShaderCompiler *ret = (PYShaderCompiler*)PyObject_New(PYShaderCompiler, &PYShaderCompiler_Type);
		new(&ret->ptr) ShaderCompiler(ptr); pyShaderCompiler_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyShaderCompiler_new(ShaderCompiler &&ptr) {
		PYShaderCompiler *ret = (PYShaderCompiler*)PyObject_New(PYShaderCompiler, &PYShaderCompiler_Type);
		new(&ret->ptr) ShaderCompiler(move(ptr)); pyShaderCompiler_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyShaderCompiler_init(PYShaderCompiler *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) ShaderCompiler(((PYShader*)object)->ptr);
				pyShaderCompiler_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ShaderCompiler();
			pyShaderCompiler_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ShaderCompiler::ShaderCompiler(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyShaderCompiler_dealloc(PYShaderCompiler *self) {
		self->ptr.~ShaderCompiler();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyShaderCompiler_equalPtr(PYShaderCompiler *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyShaderCompiler_clonePtr(PYShaderCompiler *self, PyObject *args) {
		return pyShaderCompiler_new(self->ptr.clonePtr());
	}
	static PyObject *pyShaderCompiler_clearPtr(PYShaderCompiler *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShaderCompiler_destroyPtr(PYShaderCompiler *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShaderCompiler_acquirePtr(PYShaderCompiler *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShaderCompiler_unacquirePtr(PYShaderCompiler *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyShaderCompiler_isValidPtr(PYShaderCompiler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyShaderCompiler_isOwnerPtr(PYShaderCompiler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyShaderCompiler_isConstPtr(PYShaderCompiler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyShaderCompiler_getCountPtr(PYShaderCompiler *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyShaderCompiler_getInternalPtr(PYShaderCompiler *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyShaderCompiler_getShader(PYShaderCompiler *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *ShaderCompiler_setFlags(PYShaderCompiler *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			self->ptr.setFlags((ShaderCompiler::Flags)flags);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ShaderCompiler::setFlags(): unknown arguments:\n(ShaderCompiler.Flags flags) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ShaderCompiler_getFlags(PYShaderCompiler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ShaderCompiler::getFlags(): unknown arguments:\n(void) -> ShaderCompiler::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ShaderCompiler_getBinary(PYShaderCompiler *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		uint32_t platform = PlatformUnknown;
		static const char *kwlist[] = { "stream", "platform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &stream_, &platform)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.getBinary(stream, (Platform)platform));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ShaderCompiler::getBinary(): unknown arguments:\n(Stream stream, Platform platform) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ShaderCompiler_getSource(PYShaderCompiler *self, PyObject *args, PyObject *kwargs) {
		uint32_t platform = PlatformUnknown;
		static const char *kwlist[] = { "platform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &platform)) {
			return PyUnicode_FromString(self->ptr.getSource((Platform)platform).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ShaderCompiler::getSource(): unknown arguments:\n(Platform platform) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ShaderCompiler_get_flags(PYShaderCompiler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *ShaderCompiler_get_source(PYShaderCompiler *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getSource().get());
	}
	static PyObject *pyShaderCompiler_str(PYShaderCompiler *self) {
		return PyUnicode_FromString(String::format("ShaderCompiler Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyShaderCompiler_bool(PYShaderCompiler *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Shader
	static void pyD3D12Shader_base(PYD3D12Shader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Shader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Shader_Type);
	}
	TS_PYAPI D3D12Shader &pyD3D12Shader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Shader_Type) return ((PYD3D12Shader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Shader_get(): can't get D3D12Shader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Shader_get(): can't get D3D12Shader from None");
		static D3D12Shader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Shader_new(const D3D12Shader &ptr) {
		PYD3D12Shader *ret = (PYD3D12Shader*)PyObject_New(PYD3D12Shader, &PYD3D12Shader_Type);
		new(&ret->ptr) D3D12Shader(ptr); pyD3D12Shader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Shader_new(D3D12Shader &&ptr) {
		PYD3D12Shader *ret = (PYD3D12Shader*)PyObject_New(PYD3D12Shader, &PYD3D12Shader_Type);
		new(&ret->ptr) D3D12Shader(move(ptr)); pyD3D12Shader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Shader_init(PYD3D12Shader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) D3D12Shader(((PYShader*)object)->ptr);
				pyD3D12Shader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Shader();
			pyD3D12Shader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Shader::D3D12Shader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Shader_dealloc(PYD3D12Shader *self) {
		self->ptr.~D3D12Shader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Shader_equalPtr(PYD3D12Shader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Shader_clonePtr(PYD3D12Shader *self, PyObject *args) {
		return pyD3D12Shader_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Shader_clearPtr(PYD3D12Shader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Shader_destroyPtr(PYD3D12Shader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Shader_acquirePtr(PYD3D12Shader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Shader_unacquirePtr(PYD3D12Shader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Shader_isValidPtr(PYD3D12Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Shader_isOwnerPtr(PYD3D12Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Shader_isConstPtr(PYD3D12Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Shader_getCountPtr(PYD3D12Shader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Shader_getInternalPtr(PYD3D12Shader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Shader_getShader(PYD3D12Shader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *D3D12Shader_getShaderBlob(PYD3D12Shader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getShaderBlob());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Shader::getShaderBlob(): unknown arguments:\n(void) -> ID3DBlob*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Shader_get_shader_blob(PYD3D12Shader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getShaderBlob());
	}
	static PyObject *pyD3D12Shader_str(PYD3D12Shader *self) {
		return PyUnicode_FromString(String::format("D3D12Shader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Shader_bool(PYD3D12Shader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Shader
	static void pyD3D11Shader_base(PYD3D11Shader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Shader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Shader_Type);
	}
	TS_PYAPI D3D11Shader &pyD3D11Shader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Shader_Type) return ((PYD3D11Shader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Shader_get(): can't get D3D11Shader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Shader_get(): can't get D3D11Shader from None");
		static D3D11Shader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Shader_new(const D3D11Shader &ptr) {
		PYD3D11Shader *ret = (PYD3D11Shader*)PyObject_New(PYD3D11Shader, &PYD3D11Shader_Type);
		new(&ret->ptr) D3D11Shader(ptr); pyD3D11Shader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Shader_new(D3D11Shader &&ptr) {
		PYD3D11Shader *ret = (PYD3D11Shader*)PyObject_New(PYD3D11Shader, &PYD3D11Shader_Type);
		new(&ret->ptr) D3D11Shader(move(ptr)); pyD3D11Shader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Shader_init(PYD3D11Shader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) D3D11Shader(((PYShader*)object)->ptr);
				pyD3D11Shader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Shader();
			pyD3D11Shader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Shader::D3D11Shader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Shader_dealloc(PYD3D11Shader *self) {
		self->ptr.~D3D11Shader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Shader_equalPtr(PYD3D11Shader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Shader_clonePtr(PYD3D11Shader *self, PyObject *args) {
		return pyD3D11Shader_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Shader_clearPtr(PYD3D11Shader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Shader_destroyPtr(PYD3D11Shader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Shader_acquirePtr(PYD3D11Shader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Shader_unacquirePtr(PYD3D11Shader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Shader_isValidPtr(PYD3D11Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Shader_isOwnerPtr(PYD3D11Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Shader_isConstPtr(PYD3D11Shader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Shader_getCountPtr(PYD3D11Shader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Shader_getInternalPtr(PYD3D11Shader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Shader_getShader(PYD3D11Shader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *D3D11Shader_getD3D11Shader(PYD3D11Shader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D11Shader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Shader::getD3D11Shader(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Shader_getShaderBlob(PYD3D11Shader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getShaderBlob());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Shader::getShaderBlob(): unknown arguments:\n(void) -> ID3DBlob*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Shader_get_d3d11_shader(PYD3D11Shader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D11Shader());
	}
	static PyObject *D3D11Shader_get_shader_blob(PYD3D11Shader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getShaderBlob());
	}
	static PyObject *pyD3D11Shader_str(PYD3D11Shader *self) {
		return PyUnicode_FromString(String::format("D3D11Shader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Shader_bool(PYD3D11Shader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLShader
	static void pyMTLShader_base(PYMTLShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYMTLShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLShader_Type);
	}
	TS_PYAPI MTLShader &pyMTLShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLShader_Type) return ((PYMTLShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLShader_get(): can't get MTLShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLShader_get(): can't get MTLShader from None");
		static MTLShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLShader_new(const MTLShader &ptr) {
		PYMTLShader *ret = (PYMTLShader*)PyObject_New(PYMTLShader, &PYMTLShader_Type);
		new(&ret->ptr) MTLShader(ptr); pyMTLShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLShader_new(MTLShader &&ptr) {
		PYMTLShader *ret = (PYMTLShader*)PyObject_New(PYMTLShader, &PYMTLShader_Type);
		new(&ret->ptr) MTLShader(move(ptr)); pyMTLShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLShader_init(PYMTLShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) MTLShader(((PYShader*)object)->ptr);
				pyMTLShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLShader();
			pyMTLShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLShader::MTLShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLShader_dealloc(PYMTLShader *self) {
		self->ptr.~MTLShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLShader_equalPtr(PYMTLShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLShader_clonePtr(PYMTLShader *self, PyObject *args) {
		return pyMTLShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLShader_clearPtr(PYMTLShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLShader_destroyPtr(PYMTLShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLShader_acquirePtr(PYMTLShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLShader_unacquirePtr(PYMTLShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLShader_isValidPtr(PYMTLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLShader_isOwnerPtr(PYMTLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLShader_isConstPtr(PYMTLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLShader_getCountPtr(PYMTLShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLShader_getInternalPtr(PYMTLShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLShader_getShader(PYMTLShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *MTLShader_setIndirect(PYMTLShader *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setIndirect((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLShader::setIndirect(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLShader_isIndirect(PYMTLShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIndirect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLShader::isIndirect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLShader_getLibrary(PYMTLShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getLibrary());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLShader::getLibrary(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLShader_getFunction(PYMTLShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLShader::getFunction(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLShader_get_library(PYMTLShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getLibrary());
	}
	static PyObject *MTLShader_get_function(PYMTLShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFunction());
	}
	static PyObject *pyMTLShader_str(PYMTLShader *self) {
		return PyUnicode_FromString(String::format("MTLShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLShader_bool(PYMTLShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKShader
	static void pyVKShader_base(PYVKShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYVKShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKShader_Type);
	}
	TS_PYAPI VKShader &pyVKShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKShader_Type) return ((PYVKShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKShader_get(): can't get VKShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKShader_get(): can't get VKShader from None");
		static VKShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKShader_new(const VKShader &ptr) {
		PYVKShader *ret = (PYVKShader*)PyObject_New(PYVKShader, &PYVKShader_Type);
		new(&ret->ptr) VKShader(ptr); pyVKShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKShader_new(VKShader &&ptr) {
		PYVKShader *ret = (PYVKShader*)PyObject_New(PYVKShader, &PYVKShader_Type);
		new(&ret->ptr) VKShader(move(ptr)); pyVKShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKShader_init(PYVKShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) VKShader(((PYShader*)object)->ptr);
				pyVKShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKShader();
			pyVKShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKShader::VKShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKShader_dealloc(PYVKShader *self) {
		self->ptr.~VKShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKShader_equalPtr(PYVKShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKShader_clonePtr(PYVKShader *self, PyObject *args) {
		return pyVKShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKShader_clearPtr(PYVKShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKShader_destroyPtr(PYVKShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKShader_acquirePtr(PYVKShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKShader_unacquirePtr(PYVKShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKShader_isValidPtr(PYVKShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKShader_isOwnerPtr(PYVKShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKShader_isConstPtr(PYVKShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKShader_getCountPtr(PYVKShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKShader_getInternalPtr(PYVKShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKShader_getShader(PYVKShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *VKShader_getModule(PYVKShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getModule());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKShader::getModule(): unknown arguments:\n(void) -> VkShaderModule\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKShader_get_module(PYVKShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getModule());
	}
	static PyObject *pyVKShader_str(PYVKShader *self) {
		return PyUnicode_FromString(String::format("VKShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKShader_bool(PYVKShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLShader
	static void pyGLShader_base(PYGLShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYGLShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLShader_Type);
	}
	TS_PYAPI GLShader &pyGLShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLShader_Type) return ((PYGLShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLShader_get(): can't get GLShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLShader_get(): can't get GLShader from None");
		static GLShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLShader_new(const GLShader &ptr) {
		PYGLShader *ret = (PYGLShader*)PyObject_New(PYGLShader, &PYGLShader_Type);
		new(&ret->ptr) GLShader(ptr); pyGLShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLShader_new(GLShader &&ptr) {
		PYGLShader *ret = (PYGLShader*)PyObject_New(PYGLShader, &PYGLShader_Type);
		new(&ret->ptr) GLShader(move(ptr)); pyGLShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLShader_init(PYGLShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) GLShader(((PYShader*)object)->ptr);
				pyGLShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLShader();
			pyGLShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLShader::GLShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLShader_dealloc(PYGLShader *self) {
		self->ptr.~GLShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLShader_equalPtr(PYGLShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLShader_clonePtr(PYGLShader *self, PyObject *args) {
		return pyGLShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLShader_clearPtr(PYGLShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLShader_destroyPtr(PYGLShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLShader_acquirePtr(PYGLShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLShader_unacquirePtr(PYGLShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLShader_isValidPtr(PYGLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLShader_isOwnerPtr(PYGLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLShader_isConstPtr(PYGLShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLShader_getCountPtr(PYGLShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLShader_getInternalPtr(PYGLShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLShader_getShader(PYGLShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *GLShader_attachShader(PYGLShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t program_id = {};
		static const char *kwlist[] = { "program_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &program_id)) {
			return PyLong_FromLong(self->ptr.attachShader(program_id));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLShader::attachShader(): unknown arguments:\n(uint32_t program_id) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLShader_getShaderType(PYGLShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getShaderType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLShader::getShaderType(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLShader_getShaderID(PYGLShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getShaderID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLShader::getShaderID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLShader_get_shader_type(PYGLShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getShaderType());
	}
	static PyObject *GLShader_get_shader_id(PYGLShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getShaderID());
	}
	static PyObject *pyGLShader_str(PYGLShader *self) {
		return PyUnicode_FromString(String::format("GLShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLShader_bool(PYGLShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESShader
	static void pyGLESShader_base(PYGLESShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYGLESShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESShader_Type);
	}
	TS_PYAPI GLESShader &pyGLESShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESShader_Type) return ((PYGLESShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESShader_get(): can't get GLESShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESShader_get(): can't get GLESShader from None");
		static GLESShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESShader_new(const GLESShader &ptr) {
		PYGLESShader *ret = (PYGLESShader*)PyObject_New(PYGLESShader, &PYGLESShader_Type);
		new(&ret->ptr) GLESShader(ptr); pyGLESShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESShader_new(GLESShader &&ptr) {
		PYGLESShader *ret = (PYGLESShader*)PyObject_New(PYGLESShader, &PYGLESShader_Type);
		new(&ret->ptr) GLESShader(move(ptr)); pyGLESShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESShader_init(PYGLESShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) GLESShader(((PYShader*)object)->ptr);
				pyGLESShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESShader();
			pyGLESShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESShader::GLESShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESShader_dealloc(PYGLESShader *self) {
		self->ptr.~GLESShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESShader_equalPtr(PYGLESShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESShader_clonePtr(PYGLESShader *self, PyObject *args) {
		return pyGLESShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESShader_clearPtr(PYGLESShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESShader_destroyPtr(PYGLESShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESShader_acquirePtr(PYGLESShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESShader_unacquirePtr(PYGLESShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESShader_isValidPtr(PYGLESShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESShader_isOwnerPtr(PYGLESShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESShader_isConstPtr(PYGLESShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESShader_getCountPtr(PYGLESShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESShader_getInternalPtr(PYGLESShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESShader_getShader(PYGLESShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *GLESShader_attachShader(PYGLESShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t program_id = {};
		static const char *kwlist[] = { "program_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &program_id)) {
			return PyLong_FromLong(self->ptr.attachShader(program_id));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESShader::attachShader(): unknown arguments:\n(uint32_t program_id) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESShader_getShaderType(PYGLESShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getShaderType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESShader::getShaderType(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESShader_getShaderID(PYGLESShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getShaderID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESShader::getShaderID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESShader_get_shader_type(PYGLESShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getShaderType());
	}
	static PyObject *GLESShader_get_shader_id(PYGLESShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getShaderID());
	}
	static PyObject *pyGLESShader_str(PYGLESShader *self) {
		return PyUnicode_FromString(String::format("GLESShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESShader_bool(PYGLESShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CUShader
	static void pyCUShader_base(PYCUShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYCUShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCUShader_Type);
	}
	TS_PYAPI CUShader &pyCUShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCUShader_Type) return ((PYCUShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CUShader_get(): can't get CUShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CUShader_get(): can't get CUShader from None");
		static CUShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCUShader_new(const CUShader &ptr) {
		PYCUShader *ret = (PYCUShader*)PyObject_New(PYCUShader, &PYCUShader_Type);
		new(&ret->ptr) CUShader(ptr); pyCUShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCUShader_new(CUShader &&ptr) {
		PYCUShader *ret = (PYCUShader*)PyObject_New(PYCUShader, &PYCUShader_Type);
		new(&ret->ptr) CUShader(move(ptr)); pyCUShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCUShader_init(PYCUShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) CUShader(((PYShader*)object)->ptr);
				pyCUShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CUShader();
			pyCUShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUShader::CUShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCUShader_dealloc(PYCUShader *self) {
		self->ptr.~CUShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCUShader_equalPtr(PYCUShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCUShader_clonePtr(PYCUShader *self, PyObject *args) {
		return pyCUShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyCUShader_clearPtr(PYCUShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUShader_destroyPtr(PYCUShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUShader_acquirePtr(PYCUShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUShader_unacquirePtr(PYCUShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUShader_isValidPtr(PYCUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCUShader_isOwnerPtr(PYCUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCUShader_isConstPtr(PYCUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCUShader_getCountPtr(PYCUShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCUShader_getInternalPtr(PYCUShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCUShader_getShader(PYCUShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *CUShader_getModule(PYCUShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getModule());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUShader::getModule(): unknown arguments:\n(void) -> CUmodule\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUShader_getFunction(PYCUShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUShader::getFunction(): unknown arguments:\n(void) -> CUfunction\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUShader_get_module(PYCUShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getModule());
	}
	static PyObject *CUShader_get_function(PYCUShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFunction());
	}
	static PyObject *pyCUShader_str(PYCUShader *self) {
		return PyUnicode_FromString(String::format("CUShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCUShader_bool(PYCUShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::HIPShader
	static void pyHIPShader_base(PYHIPShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYHIPShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYHIPShader_Type);
	}
	TS_PYAPI HIPShader &pyHIPShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYHIPShader_Type) return ((PYHIPShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "HIPShader_get(): can't get HIPShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "HIPShader_get(): can't get HIPShader from None");
		static HIPShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyHIPShader_new(const HIPShader &ptr) {
		PYHIPShader *ret = (PYHIPShader*)PyObject_New(PYHIPShader, &PYHIPShader_Type);
		new(&ret->ptr) HIPShader(ptr); pyHIPShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyHIPShader_new(HIPShader &&ptr) {
		PYHIPShader *ret = (PYHIPShader*)PyObject_New(PYHIPShader, &PYHIPShader_Type);
		new(&ret->ptr) HIPShader(move(ptr)); pyHIPShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyHIPShader_init(PYHIPShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) HIPShader(((PYShader*)object)->ptr);
				pyHIPShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) HIPShader();
			pyHIPShader_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPShader::HIPShader(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyHIPShader_dealloc(PYHIPShader *self) {
		self->ptr.~HIPShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyHIPShader_equalPtr(PYHIPShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyHIPShader_clonePtr(PYHIPShader *self, PyObject *args) {
		return pyHIPShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyHIPShader_clearPtr(PYHIPShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPShader_destroyPtr(PYHIPShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPShader_acquirePtr(PYHIPShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPShader_unacquirePtr(PYHIPShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPShader_isValidPtr(PYHIPShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyHIPShader_isOwnerPtr(PYHIPShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyHIPShader_isConstPtr(PYHIPShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyHIPShader_getCountPtr(PYHIPShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyHIPShader_getInternalPtr(PYHIPShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyHIPShader_getShader(PYHIPShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *HIPShader_getModule(PYHIPShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getModule());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPShader::getModule(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPShader_getFunction(PYHIPShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPShader::getFunction(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPShader_get_module(PYHIPShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getModule());
	}
	static PyObject *HIPShader_get_function(PYHIPShader *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFunction());
	}
	static PyObject *pyHIPShader_str(PYHIPShader *self) {
		return PyUnicode_FromString(String::format("HIPShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyHIPShader_bool(PYHIPShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUShader
	static void pyFUShader_base(PYFUShader *self) {
		new(&self->base.ptr) Shader(self->ptr);
	}
	TS_PYAPI bool isPYFUShader(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUShader_Type);
	}
	TS_PYAPI FUShader &pyFUShader_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUShader_Type) return ((PYFUShader*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUShader_get(): can't get FUShader from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUShader_get(): can't get FUShader from None");
		static FUShader ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUShader_new(const FUShader &ptr) {
		PYFUShader *ret = (PYFUShader*)PyObject_New(PYFUShader, &PYFUShader_Type);
		new(&ret->ptr) FUShader(ptr); pyFUShader_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUShader_new(FUShader &&ptr) {
		PYFUShader *ret = (PYFUShader*)PyObject_New(PYFUShader, &PYFUShader_Type);
		new(&ret->ptr) FUShader(move(ptr)); pyFUShader_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUShader_init(PYFUShader *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYShader(object)) {
				new(&self->ptr) FUShader(((PYShader*)object)->ptr);
				pyFUShader_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUShader();
			pyFUShader_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *shaders_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "shaders", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &shaders_, &owner)) {
				if(!isPYArray(shaders_)) break;
				Array<Shader> shaders; Array<PyObject*> shaders__; pyArray_get(shaders_, shaders__);
				for(PyObject *object : shaders__) shaders.append(pyShader_get(object));
				new(&self->ptr) FUShader(shaders, (owner != 0));
				pyFUShader_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUShader::FUShader(): unknown arguments:\n(void)\n(Array<Shader> shaders, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUShader_dealloc(PYFUShader *self) {
		self->ptr.~FUShader();
		self->base.ptr.~Shader();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUShader_equalPtr(PYFUShader *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUShader_clonePtr(PYFUShader *self, PyObject *args) {
		return pyFUShader_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUShader_clearPtr(PYFUShader *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUShader_destroyPtr(PYFUShader *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUShader_acquirePtr(PYFUShader *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUShader_unacquirePtr(PYFUShader *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUShader_isValidPtr(PYFUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUShader_isOwnerPtr(PYFUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUShader_isConstPtr(PYFUShader *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUShader_getCountPtr(PYFUShader *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUShader_getInternalPtr(PYFUShader *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUShader_getShader(PYFUShader *self, PyObject *args) {
		return pyShader_new(self->ptr.getShader());
	}
	static PyObject *FUShader_setMask(PYFUShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUShader::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUShader_getMask(PYFUShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUShader::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUShader_getNumShaders(PYFUShader *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumShaders());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUShader::getNumShaders(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUShader_getShader(PYFUShader *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyShader_new(self->ptr.getShader(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyShader_new(self->ptr.getShader(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUShader::getShader(): unknown arguments:\n(uint32_t index) -> const Shader\n(uint32_t index) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUShader_get_mask(PYFUShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUShader_get_num_shaders(PYFUShader *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumShaders());
	}
	static PyObject *pyFUShader_str(PYFUShader *self) {
		return PyUnicode_FromString(String::format("FUShader Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUShader_bool(PYFUShader *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Sampler
	TS_PYAPI bool isPYSampler(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYSampler_Type || type == &PYMTLSampler_Type || type == &PYFUSampler_Type);
	}
	TS_PYAPI Sampler &pySampler_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYSampler_Type || type == &PYMTLSampler_Type || type == &PYFUSampler_Type) return ((PYSampler*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Sampler_get(): can't get Sampler from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Sampler_get(): can't get Sampler from None");
		static Sampler ret;
		return ret;
	}
	TS_PYAPI PyObject *pySampler_new(const Sampler &ptr) {
		PYSampler *ret = (PYSampler*)PyObject_New(PYSampler, &PYSampler_Type);
		new(&ret->ptr) Sampler(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySampler_new(Sampler &&ptr) {
		PYSampler *ret = (PYSampler*)PyObject_New(PYSampler, &PYSampler_Type);
		new(&ret->ptr) Sampler(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pySampler_init(PYSampler *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Sampler();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::Sampler(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySampler_dealloc(PYSampler *self) {
		self->ptr.~Sampler();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySampler_equalPtr(PYSampler *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySampler_clonePtr(PYSampler *self, PyObject *args) {
		return pySampler_new(self->ptr.clonePtr());
	}
	static PyObject *pySampler_clearPtr(PYSampler *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySampler_destroyPtr(PYSampler *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySampler_acquirePtr(PYSampler *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySampler_unacquirePtr(PYSampler *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySampler_isValidPtr(PYSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySampler_isOwnerPtr(PYSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySampler_isConstPtr(PYSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySampler_getCountPtr(PYSampler *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySampler_getInternalPtr(PYSampler *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Sampler_getPlatform(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getPlatformName(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getIndex(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_clear(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_isCreated(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_create(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.create());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::create(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setParameters(PYSampler *self, PyObject *args, PyObject *kwargs) {
		PyObject *sampler_ = nullptr;
		static const char *kwlist[] = { "sampler", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sampler_)) {
			if(!isPYSampler(sampler_)) break;
			const Sampler &sampler = pySampler_get(sampler_);
			self->ptr.setParameters(sampler);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setParameters(): unknown arguments:\n(const Sampler sampler) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setFilter(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &filter)) {
			self->ptr.setFilter((Sampler::Filter)filter);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setFilter(): unknown arguments:\n(Sampler.Filter filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getFilter(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFilter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getFilter(): unknown arguments:\n(void) -> Sampler::Filter\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_isPointFilter(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPointFilter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::isPointFilter(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setAnisotropy(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t anisotropy = {};
		static const char *kwlist[] = { "anisotropy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &anisotropy)) {
			self->ptr.setAnisotropy(anisotropy);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setAnisotropy(): unknown arguments:\n(uint32_t anisotropy) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getAnisotropy(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getAnisotropy(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_hasAnisotropy(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasAnisotropy());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::hasAnisotropy(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setWrapMode(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode_s = 0;
		uint32_t mode_t = 0;
		uint32_t mode_r = 0;
		static const char *kwlist[] = { "mode_s", "mode_t", "mode_r", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &mode_s, &mode_t, &mode_r)) {
			self->ptr.setWrapMode((Sampler::WrapMode)mode_s, (Sampler::WrapMode)mode_t, (Sampler::WrapMode)mode_r);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t mode = 0;
			static const char *kwlist[] = { "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
				self->ptr.setWrapMode((Sampler::WrapMode)mode);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setWrapMode(): unknown arguments:\n(Sampler.WrapMode mode_s, Sampler.WrapMode mode_t, Sampler.WrapMode mode_r) -> void\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setWrapModeS(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setWrapModeS((Sampler::WrapMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setWrapModeS(): unknown arguments:\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getWrapModeS(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWrapModeS());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getWrapModeS(): unknown arguments:\n(void) -> Sampler::WrapMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setWrapModeT(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setWrapModeT((Sampler::WrapMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setWrapModeT(): unknown arguments:\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getWrapModeT(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWrapModeT());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getWrapModeT(): unknown arguments:\n(void) -> Sampler::WrapMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setWrapModeR(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setWrapModeR((Sampler::WrapMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setWrapModeR(): unknown arguments:\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getWrapModeR(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWrapModeR());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getWrapModeR(): unknown arguments:\n(void) -> Sampler::WrapMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setLod(PYSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t min = {};
		float32_t max = {};
		float32_t bias = {};
		static const char *kwlist[] = { "min", "max", "bias", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fff", (char**)kwlist, &min, &max, &bias)) {
			self->ptr.setLod(min, max, bias);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setLod(): unknown arguments:\n(float32_t min, float32_t max, float32_t bias) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setLodMin(PYSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t min = {};
		static const char *kwlist[] = { "min", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &min)) {
			self->ptr.setLodMin(min);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setLodMin(): unknown arguments:\n(float32_t min) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getLodMin(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getLodMin());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getLodMin(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setLodMax(PYSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t max = {};
		static const char *kwlist[] = { "max", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &max)) {
			self->ptr.setLodMax(max);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setLodMax(): unknown arguments:\n(float32_t max) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getLodMax(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getLodMax());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getLodMax(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setLodBias(PYSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t bias = {};
		static const char *kwlist[] = { "bias", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &bias)) {
			self->ptr.setLodBias(bias);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setLodBias(): unknown arguments:\n(float32_t bias) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getLodBias(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getLodBias());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getLodBias(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setBorderColor(PYSampler *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
			self->ptr.setBorderColor(r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setBorderColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setBorderColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getBorderColor(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getBorderColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getBorderColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setCompareFunc(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &func)) {
			self->ptr.setCompareFunc((Sampler::CompareFunc)func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setCompareFunc(): unknown arguments:\n(Sampler.CompareFunc func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getCompareFunc(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCompareFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getCompareFunc(): unknown arguments:\n(void) -> Sampler::CompareFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_setReductionMode(PYSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setReductionMode((Sampler::ReductionMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::setReductionMode(): unknown arguments:\n(Sampler.ReductionMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_getReductionMode(PYSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getReductionMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Sampler::getReductionMode(): unknown arguments:\n(void) -> Sampler::ReductionMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Sampler_get_platform(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Sampler_get_platform_name(PYSampler *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Sampler_get_index(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Sampler_get_filter(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFilter());
	}
	static PyObject *Sampler_get_anisotropy(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
	}
	static PyObject *Sampler_get_wrap_mode_s(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWrapModeS());
	}
	static PyObject *Sampler_get_wrap_mode_t(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWrapModeT());
	}
	static PyObject *Sampler_get_wrap_mode_r(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWrapModeR());
	}
	static PyObject *Sampler_get_lod_min(PYSampler *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getLodMin());
	}
	static PyObject *Sampler_get_lod_max(PYSampler *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getLodMax());
	}
	static PyObject *Sampler_get_lod_bias(PYSampler *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getLodBias());
	}
	static PyObject *Sampler_get_border_color(PYSampler *self, void *offset) {
		return pyColor_new(self->ptr.getBorderColor());
	}
	static PyObject *Sampler_get_compare_func(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCompareFunc());
	}
	static PyObject *Sampler_get_reduction_mode(PYSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getReductionMode());
	}
	static PyObject *pySampler_str(PYSampler *self) {
		return PyUnicode_FromString(String::format("Sampler Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySampler_bool(PYSampler *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLSampler
	static void pyMTLSampler_base(PYMTLSampler *self) {
		new(&self->base.ptr) Sampler(self->ptr);
	}
	TS_PYAPI bool isPYMTLSampler(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLSampler_Type);
	}
	TS_PYAPI MTLSampler &pyMTLSampler_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLSampler_Type) return ((PYMTLSampler*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLSampler_get(): can't get MTLSampler from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLSampler_get(): can't get MTLSampler from None");
		static MTLSampler ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLSampler_new(const MTLSampler &ptr) {
		PYMTLSampler *ret = (PYMTLSampler*)PyObject_New(PYMTLSampler, &PYMTLSampler_Type);
		new(&ret->ptr) MTLSampler(ptr); pyMTLSampler_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLSampler_new(MTLSampler &&ptr) {
		PYMTLSampler *ret = (PYMTLSampler*)PyObject_New(PYMTLSampler, &PYMTLSampler_Type);
		new(&ret->ptr) MTLSampler(move(ptr)); pyMTLSampler_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLSampler_init(PYMTLSampler *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSampler(object)) {
				new(&self->ptr) MTLSampler(((PYSampler*)object)->ptr);
				pyMTLSampler_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLSampler();
			pyMTLSampler_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSampler::MTLSampler(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLSampler_dealloc(PYMTLSampler *self) {
		self->ptr.~MTLSampler();
		self->base.ptr.~Sampler();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLSampler_equalPtr(PYMTLSampler *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLSampler_clonePtr(PYMTLSampler *self, PyObject *args) {
		return pyMTLSampler_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLSampler_clearPtr(PYMTLSampler *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSampler_destroyPtr(PYMTLSampler *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSampler_acquirePtr(PYMTLSampler *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSampler_unacquirePtr(PYMTLSampler *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSampler_isValidPtr(PYMTLSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLSampler_isOwnerPtr(PYMTLSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLSampler_isConstPtr(PYMTLSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLSampler_getCountPtr(PYMTLSampler *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLSampler_getInternalPtr(PYMTLSampler *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLSampler_getSampler(PYMTLSampler *self, PyObject *args) {
		return pySampler_new(self->ptr.getSampler());
	}
	static PyObject *MTLSampler_setIndirect(PYMTLSampler *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setIndirect((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSampler::setIndirect(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSampler_isIndirect(PYMTLSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIndirect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSampler::isIndirect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyMTLSampler_str(PYMTLSampler *self) {
		return PyUnicode_FromString(String::format("MTLSampler Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLSampler_bool(PYMTLSampler *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUSampler
	static void pyFUSampler_base(PYFUSampler *self) {
		new(&self->base.ptr) Sampler(self->ptr);
	}
	TS_PYAPI bool isPYFUSampler(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUSampler_Type);
	}
	TS_PYAPI FUSampler &pyFUSampler_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUSampler_Type) return ((PYFUSampler*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUSampler_get(): can't get FUSampler from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUSampler_get(): can't get FUSampler from None");
		static FUSampler ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUSampler_new(const FUSampler &ptr) {
		PYFUSampler *ret = (PYFUSampler*)PyObject_New(PYFUSampler, &PYFUSampler_Type);
		new(&ret->ptr) FUSampler(ptr); pyFUSampler_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUSampler_new(FUSampler &&ptr) {
		PYFUSampler *ret = (PYFUSampler*)PyObject_New(PYFUSampler, &PYFUSampler_Type);
		new(&ret->ptr) FUSampler(move(ptr)); pyFUSampler_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUSampler_init(PYFUSampler *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSampler(object)) {
				new(&self->ptr) FUSampler(((PYSampler*)object)->ptr);
				pyFUSampler_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUSampler();
			pyFUSampler_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *samplers_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "samplers", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &samplers_, &owner)) {
				if(!isPYArray(samplers_)) break;
				Array<Sampler> samplers; Array<PyObject*> samplers__; pyArray_get(samplers_, samplers__);
				for(PyObject *object : samplers__) samplers.append(pySampler_get(object));
				new(&self->ptr) FUSampler(samplers, (owner != 0));
				pyFUSampler_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUSampler::FUSampler(): unknown arguments:\n(void)\n(Array<Sampler> samplers, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUSampler_dealloc(PYFUSampler *self) {
		self->ptr.~FUSampler();
		self->base.ptr.~Sampler();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUSampler_equalPtr(PYFUSampler *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUSampler_clonePtr(PYFUSampler *self, PyObject *args) {
		return pyFUSampler_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUSampler_clearPtr(PYFUSampler *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUSampler_destroyPtr(PYFUSampler *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUSampler_acquirePtr(PYFUSampler *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUSampler_unacquirePtr(PYFUSampler *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUSampler_isValidPtr(PYFUSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUSampler_isOwnerPtr(PYFUSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUSampler_isConstPtr(PYFUSampler *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUSampler_getCountPtr(PYFUSampler *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUSampler_getInternalPtr(PYFUSampler *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUSampler_getSampler(PYFUSampler *self, PyObject *args) {
		return pySampler_new(self->ptr.getSampler());
	}
	static PyObject *FUSampler_setMask(PYFUSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUSampler::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUSampler_getMask(PYFUSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUSampler::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUSampler_getNumSamplers(PYFUSampler *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUSampler::getNumSamplers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUSampler_getSampler(PYFUSampler *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pySampler_new(self->ptr.getSampler(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pySampler_new(self->ptr.getSampler(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUSampler::getSampler(): unknown arguments:\n(uint32_t index) -> const Sampler\n(uint32_t index) -> Sampler\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUSampler_get_mask(PYFUSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUSampler_get_num_samplers(PYFUSampler *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
	}
	static PyObject *pyFUSampler_str(PYFUSampler *self) {
		return PyUnicode_FromString(String::format("FUSampler Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUSampler_bool(PYFUSampler *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Texture
	TS_PYAPI bool isPYTexture(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYTexture_Type || type == &PYD3D12Texture_Type || type == &PYD3D11Texture_Type || type == &PYMTLTexture_Type || type == &PYVKTexture_Type || type == &PYGLTexture_Type || type == &PYGLESTexture_Type || type == &PYCUTexture_Type || type == &PYHIPTexture_Type || type == &PYFUTexture_Type);
	}
	TS_PYAPI Texture &pyTexture_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYTexture_Type || type == &PYD3D12Texture_Type || type == &PYD3D11Texture_Type || type == &PYMTLTexture_Type || type == &PYVKTexture_Type || type == &PYGLTexture_Type || type == &PYGLESTexture_Type || type == &PYCUTexture_Type || type == &PYHIPTexture_Type || type == &PYFUTexture_Type) return ((PYTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Texture_get(): can't get Texture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Texture_get(): can't get Texture from None");
		static Texture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTexture_new(const Texture &ptr) {
		PYTexture *ret = (PYTexture*)PyObject_New(PYTexture, &PYTexture_Type);
		new(&ret->ptr) Texture(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTexture_new(Texture &&ptr) {
		PYTexture *ret = (PYTexture*)PyObject_New(PYTexture, &PYTexture_Type);
		new(&ret->ptr) Texture(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTexture_init(PYTexture *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Texture();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::Texture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTexture_dealloc(PYTexture *self) {
		self->ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTexture_equalPtr(PYTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTexture_clonePtr(PYTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyTexture_clearPtr(PYTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTexture_destroyPtr(PYTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTexture_acquirePtr(PYTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTexture_unacquirePtr(PYTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTexture_isValidPtr(PYTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTexture_isOwnerPtr(PYTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTexture_isConstPtr(PYTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTexture_getCountPtr(PYTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTexture_getInternalPtr(PYTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Texture_getPlatform(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getPlatformName(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getIndex(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_clear(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isCreated(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_setName(PYTexture *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getName(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_create(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		PyObject *size_ = nullptr;
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "type", "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOI|I", (char**)kwlist, &type, &format, &size_, &layers, &flags)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return PyLong_FromLong(self->ptr.create((Texture::Type)type, (Format)format, size, layers, (Texture::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::create(): unknown arguments:\n(Texture.Type type, Format format, const Size size, uint32_t layers, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_create2D(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "width", "height", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &layers, &flags)) {
			return PyLong_FromLong(self->ptr.create2D((Format)format, width, height, layers, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t width = {};
			uint32_t height = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "width", "height", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &width, &height, &flags)) {
				return PyLong_FromLong(self->ptr.create2D((Format)format, width, height, (Texture::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.create2D((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::create2D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t layers, Texture.Flags flags) -> bool\n(Format format, uint32_t width, uint32_t height, Texture.Flags flags) -> bool\n(Format format, uint32_t size, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_create3D(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t depth = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "width", "height", "depth", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &depth, &flags)) {
			return PyLong_FromLong(self->ptr.create3D((Format)format, width, height, depth, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.create3D((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::create3D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t depth, Texture.Flags flags) -> bool\n(Format format, uint32_t size, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_createCube(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t size = {};
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &size, &layers, &flags)) {
			return PyLong_FromLong(self->ptr.createCube((Format)format, size, layers, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return PyLong_FromLong(self->ptr.createCube((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::createCube(): unknown arguments:\n(Format format, uint32_t size, uint32_t layers, Texture.Flags flags) -> bool\n(Format format, uint32_t size, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getType(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getType(): unknown arguments:\n(void) -> Texture::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTypeName(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Texture::getTypeName((Texture::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTypeName(): unknown arguments:\n(Texture.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is2DType(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is2DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is2DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is3DType(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is3DType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is3DType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isCubeType(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCubeType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isCubeType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getFormatName(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormatName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getFormatName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isColorFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isColorFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isColorFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isDepthFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isDepthFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isPixelFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isPixelFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isPlainFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPlainFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isPlainFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isMixedFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMixedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isMixedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isBlockFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBlockFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isBlockFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isStencilFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isStencilFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isStencilFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isNormFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isNormFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isNormFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isSRGBFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSRGBFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isSRGBFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isFloatFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFloatFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isFloatFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isSignedFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSignedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isSignedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isUnsignedFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnsignedFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isUnsignedFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isIntegerFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIntegerFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isIntegerFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isi8Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi8Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isi8Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isu8Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu8Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isu8Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is8BitFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is8BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is8BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isi16Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isi16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isu16Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isu16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isf16Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf16Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isf16Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is16BitFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is16BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is16BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isi32Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isi32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isu32Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isu32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isf32Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf32Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isf32Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is32BitFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is32BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is32BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isi64Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isi64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isi64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isu64Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isu64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isu64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isf64Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isf64Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isf64Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_is64BitFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.is64BitFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::is64BitFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isBC15Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBC15Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isBC15Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isBC67Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBC67Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isBC67Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isETC2Format(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isETC2Format());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isETC2Format(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_isASTCFormat(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isASTCFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::isASTCFormat(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getComponents(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getComponents());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getComponents(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getPixelSize(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getPixelSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getBlockSize(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getBlockSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getBlockWidth(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getBlockWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getBlockHeight(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlockHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getBlockHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getFlags(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getFlags(): unknown arguments:\n(void) -> Texture::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasFlag(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlag((Texture::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasFlag(): unknown arguments:\n(Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasFlags(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlags((Texture::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasFlags(): unknown arguments:\n(Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getFlagsName(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFlagsName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getFlagsName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getMultisample(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasMultisample(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasMultisample(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getWidth(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getWidth(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getHeight(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getHeight(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getDepth(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getDepth(): unknown arguments:\n(uint32_t mipmap) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getFaces(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getFaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getLayers(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getLayers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getMipmaps(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getMipmaps(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_findMipmap(PYTexture *self, PyObject *args, PyObject *kwargs) {
		PyObject *size_ = nullptr;
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &size_)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return PyLong_FromUnsignedLong(self->ptr.findMipmap(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::findMipmap(): unknown arguments:\n(const Size size) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasFaces(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasFaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasFaces(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasLayers(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasLayers(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_hasMipmaps(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::hasMipmaps(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getSize(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return pySize_new(self->ptr.getSize(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pySize_new(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getSize(): unknown arguments:\n(uint32_t mipmap) -> Size\n(void) -> Size\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getRegion(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return pyRegion_new(self->ptr.getRegion(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyRegion_new(self->ptr.getRegion());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getRegion(): unknown arguments:\n(uint32_t mipmap) -> Region\n(void) -> Region\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getSlice(PYTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mipmap)) {
			return pySlice_new(self->ptr.getSlice(mipmap));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pySlice_new(self->ptr.getSlice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getSlice(): unknown arguments:\n(uint32_t mipmap) -> Slice\n(void) -> Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTileWidth(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTileWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTileWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTileHeight(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTileHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTileHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTileDepth(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTileDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTileDepth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTileMipmaps(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTileMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTileMipmaps(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getTileSize(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySize_new(self->ptr.getTileSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getTileSize(): unknown arguments:\n(void) -> Size\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getDescription(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDescription().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getDescription(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_getMemory(PYTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Texture::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Texture_get_platform(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Texture_get_platform_name(PYTexture *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Texture_get_index(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Texture_get_name(PYTexture *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Texture_get_type(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Texture_get_format(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFormat());
	}
	static PyObject *Texture_get_format_name(PYTexture *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormatName());
	}
	static PyObject *Texture_get_components(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getComponents());
	}
	static PyObject *Texture_get_pixel_size(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelSize());
	}
	static PyObject *Texture_get_block_size(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockSize());
	}
	static PyObject *Texture_get_block_width(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockWidth());
	}
	static PyObject *Texture_get_block_height(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlockHeight());
	}
	static PyObject *Texture_get_flags(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *Texture_get_flags_name(PYTexture *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFlagsName().get());
	}
	static PyObject *Texture_get_multisample(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Texture_get_width(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Texture_get_height(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Texture_get_depth(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepth());
	}
	static PyObject *Texture_get_faces(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFaces());
	}
	static PyObject *Texture_get_layers(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getLayers());
	}
	static PyObject *Texture_get_mipmaps(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
	}
	static PyObject *Texture_get_size(PYTexture *self, void *offset) {
		return pySize_new(self->ptr.getSize());
	}
	static PyObject *Texture_get_region(PYTexture *self, void *offset) {
		return pyRegion_new(self->ptr.getRegion());
	}
	static PyObject *Texture_get_slice(PYTexture *self, void *offset) {
		return pySlice_new(self->ptr.getSlice());
	}
	static PyObject *Texture_get_tile_width(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTileWidth());
	}
	static PyObject *Texture_get_tile_height(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTileHeight());
	}
	static PyObject *Texture_get_tile_depth(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTileDepth());
	}
	static PyObject *Texture_get_tile_mipmaps(PYTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTileMipmaps());
	}
	static PyObject *Texture_get_tile_size(PYTexture *self, void *offset) {
		return pySize_new(self->ptr.getTileSize());
	}
	static PyObject *Texture_get_description(PYTexture *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDescription().get());
	}
	static PyObject *Texture_get_memory(PYTexture *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyTexture_str(PYTexture *self) {
		return PyUnicode_FromString(String::format("Texture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTexture_bool(PYTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::TextureTable
	TS_PYAPI bool isPYTextureTable(PyObject *object) {
		return (object && Py_TYPE(object) == &PYTextureTable_Type);
	}
	TS_PYAPI TextureTable &pyTextureTable_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYTextureTable_Type) return ((PYTextureTable*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "TextureTable_get(): can't get TextureTable from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "TextureTable_get(): can't get TextureTable from None");
		static TextureTable ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTextureTable_new(const TextureTable &ptr) {
		PYTextureTable *ret = (PYTextureTable*)PyObject_New(PYTextureTable, &PYTextureTable_Type);
		new(&ret->ptr) TextureTable(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTextureTable_new(TextureTable &&ptr) {
		PYTextureTable *ret = (PYTextureTable*)PyObject_New(PYTextureTable, &PYTextureTable_Type);
		new(&ret->ptr) TextureTable(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTextureTable_init(PYTextureTable *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) TextureTable();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::TextureTable(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTextureTable_dealloc(PYTextureTable *self) {
		self->ptr.~TextureTable();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTextureTable_equalPtr(PYTextureTable *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTextureTable_clonePtr(PYTextureTable *self, PyObject *args) {
		return pyTextureTable_new(self->ptr.clonePtr());
	}
	static PyObject *pyTextureTable_clearPtr(PYTextureTable *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTextureTable_destroyPtr(PYTextureTable *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTextureTable_acquirePtr(PYTextureTable *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTextureTable_unacquirePtr(PYTextureTable *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTextureTable_isValidPtr(PYTextureTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTextureTable_isOwnerPtr(PYTextureTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTextureTable_isConstPtr(PYTextureTable *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTextureTable_getCountPtr(PYTextureTable *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTextureTable_getInternalPtr(PYTextureTable *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *TextureTable_getPlatform(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getPlatformName(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getIndex(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_clear(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_isCreated(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_setName(PYTextureTable *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getName(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_create(PYTextureTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t size = {};
		static const char *kwlist[] = { "type", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &type, &size)) {
			return PyLong_FromLong(self->ptr.create((Texture::Type)type, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::create(): unknown arguments:\n(Texture.Type type, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getType(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getType(): unknown arguments:\n(void) -> Texture::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getTypeName(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getTypeName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getSize(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_get(PYTextureTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTexture_new(self->ptr.get(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::get(): unknown arguments:\n(uint32_t index) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_isOwner(PYTextureTable *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isOwner(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::isOwner(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_getMemory(PYTextureTable *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TextureTable::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TextureTable_get_platform(PYTextureTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *TextureTable_get_platform_name(PYTextureTable *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *TextureTable_get_index(PYTextureTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *TextureTable_get_name(PYTextureTable *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *TextureTable_get_type(PYTextureTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *TextureTable_get_type_name(PYTextureTable *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTypeName());
	}
	static PyObject *TextureTable_get_size(PYTextureTable *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSize());
	}
	static PyObject *TextureTable_get_memory(PYTextureTable *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyTextureTable_str(PYTextureTable *self) {
		return PyUnicode_FromString(String::format("TextureTable Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTextureTable_bool(PYTextureTable *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Texture
	static void pyD3D12Texture_base(PYD3D12Texture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Texture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Texture_Type);
	}
	TS_PYAPI D3D12Texture &pyD3D12Texture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Texture_Type) return ((PYD3D12Texture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Texture_get(): can't get D3D12Texture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Texture_get(): can't get D3D12Texture from None");
		static D3D12Texture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Texture_new(const D3D12Texture &ptr) {
		PYD3D12Texture *ret = (PYD3D12Texture*)PyObject_New(PYD3D12Texture, &PYD3D12Texture_Type);
		new(&ret->ptr) D3D12Texture(ptr); pyD3D12Texture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Texture_new(D3D12Texture &&ptr) {
		PYD3D12Texture *ret = (PYD3D12Texture*)PyObject_New(PYD3D12Texture, &PYD3D12Texture_Type);
		new(&ret->ptr) D3D12Texture(move(ptr)); pyD3D12Texture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Texture_init(PYD3D12Texture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) D3D12Texture(((PYTexture*)object)->ptr);
				pyD3D12Texture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Texture();
			pyD3D12Texture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::D3D12Texture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Texture_dealloc(PYD3D12Texture *self) {
		self->ptr.~D3D12Texture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Texture_equalPtr(PYD3D12Texture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Texture_clonePtr(PYD3D12Texture *self, PyObject *args) {
		return pyD3D12Texture_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Texture_clearPtr(PYD3D12Texture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Texture_destroyPtr(PYD3D12Texture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Texture_acquirePtr(PYD3D12Texture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Texture_unacquirePtr(PYD3D12Texture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Texture_isValidPtr(PYD3D12Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Texture_isOwnerPtr(PYD3D12Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Texture_isConstPtr(PYD3D12Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Texture_getCountPtr(PYD3D12Texture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Texture_getInternalPtr(PYD3D12Texture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Texture_getTexture(PYD3D12Texture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *D3D12Texture_create(PYD3D12Texture *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		ID3D12Resource *texture = nullptr;
		uint32_t state = {};
		uint32_t flags = Texture::DefaultFlags;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "type", "texture", "state", "flags", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "InI|II", (char**)kwlist, &type, &texture, &state, &flags, &format)) {
			return PyLong_FromLong(self->ptr.create((Texture::Type)type, texture, state, (Texture::Flags)flags, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::create(): unknown arguments:\n(Texture.Type type, ID3D12Resource* texture, uint32_t state, Texture.Flags flags, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getDXGIFormat(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getD3D12Texture(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D12Texture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getD3D12Texture(): unknown arguments:\n(void) -> ID3D12Resource*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getShaderResourceView(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getShaderResourceView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getShaderResourceView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getRenderTargetView(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getRenderTargetView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getRenderTargetView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getDepthStencilView(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getDepthStencilView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getUnorderedAccessView(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getUnorderedAccessView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getUnorderedAccessView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_setTextureState(PYD3D12Texture *self, PyObject *args, PyObject *kwargs) {
		uint32_t state = {};
		static const char *kwlist[] = { "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &state)) {
			self->ptr.setTextureState(state);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::setTextureState(): unknown arguments:\n(uint32_t state) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getTextureState(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureState());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getTextureState(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getSharedHandle(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getSharedHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_getInteropHandle(PYD3D12Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Texture::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Texture_get_dxgi_format(PYD3D12Texture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDXGIFormat());
	}
	static PyObject *D3D12Texture_get_d3d12_texture(PYD3D12Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D12Texture());
	}
	static PyObject *D3D12Texture_get_shader_resource_view(PYD3D12Texture *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getShaderResourceView());
	}
	static PyObject *D3D12Texture_get_render_target_view(PYD3D12Texture *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getRenderTargetView());
	}
	static PyObject *D3D12Texture_get_depth_stencil_view(PYD3D12Texture *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getDepthStencilView());
	}
	static PyObject *D3D12Texture_get_unordered_access_view(PYD3D12Texture *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getUnorderedAccessView());
	}
	static PyObject *D3D12Texture_get_texture_state(PYD3D12Texture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureState());
	}
	static PyObject *D3D12Texture_get_shared_handle(PYD3D12Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedHandle());
	}
	static PyObject *D3D12Texture_get_interop_handle(PYD3D12Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyD3D12Texture_str(PYD3D12Texture *self) {
		return PyUnicode_FromString(String::format("D3D12Texture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Texture_bool(PYD3D12Texture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Texture
	static void pyD3D11Texture_base(PYD3D11Texture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Texture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Texture_Type);
	}
	TS_PYAPI D3D11Texture &pyD3D11Texture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Texture_Type) return ((PYD3D11Texture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Texture_get(): can't get D3D11Texture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Texture_get(): can't get D3D11Texture from None");
		static D3D11Texture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Texture_new(const D3D11Texture &ptr) {
		PYD3D11Texture *ret = (PYD3D11Texture*)PyObject_New(PYD3D11Texture, &PYD3D11Texture_Type);
		new(&ret->ptr) D3D11Texture(ptr); pyD3D11Texture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Texture_new(D3D11Texture &&ptr) {
		PYD3D11Texture *ret = (PYD3D11Texture*)PyObject_New(PYD3D11Texture, &PYD3D11Texture_Type);
		new(&ret->ptr) D3D11Texture(move(ptr)); pyD3D11Texture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Texture_init(PYD3D11Texture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) D3D11Texture(((PYTexture*)object)->ptr);
				pyD3D11Texture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Texture();
			pyD3D11Texture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::D3D11Texture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Texture_dealloc(PYD3D11Texture *self) {
		self->ptr.~D3D11Texture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Texture_equalPtr(PYD3D11Texture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Texture_clonePtr(PYD3D11Texture *self, PyObject *args) {
		return pyD3D11Texture_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Texture_clearPtr(PYD3D11Texture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Texture_destroyPtr(PYD3D11Texture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Texture_acquirePtr(PYD3D11Texture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Texture_unacquirePtr(PYD3D11Texture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Texture_isValidPtr(PYD3D11Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Texture_isOwnerPtr(PYD3D11Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Texture_isConstPtr(PYD3D11Texture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Texture_getCountPtr(PYD3D11Texture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Texture_getInternalPtr(PYD3D11Texture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Texture_getTexture(PYD3D11Texture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *D3D11Texture_create(PYD3D11Texture *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		ID3D11Texture2D *texture = nullptr;
		uint32_t flags = Texture::DefaultFlags;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "type", "texture", "flags", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|II", (char**)kwlist, &type, &texture, &flags, &format)) {
			return PyLong_FromLong(self->ptr.create((Texture::Type)type, texture, (Texture::Flags)flags, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::create(): unknown arguments:\n(Texture.Type type, ID3D11Texture2D* texture, Texture.Flags flags, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getDXGIFormat(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getD3D11Texture(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D11Texture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getD3D11Texture(): unknown arguments:\n(void) -> ID3D11Texture2D*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getShaderResourceView(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getShaderResourceView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getShaderResourceView(): unknown arguments:\n(void) -> ID3D11ShaderResourceView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getRenderTargetView(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTargetView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getRenderTargetView(): unknown arguments:\n(void) -> ID3D11RenderTargetView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getDepthStencilView(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getDepthStencilView(): unknown arguments:\n(void) -> ID3D11DepthStencilView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getUnorderedAccessView(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getUnorderedAccessView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getUnorderedAccessView(): unknown arguments:\n(void) -> ID3D11UnorderedAccessView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_getInteropHandle(PYD3D11Texture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Texture::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Texture_get_dxgi_format(PYD3D11Texture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDXGIFormat());
	}
	static PyObject *D3D11Texture_get_d3d11_texture(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D11Texture());
	}
	static PyObject *D3D11Texture_get_shader_resource_view(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getShaderResourceView());
	}
	static PyObject *D3D11Texture_get_render_target_view(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTargetView());
	}
	static PyObject *D3D11Texture_get_depth_stencil_view(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
	}
	static PyObject *D3D11Texture_get_unordered_access_view(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getUnorderedAccessView());
	}
	static PyObject *D3D11Texture_get_interop_handle(PYD3D11Texture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyD3D11Texture_str(PYD3D11Texture *self) {
		return PyUnicode_FromString(String::format("D3D11Texture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Texture_bool(PYD3D11Texture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLTexture
	static void pyMTLTexture_base(PYMTLTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYMTLTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLTexture_Type);
	}
	TS_PYAPI MTLTexture &pyMTLTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLTexture_Type) return ((PYMTLTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLTexture_get(): can't get MTLTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLTexture_get(): can't get MTLTexture from None");
		static MTLTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLTexture_new(const MTLTexture &ptr) {
		PYMTLTexture *ret = (PYMTLTexture*)PyObject_New(PYMTLTexture, &PYMTLTexture_Type);
		new(&ret->ptr) MTLTexture(ptr); pyMTLTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLTexture_new(MTLTexture &&ptr) {
		PYMTLTexture *ret = (PYMTLTexture*)PyObject_New(PYMTLTexture, &PYMTLTexture_Type);
		new(&ret->ptr) MTLTexture(move(ptr)); pyMTLTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLTexture_init(PYMTLTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) MTLTexture(((PYTexture*)object)->ptr);
				pyMTLTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLTexture();
			pyMTLTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::MTLTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLTexture_dealloc(PYMTLTexture *self) {
		self->ptr.~MTLTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLTexture_equalPtr(PYMTLTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLTexture_clonePtr(PYMTLTexture *self, PyObject *args) {
		return pyMTLTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLTexture_clearPtr(PYMTLTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTexture_destroyPtr(PYMTLTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTexture_acquirePtr(PYMTLTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTexture_unacquirePtr(PYMTLTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTexture_isValidPtr(PYMTLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLTexture_isOwnerPtr(PYMTLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLTexture_isConstPtr(PYMTLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLTexture_getCountPtr(PYMTLTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLTexture_getInternalPtr(PYMTLTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLTexture_getTexture(PYMTLTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *MTLTexture_create(PYMTLTexture *self, PyObject *args, PyObject *kwargs) {
		void *texture = nullptr;
		uint32_t flags = Texture::DefaultFlags;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "texture", "flags", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n|II", (char**)kwlist, &texture, &flags, &format)) {
			return PyLong_FromLong(self->ptr.create(texture, (Texture::Flags)flags, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::create(): unknown arguments:\n(void* texture, Texture.Flags flags, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_getPixelFormat(PYMTLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::getPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_getTextureType(PYMTLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::getTextureType(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_getMTLTexture(PYMTLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getMTLTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::getMTLTexture(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_getMTLBuffer(PYMTLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getMTLBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::getMTLBuffer(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_getSharedPtr(PYMTLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTexture::getSharedPtr(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTexture_get_pixel_format(PYMTLTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelFormat());
	}
	static PyObject *MTLTexture_get_texture_type(PYMTLTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureType());
	}
	static PyObject *MTLTexture_get_mtl_texture(PYMTLTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getMTLTexture());
	}
	static PyObject *MTLTexture_get_mtl_buffer(PYMTLTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getMTLBuffer());
	}
	static PyObject *MTLTexture_get_shared_ptr(PYMTLTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
	}
	static PyObject *pyMTLTexture_str(PYMTLTexture *self) {
		return PyUnicode_FromString(String::format("MTLTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLTexture_bool(PYMTLTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKTexture
	static void pyVKTexture_base(PYVKTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYVKTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKTexture_Type);
	}
	TS_PYAPI VKTexture &pyVKTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKTexture_Type) return ((PYVKTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKTexture_get(): can't get VKTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKTexture_get(): can't get VKTexture from None");
		static VKTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKTexture_new(const VKTexture &ptr) {
		PYVKTexture *ret = (PYVKTexture*)PyObject_New(PYVKTexture, &PYVKTexture_Type);
		new(&ret->ptr) VKTexture(ptr); pyVKTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKTexture_new(VKTexture &&ptr) {
		PYVKTexture *ret = (PYVKTexture*)PyObject_New(PYVKTexture, &PYVKTexture_Type);
		new(&ret->ptr) VKTexture(move(ptr)); pyVKTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKTexture_init(PYVKTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) VKTexture(((PYTexture*)object)->ptr);
				pyVKTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKTexture();
			pyVKTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::VKTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKTexture_dealloc(PYVKTexture *self) {
		self->ptr.~VKTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKTexture_equalPtr(PYVKTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKTexture_clonePtr(PYVKTexture *self, PyObject *args) {
		return pyVKTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKTexture_clearPtr(PYVKTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTexture_destroyPtr(PYVKTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTexture_acquirePtr(PYVKTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTexture_unacquirePtr(PYVKTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTexture_isValidPtr(PYVKTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKTexture_isOwnerPtr(PYVKTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKTexture_isConstPtr(PYVKTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKTexture_getCountPtr(PYVKTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKTexture_getInternalPtr(PYVKTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKTexture_getTexture(PYVKTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *VKTexture_create(PYVKTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = {};
		VkImage texture = {};
		uint32_t layout = {};
		uint32_t flags = Texture::DefaultFlags;
		uint32_t texture_format = FormatUnknown;
		static const char *kwlist[] = { "type", "format", "texture", "layout", "flags", "texture_format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IInI|II", (char**)kwlist, &type, &format, &texture, &layout, &flags, &texture_format)) {
			return PyLong_FromLong(self->ptr.create((Texture::Type)type, format, texture, layout, (Texture::Flags)flags, (Format)texture_format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::create(): unknown arguments:\n(Texture.Type type, uint32_t format, VkImage texture, uint32_t layout, Texture.Flags flags, Format texture_format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getPixelFormat(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getVKTexture(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVKTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getVKTexture(): unknown arguments:\n(void) -> VkImage\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getTextureView(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTextureView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getTextureView(): unknown arguments:\n(void) -> VkImageView\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_setTextureLayout(PYVKTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t layout = {};
		static const char *kwlist[] = { "layout", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &layout)) {
			self->ptr.setTextureLayout(layout);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::setTextureLayout(): unknown arguments:\n(uint32_t layout) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getTextureLayout(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureLayout());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getTextureLayout(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getTextureRange(PYVKTexture *self, PyObject *args, PyObject *kwargs) {
		void *range = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "range", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nO", (char**)kwlist, &range, &slice_)) {
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			self->ptr.getTextureRange(range, slice);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getTextureRange(): unknown arguments:\n(void* range, const Slice slice) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getSharedPtr(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getSharedPtr(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_getInteropHandle(PYVKTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTexture::getInteropHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTexture_get_pixel_format(PYVKTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPixelFormat());
	}
	static PyObject *VKTexture_get_vk_texture(PYVKTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVKTexture());
	}
	static PyObject *VKTexture_get_texture_view(PYVKTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTextureView());
	}
	static PyObject *VKTexture_get_texture_layout(PYVKTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureLayout());
	}
	static PyObject *VKTexture_get_shared_ptr(PYVKTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedPtr());
	}
	static PyObject *VKTexture_get_interop_handle(PYVKTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInteropHandle());
	}
	static PyObject *pyVKTexture_str(PYVKTexture *self) {
		return PyUnicode_FromString(String::format("VKTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKTexture_bool(PYVKTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLTexture
	static void pyGLTexture_base(PYGLTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYGLTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLTexture_Type);
	}
	TS_PYAPI GLTexture &pyGLTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLTexture_Type) return ((PYGLTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLTexture_get(): can't get GLTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLTexture_get(): can't get GLTexture from None");
		static GLTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLTexture_new(const GLTexture &ptr) {
		PYGLTexture *ret = (PYGLTexture*)PyObject_New(PYGLTexture, &PYGLTexture_Type);
		new(&ret->ptr) GLTexture(ptr); pyGLTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLTexture_new(GLTexture &&ptr) {
		PYGLTexture *ret = (PYGLTexture*)PyObject_New(PYGLTexture, &PYGLTexture_Type);
		new(&ret->ptr) GLTexture(move(ptr)); pyGLTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLTexture_init(PYGLTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) GLTexture(((PYTexture*)object)->ptr);
				pyGLTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLTexture();
			pyGLTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTexture::GLTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLTexture_dealloc(PYGLTexture *self) {
		self->ptr.~GLTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLTexture_equalPtr(PYGLTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLTexture_clonePtr(PYGLTexture *self, PyObject *args) {
		return pyGLTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLTexture_clearPtr(PYGLTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTexture_destroyPtr(PYGLTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTexture_acquirePtr(PYGLTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTexture_unacquirePtr(PYGLTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTexture_isValidPtr(PYGLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLTexture_isOwnerPtr(PYGLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLTexture_isConstPtr(PYGLTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLTexture_getCountPtr(PYGLTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLTexture_getInternalPtr(PYGLTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLTexture_getTexture(PYGLTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *GLTexture_create(PYGLTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t target = {};
		uint32_t texture_id = {};
		uint32_t flags = Texture::DefaultFlags;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "target", "texture_id", "flags", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|II", (char**)kwlist, &target, &texture_id, &flags, &format)) {
			return PyLong_FromLong(self->ptr.create(target, texture_id, (Texture::Flags)flags, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTexture::create(): unknown arguments:\n(uint32_t target, uint32_t texture_id, Texture.Flags flags, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLTexture_getTarget(PYGLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTexture::getTarget(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLTexture_getInternalFormat(PYGLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTexture::getInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLTexture_getTextureID(PYGLTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTexture::getTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLTexture_get_target(PYGLTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTarget());
	}
	static PyObject *GLTexture_get_internal_format(PYGLTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getInternalFormat());
	}
	static PyObject *GLTexture_get_texture_id(PYGLTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureID());
	}
	static PyObject *pyGLTexture_str(PYGLTexture *self) {
		return PyUnicode_FromString(String::format("GLTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLTexture_bool(PYGLTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESTexture
	static void pyGLESTexture_base(PYGLESTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYGLESTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESTexture_Type);
	}
	TS_PYAPI GLESTexture &pyGLESTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESTexture_Type) return ((PYGLESTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESTexture_get(): can't get GLESTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESTexture_get(): can't get GLESTexture from None");
		static GLESTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESTexture_new(const GLESTexture &ptr) {
		PYGLESTexture *ret = (PYGLESTexture*)PyObject_New(PYGLESTexture, &PYGLESTexture_Type);
		new(&ret->ptr) GLESTexture(ptr); pyGLESTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESTexture_new(GLESTexture &&ptr) {
		PYGLESTexture *ret = (PYGLESTexture*)PyObject_New(PYGLESTexture, &PYGLESTexture_Type);
		new(&ret->ptr) GLESTexture(move(ptr)); pyGLESTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESTexture_init(PYGLESTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) GLESTexture(((PYTexture*)object)->ptr);
				pyGLESTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESTexture();
			pyGLESTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTexture::GLESTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESTexture_dealloc(PYGLESTexture *self) {
		self->ptr.~GLESTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESTexture_equalPtr(PYGLESTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESTexture_clonePtr(PYGLESTexture *self, PyObject *args) {
		return pyGLESTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESTexture_clearPtr(PYGLESTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTexture_destroyPtr(PYGLESTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTexture_acquirePtr(PYGLESTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTexture_unacquirePtr(PYGLESTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTexture_isValidPtr(PYGLESTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESTexture_isOwnerPtr(PYGLESTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESTexture_isConstPtr(PYGLESTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESTexture_getCountPtr(PYGLESTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESTexture_getInternalPtr(PYGLESTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESTexture_getTexture(PYGLESTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *GLESTexture_create(PYGLESTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t target = {};
		uint32_t texture_id = {};
		uint32_t flags = Texture::DefaultFlags;
		uint32_t format = FormatUnknown;
		static const char *kwlist[] = { "target", "texture_id", "flags", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|II", (char**)kwlist, &target, &texture_id, &flags, &format)) {
			return PyLong_FromLong(self->ptr.create(target, texture_id, (Texture::Flags)flags, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTexture::create(): unknown arguments:\n(uint32_t target, uint32_t texture_id, Texture.Flags flags, Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESTexture_getTarget(PYGLESTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTexture::getTarget(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESTexture_getInternalFormat(PYGLESTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTexture::getInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESTexture_getTextureID(PYGLESTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTexture::getTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESTexture_get_target(PYGLESTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTarget());
	}
	static PyObject *GLESTexture_get_internal_format(PYGLESTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getInternalFormat());
	}
	static PyObject *GLESTexture_get_texture_id(PYGLESTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureID());
	}
	static PyObject *pyGLESTexture_str(PYGLESTexture *self) {
		return PyUnicode_FromString(String::format("GLESTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESTexture_bool(PYGLESTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CUTexture
	static void pyCUTexture_base(PYCUTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYCUTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCUTexture_Type);
	}
	TS_PYAPI CUTexture &pyCUTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCUTexture_Type) return ((PYCUTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CUTexture_get(): can't get CUTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CUTexture_get(): can't get CUTexture from None");
		static CUTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCUTexture_new(const CUTexture &ptr) {
		PYCUTexture *ret = (PYCUTexture*)PyObject_New(PYCUTexture, &PYCUTexture_Type);
		new(&ret->ptr) CUTexture(ptr); pyCUTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCUTexture_new(CUTexture &&ptr) {
		PYCUTexture *ret = (PYCUTexture*)PyObject_New(PYCUTexture, &PYCUTexture_Type);
		new(&ret->ptr) CUTexture(move(ptr)); pyCUTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCUTexture_init(PYCUTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) CUTexture(((PYTexture*)object)->ptr);
				pyCUTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CUTexture();
			pyCUTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUTexture::CUTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCUTexture_dealloc(PYCUTexture *self) {
		self->ptr.~CUTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCUTexture_equalPtr(PYCUTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCUTexture_clonePtr(PYCUTexture *self, PyObject *args) {
		return pyCUTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyCUTexture_clearPtr(PYCUTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUTexture_destroyPtr(PYCUTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUTexture_acquirePtr(PYCUTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUTexture_unacquirePtr(PYCUTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCUTexture_isValidPtr(PYCUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCUTexture_isOwnerPtr(PYCUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCUTexture_isConstPtr(PYCUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCUTexture_getCountPtr(PYCUTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCUTexture_getInternalPtr(PYCUTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCUTexture_getTexture(PYCUTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *CUTexture_getTextureLevel(PYCUTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr(self->ptr.getTextureLevel(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUTexture::getTextureLevel(): unknown arguments:\n(uint32_t index) -> CUarray\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUTexture_getArrayFormat(PYCUTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUTexture::getArrayFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUTexture_getArrayChannels(PYCUTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUTexture::getArrayChannels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUTexture_getSharedMemory(PYCUTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CUTexture::getSharedMemory(): unknown arguments:\n(void) -> CUexternalMemory\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CUTexture_get_array_format(PYCUTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayFormat());
	}
	static PyObject *CUTexture_get_array_channels(PYCUTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getArrayChannels());
	}
	static PyObject *CUTexture_get_shared_memory(PYCUTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSharedMemory());
	}
	static PyObject *pyCUTexture_str(PYCUTexture *self) {
		return PyUnicode_FromString(String::format("CUTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCUTexture_bool(PYCUTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::HIPTexture
	static void pyHIPTexture_base(PYHIPTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYHIPTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYHIPTexture_Type);
	}
	TS_PYAPI HIPTexture &pyHIPTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYHIPTexture_Type) return ((PYHIPTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "HIPTexture_get(): can't get HIPTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "HIPTexture_get(): can't get HIPTexture from None");
		static HIPTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyHIPTexture_new(const HIPTexture &ptr) {
		PYHIPTexture *ret = (PYHIPTexture*)PyObject_New(PYHIPTexture, &PYHIPTexture_Type);
		new(&ret->ptr) HIPTexture(ptr); pyHIPTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyHIPTexture_new(HIPTexture &&ptr) {
		PYHIPTexture *ret = (PYHIPTexture*)PyObject_New(PYHIPTexture, &PYHIPTexture_Type);
		new(&ret->ptr) HIPTexture(move(ptr)); pyHIPTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyHIPTexture_init(PYHIPTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) HIPTexture(((PYTexture*)object)->ptr);
				pyHIPTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) HIPTexture();
			pyHIPTexture_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPTexture::HIPTexture(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyHIPTexture_dealloc(PYHIPTexture *self) {
		self->ptr.~HIPTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyHIPTexture_equalPtr(PYHIPTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyHIPTexture_clonePtr(PYHIPTexture *self, PyObject *args) {
		return pyHIPTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyHIPTexture_clearPtr(PYHIPTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPTexture_destroyPtr(PYHIPTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPTexture_acquirePtr(PYHIPTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPTexture_unacquirePtr(PYHIPTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyHIPTexture_isValidPtr(PYHIPTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyHIPTexture_isOwnerPtr(PYHIPTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyHIPTexture_isConstPtr(PYHIPTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyHIPTexture_getCountPtr(PYHIPTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyHIPTexture_getInternalPtr(PYHIPTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyHIPTexture_getTexture(PYHIPTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *HIPTexture_getTextureArray(PYHIPTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTextureArray());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPTexture::getTextureArray(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPTexture_getTextureLevel(PYHIPTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr(self->ptr.getTextureLevel(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPTexture::getTextureLevel(): unknown arguments:\n(uint32_t index) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPTexture_getChannelFormat(PYHIPTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getChannelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "HIPTexture::getChannelFormat(): unknown arguments:\n(void) -> const void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *HIPTexture_get_texture_array(PYHIPTexture *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTextureArray());
	}
	static PyObject *HIPTexture_get_channel_format(PYHIPTexture *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getChannelFormat());
	}
	static PyObject *pyHIPTexture_str(PYHIPTexture *self) {
		return PyUnicode_FromString(String::format("HIPTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyHIPTexture_bool(PYHIPTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUTexture
	static void pyFUTexture_base(PYFUTexture *self) {
		new(&self->base.ptr) Texture(self->ptr);
	}
	TS_PYAPI bool isPYFUTexture(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUTexture_Type);
	}
	TS_PYAPI FUTexture &pyFUTexture_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUTexture_Type) return ((PYFUTexture*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUTexture_get(): can't get FUTexture from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUTexture_get(): can't get FUTexture from None");
		static FUTexture ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUTexture_new(const FUTexture &ptr) {
		PYFUTexture *ret = (PYFUTexture*)PyObject_New(PYFUTexture, &PYFUTexture_Type);
		new(&ret->ptr) FUTexture(ptr); pyFUTexture_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUTexture_new(FUTexture &&ptr) {
		PYFUTexture *ret = (PYFUTexture*)PyObject_New(PYFUTexture, &PYFUTexture_Type);
		new(&ret->ptr) FUTexture(move(ptr)); pyFUTexture_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUTexture_init(PYFUTexture *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTexture(object)) {
				new(&self->ptr) FUTexture(((PYTexture*)object)->ptr);
				pyFUTexture_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUTexture();
			pyFUTexture_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *textures_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "textures", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &textures_, &owner)) {
				if(!isPYArray(textures_)) break;
				Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
				for(PyObject *object : textures__) textures.append(pyTexture_get(object));
				new(&self->ptr) FUTexture(textures, (owner != 0));
				pyFUTexture_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTexture::FUTexture(): unknown arguments:\n(void)\n(Array<Texture> textures, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUTexture_dealloc(PYFUTexture *self) {
		self->ptr.~FUTexture();
		self->base.ptr.~Texture();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUTexture_equalPtr(PYFUTexture *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUTexture_clonePtr(PYFUTexture *self, PyObject *args) {
		return pyFUTexture_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUTexture_clearPtr(PYFUTexture *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTexture_destroyPtr(PYFUTexture *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTexture_acquirePtr(PYFUTexture *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTexture_unacquirePtr(PYFUTexture *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTexture_isValidPtr(PYFUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUTexture_isOwnerPtr(PYFUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUTexture_isConstPtr(PYFUTexture *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUTexture_getCountPtr(PYFUTexture *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUTexture_getInternalPtr(PYFUTexture *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUTexture_getTexture(PYFUTexture *self, PyObject *args) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *FUTexture_setMask(PYFUTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTexture::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTexture_getMask(PYFUTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTexture::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTexture_getNumTextures(PYFUTexture *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTexture::getNumTextures(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTexture_getTexture(PYFUTexture *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTexture_new(self->ptr.getTexture(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyTexture_new(self->ptr.getTexture(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTexture::getTexture(): unknown arguments:\n(uint32_t index) -> const Texture\n(uint32_t index) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTexture_get_mask(PYFUTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUTexture_get_num_textures(PYFUTexture *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
	}
	static PyObject *pyFUTexture_str(PYFUTexture *self) {
		return PyUnicode_FromString(String::format("FUTexture Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUTexture_bool(PYFUTexture *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Tracing
	TS_PYAPI bool isPYTracing(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYTracing_Type || type == &PYD3D12Tracing_Type || type == &PYMTLTracing_Type || type == &PYVKTracing_Type || type == &PYFUTracing_Type);
	}
	TS_PYAPI Tracing &pyTracing_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYTracing_Type || type == &PYD3D12Tracing_Type || type == &PYMTLTracing_Type || type == &PYVKTracing_Type || type == &PYFUTracing_Type) return ((PYTracing*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Tracing_get(): can't get Tracing from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Tracing_get(): can't get Tracing from None");
		static Tracing ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTracing_new(const Tracing &ptr) {
		PYTracing *ret = (PYTracing*)PyObject_New(PYTracing, &PYTracing_Type);
		new(&ret->ptr) Tracing(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTracing_new(Tracing &&ptr) {
		PYTracing *ret = (PYTracing*)PyObject_New(PYTracing, &PYTracing_Type);
		new(&ret->ptr) Tracing(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTracing_init(PYTracing *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Tracing();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::Tracing(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTracing_dealloc(PYTracing *self) {
		self->ptr.~Tracing();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTracing_equalPtr(PYTracing *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTracing_clonePtr(PYTracing *self, PyObject *args) {
		return pyTracing_new(self->ptr.clonePtr());
	}
	static PyObject *pyTracing_clearPtr(PYTracing *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTracing_destroyPtr(PYTracing *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTracing_acquirePtr(PYTracing *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTracing_unacquirePtr(PYTracing *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTracing_isValidPtr(PYTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTracing_isOwnerPtr(PYTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTracing_isConstPtr(PYTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTracing_getCountPtr(PYTracing *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTracing_getInternalPtr(PYTracing *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Tracing_getPlatform(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getPlatformName(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndex(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_clear(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isCreated(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isBuilt(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBuilt());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isBuilt(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setName(PYTracing *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getName(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_create(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t flags = Tracing::DefaultFlags;
		static const char *kwlist[] = { "type", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &type, &flags)) {
			return PyLong_FromLong(self->ptr.create((Tracing::Type)type, (Tracing::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::create(): unknown arguments:\n(Tracing.Type type, Tracing.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getType(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getType(): unknown arguments:\n(void) -> Tracing::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getTypeName(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Tracing::getTypeName((Tracing::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getTypeName(): unknown arguments:\n(Tracing.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isInstanceType(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isInstanceType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isInstanceType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isTriangleType(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTriangleType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isTriangleType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isBoundType(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBoundType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isBoundType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_isGeometryType(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGeometryType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::isGeometryType(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setParameters(PYTracing *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		static const char *kwlist[] = { "tracing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &tracing_)) {
			if(!isPYTracing(tracing_)) break;
			const Tracing &tracing = pyTracing_get(tracing_);
			self->ptr.setParameters(tracing);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setParameters(): unknown arguments:\n(const Tracing tracing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getNumGeometries(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getNumGeometries(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setInstanceBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_instances = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "num_instances", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &num_instances, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setInstanceBuffer(num_instances, buffer, offset);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			size_t offset = 0;
			static const char *kwlist[] = { "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &buffer_, &offset)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				self->ptr.setInstanceBuffer(buffer, offset);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setInstanceBuffer(): unknown arguments:\n(uint32_t num_instances, Buffer buffer, size_t offset) -> void\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setNumInstances(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_instances = {};
		static const char *kwlist[] = { "num_instances", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_instances)) {
			self->ptr.setNumInstances(num_instances);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setNumInstances(): unknown arguments:\n(uint32_t num_instances) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getNumInstances(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumInstances());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getNumInstances(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getInstanceBuffer(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getInstanceBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getInstanceBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getInstanceOffset(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getInstanceOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getInstanceOffset(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setIndirectBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|n", (char**)kwlist, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setIndirectBuffer(buffer, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setIndirectBuffer(): unknown arguments:\n(Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndirectBuffer(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getIndirectBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndirectBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndirectOffset(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getIndirectOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndirectOffset(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_addVertexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		uint32_t format = 0;
		size_t stride = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "num_vertices", "format", "stride", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIn|On", (char**)kwlist, &num_vertices, &format, &stride, &buffer_, &offset)) {
			Buffer buffer = pyBuffer_get(buffer_);
			return PyLong_FromUnsignedLong(self->ptr.addVertexBuffer(num_vertices, (Format)format, stride, buffer, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::addVertexBuffer(): unknown arguments:\n(uint32_t num_vertices, Format format, size_t stride, Buffer buffer, size_t offset) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setVertexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_vertices = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "index", "num_vertices", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|n", (char**)kwlist, &index, &num_vertices, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setVertexBuffer(index, num_vertices, buffer, offset);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffer_ = nullptr;
			size_t offset = 0;
			static const char *kwlist[] = { "index", "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &index, &buffer_, &offset)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				self->ptr.setVertexBuffer(index, buffer, offset);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setVertexBuffer(): unknown arguments:\n(uint32_t index, uint32_t num_vertices, Buffer buffer, size_t offset) -> void\n(uint32_t index, Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setNumVertices(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_vertices = {};
		static const char *kwlist[] = { "index", "num_vertices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num_vertices)) {
			self->ptr.setNumVertices(index, num_vertices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setNumVertices(): unknown arguments:\n(uint32_t index, uint32_t num_vertices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getNumVertices(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumVertices(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getNumVertices(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getVertexFormat(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexFormat(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getVertexFormat(): unknown arguments:\n(uint32_t index) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getVertexStride(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexStride(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getVertexStride(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getVertexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBuffer_new(self->ptr.getVertexBuffer(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getVertexBuffer(): unknown arguments:\n(uint32_t index) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getVertexOffset(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getVertexOffset(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getVertexOffset(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_addIndexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		uint32_t format = 0;
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "num_indices", "format", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|On", (char**)kwlist, &num_indices, &format, &buffer_, &offset)) {
			Buffer buffer = pyBuffer_get(buffer_);
			return PyLong_FromUnsignedLong(self->ptr.addIndexBuffer(num_indices, (Format)format, buffer, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::addIndexBuffer(): unknown arguments:\n(uint32_t num_indices, Format format, Buffer buffer, size_t offset) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setIndexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_indices = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "index", "num_indices", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|n", (char**)kwlist, &index, &num_indices, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setIndexBuffer(index, num_indices, buffer, offset);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffer_ = nullptr;
			size_t offset = 0;
			static const char *kwlist[] = { "index", "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &index, &buffer_, &offset)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				self->ptr.setIndexBuffer(index, buffer, offset);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setIndexBuffer(): unknown arguments:\n(uint32_t index, uint32_t num_indices, Buffer buffer, size_t offset) -> void\n(uint32_t index, Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setNumIndices(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_indices = {};
		static const char *kwlist[] = { "index", "num_indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num_indices)) {
			self->ptr.setNumIndices(index, num_indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setNumIndices(): unknown arguments:\n(uint32_t index, uint32_t num_indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getNumIndices(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumIndices(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getNumIndices(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndexFormat(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getIndexFormat(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndexFormat(): unknown arguments:\n(uint32_t index) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndexBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBuffer_new(self->ptr.getIndexBuffer(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndexBuffer(): unknown arguments:\n(uint32_t index) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getIndexOffset(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getIndexOffset(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getIndexOffset(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_addBoundBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_bounds = {};
		size_t stride = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "num_bounds", "stride", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|On", (char**)kwlist, &num_bounds, &stride, &buffer_, &offset)) {
			Buffer buffer = pyBuffer_get(buffer_);
			return PyLong_FromUnsignedLong(self->ptr.addBoundBuffer(num_bounds, stride, buffer, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::addBoundBuffer(): unknown arguments:\n(uint32_t num_bounds, size_t stride, Buffer buffer, size_t offset) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setBoundBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_bounds = {};
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "index", "num_bounds", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|n", (char**)kwlist, &index, &num_bounds, &buffer_, &offset)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setBoundBuffer(index, num_bounds, buffer, offset);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *buffer_ = nullptr;
			size_t offset = 0;
			static const char *kwlist[] = { "index", "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|n", (char**)kwlist, &index, &buffer_, &offset)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				self->ptr.setBoundBuffer(index, buffer, offset);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setBoundBuffer(): unknown arguments:\n(uint32_t index, uint32_t num_bounds, Buffer buffer, size_t offset) -> void\n(uint32_t index, Buffer buffer, size_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_setNumBounds(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num_bounds = {};
		static const char *kwlist[] = { "index", "num_bounds", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num_bounds)) {
			self->ptr.setNumBounds(index, num_bounds);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::setNumBounds(): unknown arguments:\n(uint32_t index, uint32_t num_bounds) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getNumBounds(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumBounds(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getNumBounds(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getBoundStride(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBoundStride(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getBoundStride(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getBoundBuffer(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyBuffer_new(self->ptr.getBoundBuffer(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getBoundBuffer(): unknown arguments:\n(uint32_t index) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getBoundOffset(PYTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getBoundOffset(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getBoundOffset(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getDescription(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDescription().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getDescription(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getTracingAddress(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(self->ptr.getTracingAddress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getTracingAddress(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getBuildSize(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getBuildSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getBuildSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getUpdateSize(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getUpdateSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getUpdateSize(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_getMemory(PYTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Tracing::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Tracing_get_platform(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Tracing_get_platform_name(PYTracing *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Tracing_get_index(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Tracing_get_name(PYTracing *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Tracing_get_type(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Tracing_get_num_geometries(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
	}
	static PyObject *Tracing_get_num_instances(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumInstances());
	}
	static PyObject *Tracing_get_instance_buffer(PYTracing *self, void *offset) {
		return pyBuffer_new(self->ptr.getInstanceBuffer());
	}
	static PyObject *Tracing_get_instance_offset(PYTracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getInstanceOffset());
	}
	static PyObject *Tracing_get_indirect_buffer(PYTracing *self, void *offset) {
		return pyBuffer_new(self->ptr.getIndirectBuffer());
	}
	static PyObject *Tracing_get_indirect_offset(PYTracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getIndirectOffset());
	}
	static PyObject *Tracing_get_description(PYTracing *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDescription().get());
	}
	static PyObject *Tracing_get_tracing_address(PYTracing *self, void *offset) {
		return PyLong_FromUnsignedLongLong(self->ptr.getTracingAddress());
	}
	static PyObject *Tracing_get_build_size(PYTracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getBuildSize());
	}
	static PyObject *Tracing_get_update_size(PYTracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getUpdateSize());
	}
	static PyObject *Tracing_get_memory(PYTracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyTracing_str(PYTracing *self) {
		return PyUnicode_FromString(String::format("Tracing Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTracing_bool(PYTracing *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Tracing::Instance
	TS_PYAPI bool isPYTracingInstance(PyObject *object) {
		return (object && Py_TYPE(object) == &PYTracingInstance_Type);
	}
	TS_PYAPI Tracing::Instance &pyTracingInstance_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYTracingInstance_Type) return ((PYTracingInstance*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "TracingInstance_get(): can't get TracingInstance from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "TracingInstance_get(): can't get TracingInstance from None");
		static Tracing::Instance ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTracingInstance_new(const Tracing::Instance &ptr) {
		PYTracingInstance *ret = (PYTracingInstance*)PyObject_New(PYTracingInstance, &PYTracingInstance_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyTracingInstance_buffer(PYTracingInstance *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Tracing::Instance);
			view->itemsize = sizeof(Tracing::Instance);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::Tracing::BuildIndirect
	TS_PYAPI bool isPYTracingBuildIndirect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYTracingBuildIndirect_Type);
	}
	TS_PYAPI Tracing::BuildIndirect &pyTracingBuildIndirect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYTracingBuildIndirect_Type) return ((PYTracingBuildIndirect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "TracingBuildIndirect_get(): can't get TracingBuildIndirect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "TracingBuildIndirect_get(): can't get TracingBuildIndirect from None");
		static Tracing::BuildIndirect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTracingBuildIndirect_new(const Tracing::BuildIndirect &ptr) {
		PYTracingBuildIndirect *ret = (PYTracingBuildIndirect*)PyObject_New(PYTracingBuildIndirect, &PYTracingBuildIndirect_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyTracingBuildIndirect_buffer(PYTracingBuildIndirect *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Tracing::BuildIndirect);
			view->itemsize = sizeof(Tracing::BuildIndirect);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::D3D12Tracing
	static void pyD3D12Tracing_base(PYD3D12Tracing *self) {
		new(&self->base.ptr) Tracing(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Tracing(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Tracing_Type);
	}
	TS_PYAPI D3D12Tracing &pyD3D12Tracing_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Tracing_Type) return ((PYD3D12Tracing*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Tracing_get(): can't get D3D12Tracing from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Tracing_get(): can't get D3D12Tracing from None");
		static D3D12Tracing ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Tracing_new(const D3D12Tracing &ptr) {
		PYD3D12Tracing *ret = (PYD3D12Tracing*)PyObject_New(PYD3D12Tracing, &PYD3D12Tracing_Type);
		new(&ret->ptr) D3D12Tracing(ptr); pyD3D12Tracing_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Tracing_new(D3D12Tracing &&ptr) {
		PYD3D12Tracing *ret = (PYD3D12Tracing*)PyObject_New(PYD3D12Tracing, &PYD3D12Tracing_Type);
		new(&ret->ptr) D3D12Tracing(move(ptr)); pyD3D12Tracing_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Tracing_init(PYD3D12Tracing *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTracing(object)) {
				new(&self->ptr) D3D12Tracing(((PYTracing*)object)->ptr);
				pyD3D12Tracing_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Tracing();
			pyD3D12Tracing_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::D3D12Tracing(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Tracing_dealloc(PYD3D12Tracing *self) {
		self->ptr.~D3D12Tracing();
		self->base.ptr.~Tracing();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Tracing_equalPtr(PYD3D12Tracing *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Tracing_clonePtr(PYD3D12Tracing *self, PyObject *args) {
		return pyD3D12Tracing_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Tracing_clearPtr(PYD3D12Tracing *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Tracing_destroyPtr(PYD3D12Tracing *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Tracing_acquirePtr(PYD3D12Tracing *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Tracing_unacquirePtr(PYD3D12Tracing *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Tracing_isValidPtr(PYD3D12Tracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Tracing_isOwnerPtr(PYD3D12Tracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Tracing_isConstPtr(PYD3D12Tracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Tracing_getCountPtr(PYD3D12Tracing *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Tracing_getInternalPtr(PYD3D12Tracing *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Tracing_getTracing(PYD3D12Tracing *self, PyObject *args) {
		return pyTracing_new(self->ptr.getTracing());
	}
	static PyObject *D3D12Tracing_getGeometryDesc(PYD3D12Tracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr(self->ptr.getGeometryDesc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getGeometryDesc(): unknown arguments:\n(uint32_t index) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_getBuildInputs(PYD3D12Tracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBuildInputs());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getBuildInputs(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_getPrebuildInfo(PYD3D12Tracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPrebuildInfo());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getPrebuildInfo(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_getBuildDesc(PYD3D12Tracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBuildDesc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getBuildDesc(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_getTracingBuffer(PYD3D12Tracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getTracingBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getTracingBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_getShaderResourceView(PYD3D12Tracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getShaderResourceView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Tracing::getShaderResourceView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Tracing_get_build_inputs(PYD3D12Tracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBuildInputs());
	}
	static PyObject *D3D12Tracing_get_prebuild_info(PYD3D12Tracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getPrebuildInfo());
	}
	static PyObject *D3D12Tracing_get_build_desc(PYD3D12Tracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBuildDesc());
	}
	static PyObject *D3D12Tracing_get_tracing_buffer(PYD3D12Tracing *self, void *offset) {
		return pyBuffer_new(self->ptr.getTracingBuffer());
	}
	static PyObject *D3D12Tracing_get_shader_resource_view(PYD3D12Tracing *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getShaderResourceView());
	}
	static PyObject *pyD3D12Tracing_str(PYD3D12Tracing *self) {
		return PyUnicode_FromString(String::format("D3D12Tracing Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Tracing_bool(PYD3D12Tracing *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLTracing
	static void pyMTLTracing_base(PYMTLTracing *self) {
		new(&self->base.ptr) Tracing(self->ptr);
	}
	TS_PYAPI bool isPYMTLTracing(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLTracing_Type);
	}
	TS_PYAPI MTLTracing &pyMTLTracing_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLTracing_Type) return ((PYMTLTracing*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLTracing_get(): can't get MTLTracing from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLTracing_get(): can't get MTLTracing from None");
		static MTLTracing ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLTracing_new(const MTLTracing &ptr) {
		PYMTLTracing *ret = (PYMTLTracing*)PyObject_New(PYMTLTracing, &PYMTLTracing_Type);
		new(&ret->ptr) MTLTracing(ptr); pyMTLTracing_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLTracing_new(MTLTracing &&ptr) {
		PYMTLTracing *ret = (PYMTLTracing*)PyObject_New(PYMTLTracing, &PYMTLTracing_Type);
		new(&ret->ptr) MTLTracing(move(ptr)); pyMTLTracing_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLTracing_init(PYMTLTracing *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTracing(object)) {
				new(&self->ptr) MTLTracing(((PYTracing*)object)->ptr);
				pyMTLTracing_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLTracing();
			pyMTLTracing_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTracing::MTLTracing(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLTracing_dealloc(PYMTLTracing *self) {
		self->ptr.~MTLTracing();
		self->base.ptr.~Tracing();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLTracing_equalPtr(PYMTLTracing *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLTracing_clonePtr(PYMTLTracing *self, PyObject *args) {
		return pyMTLTracing_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLTracing_clearPtr(PYMTLTracing *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTracing_destroyPtr(PYMTLTracing *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTracing_acquirePtr(PYMTLTracing *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTracing_unacquirePtr(PYMTLTracing *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTracing_isValidPtr(PYMTLTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLTracing_isOwnerPtr(PYMTLTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLTracing_isConstPtr(PYMTLTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLTracing_getCountPtr(PYMTLTracing *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLTracing_getInternalPtr(PYMTLTracing *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLTracing_getTracing(PYMTLTracing *self, PyObject *args) {
		return pyTracing_new(self->ptr.getTracing());
	}
	static PyObject *MTLTracing_getGeometryDesc(PYMTLTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromVoidPtr(self->ptr.getGeometryDesc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTracing::getGeometryDesc(): unknown arguments:\n(uint32_t index) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTracing_getPrimitiveDesc(PYMTLTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPrimitiveDesc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTracing::getPrimitiveDesc(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTracing_getInstanceDesc(PYMTLTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInstanceDesc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTracing::getInstanceDesc(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTracing_getAccelerationStructure(PYMTLTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAccelerationStructure());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTracing::getAccelerationStructure(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTracing_get_primitive_desc(PYMTLTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getPrimitiveDesc());
	}
	static PyObject *MTLTracing_get_instance_desc(PYMTLTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInstanceDesc());
	}
	static PyObject *MTLTracing_get_acceleration_structure(PYMTLTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAccelerationStructure());
	}
	static PyObject *pyMTLTracing_str(PYMTLTracing *self) {
		return PyUnicode_FromString(String::format("MTLTracing Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLTracing_bool(PYMTLTracing *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKTracing
	static void pyVKTracing_base(PYVKTracing *self) {
		new(&self->base.ptr) Tracing(self->ptr);
	}
	TS_PYAPI bool isPYVKTracing(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKTracing_Type);
	}
	TS_PYAPI VKTracing &pyVKTracing_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKTracing_Type) return ((PYVKTracing*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKTracing_get(): can't get VKTracing from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKTracing_get(): can't get VKTracing from None");
		static VKTracing ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKTracing_new(const VKTracing &ptr) {
		PYVKTracing *ret = (PYVKTracing*)PyObject_New(PYVKTracing, &PYVKTracing_Type);
		new(&ret->ptr) VKTracing(ptr); pyVKTracing_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKTracing_new(VKTracing &&ptr) {
		PYVKTracing *ret = (PYVKTracing*)PyObject_New(PYVKTracing, &PYVKTracing_Type);
		new(&ret->ptr) VKTracing(move(ptr)); pyVKTracing_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKTracing_init(PYVKTracing *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTracing(object)) {
				new(&self->ptr) VKTracing(((PYTracing*)object)->ptr);
				pyVKTracing_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKTracing();
			pyVKTracing_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTracing::VKTracing(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKTracing_dealloc(PYVKTracing *self) {
		self->ptr.~VKTracing();
		self->base.ptr.~Tracing();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKTracing_equalPtr(PYVKTracing *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKTracing_clonePtr(PYVKTracing *self, PyObject *args) {
		return pyVKTracing_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKTracing_clearPtr(PYVKTracing *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTracing_destroyPtr(PYVKTracing *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTracing_acquirePtr(PYVKTracing *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTracing_unacquirePtr(PYVKTracing *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTracing_isValidPtr(PYVKTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKTracing_isOwnerPtr(PYVKTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKTracing_isConstPtr(PYVKTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKTracing_getCountPtr(PYVKTracing *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKTracing_getInternalPtr(PYVKTracing *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKTracing_getTracing(PYVKTracing *self, PyObject *args) {
		return pyTracing_new(self->ptr.getTracing());
	}
	static PyObject *VKTracing_getBuildGeometryInfo(PYVKTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBuildGeometryInfo());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTracing::getBuildGeometryInfo(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTracing_getBuildSizeInfo(PYVKTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBuildSizeInfo());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTracing::getBuildSizeInfo(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTracing_getTracingBuffer(PYVKTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getTracingBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTracing::getTracingBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTracing_getAccelerationStructure(PYVKTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAccelerationStructure());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTracing::getAccelerationStructure(): unknown arguments:\n(void) -> VkAccelerationStructureKHR\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTracing_get_build_geometry_info(PYVKTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBuildGeometryInfo());
	}
	static PyObject *VKTracing_get_build_size_info(PYVKTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBuildSizeInfo());
	}
	static PyObject *VKTracing_get_tracing_buffer(PYVKTracing *self, void *offset) {
		return pyBuffer_new(self->ptr.getTracingBuffer());
	}
	static PyObject *VKTracing_get_acceleration_structure(PYVKTracing *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAccelerationStructure());
	}
	static PyObject *pyVKTracing_str(PYVKTracing *self) {
		return PyUnicode_FromString(String::format("VKTracing Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKTracing_bool(PYVKTracing *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUTracing
	static void pyFUTracing_base(PYFUTracing *self) {
		new(&self->base.ptr) Tracing(self->ptr);
	}
	TS_PYAPI bool isPYFUTracing(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUTracing_Type);
	}
	TS_PYAPI FUTracing &pyFUTracing_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUTracing_Type) return ((PYFUTracing*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUTracing_get(): can't get FUTracing from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUTracing_get(): can't get FUTracing from None");
		static FUTracing ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUTracing_new(const FUTracing &ptr) {
		PYFUTracing *ret = (PYFUTracing*)PyObject_New(PYFUTracing, &PYFUTracing_Type);
		new(&ret->ptr) FUTracing(ptr); pyFUTracing_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUTracing_new(FUTracing &&ptr) {
		PYFUTracing *ret = (PYFUTracing*)PyObject_New(PYFUTracing, &PYFUTracing_Type);
		new(&ret->ptr) FUTracing(move(ptr)); pyFUTracing_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUTracing_init(PYFUTracing *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTracing(object)) {
				new(&self->ptr) FUTracing(((PYTracing*)object)->ptr);
				pyFUTracing_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUTracing();
			pyFUTracing_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *tracings_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "tracings", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &tracings_, &owner)) {
				if(!isPYArray(tracings_)) break;
				Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
				for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
				new(&self->ptr) FUTracing(tracings, (owner != 0));
				pyFUTracing_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTracing::FUTracing(): unknown arguments:\n(void)\n(Array<Tracing> tracings, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUTracing_dealloc(PYFUTracing *self) {
		self->ptr.~FUTracing();
		self->base.ptr.~Tracing();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUTracing_equalPtr(PYFUTracing *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUTracing_clonePtr(PYFUTracing *self, PyObject *args) {
		return pyFUTracing_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUTracing_clearPtr(PYFUTracing *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTracing_destroyPtr(PYFUTracing *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTracing_acquirePtr(PYFUTracing *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTracing_unacquirePtr(PYFUTracing *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTracing_isValidPtr(PYFUTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUTracing_isOwnerPtr(PYFUTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUTracing_isConstPtr(PYFUTracing *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUTracing_getCountPtr(PYFUTracing *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUTracing_getInternalPtr(PYFUTracing *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUTracing_getTracing(PYFUTracing *self, PyObject *args) {
		return pyTracing_new(self->ptr.getTracing());
	}
	static PyObject *FUTracing_setMask(PYFUTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTracing::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTracing_getMask(PYFUTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTracing::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTracing_getNumTracings(PYFUTracing *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTracing::getNumTracings(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTracing_getTracing(PYFUTracing *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTracing_new(self->ptr.getTracing(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyTracing_new(self->ptr.getTracing(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTracing::getTracing(): unknown arguments:\n(uint32_t index) -> const Tracing\n(uint32_t index) -> Tracing\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTracing_get_mask(PYFUTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUTracing_get_num_tracings(PYFUTracing *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
	}
	static PyObject *pyFUTracing_str(PYFUTracing *self) {
		return PyUnicode_FromString(String::format("FUTracing Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUTracing_bool(PYFUTracing *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Target
	TS_PYAPI bool isPYTarget(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYTarget_Type || type == &PYD3D12Target_Type || type == &PYD3D11Target_Type || type == &PYMTLTarget_Type || type == &PYVKTarget_Type || type == &PYGLTarget_Type || type == &PYGLESTarget_Type || type == &PYFUTarget_Type);
	}
	TS_PYAPI Target &pyTarget_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYTarget_Type || type == &PYD3D12Target_Type || type == &PYD3D11Target_Type || type == &PYMTLTarget_Type || type == &PYVKTarget_Type || type == &PYGLTarget_Type || type == &PYGLESTarget_Type || type == &PYFUTarget_Type) return ((PYTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Target_get(): can't get Target from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Target_get(): can't get Target from None");
		static Target ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTarget_new(const Target &ptr) {
		PYTarget *ret = (PYTarget*)PyObject_New(PYTarget, &PYTarget_Type);
		new(&ret->ptr) Target(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTarget_new(Target &&ptr) {
		PYTarget *ret = (PYTarget*)PyObject_New(PYTarget, &PYTarget_Type);
		new(&ret->ptr) Target(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTarget_init(PYTarget *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Target();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::Target(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTarget_dealloc(PYTarget *self) {
		self->ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTarget_equalPtr(PYTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTarget_clonePtr(PYTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyTarget_clearPtr(PYTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTarget_destroyPtr(PYTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTarget_acquirePtr(PYTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTarget_unacquirePtr(PYTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTarget_isValidPtr(PYTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTarget_isOwnerPtr(PYTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTarget_isConstPtr(PYTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTarget_getCountPtr(PYTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTarget_getInternalPtr(PYTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Target_getPlatform(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getPlatformName(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getIndex(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_begin(PYTarget *self, PyObject *args, PyObject *kwargs) {
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &fence_)) {
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			return PyLong_FromLong(self->ptr.begin(fence));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.begin());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::begin(): unknown arguments:\n(Fence fence) -> bool\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_end(PYTarget *self, PyObject *args, PyObject *kwargs) {
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &fence_)) {
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			self->ptr.end(fence);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.end();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::end(): unknown arguments:\n(Fence fence) -> void\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_swap(PYTarget *self, PyObject *args, PyObject *kwargs) {
		PyObject *surface_ = nullptr;
		static const char *kwlist[] = { "surface", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
			if(!isPYSurface(surface_)) break;
			Surface &surface = pySurface_get(surface_);
			self->ptr.swap(surface);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::swap(): unknown arguments:\n(Surface surface) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_isEnabled(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::isEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorFormat(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = 0;
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getColorFormat(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorFormat(): unknown arguments:\n(uint32_t index) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthFormat(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getMultisample(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_hasMultisample(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::hasMultisample(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_isFlipped(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFlipped());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::isFlipped(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_isAtomic(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAtomic());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::isAtomic(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getWidth(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getHeight(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepth(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getFaces(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getFaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getLayers(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getLayers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getMipmaps(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getMipmaps(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setClearColor(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "index", "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iffff", (char**)kwlist, &index, &r, &g, &b, &a)) {
			self->ptr.setClearColor(index, r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float32_t r = {};
			float32_t g = {};
			float32_t b = {};
			float32_t a = {};
			static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
				self->ptr.setClearColor(r, g, b, a);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "index", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setClearColor(index, color);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setClearColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setClearColor(): unknown arguments:\n(uint32_t index, float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(uint32_t index, const Color color) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setColorTexture(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		uint32_t op = Target::OpDefault;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "index", "texture", "op", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|IO", (char**)kwlist, &index, &texture_, &op, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setColorTexture(index, texture, (Target::Operation)op, slice);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			uint32_t op = Target::OpDefault;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "texture", "op", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &texture_, &op, &slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				const Slice &slice = pySlice_get(slice_);
				self->ptr.setColorTexture(texture, (Target::Operation)op, slice);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setColorTexture(): unknown arguments:\n(uint32_t index, Texture texture, Target.Operation op, const Slice slice) -> void\n(Texture texture, Target.Operation op, const Slice slice) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setColorResolve(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "index", "texture", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|O", (char**)kwlist, &index, &texture_, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setColorResolve(index, texture, slice);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "texture", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &texture_, &slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				const Slice &slice = pySlice_get(slice_);
				self->ptr.setColorResolve(texture, slice);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setColorResolve(): unknown arguments:\n(uint32_t index, Texture texture, const Slice slice) -> void\n(Texture texture, const Slice slice) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getNumTargets(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getNumTargets(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getClearColor(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = 0;
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
			return pyColor_new(self->ptr.getClearColor(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getClearColor(): unknown arguments:\n(uint32_t index) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorOp(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = 0;
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getColorOp(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorOp(): unknown arguments:\n(uint32_t index) -> Target::Operation\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorTexture(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTexture_new(self->ptr.getColorTexture(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorTexture(): unknown arguments:\n(uint32_t index) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorResolve(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTexture_new(self->ptr.getColorResolve(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorResolve(): unknown arguments:\n(uint32_t index) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorTextureSlice(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pySlice_new(self->ptr.getColorTextureSlice(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorTextureSlice(): unknown arguments:\n(uint32_t index) -> const Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getColorResolveSlice(PYTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pySlice_new(self->ptr.getColorResolveSlice(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getColorResolveSlice(): unknown arguments:\n(uint32_t index) -> const Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setClearDepth(PYTarget *self, PyObject *args, PyObject *kwargs) {
		float32_t depth = {};
		uint32_t stencil = 0;
		static const char *kwlist[] = { "depth", "stencil", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f|I", (char**)kwlist, &depth, &stencil)) {
			self->ptr.setClearDepth(depth, stencil);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setClearDepth(): unknown arguments:\n(float32_t depth, uint32_t stencil) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setDepthTexture(PYTarget *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		uint32_t op = Target::OpDefault;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "texture", "op", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &texture_, &op, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setDepthTexture(texture, (Target::Operation)op, slice);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setDepthTexture(): unknown arguments:\n(Texture texture, Target.Operation op, const Slice slice) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_setDepthResolve(PYTarget *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "texture", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &texture_, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			const Slice &slice = pySlice_get(slice_);
			self->ptr.setDepthResolve(texture, slice);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::setDepthResolve(): unknown arguments:\n(Texture texture, const Slice slice) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getClearDepth(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getClearDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getClearDepth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getClearStencil(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getClearStencil());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getClearStencil(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthOp(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthOp(): unknown arguments:\n(void) -> Target::Operation\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthTexture(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.getDepthTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthTexture(): unknown arguments:\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthResolve(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.getDepthResolve());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthResolve(): unknown arguments:\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthTextureSlice(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySlice_new(self->ptr.getDepthTextureSlice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthTextureSlice(): unknown arguments:\n(void) -> const Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_getDepthResolveSlice(PYTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySlice_new(self->ptr.getDepthResolveSlice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Target::getDepthResolveSlice(): unknown arguments:\n(void) -> const Slice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Target_get_platform(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Target_get_platform_name(PYTarget *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Target_get_index(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Target_get_color_format(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
	}
	static PyObject *Target_get_depth_format(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
	}
	static PyObject *Target_get_multisample(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Target_get_width(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Target_get_height(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Target_get_depth(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepth());
	}
	static PyObject *Target_get_faces(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFaces());
	}
	static PyObject *Target_get_layers(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getLayers());
	}
	static PyObject *Target_get_mipmaps(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMipmaps());
	}
	static PyObject *Target_get_num_targets(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
	}
	static PyObject *Target_get_clear_color(PYTarget *self, void *offset) {
		return pyColor_new(self->ptr.getClearColor());
	}
	static PyObject *Target_get_color_op(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorOp());
	}
	static PyObject *Target_get_clear_depth(PYTarget *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getClearDepth());
	}
	static PyObject *Target_get_clear_stencil(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getClearStencil());
	}
	static PyObject *Target_get_depth_op(PYTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthOp());
	}
	static PyObject *Target_get_depth_texture(PYTarget *self, void *offset) {
		return pyTexture_new(self->ptr.getDepthTexture());
	}
	static PyObject *Target_get_depth_resolve(PYTarget *self, void *offset) {
		return pyTexture_new(self->ptr.getDepthResolve());
	}
	static PyObject *Target_get_depth_texture_slice(PYTarget *self, void *offset) {
		return pySlice_new(self->ptr.getDepthTextureSlice());
	}
	static PyObject *Target_get_depth_resolve_slice(PYTarget *self, void *offset) {
		return pySlice_new(self->ptr.getDepthResolveSlice());
	}
	static PyObject *pyTarget_str(PYTarget *self) {
		return PyUnicode_FromString(String::format("Target Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTarget_bool(PYTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Target
	static void pyD3D12Target_base(PYD3D12Target *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Target(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Target_Type);
	}
	TS_PYAPI D3D12Target &pyD3D12Target_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Target_Type) return ((PYD3D12Target*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Target_get(): can't get D3D12Target from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Target_get(): can't get D3D12Target from None");
		static D3D12Target ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Target_new(const D3D12Target &ptr) {
		PYD3D12Target *ret = (PYD3D12Target*)PyObject_New(PYD3D12Target, &PYD3D12Target_Type);
		new(&ret->ptr) D3D12Target(ptr); pyD3D12Target_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Target_new(D3D12Target &&ptr) {
		PYD3D12Target *ret = (PYD3D12Target*)PyObject_New(PYD3D12Target, &PYD3D12Target_Type);
		new(&ret->ptr) D3D12Target(move(ptr)); pyD3D12Target_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Target_init(PYD3D12Target *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) D3D12Target(((PYTarget*)object)->ptr);
				pyD3D12Target_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Target();
			pyD3D12Target_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Target::D3D12Target(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Target_dealloc(PYD3D12Target *self) {
		self->ptr.~D3D12Target();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Target_equalPtr(PYD3D12Target *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Target_clonePtr(PYD3D12Target *self, PyObject *args) {
		return pyD3D12Target_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Target_clearPtr(PYD3D12Target *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Target_destroyPtr(PYD3D12Target *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Target_acquirePtr(PYD3D12Target *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Target_unacquirePtr(PYD3D12Target *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Target_isValidPtr(PYD3D12Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Target_isOwnerPtr(PYD3D12Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Target_isConstPtr(PYD3D12Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Target_getCountPtr(PYD3D12Target *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Target_getInternalPtr(PYD3D12Target *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Target_getTarget(PYD3D12Target *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *D3D12Target_getRenderTargetViews(PYD3D12Target *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTargetViews());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Target::getRenderTargetViews(): unknown arguments:\n(void) -> size_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Target_getDepthStencilView(PYD3D12Target *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Target::getDepthStencilView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Target_get_render_target_views(PYD3D12Target *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTargetViews());
	}
	static PyObject *D3D12Target_get_depth_stencil_view(PYD3D12Target *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getDepthStencilView());
	}
	static PyObject *pyD3D12Target_str(PYD3D12Target *self) {
		return PyUnicode_FromString(String::format("D3D12Target Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Target_bool(PYD3D12Target *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Target
	static void pyD3D11Target_base(PYD3D11Target *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Target(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Target_Type);
	}
	TS_PYAPI D3D11Target &pyD3D11Target_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Target_Type) return ((PYD3D11Target*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Target_get(): can't get D3D11Target from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Target_get(): can't get D3D11Target from None");
		static D3D11Target ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Target_new(const D3D11Target &ptr) {
		PYD3D11Target *ret = (PYD3D11Target*)PyObject_New(PYD3D11Target, &PYD3D11Target_Type);
		new(&ret->ptr) D3D11Target(ptr); pyD3D11Target_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Target_new(D3D11Target &&ptr) {
		PYD3D11Target *ret = (PYD3D11Target*)PyObject_New(PYD3D11Target, &PYD3D11Target_Type);
		new(&ret->ptr) D3D11Target(move(ptr)); pyD3D11Target_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Target_init(PYD3D11Target *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) D3D11Target(((PYTarget*)object)->ptr);
				pyD3D11Target_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Target();
			pyD3D11Target_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Target::D3D11Target(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Target_dealloc(PYD3D11Target *self) {
		self->ptr.~D3D11Target();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Target_equalPtr(PYD3D11Target *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Target_clonePtr(PYD3D11Target *self, PyObject *args) {
		return pyD3D11Target_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Target_clearPtr(PYD3D11Target *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Target_destroyPtr(PYD3D11Target *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Target_acquirePtr(PYD3D11Target *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Target_unacquirePtr(PYD3D11Target *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Target_isValidPtr(PYD3D11Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Target_isOwnerPtr(PYD3D11Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Target_isConstPtr(PYD3D11Target *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Target_getCountPtr(PYD3D11Target *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Target_getInternalPtr(PYD3D11Target *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Target_getTarget(PYD3D11Target *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *D3D11Target_getRenderTargetViews(PYD3D11Target *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTargetViews());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Target::getRenderTargetViews(): unknown arguments:\n(void) -> ID3D11RenderTargetView**\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Target_getDepthStencilView(PYD3D11Target *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Target::getDepthStencilView(): unknown arguments:\n(void) -> ID3D11DepthStencilView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Target_get_render_target_views(PYD3D11Target *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTargetViews());
	}
	static PyObject *D3D11Target_get_depth_stencil_view(PYD3D11Target *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
	}
	static PyObject *pyD3D11Target_str(PYD3D11Target *self) {
		return PyUnicode_FromString(String::format("D3D11Target Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Target_bool(PYD3D11Target *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLTarget
	static void pyMTLTarget_base(PYMTLTarget *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYMTLTarget(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLTarget_Type);
	}
	TS_PYAPI MTLTarget &pyMTLTarget_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLTarget_Type) return ((PYMTLTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLTarget_get(): can't get MTLTarget from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLTarget_get(): can't get MTLTarget from None");
		static MTLTarget ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLTarget_new(const MTLTarget &ptr) {
		PYMTLTarget *ret = (PYMTLTarget*)PyObject_New(PYMTLTarget, &PYMTLTarget_Type);
		new(&ret->ptr) MTLTarget(ptr); pyMTLTarget_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLTarget_new(MTLTarget &&ptr) {
		PYMTLTarget *ret = (PYMTLTarget*)PyObject_New(PYMTLTarget, &PYMTLTarget_Type);
		new(&ret->ptr) MTLTarget(move(ptr)); pyMTLTarget_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLTarget_init(PYMTLTarget *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) MTLTarget(((PYTarget*)object)->ptr);
				pyMTLTarget_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLTarget();
			pyMTLTarget_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTarget::MTLTarget(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLTarget_dealloc(PYMTLTarget *self) {
		self->ptr.~MTLTarget();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLTarget_equalPtr(PYMTLTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLTarget_clonePtr(PYMTLTarget *self, PyObject *args) {
		return pyMTLTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLTarget_clearPtr(PYMTLTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTarget_destroyPtr(PYMTLTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTarget_acquirePtr(PYMTLTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTarget_unacquirePtr(PYMTLTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLTarget_isValidPtr(PYMTLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLTarget_isOwnerPtr(PYMTLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLTarget_isConstPtr(PYMTLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLTarget_getCountPtr(PYMTLTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLTarget_getInternalPtr(PYMTLTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLTarget_getTarget(PYMTLTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *MTLTarget_getDescriptor(PYMTLTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLTarget::getDescriptor(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLTarget_get_descriptor(PYMTLTarget *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDescriptor());
	}
	static PyObject *pyMTLTarget_str(PYMTLTarget *self) {
		return PyUnicode_FromString(String::format("MTLTarget Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLTarget_bool(PYMTLTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKTarget
	static void pyVKTarget_base(PYVKTarget *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYVKTarget(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKTarget_Type);
	}
	TS_PYAPI VKTarget &pyVKTarget_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKTarget_Type) return ((PYVKTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKTarget_get(): can't get VKTarget from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKTarget_get(): can't get VKTarget from None");
		static VKTarget ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKTarget_new(const VKTarget &ptr) {
		PYVKTarget *ret = (PYVKTarget*)PyObject_New(PYVKTarget, &PYVKTarget_Type);
		new(&ret->ptr) VKTarget(ptr); pyVKTarget_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKTarget_new(VKTarget &&ptr) {
		PYVKTarget *ret = (PYVKTarget*)PyObject_New(PYVKTarget, &PYVKTarget_Type);
		new(&ret->ptr) VKTarget(move(ptr)); pyVKTarget_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKTarget_init(PYVKTarget *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) VKTarget(((PYTarget*)object)->ptr);
				pyVKTarget_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKTarget();
			pyVKTarget_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTarget::VKTarget(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKTarget_dealloc(PYVKTarget *self) {
		self->ptr.~VKTarget();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKTarget_equalPtr(PYVKTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKTarget_clonePtr(PYVKTarget *self, PyObject *args) {
		return pyVKTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKTarget_clearPtr(PYVKTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTarget_destroyPtr(PYVKTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTarget_acquirePtr(PYVKTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTarget_unacquirePtr(PYVKTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKTarget_isValidPtr(PYVKTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKTarget_isOwnerPtr(PYVKTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKTarget_isConstPtr(PYVKTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKTarget_getCountPtr(PYVKTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKTarget_getInternalPtr(PYVKTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKTarget_getTarget(PYVKTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *VKTarget_getRenderPass(PYVKTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderPass());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTarget::getRenderPass(): unknown arguments:\n(void) -> VkRenderPass\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTarget_getFramebuffer(PYVKTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFramebuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKTarget::getFramebuffer(): unknown arguments:\n(void) -> VkFramebuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKTarget_get_render_pass(PYVKTarget *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderPass());
	}
	static PyObject *VKTarget_get_framebuffer(PYVKTarget *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFramebuffer());
	}
	static PyObject *pyVKTarget_str(PYVKTarget *self) {
		return PyUnicode_FromString(String::format("VKTarget Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKTarget_bool(PYVKTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLTarget
	static void pyGLTarget_base(PYGLTarget *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYGLTarget(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLTarget_Type);
	}
	TS_PYAPI GLTarget &pyGLTarget_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLTarget_Type) return ((PYGLTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLTarget_get(): can't get GLTarget from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLTarget_get(): can't get GLTarget from None");
		static GLTarget ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLTarget_new(const GLTarget &ptr) {
		PYGLTarget *ret = (PYGLTarget*)PyObject_New(PYGLTarget, &PYGLTarget_Type);
		new(&ret->ptr) GLTarget(ptr); pyGLTarget_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLTarget_new(GLTarget &&ptr) {
		PYGLTarget *ret = (PYGLTarget*)PyObject_New(PYGLTarget, &PYGLTarget_Type);
		new(&ret->ptr) GLTarget(move(ptr)); pyGLTarget_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLTarget_init(PYGLTarget *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) GLTarget(((PYTarget*)object)->ptr);
				pyGLTarget_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLTarget();
			pyGLTarget_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTarget::GLTarget(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLTarget_dealloc(PYGLTarget *self) {
		self->ptr.~GLTarget();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLTarget_equalPtr(PYGLTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLTarget_clonePtr(PYGLTarget *self, PyObject *args) {
		return pyGLTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLTarget_clearPtr(PYGLTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTarget_destroyPtr(PYGLTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTarget_acquirePtr(PYGLTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTarget_unacquirePtr(PYGLTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLTarget_isValidPtr(PYGLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLTarget_isOwnerPtr(PYGLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLTarget_isConstPtr(PYGLTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLTarget_getCountPtr(PYGLTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLTarget_getInternalPtr(PYGLTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLTarget_getTarget(PYGLTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *GLTarget_getFramebufferID(PYGLTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLTarget::getFramebufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLTarget_get_framebuffer_id(PYGLTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
	}
	static PyObject *pyGLTarget_str(PYGLTarget *self) {
		return PyUnicode_FromString(String::format("GLTarget Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLTarget_bool(PYGLTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESTarget
	static void pyGLESTarget_base(PYGLESTarget *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYGLESTarget(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESTarget_Type);
	}
	TS_PYAPI GLESTarget &pyGLESTarget_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESTarget_Type) return ((PYGLESTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESTarget_get(): can't get GLESTarget from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESTarget_get(): can't get GLESTarget from None");
		static GLESTarget ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESTarget_new(const GLESTarget &ptr) {
		PYGLESTarget *ret = (PYGLESTarget*)PyObject_New(PYGLESTarget, &PYGLESTarget_Type);
		new(&ret->ptr) GLESTarget(ptr); pyGLESTarget_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESTarget_new(GLESTarget &&ptr) {
		PYGLESTarget *ret = (PYGLESTarget*)PyObject_New(PYGLESTarget, &PYGLESTarget_Type);
		new(&ret->ptr) GLESTarget(move(ptr)); pyGLESTarget_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESTarget_init(PYGLESTarget *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) GLESTarget(((PYTarget*)object)->ptr);
				pyGLESTarget_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESTarget();
			pyGLESTarget_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTarget::GLESTarget(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESTarget_dealloc(PYGLESTarget *self) {
		self->ptr.~GLESTarget();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESTarget_equalPtr(PYGLESTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESTarget_clonePtr(PYGLESTarget *self, PyObject *args) {
		return pyGLESTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESTarget_clearPtr(PYGLESTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTarget_destroyPtr(PYGLESTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTarget_acquirePtr(PYGLESTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTarget_unacquirePtr(PYGLESTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESTarget_isValidPtr(PYGLESTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESTarget_isOwnerPtr(PYGLESTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESTarget_isConstPtr(PYGLESTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESTarget_getCountPtr(PYGLESTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESTarget_getInternalPtr(PYGLESTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESTarget_getTarget(PYGLESTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *GLESTarget_getFramebufferID(PYGLESTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESTarget::getFramebufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESTarget_get_framebuffer_id(PYGLESTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
	}
	static PyObject *pyGLESTarget_str(PYGLESTarget *self) {
		return PyUnicode_FromString(String::format("GLESTarget Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESTarget_bool(PYGLESTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUTarget
	static void pyFUTarget_base(PYFUTarget *self) {
		new(&self->base.ptr) Target(self->ptr);
	}
	TS_PYAPI bool isPYFUTarget(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUTarget_Type);
	}
	TS_PYAPI FUTarget &pyFUTarget_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUTarget_Type) return ((PYFUTarget*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUTarget_get(): can't get FUTarget from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUTarget_get(): can't get FUTarget from None");
		static FUTarget ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUTarget_new(const FUTarget &ptr) {
		PYFUTarget *ret = (PYFUTarget*)PyObject_New(PYFUTarget, &PYFUTarget_Type);
		new(&ret->ptr) FUTarget(ptr); pyFUTarget_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUTarget_new(FUTarget &&ptr) {
		PYFUTarget *ret = (PYFUTarget*)PyObject_New(PYFUTarget, &PYFUTarget_Type);
		new(&ret->ptr) FUTarget(move(ptr)); pyFUTarget_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUTarget_init(PYFUTarget *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTarget(object)) {
				new(&self->ptr) FUTarget(((PYTarget*)object)->ptr);
				pyFUTarget_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUTarget();
			pyFUTarget_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *targets_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "targets", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &targets_, &owner)) {
				if(!isPYArray(targets_)) break;
				Array<Target> targets; Array<PyObject*> targets__; pyArray_get(targets_, targets__);
				for(PyObject *object : targets__) targets.append(pyTarget_get(object));
				new(&self->ptr) FUTarget(targets, (owner != 0));
				pyFUTarget_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTarget::FUTarget(): unknown arguments:\n(void)\n(Array<Target> targets, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUTarget_dealloc(PYFUTarget *self) {
		self->ptr.~FUTarget();
		self->base.ptr.~Target();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUTarget_equalPtr(PYFUTarget *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUTarget_clonePtr(PYFUTarget *self, PyObject *args) {
		return pyFUTarget_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUTarget_clearPtr(PYFUTarget *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTarget_destroyPtr(PYFUTarget *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTarget_acquirePtr(PYFUTarget *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTarget_unacquirePtr(PYFUTarget *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTarget_isValidPtr(PYFUTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUTarget_isOwnerPtr(PYFUTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUTarget_isConstPtr(PYFUTarget *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUTarget_getCountPtr(PYFUTarget *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUTarget_getInternalPtr(PYFUTarget *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUTarget_getTarget(PYFUTarget *self, PyObject *args) {
		return pyTarget_new(self->ptr.getTarget());
	}
	static PyObject *FUTarget_setMask(PYFUTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTarget::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTarget_getMask(PYFUTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTarget::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTarget_getNumTargets(PYFUTarget *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTarget::getNumTargets(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTarget_getTarget(PYFUTarget *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTarget_new(self->ptr.getTarget(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyTarget_new(self->ptr.getTarget(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTarget::getTarget(): unknown arguments:\n(uint32_t index) -> const Target\n(uint32_t index) -> Target\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTarget_get_mask(PYFUTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUTarget_get_num_targets(PYFUTarget *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
	}
	static PyObject *pyFUTarget_str(PYFUTarget *self) {
		return PyUnicode_FromString(String::format("FUTarget Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUTarget_bool(PYFUTarget *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Device
	TS_PYAPI bool isPYDevice(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYDevice_Type || type == &PYD3D12Device_Type || type == &PYD3D11Device_Type || type == &PYMTLDevice_Type || type == &PYVKDevice_Type || type == &PYFUDevice_Type);
	}
	TS_PYAPI Device &pyDevice_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYDevice_Type || type == &PYD3D12Device_Type || type == &PYD3D11Device_Type || type == &PYMTLDevice_Type || type == &PYVKDevice_Type || type == &PYFUDevice_Type) return ((PYDevice*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Device_get(): can't get Device from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Device_get(): can't get Device from None");
		static Device ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDevice_new(const Device &ptr) {
		PYDevice *ret = (PYDevice*)PyObject_New(PYDevice, &PYDevice_Type);
		new(&ret->ptr) Device(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDevice_new(Device &&ptr) {
		PYDevice *ret = (PYDevice*)PyObject_New(PYDevice, &PYDevice_Type);
		new(&ret->ptr) Device(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDevice_init(PYDevice *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Device();
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) Device(context);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) Device(surface);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) Device(window);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::Device(): unknown arguments:\n(void)\n(Context context)\n(Surface surface)\n(Window window)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDevice_dealloc(PYDevice *self) {
		self->ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDevice_equalPtr(PYDevice *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDevice_clonePtr(PYDevice *self, PyObject *args) {
		return pyDevice_new(self->ptr.clonePtr());
	}
	static PyObject *pyDevice_clearPtr(PYDevice *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDevice_destroyPtr(PYDevice *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDevice_acquirePtr(PYDevice *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDevice_unacquirePtr(PYDevice *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDevice_isValidPtr(PYDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDevice_isOwnerPtr(PYDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDevice_isConstPtr(PYDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDevice_getCountPtr(PYDevice *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDevice_getInternalPtr(PYDevice *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Device_getPlatform(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getPlatformName(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getIndex(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getName(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getVendor(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getVendor().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getVendor(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getVersion(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getVersion().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getVersion(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getFeatures(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyDeviceFeatures_new(self->ptr.getFeatures());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getFeatures(): unknown arguments:\n(void) -> const Device::Features\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_hasQuery(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasQuery((Query::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::hasQuery(): unknown arguments:\n(Query.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_hasShader(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyLong_FromLong(self->ptr.hasShader((Shader::Type)type));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::hasShader(): unknown arguments:\n(Shader.Type type) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_hasTarget(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(self->ptr.hasTarget((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::hasTarget(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_hasTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(self->ptr.hasTexture((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::hasTexture(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_hasSurface(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(self->ptr.hasSurface((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::hasSurface(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createDevice(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t frames = 3;
		static const char *kwlist[] = { "index", "frames", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &index, &frames)) {
			return pyDevice_new(self->ptr.createDevice(index, frames));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createDevice(): unknown arguments:\n(uint32_t index, uint32_t frames) -> Device\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createCommandDevice(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t frames = 3;
		static const char *kwlist[] = { "frames", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &frames)) {
			return pyDevice_new(self->ptr.createCommandDevice(frames));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createCommandDevice(): unknown arguments:\n(uint32_t frames) -> Device\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createComputeDevice(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t frames = 3;
		static const char *kwlist[] = { "frames", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &frames)) {
			return pyDevice_new(self->ptr.createComputeDevice(frames));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createComputeDevice(): unknown arguments:\n(uint32_t frames) -> Device\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createCopyDevice(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t frames = 3;
		static const char *kwlist[] = { "frames", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &frames)) {
			return pyDevice_new(self->ptr.createCopyDevice(frames));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createCopyDevice(): unknown arguments:\n(uint32_t frames) -> Device\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createQuery(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return pyQuery_new(self->ptr.createQuery((Query::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyQuery_new(self->ptr.createQuery());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createQuery(): unknown arguments:\n(Query.Type type) -> Query\n(void) -> Query\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createFence(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *shared_ = nullptr;
		static const char *kwlist[] = { "shared", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &shared_)) {
			if(!isPYFence(shared_)) break;
			Fence &shared = pyFence_get(shared_);
			return pyFence_new(self->ptr.createFence(shared));
		}
		PyErr_Clear();
		{
			uint32_t flags = 0;
			static const char *kwlist[] = { "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
				return pyFence_new(self->ptr.createFence((Fence::Flags)flags));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyFence_new(self->ptr.createFence());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createFence(): unknown arguments:\n(Fence shared) -> Fence\n(Fence.Flags flags) -> Fence\n(void) -> Fence\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		const void *src = nullptr;
		size_t size = {};
		uint32_t format = FormatUnknown;
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "flags", "src", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iy*|I", (char**)kwlist, &flags, &src_buffer, &format)) {
			return pyBuffer_new(self->ptr.createBuffer((Buffer::Flags)flags, src = src_buffer.buf, size = src_buffer.len, (Format)format));
		}
		PyErr_Clear();
		{
			uint32_t flags = 0;
			size_t size = {};
			uint32_t format = FormatUnknown;
			static const char *kwlist[] = { "flags", "size", "format", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|I", (char**)kwlist, &flags, &size, &format)) {
				return pyBuffer_new(self->ptr.createBuffer((Buffer::Flags)flags, size, (Format)format));
			}
		}
		PyErr_Clear();
		{
			PyObject *shared_ = nullptr;
			static const char *kwlist[] = { "shared", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &shared_)) {
				if(!isPYBuffer(shared_)) break;
				Buffer &shared = pyBuffer_get(shared_);
				return pyBuffer_new(self->ptr.createBuffer(shared));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.createBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createBuffer(): unknown arguments:\n(Buffer.Flags flags, const void* src, size_t size, Format format) -> Buffer\n(Buffer.Flags flags, size_t size, Format format) -> Buffer\n(Buffer shared) -> Buffer\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createSampler(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		uint32_t mode = Sampler::WrapModeRepeat;
		uint32_t anisotropy = Sampler::MaxAnisotropy;
		static const char *kwlist[] = { "filter", "mode", "anisotropy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|II", (char**)kwlist, &filter, &mode, &anisotropy)) {
			return pySampler_new(self->ptr.createSampler((Sampler::Filter)filter, (Sampler::WrapMode)mode, anisotropy));
		}
		PyErr_Clear();
		{
			PyObject *sampler_ = nullptr;
			static const char *kwlist[] = { "sampler", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sampler_)) {
				if(!isPYSampler(sampler_)) break;
				const Sampler &sampler = pySampler_get(sampler_);
				return pySampler_new(self->ptr.createSampler(sampler));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pySampler_new(self->ptr.createSampler());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createSampler(): unknown arguments:\n(Sampler.Filter filter, Sampler.WrapMode mode, uint32_t anisotropy) -> Sampler\n(const Sampler sampler) -> Sampler\n(void) -> Sampler\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t format = 0;
		PyObject *size_ = nullptr;
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "type", "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIOI|I", (char**)kwlist, &type, &format, &size_, &layers, &flags)) {
			if(!isPYSize(size_)) break;
			const Size &size = pySize_get(size_);
			return pyTexture_new(self->ptr.createTexture((Texture::Type)type, (Format)format, size, layers, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t type = 0;
			uint32_t format = 0;
			PyObject *size_ = nullptr;
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "type", "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO|I", (char**)kwlist, &type, &format, &size_, &flags)) {
				if(!isPYSize(size_)) break;
				const Size &size = pySize_get(size_);
				return pyTexture_new(self->ptr.createTexture((Texture::Type)type, (Format)format, size, (Texture::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *image_ = nullptr;
			uint32_t flags = Texture::DefaultFlags;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "image", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &image_, &flags, &async_)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyTexture_new(self->ptr.createTexture(image, (Texture::Flags)flags, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *shared_ = nullptr;
			static const char *kwlist[] = { "shared", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &shared_)) {
				if(!isPYTexture(shared_)) break;
				Texture &shared = pyTexture_get(shared_);
				return pyTexture_new(self->ptr.createTexture(shared));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.createTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTexture(): unknown arguments:\n(Texture.Type type, Format format, const Size size, uint32_t layers, Texture.Flags flags) -> Texture\n(Texture.Type type, Format format, const Size size, Texture.Flags flags) -> Texture\n(const Image image, Texture.Flags flags, Async* async) -> Texture\n(Texture shared) -> Texture\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTexture2D(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "width", "height", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &layers, &flags)) {
			return pyTexture_new(self->ptr.createTexture2D((Format)format, width, height, layers, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t width = {};
			uint32_t height = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "width", "height", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &width, &height, &flags)) {
				return pyTexture_new(self->ptr.createTexture2D((Format)format, width, height, (Texture::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return pyTexture_new(self->ptr.createTexture2D((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTexture2D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t layers, Texture.Flags flags) -> Texture\n(Format format, uint32_t width, uint32_t height, Texture.Flags flags) -> Texture\n(Format format, uint32_t size, Texture.Flags flags) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTexture3D(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t width = {};
		uint32_t height = {};
		uint32_t depth = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "width", "height", "depth", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &format, &width, &height, &depth, &flags)) {
			return pyTexture_new(self->ptr.createTexture3D((Format)format, width, height, depth, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return pyTexture_new(self->ptr.createTexture3D((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTexture3D(): unknown arguments:\n(Format format, uint32_t width, uint32_t height, uint32_t depth, Texture.Flags flags) -> Texture\n(Format format, uint32_t size, Texture.Flags flags) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTextureCube(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t size = {};
		uint32_t layers = {};
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "format", "size", "layers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &format, &size, &layers, &flags)) {
			return pyTexture_new(self->ptr.createTextureCube((Format)format, size, layers, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t size = {};
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "format", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &format, &size, &flags)) {
				return pyTexture_new(self->ptr.createTextureCube((Format)format, size, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTextureCube(): unknown arguments:\n(Format format, uint32_t size, uint32_t layers, Texture.Flags flags) -> Texture\n(Format format, uint32_t size, Texture.Flags flags) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_loadTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t flags = Texture::DefaultFlags;
		uint32_t image_flags = Image::FlagNone;
		uint32_t offset = 0;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "name", "flags", "image_flags", "offset", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IIIO", (char**)kwlist, &name, &flags, &image_flags, &offset, &async_)) {
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return pyTexture_new(self->ptr.loadTexture(name, (Texture::Flags)flags, (Image::Flags)image_flags, offset, async));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t flags = Texture::DefaultFlags;
			uint32_t image_flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "name", "flags", "image_flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIIO", (char**)kwlist, &name_, &flags, &image_flags, &offset, &async_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyTexture_new(self->ptr.loadTexture(name, (Texture::Flags)flags, (Image::Flags)image_flags, offset, async));
			}
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			uint32_t flags = Texture::DefaultFlags;
			uint32_t image_flags = Image::FlagNone;
			uint32_t offset = 0;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "stream", "flags", "image_flags", "offset", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIIO", (char**)kwlist, &stream_, &flags, &image_flags, &offset, &async_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return pyTexture_new(self->ptr.loadTexture(stream, (Texture::Flags)flags, (Image::Flags)image_flags, offset, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::loadTexture(): unknown arguments:\n(const char* name, Texture.Flags flags, Image.Flags image_flags, uint32_t offset, Async* async) -> Texture\n(const String name, Texture.Flags flags, Image.Flags image_flags, uint32_t offset, Async* async) -> Texture\n(Stream stream, Texture.Flags flags, Image.Flags image_flags, uint32_t offset, Async* async) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		uint32_t vertex_format = 0;
		size_t vertex_stride = {};
		uint32_t num_indices = {};
		uint32_t index_format = 0;
		uint32_t flags = Tracing::DefaultFlags;
		static const char *kwlist[] = { "num_vertices", "vertex_format", "vertex_stride", "num_indices", "index_format", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IInII|I", (char**)kwlist, &num_vertices, &vertex_format, &vertex_stride, &num_indices, &index_format, &flags)) {
			return pyTracing_new(self->ptr.createTracing(num_vertices, (Format)vertex_format, vertex_stride, num_indices, (Format)index_format, (Tracing::Flags)flags));
		}
		PyErr_Clear();
		{
			uint32_t num_bounds = {};
			size_t bound_stride = {};
			PyObject *bound_buffer_ = nullptr;
			size_t bound_offset = 0;
			uint32_t flags = Tracing::DefaultFlags;
			static const char *kwlist[] = { "num_bounds", "bound_stride", "bound_buffer", "bound_offset", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "In|OnI", (char**)kwlist, &num_bounds, &bound_stride, &bound_buffer_, &bound_offset, &flags)) {
				Buffer bound_buffer = pyBuffer_get(bound_buffer_);
				return pyTracing_new(self->ptr.createTracing(num_bounds, bound_stride, bound_buffer, bound_offset, (Tracing::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			uint32_t num_instances = {};
			PyObject *instance_buffer_ = nullptr;
			size_t instance_offset = 0;
			uint32_t flags = Tracing::DefaultFlags;
			static const char *kwlist[] = { "num_instances", "instance_buffer", "instance_offset", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|OnI", (char**)kwlist, &num_instances, &instance_buffer_, &instance_offset, &flags)) {
				Buffer instance_buffer = pyBuffer_get(instance_buffer_);
				return pyTracing_new(self->ptr.createTracing(num_instances, instance_buffer, instance_offset, (Tracing::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *tracing_ = nullptr;
			static const char *kwlist[] = { "tracing", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &tracing_)) {
				if(!isPYTracing(tracing_)) break;
				const Tracing &tracing = pyTracing_get(tracing_);
				return pyTracing_new(self->ptr.createTracing(tracing));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyTracing_new(self->ptr.createTracing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTracing(): unknown arguments:\n(uint32_t num_vertices, Format vertex_format, size_t vertex_stride, uint32_t num_indices, Format index_format, Tracing.Flags flags) -> Tracing\n(uint32_t num_bounds, size_t bound_stride, Buffer bound_buffer, size_t bound_offset, Tracing.Flags flags) -> Tracing\n(uint32_t num_instances, Buffer instance_buffer, size_t instance_offset, Tracing.Flags flags) -> Tracing\n(const Tracing tracing) -> Tracing\n(void) -> Tracing\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createBufferTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffers_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "buffers", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &buffers_, &owner)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			return pyBufferTable_new(self->ptr.createBufferTable(buffers, (owner != 0)));
		}
		PyErr_Clear();
		{
			uint32_t size = {};
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
				return pyBufferTable_new(self->ptr.createBufferTable(size));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyBufferTable_new(self->ptr.createBufferTable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createBufferTable(): unknown arguments:\n(Array<Buffer> buffers, bool owner) -> BufferTable\n(uint32_t size) -> BufferTable\n(void) -> BufferTable\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTextureTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t size = {};
		static const char *kwlist[] = { "type", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &type, &size)) {
			return pyTextureTable_new(self->ptr.createTextureTable((Texture::Type)type, size));
		}
		PyErr_Clear();
		{
			PyObject *textures_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "textures", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &textures_, &owner)) {
				if(!isPYArray(textures_)) break;
				Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
				for(PyObject *object : textures__) textures.append(pyTexture_get(object));
				return pyTextureTable_new(self->ptr.createTextureTable(textures, (owner != 0)));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyTextureTable_new(self->ptr.createTextureTable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTextureTable(): unknown arguments:\n(Texture.Type type, uint32_t size) -> TextureTable\n(Array<Texture> textures, bool owner) -> TextureTable\n(void) -> TextureTable\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createShader(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		static const char *kwlist[] = { "type", "src", "macros", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|O", (char**)kwlist, &type, &src, &macros_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			return pyShader_new(self->ptr.createShader((Shader::Type)type, src, macros));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.createShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createShader(): unknown arguments:\n(Shader.Type type, const char* src, const String macros) -> Shader\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_loadShader(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		static const char *kwlist[] = { "type", "name", "macros", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|O", (char**)kwlist, &type, &name, &macros_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			return pyShader_new(self->ptr.loadShader((Shader::Type)type, name, macros));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::loadShader(): unknown arguments:\n(Shader.Type type, const char* name, const String macros) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_loadShaderGLSL(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		static const char *kwlist[] = { "type", "name", "macros", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|O", (char**)kwlist, &type, &name, &macros_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			return pyShader_new(self->ptr.loadShaderGLSL((Shader::Type)type, name, macros));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::loadShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* name, const String macros) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_loadShaderSPIRV(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		static const char *kwlist[] = { "type", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &type, &name)) {
			return pyShader_new(self->ptr.loadShaderSPIRV((Shader::Type)type, name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::loadShaderSPIRV(): unknown arguments:\n(Shader.Type type, const char* name) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createShaderGLSL(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		static const char *kwlist[] = { "type", "src", "macros", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|O", (char**)kwlist, &type, &src, &macros_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			return pyShader_new(self->ptr.createShaderGLSL((Shader::Type)type, src, macros));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* src, const String macros) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createShaderSPIRV(PYDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		PyObject *data_ = nullptr;
		static const char *kwlist[] = { "type", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &type, &data_)) {
			if(!isPYArray(data_)) break;
			Array<uint32_t> data; pyArray_get(data_, data);
			return pyShader_new(self->ptr.createShaderSPIRV((Shader::Type)type, data));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createShaderSPIRV(): unknown arguments:\n(Shader.Type type, Array<uint32_t> data) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createKernel(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *kernel_ = nullptr;
		static const char *kwlist[] = { "kernel", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &kernel_)) {
			if(!isPYKernel(kernel_)) break;
			const Kernel &kernel = pyKernel_get(kernel_);
			return pyKernel_new(self->ptr.createKernel(kernel));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyKernel_new(self->ptr.createKernel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createKernel(): unknown arguments:\n(const Kernel kernel) -> Kernel\n(void) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseKernel(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *kernel_ = nullptr;
		static const char *kwlist[] = { "kernel", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &kernel_)) {
			if(!isPYKernel(kernel_)) break;
			Kernel &kernel = pyKernel_get(kernel_);
			self->ptr.releaseKernel(kernel);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseKernel(): unknown arguments:\n(Kernel kernel) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createPipeline(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
			if(!isPYPipeline(pipeline_)) break;
			const Pipeline &pipeline = pyPipeline_get(pipeline_);
			return pyPipeline_new(self->ptr.createPipeline(pipeline));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyPipeline_new(self->ptr.createPipeline());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createPipeline(): unknown arguments:\n(const Pipeline pipeline) -> Pipeline\n(void) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releasePipeline(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
			if(!isPYPipeline(pipeline_)) break;
			Pipeline &pipeline = pyPipeline_get(pipeline_);
			self->ptr.releasePipeline(pipeline);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releasePipeline(): unknown arguments:\n(Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTraversal(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *traversal_ = nullptr;
		static const char *kwlist[] = { "traversal", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &traversal_)) {
			if(!isPYTraversal(traversal_)) break;
			const Traversal &traversal = pyTraversal_get(traversal_);
			return pyTraversal_new(self->ptr.createTraversal(traversal));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyTraversal_new(self->ptr.createTraversal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTraversal(): unknown arguments:\n(const Traversal traversal) -> Traversal\n(void) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseTraversal(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *traversal_ = nullptr;
		static const char *kwlist[] = { "traversal", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &traversal_)) {
			if(!isPYTraversal(traversal_)) break;
			Traversal &traversal = pyTraversal_get(traversal_);
			self->ptr.releaseTraversal(traversal);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseTraversal(): unknown arguments:\n(Traversal traversal) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createTarget(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *surface_ = nullptr;
		static const char *kwlist[] = { "surface", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
			if(!isPYSurface(surface_)) break;
			Surface &surface = pySurface_get(surface_);
			return pyTarget_new(self->ptr.createTarget(surface));
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				return pyTarget_new(self->ptr.createTarget(window));
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyTarget_new(self->ptr.createTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createTarget(): unknown arguments:\n(Surface surface) -> Target\n(Window window) -> Target\n(void) -> Target\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createCompute(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCompute_new(self->ptr.createCompute());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createCompute(): unknown arguments:\n(void) -> Compute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createCommand(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *target_ = nullptr;
		static const char *kwlist[] = { "target", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &target_)) {
			if(!isPYTarget(target_)) break;
			Target &target = pyTarget_get(target_);
			return pyCommand_new(self->ptr.createCommand(target));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyCommand_new(self->ptr.createCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createCommand(): unknown arguments:\n(Target target) -> Command\n(void) -> Command\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_setBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "buffer", "offset", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ony*", (char**)kwlist, &buffer_, &offset, &src_buffer)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.setBuffer(buffer, offset, src = src_buffer.buf, size = src_buffer.len));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			const void *src = nullptr;
			size_t size = {};
			Py_buffer src_buffer = {};
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oy*", (char**)kwlist, &buffer_, &src_buffer)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.setBuffer(buffer, src = src_buffer.buf, size = src_buffer.len));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &src)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.setBuffer(buffer, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::setBuffer(): unknown arguments:\n(Buffer buffer, size_t offset, const void* src, size_t size) -> bool\n(Buffer buffer, const void* src, size_t size) -> bool\n(Buffer buffer, const void* src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		void *dest = nullptr;
		size_t size = {};
		Py_buffer dest_buffer = {};
		static const char *kwlist[] = { "buffer", "offset", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ony*", (char**)kwlist, &buffer_, &offset, &dest_buffer)) {
			if(dest_buffer.readonly) break;
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.getBuffer(buffer, offset, dest = dest_buffer.buf, size = dest_buffer.len));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			void *dest = nullptr;
			size_t size = {};
			Py_buffer dest_buffer = {};
			static const char *kwlist[] = { "buffer", "dest", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oy*", (char**)kwlist, &buffer_, &dest_buffer)) {
				if(dest_buffer.readonly) break;
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.getBuffer(buffer, dest = dest_buffer.buf, size = dest_buffer.len));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			void *dest = nullptr;
			static const char *kwlist[] = { "buffer", "dest", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &dest)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.getBuffer(buffer, dest));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getBuffer(): unknown arguments:\n(Buffer buffer, size_t offset, void* dest, size_t size) -> bool\n(Buffer buffer, void* dest, size_t size) -> bool\n(Buffer buffer, void* dest) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_mapBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		size_t size = {};
		static const char *kwlist[] = { "buffer", "offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Onn", (char**)kwlist, &buffer_, &offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromVoidPtr(self->ptr.mapBuffer(buffer, offset, size));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			size_t size = {};
			static const char *kwlist[] = { "buffer", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &buffer_, &size)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromVoidPtr(self->ptr.mapBuffer(buffer, size));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			static const char *kwlist[] = { "buffer", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromVoidPtr(self->ptr.mapBuffer(buffer));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::mapBuffer(): unknown arguments:\n(Buffer buffer, size_t offset, size_t size) -> void*\n(Buffer buffer, size_t size) -> void*\n(Buffer buffer) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_unmapBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		static const char *kwlist[] = { "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.unmapBuffer(buffer));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::unmapBuffer(): unknown arguments:\n(Buffer buffer) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		size_t dest_offset = {};
		PyObject *src_ = nullptr;
		size_t src_offset = {};
		size_t size = {};
		static const char *kwlist[] = { "buffer", "dest_offset", "src", "src_offset", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnOnn", (char**)kwlist, &buffer_, &dest_offset, &src_, &src_offset, &size)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			if(!isPYBuffer(src_)) break;
			Buffer &src = pyBuffer_get(src_);
			return PyLong_FromLong(self->ptr.copyBuffer(buffer, dest_offset, src, src_offset, size));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			size_t dest_offset = {};
			PyObject *src_ = nullptr;
			size_t size = {};
			static const char *kwlist[] = { "buffer", "dest_offset", "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OnOn", (char**)kwlist, &buffer_, &dest_offset, &src_, &size)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, dest_offset, src, size));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			PyObject *src_ = nullptr;
			size_t size = {};
			static const char *kwlist[] = { "buffer", "src", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &buffer_, &src_, &size)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, src, size));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "buffer", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &buffer_, &src_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYBuffer(src_)) break;
				Buffer &src = pyBuffer_get(src_);
				return PyLong_FromLong(self->ptr.copyBuffer(buffer, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyBuffer(): unknown arguments:\n(Buffer buffer, size_t dest_offset, Buffer src, size_t src_offset, size_t size) -> bool\n(Buffer buffer, size_t dest_offset, Buffer src, size_t size) -> bool\n(Buffer buffer, Buffer src, size_t size) -> bool\n(Buffer buffer, Buffer src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_clearBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		uint32_t format = 0;
		size_t offset = {};
		const void *src = nullptr;
		size_t size = {};
		Py_buffer src_buffer = {};
		static const char *kwlist[] = { "buffer", "format", "offset", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIny*", (char**)kwlist, &buffer_, &format, &offset, &src_buffer)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, offset, src = src_buffer.buf, size = src_buffer.len));
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			uint32_t format = 0;
			const void *src = nullptr;
			size_t size = {};
			Py_buffer src_buffer = {};
			static const char *kwlist[] = { "buffer", "format", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIy*", (char**)kwlist, &buffer_, &format, &src_buffer)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, src = src_buffer.buf, size = src_buffer.len));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			uint32_t format = 0;
			const void *src = nullptr;
			static const char *kwlist[] = { "buffer", "format", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIn", (char**)kwlist, &buffer_, &format, &src)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer, (Format)format, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *buffer_ = nullptr;
			static const char *kwlist[] = { "buffer", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.clearBuffer(buffer));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::clearBuffer(): unknown arguments:\n(Buffer buffer, Format format, size_t offset, const void* src, size_t size) -> bool\n(Buffer buffer, Format format, const void* src, size_t size) -> bool\n(Buffer buffer, Format format, const void* src) -> bool\n(Buffer buffer) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		uint32_t flags = Buffer::FlagNone;
		static const char *kwlist[] = { "buffer", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &buffer_, &flags)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.flushBuffer(buffer, (Buffer::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushBuffer(): unknown arguments:\n(Buffer buffer, Buffer.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushBuffers(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffers_ = nullptr;
		uint32_t flags = Buffer::FlagNone;
		static const char *kwlist[] = { "buffers", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &buffers_, &flags)) {
			if(!isPYArray(buffers_)) break;
			Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
			for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
			return PyLong_FromLong(self->ptr.flushBuffers(buffers, (Buffer::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushBuffers(): unknown arguments:\n(Array<Buffer> buffers, Buffer.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseBuffer(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		static const char *kwlist[] = { "buffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &buffer_)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.releaseBuffer(buffer);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseBuffer(): unknown arguments:\n(Buffer buffer) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseSampler(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *sampler_ = nullptr;
		static const char *kwlist[] = { "sampler", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sampler_)) {
			if(!isPYSampler(sampler_)) break;
			Sampler &sampler = pySampler_get(sampler_);
			self->ptr.releaseSampler(sampler);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseSampler(): unknown arguments:\n(Sampler sampler) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_setTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *dest_origin_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *image_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "texture", "dest_origin", "dest_slice", "image", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOO", (char**)kwlist, &texture_, &dest_origin_, &dest_slice_, &image_, &src_slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYOrigin(dest_origin_)) break;
			const Origin &dest_origin = pyOrigin_get(dest_origin_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.setTexture(texture, dest_origin, dest_slice, image, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_origin", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &texture_, &dest_origin_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, dest_origin, image));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_slice", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &texture_, &dest_slice_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, dest_slice, image));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.setTexture(texture, image));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::setTexture(): unknown arguments:\n(Texture texture, const Origin dest_origin, const Slice dest_slice, const Image image, const Slice src_slice) -> bool\n(Texture texture, const Origin dest_origin, const Image image) -> bool\n(Texture texture, const Slice dest_slice, const Image image) -> bool\n(Texture texture, const Image image) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_getTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *src_slice_ = nullptr;
		PyObject *image_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		static const char *kwlist[] = { "texture", "src_slice", "image", "dest_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", (char**)kwlist, &texture_, &src_slice_, &image_, &dest_slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			if(!isPYImage(image_)) break;
			Image &image = pyImage_get(image_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			return PyLong_FromLong(self->ptr.getTexture(texture, src_slice, image, dest_slice));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *image_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			static const char *kwlist[] = { "texture", "image", "dest_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &texture_, &image_, &dest_slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYImage(image_)) break;
				Image &image = pyImage_get(image_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				return PyLong_FromLong(self->ptr.getTexture(texture, image, dest_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *image_ = nullptr;
			static const char *kwlist[] = { "texture", "image", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &image_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYImage(image_)) break;
				Image &image = pyImage_get(image_);
				return PyLong_FromLong(self->ptr.getTexture(texture, image));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::getTexture(): unknown arguments:\n(Texture texture, const Slice src_slice, Image image, const Slice dest_slice) -> bool\n(Texture texture, Image image, const Slice dest_slice) -> bool\n(Texture texture, Image image) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *dest_origin_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *src_region_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "texture", "dest_origin", "dest_slice", "src", "src_region", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOOO", (char**)kwlist, &texture_, &dest_origin_, &dest_slice_, &src_, &src_region_, &src_slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYOrigin(dest_origin_)) break;
			const Origin &dest_origin = pyOrigin_get(dest_origin_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYRegion(src_region_)) break;
			const Region &src_region = pyRegion_get(src_region_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.copyTexture(texture, dest_origin, dest_slice, src, src_region, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_origin_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_region_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_origin", "src", "src_region", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", (char**)kwlist, &texture_, &dest_origin_, &src_, &src_region_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYOrigin(dest_origin_)) break;
				const Origin &dest_origin = pyOrigin_get(dest_origin_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYRegion(src_region_)) break;
				const Region &src_region = pyRegion_get(src_region_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, dest_origin, src, src_region));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *dest_slice_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "texture", "dest_slice", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO", (char**)kwlist, &texture_, &dest_slice_, &src_, &src_slice_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(dest_slice_)) break;
				const Slice &dest_slice = pySlice_get(dest_slice_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, dest_slice, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "texture", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &src_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.copyTexture(texture, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyTexture(): unknown arguments:\n(Texture texture, const Origin dest_origin, const Slice dest_slice, Texture src, const Region src_region, const Slice src_slice) -> bool\n(Texture texture, const Origin dest_origin, Texture src, const Region src_region) -> bool\n(Texture texture, const Slice dest_slice, Texture src, const Slice src_slice) -> bool\n(Texture texture, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_clearTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *region_ = nullptr;
		PyObject *slice_ = nullptr;
		const void *src = nullptr;
		static const char *kwlist[] = { "texture", "region", "slice", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOn", (char**)kwlist, &texture_, &region_, &slice_, &src)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYRegion(region_)) break;
			const Region &region = pyRegion_get(region_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.clearTexture(texture, region, slice, src));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *region_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "region", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &texture_, &region_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, region, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *slice_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "slice", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &texture_, &slice_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, slice, src));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			const void *src = nullptr;
			static const char *kwlist[] = { "texture", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "On", (char**)kwlist, &texture_, &src)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.clearTexture(texture, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::clearTexture(): unknown arguments:\n(Texture texture, const Region region, const Slice slice, const void* src) -> bool\n(Texture texture, const Region region, const void* src) -> bool\n(Texture texture, const Slice slice, const void* src) -> bool\n(Texture texture, const void* src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_bindTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *regions_ = nullptr;
		uint32_t num_regions = {};
		PyObject *slices_ = nullptr;
		uint32_t num_slices = {};
		int32_t commit = {};
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "texture", "regions", "slices", "commit", "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOiO", (char**)kwlist, &texture_, &regions_, &slices_, &commit, &fence_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYArray(regions_)) break;
			Array<Region> regions(pyArray_size(regions_));
			for(uint32_t i = 0; i < regions.size(); i++) regions[i] = pyRegion_get(pyArray_get(regions_, i));
			if(!isPYArray(slices_)) break;
			Array<Slice> slices(pyArray_size(slices_));
			for(uint32_t i = 0; i < slices.size(); i++) slices[i] = pySlice_get(pyArray_get(slices_, i));
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			return PyLong_FromLong(self->ptr.bindTexture(texture, regions.get(), num_regions = regions.size(), slices.get(), num_slices = slices.size(), (commit != 0), fence));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *regions_ = nullptr;
			uint32_t num_regions = {};
			PyObject *slices_ = nullptr;
			uint32_t num_slices = {};
			int32_t commit = {};
			static const char *kwlist[] = { "texture", "regions", "slices", "commit", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOi", (char**)kwlist, &texture_, &regions_, &slices_, &commit)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYArray(regions_)) break;
				Array<Region> regions(pyArray_size(regions_));
				for(uint32_t i = 0; i < regions.size(); i++) regions[i] = pyRegion_get(pyArray_get(regions_, i));
				if(!isPYArray(slices_)) break;
				Array<Slice> slices(pyArray_size(slices_));
				for(uint32_t i = 0; i < slices.size(); i++) slices[i] = pySlice_get(pyArray_get(slices_, i));
				return PyLong_FromLong(self->ptr.bindTexture(texture, regions.get(), num_regions = regions.size(), slices.get(), num_slices = slices.size(), (commit != 0)));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *region_ = nullptr;
			PyObject *slice_ = nullptr;
			int32_t commit = {};
			PyObject *fence_ = nullptr;
			static const char *kwlist[] = { "texture", "region", "slice", "commit", "fence", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOiO", (char**)kwlist, &texture_, &region_, &slice_, &commit, &fence_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				if(!isPYFence(fence_)) break;
				Fence &fence = pyFence_get(fence_);
				return PyLong_FromLong(self->ptr.bindTexture(texture, region, slice, (commit != 0), fence));
			}
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			PyObject *region_ = nullptr;
			PyObject *slice_ = nullptr;
			int32_t commit = {};
			static const char *kwlist[] = { "texture", "region", "slice", "commit", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOi", (char**)kwlist, &texture_, &region_, &slice_, &commit)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.bindTexture(texture, region, slice, (commit != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::bindTexture(): unknown arguments:\n(Texture texture, const Region regions[], const Slice slices[], bool commit, Fence fence) -> bool\n(Texture texture, const Region regions[], const Slice slices[], bool commit) -> bool\n(Texture texture, const Region region, const Slice slice, bool commit, Fence fence) -> bool\n(Texture texture, const Region region, const Slice slice, bool commit) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_createMipmaps(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "texture", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &texture_, &slice_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.createMipmaps(texture, slice));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.createMipmaps(texture));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::createMipmaps(): unknown arguments:\n(Texture texture, const Slice slice) -> bool\n(Texture texture) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		uint32_t flags = Texture::FlagNone;
		static const char *kwlist[] = { "texture", "slice", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &texture_, &slice_, &flags)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.flushTexture(texture, slice, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *texture_ = nullptr;
			uint32_t flags = Texture::FlagNone;
			static const char *kwlist[] = { "texture", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &texture_, &flags)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.flushTexture(texture, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushTexture(): unknown arguments:\n(Texture texture, const Slice slice, Texture.Flags flags) -> bool\n(Texture texture, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushTextures(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *textures_ = nullptr;
		uint32_t flags = Texture::FlagNone;
		static const char *kwlist[] = { "textures", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &textures_, &flags)) {
			if(!isPYArray(textures_)) break;
			Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
			for(PyObject *object : textures__) textures.append(pyTexture_get(object));
			return PyLong_FromLong(self->ptr.flushTextures(textures, (Texture::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushTextures(): unknown arguments:\n(Array<Texture> textures, Texture.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseTexture(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		static const char *kwlist[] = { "texture", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texture_)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.releaseTexture(texture);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseTexture(): unknown arguments:\n(Texture texture) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_setTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		PyObject *instances_ = nullptr;
		uint32_t num_instances = {};
		static const char *kwlist[] = { "tracing", "instances", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &tracing_, &instances_)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			if(!isPYArray(instances_)) break;
			Array<Tracing::Instance> instances(pyArray_size(instances_));
			for(uint32_t i = 0; i < instances.size(); i++) instances[i] = pyTracingInstance_get(pyArray_get(instances_, i));
			return PyLong_FromLong(self->ptr.setTracing(tracing, instances.get(), num_instances = instances.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::setTracing(): unknown arguments:\n(Tracing tracing, const Tracing.Instance instances[]) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_buildTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		uint32_t flags = Tracing::FlagNone;
		static const char *kwlist[] = { "tracing", "buffer", "offset", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn|I", (char**)kwlist, &tracing_, &buffer_, &offset, &flags)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.buildTracing(tracing, buffer, offset, (Tracing::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *tracing_ = nullptr;
			PyObject *buffer_ = nullptr;
			uint32_t flags = Tracing::FlagNone;
			static const char *kwlist[] = { "tracing", "buffer", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &tracing_, &buffer_, &flags)) {
				if(!isPYTracing(tracing_)) break;
				Tracing &tracing = pyTracing_get(tracing_);
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.buildTracing(tracing, buffer, (Tracing::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::buildTracing(): unknown arguments:\n(Tracing tracing, Buffer buffer, size_t offset, Tracing.Flags flags) -> bool\n(Tracing tracing, Buffer buffer, Tracing.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_buildTracings(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracings_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		uint32_t flags = Tracing::FlagNone;
		static const char *kwlist[] = { "tracings", "buffer", "offset", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn|I", (char**)kwlist, &tracings_, &buffer_, &offset, &flags)) {
			if(!isPYArray(tracings_)) break;
			Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
			for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.buildTracings(tracings, buffer, offset, (Tracing::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *tracings_ = nullptr;
			PyObject *buffer_ = nullptr;
			uint32_t flags = Tracing::FlagNone;
			static const char *kwlist[] = { "tracings", "buffer", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &tracings_, &buffer_, &flags)) {
				if(!isPYArray(tracings_)) break;
				Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
				for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.buildTracings(tracings, buffer, (Tracing::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::buildTracings(): unknown arguments:\n(Array<Tracing> tracings, Buffer buffer, size_t offset, Tracing.Flags flags) -> bool\n(Array<Tracing> tracings, Buffer buffer, Tracing.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "tracing", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|n", (char**)kwlist, &tracing_, &buffer_, &offset)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.copyTracing(tracing, buffer, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyTracing(): unknown arguments:\n(Tracing tracing, Buffer buffer, size_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyTracings(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracings_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = {};
		size_t stride = 0;
		static const char *kwlist[] = { "tracings", "buffer", "offset", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn|n", (char**)kwlist, &tracings_, &buffer_, &offset, &stride)) {
			if(!isPYArray(tracings_)) break;
			Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
			for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.copyTracings(tracings, buffer, offset, stride));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyTracings(): unknown arguments:\n(Array<Tracing> tracings, Buffer buffer, size_t offset, size_t stride) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		static const char *kwlist[] = { "tracing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &tracing_)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			return PyLong_FromLong(self->ptr.flushTracing(tracing));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushTracing(): unknown arguments:\n(Tracing tracing) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flushTracings(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracings_ = nullptr;
		static const char *kwlist[] = { "tracings", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &tracings_)) {
			if(!isPYArray(tracings_)) break;
			Array<Tracing> tracings; Array<PyObject*> tracings__; pyArray_get(tracings_, tracings__);
			for(PyObject *object : tracings__) tracings.append(pyTracing_get(object));
			return PyLong_FromLong(self->ptr.flushTracings(tracings));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flushTracings(): unknown arguments:\n(Array<Tracing> tracings) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseTracing(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *tracing_ = nullptr;
		static const char *kwlist[] = { "tracing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &tracing_)) {
			if(!isPYTracing(tracing_)) break;
			Tracing &tracing = pyTracing_get(tracing_);
			self->ptr.releaseTracing(tracing);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseTracing(): unknown arguments:\n(Tracing tracing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_setBufferTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *table_ = nullptr;
		uint32_t index = {};
		PyObject *buffer_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "table", "index", "buffer", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|i", (char**)kwlist, &table_, &index, &buffer_, &owner)) {
			if(!isPYBufferTable(table_)) break;
			BufferTable &table = pyBufferTable_get(table_);
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.setBufferTable(table, index, buffer, (owner != 0)));
		}
		PyErr_Clear();
		{
			PyObject *table_ = nullptr;
			uint32_t index = {};
			PyObject *buffers_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "table", "index", "buffers", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|i", (char**)kwlist, &table_, &index, &buffers_, &owner)) {
				if(!isPYBufferTable(table_)) break;
				BufferTable &table = pyBufferTable_get(table_);
				if(!isPYArray(buffers_)) break;
				Array<Buffer> buffers; Array<PyObject*> buffers__; pyArray_get(buffers_, buffers__);
				for(PyObject *object : buffers__) buffers.append(pyBuffer_get(object));
				return PyLong_FromLong(self->ptr.setBufferTable(table, index, buffers, (owner != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::setBufferTable(): unknown arguments:\n(BufferTable table, uint32_t index, Buffer buffer, bool owner) -> bool\n(BufferTable table, uint32_t index, Array<Buffer> buffers, bool owner) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseBufferTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &table_)) {
			if(!isPYBufferTable(table_)) break;
			BufferTable &table = pyBufferTable_get(table_);
			self->ptr.releaseBufferTable(table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseBufferTable(): unknown arguments:\n(BufferTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_setTextureTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *table_ = nullptr;
		uint32_t index = {};
		PyObject *texture_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "table", "index", "texture", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|i", (char**)kwlist, &table_, &index, &texture_, &owner)) {
			if(!isPYTextureTable(table_)) break;
			TextureTable &table = pyTextureTable_get(table_);
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			return PyLong_FromLong(self->ptr.setTextureTable(table, index, texture, (owner != 0)));
		}
		PyErr_Clear();
		{
			PyObject *table_ = nullptr;
			uint32_t index = {};
			PyObject *textures_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "table", "index", "textures", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|i", (char**)kwlist, &table_, &index, &textures_, &owner)) {
				if(!isPYTextureTable(table_)) break;
				TextureTable &table = pyTextureTable_get(table_);
				if(!isPYArray(textures_)) break;
				Array<Texture> textures; Array<PyObject*> textures__; pyArray_get(textures_, textures__);
				for(PyObject *object : textures__) textures.append(pyTexture_get(object));
				return PyLong_FromLong(self->ptr.setTextureTable(table, index, textures, (owner != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::setTextureTable(): unknown arguments:\n(TextureTable table, uint32_t index, Texture texture, bool owner) -> bool\n(TextureTable table, uint32_t index, Array<Texture> textures, bool owner) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_releaseTextureTable(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *table_ = nullptr;
		static const char *kwlist[] = { "table", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &table_)) {
			if(!isPYTextureTable(table_)) break;
			TextureTable &table = pyTextureTable_get(table_);
			self->ptr.releaseTextureTable(table);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::releaseTextureTable(): unknown arguments:\n(TextureTable table) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_beginQuery(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			return PyLong_FromLong(self->ptr.beginQuery(query));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::beginQuery(): unknown arguments:\n(Query query) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_endQuery(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		static const char *kwlist[] = { "query", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &query_)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			self->ptr.endQuery(query);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::endQuery(): unknown arguments:\n(Query query) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyQuery(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *query_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		static const char *kwlist[] = { "query", "buffer", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|n", (char**)kwlist, &query_, &buffer_, &offset)) {
			if(!isPYQuery(query_)) break;
			Query &query = pyQuery_get(query_);
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.copyQuery(query, buffer, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyQuery(): unknown arguments:\n(Query query, Buffer buffer, size_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_copyQueries(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *queries_ = nullptr;
		PyObject *buffer_ = nullptr;
		size_t offset = 0;
		size_t stride = 0;
		static const char *kwlist[] = { "queries", "buffer", "offset", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|nn", (char**)kwlist, &queries_, &buffer_, &offset, &stride)) {
			if(!isPYArray(queries_)) break;
			Array<Query> queries; Array<PyObject*> queries__; pyArray_get(queries_, queries__);
			for(PyObject *object : queries__) queries.append(pyQuery_get(object));
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			return PyLong_FromLong(self->ptr.copyQueries(queries, buffer, offset, stride));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::copyQueries(): unknown arguments:\n(Array<Query> queries, Buffer buffer, size_t offset, size_t stride) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_waitFence(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &fence_)) {
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			return PyLong_FromLong(self->ptr.waitFence(fence));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::waitFence(): unknown arguments:\n(Fence fence) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_signalFence(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &fence_)) {
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			return PyLong_FromLong(self->ptr.signalFence(fence));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::signalFence(): unknown arguments:\n(Fence fence) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_execute(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		static const char *kwlist[] = { "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &device_)) {
			if(!isPYDevice(device_)) break;
			Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.execute(device));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::execute(): unknown arguments:\n(Device device) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flip(PYDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *fence_ = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &fence_)) {
			if(!isPYFence(fence_)) break;
			Fence &fence = pyFence_get(fence_);
			return PyLong_FromLong(self->ptr.flip(fence));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flip());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flip(): unknown arguments:\n(Fence fence) -> bool\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_flush(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.flush());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::flush(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_finish(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.finish());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::finish(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_check(PYDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.check());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Device::check(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Device_get_platform(PYDevice *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Device_get_platform_name(PYDevice *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Device_get_index(PYDevice *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Device_get_name(PYDevice *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Device_get_vendor(PYDevice *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getVendor().get());
	}
	static PyObject *Device_get_version(PYDevice *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getVersion().get());
	}
	static PyObject *Device_get_features(PYDevice *self, void *offset) {
		return pyDeviceFeatures_new(self->ptr.getFeatures());
	}
	static PyObject *pyDevice_str(PYDevice *self) {
		return PyUnicode_FromString(String::format("Device Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDevice_bool(PYDevice *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Device::Features
	TS_PYAPI bool isPYDeviceFeatures(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDeviceFeatures_Type);
	}
	TS_PYAPI Device::Features &pyDeviceFeatures_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDeviceFeatures_Type) return ((PYDeviceFeatures*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DeviceFeatures_get(): can't get DeviceFeatures from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DeviceFeatures_get(): can't get DeviceFeatures from None");
		static Device::Features ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDeviceFeatures_new(const Device::Features &ptr) {
		PYDeviceFeatures *ret = (PYDeviceFeatures*)PyObject_New(PYDeviceFeatures, &PYDeviceFeatures_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyDeviceFeatures_buffer(PYDeviceFeatures *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(Device::Features);
			view->itemsize = sizeof(Device::Features);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	static PyObject *pyDeviceFeatures_str(PYDeviceFeatures *self) {
		String ret;
		ret += String::format("threadAccess: %u\n", self->ptr.threadAccess);
		ret += String::format("sparseBuffer: %u\n", self->ptr.sparseBuffer);
		ret += String::format("bufferTable: %u\n", self->ptr.bufferTable);
		ret += String::format("sparseTexture: %u\n", self->ptr.sparseTexture);
		ret += String::format("sparseArrayTexture: %u\n", self->ptr.sparseArrayTexture);
		ret += String::format("cubeArrayTexture: %u\n", self->ptr.cubeArrayTexture);
		ret += String::format("textureTable: %u\n", self->ptr.textureTable);
		ret += String::format("baseInstanceIndex: %u\n", self->ptr.baseInstanceIndex);
		ret += String::format("drawIndirectIndex: %u\n", self->ptr.drawIndirectIndex);
		ret += String::format("drawIndirectCount: %u\n", self->ptr.drawIndirectCount);
		ret += String::format("taskIndirectCount: %u\n", self->ptr.taskIndirectCount);
		ret += String::format("vertexStorage: %u\n", self->ptr.vertexStorage);
		ret += String::format("vertexIndexLayer: %u\n", self->ptr.vertexIndexLayer);
		ret += String::format("geometryPassthrough: %u\n", self->ptr.geometryPassthrough);
		ret += String::format("fragmentBarycentric: %u\n", self->ptr.fragmentBarycentric);
		ret += String::format("fragmentStencilExport: %u\n", self->ptr.fragmentStencilExport);
		ret += String::format("dualSourceBlending: %u\n", self->ptr.dualSourceBlending);
		ret += String::format("depthRangeOneToOne: %u\n", self->ptr.depthRangeOneToOne);
		ret += String::format("conservativeRaster: %u\n", self->ptr.conservativeRaster);
		ret += String::format("conditionalRendering: %u\n", self->ptr.conditionalRendering);
		ret += String::format("rayTracing: %u\n", self->ptr.rayTracing);
		ret += String::format("computeTracing: %u\n", self->ptr.computeTracing);
		ret += String::format("fragmentTracing: %u\n", self->ptr.fragmentTracing);
		ret += String::format("indirectTracing: %u\n", self->ptr.indirectTracing);
		ret += String::format("recursionDepth: %u\n", self->ptr.recursionDepth);
		ret += String::format("subgroupVote: %u\n", self->ptr.subgroupVote);
		ret += String::format("subgroupMath: %u\n", self->ptr.subgroupMath);
		ret += String::format("subgroupShuffle: %u\n", self->ptr.subgroupShuffle);
		ret += String::format("subgroupSize: %u\n", self->ptr.subgroupSize);
		ret += String::format("minSubgroupSize: %u\n", self->ptr.minSubgroupSize);
		ret += String::format("maxSubgroupSize: %u\n", self->ptr.maxSubgroupSize);
		ret += String::format("shaderu8: %u\n", self->ptr.shaderu8);
		ret += String::format("shaderf16: %u\n", self->ptr.shaderf16);
		ret += String::format("shaderu16: %u\n", self->ptr.shaderu16);
		ret += String::format("shaderf64: %u\n", self->ptr.shaderf64);
		ret += String::format("shaderu64: %u\n", self->ptr.shaderu64);
		ret += String::format("atomicGroupf32: %u\n", self->ptr.atomicGroupf32);
		ret += String::format("atomicGroupu64: %u\n", self->ptr.atomicGroupu64);
		ret += String::format("atomicBufferf32: %u\n", self->ptr.atomicBufferf32);
		ret += String::format("atomicBufferu64: %u\n", self->ptr.atomicBufferu64);
		ret += String::format("atomicTexturef32: %u\n", self->ptr.atomicTexturef32);
		ret += String::format("atomicTextureu32: %u\n", self->ptr.atomicTextureu32);
		ret += String::format("atomicTextureu64: %u\n", self->ptr.atomicTextureu64);
		ret += String::format("matrix16f16: %u\n", self->ptr.matrix16f16);
		ret += String::format("matrix16x8x8f16: %u\n", self->ptr.matrix16x8x8f16);
		ret += String::format("matrix16x8x16f16: %u\n", self->ptr.matrix16x8x16f16);
		ret += String::format("matrix16f16f32: %u\n", self->ptr.matrix16f16f32);
		ret += String::format("matrix16x8x8f16f32: %u\n", self->ptr.matrix16x8x8f16f32);
		ret += String::format("matrix16x8x16f16f32: %u\n", self->ptr.matrix16x8x16f16f32);
		ret += String::format("uniformAlignment: %u\n", self->ptr.uniformAlignment);
		ret += String::format("storageAlignment: %u\n", self->ptr.storageAlignment);
		ret += String::format("maxTextureSamples: %u\n", self->ptr.maxTextureSamples);
		ret += String::format("maxTexture2DSize: %u\n", self->ptr.maxTexture2DSize);
		ret += String::format("maxTexture3DSize: %u\n", self->ptr.maxTexture3DSize);
		ret += String::format("maxTextureLayers: %u\n", self->ptr.maxTextureLayers);
		ret += String::format("maxGroupSizeX: %u\n", self->ptr.maxGroupSizeX);
		ret += String::format("maxGroupSizeY: %u\n", self->ptr.maxGroupSizeY);
		ret += String::format("maxGroupSizeZ: %u\n", self->ptr.maxGroupSizeZ);
		ret += String::format("maxGroupCountX: %u\n", self->ptr.maxGroupCountX);
		ret += String::format("maxGroupCountY: %u\n", self->ptr.maxGroupCountY);
		ret += String::format("maxGroupCountZ: %u\n", self->ptr.maxGroupCountZ);
		ret += String::format("maxTaskCount: %u\n", self->ptr.maxTaskCount);
		ret += String::format("maxTaskMemory: %u\n", self->ptr.maxTaskMemory);
		ret += String::format("maxTaskMeshes: %u\n", self->ptr.maxTaskMeshes);
		ret += String::format("maxMeshMemory: %u\n", self->ptr.maxMeshMemory);
		ret += String::format("maxMeshVertices: %u\n", self->ptr.maxMeshVertices);
		ret += String::format("maxMeshPrimitives: %u\n", self->ptr.maxMeshPrimitives);
		ret += String::format("maxViewportCount: %u\n", self->ptr.maxViewportCount);
		ret += String::format("maxClipCullCount: %u\n", self->ptr.maxClipCullCount);
		ret += String::format("maxUniformSize: %" TS_FORMAT_64 "u\n", self->ptr.maxUniformSize);
		ret += String::format("maxStorageSize: %" TS_FORMAT_64 "u\n", self->ptr.maxStorageSize);
		ret += String::format("groupMemory: %u\n", self->ptr.groupMemory);
		ret += String::format("videoMemory: %" TS_FORMAT_64 "u\n", self->ptr.videoMemory);
		ret += String::format("vendorID: 0x%x\n", self->ptr.vendorID);
		ret += String::format("deviceID: 0x%x\n", self->ptr.deviceID);
		ret += String::format("pciBusID: 0x%x\n", self->ptr.pciBusID);
		ret += String::format("pciDomainID: 0x%x\n", self->ptr.pciDomainID);
		ret += String::format("pciDeviceID: 0x%x", self->ptr.pciDeviceID);
		return PyUnicode_FromString(ret.get());
	}
	
	// Tellusim::D3D12Device
	static void pyD3D12Device_base(PYD3D12Device *self) {
		new(&self->base.ptr) Device(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Device(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Device_Type);
	}
	TS_PYAPI D3D12Device &pyD3D12Device_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Device_Type) return ((PYD3D12Device*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Device_get(): can't get D3D12Device from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Device_get(): can't get D3D12Device from None");
		static D3D12Device ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Device_new(const D3D12Device &ptr) {
		PYD3D12Device *ret = (PYD3D12Device*)PyObject_New(PYD3D12Device, &PYD3D12Device_Type);
		new(&ret->ptr) D3D12Device(ptr); pyD3D12Device_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Device_new(D3D12Device &&ptr) {
		PYD3D12Device *ret = (PYD3D12Device*)PyObject_New(PYD3D12Device, &PYD3D12Device_Type);
		new(&ret->ptr) D3D12Device(move(ptr)); pyD3D12Device_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Device_init(PYD3D12Device *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYDevice(object)) {
				new(&self->ptr) D3D12Device(((PYDevice*)object)->ptr);
				pyD3D12Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Device();
			pyD3D12Device_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) D3D12Device(context);
				pyD3D12Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) D3D12Device(surface);
				pyD3D12Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) D3D12Device(window);
				pyD3D12Device_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::D3D12Device(): unknown arguments:\n(void)\n(Context context)\n(Surface surface)\n(Window window)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Device_dealloc(PYD3D12Device *self) {
		self->ptr.~D3D12Device();
		self->base.ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Device_equalPtr(PYD3D12Device *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Device_clonePtr(PYD3D12Device *self, PyObject *args) {
		return pyD3D12Device_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Device_clearPtr(PYD3D12Device *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Device_destroyPtr(PYD3D12Device *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Device_acquirePtr(PYD3D12Device *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Device_unacquirePtr(PYD3D12Device *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Device_isValidPtr(PYD3D12Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Device_isOwnerPtr(PYD3D12Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Device_isConstPtr(PYD3D12Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Device_getCountPtr(PYD3D12Device *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Device_getInternalPtr(PYD3D12Device *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Device_getDevice(PYD3D12Device *self, PyObject *args) {
		return pyDevice_new(self->ptr.getDevice());
	}
	static PyObject *D3D12Device_setBufferState(PYD3D12Device *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		uint32_t state = {};
		static const char *kwlist[] = { "buffer", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &buffer_, &state)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setBufferState(buffer, state);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::setBufferState(): unknown arguments:\n(Buffer buffer, uint32_t state) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Device_setTextureState(PYD3D12Device *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		uint32_t state = {};
		static const char *kwlist[] = { "texture", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &texture_, &state)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.setTextureState(texture, state);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::setTextureState(): unknown arguments:\n(Texture texture, uint32_t state) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Device_getD3D12Device(PYD3D12Device *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D12Device());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::getD3D12Device(): unknown arguments:\n(void) -> ID3D12Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Device_getQueue(PYD3D12Device *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::getQueue(): unknown arguments:\n(void) -> ID3D12CommandQueue*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Device_getCommand(PYD3D12Device *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Device::getCommand(): unknown arguments:\n(void) -> ID3D12GraphicsCommandList*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Device_get_d3d12_device(PYD3D12Device *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D12Device());
	}
	static PyObject *D3D12Device_get_queue(PYD3D12Device *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *D3D12Device_get_command(PYD3D12Device *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *pyD3D12Device_str(PYD3D12Device *self) {
		return PyUnicode_FromString(String::format("D3D12Device Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Device_bool(PYD3D12Device *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Device
	static void pyD3D11Device_base(PYD3D11Device *self) {
		new(&self->base.ptr) Device(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Device(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Device_Type);
	}
	TS_PYAPI D3D11Device &pyD3D11Device_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Device_Type) return ((PYD3D11Device*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Device_get(): can't get D3D11Device from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Device_get(): can't get D3D11Device from None");
		static D3D11Device ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Device_new(const D3D11Device &ptr) {
		PYD3D11Device *ret = (PYD3D11Device*)PyObject_New(PYD3D11Device, &PYD3D11Device_Type);
		new(&ret->ptr) D3D11Device(ptr); pyD3D11Device_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Device_new(D3D11Device &&ptr) {
		PYD3D11Device *ret = (PYD3D11Device*)PyObject_New(PYD3D11Device, &PYD3D11Device_Type);
		new(&ret->ptr) D3D11Device(move(ptr)); pyD3D11Device_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Device_init(PYD3D11Device *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYDevice(object)) {
				new(&self->ptr) D3D11Device(((PYDevice*)object)->ptr);
				pyD3D11Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Device();
			pyD3D11Device_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) D3D11Device(context);
				pyD3D11Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) D3D11Device(surface);
				pyD3D11Device_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) D3D11Device(window);
				pyD3D11Device_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Device::D3D11Device(): unknown arguments:\n(void)\n(Context context)\n(Surface surface)\n(Window window)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Device_dealloc(PYD3D11Device *self) {
		self->ptr.~D3D11Device();
		self->base.ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Device_equalPtr(PYD3D11Device *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Device_clonePtr(PYD3D11Device *self, PyObject *args) {
		return pyD3D11Device_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Device_clearPtr(PYD3D11Device *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Device_destroyPtr(PYD3D11Device *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Device_acquirePtr(PYD3D11Device *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Device_unacquirePtr(PYD3D11Device *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Device_isValidPtr(PYD3D11Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Device_isOwnerPtr(PYD3D11Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Device_isConstPtr(PYD3D11Device *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Device_getCountPtr(PYD3D11Device *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Device_getInternalPtr(PYD3D11Device *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Device_getDevice(PYD3D11Device *self, PyObject *args) {
		return pyDevice_new(self->ptr.getDevice());
	}
	static PyObject *D3D11Device_getD3D11Device(PYD3D11Device *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getD3D11Device());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Device::getD3D11Device(): unknown arguments:\n(void) -> ID3D11Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Device_getCommand(PYD3D11Device *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Device::getCommand(): unknown arguments:\n(void) -> ID3D11DeviceContext*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Device_get_d3d11_device(PYD3D11Device *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getD3D11Device());
	}
	static PyObject *D3D11Device_get_command(PYD3D11Device *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *pyD3D11Device_str(PYD3D11Device *self) {
		return PyUnicode_FromString(String::format("D3D11Device Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Device_bool(PYD3D11Device *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLDevice
	static void pyMTLDevice_base(PYMTLDevice *self) {
		new(&self->base.ptr) Device(self->ptr);
	}
	TS_PYAPI bool isPYMTLDevice(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLDevice_Type);
	}
	TS_PYAPI MTLDevice &pyMTLDevice_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLDevice_Type) return ((PYMTLDevice*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLDevice_get(): can't get MTLDevice from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLDevice_get(): can't get MTLDevice from None");
		static MTLDevice ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLDevice_new(const MTLDevice &ptr) {
		PYMTLDevice *ret = (PYMTLDevice*)PyObject_New(PYMTLDevice, &PYMTLDevice_Type);
		new(&ret->ptr) MTLDevice(ptr); pyMTLDevice_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLDevice_new(MTLDevice &&ptr) {
		PYMTLDevice *ret = (PYMTLDevice*)PyObject_New(PYMTLDevice, &PYMTLDevice_Type);
		new(&ret->ptr) MTLDevice(move(ptr)); pyMTLDevice_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLDevice_init(PYMTLDevice *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYDevice(object)) {
				new(&self->ptr) MTLDevice(((PYDevice*)object)->ptr);
				pyMTLDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLDevice();
			pyMTLDevice_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) MTLDevice(context);
				pyMTLDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) MTLDevice(surface);
				pyMTLDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) MTLDevice(window);
				pyMTLDevice_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::MTLDevice(): unknown arguments:\n(void)\n(Context context)\n(Surface surface)\n(Window window)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLDevice_dealloc(PYMTLDevice *self) {
		self->ptr.~MTLDevice();
		self->base.ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLDevice_equalPtr(PYMTLDevice *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLDevice_clonePtr(PYMTLDevice *self, PyObject *args) {
		return pyMTLDevice_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLDevice_clearPtr(PYMTLDevice *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLDevice_destroyPtr(PYMTLDevice *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLDevice_acquirePtr(PYMTLDevice *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLDevice_unacquirePtr(PYMTLDevice *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLDevice_isValidPtr(PYMTLDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLDevice_isOwnerPtr(PYMTLDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLDevice_isConstPtr(PYMTLDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLDevice_getCountPtr(PYMTLDevice *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLDevice_getInternalPtr(PYMTLDevice *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLDevice_getDevice(PYMTLDevice *self, PyObject *args) {
		return pyDevice_new(self->ptr.getDevice());
	}
	static PyObject *MTLDevice_getMTLDevice(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getMTLDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getMTLDevice(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getQueue(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getQueue(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getCommand(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getCommand(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getEncoder(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getRenderEncoder(PYMTLDevice *self, PyObject *args, PyObject *kwargs) {
		void *descriptor = nullptr;
		static const char *kwlist[] = { "descriptor", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &descriptor)) {
			return PyLong_FromVoidPtr(self->ptr.getRenderEncoder(descriptor));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getRenderEncoder(): unknown arguments:\n(void* descriptor) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getComputeEncoder(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getComputeEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getComputeEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getTracingEncoder(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getTracingEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getTracingEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_getBlitEncoder(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getBlitEncoder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::getBlitEncoder(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_endEncoder(PYMTLDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.endEncoder();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLDevice::endEncoder(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLDevice_get_mtl_device(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getMTLDevice());
	}
	static PyObject *MTLDevice_get_queue(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *MTLDevice_get_command(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *MTLDevice_get_encoder(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getEncoder());
	}
	static PyObject *MTLDevice_get_compute_encoder(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getComputeEncoder());
	}
	static PyObject *MTLDevice_get_tracing_encoder(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getTracingEncoder());
	}
	static PyObject *MTLDevice_get_blit_encoder(PYMTLDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getBlitEncoder());
	}
	static PyObject *pyMTLDevice_str(PYMTLDevice *self) {
		return PyUnicode_FromString(String::format("MTLDevice Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLDevice_bool(PYMTLDevice *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKDevice
	static void pyVKDevice_base(PYVKDevice *self) {
		new(&self->base.ptr) Device(self->ptr);
	}
	TS_PYAPI bool isPYVKDevice(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKDevice_Type);
	}
	TS_PYAPI VKDevice &pyVKDevice_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKDevice_Type) return ((PYVKDevice*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKDevice_get(): can't get VKDevice from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKDevice_get(): can't get VKDevice from None");
		static VKDevice ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKDevice_new(const VKDevice &ptr) {
		PYVKDevice *ret = (PYVKDevice*)PyObject_New(PYVKDevice, &PYVKDevice_Type);
		new(&ret->ptr) VKDevice(ptr); pyVKDevice_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKDevice_new(VKDevice &&ptr) {
		PYVKDevice *ret = (PYVKDevice*)PyObject_New(PYVKDevice, &PYVKDevice_Type);
		new(&ret->ptr) VKDevice(move(ptr)); pyVKDevice_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKDevice_init(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYDevice(object)) {
				new(&self->ptr) VKDevice(((PYDevice*)object)->ptr);
				pyVKDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKDevice();
			pyVKDevice_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) VKDevice(context);
				pyVKDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) VKDevice(surface);
				pyVKDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &window_)) {
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) VKDevice(window);
				pyVKDevice_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::VKDevice(): unknown arguments:\n(void)\n(Context context)\n(Surface surface)\n(Window window)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKDevice_dealloc(PYVKDevice *self) {
		self->ptr.~VKDevice();
		self->base.ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKDevice_equalPtr(PYVKDevice *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKDevice_clonePtr(PYVKDevice *self, PyObject *args) {
		return pyVKDevice_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKDevice_clearPtr(PYVKDevice *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKDevice_destroyPtr(PYVKDevice *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKDevice_acquirePtr(PYVKDevice *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKDevice_unacquirePtr(PYVKDevice *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKDevice_isValidPtr(PYVKDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKDevice_isOwnerPtr(PYVKDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKDevice_isConstPtr(PYVKDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKDevice_getCountPtr(PYVKDevice *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKDevice_getInternalPtr(PYVKDevice *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKDevice_getDevice(PYVKDevice *self, PyObject *args) {
		return pyDevice_new(self->ptr.getDevice());
	}
	static PyObject *VKDevice_setBufferAccess(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *buffer_ = nullptr;
		uint32_t access = {};
		static const char *kwlist[] = { "buffer", "access", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &buffer_, &access)) {
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			self->ptr.setBufferAccess(buffer, access);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::setBufferAccess(): unknown arguments:\n(Buffer buffer, uint32_t access) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_setTextureLayout(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		uint32_t layout = {};
		static const char *kwlist[] = { "texture", "layout", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &texture_, &layout)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.setTextureLayout(texture, layout);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::setTextureLayout(): unknown arguments:\n(Texture texture, uint32_t layout) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_waitVKFence(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		void *fence = nullptr;
		uint64_t timeout = {};
		int32_t reset = {};
		static const char *kwlist[] = { "fence", "timeout", "reset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nKi", (char**)kwlist, &fence, &timeout, &reset)) {
			return PyLong_FromLong(self->ptr.waitVKFence(fence, timeout, (reset != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::waitVKFence(): unknown arguments:\n(void* fence, uint64_t timeout, bool reset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_signalVKFence(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		void *fence = nullptr;
		static const char *kwlist[] = { "fence", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &fence)) {
			return PyLong_FromLong(self->ptr.signalVKFence(fence));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::signalVKFence(): unknown arguments:\n(void* fence) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_waitSemaphore(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		void *semaphore = nullptr;
		uint32_t mask = {};
		static const char *kwlist[] = { "semaphore", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &semaphore, &mask)) {
			self->ptr.waitSemaphore(semaphore, mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::waitSemaphore(): unknown arguments:\n(void* semaphore, uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_signalSemaphore(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		void *semaphore = nullptr;
		static const char *kwlist[] = { "semaphore", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &semaphore)) {
			self->ptr.signalSemaphore(semaphore);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::signalSemaphore(): unknown arguments:\n(void* semaphore) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_hasMemoryType(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = {};
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasMemoryType(flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::hasMemoryType(): unknown arguments:\n(uint32_t flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getMemoryIndex(PYVKDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t types = {};
		uint32_t flags = {};
		static const char *kwlist[] = { "types", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &types, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.getMemoryIndex(types, flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getMemoryIndex(): unknown arguments:\n(uint32_t types, uint32_t flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getInstance(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInstance());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getInstance(): unknown arguments:\n(void) -> VkInstance\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getAdapter(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAdapter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getAdapter(): unknown arguments:\n(void) -> VkPhysicalDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getVKDevice(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVKDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getVKDevice(): unknown arguments:\n(void) -> VkDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getQueue(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getQueue(): unknown arguments:\n(void) -> VkQueue\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getCommand(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getCommand(): unknown arguments:\n(void) -> VkCommandBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_getFamily(PYVKDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFamily());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKDevice::getFamily(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKDevice_get_instance(PYVKDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInstance());
	}
	static PyObject *VKDevice_get_adapter(PYVKDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAdapter());
	}
	static PyObject *VKDevice_get_vk_device(PYVKDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVKDevice());
	}
	static PyObject *VKDevice_get_queue(PYVKDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *VKDevice_get_command(PYVKDevice *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *VKDevice_get_family(PYVKDevice *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFamily());
	}
	static PyObject *pyVKDevice_str(PYVKDevice *self) {
		return PyUnicode_FromString(String::format("VKDevice Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKDevice_bool(PYVKDevice *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUDevice
	static void pyFUDevice_base(PYFUDevice *self) {
		new(&self->base.ptr) Device(self->ptr);
	}
	TS_PYAPI bool isPYFUDevice(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUDevice_Type);
	}
	TS_PYAPI FUDevice &pyFUDevice_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUDevice_Type) return ((PYFUDevice*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUDevice_get(): can't get FUDevice from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUDevice_get(): can't get FUDevice from None");
		static FUDevice ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUDevice_new(const FUDevice &ptr) {
		PYFUDevice *ret = (PYFUDevice*)PyObject_New(PYFUDevice, &PYFUDevice_Type);
		new(&ret->ptr) FUDevice(ptr); pyFUDevice_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUDevice_new(FUDevice &&ptr) {
		PYFUDevice *ret = (PYFUDevice*)PyObject_New(PYFUDevice, &PYFUDevice_Type);
		new(&ret->ptr) FUDevice(move(ptr)); pyFUDevice_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUDevice_init(PYFUDevice *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYDevice(object)) {
				new(&self->ptr) FUDevice(((PYDevice*)object)->ptr);
				pyFUDevice_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUDevice();
			pyFUDevice_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *devices_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "devices", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &devices_, &owner)) {
				if(!isPYArray(devices_)) break;
				Array<Device> devices; Array<PyObject*> devices__; pyArray_get(devices_, devices__);
				for(PyObject *object : devices__) devices.append(pyDevice_get(object));
				new(&self->ptr) FUDevice(devices, (owner != 0));
				pyFUDevice_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUDevice::FUDevice(): unknown arguments:\n(void)\n(Array<Device> devices, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUDevice_dealloc(PYFUDevice *self) {
		self->ptr.~FUDevice();
		self->base.ptr.~Device();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUDevice_equalPtr(PYFUDevice *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUDevice_clonePtr(PYFUDevice *self, PyObject *args) {
		return pyFUDevice_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUDevice_clearPtr(PYFUDevice *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUDevice_destroyPtr(PYFUDevice *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUDevice_acquirePtr(PYFUDevice *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUDevice_unacquirePtr(PYFUDevice *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUDevice_isValidPtr(PYFUDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUDevice_isOwnerPtr(PYFUDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUDevice_isConstPtr(PYFUDevice *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUDevice_getCountPtr(PYFUDevice *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUDevice_getInternalPtr(PYFUDevice *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUDevice_getDevice(PYFUDevice *self, PyObject *args) {
		return pyDevice_new(self->ptr.getDevice());
	}
	static PyObject *FUDevice_setMask(PYFUDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUDevice::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUDevice_getMask(PYFUDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUDevice::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUDevice_getNumDevices(PYFUDevice *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumDevices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUDevice::getNumDevices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUDevice_getDevice(PYFUDevice *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyDevice_new(self->ptr.getDevice(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyDevice_new(self->ptr.getDevice(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUDevice::getDevice(): unknown arguments:\n(uint32_t index) -> const Device\n(uint32_t index) -> Device\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUDevice_get_mask(PYFUDevice *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUDevice_get_num_devices(PYFUDevice *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumDevices());
	}
	static PyObject *pyFUDevice_str(PYFUDevice *self) {
		return PyUnicode_FromString(String::format("FUDevice Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUDevice_bool(PYFUDevice *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Kernel
	TS_PYAPI bool isPYKernel(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYKernel_Type || type == &PYD3D12Kernel_Type || type == &PYMTLKernel_Type || type == &PYFUKernel_Type);
	}
	TS_PYAPI Kernel &pyKernel_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYKernel_Type || type == &PYD3D12Kernel_Type || type == &PYMTLKernel_Type || type == &PYFUKernel_Type) return ((PYKernel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Kernel_get(): can't get Kernel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Kernel_get(): can't get Kernel from None");
		static Kernel ret;
		return ret;
	}
	TS_PYAPI PyObject *pyKernel_new(const Kernel &ptr) {
		PYKernel *ret = (PYKernel*)PyObject_New(PYKernel, &PYKernel_Type);
		new(&ret->ptr) Kernel(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyKernel_new(Kernel &&ptr) {
		PYKernel *ret = (PYKernel*)PyObject_New(PYKernel, &PYKernel_Type);
		new(&ret->ptr) Kernel(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyKernel_init(PYKernel *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Kernel();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::Kernel(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyKernel_dealloc(PYKernel *self) {
		self->ptr.~Kernel();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyKernel_equalPtr(PYKernel *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyKernel_clonePtr(PYKernel *self, PyObject *args) {
		return pyKernel_new(self->ptr.clonePtr());
	}
	static PyObject *pyKernel_clearPtr(PYKernel *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyKernel_destroyPtr(PYKernel *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyKernel_acquirePtr(PYKernel *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyKernel_unacquirePtr(PYKernel *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyKernel_isValidPtr(PYKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyKernel_isOwnerPtr(PYKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyKernel_isConstPtr(PYKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyKernel_getCountPtr(PYKernel *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyKernel_getInternalPtr(PYKernel *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Kernel_getPlatform(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getPlatformName(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getIndex(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_clear(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_isCreated(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setName(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getName(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_create(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.create());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::create(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setParameters(PYKernel *self, PyObject *args, PyObject *kwargs) {
		PyObject *kernel_ = nullptr;
		static const char *kwlist[] = { "kernel", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &kernel_)) {
			if(!isPYKernel(kernel_)) break;
			const Kernel &kernel = pyKernel_get(kernel_);
			self->ptr.setParameters(kernel);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setParameters(): unknown arguments:\n(const Kernel kernel) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_saveState(PYKernel *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.saveState(stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::saveState(): unknown arguments:\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setShader(PYKernel *self, PyObject *args, PyObject *kwargs) {
		PyObject *shader_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "shader", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &shader_, &owner)) {
			if(!isPYShader(shader_)) break;
			Shader &shader = pyShader_get(shader_);
			self->ptr.setShader(shader, (owner != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setShader(): unknown arguments:\n(Shader shader, bool owner) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getComputeShader(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getComputeShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getComputeShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_loadShader(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", (char**)kwlist, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShader(name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::loadShader(): unknown arguments:\n(const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_loadShaderGLSL(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", (char**)kwlist, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShaderGLSL(name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::loadShaderGLSL(): unknown arguments:\n(const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_loadShaderSPIRV(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.loadShaderSPIRV(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::loadShaderSPIRV(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_createShader(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", (char**)kwlist, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShader(src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::createShader(): unknown arguments:\n(const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_createShaderGLSL(PYKernel *self, PyObject *args, PyObject *kwargs) {
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", (char**)kwlist, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShaderGLSL(src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::createShaderGLSL(): unknown arguments:\n(const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_createShaderSPIRV(PYKernel *self, PyObject *args, PyObject *kwargs) {
		PyObject *data_ = nullptr;
		static const char *kwlist[] = { "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &data_)) {
			if(!isPYArray(data_)) break;
			Array<uint32_t> data; pyArray_get(data_, data);
			return PyLong_FromLong(self->ptr.createShaderSPIRV(data));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::createShaderSPIRV(): unknown arguments:\n(Array<uint32_t> data) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addSampler(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.addSampler());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addSampler(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSamplers(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return pyKernel_new(self->ptr.setSamplers(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSamplers(): unknown arguments:\n(uint32_t num) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumSamplers(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumSamplers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSamplerOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setSamplerOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSamplerOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getSamplerOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getSamplerOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSamplerArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyKernel_new(self->ptr.setSamplerArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSamplerArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getSamplerArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getSamplerArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addTexture(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.addTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addTexture(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTextures(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return pyKernel_new(self->ptr.setTextures(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTextures(): unknown arguments:\n(uint32_t num) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumTextures(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumTextures(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTextureOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setTextureOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTextureOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTextureOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTextureOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTextureArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyKernel_new(self->ptr.setTextureArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTextureArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTextureArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTextureArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addSurface(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.addSurface());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addSurface(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSurfaces(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return pyKernel_new(self->ptr.setSurfaces(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSurfaces(): unknown arguments:\n(uint32_t num) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumSurfaces(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumSurfaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSurfaceOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setSurfaceOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSurfaceOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getSurfaceOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getSurfaceOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setSurfaceArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyKernel_new(self->ptr.setSurfaceArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setSurfaceArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getSurfaceArray(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getSurfaceArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addUniform(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addUniform((BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addUniform(): unknown arguments:\n(BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setUniforms(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "num", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &num, &flags)) {
			return pyKernel_new(self->ptr.setUniforms(num, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setUniforms(): unknown arguments:\n(uint32_t num, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumUniforms(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumUniforms(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setUniformOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setUniformOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setUniformOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getUniformOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getUniformOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setUniformFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyKernel_new(self->ptr.setUniformFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setUniformFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getUniformFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getUniformFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addStorage(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addStorage((BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addStorage(): unknown arguments:\n(BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setStorages(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "num", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &num, &flags)) {
			return pyKernel_new(self->ptr.setStorages(num, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setStorages(): unknown arguments:\n(uint32_t num, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumStorages(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumStorages(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setStorageOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setStorageOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setStorageOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getStorageOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getStorageOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setStorageFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyKernel_new(self->ptr.setStorageFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setStorageFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getStorageFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getStorageFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addTracing(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.addTracing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addTracing(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTracings(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return pyKernel_new(self->ptr.setTracings(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTracings(): unknown arguments:\n(uint32_t num) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumTracings(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumTracings(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTracingOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setTracingOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTracingOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTracingOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTracingOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addTexel(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.addTexel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addTexel(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTexels(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t num = {};
		static const char *kwlist[] = { "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num)) {
			return pyKernel_new(self->ptr.setTexels(num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTexels(): unknown arguments:\n(uint32_t num) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumTexels(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumTexels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTexelOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setTexelOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTexelOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTexelOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTexelOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_addTable(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t size = {};
		static const char *kwlist[] = { "type", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &type, &size)) {
			return PyLong_FromUnsignedLong(self->ptr.addTable((TableType)type, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::addTable(): unknown arguments:\n(TableType type, uint32_t size) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getNumTables(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTables());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getNumTables(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTableOffset(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyKernel_new(self->ptr.setTableOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTableOffset(): unknown arguments:\n(uint32_t offset) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTableOffset(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTableOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTableType(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t type = 0;
		uint32_t size = {};
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "type", "size", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &index, &type, &size, &flags)) {
			return pyKernel_new(self->ptr.setTableType(index, (TableType)type, size, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTableType(): unknown arguments:\n(uint32_t index, TableType type, uint32_t size, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTableType(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableType(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTableType(): unknown arguments:\n(uint32_t index) -> TableType\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTableSize(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableSize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTableSize(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setTableFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyKernel_new(self->ptr.setTableFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setTableFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getTableFlags(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getTableFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_setGroupSize(PYKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = 1;
		uint32_t depth = 1;
		static const char *kwlist[] = { "width", "height", "depth", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|II", (char**)kwlist, &width, &height, &depth)) {
			self->ptr.setGroupSize(width, height, depth);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::setGroupSize(): unknown arguments:\n(uint32_t width, uint32_t height, uint32_t depth) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getGroupSizeX(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSizeX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getGroupSizeX(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getGroupSizeY(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSizeY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getGroupSizeY(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_getGroupSizeZ(PYKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSizeZ());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Kernel::getGroupSizeZ(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Kernel_get_platform(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Kernel_get_platform_name(PYKernel *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Kernel_get_index(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Kernel_get_name(PYKernel *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Kernel_get_compute_shader(PYKernel *self, void *offset) {
		return pyShader_new(self->ptr.getComputeShader());
	}
	static PyObject *Kernel_get_num_samplers(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
	}
	static PyObject *Kernel_get_sampler_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
	}
	static PyObject *Kernel_get_num_textures(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
	}
	static PyObject *Kernel_get_texture_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
	}
	static PyObject *Kernel_get_num_surfaces(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
	}
	static PyObject *Kernel_get_surface_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
	}
	static PyObject *Kernel_get_num_uniforms(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
	}
	static PyObject *Kernel_get_uniform_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
	}
	static PyObject *Kernel_get_num_storages(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
	}
	static PyObject *Kernel_get_storage_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
	}
	static PyObject *Kernel_get_num_tracings(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
	}
	static PyObject *Kernel_get_tracing_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
	}
	static PyObject *Kernel_get_num_texels(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
	}
	static PyObject *Kernel_get_texel_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
	}
	static PyObject *Kernel_get_num_tables(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTables());
	}
	static PyObject *Kernel_get_table_offset(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
	}
	static PyObject *Kernel_get_group_size_x(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSizeX());
	}
	static PyObject *Kernel_get_group_size_y(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSizeY());
	}
	static PyObject *Kernel_get_group_size_z(PYKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSizeZ());
	}
	static PyObject *pyKernel_str(PYKernel *self) {
		return PyUnicode_FromString(String::format("Kernel Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyKernel_bool(PYKernel *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Kernel
	static void pyD3D12Kernel_base(PYD3D12Kernel *self) {
		new(&self->base.ptr) Kernel(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Kernel(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Kernel_Type);
	}
	TS_PYAPI D3D12Kernel &pyD3D12Kernel_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Kernel_Type) return ((PYD3D12Kernel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Kernel_get(): can't get D3D12Kernel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Kernel_get(): can't get D3D12Kernel from None");
		static D3D12Kernel ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Kernel_new(const D3D12Kernel &ptr) {
		PYD3D12Kernel *ret = (PYD3D12Kernel*)PyObject_New(PYD3D12Kernel, &PYD3D12Kernel_Type);
		new(&ret->ptr) D3D12Kernel(ptr); pyD3D12Kernel_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Kernel_new(D3D12Kernel &&ptr) {
		PYD3D12Kernel *ret = (PYD3D12Kernel*)PyObject_New(PYD3D12Kernel, &PYD3D12Kernel_Type);
		new(&ret->ptr) D3D12Kernel(move(ptr)); pyD3D12Kernel_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Kernel_init(PYD3D12Kernel *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYKernel(object)) {
				new(&self->ptr) D3D12Kernel(((PYKernel*)object)->ptr);
				pyD3D12Kernel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Kernel();
			pyD3D12Kernel_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Kernel::D3D12Kernel(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Kernel_dealloc(PYD3D12Kernel *self) {
		self->ptr.~D3D12Kernel();
		self->base.ptr.~Kernel();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Kernel_equalPtr(PYD3D12Kernel *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Kernel_clonePtr(PYD3D12Kernel *self, PyObject *args) {
		return pyD3D12Kernel_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Kernel_clearPtr(PYD3D12Kernel *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Kernel_destroyPtr(PYD3D12Kernel *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Kernel_acquirePtr(PYD3D12Kernel *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Kernel_unacquirePtr(PYD3D12Kernel *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Kernel_isValidPtr(PYD3D12Kernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Kernel_isOwnerPtr(PYD3D12Kernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Kernel_isConstPtr(PYD3D12Kernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Kernel_getCountPtr(PYD3D12Kernel *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Kernel_getInternalPtr(PYD3D12Kernel *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Kernel_getKernel(PYD3D12Kernel *self, PyObject *args) {
		return pyKernel_new(self->ptr.getKernel());
	}
	static PyObject *D3D12Kernel_getRootSignature(PYD3D12Kernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRootSignature());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Kernel::getRootSignature(): unknown arguments:\n(void) -> ID3D12RootSignature*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Kernel_get_root_signature(PYD3D12Kernel *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRootSignature());
	}
	static PyObject *pyD3D12Kernel_str(PYD3D12Kernel *self) {
		return PyUnicode_FromString(String::format("D3D12Kernel Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Kernel_bool(PYD3D12Kernel *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLKernel
	static void pyMTLKernel_base(PYMTLKernel *self) {
		new(&self->base.ptr) Kernel(self->ptr);
	}
	TS_PYAPI bool isPYMTLKernel(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLKernel_Type);
	}
	TS_PYAPI MTLKernel &pyMTLKernel_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLKernel_Type) return ((PYMTLKernel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLKernel_get(): can't get MTLKernel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLKernel_get(): can't get MTLKernel from None");
		static MTLKernel ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLKernel_new(const MTLKernel &ptr) {
		PYMTLKernel *ret = (PYMTLKernel*)PyObject_New(PYMTLKernel, &PYMTLKernel_Type);
		new(&ret->ptr) MTLKernel(ptr); pyMTLKernel_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLKernel_new(MTLKernel &&ptr) {
		PYMTLKernel *ret = (PYMTLKernel*)PyObject_New(PYMTLKernel, &PYMTLKernel_Type);
		new(&ret->ptr) MTLKernel(move(ptr)); pyMTLKernel_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLKernel_init(PYMTLKernel *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYKernel(object)) {
				new(&self->ptr) MTLKernel(((PYKernel*)object)->ptr);
				pyMTLKernel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLKernel();
			pyMTLKernel_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLKernel::MTLKernel(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLKernel_dealloc(PYMTLKernel *self) {
		self->ptr.~MTLKernel();
		self->base.ptr.~Kernel();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLKernel_equalPtr(PYMTLKernel *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLKernel_clonePtr(PYMTLKernel *self, PyObject *args) {
		return pyMTLKernel_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLKernel_clearPtr(PYMTLKernel *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLKernel_destroyPtr(PYMTLKernel *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLKernel_acquirePtr(PYMTLKernel *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLKernel_unacquirePtr(PYMTLKernel *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLKernel_isValidPtr(PYMTLKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLKernel_isOwnerPtr(PYMTLKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLKernel_isConstPtr(PYMTLKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLKernel_getCountPtr(PYMTLKernel *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLKernel_getInternalPtr(PYMTLKernel *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLKernel_getKernel(PYMTLKernel *self, PyObject *args) {
		return pyKernel_new(self->ptr.getKernel());
	}
	static PyObject *MTLKernel_setIndirect(PYMTLKernel *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setIndirect((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLKernel::setIndirect(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLKernel_isIndirect(PYMTLKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIndirect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLKernel::isIndirect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLKernel_getComputeFunction(PYMTLKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getComputeFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLKernel::getComputeFunction(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLKernel_get_compute_function(PYMTLKernel *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getComputeFunction());
	}
	static PyObject *pyMTLKernel_str(PYMTLKernel *self) {
		return PyUnicode_FromString(String::format("MTLKernel Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLKernel_bool(PYMTLKernel *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUKernel
	static void pyFUKernel_base(PYFUKernel *self) {
		new(&self->base.ptr) Kernel(self->ptr);
	}
	TS_PYAPI bool isPYFUKernel(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUKernel_Type);
	}
	TS_PYAPI FUKernel &pyFUKernel_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUKernel_Type) return ((PYFUKernel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUKernel_get(): can't get FUKernel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUKernel_get(): can't get FUKernel from None");
		static FUKernel ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUKernel_new(const FUKernel &ptr) {
		PYFUKernel *ret = (PYFUKernel*)PyObject_New(PYFUKernel, &PYFUKernel_Type);
		new(&ret->ptr) FUKernel(ptr); pyFUKernel_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUKernel_new(FUKernel &&ptr) {
		PYFUKernel *ret = (PYFUKernel*)PyObject_New(PYFUKernel, &PYFUKernel_Type);
		new(&ret->ptr) FUKernel(move(ptr)); pyFUKernel_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUKernel_init(PYFUKernel *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYKernel(object)) {
				new(&self->ptr) FUKernel(((PYKernel*)object)->ptr);
				pyFUKernel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUKernel();
			pyFUKernel_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *kernels_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "kernels", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &kernels_, &owner)) {
				if(!isPYArray(kernels_)) break;
				Array<Kernel> kernels; Array<PyObject*> kernels__; pyArray_get(kernels_, kernels__);
				for(PyObject *object : kernels__) kernels.append(pyKernel_get(object));
				new(&self->ptr) FUKernel(kernels, (owner != 0));
				pyFUKernel_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUKernel::FUKernel(): unknown arguments:\n(void)\n(Array<Kernel> kernels, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUKernel_dealloc(PYFUKernel *self) {
		self->ptr.~FUKernel();
		self->base.ptr.~Kernel();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUKernel_equalPtr(PYFUKernel *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUKernel_clonePtr(PYFUKernel *self, PyObject *args) {
		return pyFUKernel_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUKernel_clearPtr(PYFUKernel *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUKernel_destroyPtr(PYFUKernel *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUKernel_acquirePtr(PYFUKernel *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUKernel_unacquirePtr(PYFUKernel *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUKernel_isValidPtr(PYFUKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUKernel_isOwnerPtr(PYFUKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUKernel_isConstPtr(PYFUKernel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUKernel_getCountPtr(PYFUKernel *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUKernel_getInternalPtr(PYFUKernel *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUKernel_getKernel(PYFUKernel *self, PyObject *args) {
		return pyKernel_new(self->ptr.getKernel());
	}
	static PyObject *FUKernel_setMask(PYFUKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUKernel::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUKernel_getMask(PYFUKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUKernel::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUKernel_getNumKernels(PYFUKernel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumKernels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUKernel::getNumKernels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUKernel_getKernel(PYFUKernel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyKernel_new(self->ptr.getKernel(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyKernel_new(self->ptr.getKernel(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUKernel::getKernel(): unknown arguments:\n(uint32_t index) -> const Kernel\n(uint32_t index) -> Kernel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUKernel_get_mask(PYFUKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUKernel_get_num_kernels(PYFUKernel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumKernels());
	}
	static PyObject *pyFUKernel_str(PYFUKernel *self) {
		return PyUnicode_FromString(String::format("FUKernel Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUKernel_bool(PYFUKernel *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Pipeline
	TS_PYAPI bool isPYPipeline(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYPipeline_Type || type == &PYD3D12Pipeline_Type || type == &PYMTLPipeline_Type || type == &PYFUPipeline_Type);
	}
	TS_PYAPI Pipeline &pyPipeline_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYPipeline_Type || type == &PYD3D12Pipeline_Type || type == &PYMTLPipeline_Type || type == &PYFUPipeline_Type) return ((PYPipeline*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Pipeline_get(): can't get Pipeline from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Pipeline_get(): can't get Pipeline from None");
		static Pipeline ret;
		return ret;
	}
	TS_PYAPI PyObject *pyPipeline_new(const Pipeline &ptr) {
		PYPipeline *ret = (PYPipeline*)PyObject_New(PYPipeline, &PYPipeline_Type);
		new(&ret->ptr) Pipeline(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyPipeline_new(Pipeline &&ptr) {
		PYPipeline *ret = (PYPipeline*)PyObject_New(PYPipeline, &PYPipeline_Type);
		new(&ret->ptr) Pipeline(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyPipeline_init(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Pipeline();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::Pipeline(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyPipeline_dealloc(PYPipeline *self) {
		self->ptr.~Pipeline();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyPipeline_equalPtr(PYPipeline *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyPipeline_clonePtr(PYPipeline *self, PyObject *args) {
		return pyPipeline_new(self->ptr.clonePtr());
	}
	static PyObject *pyPipeline_clearPtr(PYPipeline *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPipeline_destroyPtr(PYPipeline *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPipeline_acquirePtr(PYPipeline *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPipeline_unacquirePtr(PYPipeline *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPipeline_isValidPtr(PYPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyPipeline_isOwnerPtr(PYPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyPipeline_isConstPtr(PYPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyPipeline_getCountPtr(PYPipeline *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyPipeline_getInternalPtr(PYPipeline *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Pipeline_getPlatform(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getPlatformName(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getIndex(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_clear(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_isCreated(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setName(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getName(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_create(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.create());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::create(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setParameters(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
			if(!isPYPipeline(pipeline_)) break;
			const Pipeline &pipeline = pyPipeline_get(pipeline_);
			self->ptr.setParameters(pipeline);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setParameters(): unknown arguments:\n(const Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_saveState(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.saveState(stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::saveState(): unknown arguments:\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addShader(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		PyObject *shader_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "shader", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &shader_, &owner)) {
			if(!isPYShader(shader_)) break;
			Shader &shader = pyShader_get(shader_);
			self->ptr.addShader(shader, (owner != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addShader(): unknown arguments:\n(Shader shader, bool owner) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getVertexShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getVertexShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getVertexShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getControlShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getControlShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getControlShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getEvaluateShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getEvaluateShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getEvaluateShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getGeometryShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getGeometryShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getGeometryShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getFragmentShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getFragmentShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getFragmentShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTaskShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getTaskShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTaskShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getMeshShader(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getMeshShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getMeshShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_loadShader(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShader((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::loadShader(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_loadShaderGLSL(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShaderGLSL((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::loadShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_loadShaderSPIRV(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		static const char *kwlist[] = { "type", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &type, &name)) {
			return PyLong_FromLong(self->ptr.loadShaderSPIRV((Shader::Type)type, name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::loadShaderSPIRV(): unknown arguments:\n(Shader.Type type, const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_createShader(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShader((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::createShader(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_createShaderGLSL(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShaderGLSL((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::createShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_createShaderSPIRV(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		PyObject *data_ = nullptr;
		static const char *kwlist[] = { "type", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &type, &data_)) {
			if(!isPYArray(data_)) break;
			Array<uint32_t> data; pyArray_get(data_, data);
			return PyLong_FromLong(self->ptr.createShaderSPIRV((Shader::Type)type, data));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::createShaderSPIRV(): unknown arguments:\n(Shader.Type type, Array<uint32_t> data) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addSampler(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addSampler((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addSampler(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumSamplers(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumSamplers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSamplerOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setSamplerOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSamplerOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSamplerOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSamplerOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSamplerMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyPipeline_new(self->ptr.setSamplerMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSamplerMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSamplerMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSamplerMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSamplerMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyPipeline_new(self->ptr.setSamplerMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSamplerMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSamplerMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSamplerMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSamplerArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyPipeline_new(self->ptr.setSamplerArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSamplerArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSamplerArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSamplerArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addTexture(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTexture((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addTexture(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumTextures(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumTextures(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTextureOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setTextureOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTextureOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTextureOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTextureOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTextureMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyPipeline_new(self->ptr.setTextureMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTextureMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTextureMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTextureMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTextureMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyPipeline_new(self->ptr.setTextureMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTextureMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTextureMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTextureMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTextureArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyPipeline_new(self->ptr.setTextureArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTextureArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTextureArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTextureArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addSurface(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addSurface((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addSurface(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumSurfaces(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumSurfaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSurfaceOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setSurfaceOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSurfaceOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSurfaceOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSurfaceOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSurfaceMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyPipeline_new(self->ptr.setSurfaceMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSurfaceMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSurfaceMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSurfaceMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSurfaceMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyPipeline_new(self->ptr.setSurfaceMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSurfaceMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSurfaceMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSurfaceMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSurfaceArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyPipeline_new(self->ptr.setSurfaceArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSurfaceArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSurfaceArray(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSurfaceArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addUniform(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addUniform((Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addUniform(): unknown arguments:\n(Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumUniforms(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumUniforms(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setUniformOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setUniformOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setUniformOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getUniformOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getUniformOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setUniformMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setUniformMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setUniformMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getUniformMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getUniformMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setUniformMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "num", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &index, &num, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setUniformMasks(index, num, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setUniformMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getUniformMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getUniformMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setUniformFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyPipeline_new(self->ptr.setUniformFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setUniformFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getUniformFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getUniformFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addStorage(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addStorage((Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addStorage(): unknown arguments:\n(Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumStorages(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumStorages(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStorageOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setStorageOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStorageOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStorageOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStorageOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStorageMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setStorageMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStorageMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStorageMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStorageMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStorageMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "num", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &index, &num, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setStorageMasks(index, num, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStorageMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStorageMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStorageMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStorageFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyPipeline_new(self->ptr.setStorageFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStorageFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStorageFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStorageFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addTracing(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTracing((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addTracing(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumTracings(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumTracings(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTracingOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setTracingOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTracingOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTracingOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTracingOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTracingMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyPipeline_new(self->ptr.setTracingMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTracingMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTracingMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTracingMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTracingMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "num", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &num, &mask)) {
			return pyPipeline_new(self->ptr.setTracingMasks(index, num, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTracingMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTracingMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTracingMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addTexel(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTexel((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addTexel(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumTexels(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumTexels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTexelOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setTexelOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTexelOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTexelOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTexelOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTexelMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyPipeline_new(self->ptr.setTexelMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTexelMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTexelMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTexelMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTexelMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "num", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &num, &mask)) {
			return pyPipeline_new(self->ptr.setTexelMasks(index, num, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTexelMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTexelMasks(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTexelMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addTable(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t size = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "type", "size", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &type, &size, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addTable((TableType)type, size, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addTable(): unknown arguments:\n(TableType type, uint32_t size, Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumTables(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTables());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumTables(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTableOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyPipeline_new(self->ptr.setTableOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTableOffset(): unknown arguments:\n(uint32_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTableOffset(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTableOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTableType(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t type = 0;
		uint32_t size = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "type", "size", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &index, &type, &size, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setTableType(index, (TableType)type, size, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTableType(): unknown arguments:\n(uint32_t index, TableType type, uint32_t size, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTableType(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableType(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTableType(): unknown arguments:\n(uint32_t index) -> TableType\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTableSize(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableSize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTableSize(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTableMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyPipeline_new(self->ptr.setTableMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTableMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTableMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTableMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setTableFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyPipeline_new(self->ptr.setTableFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setTableFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getTableFlags(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getTableFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumVertices(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumVertices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getVertexStride(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexStride(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getVertexStride(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getVertexRate(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexRate(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getVertexRate(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_addAttribute(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t attribute = 0;
		uint32_t format = 0;
		uint32_t vertex = {};
		size_t offset = {};
		size_t stride = {};
		uint32_t rate = 0;
		static const char *kwlist[] = { "attribute", "format", "vertex", "offset", "stride", "rate", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIInn|I", (char**)kwlist, &attribute, &format, &vertex, &offset, &stride, &rate)) {
			return PyLong_FromUnsignedLong(self->ptr.addAttribute((Pipeline::Attribute)attribute, (Format)format, vertex, offset, stride, rate));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::addAttribute(): unknown arguments:\n(Pipeline.Attribute attribute, Format format, uint32_t vertex, size_t offset, size_t stride, uint32_t rate) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttribute(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t attribute = 0;
		uint32_t format = 0;
		uint32_t vertex = {};
		size_t offset = {};
		size_t stride = {};
		uint32_t rate = 0;
		static const char *kwlist[] = { "index", "attribute", "format", "vertex", "offset", "stride", "rate", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIIInn|I", (char**)kwlist, &index, &attribute, &format, &vertex, &offset, &stride, &rate)) {
			return pyPipeline_new(self->ptr.setAttribute(index, (Pipeline::Attribute)attribute, (Format)format, vertex, offset, stride, rate));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttribute(): unknown arguments:\n(uint32_t index, Pipeline.Attribute attribute, Format format, uint32_t vertex, size_t offset, size_t stride, uint32_t rate) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeType(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t attribute = 0;
		static const char *kwlist[] = { "index", "attribute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &attribute)) {
			return pyPipeline_new(self->ptr.setAttributeType(index, (Pipeline::Attribute)attribute));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeType(): unknown arguments:\n(uint32_t index, Pipeline.Attribute attribute) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeFormat(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t format = 0;
		static const char *kwlist[] = { "index", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &format)) {
			return pyPipeline_new(self->ptr.setAttributeFormat(index, (Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeFormat(): unknown arguments:\n(uint32_t index, Format format) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeVertex(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t vertex = {};
		static const char *kwlist[] = { "index", "vertex", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &vertex)) {
			return pyPipeline_new(self->ptr.setAttributeVertex(index, vertex));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeVertex(): unknown arguments:\n(uint32_t index, uint32_t vertex) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t offset = {};
		static const char *kwlist[] = { "index", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &offset)) {
			return pyPipeline_new(self->ptr.setAttributeOffset(index, offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeOffset(): unknown arguments:\n(uint32_t index, size_t offset) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeStride(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		size_t stride = {};
		static const char *kwlist[] = { "index", "stride", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &index, &stride)) {
			return pyPipeline_new(self->ptr.setAttributeStride(index, stride));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeStride(): unknown arguments:\n(uint32_t index, size_t stride) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAttributeRate(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t rate = {};
		static const char *kwlist[] = { "index", "rate", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &rate)) {
			return pyPipeline_new(self->ptr.setAttributeRate(index, rate));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAttributeRate(): unknown arguments:\n(uint32_t index, uint32_t rate) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumAttributes(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumAttributes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumAttributes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeType(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeType(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeType(): unknown arguments:\n(uint32_t index) -> Pipeline::Attribute\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeFormat(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeFormat(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeFormat(): unknown arguments:\n(uint32_t index) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeVertex(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeVertex(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeVertex(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeOffset(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeOffset(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeOffset(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeStride(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeStride(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeStride(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAttributeRate(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getAttributeRate(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAttributeRate(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setPrimitive(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t primitive = 0;
		static const char *kwlist[] = { "primitive", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &primitive)) {
			self->ptr.setPrimitive((Pipeline::Primitive)primitive);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setPrimitive(): unknown arguments:\n(Pipeline.Primitive primitive) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getPrimitive(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPrimitive());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getPrimitive(): unknown arguments:\n(void) -> Pipeline::Primitive\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setFillMode(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setFillMode((Pipeline::FillMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setFillMode(): unknown arguments:\n(Pipeline.FillMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getFillMode(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFillMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getFillMode(): unknown arguments:\n(void) -> Pipeline::FillMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setCullMode(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setCullMode((Pipeline::CullMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setCullMode(): unknown arguments:\n(Pipeline.CullMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getCullMode(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCullMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getCullMode(): unknown arguments:\n(void) -> Pipeline::CullMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setFrontMode(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setFrontMode((Pipeline::FrontMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setFrontMode(): unknown arguments:\n(Pipeline.FrontMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getFrontMode(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFrontMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getFrontMode(): unknown arguments:\n(void) -> Pipeline::FrontMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthBias(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		float32_t bias = {};
		float32_t slope = {};
		float32_t clamp = 0.0f;
		static const char *kwlist[] = { "bias", "slope", "clamp", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &bias, &slope, &clamp)) {
			self->ptr.setDepthBias(bias, slope, clamp);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthBias(): unknown arguments:\n(float32_t bias, float32_t slope, float32_t clamp) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthBias(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDepthBias());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthBias(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthSlope(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDepthSlope());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthSlope(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthClamp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getDepthClamp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthClamp(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setMultisample(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t multisample = {};
		static const char *kwlist[] = { "multisample", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &multisample)) {
			self->ptr.setMultisample(multisample);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setMultisample(): unknown arguments:\n(uint32_t multisample) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getMultisample(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSampleMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t sample_mask = {};
		static const char *kwlist[] = { "sample_mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &sample_mask)) {
			self->ptr.setSampleMask(sample_mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSampleMask(): unknown arguments:\n(uint32_t sample_mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSampleMask(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSampleMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSampleMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthClip(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setDepthClip((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthClip(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthClip(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDepthClip());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthClip(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthReplace(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setDepthReplace((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthReplace(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthReplace(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getDepthReplace());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthReplace(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setScissorTest(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setScissorTest((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setScissorTest(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getScissorTest(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getScissorTest());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getScissorTest(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setRasterDiscard(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setRasterDiscard((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setRasterDiscard(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getRasterDiscard(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getRasterDiscard());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getRasterDiscard(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setSampleShading(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setSampleShading((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setSampleShading(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getSampleShading(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getSampleShading());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getSampleShading(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setAlphaToCoverage(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setAlphaToCoverage((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setAlphaToCoverage(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getAlphaToCoverage(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getAlphaToCoverage());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getAlphaToCoverage(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setMultisampleRaster(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setMultisampleRaster((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setMultisampleRaster(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getMultisampleRaster(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getMultisampleRaster());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getMultisampleRaster(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setConservativeRaster(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setConservativeRaster((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setConservativeRaster(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getConservativeRaster(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getConservativeRaster());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getConservativeRaster(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setNumViewports(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_viewports = {};
		static const char *kwlist[] = { "num_viewports", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_viewports)) {
			self->ptr.setNumViewports(num_viewports);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setNumViewports(): unknown arguments:\n(uint32_t num_viewports) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumTargets(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumTargets(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumViewports(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumViewports());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumViewports(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setNumClipDistances(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_distances = {};
		static const char *kwlist[] = { "num_distances", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_distances)) {
			self->ptr.setNumClipDistances(num_distances);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setNumClipDistances(): unknown arguments:\n(uint32_t num_distances) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getNumClipDistances(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumClipDistances());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getNumClipDistances(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setBlend(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "index", "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &index, &op, &src, &dest)) {
			self->ptr.setBlend(index, (Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			uint32_t src = 0;
			uint32_t dest = 0;
			static const char *kwlist[] = { "op", "src", "dest", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
				self->ptr.setBlend((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setBlend(): unknown arguments:\n(uint32_t index, Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setBlendColor(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "index", "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &index, &op, &src, &dest)) {
			self->ptr.setBlendColor(index, (Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			uint32_t src = 0;
			uint32_t dest = 0;
			static const char *kwlist[] = { "op", "src", "dest", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
				self->ptr.setBlendColor((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setBlendColor(): unknown arguments:\n(uint32_t index, Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setBlendAlpha(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "index", "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &index, &op, &src, &dest)) {
			self->ptr.setBlendAlpha(index, (Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			uint32_t src = 0;
			uint32_t dest = 0;
			static const char *kwlist[] = { "op", "src", "dest", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
				self->ptr.setBlendAlpha((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setBlendAlpha(): unknown arguments:\n(uint32_t index, Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendColorOp(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendColorOp(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendColorOp(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendAlphaOp(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendAlphaOp(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendAlphaOp(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendSrcColorFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendSrcColorFunc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendSrcColorFunc(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendSrcAlphaFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendSrcAlphaFunc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendSrcAlphaFunc(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendDestColorFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendDestColorFunc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendDestColorFunc(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getBlendDestAlphaFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendDestAlphaFunc(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getBlendDestAlphaFunc(): unknown arguments:\n(uint32_t index) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setColorMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			self->ptr.setColorMask(index, (Pipeline::ColorMask)mask);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t mask = 0;
			static const char *kwlist[] = { "mask", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
				self->ptr.setColorMask((Pipeline::ColorMask)mask);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setColorMask(): unknown arguments:\n(uint32_t index, Pipeline.ColorMask mask) -> void\n(Pipeline.ColorMask mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setColorFormat(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t format = 0;
		static const char *kwlist[] = { "index", "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &format)) {
			self->ptr.setColorFormat(index, (Format)format);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t format = 0;
			uint32_t num = 1;
			static const char *kwlist[] = { "format", "num", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &format, &num)) {
				self->ptr.setColorFormat((Format)format, num);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setColorFormat(): unknown arguments:\n(uint32_t index, Format format) -> void\n(Format format, uint32_t num) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getColorMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getColorMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getColorMask(): unknown arguments:\n(uint32_t index) -> Pipeline::ColorMask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getColorFormat(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getColorFormat(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getColorFormat(): unknown arguments:\n(uint32_t index) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setDepthMask((Pipeline::DepthMask)mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthMask(): unknown arguments:\n(Pipeline.DepthMask mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &func)) {
			self->ptr.setDepthFunc((Pipeline::DepthFunc)func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthFunc(): unknown arguments:\n(Pipeline.DepthFunc func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setDepthFormat(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			self->ptr.setDepthFormat((Format)format);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setDepthFormat(): unknown arguments:\n(Format format) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthMask(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthMask(): unknown arguments:\n(void) -> Pipeline::DepthMask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthFunc(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthFunc(): unknown arguments:\n(void) -> Pipeline::DepthFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getDepthFormat(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getDepthFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setStencilMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilBackMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setStencilBackMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilBackMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilFrontMask(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setStencilFrontMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilFrontMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		uint32_t fail_op = 0;
		uint32_t dfail_op = 0;
		uint32_t dpass_op = 0;
		static const char *kwlist[] = { "func", "fail_op", "dfail_op", "dpass_op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &func, &fail_op, &dfail_op, &dpass_op)) {
			self->ptr.setStencilFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)fail_op, (Pipeline::StencilOp)dfail_op, (Pipeline::StencilOp)dpass_op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t func = 0;
			uint32_t dpass_op = 0;
			static const char *kwlist[] = { "func", "dpass_op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &func, &dpass_op)) {
				self->ptr.setStencilFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)dpass_op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilFunc(): unknown arguments:\n(Pipeline.StencilFunc func, Pipeline.StencilOp fail_op, Pipeline.StencilOp dfail_op, Pipeline.StencilOp dpass_op) -> void\n(Pipeline.StencilFunc func, Pipeline.StencilOp dpass_op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilBackFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		uint32_t fail_op = 0;
		uint32_t dfail_op = 0;
		uint32_t dpass_op = 0;
		static const char *kwlist[] = { "func", "fail_op", "dfail_op", "dpass_op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &func, &fail_op, &dfail_op, &dpass_op)) {
			self->ptr.setStencilBackFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)fail_op, (Pipeline::StencilOp)dfail_op, (Pipeline::StencilOp)dpass_op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t func = 0;
			uint32_t dpass_op = 0;
			static const char *kwlist[] = { "func", "dpass_op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &func, &dpass_op)) {
				self->ptr.setStencilBackFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)dpass_op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilBackFunc(): unknown arguments:\n(Pipeline.StencilFunc func, Pipeline.StencilOp fail_op, Pipeline.StencilOp dfail_op, Pipeline.StencilOp dpass_op) -> void\n(Pipeline.StencilFunc func, Pipeline.StencilOp dpass_op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_setStencilFrontFunc(PYPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		uint32_t fail_op = 0;
		uint32_t dfail_op = 0;
		uint32_t dpass_op = 0;
		static const char *kwlist[] = { "func", "fail_op", "dfail_op", "dpass_op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &func, &fail_op, &dfail_op, &dpass_op)) {
			self->ptr.setStencilFrontFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)fail_op, (Pipeline::StencilOp)dfail_op, (Pipeline::StencilOp)dpass_op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t func = 0;
			uint32_t dpass_op = 0;
			static const char *kwlist[] = { "func", "dpass_op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &func, &dpass_op)) {
				self->ptr.setStencilFrontFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)dpass_op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::setStencilFrontFunc(): unknown arguments:\n(Pipeline.StencilFunc func, Pipeline.StencilOp fail_op, Pipeline.StencilOp dfail_op, Pipeline.StencilOp dpass_op) -> void\n(Pipeline.StencilFunc func, Pipeline.StencilOp dpass_op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilBackMask(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilBackMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilBackMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilBackFunc(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilBackFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilBackFunc(): unknown arguments:\n(void) -> Pipeline::StencilFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilBackFailOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilBackFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilBackFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilBackDepthFailOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilBackDepthFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilBackDepthFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilBackDepthPassOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilBackDepthPassOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilBackDepthPassOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilFrontMask(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFrontMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilFrontMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilFrontFunc(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFrontFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilFrontFunc(): unknown arguments:\n(void) -> Pipeline::StencilFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilFrontFailOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFrontFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilFrontFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilFrontDepthFailOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFrontDepthFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilFrontDepthFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_getStencilFrontDepthPassOp(PYPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFrontDepthPassOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Pipeline::getStencilFrontDepthPassOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Pipeline_get_platform(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Pipeline_get_platform_name(PYPipeline *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Pipeline_get_index(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Pipeline_get_name(PYPipeline *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Pipeline_get_vertex_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getVertexShader());
	}
	static PyObject *Pipeline_get_control_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getControlShader());
	}
	static PyObject *Pipeline_get_evaluate_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getEvaluateShader());
	}
	static PyObject *Pipeline_get_geometry_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getGeometryShader());
	}
	static PyObject *Pipeline_get_fragment_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getFragmentShader());
	}
	static PyObject *Pipeline_get_task_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getTaskShader());
	}
	static PyObject *Pipeline_get_mesh_shader(PYPipeline *self, void *offset) {
		return pyShader_new(self->ptr.getMeshShader());
	}
	static PyObject *Pipeline_get_num_samplers(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
	}
	static PyObject *Pipeline_get_sampler_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
	}
	static PyObject *Pipeline_get_num_textures(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
	}
	static PyObject *Pipeline_get_texture_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
	}
	static PyObject *Pipeline_get_num_surfaces(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
	}
	static PyObject *Pipeline_get_surface_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
	}
	static PyObject *Pipeline_get_num_uniforms(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
	}
	static PyObject *Pipeline_get_uniform_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
	}
	static PyObject *Pipeline_get_num_storages(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
	}
	static PyObject *Pipeline_get_storage_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
	}
	static PyObject *Pipeline_get_num_tracings(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
	}
	static PyObject *Pipeline_get_tracing_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
	}
	static PyObject *Pipeline_get_num_texels(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
	}
	static PyObject *Pipeline_get_texel_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
	}
	static PyObject *Pipeline_get_num_tables(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTables());
	}
	static PyObject *Pipeline_get_table_offset(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
	}
	static PyObject *Pipeline_get_num_vertices(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
	}
	static PyObject *Pipeline_get_num_attributes(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumAttributes());
	}
	static PyObject *Pipeline_get_primitive(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPrimitive());
	}
	static PyObject *Pipeline_get_fill_mode(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFillMode());
	}
	static PyObject *Pipeline_get_cull_mode(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCullMode());
	}
	static PyObject *Pipeline_get_front_mode(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFrontMode());
	}
	static PyObject *Pipeline_get_depth_bias(PYPipeline *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDepthBias());
	}
	static PyObject *Pipeline_get_depth_slope(PYPipeline *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDepthSlope());
	}
	static PyObject *Pipeline_get_depth_clamp(PYPipeline *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getDepthClamp());
	}
	static PyObject *Pipeline_get_multisample(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Pipeline_get_sample_mask(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSampleMask());
	}
	static PyObject *Pipeline_get_depth_clip(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDepthClip());
	}
	static PyObject *Pipeline_get_depth_replace(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getDepthReplace());
	}
	static PyObject *Pipeline_get_scissor_test(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getScissorTest());
	}
	static PyObject *Pipeline_get_raster_discard(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getRasterDiscard());
	}
	static PyObject *Pipeline_get_sample_shading(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getSampleShading());
	}
	static PyObject *Pipeline_get_alpha_to_coverage(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getAlphaToCoverage());
	}
	static PyObject *Pipeline_get_multisample_raster(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getMultisampleRaster());
	}
	static PyObject *Pipeline_get_conservative_raster(PYPipeline *self, void *offset) {
		return PyLong_FromLong(self->ptr.getConservativeRaster());
	}
	static PyObject *Pipeline_get_num_targets(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTargets());
	}
	static PyObject *Pipeline_get_num_viewports(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumViewports());
	}
	static PyObject *Pipeline_get_num_clip_distances(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumClipDistances());
	}
	static PyObject *Pipeline_get_depth_mask(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
	}
	static PyObject *Pipeline_get_depth_func(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
	}
	static PyObject *Pipeline_get_depth_format(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
	}
	static PyObject *Pipeline_get_stencil_back_mask(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilBackMask());
	}
	static PyObject *Pipeline_get_stencil_back_func(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilBackFunc());
	}
	static PyObject *Pipeline_get_stencil_back_fail_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilBackFailOp());
	}
	static PyObject *Pipeline_get_stencil_back_depth_fail_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilBackDepthFailOp());
	}
	static PyObject *Pipeline_get_stencil_back_depth_pass_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilBackDepthPassOp());
	}
	static PyObject *Pipeline_get_stencil_front_mask(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFrontMask());
	}
	static PyObject *Pipeline_get_stencil_front_func(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFrontFunc());
	}
	static PyObject *Pipeline_get_stencil_front_fail_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFrontFailOp());
	}
	static PyObject *Pipeline_get_stencil_front_depth_fail_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFrontDepthFailOp());
	}
	static PyObject *Pipeline_get_stencil_front_depth_pass_op(PYPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFrontDepthPassOp());
	}
	static PyObject *pyPipeline_str(PYPipeline *self) {
		return PyUnicode_FromString(String::format("Pipeline Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyPipeline_bool(PYPipeline *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Pipeline
	static void pyD3D12Pipeline_base(PYD3D12Pipeline *self) {
		new(&self->base.ptr) Pipeline(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Pipeline(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Pipeline_Type);
	}
	TS_PYAPI D3D12Pipeline &pyD3D12Pipeline_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Pipeline_Type) return ((PYD3D12Pipeline*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Pipeline_get(): can't get D3D12Pipeline from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Pipeline_get(): can't get D3D12Pipeline from None");
		static D3D12Pipeline ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Pipeline_new(const D3D12Pipeline &ptr) {
		PYD3D12Pipeline *ret = (PYD3D12Pipeline*)PyObject_New(PYD3D12Pipeline, &PYD3D12Pipeline_Type);
		new(&ret->ptr) D3D12Pipeline(ptr); pyD3D12Pipeline_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Pipeline_new(D3D12Pipeline &&ptr) {
		PYD3D12Pipeline *ret = (PYD3D12Pipeline*)PyObject_New(PYD3D12Pipeline, &PYD3D12Pipeline_Type);
		new(&ret->ptr) D3D12Pipeline(move(ptr)); pyD3D12Pipeline_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Pipeline_init(PYD3D12Pipeline *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYPipeline(object)) {
				new(&self->ptr) D3D12Pipeline(((PYPipeline*)object)->ptr);
				pyD3D12Pipeline_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Pipeline();
			pyD3D12Pipeline_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Pipeline::D3D12Pipeline(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Pipeline_dealloc(PYD3D12Pipeline *self) {
		self->ptr.~D3D12Pipeline();
		self->base.ptr.~Pipeline();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Pipeline_equalPtr(PYD3D12Pipeline *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Pipeline_clonePtr(PYD3D12Pipeline *self, PyObject *args) {
		return pyD3D12Pipeline_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Pipeline_clearPtr(PYD3D12Pipeline *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Pipeline_destroyPtr(PYD3D12Pipeline *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Pipeline_acquirePtr(PYD3D12Pipeline *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Pipeline_unacquirePtr(PYD3D12Pipeline *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Pipeline_isValidPtr(PYD3D12Pipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Pipeline_isOwnerPtr(PYD3D12Pipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Pipeline_isConstPtr(PYD3D12Pipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Pipeline_getCountPtr(PYD3D12Pipeline *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Pipeline_getInternalPtr(PYD3D12Pipeline *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Pipeline_getPipeline(PYD3D12Pipeline *self, PyObject *args) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *D3D12Pipeline_getRootSignature(PYD3D12Pipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRootSignature());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Pipeline::getRootSignature(): unknown arguments:\n(void) -> ID3D12RootSignature*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Pipeline_get_root_signature(PYD3D12Pipeline *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRootSignature());
	}
	static PyObject *pyD3D12Pipeline_str(PYD3D12Pipeline *self) {
		return PyUnicode_FromString(String::format("D3D12Pipeline Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Pipeline_bool(PYD3D12Pipeline *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLPipeline
	static void pyMTLPipeline_base(PYMTLPipeline *self) {
		new(&self->base.ptr) Pipeline(self->ptr);
	}
	TS_PYAPI bool isPYMTLPipeline(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLPipeline_Type);
	}
	TS_PYAPI MTLPipeline &pyMTLPipeline_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLPipeline_Type) return ((PYMTLPipeline*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLPipeline_get(): can't get MTLPipeline from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLPipeline_get(): can't get MTLPipeline from None");
		static MTLPipeline ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLPipeline_new(const MTLPipeline &ptr) {
		PYMTLPipeline *ret = (PYMTLPipeline*)PyObject_New(PYMTLPipeline, &PYMTLPipeline_Type);
		new(&ret->ptr) MTLPipeline(ptr); pyMTLPipeline_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLPipeline_new(MTLPipeline &&ptr) {
		PYMTLPipeline *ret = (PYMTLPipeline*)PyObject_New(PYMTLPipeline, &PYMTLPipeline_Type);
		new(&ret->ptr) MTLPipeline(move(ptr)); pyMTLPipeline_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLPipeline_init(PYMTLPipeline *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYPipeline(object)) {
				new(&self->ptr) MTLPipeline(((PYPipeline*)object)->ptr);
				pyMTLPipeline_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLPipeline();
			pyMTLPipeline_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLPipeline::MTLPipeline(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLPipeline_dealloc(PYMTLPipeline *self) {
		self->ptr.~MTLPipeline();
		self->base.ptr.~Pipeline();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLPipeline_equalPtr(PYMTLPipeline *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLPipeline_clonePtr(PYMTLPipeline *self, PyObject *args) {
		return pyMTLPipeline_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLPipeline_clearPtr(PYMTLPipeline *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLPipeline_destroyPtr(PYMTLPipeline *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLPipeline_acquirePtr(PYMTLPipeline *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLPipeline_unacquirePtr(PYMTLPipeline *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLPipeline_isValidPtr(PYMTLPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLPipeline_isOwnerPtr(PYMTLPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLPipeline_isConstPtr(PYMTLPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLPipeline_getCountPtr(PYMTLPipeline *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLPipeline_getInternalPtr(PYMTLPipeline *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLPipeline_getPipeline(PYMTLPipeline *self, PyObject *args) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *MTLPipeline_setIndirect(PYMTLPipeline *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setIndirect((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLPipeline::setIndirect(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLPipeline_isIndirect(PYMTLPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isIndirect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLPipeline::isIndirect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLPipeline_getVertexFunction(PYMTLPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVertexFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLPipeline::getVertexFunction(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLPipeline_getFragmentFunction(PYMTLPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFragmentFunction());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLPipeline::getFragmentFunction(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLPipeline_get_vertex_function(PYMTLPipeline *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVertexFunction());
	}
	static PyObject *MTLPipeline_get_fragment_function(PYMTLPipeline *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFragmentFunction());
	}
	static PyObject *pyMTLPipeline_str(PYMTLPipeline *self) {
		return PyUnicode_FromString(String::format("MTLPipeline Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLPipeline_bool(PYMTLPipeline *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUPipeline
	static void pyFUPipeline_base(PYFUPipeline *self) {
		new(&self->base.ptr) Pipeline(self->ptr);
	}
	TS_PYAPI bool isPYFUPipeline(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUPipeline_Type);
	}
	TS_PYAPI FUPipeline &pyFUPipeline_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUPipeline_Type) return ((PYFUPipeline*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUPipeline_get(): can't get FUPipeline from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUPipeline_get(): can't get FUPipeline from None");
		static FUPipeline ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUPipeline_new(const FUPipeline &ptr) {
		PYFUPipeline *ret = (PYFUPipeline*)PyObject_New(PYFUPipeline, &PYFUPipeline_Type);
		new(&ret->ptr) FUPipeline(ptr); pyFUPipeline_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUPipeline_new(FUPipeline &&ptr) {
		PYFUPipeline *ret = (PYFUPipeline*)PyObject_New(PYFUPipeline, &PYFUPipeline_Type);
		new(&ret->ptr) FUPipeline(move(ptr)); pyFUPipeline_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUPipeline_init(PYFUPipeline *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYPipeline(object)) {
				new(&self->ptr) FUPipeline(((PYPipeline*)object)->ptr);
				pyFUPipeline_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUPipeline();
			pyFUPipeline_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *pipelines_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "pipelines", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &pipelines_, &owner)) {
				if(!isPYArray(pipelines_)) break;
				Array<Pipeline> pipelines; Array<PyObject*> pipelines__; pyArray_get(pipelines_, pipelines__);
				for(PyObject *object : pipelines__) pipelines.append(pyPipeline_get(object));
				new(&self->ptr) FUPipeline(pipelines, (owner != 0));
				pyFUPipeline_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUPipeline::FUPipeline(): unknown arguments:\n(void)\n(Array<Pipeline> pipelines, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUPipeline_dealloc(PYFUPipeline *self) {
		self->ptr.~FUPipeline();
		self->base.ptr.~Pipeline();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUPipeline_equalPtr(PYFUPipeline *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUPipeline_clonePtr(PYFUPipeline *self, PyObject *args) {
		return pyFUPipeline_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUPipeline_clearPtr(PYFUPipeline *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUPipeline_destroyPtr(PYFUPipeline *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUPipeline_acquirePtr(PYFUPipeline *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUPipeline_unacquirePtr(PYFUPipeline *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUPipeline_isValidPtr(PYFUPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUPipeline_isOwnerPtr(PYFUPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUPipeline_isConstPtr(PYFUPipeline *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUPipeline_getCountPtr(PYFUPipeline *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUPipeline_getInternalPtr(PYFUPipeline *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUPipeline_getPipeline(PYFUPipeline *self, PyObject *args) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *FUPipeline_setMask(PYFUPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUPipeline::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUPipeline_getMask(PYFUPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUPipeline::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUPipeline_getNumPipelines(PYFUPipeline *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumPipelines());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUPipeline::getNumPipelines(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUPipeline_getPipeline(PYFUPipeline *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyPipeline_new(self->ptr.getPipeline(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyPipeline_new(self->ptr.getPipeline(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUPipeline::getPipeline(): unknown arguments:\n(uint32_t index) -> const Pipeline\n(uint32_t index) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUPipeline_get_mask(PYFUPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUPipeline_get_num_pipelines(PYFUPipeline *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumPipelines());
	}
	static PyObject *pyFUPipeline_str(PYFUPipeline *self) {
		return PyUnicode_FromString(String::format("FUPipeline Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUPipeline_bool(PYFUPipeline *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Traversal
	TS_PYAPI bool isPYTraversal(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYTraversal_Type || type == &PYD3D12Traversal_Type || type == &PYFUTraversal_Type);
	}
	TS_PYAPI Traversal &pyTraversal_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYTraversal_Type || type == &PYD3D12Traversal_Type || type == &PYFUTraversal_Type) return ((PYTraversal*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Traversal_get(): can't get Traversal from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Traversal_get(): can't get Traversal from None");
		static Traversal ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTraversal_new(const Traversal &ptr) {
		PYTraversal *ret = (PYTraversal*)PyObject_New(PYTraversal, &PYTraversal_Type);
		new(&ret->ptr) Traversal(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTraversal_new(Traversal &&ptr) {
		PYTraversal *ret = (PYTraversal*)PyObject_New(PYTraversal, &PYTraversal_Type);
		new(&ret->ptr) Traversal(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTraversal_init(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Traversal();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::Traversal(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTraversal_dealloc(PYTraversal *self) {
		self->ptr.~Traversal();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTraversal_equalPtr(PYTraversal *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTraversal_clonePtr(PYTraversal *self, PyObject *args) {
		return pyTraversal_new(self->ptr.clonePtr());
	}
	static PyObject *pyTraversal_clearPtr(PYTraversal *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTraversal_destroyPtr(PYTraversal *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTraversal_acquirePtr(PYTraversal *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTraversal_unacquirePtr(PYTraversal *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTraversal_isValidPtr(PYTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTraversal_isOwnerPtr(PYTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTraversal_isConstPtr(PYTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTraversal_getCountPtr(PYTraversal *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTraversal_getInternalPtr(PYTraversal *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Traversal_getPlatform(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getPlatformName(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getIndex(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_clear(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_isCreated(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setName(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setName(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setName(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getName(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_create(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.create());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::create(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setParameters(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		PyObject *traversal_ = nullptr;
		static const char *kwlist[] = { "traversal", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &traversal_)) {
			if(!isPYTraversal(traversal_)) break;
			const Traversal &traversal = pyTraversal_get(traversal_);
			self->ptr.setParameters(traversal);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setParameters(): unknown arguments:\n(const Traversal traversal) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_saveState(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.saveState(stream));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::saveState(): unknown arguments:\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addShader(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		PyObject *shader_ = nullptr;
		int32_t owner = false;
		static const char *kwlist[] = { "shader", "owner", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &shader_, &owner)) {
			if(!isPYShader(shader_)) break;
			Shader &shader = pyShader_get(shader_);
			self->ptr.addShader(shader, (owner != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addShader(): unknown arguments:\n(Shader shader, bool owner) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getRayGenShader(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyShader_new(self->ptr.getRayGenShader());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getRayGenShader(): unknown arguments:\n(void) -> Shader\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_loadShader(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShader((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::loadShader(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_loadShaderGLSL(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "name", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &name, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.loadShaderGLSL((Shader::Type)type, name, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::loadShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* name, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_loadShaderSPIRV(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *name = nullptr;
		static const char *kwlist[] = { "type", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &type, &name)) {
			return PyLong_FromLong(self->ptr.loadShaderSPIRV((Shader::Type)type, name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::loadShaderSPIRV(): unknown arguments:\n(Shader.Type type, const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_createShader(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShader((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::createShader(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_createShaderGLSL(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		const char *src = nullptr;
		PyObject *macros_ = nullptr;
		PyObject *includes_ = nullptr;
		uint32_t size = 0;
		static const char *kwlist[] = { "type", "src", "macros", "includes", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is|OO", (char**)kwlist, &type, &src, &macros_, &includes_)) {
			const String &macros = (macros_) ? ((PyUnicode_Check(macros_)) ? String(PyUnicode_AsUTF8(macros_)) : (String)pyString_get(macros_)) : String::null;
			const char **includes; Array<const char*> includes__;
			pyArray_get(includes_, includes__); includes = includes__.get();
			return PyLong_FromLong(self->ptr.createShaderGLSL((Shader::Type)type, src, macros, includes, size = includes__.size()));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::createShaderGLSL(): unknown arguments:\n(Shader.Type type, const char* src, const String macros, const char** includes, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_createShaderSPIRV(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		PyObject *data_ = nullptr;
		static const char *kwlist[] = { "type", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &type, &data_)) {
			if(!isPYArray(data_)) break;
			Array<uint32_t> data; pyArray_get(data_, data);
			return PyLong_FromLong(self->ptr.createShaderSPIRV((Shader::Type)type, data));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::createShaderSPIRV(): unknown arguments:\n(Shader.Type type, Array<uint32_t> data) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addSampler(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addSampler((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addSampler(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumSamplers(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumSamplers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSamplerOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setSamplerOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSamplerOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSamplerOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSamplerOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSamplerMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyTraversal_new(self->ptr.setSamplerMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSamplerMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSamplerMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSamplerMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSamplerMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyTraversal_new(self->ptr.setSamplerMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSamplerMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSamplerMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSamplerMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSamplerArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyTraversal_new(self->ptr.setSamplerArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSamplerArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSamplerArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSamplerArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSamplerArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addTexture(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTexture((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addTexture(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumTextures(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumTextures(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTextureOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setTextureOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTextureOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTextureOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTextureOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTextureMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyTraversal_new(self->ptr.setTextureMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTextureMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTextureMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTextureMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTextureMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyTraversal_new(self->ptr.setTextureMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTextureMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTextureMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTextureMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTextureArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyTraversal_new(self->ptr.setTextureArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTextureArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTextureArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTextureArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addSurface(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addSurface((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addSurface(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumSurfaces(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumSurfaces(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSurfaceOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setSurfaceOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSurfaceOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSurfaceOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSurfaceOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSurfaceMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyTraversal_new(self->ptr.setSurfaceMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSurfaceMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSurfaceMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSurfaceMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSurfaceMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		int32_t array = false;
		static const char *kwlist[] = { "index", "num", "mask", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|i", (char**)kwlist, &index, &num, &mask, &array)) {
			return pyTraversal_new(self->ptr.setSurfaceMasks(index, num, (Shader::Mask)mask, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSurfaceMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSurfaceMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSurfaceMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setSurfaceArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		int32_t array = {};
		static const char *kwlist[] = { "index", "num", "array", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &index, &num, &array)) {
			return pyTraversal_new(self->ptr.setSurfaceArray(index, num, (array != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setSurfaceArray(): unknown arguments:\n(uint32_t index, uint32_t num, bool array) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getSurfaceArray(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSurfaceArray(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getSurfaceArray(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addUniform(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addUniform((Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addUniform(): unknown arguments:\n(Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumUniforms(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumUniforms(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setUniformOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setUniformOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setUniformOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getUniformOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getUniformOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setUniformMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setUniformMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setUniformMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getUniformMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getUniformMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setUniformMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "num", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &index, &num, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setUniformMasks(index, num, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setUniformMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getUniformMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getUniformMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setUniformFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyTraversal_new(self->ptr.setUniformFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setUniformFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getUniformFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getUniformFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getUniformFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addStorage(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addStorage((Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addStorage(): unknown arguments:\n(Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumStorages(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumStorages(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setStorageOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setStorageOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setStorageOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getStorageOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getStorageOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setStorageMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setStorageMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setStorageMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getStorageMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getStorageMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setStorageMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "num", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &index, &num, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setStorageMasks(index, num, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setStorageMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getStorageMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getStorageMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setStorageFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyTraversal_new(self->ptr.setStorageFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setStorageFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getStorageFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getStorageFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getStorageFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addTracing(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTracing((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addTracing(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumTracings(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumTracings(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTracingOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setTracingOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTracingOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTracingOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTracingOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTracingMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyTraversal_new(self->ptr.setTracingMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTracingMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTracingMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTracingMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTracingMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "num", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &num, &mask)) {
			return pyTraversal_new(self->ptr.setTracingMasks(index, num, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTracingMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTracingMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTracingMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTracingMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addTexel(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			return PyLong_FromUnsignedLong(self->ptr.addTexel((Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addTexel(): unknown arguments:\n(Shader.Mask mask) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumTexels(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumTexels(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTexelOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setTexelOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTexelOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTexelOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTexelOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTexelMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mask)) {
			return pyTraversal_new(self->ptr.setTexelMask(index, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTexelMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTexelMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTexelMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTexelMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		uint32_t mask = 0;
		static const char *kwlist[] = { "index", "num", "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &num, &mask)) {
			return pyTraversal_new(self->ptr.setTexelMasks(index, num, (Shader::Mask)mask));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTexelMasks(): unknown arguments:\n(uint32_t index, uint32_t num, Shader.Mask mask) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTexelMasks(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t num = {};
		static const char *kwlist[] = { "index", "num", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &num)) {
			return PyLong_FromUnsignedLong(self->ptr.getTexelMasks(index, num));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTexelMasks(): unknown arguments:\n(uint32_t index, uint32_t num) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_addTable(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t size = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "type", "size", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III|I", (char**)kwlist, &type, &size, &mask, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.addTable((TableType)type, size, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::addTable(): unknown arguments:\n(TableType type, uint32_t size, Shader.Mask mask, BindFlags flags) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getNumTables(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTables());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getNumTables(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTableOffset(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &offset)) {
			return pyTraversal_new(self->ptr.setTableOffset(offset));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTableOffset(): unknown arguments:\n(uint32_t offset) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTableOffset(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTableOffset(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTableType(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t type = 0;
		uint32_t size = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "type", "size", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII|I", (char**)kwlist, &index, &type, &size, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setTableType(index, (TableType)type, size, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTableType(): unknown arguments:\n(uint32_t index, TableType type, uint32_t size, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTableType(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableType(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTableType(): unknown arguments:\n(uint32_t index) -> TableType\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTableSize(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableSize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTableSize(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTableMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mask = 0;
		uint32_t flags = BindFlagNone;
		static const char *kwlist[] = { "index", "mask", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &index, &mask, &flags)) {
			return pyTraversal_new(self->ptr.setTableMask(index, (Shader::Mask)mask, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTableMask(): unknown arguments:\n(uint32_t index, Shader.Mask mask, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTableMask(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableMask(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTableMask(): unknown arguments:\n(uint32_t index) -> Shader::Mask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setTableFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t flags = 0;
		static const char *kwlist[] = { "index", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &flags)) {
			return pyTraversal_new(self->ptr.setTableFlags(index, (BindFlags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setTableFlags(): unknown arguments:\n(uint32_t index, BindFlags flags) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getTableFlags(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getTableFlags(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getTableFlags(): unknown arguments:\n(uint32_t index) -> BindFlags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_setRecursionDepth(PYTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t depth = {};
		static const char *kwlist[] = { "depth", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &depth)) {
			self->ptr.setRecursionDepth(depth);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::setRecursionDepth(): unknown arguments:\n(uint32_t depth) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_getRecursionDepth(PYTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getRecursionDepth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Traversal::getRecursionDepth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Traversal_get_platform(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Traversal_get_platform_name(PYTraversal *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Traversal_get_index(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Traversal_get_name(PYTraversal *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getName().get());
	}
	static PyObject *Traversal_get_ray_gen_shader(PYTraversal *self, void *offset) {
		return pyShader_new(self->ptr.getRayGenShader());
	}
	static PyObject *Traversal_get_num_samplers(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSamplers());
	}
	static PyObject *Traversal_get_sampler_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSamplerOffset());
	}
	static PyObject *Traversal_get_num_textures(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTextures());
	}
	static PyObject *Traversal_get_texture_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureOffset());
	}
	static PyObject *Traversal_get_num_surfaces(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSurfaces());
	}
	static PyObject *Traversal_get_surface_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSurfaceOffset());
	}
	static PyObject *Traversal_get_num_uniforms(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumUniforms());
	}
	static PyObject *Traversal_get_uniform_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getUniformOffset());
	}
	static PyObject *Traversal_get_num_storages(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumStorages());
	}
	static PyObject *Traversal_get_storage_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStorageOffset());
	}
	static PyObject *Traversal_get_num_tracings(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTracings());
	}
	static PyObject *Traversal_get_tracing_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTracingOffset());
	}
	static PyObject *Traversal_get_num_texels(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTexels());
	}
	static PyObject *Traversal_get_texel_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTexelOffset());
	}
	static PyObject *Traversal_get_num_tables(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTables());
	}
	static PyObject *Traversal_get_table_offset(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTableOffset());
	}
	static PyObject *Traversal_get_recursion_depth(PYTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getRecursionDepth());
	}
	static PyObject *pyTraversal_str(PYTraversal *self) {
		return PyUnicode_FromString(String::format("Traversal Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTraversal_bool(PYTraversal *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Traversal
	static void pyD3D12Traversal_base(PYD3D12Traversal *self) {
		new(&self->base.ptr) Traversal(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Traversal(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Traversal_Type);
	}
	TS_PYAPI D3D12Traversal &pyD3D12Traversal_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Traversal_Type) return ((PYD3D12Traversal*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Traversal_get(): can't get D3D12Traversal from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Traversal_get(): can't get D3D12Traversal from None");
		static D3D12Traversal ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Traversal_new(const D3D12Traversal &ptr) {
		PYD3D12Traversal *ret = (PYD3D12Traversal*)PyObject_New(PYD3D12Traversal, &PYD3D12Traversal_Type);
		new(&ret->ptr) D3D12Traversal(ptr); pyD3D12Traversal_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Traversal_new(D3D12Traversal &&ptr) {
		PYD3D12Traversal *ret = (PYD3D12Traversal*)PyObject_New(PYD3D12Traversal, &PYD3D12Traversal_Type);
		new(&ret->ptr) D3D12Traversal(move(ptr)); pyD3D12Traversal_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Traversal_init(PYD3D12Traversal *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTraversal(object)) {
				new(&self->ptr) D3D12Traversal(((PYTraversal*)object)->ptr);
				pyD3D12Traversal_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Traversal();
			pyD3D12Traversal_base(self);
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Traversal::D3D12Traversal(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Traversal_dealloc(PYD3D12Traversal *self) {
		self->ptr.~D3D12Traversal();
		self->base.ptr.~Traversal();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Traversal_equalPtr(PYD3D12Traversal *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Traversal_clonePtr(PYD3D12Traversal *self, PyObject *args) {
		return pyD3D12Traversal_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Traversal_clearPtr(PYD3D12Traversal *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Traversal_destroyPtr(PYD3D12Traversal *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Traversal_acquirePtr(PYD3D12Traversal *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Traversal_unacquirePtr(PYD3D12Traversal *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Traversal_isValidPtr(PYD3D12Traversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Traversal_isOwnerPtr(PYD3D12Traversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Traversal_isConstPtr(PYD3D12Traversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Traversal_getCountPtr(PYD3D12Traversal *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Traversal_getInternalPtr(PYD3D12Traversal *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Traversal_getTraversal(PYD3D12Traversal *self, PyObject *args) {
		return pyTraversal_new(self->ptr.getTraversal());
	}
	static PyObject *D3D12Traversal_getRootSignature(PYD3D12Traversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRootSignature());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Traversal::getRootSignature(): unknown arguments:\n(void) -> ID3D12RootSignature*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Traversal_get_root_signature(PYD3D12Traversal *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRootSignature());
	}
	static PyObject *pyD3D12Traversal_str(PYD3D12Traversal *self) {
		return PyUnicode_FromString(String::format("D3D12Traversal Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Traversal_bool(PYD3D12Traversal *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::FUTraversal
	static void pyFUTraversal_base(PYFUTraversal *self) {
		new(&self->base.ptr) Traversal(self->ptr);
	}
	TS_PYAPI bool isPYFUTraversal(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFUTraversal_Type);
	}
	TS_PYAPI FUTraversal &pyFUTraversal_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFUTraversal_Type) return ((PYFUTraversal*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FUTraversal_get(): can't get FUTraversal from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FUTraversal_get(): can't get FUTraversal from None");
		static FUTraversal ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFUTraversal_new(const FUTraversal &ptr) {
		PYFUTraversal *ret = (PYFUTraversal*)PyObject_New(PYFUTraversal, &PYFUTraversal_Type);
		new(&ret->ptr) FUTraversal(ptr); pyFUTraversal_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFUTraversal_new(FUTraversal &&ptr) {
		PYFUTraversal *ret = (PYFUTraversal*)PyObject_New(PYFUTraversal, &PYFUTraversal_Type);
		new(&ret->ptr) FUTraversal(move(ptr)); pyFUTraversal_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyFUTraversal_init(PYFUTraversal *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYTraversal(object)) {
				new(&self->ptr) FUTraversal(((PYTraversal*)object)->ptr);
				pyFUTraversal_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FUTraversal();
			pyFUTraversal_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *traversals_ = nullptr;
			int32_t owner = false;
			static const char *kwlist[] = { "traversals", "owner", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &traversals_, &owner)) {
				if(!isPYArray(traversals_)) break;
				Array<Traversal> traversals; Array<PyObject*> traversals__; pyArray_get(traversals_, traversals__);
				for(PyObject *object : traversals__) traversals.append(pyTraversal_get(object));
				new(&self->ptr) FUTraversal(traversals, (owner != 0));
				pyFUTraversal_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTraversal::FUTraversal(): unknown arguments:\n(void)\n(Array<Traversal> traversals, bool owner)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFUTraversal_dealloc(PYFUTraversal *self) {
		self->ptr.~FUTraversal();
		self->base.ptr.~Traversal();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFUTraversal_equalPtr(PYFUTraversal *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFUTraversal_clonePtr(PYFUTraversal *self, PyObject *args) {
		return pyFUTraversal_new(self->ptr.clonePtr());
	}
	static PyObject *pyFUTraversal_clearPtr(PYFUTraversal *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTraversal_destroyPtr(PYFUTraversal *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTraversal_acquirePtr(PYFUTraversal *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTraversal_unacquirePtr(PYFUTraversal *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFUTraversal_isValidPtr(PYFUTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFUTraversal_isOwnerPtr(PYFUTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFUTraversal_isConstPtr(PYFUTraversal *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFUTraversal_getCountPtr(PYFUTraversal *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFUTraversal_getInternalPtr(PYFUTraversal *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyFUTraversal_getTraversal(PYFUTraversal *self, PyObject *args) {
		return pyTraversal_new(self->ptr.getTraversal());
	}
	static PyObject *FUTraversal_setMask(PYFUTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = {};
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setMask(mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTraversal::setMask(): unknown arguments:\n(uint32_t mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTraversal_getMask(PYFUTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTraversal::getMask(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTraversal_getNumTraversals(PYFUTraversal *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTraversals());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTraversal::getNumTraversals(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTraversal_getTraversal(PYFUTraversal *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyTraversal_new(self->ptr.getTraversal(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyTraversal_new(self->ptr.getTraversal(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FUTraversal::getTraversal(): unknown arguments:\n(uint32_t index) -> const Traversal\n(uint32_t index) -> Traversal\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FUTraversal_get_mask(PYFUTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMask());
	}
	static PyObject *FUTraversal_get_num_traversals(PYFUTraversal *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTraversals());
	}
	static PyObject *pyFUTraversal_str(PYFUTraversal *self) {
		return PyUnicode_FromString(String::format("FUTraversal Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFUTraversal_bool(PYFUTraversal *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Surface
	TS_PYAPI bool isPYSurface(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYSurface_Type || type == &PYD3D12Surface_Type || type == &PYD3D11Surface_Type || type == &PYMTLSurface_Type || type == &PYVKSurface_Type || type == &PYGLSurface_Type || type == &PYGLESSurface_Type);
	}
	TS_PYAPI Surface &pySurface_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYSurface_Type || type == &PYD3D12Surface_Type || type == &PYD3D11Surface_Type || type == &PYMTLSurface_Type || type == &PYVKSurface_Type || type == &PYGLSurface_Type || type == &PYGLESSurface_Type) return ((PYSurface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Surface_get(): can't get Surface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Surface_get(): can't get Surface from None");
		static Surface ret;
		return ret;
	}
	TS_PYAPI PyObject *pySurface_new(const Surface &ptr) {
		PYSurface *ret = (PYSurface*)PyObject_New(PYSurface, &PYSurface_Type);
		new(&ret->ptr) Surface(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySurface_new(Surface &&ptr) {
		PYSurface *ret = (PYSurface*)PyObject_New(PYSurface, &PYSurface_Type);
		new(&ret->ptr) Surface(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pySurface_init(PYSurface *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Surface();
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYContext(context_)) break;
				Context &context = pyContext_get(context_);
				new(&self->ptr) Surface(context);
				return 0;
			}
		}
		PyErr_Clear();
		{
			uint32_t platform = 0;
			static const char *kwlist[] = { "platform", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &platform)) {
				new(&self->ptr) Surface((Platform)platform);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::Surface(): unknown arguments:\n(void)\n(Context context)\n(Platform platform)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySurface_dealloc(PYSurface *self) {
		self->ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySurface_equalPtr(PYSurface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySurface_clonePtr(PYSurface *self, PyObject *args) {
		return pySurface_new(self->ptr.clonePtr());
	}
	static PyObject *pySurface_clearPtr(PYSurface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySurface_destroyPtr(PYSurface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySurface_acquirePtr(PYSurface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySurface_unacquirePtr(PYSurface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySurface_isValidPtr(PYSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySurface_isOwnerPtr(PYSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySurface_isConstPtr(PYSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySurface_getCountPtr(PYSurface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySurface_getInternalPtr(PYSurface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Surface_getPlatform(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getPlatformName(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getIndex(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setSize(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = {};
		static const char *kwlist[] = { "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &width, &height)) {
			self->ptr.setSize(width, height);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setSize(): unknown arguments:\n(uint32_t width, uint32_t height) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getWidth(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getHeight(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setMultisample(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t multisample = {};
		static const char *kwlist[] = { "multisample", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &multisample)) {
			self->ptr.setMultisample(multisample);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setMultisample(): unknown arguments:\n(uint32_t multisample) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getMultisample(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_hasMultisample(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::hasMultisample(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setColorLayer(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t layer = {};
		uint32_t layers = {};
		static const char *kwlist[] = { "layer", "layers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &layer, &layers)) {
			self->ptr.setColorLayer(layer, layers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setColorLayer(): unknown arguments:\n(uint32_t layer, uint32_t layers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setDepthLayer(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t layer = {};
		uint32_t layers = {};
		static const char *kwlist[] = { "layer", "layers", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &layer, &layers)) {
			self->ptr.setDepthLayer(layer, layers);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setDepthLayer(): unknown arguments:\n(uint32_t layer, uint32_t layers) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getColorLayer(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorLayer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getColorLayer(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getDepthLayer(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthLayer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getDepthLayer(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getColorLayers(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getColorLayers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getDepthLayers(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getDepthLayers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_hasColorLayers(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasColorLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::hasColorLayers(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_hasDepthLayers(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasDepthLayers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::hasDepthLayers(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setColorFormat(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			self->ptr.setColorFormat((Format)format);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setColorFormat(): unknown arguments:\n(Format format) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_setDepthFormat(PYSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			self->ptr.setDepthFormat((Format)format);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::setDepthFormat(): unknown arguments:\n(Format format) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getColorFormat(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getColorFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_getDepthFormat(PYSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Surface::getDepthFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Surface_get_platform(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Surface_get_platform_name(PYSurface *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Surface_get_index(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Surface_get_width(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Surface_get_height(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Surface_get_multisample(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Surface_get_color_layer(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorLayer());
	}
	static PyObject *Surface_get_depth_layer(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthLayer());
	}
	static PyObject *Surface_get_color_layers(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorLayers());
	}
	static PyObject *Surface_get_depth_layers(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthLayers());
	}
	static PyObject *Surface_get_color_format(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
	}
	static PyObject *Surface_get_depth_format(PYSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
	}
	static PyObject *pySurface_str(PYSurface *self) {
		return PyUnicode_FromString(String::format("Surface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySurface_bool(PYSurface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D12Surface
	static void pyD3D12Surface_base(PYD3D12Surface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYD3D12Surface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D12Surface_Type);
	}
	TS_PYAPI D3D12Surface &pyD3D12Surface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D12Surface_Type) return ((PYD3D12Surface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D12Surface_get(): can't get D3D12Surface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D12Surface_get(): can't get D3D12Surface from None");
		static D3D12Surface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D12Surface_new(const D3D12Surface &ptr) {
		PYD3D12Surface *ret = (PYD3D12Surface*)PyObject_New(PYD3D12Surface, &PYD3D12Surface_Type);
		new(&ret->ptr) D3D12Surface(ptr); pyD3D12Surface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D12Surface_new(D3D12Surface &&ptr) {
		PYD3D12Surface *ret = (PYD3D12Surface*)PyObject_New(PYD3D12Surface, &PYD3D12Surface_Type);
		new(&ret->ptr) D3D12Surface(move(ptr)); pyD3D12Surface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D12Surface_init(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) D3D12Surface(((PYSurface*)object)->ptr);
				pyD3D12Surface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D12Surface();
			pyD3D12Surface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYD3D12Context(context_)) break;
				D3D12Context &context = pyD3D12Context_get(context_);
				new(&self->ptr) D3D12Surface(context);
				pyD3D12Surface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::D3D12Surface(): unknown arguments:\n(void)\n(D3D12Context context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D12Surface_dealloc(PYD3D12Surface *self) {
		self->ptr.~D3D12Surface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D12Surface_equalPtr(PYD3D12Surface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D12Surface_clonePtr(PYD3D12Surface *self, PyObject *args) {
		return pyD3D12Surface_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D12Surface_clearPtr(PYD3D12Surface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Surface_destroyPtr(PYD3D12Surface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Surface_acquirePtr(PYD3D12Surface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Surface_unacquirePtr(PYD3D12Surface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D12Surface_isValidPtr(PYD3D12Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D12Surface_isOwnerPtr(PYD3D12Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D12Surface_isConstPtr(PYD3D12Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D12Surface_getCountPtr(PYD3D12Surface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D12Surface_getInternalPtr(PYD3D12Surface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D12Surface_getSurface(PYD3D12Surface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *D3D12Surface_getFactory(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFactory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getFactory(): unknown arguments:\n(void) -> IDXGIFactory4*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getDevice(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getDevice(): unknown arguments:\n(void) -> ID3D12Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getQueue(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getQueue(): unknown arguments:\n(void) -> ID3D12CommandQueue*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getCommand(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getCommand(): unknown arguments:\n(void) -> ID3D12GraphicsCommandList*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_setSwapChain(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		IDXGISwapChain *swap_chain = nullptr;
		static const char *kwlist[] = { "swap_chain", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &swap_chain)) {
			self->ptr.setSwapChain(swap_chain);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::setSwapChain(): unknown arguments:\n(IDXGISwapChain* swap_chain) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getSwapChain(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSwapChain());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getSwapChain(): unknown arguments:\n(void) -> IDXGISwapChain*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_setRenderTarget(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D12Resource *render_target = nullptr;
		static const char *kwlist[] = { "render_target", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &render_target)) {
			self->ptr.setRenderTarget(render_target);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::setRenderTarget(): unknown arguments:\n(ID3D12Resource* render_target) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_setDepthStencil(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D12Resource *depth_stencil = nullptr;
		static const char *kwlist[] = { "depth_stencil", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &depth_stencil)) {
			self->ptr.setDepthStencil(depth_stencil);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::setDepthStencil(): unknown arguments:\n(ID3D12Resource* depth_stencil) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getRenderTarget(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getRenderTarget(): unknown arguments:\n(void) -> ID3D12Resource*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getDepthStencil(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthStencil());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getDepthStencil(): unknown arguments:\n(void) -> ID3D12Resource*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_setRenderTargetView(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		size_t render_target_view = {};
		static const char *kwlist[] = { "render_target_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &render_target_view)) {
			self->ptr.setRenderTargetView(render_target_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::setRenderTargetView(): unknown arguments:\n(size_t render_target_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_setDepthStencilView(PYD3D12Surface *self, PyObject *args, PyObject *kwargs) {
		size_t depth_stencil_view = {};
		static const char *kwlist[] = { "depth_stencil_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &depth_stencil_view)) {
			self->ptr.setDepthStencilView(depth_stencil_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::setDepthStencilView(): unknown arguments:\n(size_t depth_stencil_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getRenderTargetView(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getRenderTargetView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getRenderTargetView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getDepthStencilView(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getDepthStencilView(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getColorDXGIFormat(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getColorDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_getDepthDXGIFormat(PYD3D12Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D12Surface::getDepthDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D12Surface_get_factory(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFactory());
	}
	static PyObject *D3D12Surface_get_device(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *D3D12Surface_get_queue(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *D3D12Surface_get_command(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *D3D12Surface_get_swap_chain(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSwapChain());
	}
	static PyObject *D3D12Surface_get_render_target(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTarget());
	}
	static PyObject *D3D12Surface_get_depth_stencil(PYD3D12Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthStencil());
	}
	static PyObject *D3D12Surface_get_render_target_view(PYD3D12Surface *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getRenderTargetView());
	}
	static PyObject *D3D12Surface_get_depth_stencil_view(PYD3D12Surface *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getDepthStencilView());
	}
	static PyObject *D3D12Surface_get_color_dxgi_format(PYD3D12Surface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorDXGIFormat());
	}
	static PyObject *D3D12Surface_get_depth_dxgi_format(PYD3D12Surface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthDXGIFormat());
	}
	static PyObject *pyD3D12Surface_str(PYD3D12Surface *self) {
		return PyUnicode_FromString(String::format("D3D12Surface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D12Surface_bool(PYD3D12Surface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::D3D11Surface
	static void pyD3D11Surface_base(PYD3D11Surface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYD3D11Surface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYD3D11Surface_Type);
	}
	TS_PYAPI D3D11Surface &pyD3D11Surface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYD3D11Surface_Type) return ((PYD3D11Surface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "D3D11Surface_get(): can't get D3D11Surface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "D3D11Surface_get(): can't get D3D11Surface from None");
		static D3D11Surface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyD3D11Surface_new(const D3D11Surface &ptr) {
		PYD3D11Surface *ret = (PYD3D11Surface*)PyObject_New(PYD3D11Surface, &PYD3D11Surface_Type);
		new(&ret->ptr) D3D11Surface(ptr); pyD3D11Surface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyD3D11Surface_new(D3D11Surface &&ptr) {
		PYD3D11Surface *ret = (PYD3D11Surface*)PyObject_New(PYD3D11Surface, &PYD3D11Surface_Type);
		new(&ret->ptr) D3D11Surface(move(ptr)); pyD3D11Surface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyD3D11Surface_init(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) D3D11Surface(((PYSurface*)object)->ptr);
				pyD3D11Surface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) D3D11Surface();
			pyD3D11Surface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYD3D11Context(context_)) break;
				D3D11Context &context = pyD3D11Context_get(context_);
				new(&self->ptr) D3D11Surface(context);
				pyD3D11Surface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::D3D11Surface(): unknown arguments:\n(void)\n(D3D11Context context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyD3D11Surface_dealloc(PYD3D11Surface *self) {
		self->ptr.~D3D11Surface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyD3D11Surface_equalPtr(PYD3D11Surface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyD3D11Surface_clonePtr(PYD3D11Surface *self, PyObject *args) {
		return pyD3D11Surface_new(self->ptr.clonePtr());
	}
	static PyObject *pyD3D11Surface_clearPtr(PYD3D11Surface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Surface_destroyPtr(PYD3D11Surface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Surface_acquirePtr(PYD3D11Surface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Surface_unacquirePtr(PYD3D11Surface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyD3D11Surface_isValidPtr(PYD3D11Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyD3D11Surface_isOwnerPtr(PYD3D11Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyD3D11Surface_isConstPtr(PYD3D11Surface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyD3D11Surface_getCountPtr(PYD3D11Surface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyD3D11Surface_getInternalPtr(PYD3D11Surface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyD3D11Surface_getSurface(PYD3D11Surface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *D3D11Surface_getFactory(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFactory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getFactory(): unknown arguments:\n(void) -> IDXGIFactory*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getDevice(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getDevice(): unknown arguments:\n(void) -> ID3D11Device*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getContext(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getContext(): unknown arguments:\n(void) -> ID3D11DeviceContext*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_setSwapChain(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		IDXGISwapChain *swap_chain = nullptr;
		static const char *kwlist[] = { "swap_chain", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &swap_chain)) {
			self->ptr.setSwapChain(swap_chain);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::setSwapChain(): unknown arguments:\n(IDXGISwapChain* swap_chain) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getSwapChain(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getSwapChain());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getSwapChain(): unknown arguments:\n(void) -> IDXGISwapChain*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_setRenderTarget(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D11Texture2D *render_target = nullptr;
		static const char *kwlist[] = { "render_target", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &render_target)) {
			self->ptr.setRenderTarget(render_target);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::setRenderTarget(): unknown arguments:\n(ID3D11Texture2D* render_target) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_setDepthStencil(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D11Texture2D *depth_stencil = nullptr;
		static const char *kwlist[] = { "depth_stencil", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &depth_stencil)) {
			self->ptr.setDepthStencil(depth_stencil);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::setDepthStencil(): unknown arguments:\n(ID3D11Texture2D* depth_stencil) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getRenderTarget(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTarget());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getRenderTarget(): unknown arguments:\n(void) -> ID3D11Texture2D*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getDepthStencil(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthStencil());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getDepthStencil(): unknown arguments:\n(void) -> ID3D11Texture2D*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_setRenderTargetView(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D11RenderTargetView *render_target_view = nullptr;
		static const char *kwlist[] = { "render_target_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &render_target_view)) {
			self->ptr.setRenderTargetView(render_target_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::setRenderTargetView(): unknown arguments:\n(ID3D11RenderTargetView* render_target_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_setDepthStencilView(PYD3D11Surface *self, PyObject *args, PyObject *kwargs) {
		ID3D11DepthStencilView *depth_stencil_view = nullptr;
		static const char *kwlist[] = { "depth_stencil_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &depth_stencil_view)) {
			self->ptr.setDepthStencilView(depth_stencil_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::setDepthStencilView(): unknown arguments:\n(ID3D11DepthStencilView* depth_stencil_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getRenderTargetView(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderTargetView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getRenderTargetView(): unknown arguments:\n(void) -> ID3D11RenderTargetView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getDepthStencilView(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getDepthStencilView(): unknown arguments:\n(void) -> ID3D11DepthStencilView*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getColorDXGIFormat(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getColorDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_getDepthDXGIFormat(PYD3D11Surface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthDXGIFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "D3D11Surface::getDepthDXGIFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *D3D11Surface_get_factory(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFactory());
	}
	static PyObject *D3D11Surface_get_device(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *D3D11Surface_get_context(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getContext());
	}
	static PyObject *D3D11Surface_get_swap_chain(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getSwapChain());
	}
	static PyObject *D3D11Surface_get_render_target(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTarget());
	}
	static PyObject *D3D11Surface_get_depth_stencil(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthStencil());
	}
	static PyObject *D3D11Surface_get_render_target_view(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderTargetView());
	}
	static PyObject *D3D11Surface_get_depth_stencil_view(PYD3D11Surface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthStencilView());
	}
	static PyObject *D3D11Surface_get_color_dxgi_format(PYD3D11Surface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorDXGIFormat());
	}
	static PyObject *D3D11Surface_get_depth_dxgi_format(PYD3D11Surface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthDXGIFormat());
	}
	static PyObject *pyD3D11Surface_str(PYD3D11Surface *self) {
		return PyUnicode_FromString(String::format("D3D11Surface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyD3D11Surface_bool(PYD3D11Surface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MTLSurface
	static void pyMTLSurface_base(PYMTLSurface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYMTLSurface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMTLSurface_Type);
	}
	TS_PYAPI MTLSurface &pyMTLSurface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMTLSurface_Type) return ((PYMTLSurface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MTLSurface_get(): can't get MTLSurface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MTLSurface_get(): can't get MTLSurface from None");
		static MTLSurface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyMTLSurface_new(const MTLSurface &ptr) {
		PYMTLSurface *ret = (PYMTLSurface*)PyObject_New(PYMTLSurface, &PYMTLSurface_Type);
		new(&ret->ptr) MTLSurface(ptr); pyMTLSurface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyMTLSurface_new(MTLSurface &&ptr) {
		PYMTLSurface *ret = (PYMTLSurface*)PyObject_New(PYMTLSurface, &PYMTLSurface_Type);
		new(&ret->ptr) MTLSurface(move(ptr)); pyMTLSurface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyMTLSurface_init(PYMTLSurface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) MTLSurface(((PYSurface*)object)->ptr);
				pyMTLSurface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MTLSurface();
			pyMTLSurface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYMTLContext(context_)) break;
				MTLContext &context = pyMTLContext_get(context_);
				new(&self->ptr) MTLSurface(context);
				pyMTLSurface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::MTLSurface(): unknown arguments:\n(void)\n(MTLContext context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMTLSurface_dealloc(PYMTLSurface *self) {
		self->ptr.~MTLSurface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyMTLSurface_equalPtr(PYMTLSurface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyMTLSurface_clonePtr(PYMTLSurface *self, PyObject *args) {
		return pyMTLSurface_new(self->ptr.clonePtr());
	}
	static PyObject *pyMTLSurface_clearPtr(PYMTLSurface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSurface_destroyPtr(PYMTLSurface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSurface_acquirePtr(PYMTLSurface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSurface_unacquirePtr(PYMTLSurface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyMTLSurface_isValidPtr(PYMTLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyMTLSurface_isOwnerPtr(PYMTLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyMTLSurface_isConstPtr(PYMTLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyMTLSurface_getCountPtr(PYMTLSurface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyMTLSurface_getInternalPtr(PYMTLSurface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyMTLSurface_getSurface(PYMTLSurface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *MTLSurface_getDevice(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getDevice(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_getQueue(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getQueue(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_getCommand(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getCommand(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_setDescriptor(PYMTLSurface *self, PyObject *args, PyObject *kwargs) {
		void *descriptor = nullptr;
		static const char *kwlist[] = { "descriptor", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &descriptor)) {
			self->ptr.setDescriptor(descriptor);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::setDescriptor(): unknown arguments:\n(void* descriptor) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_getDescriptor(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDescriptor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getDescriptor(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_getColorPixelFormat(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getColorPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_getDepthPixelFormat(PYMTLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MTLSurface::getDepthPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MTLSurface_get_device(PYMTLSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *MTLSurface_get_queue(PYMTLSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *MTLSurface_get_command(PYMTLSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *MTLSurface_get_descriptor(PYMTLSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDescriptor());
	}
	static PyObject *MTLSurface_get_color_pixel_format(PYMTLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorPixelFormat());
	}
	static PyObject *MTLSurface_get_depth_pixel_format(PYMTLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthPixelFormat());
	}
	static PyObject *pyMTLSurface_str(PYMTLSurface *self) {
		return PyUnicode_FromString(String::format("MTLSurface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyMTLSurface_bool(PYMTLSurface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::VKSurface
	static void pyVKSurface_base(PYVKSurface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYVKSurface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYVKSurface_Type);
	}
	TS_PYAPI VKSurface &pyVKSurface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYVKSurface_Type) return ((PYVKSurface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "VKSurface_get(): can't get VKSurface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "VKSurface_get(): can't get VKSurface from None");
		static VKSurface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyVKSurface_new(const VKSurface &ptr) {
		PYVKSurface *ret = (PYVKSurface*)PyObject_New(PYVKSurface, &PYVKSurface_Type);
		new(&ret->ptr) VKSurface(ptr); pyVKSurface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyVKSurface_new(VKSurface &&ptr) {
		PYVKSurface *ret = (PYVKSurface*)PyObject_New(PYVKSurface, &PYVKSurface_Type);
		new(&ret->ptr) VKSurface(move(ptr)); pyVKSurface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyVKSurface_init(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) VKSurface(((PYSurface*)object)->ptr);
				pyVKSurface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) VKSurface();
			pyVKSurface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYVKContext(context_)) break;
				VKContext &context = pyVKContext_get(context_);
				new(&self->ptr) VKSurface(context);
				pyVKSurface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::VKSurface(): unknown arguments:\n(void)\n(VKContext context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyVKSurface_dealloc(PYVKSurface *self) {
		self->ptr.~VKSurface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyVKSurface_equalPtr(PYVKSurface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyVKSurface_clonePtr(PYVKSurface *self, PyObject *args) {
		return pyVKSurface_new(self->ptr.clonePtr());
	}
	static PyObject *pyVKSurface_clearPtr(PYVKSurface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKSurface_destroyPtr(PYVKSurface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKSurface_acquirePtr(PYVKSurface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKSurface_unacquirePtr(PYVKSurface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyVKSurface_isValidPtr(PYVKSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyVKSurface_isOwnerPtr(PYVKSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyVKSurface_isConstPtr(PYVKSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyVKSurface_getCountPtr(PYVKSurface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyVKSurface_getInternalPtr(PYVKSurface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyVKSurface_getSurface(PYVKSurface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *VKSurface_getInstance(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getInstance());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getInstance(): unknown arguments:\n(void) -> VkInstance\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getAdapter(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getAdapter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getAdapter(): unknown arguments:\n(void) -> VkPhysicalDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getDevice(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDevice());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getDevice(): unknown arguments:\n(void) -> VkDevice\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getQueue(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getQueue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getQueue(): unknown arguments:\n(void) -> VkQueue\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getCommand(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getCommand());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getCommand(): unknown arguments:\n(void) -> VkCommandBuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getFamily(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFamily());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getFamily(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setColorImage(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkImage image = {};
		static const char *kwlist[] = { "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &image)) {
			self->ptr.setColorImage(image);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setColorImage(): unknown arguments:\n(VkImage image) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setDepthImage(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkImage image = {};
		static const char *kwlist[] = { "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &image)) {
			self->ptr.setDepthImage(image);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setDepthImage(): unknown arguments:\n(VkImage image) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getColorImage(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getColorImage());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getColorImage(): unknown arguments:\n(void) -> VkImage\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getDepthImage(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthImage());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getDepthImage(): unknown arguments:\n(void) -> VkImage\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setColorImageView(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkImageView image_view = {};
		static const char *kwlist[] = { "image_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &image_view)) {
			self->ptr.setColorImageView(image_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setColorImageView(): unknown arguments:\n(VkImageView image_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setDepthImageView(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkImageView image_view = {};
		static const char *kwlist[] = { "image_view", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &image_view)) {
			self->ptr.setDepthImageView(image_view);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setDepthImageView(): unknown arguments:\n(VkImageView image_view) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getColorImageView(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getColorImageView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getColorImageView(): unknown arguments:\n(void) -> VkImageView\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getDepthImageView(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getDepthImageView());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getDepthImageView(): unknown arguments:\n(void) -> VkImageView\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setRenderPass(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkRenderPass render_pass = {};
		static const char *kwlist[] = { "render_pass", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &render_pass)) {
			self->ptr.setRenderPass(render_pass);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setRenderPass(): unknown arguments:\n(VkRenderPass render_pass) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_setFramebuffer(PYVKSurface *self, PyObject *args, PyObject *kwargs) {
		VkFramebuffer framebuffer = {};
		static const char *kwlist[] = { "framebuffer", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &framebuffer)) {
			self->ptr.setFramebuffer(framebuffer);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::setFramebuffer(): unknown arguments:\n(VkFramebuffer framebuffer) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getRenderPass(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getRenderPass());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getRenderPass(): unknown arguments:\n(void) -> VkRenderPass\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getFramebuffer(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getFramebuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getFramebuffer(): unknown arguments:\n(void) -> VkFramebuffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getColorPixelFormat(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getColorPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_getDepthPixelFormat(PYVKSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthPixelFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "VKSurface::getDepthPixelFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *VKSurface_get_instance(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getInstance());
	}
	static PyObject *VKSurface_get_adapter(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getAdapter());
	}
	static PyObject *VKSurface_get_device(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDevice());
	}
	static PyObject *VKSurface_get_queue(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getQueue());
	}
	static PyObject *VKSurface_get_command(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getCommand());
	}
	static PyObject *VKSurface_get_family(PYVKSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFamily());
	}
	static PyObject *VKSurface_get_color_image(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getColorImage());
	}
	static PyObject *VKSurface_get_depth_image(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthImage());
	}
	static PyObject *VKSurface_get_color_image_view(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getColorImageView());
	}
	static PyObject *VKSurface_get_depth_image_view(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getDepthImageView());
	}
	static PyObject *VKSurface_get_render_pass(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getRenderPass());
	}
	static PyObject *VKSurface_get_framebuffer(PYVKSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getFramebuffer());
	}
	static PyObject *VKSurface_get_color_pixel_format(PYVKSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorPixelFormat());
	}
	static PyObject *VKSurface_get_depth_pixel_format(PYVKSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthPixelFormat());
	}
	static PyObject *pyVKSurface_str(PYVKSurface *self) {
		return PyUnicode_FromString(String::format("VKSurface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyVKSurface_bool(PYVKSurface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLSurface
	static void pyGLSurface_base(PYGLSurface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYGLSurface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLSurface_Type);
	}
	TS_PYAPI GLSurface &pyGLSurface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLSurface_Type) return ((PYGLSurface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLSurface_get(): can't get GLSurface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLSurface_get(): can't get GLSurface from None");
		static GLSurface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLSurface_new(const GLSurface &ptr) {
		PYGLSurface *ret = (PYGLSurface*)PyObject_New(PYGLSurface, &PYGLSurface_Type);
		new(&ret->ptr) GLSurface(ptr); pyGLSurface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLSurface_new(GLSurface &&ptr) {
		PYGLSurface *ret = (PYGLSurface*)PyObject_New(PYGLSurface, &PYGLSurface_Type);
		new(&ret->ptr) GLSurface(move(ptr)); pyGLSurface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLSurface_init(PYGLSurface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) GLSurface(((PYSurface*)object)->ptr);
				pyGLSurface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLSurface();
			pyGLSurface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYGLContext(context_)) break;
				GLContext &context = pyGLContext_get(context_);
				new(&self->ptr) GLSurface(context);
				pyGLSurface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::GLSurface(): unknown arguments:\n(void)\n(GLContext context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLSurface_dealloc(PYGLSurface *self) {
		self->ptr.~GLSurface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLSurface_equalPtr(PYGLSurface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLSurface_clonePtr(PYGLSurface *self, PyObject *args) {
		return pyGLSurface_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLSurface_clearPtr(PYGLSurface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLSurface_destroyPtr(PYGLSurface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLSurface_acquirePtr(PYGLSurface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLSurface_unacquirePtr(PYGLSurface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLSurface_isValidPtr(PYGLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLSurface_isOwnerPtr(PYGLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLSurface_isConstPtr(PYGLSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLSurface_getCountPtr(PYGLSurface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLSurface_getInternalPtr(PYGLSurface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLSurface_getSurface(PYGLSurface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *GLSurface_getContext(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getContext(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_setColorTextureID(PYGLSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t texture_id = {};
		static const char *kwlist[] = { "texture_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &texture_id)) {
			self->ptr.setColorTextureID(texture_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::setColorTextureID(): unknown arguments:\n(uint32_t texture_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_setDepthTextureID(PYGLSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t texture_id = {};
		static const char *kwlist[] = { "texture_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &texture_id)) {
			self->ptr.setDepthTextureID(texture_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::setDepthTextureID(): unknown arguments:\n(uint32_t texture_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_getColorTextureID(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getColorTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_getDepthTextureID(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getDepthTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_setFramebufferID(PYGLSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t framebuffer_id = {};
		static const char *kwlist[] = { "framebuffer_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &framebuffer_id)) {
			self->ptr.setFramebufferID(framebuffer_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::setFramebufferID(): unknown arguments:\n(uint32_t framebuffer_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_getFramebufferID(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getFramebufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_getColorInternalFormat(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getColorInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_getDepthInternalFormat(PYGLSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLSurface::getDepthInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLSurface_get_context(PYGLSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getContext());
	}
	static PyObject *GLSurface_get_color_texture_id(PYGLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorTextureID());
	}
	static PyObject *GLSurface_get_depth_texture_id(PYGLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthTextureID());
	}
	static PyObject *GLSurface_get_framebuffer_id(PYGLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
	}
	static PyObject *GLSurface_get_color_internal_format(PYGLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorInternalFormat());
	}
	static PyObject *GLSurface_get_depth_internal_format(PYGLSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthInternalFormat());
	}
	static PyObject *pyGLSurface_str(PYGLSurface *self) {
		return PyUnicode_FromString(String::format("GLSurface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLSurface_bool(PYGLSurface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::GLESSurface
	static void pyGLESSurface_base(PYGLESSurface *self) {
		new(&self->base.ptr) Surface(self->ptr);
	}
	TS_PYAPI bool isPYGLESSurface(PyObject *object) {
		return (object && Py_TYPE(object) == &PYGLESSurface_Type);
	}
	TS_PYAPI GLESSurface &pyGLESSurface_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYGLESSurface_Type) return ((PYGLESSurface*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "GLESSurface_get(): can't get GLESSurface from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "GLESSurface_get(): can't get GLESSurface from None");
		static GLESSurface ret;
		return ret;
	}
	TS_PYAPI PyObject *pyGLESSurface_new(const GLESSurface &ptr) {
		PYGLESSurface *ret = (PYGLESSurface*)PyObject_New(PYGLESSurface, &PYGLESSurface_Type);
		new(&ret->ptr) GLESSurface(ptr); pyGLESSurface_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyGLESSurface_new(GLESSurface &&ptr) {
		PYGLESSurface *ret = (PYGLESSurface*)PyObject_New(PYGLESSurface, &PYGLESSurface_Type);
		new(&ret->ptr) GLESSurface(move(ptr)); pyGLESSurface_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyGLESSurface_init(PYGLESSurface *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYSurface(object)) {
				new(&self->ptr) GLESSurface(((PYSurface*)object)->ptr);
				pyGLESSurface_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) GLESSurface();
			pyGLESSurface_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *context_ = nullptr;
			static const char *kwlist[] = { "context", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &context_)) {
				if(!isPYGLESContext(context_)) break;
				GLESContext &context = pyGLESContext_get(context_);
				new(&self->ptr) GLESSurface(context);
				pyGLESSurface_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::GLESSurface(): unknown arguments:\n(void)\n(GLESContext context)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyGLESSurface_dealloc(PYGLESSurface *self) {
		self->ptr.~GLESSurface();
		self->base.ptr.~Surface();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyGLESSurface_equalPtr(PYGLESSurface *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyGLESSurface_clonePtr(PYGLESSurface *self, PyObject *args) {
		return pyGLESSurface_new(self->ptr.clonePtr());
	}
	static PyObject *pyGLESSurface_clearPtr(PYGLESSurface *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESSurface_destroyPtr(PYGLESSurface *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESSurface_acquirePtr(PYGLESSurface *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESSurface_unacquirePtr(PYGLESSurface *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyGLESSurface_isValidPtr(PYGLESSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyGLESSurface_isOwnerPtr(PYGLESSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyGLESSurface_isConstPtr(PYGLESSurface *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyGLESSurface_getCountPtr(PYGLESSurface *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyGLESSurface_getInternalPtr(PYGLESSurface *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyGLESSurface_getSurface(PYGLESSurface *self, PyObject *args) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *GLESSurface_getContext(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getContext());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getContext(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_setColorTextureID(PYGLESSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t texture_id = {};
		static const char *kwlist[] = { "texture_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &texture_id)) {
			self->ptr.setColorTextureID(texture_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::setColorTextureID(): unknown arguments:\n(uint32_t texture_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_setDepthTextureID(PYGLESSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t texture_id = {};
		static const char *kwlist[] = { "texture_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &texture_id)) {
			self->ptr.setDepthTextureID(texture_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::setDepthTextureID(): unknown arguments:\n(uint32_t texture_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_getColorTextureID(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getColorTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_getDepthTextureID(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthTextureID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getDepthTextureID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_setFramebufferID(PYGLESSurface *self, PyObject *args, PyObject *kwargs) {
		uint32_t framebuffer_id = {};
		static const char *kwlist[] = { "framebuffer_id", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &framebuffer_id)) {
			self->ptr.setFramebufferID(framebuffer_id);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::setFramebufferID(): unknown arguments:\n(uint32_t framebuffer_id) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_getFramebufferID(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getFramebufferID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_getColorInternalFormat(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getColorInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_getDepthInternalFormat(PYGLESSurface *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthInternalFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "GLESSurface::getDepthInternalFormat(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *GLESSurface_get_context(PYGLESSurface *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getContext());
	}
	static PyObject *GLESSurface_get_color_texture_id(PYGLESSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorTextureID());
	}
	static PyObject *GLESSurface_get_depth_texture_id(PYGLESSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthTextureID());
	}
	static PyObject *GLESSurface_get_framebuffer_id(PYGLESSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFramebufferID());
	}
	static PyObject *GLESSurface_get_color_internal_format(PYGLESSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorInternalFormat());
	}
	static PyObject *GLESSurface_get_depth_internal_format(PYGLESSurface *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthInternalFormat());
	}
	static PyObject *pyGLESSurface_str(PYGLESSurface *self) {
		return PyUnicode_FromString(String::format("GLESSurface Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyGLESSurface_bool(PYGLESSurface *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Window
	static void pyWindow_MousePressedCallback(Window::Button button, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(I)", button);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_MouseReleasedCallback(Window::Button button, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(I)", button);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_MouseChangedCallback(int32_t x, int32_t y, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(ii)", x, y);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_MouseRotatedCallback(Window::Axis axis, float32_t delta, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(If)", axis, delta);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_TouchChangedCallback(PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_KeyboardPressedCallback(uint32_t key, uint32_t code, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(II)", key, code);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_KeyboardReleasedCallback(uint32_t key, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(I)", key);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_SizeChangedCallback(uint32_t width, uint32_t height, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(II)", width, height);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_FocusChangedCallback(bool changed, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(i)", changed);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_CloseClickedCallback(PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_PauseChangedCallback(bool paused, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(i)", paused);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_FileDroppedCallback(const char *name, uint32_t remain, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(sI)", name, remain);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_UpdateCallback(PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyWindow_PresentCallback(PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static bool pyWindow_MainLoopCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYWindow(PyObject *object) {
		return (object && Py_TYPE(object) == &PYWindow_Type);
	}
	TS_PYAPI Window &pyWindow_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYWindow_Type) return ((PYWindow*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Window_get(): can't get Window from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Window_get(): can't get Window from None");
		static Window ret;
		return ret;
	}
	TS_PYAPI PyObject *pyWindow_new(const Window &ptr) {
		PYWindow *ret = (PYWindow*)PyObject_New(PYWindow, &PYWindow_Type);
		new(&ret->ptr) Window(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyWindow_new(Window &&ptr) {
		PYWindow *ret = (PYWindow*)PyObject_New(PYWindow, &PYWindow_Type);
		new(&ret->ptr) Window(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyWindow_init(PYWindow *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Window();
			return 0;
		}
		PyErr_Clear();
		{
			uint32_t platform = 0;
			uint32_t index = Maxu32;
			static const char *kwlist[] = { "platform", "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &platform, &index)) {
				new(&self->ptr) Window((Platform)platform, index);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *surface_ = nullptr;
			static const char *kwlist[] = { "surface", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
				if(!isPYSurface(surface_)) break;
				Surface &surface = pySurface_get(surface_);
				new(&self->ptr) Window(surface);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::Window(): unknown arguments:\n(void)\n(Platform platform, uint32_t index)\n(Surface surface)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyWindow_dealloc(PYWindow *self) {
		self->ptr.~Window();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyWindow_equalPtr(PYWindow *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyWindow_clonePtr(PYWindow *self, PyObject *args) {
		return pyWindow_new(self->ptr.clonePtr());
	}
	static PyObject *pyWindow_clearPtr(PYWindow *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWindow_destroyPtr(PYWindow *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWindow_acquirePtr(PYWindow *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWindow_unacquirePtr(PYWindow *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyWindow_isValidPtr(PYWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyWindow_isOwnerPtr(PYWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyWindow_isConstPtr(PYWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyWindow_getCountPtr(PYWindow *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyWindow_getInternalPtr(PYWindow *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Window_getNumWindows(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(Window::getNumWindows());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getNumWindows(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getWindow(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyWindow_new(Window::getWindow(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getWindow(): unknown arguments:\n(uint32_t index) -> Window\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_update(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t wait = false;
		static const char *kwlist[] = { "wait", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &wait)) {
			Window::update((wait != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::update(): unknown arguments:\n(bool wait) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getPlatform(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPlatform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getPlatform(): unknown arguments:\n(void) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getPlatformName(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPlatformName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getPlatformName(): unknown arguments:\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getIndex(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setSurface(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *surface_ = nullptr;
		static const char *kwlist[] = { "surface", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &surface_)) {
			if(!isPYSurface(surface_)) break;
			Surface &surface = pySurface_get(surface_);
			self->ptr.setSurface(surface);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setSurface(): unknown arguments:\n(Surface surface) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getSurface(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySurface_new(self->ptr.getSurface());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getSurface(): unknown arguments:\n(void) -> Surface\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getHandle(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getHandle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getHandle(): unknown arguments:\n(void) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isCreated(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_create(PYWindow *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		uint32_t flags = Window::DefaultFlags;
		static const char *kwlist[] = { "title", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|I", (char**)kwlist, &title, &flags)) {
			return PyLong_FromLong(self->ptr.create(title, (Window::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			uint32_t flags = Window::DefaultFlags;
			static const char *kwlist[] = { "title", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &title_, &flags)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				return PyLong_FromLong(self->ptr.create(title, (Window::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			uint32_t flags = Window::DefaultFlags;
			static const char *kwlist[] = { "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
				return PyLong_FromLong(self->ptr.create((Window::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::create(): unknown arguments:\n(const char* title, Window.Flags flags) -> bool\n(const String title, Window.Flags flags) -> bool\n(Window.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_release(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.release();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::release(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_clear(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			return PyLong_FromLong(self->ptr.clear(color));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::clear(): unknown arguments:\n(const Color color) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_grab(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *image_ = nullptr;
		static const char *kwlist[] = { "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &image_)) {
			if(!isPYImage(image_)) break;
			Image &image = pyImage_get(image_);
			return PyLong_FromLong(self->ptr.grab(image));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::grab(): unknown arguments:\n(Image image) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_render(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.render());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::render(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_present(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.present());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::present(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_finish(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.finish());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::finish(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getColorFormat(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getColorFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getDepthFormat(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getDepthFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMultisample(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_hasMultisample(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.hasMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::hasMultisample(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setFlags(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			self->ptr.setFlags((Window::Flags)flags);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setFlags(): unknown arguments:\n(Window.Flags flags) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getFlags(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getFlags(): unknown arguments:\n(void) -> Window::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_hasFlag(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlag((Window::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::hasFlag(): unknown arguments:\n(Window.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_hasFlags(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlags((Window::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::hasFlags(): unknown arguments:\n(Window.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setRefreshRate(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t rate = {};
		static const char *kwlist[] = { "rate", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &rate)) {
			self->ptr.setRefreshRate(rate);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setRefreshRate(): unknown arguments:\n(uint32_t rate) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getRefreshRate(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getRefreshRate());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getRefreshRate(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setHidden(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t hidden = {};
		static const char *kwlist[] = { "hidden", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &hidden)) {
			return PyLong_FromLong(self->ptr.setHidden((hidden != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setHidden(): unknown arguments:\n(bool hidden) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isHidden(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHidden());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isHidden(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setFocused(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t focused = {};
		static const char *kwlist[] = { "focused", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &focused)) {
			return PyLong_FromLong(self->ptr.setFocused((focused != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setFocused(): unknown arguments:\n(bool focused) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isFocused(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFocused());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isFocused(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMinimized(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t minimized = {};
		static const char *kwlist[] = { "minimized", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &minimized)) {
			return PyLong_FromLong(self->ptr.setMinimized((minimized != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMinimized(): unknown arguments:\n(bool minimized) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isMinimized(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMinimized());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isMinimized(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setFullscreen(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t fullscreen = {};
		static const char *kwlist[] = { "fullscreen", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &fullscreen)) {
			return PyLong_FromLong(self->ptr.setFullscreen((fullscreen != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setFullscreen(): unknown arguments:\n(bool fullscreen) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isFullscreen(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFullscreen());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isFullscreen(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isOccluded(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isOccluded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isOccluded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setTitle(PYWindow *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			return PyLong_FromLong(self->ptr.setTitle(title));
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				return PyLong_FromLong(self->ptr.setTitle(title));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setTitle(): unknown arguments:\n(const char* title) -> bool\n(const String title) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getTitle(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setIcon(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *image_ = nullptr;
		static const char *kwlist[] = { "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &image_)) {
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			return PyLong_FromLong(self->ptr.setIcon(image));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setIcon(): unknown arguments:\n(const Image image) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getIcon(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyImage_new(self->ptr.getIcon());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getIcon(): unknown arguments:\n(void) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setGeometry(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		uint32_t width = {};
		uint32_t height = {};
		int32_t force = false;
		static const char *kwlist[] = { "x", "y", "width", "height", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "iiII|i", (char**)kwlist, &x, &y, &width, &height, &force)) {
			return PyLong_FromLong(self->ptr.setGeometry(x, y, width, height, (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setGeometry(): unknown arguments:\n(int32_t x, int32_t y, uint32_t width, uint32_t height, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setPosition(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		int32_t force = false;
		static const char *kwlist[] = { "x", "y", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", (char**)kwlist, &x, &y, &force)) {
			return PyLong_FromLong(self->ptr.setPosition(x, y, (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setPosition(): unknown arguments:\n(int32_t x, int32_t y, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getPositionX(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t title = false;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &title)) {
			return PyLong_FromLong(self->ptr.getPositionX((title != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getPositionX(): unknown arguments:\n(bool title) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getPositionY(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t title = false;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &title)) {
			return PyLong_FromLong(self->ptr.getPositionY((title != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getPositionY(): unknown arguments:\n(bool title) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setSize(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = {};
		int32_t force = false;
		static const char *kwlist[] = { "width", "height", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|i", (char**)kwlist, &width, &height, &force)) {
			return PyLong_FromLong(self->ptr.setSize(width, height, (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setSize(): unknown arguments:\n(uint32_t width, uint32_t height, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getWidth(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getHeight(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getScale(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getScale(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getDpiX(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDpiX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getDpiX(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getDpiY(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDpiY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getDpiY(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouse(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		int32_t force = false;
		static const char *kwlist[] = { "x", "y", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", (char**)kwlist, &x, &y, &force)) {
			return PyLong_FromLong(self->ptr.setMouse(x, y, (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouse(): unknown arguments:\n(int32_t x, int32_t y, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseX(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getMouseX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseY(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getMouseY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseDelta(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t dx = {};
		int32_t dy = {};
		static const char *kwlist[] = { "dx", "dy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &dx, &dy)) {
			return PyLong_FromLong(self->ptr.setMouseDelta(dx, dy));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseDelta(): unknown arguments:\n(int32_t dx, int32_t dy) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseDX(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getMouseDX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseDX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseDY(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getMouseDY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseDY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseHidden(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t hidden = {};
		int32_t force = false;
		static const char *kwlist[] = { "hidden", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &hidden, &force)) {
			return PyLong_FromLong(self->ptr.setMouseHidden((hidden != 0), (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseHidden(): unknown arguments:\n(bool hidden, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isMouseHidden(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMouseHidden());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isMouseHidden(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseClipped(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t clipped = {};
		int32_t force = false;
		static const char *kwlist[] = { "clipped", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &clipped, &force)) {
			return PyLong_FromLong(self->ptr.setMouseClipped((clipped != 0), (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseClipped(): unknown arguments:\n(bool clipped, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isMouseClipped(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMouseClipped());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isMouseClipped(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isMouseInside(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMouseInside());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isMouseInside(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseCursor(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t cursor = 0;
		int32_t force = false;
		static const char *kwlist[] = { "cursor", "force", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &cursor, &force)) {
			return PyLong_FromLong(self->ptr.setMouseCursor((Window::Cursor)cursor, (force != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseCursor(): unknown arguments:\n(Window.Cursor cursor, bool force) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseCursor(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMouseCursor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseCursor(): unknown arguments:\n(void) -> Window::Cursor\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseButtons(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t buttons = 0;
		static const char *kwlist[] = { "buttons", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &buttons)) {
			return PyLong_FromLong(self->ptr.setMouseButtons((Window::Button)buttons));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseButtons(): unknown arguments:\n(Window.Button buttons) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseButtons(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMouseButtons());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseButtons(): unknown arguments:\n(void) -> Window::Button\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseButton(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t button = 0;
		int32_t value = {};
		static const char *kwlist[] = { "button", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &button, &value)) {
			return PyLong_FromLong(self->ptr.setMouseButton((Window::Button)button, (value != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseButton(): unknown arguments:\n(Window.Button button, bool value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseButton(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t button = 0;
		int32_t clear = false;
		static const char *kwlist[] = { "button", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &button, &clear)) {
			return PyLong_FromLong(self->ptr.getMouseButton((Window::Button)button, (clear != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseButton(): unknown arguments:\n(Window.Button button, bool clear) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_releaseMouseButtons(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t buttons = 0;
		static const char *kwlist[] = { "buttons", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &buttons)) {
			self->ptr.releaseMouseButtons((Window::Button)buttons);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::releaseMouseButtons(): unknown arguments:\n(Window.Button buttons) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_clearMouseButtons(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.clearMouseButtons());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::clearMouseButtons(): unknown arguments:\n(void) -> Window::Button\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseAxis(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t axis = 0;
		float32_t value = {};
		static const char *kwlist[] = { "axis", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &axis, &value)) {
			return PyLong_FromLong(self->ptr.setMouseAxis((Window::Axis)axis, value));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseAxis(): unknown arguments:\n(Window.Axis axis, float32_t value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getMouseAxis(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t axis = 0;
		static const char *kwlist[] = { "axis", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &axis)) {
			return PyFloat_FromDouble(self->ptr.getMouseAxis((Window::Axis)axis));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getMouseAxis(): unknown arguments:\n(Window.Axis axis) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_clearMouseAxis(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t axis = 0;
		static const char *kwlist[] = { "axis", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &axis)) {
			return PyFloat_FromDouble(self->ptr.clearMouseAxis((Window::Axis)axis));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::clearMouseAxis(): unknown arguments:\n(Window.Axis axis) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMousePressedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_MousePressedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setMousePressedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMousePressedCallback(): unknown arguments:\n(const Window.MousePressedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseReleasedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_MouseReleasedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setMouseReleasedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseReleasedCallback(): unknown arguments:\n(const Window.MouseReleasedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseChangedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_MouseChangedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setMouseChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseChangedCallback(): unknown arguments:\n(const Window.MouseChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setMouseRotatedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_MouseRotatedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setMouseRotatedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setMouseRotatedCallback(): unknown arguments:\n(const Window.MouseRotatedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getNumTouches(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumTouches());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getNumTouches(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_addTouch(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			return PyLong_FromUnsignedLong(self->ptr.addTouch(x, y));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::addTouch(): unknown arguments:\n(int32_t x, int32_t y) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getTouchX(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t touch = {};
		static const char *kwlist[] = { "touch", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &touch)) {
			return PyLong_FromLong(self->ptr.getTouchX(touch));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getTouchX(): unknown arguments:\n(uint32_t touch) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getTouchY(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t touch = {};
		static const char *kwlist[] = { "touch", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &touch)) {
			return PyLong_FromLong(self->ptr.getTouchY(touch));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getTouchY(): unknown arguments:\n(uint32_t touch) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_findTouch(PYWindow *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			return PyLong_FromUnsignedLong(self->ptr.findTouch(x, y));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::findTouch(): unknown arguments:\n(int32_t x, int32_t y) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_clearTouches(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearTouches();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::clearTouches(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setTouchChangedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_TouchChangedCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setTouchChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setTouchChangedCallback(): unknown arguments:\n(const Window.TouchChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setKeyboardKey(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t key = {};
		int32_t value = {};
		static const char *kwlist[] = { "key", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &key, &value)) {
			self->ptr.setKeyboardKey(key, (value != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setKeyboardKey(): unknown arguments:\n(uint32_t key, bool value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getKeyboardKey(PYWindow *self, PyObject *args, PyObject *kwargs) {
		uint32_t key = {};
		int32_t clear = false;
		static const char *kwlist[] = { "key", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &key, &clear)) {
			return PyLong_FromLong(self->ptr.getKeyboardKey(key, (clear != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getKeyboardKey(): unknown arguments:\n(uint32_t key, bool clear) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setKeyboardPressedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_KeyboardPressedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setKeyboardPressedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setKeyboardPressedCallback(): unknown arguments:\n(const Window.KeyboardPressedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setKeyboardReleasedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_KeyboardReleasedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setKeyboardReleasedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setKeyboardReleasedCallback(): unknown arguments:\n(const Window.KeyboardReleasedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setSizeChangedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_SizeChangedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setSizeChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setSizeChangedCallback(): unknown arguments:\n(const Window.SizeChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setFocusChangedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_FocusChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setFocusChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setFocusChangedCallback(): unknown arguments:\n(const Window.FocusChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setCloseClickedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_CloseClickedCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setCloseClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setCloseClickedCallback(): unknown arguments:\n(const Window.CloseClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setPauseChangedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_PauseChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setPauseChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setPauseChangedCallback(): unknown arguments:\n(const Window.PauseChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setFileDroppedCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_FileDroppedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setFileDroppedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setFileDroppedCallback(): unknown arguments:\n(const Window.FileDroppedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setUpdateCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setUpdateCallback(): unknown arguments:\n(const Window.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setPresentCallback(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_PresentCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setPresentCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setPresentCallback(): unknown arguments:\n(const Window.PresentCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_run(PYWindow *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyWindow_MainLoopCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			return PyLong_FromLong(self->ptr.run(func));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::run(): unknown arguments:\n(const Window.MainLoopCallback func) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_isRunning(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRunning());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::isRunning(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_stop(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.stop();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::stop(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_setCopyText(PYWindow *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			return PyLong_FromLong(self->ptr.setCopyText(text));
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromLong(self->ptr.setCopyText(text));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::setCopyText(): unknown arguments:\n(const char* text) -> bool\n(const String text) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_getPasteText(PYWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPasteText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Window::getPasteText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Window_get_num_windows(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumWindows());
	}
	static PyObject *Window_get_platform(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPlatform());
	}
	static PyObject *Window_get_platform_name(PYWindow *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPlatformName());
	}
	static PyObject *Window_get_index(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndex());
	}
	static PyObject *Window_get_surface(PYWindow *self, void *offset) {
		return pySurface_new(self->ptr.getSurface());
	}
	static PyObject *Window_get_handle(PYWindow *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getHandle());
	}
	static PyObject *Window_get_color_format(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
	}
	static PyObject *Window_get_depth_format(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
	}
	static PyObject *Window_get_multisample(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Window_get_flags(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *Window_get_refresh_rate(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getRefreshRate());
	}
	static PyObject *Window_get_title(PYWindow *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *Window_get_icon(PYWindow *self, void *offset) {
		return pyImage_new(self->ptr.getIcon());
	}
	static PyObject *Window_get_position_x(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *Window_get_position_y(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *Window_get_width(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Window_get_height(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Window_get_scale(PYWindow *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getScale());
	}
	static PyObject *Window_get_dpi_x(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDpiX());
	}
	static PyObject *Window_get_dpi_y(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDpiY());
	}
	static PyObject *Window_get_mouse_x(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getMouseX());
	}
	static PyObject *Window_get_mouse_y(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getMouseY());
	}
	static PyObject *Window_get_mouse_dx(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getMouseDX());
	}
	static PyObject *Window_get_mouse_dy(PYWindow *self, void *offset) {
		return PyLong_FromLong(self->ptr.getMouseDY());
	}
	static PyObject *Window_get_mouse_cursor(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMouseCursor());
	}
	static PyObject *Window_get_mouse_buttons(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMouseButtons());
	}
	static PyObject *Window_get_num_touches(PYWindow *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumTouches());
	}
	static PyObject *Window_get_paste_text(PYWindow *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPasteText().get());
	}
	static PyObject *pyWindow_str(PYWindow *self) {
		return PyUnicode_FromString(String::format("Window Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyWindow_bool(PYWindow *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Font
	TS_PYAPI bool isPYFont(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFont_Type);
	}
	TS_PYAPI Font &pyFont_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFont_Type) return ((PYFont*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Font_get(): can't get Font from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Font_get(): can't get Font from None");
		static Font ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFont_new(const Font &ptr) {
		PYFont *ret = (PYFont*)PyObject_New(PYFont, &PYFont_Type);
		new(&ret->ptr) Font(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFont_new(Font &&ptr) {
		PYFont *ret = (PYFont*)PyObject_New(PYFont, &PYFont_Type);
		new(&ret->ptr) Font(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyFont_init(PYFont *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Font();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::Font(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFont_dealloc(PYFont *self) {
		self->ptr.~Font();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFont_equalPtr(PYFont *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFont_clonePtr(PYFont *self, PyObject *args) {
		return pyFont_new(self->ptr.clonePtr());
	}
	static PyObject *pyFont_clearPtr(PYFont *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFont_destroyPtr(PYFont *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFont_acquirePtr(PYFont *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFont_unacquirePtr(PYFont *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFont_isValidPtr(PYFont *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFont_isOwnerPtr(PYFont *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFont_isConstPtr(PYFont *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFont_getCountPtr(PYFont *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFont_getInternalPtr(PYFont *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Font_clear(PYFont *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_isLoaded(PYFont *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isLoaded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::isLoaded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_load(PYFont *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.load(name));
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			static const char *kwlist[] = { "stream", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &stream_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return PyLong_FromLong(self->ptr.load(stream));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::load(): unknown arguments:\n(const char* name) -> bool\n(Stream stream) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_getAdvance(PYFont *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		uint32_t code = {};
		static const char *kwlist[] = { "style", "code", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &style_, &code)) {
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return PyFloat_FromDouble(self->ptr.getAdvance(style, code));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::getAdvance(): unknown arguments:\n(const FontStyle style, uint32_t code) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_getRect(PYFont *self, PyObject *args, PyObject *kwargs) {
		PyObject *position_ = nullptr;
		PyObject *style_ = nullptr;
		const char *str = nullptr;
		static const char *kwlist[] = { "position", "style", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOs", (char**)kwlist, &position_, &style_, &str)) {
			if(!isPYVector3f(position_)) break;
			const Vector3f &position = pyVector3f_get(position_);
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return pyRect_new(self->ptr.getRect(position, style, str));
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			PyObject *style_ = nullptr;
			const uint32_t *str = nullptr;
			static const char *kwlist[] = { "position", "style", "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &position_, &style_, &str)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				if(!isPYFontStyle(style_)) break;
				const FontStyle &style = pyFontStyle_get(style_);
				return pyRect_new(self->ptr.getRect(position, style, str));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::getRect(): unknown arguments:\n(const Vector3f position, const FontStyle style, const char* str) -> Rect\n(const Vector3f position, const FontStyle style, const uint32_t* str) -> Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_create(PYFont *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		PyObject *style_ = nullptr;
		const char *str = nullptr;
		static const char *kwlist[] = { "device", "style", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOs", (char**)kwlist, &device_, &style_, &str)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			self->ptr.create(device, style, str);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *style_ = nullptr;
			const uint32_t *str = nullptr;
			static const char *kwlist[] = { "device", "style", "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOn", (char**)kwlist, &device_, &style_, &str)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYFontStyle(style_)) break;
				const FontStyle &style = pyFontStyle_get(style_);
				self->ptr.create(device, style, str);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::create(): unknown arguments:\n(const Device device, const FontStyle style, const char* str) -> void\n(const Device device, const FontStyle style, const uint32_t* str) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_draw(PYFont *self, PyObject *args, PyObject *kwargs) {
		PyObject *command_ = nullptr;
		PyObject *position_ = nullptr;
		PyObject *style_ = nullptr;
		const char *str = nullptr;
		static const char *kwlist[] = { "command", "position", "style", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOs", (char**)kwlist, &command_, &position_, &style_, &str)) {
			if(!isPYCommand(command_)) break;
			Command &command = pyCommand_get(command_);
			if(!isPYVector3f(position_)) break;
			const Vector3f &position = pyVector3f_get(position_);
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			self->ptr.draw(command, position, style, str);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			PyObject *position_ = nullptr;
			PyObject *style_ = nullptr;
			const uint32_t *str = nullptr;
			static const char *kwlist[] = { "command", "position", "style", "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOn", (char**)kwlist, &command_, &position_, &style_, &str)) {
				if(!isPYCommand(command_)) break;
				Command &command = pyCommand_get(command_);
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				if(!isPYFontStyle(style_)) break;
				const FontStyle &style = pyFontStyle_get(style_);
				self->ptr.draw(command, position, style, str);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::draw(): unknown arguments:\n(Command command, const Vector3f position, const FontStyle style, const char* str) -> void\n(Command command, const Vector3f position, const FontStyle style, const uint32_t* str) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Font_flush(PYFont *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		static const char *kwlist[] = { "device", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &device_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.flush(device));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Font::flush(): unknown arguments:\n(const Device device) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyFont_str(PYFont *self) {
		return PyUnicode_FromString(String::format("Font Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFont_bool(PYFont *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasElement
	static bool pyCanvasElement_DrawCallback(Command command, CanvasElement element, PyObject *func) {
		bool ret = {};
		PyObject *command_ = pyCommand_new(command);
		PyObject *element_ = pyCanvasElement_new(element);
		if(func) {
			PyObject *args = Py_BuildValue("(OO)", command_, element_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(element_);
		Py_DECREF(command_);
		return ret;
	}
	TS_PYAPI bool isPYCanvasElement(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYCanvasElement_Type || type == &PYCanvasText_Type || type == &PYCanvasMesh_Type || type == &PYCanvasRect_Type || type == &PYCanvasTriangle_Type || type == &PYCanvasEllipse_Type || type == &PYCanvasShape_Type || type == &PYCanvasStrip_Type);
	}
	TS_PYAPI CanvasElement &pyCanvasElement_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYCanvasElement_Type || type == &PYCanvasText_Type || type == &PYCanvasMesh_Type || type == &PYCanvasRect_Type || type == &PYCanvasTriangle_Type || type == &PYCanvasEllipse_Type || type == &PYCanvasShape_Type || type == &PYCanvasStrip_Type) return ((PYCanvasElement*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasElement_get(): can't get CanvasElement from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasElement_get(): can't get CanvasElement from None");
		static CanvasElement ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasElement_new(const CanvasElement &ptr) {
		PYCanvasElement *ret = (PYCanvasElement*)PyObject_New(PYCanvasElement, &PYCanvasElement_Type);
		new(&ret->ptr) CanvasElement(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasElement_new(CanvasElement &&ptr) {
		PYCanvasElement *ret = (PYCanvasElement*)PyObject_New(PYCanvasElement, &PYCanvasElement_Type);
		new(&ret->ptr) CanvasElement(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyCanvasElement_init(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasElement();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::CanvasElement(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasElement_dealloc(PYCanvasElement *self) {
		self->ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasElement_equalPtr(PYCanvasElement *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasElement_clonePtr(PYCanvasElement *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasElement_clearPtr(PYCanvasElement *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasElement_destroyPtr(PYCanvasElement *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasElement_acquirePtr(PYCanvasElement *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasElement_unacquirePtr(PYCanvasElement *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasElement_isValidPtr(PYCanvasElement *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasElement_isOwnerPtr(PYCanvasElement *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasElement_isConstPtr(PYCanvasElement *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasElement_getCountPtr(PYCanvasElement *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasElement_getInternalPtr(PYCanvasElement *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *CanvasElement_getType(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getType(): unknown arguments:\n(void) -> CanvasElement::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getTypeName(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(CanvasElement::getTypeName((CanvasElement::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getTypeName(): unknown arguments:\n(CanvasElement.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isText(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isText());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isText(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isMesh(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isMesh(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isRect(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isRect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isTriangle(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTriangle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isTriangle(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isEllipse(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEllipse());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isEllipse(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isShape(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isShape());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isShape(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isStrip(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isStrip());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isStrip(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setCanvas(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *canvas_ = nullptr;
		static const char *kwlist[] = { "canvas", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
			if(!isPYCanvas(canvas_)) break;
			Canvas &canvas = pyCanvas_get(canvas_);
			self->ptr.setCanvas(canvas);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setCanvas(): unknown arguments:\n(Canvas canvas) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getCanvas(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvas_new(self->ptr.getCanvas());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvas_new(self->ptr.getCanvas());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getCanvas(): unknown arguments:\n(void) -> const Canvas\n(void) -> Canvas\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setMode(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setMode((CanvasElement::Mode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setMode(): unknown arguments:\n(CanvasElement.Mode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getMode(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getMode(): unknown arguments:\n(void) -> CanvasElement::Mode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setAlign(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			self->ptr.setAlign((CanvasElement::Align)align);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setAlign(): unknown arguments:\n(CanvasElement.Align align) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getAlign(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getAlign(): unknown arguments:\n(void) -> CanvasElement::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_hasAlign(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasAlign((CanvasElement::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::hasAlign(): unknown arguments:\n(CanvasElement.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_hasAligns(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasAligns((CanvasElement::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::hasAligns(): unknown arguments:\n(CanvasElement.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setOrder(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		int32_t order = {};
		static const char *kwlist[] = { "order", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &order)) {
			self->ptr.setOrder(order);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setOrder(): unknown arguments:\n(int32_t order) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getOrder(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getOrder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getOrder(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setEnabled(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setEnabled((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setEnabled(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_isEnabled(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::isEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_clearColor(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearColor();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::clearColor(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setColor(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		uint32_t op = CanvasElement::StackNone;
		static const char *kwlist[] = { "r", "g", "b", "a", "op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff|I", (char**)kwlist, &r, &g, &b, &a, &op)) {
			self->ptr.setColor(r, g, b, a, (CanvasElement::Stack)op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			uint32_t op = CanvasElement::StackNone;
			static const char *kwlist[] = { "color", "op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &color_, &op)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setColor(color, (CanvasElement::Stack)op);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			static const char *kwlist[] = { "op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &op)) {
				self->ptr.setColor((CanvasElement::Stack)op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a, CanvasElement.Stack op) -> void\n(const Color color, CanvasElement.Stack op) -> void\n(CanvasElement.Stack op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getColor(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getColorOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getColorOp(): unknown arguments:\n(void) -> CanvasElement::Stack\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_clearTransform(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearTransform();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::clearTransform(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setTransform(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		uint32_t op = CanvasElement::StackNone;
		static const char *kwlist[] = { "transform", "op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &transform_, &op)) {
			if(!isPYMatrix4x4f(transform_)) break;
			const Matrix4x4f &transform = pyMatrix4x4f_get(transform_);
			self->ptr.setTransform(transform, (CanvasElement::Stack)op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			static const char *kwlist[] = { "op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &op)) {
				self->ptr.setTransform((CanvasElement::Stack)op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setTransform(): unknown arguments:\n(const Matrix4x4f transform, CanvasElement.Stack op) -> void\n(CanvasElement.Stack op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getTransform(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x4f_new(self->ptr.getTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getTransform(): unknown arguments:\n(void) -> const Matrix4x4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getTransformOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTransformOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getTransformOp(): unknown arguments:\n(void) -> CanvasElement::Stack\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_clearScissor(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearScissor();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::clearScissor(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setScissor(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *scissor_ = nullptr;
		uint32_t op = CanvasElement::StackNone;
		static const char *kwlist[] = { "scissor", "op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &scissor_, &op)) {
			if(!isPYRect(scissor_)) break;
			const Rect &scissor = pyRect_get(scissor_);
			self->ptr.setScissor(scissor, (CanvasElement::Stack)op);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t op = 0;
			static const char *kwlist[] = { "op", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &op)) {
				self->ptr.setScissor((CanvasElement::Stack)op);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setScissor(): unknown arguments:\n(const Rect scissor, CanvasElement.Stack op) -> void\n(CanvasElement.Stack op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getScissor(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getScissor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getScissor(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getScissorOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getScissorOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getScissorOp(): unknown arguments:\n(void) -> CanvasElement::Stack\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setMipmap(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		float32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &mipmap)) {
			self->ptr.setMipmap(mipmap);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setMipmap(): unknown arguments:\n(float32_t mipmap) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getMipmap(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMipmap());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getMipmap(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setSampler(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *sampler_ = nullptr;
		static const char *kwlist[] = { "sampler", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &sampler_)) {
			if(!isPYSampler(sampler_)) break;
			Sampler &sampler = pySampler_get(sampler_);
			self->ptr.setSampler(sampler);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setSampler(): unknown arguments:\n(Sampler sampler) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getSampler(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pySampler_new(self->ptr.getSampler());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getSampler(): unknown arguments:\n(void) -> Sampler\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setFilter(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &filter)) {
			self->ptr.setFilter((Sampler::Filter)filter);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setFilter(): unknown arguments:\n(Sampler.Filter filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getFilter(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFilter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getFilter(): unknown arguments:\n(void) -> Sampler::Filter\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setAnisotropy(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t anisotropy = {};
		static const char *kwlist[] = { "anisotropy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &anisotropy)) {
			self->ptr.setAnisotropy(anisotropy);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setAnisotropy(): unknown arguments:\n(uint32_t anisotropy) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getAnisotropy(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getAnisotropy(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setWrapMode(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setWrapMode((Sampler::WrapMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setWrapMode(): unknown arguments:\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getWrapMode(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWrapMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getWrapMode(): unknown arguments:\n(void) -> Sampler::WrapMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setTexture(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		int32_t linear = false;
		static const char *kwlist[] = { "texture", "linear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &texture_, &linear)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.setTexture(texture, (linear != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setTexture(): unknown arguments:\n(Texture texture, bool linear) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getTexture(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.getTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getTexture(): unknown arguments:\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getTextureLinear(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureLinear());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getTextureLinear(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setPipeline(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
			if(!isPYPipeline(pipeline_)) break;
			Pipeline pipeline = pyPipeline_get(pipeline_);
			self->ptr.setPipeline(pipeline);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setPipeline(): unknown arguments:\n(Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getPipeline(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyPipeline_new(self->ptr.getPipeline());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getPipeline(): unknown arguments:\n(void) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setPrimitive(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t primitive = 0;
		static const char *kwlist[] = { "primitive", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &primitive)) {
			self->ptr.setPrimitive((Pipeline::Primitive)primitive);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setPrimitive(): unknown arguments:\n(Pipeline.Primitive primitive) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getPrimitive(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPrimitive());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getPrimitive(): unknown arguments:\n(void) -> Pipeline::Primitive\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setCullMode(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setCullMode((Pipeline::CullMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setCullMode(): unknown arguments:\n(Pipeline.CullMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getCullMode(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCullMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getCullMode(): unknown arguments:\n(void) -> Pipeline::CullMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setFrontMode(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setFrontMode((Pipeline::FrontMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setFrontMode(): unknown arguments:\n(Pipeline.FrontMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getFrontMode(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFrontMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getFrontMode(): unknown arguments:\n(void) -> Pipeline::FrontMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setBlend(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
			self->ptr.setBlend((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setBlend(): unknown arguments:\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getBlendOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getBlendOp(): unknown arguments:\n(void) -> Pipeline::BlendOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getBlendSrcFunc(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getBlendSrcFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getBlendDestFunc(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getBlendDestFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setColorMask(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setColorMask((Pipeline::ColorMask)mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setColorMask(): unknown arguments:\n(Pipeline.ColorMask mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getColorMask(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getColorMask(): unknown arguments:\n(void) -> Pipeline::ColorMask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setDepthMask(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setDepthMask((Pipeline::DepthMask)mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setDepthMask(): unknown arguments:\n(Pipeline.DepthMask mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getDepthMask(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getDepthMask(): unknown arguments:\n(void) -> Pipeline::DepthMask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setDepthFunc(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &func)) {
			self->ptr.setDepthFunc((Pipeline::DepthFunc)func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setDepthFunc(): unknown arguments:\n(Pipeline.DepthFunc func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getDepthFunc(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getDepthFunc(): unknown arguments:\n(void) -> Pipeline::DepthFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setStencilRef(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t ref = {};
		static const char *kwlist[] = { "ref", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &ref)) {
			self->ptr.setStencilRef(ref);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setStencilRef(): unknown arguments:\n(uint32_t ref) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setStencilFunc(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		uint32_t fail_op = 0;
		uint32_t dfail_op = 0;
		uint32_t dpass_op = 0;
		static const char *kwlist[] = { "func", "fail_op", "dfail_op", "dpass_op", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &func, &fail_op, &dfail_op, &dpass_op)) {
			self->ptr.setStencilFunc((Pipeline::StencilFunc)func, (Pipeline::StencilOp)fail_op, (Pipeline::StencilOp)dfail_op, (Pipeline::StencilOp)dpass_op);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setStencilFunc(): unknown arguments:\n(Pipeline.StencilFunc func, Pipeline.StencilOp fail_op, Pipeline.StencilOp dfail_op, Pipeline.StencilOp dpass_op) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getStencilRef(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilRef());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getStencilRef(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getStencilFunc(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getStencilFunc(): unknown arguments:\n(void) -> Pipeline::StencilFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getStencilFailOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getStencilFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getStencilDepthFailOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilDepthFailOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getStencilDepthFailOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getStencilDepthPassOp(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getStencilDepthPassOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getStencilDepthPassOp(): unknown arguments:\n(void) -> Pipeline::StencilOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_setDrawCallback(PYCanvasElement *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvasElement_DrawCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setDrawCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::setDrawCallback(): unknown arguments:\n(const CanvasElement.DrawCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_getRect(PYCanvasElement *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasElement::getRect(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasElement_get_type(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *CanvasElement_get_canvas(PYCanvasElement *self, void *offset) {
		return pyCanvas_new(self->ptr.getCanvas());
	}
	static PyObject *CanvasElement_get_mode(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMode());
	}
	static PyObject *CanvasElement_get_align(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAlign());
	}
	static PyObject *CanvasElement_get_order(PYCanvasElement *self, void *offset) {
		return PyLong_FromLong(self->ptr.getOrder());
	}
	static PyObject *CanvasElement_get_color(PYCanvasElement *self, void *offset) {
		return pyColor_new(self->ptr.getColor());
	}
	static PyObject *CanvasElement_get_color_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorOp());
	}
	static PyObject *CanvasElement_get_transform(PYCanvasElement *self, void *offset) {
		return pyMatrix4x4f_new(self->ptr.getTransform());
	}
	static PyObject *CanvasElement_get_transform_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTransformOp());
	}
	static PyObject *CanvasElement_get_scissor(PYCanvasElement *self, void *offset) {
		return pyRect_new(self->ptr.getScissor());
	}
	static PyObject *CanvasElement_get_scissor_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getScissorOp());
	}
	static PyObject *CanvasElement_get_mipmap(PYCanvasElement *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMipmap());
	}
	static PyObject *CanvasElement_get_sampler(PYCanvasElement *self, void *offset) {
		return pySampler_new(self->ptr.getSampler());
	}
	static PyObject *CanvasElement_get_filter(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFilter());
	}
	static PyObject *CanvasElement_get_anisotropy(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
	}
	static PyObject *CanvasElement_get_wrap_mode(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWrapMode());
	}
	static PyObject *CanvasElement_get_texture(PYCanvasElement *self, void *offset) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *CanvasElement_get_texture_linear(PYCanvasElement *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureLinear());
	}
	static PyObject *CanvasElement_get_pipeline(PYCanvasElement *self, void *offset) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *CanvasElement_get_primitive(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPrimitive());
	}
	static PyObject *CanvasElement_get_cull_mode(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCullMode());
	}
	static PyObject *CanvasElement_get_front_mode(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFrontMode());
	}
	static PyObject *CanvasElement_get_blend_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
	}
	static PyObject *CanvasElement_get_blend_src_func(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
	}
	static PyObject *CanvasElement_get_blend_dest_func(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
	}
	static PyObject *CanvasElement_get_color_mask(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorMask());
	}
	static PyObject *CanvasElement_get_depth_mask(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
	}
	static PyObject *CanvasElement_get_depth_func(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
	}
	static PyObject *CanvasElement_get_stencil_ref(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilRef());
	}
	static PyObject *CanvasElement_get_stencil_func(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFunc());
	}
	static PyObject *CanvasElement_get_stencil_fail_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilFailOp());
	}
	static PyObject *CanvasElement_get_stencil_depth_fail_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilDepthFailOp());
	}
	static PyObject *CanvasElement_get_stencil_depth_pass_op(PYCanvasElement *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getStencilDepthPassOp());
	}
	static PyObject *CanvasElement_get_rect(PYCanvasElement *self, void *offset) {
		return pyRect_new(self->ptr.getRect());
	}
	static PyObject *pyCanvasElement_str(PYCanvasElement *self) {
		return PyUnicode_FromString(String::format("CanvasElement Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasElement_bool(PYCanvasElement *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasText
	static void pyCanvasText_base(PYCanvasText *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasText(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasText_Type);
	}
	TS_PYAPI CanvasText &pyCanvasText_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasText_Type) return ((PYCanvasText*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasText_get(): can't get CanvasText from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasText_get(): can't get CanvasText from None");
		static CanvasText ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasText_new(const CanvasText &ptr) {
		PYCanvasText *ret = (PYCanvasText*)PyObject_New(PYCanvasText, &PYCanvasText_Type);
		new(&ret->ptr) CanvasText(ptr); pyCanvasText_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasText_new(CanvasText &&ptr) {
		PYCanvasText *ret = (PYCanvasText*)PyObject_New(PYCanvasText, &PYCanvasText_Type);
		new(&ret->ptr) CanvasText(move(ptr)); pyCanvasText_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasText_init(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasText(((PYCanvasElement*)object)->ptr);
				pyCanvasText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasText();
			pyCanvasText_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasText(canvas);
				pyCanvasText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "canvas", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &canvas_, &text)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasText(canvas, text);
				pyCanvasText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "canvas", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &canvas_, &text_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) CanvasText(canvas, text);
				pyCanvasText_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::CanvasText(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, const char* text)\n(Canvas canvas, const String text)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasText_dealloc(PYCanvasText *self) {
		self->ptr.~CanvasText();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasText_equalPtr(PYCanvasText *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasText_clonePtr(PYCanvasText *self, PyObject *args) {
		return pyCanvasText_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasText_clearPtr(PYCanvasText *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasText_destroyPtr(PYCanvasText *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasText_acquirePtr(PYCanvasText *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasText_unacquirePtr(PYCanvasText *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasText_isValidPtr(PYCanvasText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasText_isOwnerPtr(PYCanvasText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasText_isConstPtr(PYCanvasText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasText_getCountPtr(PYCanvasText *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasText_getInternalPtr(PYCanvasText *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasText_getCanvasElement(PYCanvasText *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasText_setFontName(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setFontName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setFontName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setFontName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontName(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFontName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setFontColor(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setFontColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setFontColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontColor(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getFontColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setFontSize(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		uint32_t scale = {};
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &scale)) {
			return PyLong_FromLong(self->ptr.setFontSize(scale));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setFontSize(): unknown arguments:\n(uint32_t scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontSize(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setFontScale(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		uint32_t scale = {};
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &scale)) {
			return PyLong_FromLong(self->ptr.setFontScale(scale));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setFontScale(): unknown arguments:\n(uint32_t scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontScale(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontScale(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setFontStyle(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return PyLong_FromLong(self->ptr.setFontStyle(style));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setFontStyle(): unknown arguments:\n(const FontStyle style) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontStyleConst(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontStyleConst(): unknown arguments:\n(void) -> const FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getFontStyle(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getFontStyle(): unknown arguments:\n(void) -> const FontStyle\n(void) -> FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setPosition(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getPosition(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getPosition(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_setText(PYCanvasText *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::setText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_getText(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::getText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_clearBatches(PYCanvasText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearBatches();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasText::clearBatches(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasText_get_font_name(PYCanvasText *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFontName().get());
	}
	static PyObject *CanvasText_get_font_color(PYCanvasText *self, void *offset) {
		return pyColor_new(self->ptr.getFontColor());
	}
	static PyObject *CanvasText_get_font_size(PYCanvasText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontSize());
	}
	static PyObject *CanvasText_get_font_scale(PYCanvasText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontScale());
	}
	static PyObject *CanvasText_get_font_style_const(PYCanvasText *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyleConst());
	}
	static PyObject *CanvasText_get_font_style(PYCanvasText *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyle());
	}
	static PyObject *CanvasText_get_position(PYCanvasText *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition());
	}
	static PyObject *CanvasText_get_text(PYCanvasText *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getText().get());
	}
	static PyObject *pyCanvasText_str(PYCanvasText *self) {
		return PyUnicode_FromString(String::format("CanvasText Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasText_bool(PYCanvasText *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasMesh
	static void pyCanvasMesh_base(PYCanvasMesh *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasMesh(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasMesh_Type);
	}
	TS_PYAPI CanvasMesh &pyCanvasMesh_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasMesh_Type) return ((PYCanvasMesh*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasMesh_get(): can't get CanvasMesh from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasMesh_get(): can't get CanvasMesh from None");
		static CanvasMesh ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasMesh_new(const CanvasMesh &ptr) {
		PYCanvasMesh *ret = (PYCanvasMesh*)PyObject_New(PYCanvasMesh, &PYCanvasMesh_Type);
		new(&ret->ptr) CanvasMesh(ptr); pyCanvasMesh_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasMesh_new(CanvasMesh &&ptr) {
		PYCanvasMesh *ret = (PYCanvasMesh*)PyObject_New(PYCanvasMesh, &PYCanvasMesh_Type);
		new(&ret->ptr) CanvasMesh(move(ptr)); pyCanvasMesh_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasMesh_init(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasMesh(((PYCanvasElement*)object)->ptr);
				pyCanvasMesh_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasMesh();
			pyCanvasMesh_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasMesh(canvas);
				pyCanvasMesh_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			uint32_t mode = 0;
			static const char *kwlist[] = { "canvas", "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &canvas_, &mode)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasMesh(canvas, (CanvasElement::Mode)mode);
				pyCanvasMesh_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::CanvasMesh(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, CanvasElement.Mode mode)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasMesh_dealloc(PYCanvasMesh *self) {
		self->ptr.~CanvasMesh();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasMesh_equalPtr(PYCanvasMesh *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasMesh_clonePtr(PYCanvasMesh *self, PyObject *args) {
		return pyCanvasMesh_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasMesh_clearPtr(PYCanvasMesh *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasMesh_destroyPtr(PYCanvasMesh *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasMesh_acquirePtr(PYCanvasMesh *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasMesh_unacquirePtr(PYCanvasMesh *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasMesh_isValidPtr(PYCanvasMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasMesh_isOwnerPtr(PYCanvasMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasMesh_isConstPtr(PYCanvasMesh *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasMesh_getCountPtr(PYCanvasMesh *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasMesh_getInternalPtr(PYCanvasMesh *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasMesh_getCanvasElement(PYCanvasMesh *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasMesh_setTextureName(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setTextureName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setTextureName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setTextureName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getTextureName(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setGradientStyle(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getGradientStyleConst(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getGradientStyle(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_clearVertices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearVertices();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::clearVertices(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setNumVertices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		static const char *kwlist[] = { "num_vertices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_vertices)) {
			self->ptr.setNumVertices(num_vertices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setNumVertices(): unknown arguments:\n(uint32_t num_vertices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_reserveVertices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_vertices = {};
		static const char *kwlist[] = { "num_vertices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_vertices)) {
			self->ptr.reserveVertices(num_vertices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::reserveVertices(): unknown arguments:\n(uint32_t num_vertices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getNumVertices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getNumVertices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setVertices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *vertices_ = nullptr;
		uint32_t num_vertices = {};
		static const char *kwlist[] = { "vertices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &vertices_)) {
			if(!isPYArray(vertices_)) break;
			Array<CanvasVertex> vertices(pyArray_size(vertices_));
			for(uint32_t i = 0; i < vertices.size(); i++) vertices[i] = pyCanvasVertex_get(pyArray_get(vertices_, i));
			self->ptr.setVertices(vertices.get(), num_vertices = vertices.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setVertices(): unknown arguments:\n(const CanvasVertex vertices[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_addVertices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *vertices_ = nullptr;
		uint32_t num_vertices = {};
		static const char *kwlist[] = { "vertices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &vertices_)) {
			if(!isPYArray(vertices_)) break;
			Array<CanvasVertex> vertices(pyArray_size(vertices_));
			for(uint32_t i = 0; i < vertices.size(); i++) vertices[i] = pyCanvasVertex_get(pyArray_get(vertices_, i));
			self->ptr.addVertices(vertices.get(), num_vertices = vertices.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::addVertices(): unknown arguments:\n(const CanvasVertex vertices[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getVertices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVertices());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getVertices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getVertices(): unknown arguments:\n(void) -> const CanvasVertex*\n(void) -> CanvasVertex*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setVertex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *vertex_ = nullptr;
		static const char *kwlist[] = { "index", "vertex", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &vertex_)) {
			if(!isPYCanvasVertex(vertex_)) break;
			const CanvasVertex &vertex = pyCanvasVertex_get(vertex_);
			self->ptr.setVertex(index, vertex);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setVertex(): unknown arguments:\n(uint32_t index, const CanvasVertex vertex) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getVertex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyCanvasVertex_new(self->ptr.getVertex(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyCanvasVertex_new(self->ptr.getVertex(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getVertex(): unknown arguments:\n(uint32_t index) -> const CanvasVertex\n(uint32_t index) -> CanvasVertex\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setVertexPosition(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "index", "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iff|f", (char**)kwlist, &index, &x, &y, &z)) {
			self->ptr.setVertexPosition(index, x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "index", "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setVertexPosition(index, position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setVertexPosition(): unknown arguments:\n(uint32_t index, float32_t x, float32_t y, float32_t z) -> void\n(uint32_t index, const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getVertexPosition(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyVector3f_new(self->ptr.getVertexPosition(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getVertexPosition(): unknown arguments:\n(uint32_t index) -> Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setVertexTexCoord(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t s = {};
		float32_t t = {};
		static const char *kwlist[] = { "index", "s", "t", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iff", (char**)kwlist, &index, &s, &t)) {
			self->ptr.setVertexTexCoord(index, s, t);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "index", "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &texcoord_)) {
				if(!isPYVector2f(texcoord_)) break;
				const Vector2f &texcoord = pyVector2f_get(texcoord_);
				self->ptr.setVertexTexCoord(index, texcoord);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setVertexTexCoord(): unknown arguments:\n(uint32_t index, float32_t s, float32_t t) -> void\n(uint32_t index, const Vector2f texcoord) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getVertexTexCoord(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyVector2f_new(self->ptr.getVertexTexCoord(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getVertexTexCoord(): unknown arguments:\n(uint32_t index) -> Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setVertexColor(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "index", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setVertexColor(index, color);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			uint32_t color = {};
			static const char *kwlist[] = { "index", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &color)) {
				self->ptr.setVertexColor(index, color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setVertexColor(): unknown arguments:\n(uint32_t index, const Color color) -> void\n(uint32_t index, uint32_t color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getVertexColor(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexColor(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getVertexColor(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_addVertex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = {};
		float32_t s = {};
		float32_t t = {};
		uint32_t color = 0xffffffffu;
		static const char *kwlist[] = { "x", "y", "z", "s", "t", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "fffff|I", (char**)kwlist, &x, &y, &z, &s, &t, &color)) {
			return PyLong_FromUnsignedLong(self->ptr.addVertex(x, y, z, s, t, color));
		}
		PyErr_Clear();
		{
			float32_t x = {};
			float32_t y = {};
			float32_t z = {};
			uint32_t color = 0xffffffffu;
			static const char *kwlist[] = { "x", "y", "z", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "fff|I", (char**)kwlist, &x, &y, &z, &color)) {
				return PyLong_FromUnsignedLong(self->ptr.addVertex(x, y, z, color));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			PyObject *texcoord_ = nullptr;
			uint32_t color = {};
			static const char *kwlist[] = { "position", "texcoord", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOI", (char**)kwlist, &position_, &texcoord_, &color)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				if(!isPYVector2f(texcoord_)) break;
				const Vector2f &texcoord = pyVector2f_get(texcoord_);
				return PyLong_FromUnsignedLong(self->ptr.addVertex(position, texcoord, color));
			}
		}
		PyErr_Clear();
		{
			float32_t x = {};
			float32_t y = {};
			uint32_t color = 0xffffffffu;
			static const char *kwlist[] = { "x", "y", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|I", (char**)kwlist, &x, &y, &color)) {
				return PyLong_FromUnsignedLong(self->ptr.addVertex(x, y, color));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			uint32_t color = {};
			static const char *kwlist[] = { "position", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &position_, &color)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addVertex(position, color));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "position", "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &position_, &texcoord_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				if(!isPYVector2f(texcoord_)) break;
				const Vector2f &texcoord = pyVector2f_get(texcoord_);
				return PyLong_FromUnsignedLong(self->ptr.addVertex(position, texcoord));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addVertex(position));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::addVertex(): unknown arguments:\n(float32_t x, float32_t y, float32_t z, float32_t s, float32_t t, uint32_t color) -> uint32_t\n(float32_t x, float32_t y, float32_t z, uint32_t color) -> uint32_t\n(const Vector3f position, const Vector2f texcoord, uint32_t color) -> uint32_t\n(float32_t x, float32_t y, uint32_t color) -> uint32_t\n(const Vector3f position, uint32_t color) -> uint32_t\n(const Vector3f position, const Vector2f texcoord) -> uint32_t\n(const Vector3f position) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_clearIndices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearIndices();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::clearIndices(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setNumIndices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		static const char *kwlist[] = { "num_indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_indices)) {
			self->ptr.setNumIndices(num_indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setNumIndices(): unknown arguments:\n(uint32_t num_indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_reserveIndices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_indices = {};
		static const char *kwlist[] = { "num_indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_indices)) {
			self->ptr.reserveIndices(num_indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::reserveIndices(): unknown arguments:\n(uint32_t num_indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getNumIndices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getNumIndices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setIndices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		const uint32_t *indices = nullptr;
		uint32_t num_indices = {};
		static const char *kwlist[] = { "indices", "num_indices", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &indices, &num_indices)) {
			self->ptr.setIndices(indices, num_indices);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setIndices(): unknown arguments:\n(const uint32_t* indices, uint32_t num_indices) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_addIndices(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t i0 = {};
		uint32_t i1 = {};
		uint32_t i2 = {};
		uint32_t i3 = {};
		static const char *kwlist[] = { "i0", "i1", "i2", "i3", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIII", (char**)kwlist, &i0, &i1, &i2, &i3)) {
			self->ptr.addIndices(i0, i1, i2, i3);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t i0 = {};
			uint32_t i1 = {};
			uint32_t i2 = {};
			static const char *kwlist[] = { "i0", "i1", "i2", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &i0, &i1, &i2)) {
				self->ptr.addIndices(i0, i1, i2);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const uint32_t *indices = nullptr;
			uint32_t num_indices = {};
			static const char *kwlist[] = { "indices", "num_indices", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nI", (char**)kwlist, &indices, &num_indices)) {
				self->ptr.addIndices(indices, num_indices);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			uint32_t i0 = {};
			uint32_t i1 = {};
			static const char *kwlist[] = { "i0", "i1", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &i0, &i1)) {
				self->ptr.addIndices(i0, i1);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::addIndices(): unknown arguments:\n(uint32_t i0, uint32_t i1, uint32_t i2, uint32_t i3) -> void\n(uint32_t i0, uint32_t i1, uint32_t i2) -> void\n(const uint32_t* indices, uint32_t num_indices) -> void\n(uint32_t i0, uint32_t i1) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getIndices(PYCanvasMesh *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getIndices());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getIndices(): unknown arguments:\n(void) -> const uint32_t*\n(void) -> uint32_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setIndex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t value = {};
		static const char *kwlist[] = { "index", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &value)) {
			self->ptr.setIndex(index, value);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setIndex(): unknown arguments:\n(uint32_t index, uint32_t value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_getIndex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getIndex(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::getIndex(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_addIndex(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		uint32_t i0 = {};
		static const char *kwlist[] = { "i0", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &i0)) {
			self->ptr.addIndex(i0);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::addIndex(): unknown arguments:\n(uint32_t i0) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_setRect(PYCanvasMesh *self, PyObject *args, PyObject *kwargs) {
		PyObject *rect_ = nullptr;
		static const char *kwlist[] = { "rect", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &rect_)) {
			if(!isPYRect(rect_)) break;
			const Rect &rect = pyRect_get(rect_);
			self->ptr.setRect(rect);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasMesh::setRect(): unknown arguments:\n(const Rect rect) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasMesh_get_texture_name(PYCanvasMesh *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *CanvasMesh_get_gradient_style_const(PYCanvasMesh *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *CanvasMesh_get_gradient_style(PYCanvasMesh *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *CanvasMesh_get_num_vertices(PYCanvasMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
	}
	static PyObject *CanvasMesh_get_vertices(PYCanvasMesh *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getVertices());
	}
	static PyObject *CanvasMesh_get_num_indices(PYCanvasMesh *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumIndices());
	}
	static PyObject *CanvasMesh_get_indices(PYCanvasMesh *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getIndices());
	}
	static PyObject *pyCanvasMesh_str(PYCanvasMesh *self) {
		return PyUnicode_FromString(String::format("CanvasMesh Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasMesh_bool(PYCanvasMesh *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasRect
	static void pyCanvasRect_base(PYCanvasRect *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasRect(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasRect_Type);
	}
	TS_PYAPI CanvasRect &pyCanvasRect_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasRect_Type) return ((PYCanvasRect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasRect_get(): can't get CanvasRect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasRect_get(): can't get CanvasRect from None");
		static CanvasRect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasRect_new(const CanvasRect &ptr) {
		PYCanvasRect *ret = (PYCanvasRect*)PyObject_New(PYCanvasRect, &PYCanvasRect_Type);
		new(&ret->ptr) CanvasRect(ptr); pyCanvasRect_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasRect_new(CanvasRect &&ptr) {
		PYCanvasRect *ret = (PYCanvasRect*)PyObject_New(PYCanvasRect, &PYCanvasRect_Type);
		new(&ret->ptr) CanvasRect(move(ptr)); pyCanvasRect_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasRect_init(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasRect(((PYCanvasElement*)object)->ptr);
				pyCanvasRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasRect();
			pyCanvasRect_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasRect(canvas);
				pyCanvasRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			float32_t radius = {};
			static const char *kwlist[] = { "canvas", "radius", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of", (char**)kwlist, &canvas_, &radius)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasRect(canvas, radius);
				pyCanvasRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			float32_t radius = {};
			PyObject *size_ = nullptr;
			static const char *kwlist[] = { "canvas", "radius", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OfO", (char**)kwlist, &canvas_, &radius, &size_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				if(!isPYVector2f(size_)) break;
				const Vector2f &size = pyVector2f_get(size_);
				new(&self->ptr) CanvasRect(canvas, radius, size);
				pyCanvasRect_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::CanvasRect(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, float32_t radius)\n(Canvas canvas, float32_t radius, const Vector2f size)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasRect_dealloc(PYCanvasRect *self) {
		self->ptr.~CanvasRect();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasRect_equalPtr(PYCanvasRect *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasRect_clonePtr(PYCanvasRect *self, PyObject *args) {
		return pyCanvasRect_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasRect_clearPtr(PYCanvasRect *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasRect_destroyPtr(PYCanvasRect *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasRect_acquirePtr(PYCanvasRect *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasRect_unacquirePtr(PYCanvasRect *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasRect_isValidPtr(PYCanvasRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasRect_isOwnerPtr(PYCanvasRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasRect_isConstPtr(PYCanvasRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasRect_getCountPtr(PYCanvasRect *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasRect_getInternalPtr(PYCanvasRect *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasRect_getCanvasElement(PYCanvasRect *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasRect_setRadius(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getRadius(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setTextureName(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setTextureName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setTextureName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setTextureName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getTextureName(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setStrokeColor(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setStrokeColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setStrokeColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getStrokeColor(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getStrokeColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getStrokeColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setStrokeStyle(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getStrokeStyleConst(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getStrokeStyle(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setGradientStyle(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getGradientStyleConst(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getGradientStyle(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setSize(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		float32_t width = {};
		float32_t height = {};
		static const char *kwlist[] = { "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &width, &height)) {
			self->ptr.setSize(width, height);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *size_ = nullptr;
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &size_)) {
				if(!isPYVector2f(size_)) break;
				const Vector2f &size = pyVector2f_get(size_);
				self->ptr.setSize(size);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setSize(): unknown arguments:\n(float32_t width, float32_t height) -> void\n(const Vector2f size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getSize(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getWidth(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getWidth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getHeight(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getHeight(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setPosition(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getPosition(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getPosition(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_setTexCoord(PYCanvasRect *self, PyObject *args, PyObject *kwargs) {
		float32_t left = {};
		float32_t right = {};
		float32_t bottom = {};
		float32_t top = {};
		static const char *kwlist[] = { "left", "right", "bottom", "top", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &left, &right, &bottom, &top)) {
			self->ptr.setTexCoord(left, right, bottom, top);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texcoord_)) {
				if(!isPYRect(texcoord_)) break;
				const Rect &texcoord = pyRect_get(texcoord_);
				self->ptr.setTexCoord(texcoord);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::setTexCoord(): unknown arguments:\n(float32_t left, float32_t right, float32_t bottom, float32_t top) -> void\n(const Rect texcoord) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_getTexCoord(PYCanvasRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getTexCoord());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasRect::getTexCoord(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasRect_get_radius(PYCanvasRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getRadius());
	}
	static PyObject *CanvasRect_get_texture_name(PYCanvasRect *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *CanvasRect_get_stroke_color(PYCanvasRect *self, void *offset) {
		return pyColor_new(self->ptr.getStrokeColor());
	}
	static PyObject *CanvasRect_get_stroke_style_const(PYCanvasRect *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *CanvasRect_get_stroke_style(PYCanvasRect *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *CanvasRect_get_gradient_style_const(PYCanvasRect *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *CanvasRect_get_gradient_style(PYCanvasRect *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *CanvasRect_get_size(PYCanvasRect *self, void *offset) {
		return pyVector2f_new(self->ptr.getSize());
	}
	static PyObject *CanvasRect_get_width(PYCanvasRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getWidth());
	}
	static PyObject *CanvasRect_get_height(PYCanvasRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHeight());
	}
	static PyObject *CanvasRect_get_position(PYCanvasRect *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition());
	}
	static PyObject *CanvasRect_get_tex_coord(PYCanvasRect *self, void *offset) {
		return pyRect_new(self->ptr.getTexCoord());
	}
	static PyObject *pyCanvasRect_str(PYCanvasRect *self) {
		return PyUnicode_FromString(String::format("CanvasRect Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasRect_bool(PYCanvasRect *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasTriangle
	static void pyCanvasTriangle_base(PYCanvasTriangle *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasTriangle(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasTriangle_Type);
	}
	TS_PYAPI CanvasTriangle &pyCanvasTriangle_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasTriangle_Type) return ((PYCanvasTriangle*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasTriangle_get(): can't get CanvasTriangle from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasTriangle_get(): can't get CanvasTriangle from None");
		static CanvasTriangle ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasTriangle_new(const CanvasTriangle &ptr) {
		PYCanvasTriangle *ret = (PYCanvasTriangle*)PyObject_New(PYCanvasTriangle, &PYCanvasTriangle_Type);
		new(&ret->ptr) CanvasTriangle(ptr); pyCanvasTriangle_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasTriangle_new(CanvasTriangle &&ptr) {
		PYCanvasTriangle *ret = (PYCanvasTriangle*)PyObject_New(PYCanvasTriangle, &PYCanvasTriangle_Type);
		new(&ret->ptr) CanvasTriangle(move(ptr)); pyCanvasTriangle_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasTriangle_init(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasTriangle(((PYCanvasElement*)object)->ptr);
				pyCanvasTriangle_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasTriangle();
			pyCanvasTriangle_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasTriangle(canvas);
				pyCanvasTriangle_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			float32_t radius = {};
			static const char *kwlist[] = { "canvas", "radius", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of", (char**)kwlist, &canvas_, &radius)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasTriangle(canvas, radius);
				pyCanvasTriangle_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::CanvasTriangle(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, float32_t radius)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasTriangle_dealloc(PYCanvasTriangle *self) {
		self->ptr.~CanvasTriangle();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasTriangle_equalPtr(PYCanvasTriangle *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasTriangle_clonePtr(PYCanvasTriangle *self, PyObject *args) {
		return pyCanvasTriangle_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasTriangle_clearPtr(PYCanvasTriangle *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasTriangle_destroyPtr(PYCanvasTriangle *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasTriangle_acquirePtr(PYCanvasTriangle *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasTriangle_unacquirePtr(PYCanvasTriangle *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasTriangle_isValidPtr(PYCanvasTriangle *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasTriangle_isOwnerPtr(PYCanvasTriangle *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasTriangle_isConstPtr(PYCanvasTriangle *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasTriangle_getCountPtr(PYCanvasTriangle *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasTriangle_getInternalPtr(PYCanvasTriangle *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasTriangle_getCanvasElement(PYCanvasTriangle *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasTriangle_setRadius(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getRadius(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setStrokeColor(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setStrokeColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setStrokeColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getStrokeColor(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getStrokeColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getStrokeColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setStrokeStyle(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getStrokeStyleConst(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getStrokeStyle(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setGradientStyle(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getGradientStyleConst(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getGradientStyle(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setPosition0(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition0(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition0(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setPosition0(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setPosition1(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition1(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition1(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setPosition1(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setPosition2(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition2(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition2(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setPosition2(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_setPosition(PYCanvasTriangle *self, PyObject *args, PyObject *kwargs) {
		PyObject *position_0_ = nullptr;
		PyObject *position_1_ = nullptr;
		PyObject *position_2_ = nullptr;
		static const char *kwlist[] = { "position_0", "position_1", "position_2", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &position_0_, &position_1_, &position_2_)) {
			if(!isPYVector3f(position_0_)) break;
			const Vector3f &position_0 = pyVector3f_get(position_0_);
			if(!isPYVector3f(position_1_)) break;
			const Vector3f &position_1 = pyVector3f_get(position_1_);
			if(!isPYVector3f(position_2_)) break;
			const Vector3f &position_2 = pyVector3f_get(position_2_);
			self->ptr.setPosition(position_0, position_1, position_2);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::setPosition(): unknown arguments:\n(const Vector3f position_0, const Vector3f position_1, const Vector3f position_2) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getPosition0(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition0());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getPosition0(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getPosition1(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition1());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getPosition1(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_getPosition2(PYCanvasTriangle *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition2());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasTriangle::getPosition2(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasTriangle_get_radius(PYCanvasTriangle *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getRadius());
	}
	static PyObject *CanvasTriangle_get_stroke_color(PYCanvasTriangle *self, void *offset) {
		return pyColor_new(self->ptr.getStrokeColor());
	}
	static PyObject *CanvasTriangle_get_stroke_style_const(PYCanvasTriangle *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *CanvasTriangle_get_stroke_style(PYCanvasTriangle *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *CanvasTriangle_get_gradient_style_const(PYCanvasTriangle *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *CanvasTriangle_get_gradient_style(PYCanvasTriangle *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *CanvasTriangle_get_position0(PYCanvasTriangle *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition0());
	}
	static PyObject *CanvasTriangle_get_position1(PYCanvasTriangle *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition1());
	}
	static PyObject *CanvasTriangle_get_position2(PYCanvasTriangle *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition2());
	}
	static PyObject *pyCanvasTriangle_str(PYCanvasTriangle *self) {
		return PyUnicode_FromString(String::format("CanvasTriangle Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasTriangle_bool(PYCanvasTriangle *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasEllipse
	static void pyCanvasEllipse_base(PYCanvasEllipse *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasEllipse(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasEllipse_Type);
	}
	TS_PYAPI CanvasEllipse &pyCanvasEllipse_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasEllipse_Type) return ((PYCanvasEllipse*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasEllipse_get(): can't get CanvasEllipse from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasEllipse_get(): can't get CanvasEllipse from None");
		static CanvasEllipse ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasEllipse_new(const CanvasEllipse &ptr) {
		PYCanvasEllipse *ret = (PYCanvasEllipse*)PyObject_New(PYCanvasEllipse, &PYCanvasEllipse_Type);
		new(&ret->ptr) CanvasEllipse(ptr); pyCanvasEllipse_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasEllipse_new(CanvasEllipse &&ptr) {
		PYCanvasEllipse *ret = (PYCanvasEllipse*)PyObject_New(PYCanvasEllipse, &PYCanvasEllipse_Type);
		new(&ret->ptr) CanvasEllipse(move(ptr)); pyCanvasEllipse_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasEllipse_init(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasEllipse(((PYCanvasElement*)object)->ptr);
				pyCanvasEllipse_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasEllipse();
			pyCanvasEllipse_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasEllipse(canvas);
				pyCanvasEllipse_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			float32_t radius = {};
			static const char *kwlist[] = { "canvas", "radius", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of", (char**)kwlist, &canvas_, &radius)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasEllipse(canvas, radius);
				pyCanvasEllipse_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::CanvasEllipse(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, float32_t radius)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasEllipse_dealloc(PYCanvasEllipse *self) {
		self->ptr.~CanvasEllipse();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasEllipse_equalPtr(PYCanvasEllipse *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasEllipse_clonePtr(PYCanvasEllipse *self, PyObject *args) {
		return pyCanvasEllipse_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasEllipse_clearPtr(PYCanvasEllipse *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasEllipse_destroyPtr(PYCanvasEllipse *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasEllipse_acquirePtr(PYCanvasEllipse *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasEllipse_unacquirePtr(PYCanvasEllipse *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasEllipse_isValidPtr(PYCanvasEllipse *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasEllipse_isOwnerPtr(PYCanvasEllipse *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasEllipse_isConstPtr(PYCanvasEllipse *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasEllipse_getCountPtr(PYCanvasEllipse *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasEllipse_getInternalPtr(PYCanvasEllipse *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasEllipse_getCanvasElement(PYCanvasEllipse *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasEllipse_setRadius(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getRadius(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setTextureName(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setTextureName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setTextureName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setTextureName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getTextureName(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setStrokeColor(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setStrokeColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setStrokeColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getStrokeColor(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getStrokeColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getStrokeColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setStrokeStyle(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getStrokeStyleConst(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getStrokeStyle(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setGradientStyle(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getGradientStyleConst(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getGradientStyle(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setPosition(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_0_ = nullptr;
			PyObject *position_1_ = nullptr;
			static const char *kwlist[] = { "position_0", "position_1", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &position_0_, &position_1_)) {
				if(!isPYVector3f(position_0_)) break;
				const Vector3f &position_0 = pyVector3f_get(position_0_);
				if(!isPYVector3f(position_1_)) break;
				const Vector3f &position_1 = pyVector3f_get(position_1_);
				self->ptr.setPosition(position_0, position_1);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position_0, const Vector3f position_1) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setPosition0(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition0(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition0(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setPosition0(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setPosition1(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition1(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition1(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setPosition1(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getPosition0(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition0());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getPosition0(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getPosition1(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition1());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getPosition1(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_setTexCoord(PYCanvasEllipse *self, PyObject *args, PyObject *kwargs) {
		float32_t left = {};
		float32_t right = {};
		float32_t bottom = {};
		float32_t top = {};
		static const char *kwlist[] = { "left", "right", "bottom", "top", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &left, &right, &bottom, &top)) {
			self->ptr.setTexCoord(left, right, bottom, top);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texcoord_)) {
				if(!isPYRect(texcoord_)) break;
				const Rect &texcoord = pyRect_get(texcoord_);
				self->ptr.setTexCoord(texcoord);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::setTexCoord(): unknown arguments:\n(float32_t left, float32_t right, float32_t bottom, float32_t top) -> void\n(const Rect texcoord) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_getTexCoord(PYCanvasEllipse *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getTexCoord());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasEllipse::getTexCoord(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasEllipse_get_radius(PYCanvasEllipse *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getRadius());
	}
	static PyObject *CanvasEllipse_get_texture_name(PYCanvasEllipse *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *CanvasEllipse_get_stroke_color(PYCanvasEllipse *self, void *offset) {
		return pyColor_new(self->ptr.getStrokeColor());
	}
	static PyObject *CanvasEllipse_get_stroke_style_const(PYCanvasEllipse *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *CanvasEllipse_get_stroke_style(PYCanvasEllipse *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *CanvasEllipse_get_gradient_style_const(PYCanvasEllipse *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *CanvasEllipse_get_gradient_style(PYCanvasEllipse *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *CanvasEllipse_get_position0(PYCanvasEllipse *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition0());
	}
	static PyObject *CanvasEllipse_get_position1(PYCanvasEllipse *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition1());
	}
	static PyObject *CanvasEllipse_get_tex_coord(PYCanvasEllipse *self, void *offset) {
		return pyRect_new(self->ptr.getTexCoord());
	}
	static PyObject *pyCanvasEllipse_str(PYCanvasEllipse *self) {
		return PyUnicode_FromString(String::format("CanvasEllipse Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasEllipse_bool(PYCanvasEllipse *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasShape
	static void pyCanvasShape_base(PYCanvasShape *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasShape(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasShape_Type);
	}
	TS_PYAPI CanvasShape &pyCanvasShape_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasShape_Type) return ((PYCanvasShape*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasShape_get(): can't get CanvasShape from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasShape_get(): can't get CanvasShape from None");
		static CanvasShape ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasShape_new(const CanvasShape &ptr) {
		PYCanvasShape *ret = (PYCanvasShape*)PyObject_New(PYCanvasShape, &PYCanvasShape_Type);
		new(&ret->ptr) CanvasShape(ptr); pyCanvasShape_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasShape_new(CanvasShape &&ptr) {
		PYCanvasShape *ret = (PYCanvasShape*)PyObject_New(PYCanvasShape, &PYCanvasShape_Type);
		new(&ret->ptr) CanvasShape(move(ptr)); pyCanvasShape_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasShape_init(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasShape(((PYCanvasElement*)object)->ptr);
				pyCanvasShape_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasShape();
			pyCanvasShape_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasShape(canvas);
				pyCanvasShape_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			int32_t cubic = {};
			static const char *kwlist[] = { "canvas", "cubic", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oi", (char**)kwlist, &canvas_, &cubic)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasShape(canvas, (cubic != 0));
				pyCanvasShape_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::CanvasShape(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, bool cubic)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasShape_dealloc(PYCanvasShape *self) {
		self->ptr.~CanvasShape();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasShape_equalPtr(PYCanvasShape *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasShape_clonePtr(PYCanvasShape *self, PyObject *args) {
		return pyCanvasShape_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasShape_clearPtr(PYCanvasShape *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasShape_destroyPtr(PYCanvasShape *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasShape_acquirePtr(PYCanvasShape *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasShape_unacquirePtr(PYCanvasShape *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasShape_isValidPtr(PYCanvasShape *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasShape_isOwnerPtr(PYCanvasShape *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasShape_isConstPtr(PYCanvasShape *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasShape_getCountPtr(PYCanvasShape *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasShape_getInternalPtr(PYCanvasShape *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasShape_getCanvasElement(PYCanvasShape *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasShape_setCubic(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		int32_t cubic = {};
		static const char *kwlist[] = { "cubic", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &cubic)) {
			self->ptr.setCubic((cubic != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setCubic(): unknown arguments:\n(bool cubic) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_isCubic(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCubic());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::isCubic(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setThreshold(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		float32_t threshold = {};
		static const char *kwlist[] = { "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &threshold)) {
			self->ptr.setThreshold(threshold);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setThreshold(): unknown arguments:\n(float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getThreshold(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getThreshold());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getThreshold(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setStrokeColor(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setStrokeColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setStrokeColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getStrokeColor(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getStrokeColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getStrokeColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setStrokeStyle(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getStrokeStyleConst(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getStrokeStyle(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setGradientStyle(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getGradientStyleConst(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getGradientStyle(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_createSVG(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		const char *src = nullptr;
		float32_t scale = 1.0f;
		static const char *kwlist[] = { "src", "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|f", (char**)kwlist, &src, &scale)) {
			return PyLong_FromLong(self->ptr.createSVG(src, scale));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::createSVG(): unknown arguments:\n(const char* src, float32_t scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_clearPositions(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearPositions();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::clearPositions(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setNumPositions(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_positions = {};
		static const char *kwlist[] = { "num_positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_positions)) {
			self->ptr.setNumPositions(num_positions);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setNumPositions(): unknown arguments:\n(uint32_t num_positions) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_reservePositions(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_positions = {};
		static const char *kwlist[] = { "num_positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_positions)) {
			self->ptr.reservePositions(num_positions);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::reservePositions(): unknown arguments:\n(uint32_t num_positions) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getNumPositions(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumPositions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getNumPositions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setPositions(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		PyObject *positions_ = nullptr;
		uint32_t num_positions = {};
		static const char *kwlist[] = { "positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &positions_)) {
			if(!isPYArray(positions_)) break;
			Array<Vector3f> positions(pyArray_size(positions_));
			for(uint32_t i = 0; i < positions.size(); i++) positions[i] = pyVector3f_get(pyArray_get(positions_, i));
			self->ptr.setPositions(positions.get(), num_positions = positions.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setPositions(): unknown arguments:\n(const Vector3f positions[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_addPositions(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		PyObject *positions_ = nullptr;
		uint32_t num_positions = {};
		static const char *kwlist[] = { "positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &positions_)) {
			if(!isPYArray(positions_)) break;
			Array<Vector3f> positions(pyArray_size(positions_));
			for(uint32_t i = 0; i < positions.size(); i++) positions[i] = pyVector3f_get(pyArray_get(positions_, i));
			self->ptr.addPositions(positions.get(), num_positions = positions.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::addPositions(): unknown arguments:\n(const Vector3f positions[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getPositions(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPositions());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPositions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getPositions(): unknown arguments:\n(void) -> const Vector3f*\n(void) -> Vector3f*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setPosition(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "index", "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iff|f", (char**)kwlist, &index, &x, &y, &z)) {
			self->ptr.setPosition(index, x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "index", "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(index, position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setPosition(): unknown arguments:\n(uint32_t index, float32_t x, float32_t y, float32_t z) -> void\n(uint32_t index, const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getPosition(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyVector3f_new(self->ptr.getPosition(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyVector3f_new(self->ptr.getPosition(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getPosition(): unknown arguments:\n(uint32_t index) -> const Vector3f\n(uint32_t index) -> Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_addPosition(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			return PyLong_FromUnsignedLong(self->ptr.addPosition(x, y, z));
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector2f(position_)) break;
				const Vector2f &position = pyVector2f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addPosition(position));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addPosition(position));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::addPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> uint32_t\n(const Vector2f position) -> uint32_t\n(const Vector3f position) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_setTexCoord(PYCanvasShape *self, PyObject *args, PyObject *kwargs) {
		float32_t left = {};
		float32_t right = {};
		float32_t bottom = {};
		float32_t top = {};
		static const char *kwlist[] = { "left", "right", "bottom", "top", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &left, &right, &bottom, &top)) {
			self->ptr.setTexCoord(left, right, bottom, top);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texcoord_)) {
				if(!isPYRect(texcoord_)) break;
				const Rect &texcoord = pyRect_get(texcoord_);
				self->ptr.setTexCoord(texcoord);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::setTexCoord(): unknown arguments:\n(float32_t left, float32_t right, float32_t bottom, float32_t top) -> void\n(const Rect texcoord) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_getTexCoord(PYCanvasShape *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getTexCoord());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasShape::getTexCoord(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasShape_get_threshold(PYCanvasShape *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getThreshold());
	}
	static PyObject *CanvasShape_get_stroke_color(PYCanvasShape *self, void *offset) {
		return pyColor_new(self->ptr.getStrokeColor());
	}
	static PyObject *CanvasShape_get_stroke_style_const(PYCanvasShape *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *CanvasShape_get_stroke_style(PYCanvasShape *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *CanvasShape_get_gradient_style_const(PYCanvasShape *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *CanvasShape_get_gradient_style(PYCanvasShape *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *CanvasShape_get_num_positions(PYCanvasShape *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumPositions());
	}
	static PyObject *CanvasShape_get_positions(PYCanvasShape *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getPositions());
	}
	static PyObject *CanvasShape_get_tex_coord(PYCanvasShape *self, void *offset) {
		return pyRect_new(self->ptr.getTexCoord());
	}
	static PyObject *pyCanvasShape_str(PYCanvasShape *self) {
		return PyUnicode_FromString(String::format("CanvasShape Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasShape_bool(PYCanvasShape *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CanvasStrip
	static void pyCanvasStrip_base(PYCanvasStrip *self) {
		new(&self->base.ptr) CanvasElement(self->ptr);
	}
	TS_PYAPI bool isPYCanvasStrip(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvasStrip_Type);
	}
	TS_PYAPI CanvasStrip &pyCanvasStrip_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvasStrip_Type) return ((PYCanvasStrip*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CanvasStrip_get(): can't get CanvasStrip from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CanvasStrip_get(): can't get CanvasStrip from None");
		static CanvasStrip ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvasStrip_new(const CanvasStrip &ptr) {
		PYCanvasStrip *ret = (PYCanvasStrip*)PyObject_New(PYCanvasStrip, &PYCanvasStrip_Type);
		new(&ret->ptr) CanvasStrip(ptr); pyCanvasStrip_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvasStrip_new(CanvasStrip &&ptr) {
		PYCanvasStrip *ret = (PYCanvasStrip*)PyObject_New(PYCanvasStrip, &PYCanvasStrip_Type);
		new(&ret->ptr) CanvasStrip(move(ptr)); pyCanvasStrip_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyCanvasStrip_init(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYCanvasElement(object)) {
				new(&self->ptr) CanvasStrip(((PYCanvasElement*)object)->ptr);
				pyCanvasStrip_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CanvasStrip();
			pyCanvasStrip_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			static const char *kwlist[] = { "canvas", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &canvas_)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasStrip(canvas);
				pyCanvasStrip_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			float32_t width = {};
			static const char *kwlist[] = { "canvas", "width", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of", (char**)kwlist, &canvas_, &width)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) CanvasStrip(canvas, width);
				pyCanvasStrip_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::CanvasStrip(): unknown arguments:\n(void)\n(Canvas canvas)\n(Canvas canvas, float32_t width)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvasStrip_dealloc(PYCanvasStrip *self) {
		self->ptr.~CanvasStrip();
		self->base.ptr.~CanvasElement();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvasStrip_equalPtr(PYCanvasStrip *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvasStrip_clonePtr(PYCanvasStrip *self, PyObject *args) {
		return pyCanvasStrip_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvasStrip_clearPtr(PYCanvasStrip *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasStrip_destroyPtr(PYCanvasStrip *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasStrip_acquirePtr(PYCanvasStrip *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasStrip_unacquirePtr(PYCanvasStrip *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvasStrip_isValidPtr(PYCanvasStrip *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvasStrip_isOwnerPtr(PYCanvasStrip *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvasStrip_isConstPtr(PYCanvasStrip *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvasStrip_getCountPtr(PYCanvasStrip *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvasStrip_getInternalPtr(PYCanvasStrip *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyCanvasStrip_getCanvasElement(PYCanvasStrip *self, PyObject *args) {
		return pyCanvasElement_new(self->ptr.getCanvasElement());
	}
	static PyObject *CanvasStrip_setWidth(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		float32_t width = {};
		static const char *kwlist[] = { "width", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &width)) {
			self->ptr.setWidth(width);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setWidth(): unknown arguments:\n(float32_t width) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getWidth(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getWidth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setOffset(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		float32_t offset = {};
		static const char *kwlist[] = { "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &offset)) {
			self->ptr.setOffset(offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setOffset(): unknown arguments:\n(float32_t offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getOffset(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getOffset(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setStrokeColor(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setStrokeColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setStrokeColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getStrokeColor(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getStrokeColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getStrokeColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setStrokeStyle(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getStrokeStyleConst(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getStrokeStyle(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_createQuadratic(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *p0_ = nullptr;
		PyObject *p1_ = nullptr;
		PyObject *p2_ = nullptr;
		float32_t threshold = 1.0f;
		static const char *kwlist[] = { "p0", "p1", "p2", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|f", (char**)kwlist, &p0_, &p1_, &p2_, &threshold)) {
			if(!isPYVector2f(p0_)) break;
			const Vector2f &p0 = pyVector2f_get(p0_);
			if(!isPYVector2f(p1_)) break;
			const Vector2f &p1 = pyVector2f_get(p1_);
			if(!isPYVector2f(p2_)) break;
			const Vector2f &p2 = pyVector2f_get(p2_);
			self->ptr.createQuadratic(p0, p1, p2, threshold);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *p0_ = nullptr;
			PyObject *p1_ = nullptr;
			PyObject *p2_ = nullptr;
			float32_t threshold = 1.0f;
			static const char *kwlist[] = { "p0", "p1", "p2", "threshold", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|f", (char**)kwlist, &p0_, &p1_, &p2_, &threshold)) {
				if(!isPYVector3f(p0_)) break;
				const Vector3f &p0 = pyVector3f_get(p0_);
				if(!isPYVector3f(p1_)) break;
				const Vector3f &p1 = pyVector3f_get(p1_);
				if(!isPYVector3f(p2_)) break;
				const Vector3f &p2 = pyVector3f_get(p2_);
				self->ptr.createQuadratic(p0, p1, p2, threshold);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::createQuadratic(): unknown arguments:\n(const Vector2f p0, const Vector2f p1, const Vector2f p2, float32_t threshold) -> void\n(const Vector3f p0, const Vector3f p1, const Vector3f p2, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_createCubic(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *p0_ = nullptr;
		PyObject *p1_ = nullptr;
		PyObject *p2_ = nullptr;
		PyObject *p3_ = nullptr;
		float32_t threshold = 1.0f;
		static const char *kwlist[] = { "p0", "p1", "p2", "p3", "threshold", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO|f", (char**)kwlist, &p0_, &p1_, &p2_, &p3_, &threshold)) {
			if(!isPYVector2f(p0_)) break;
			const Vector2f &p0 = pyVector2f_get(p0_);
			if(!isPYVector2f(p1_)) break;
			const Vector2f &p1 = pyVector2f_get(p1_);
			if(!isPYVector2f(p2_)) break;
			const Vector2f &p2 = pyVector2f_get(p2_);
			if(!isPYVector2f(p3_)) break;
			const Vector2f &p3 = pyVector2f_get(p3_);
			self->ptr.createCubic(p0, p1, p2, p3, threshold);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *p0_ = nullptr;
			PyObject *p1_ = nullptr;
			PyObject *p2_ = nullptr;
			PyObject *p3_ = nullptr;
			float32_t threshold = 1.0f;
			static const char *kwlist[] = { "p0", "p1", "p2", "p3", "threshold", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO|f", (char**)kwlist, &p0_, &p1_, &p2_, &p3_, &threshold)) {
				if(!isPYVector3f(p0_)) break;
				const Vector3f &p0 = pyVector3f_get(p0_);
				if(!isPYVector3f(p1_)) break;
				const Vector3f &p1 = pyVector3f_get(p1_);
				if(!isPYVector3f(p2_)) break;
				const Vector3f &p2 = pyVector3f_get(p2_);
				if(!isPYVector3f(p3_)) break;
				const Vector3f &p3 = pyVector3f_get(p3_);
				self->ptr.createCubic(p0, p1, p2, p3, threshold);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::createCubic(): unknown arguments:\n(const Vector2f p0, const Vector2f p1, const Vector2f p2, const Vector2f p3, float32_t threshold) -> void\n(const Vector3f p0, const Vector3f p1, const Vector3f p2, const Vector3f p3, float32_t threshold) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_clearPositions(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearPositions();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::clearPositions(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setNumPositions(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_positions = {};
		static const char *kwlist[] = { "num_positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_positions)) {
			self->ptr.setNumPositions(num_positions);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setNumPositions(): unknown arguments:\n(uint32_t num_positions) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_reservePositions(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		uint32_t num_positions = {};
		static const char *kwlist[] = { "num_positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &num_positions)) {
			self->ptr.reservePositions(num_positions);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::reservePositions(): unknown arguments:\n(uint32_t num_positions) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getNumPositions(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumPositions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getNumPositions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setPositions(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *positions_ = nullptr;
		uint32_t num_positions = {};
		static const char *kwlist[] = { "positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &positions_)) {
			if(!isPYArray(positions_)) break;
			Array<Vector3f> positions(pyArray_size(positions_));
			for(uint32_t i = 0; i < positions.size(); i++) positions[i] = pyVector3f_get(pyArray_get(positions_, i));
			self->ptr.setPositions(positions.get(), num_positions = positions.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setPositions(): unknown arguments:\n(const Vector3f positions[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_addPositions(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		PyObject *positions_ = nullptr;
		uint32_t num_positions = {};
		static const char *kwlist[] = { "positions", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &positions_)) {
			if(!isPYArray(positions_)) break;
			Array<Vector3f> positions(pyArray_size(positions_));
			for(uint32_t i = 0; i < positions.size(); i++) positions[i] = pyVector3f_get(pyArray_get(positions_, i));
			self->ptr.addPositions(positions.get(), num_positions = positions.size());
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::addPositions(): unknown arguments:\n(const Vector3f positions[]) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getPositions(PYCanvasStrip *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPositions());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr(self->ptr.getPositions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getPositions(): unknown arguments:\n(void) -> const Vector3f*\n(void) -> Vector3f*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_setPosition(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "index", "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Iff|f", (char**)kwlist, &index, &x, &y, &z)) {
			self->ptr.setPosition(index, x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "index", "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(index, position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::setPosition(): unknown arguments:\n(uint32_t index, float32_t x, float32_t y, float32_t z) -> void\n(uint32_t index, const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_getPosition(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyVector3f_new(self->ptr.getPosition(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyVector3f_new(self->ptr.getPosition(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::getPosition(): unknown arguments:\n(uint32_t index) -> const Vector3f\n(uint32_t index) -> Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_addPosition(PYCanvasStrip *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			return PyLong_FromUnsignedLong(self->ptr.addPosition(x, y, z));
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector2f(position_)) break;
				const Vector2f &position = pyVector2f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addPosition(position));
			}
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				return PyLong_FromUnsignedLong(self->ptr.addPosition(position));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CanvasStrip::addPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> uint32_t\n(const Vector2f position) -> uint32_t\n(const Vector3f position) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CanvasStrip_get_width(PYCanvasStrip *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getWidth());
	}
	static PyObject *CanvasStrip_get_offset(PYCanvasStrip *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getOffset());
	}
	static PyObject *CanvasStrip_get_stroke_color(PYCanvasStrip *self, void *offset) {
		return pyColor_new(self->ptr.getStrokeColor());
	}
	static PyObject *CanvasStrip_get_stroke_style_const(PYCanvasStrip *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *CanvasStrip_get_stroke_style(PYCanvasStrip *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *CanvasStrip_get_num_positions(PYCanvasStrip *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumPositions());
	}
	static PyObject *CanvasStrip_get_positions(PYCanvasStrip *self, void *offset) {
		return PyLong_FromVoidPtr(self->ptr.getPositions());
	}
	static PyObject *pyCanvasStrip_str(PYCanvasStrip *self) {
		return PyUnicode_FromString(String::format("CanvasStrip Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvasStrip_bool(PYCanvasStrip *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Canvas
	static bool pyCanvas_CreateCallback(const Device device, Canvas canvas, uint32_t scale, PyObject *func) {
		bool ret = {};
		PyObject *device_ = pyDevice_new(device);
		PyObject *canvas_ = pyCanvas_new(canvas);
		if(func) {
			PyObject *args = Py_BuildValue("(OOI)", device_, canvas_, scale);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(canvas_);
		Py_DECREF(device_);
		return ret;
	}
	static bool pyCanvas_PipelineCallback(Pipeline pipeline, Canvas canvas, CanvasElement element, PyObject *func) {
		bool ret = {};
		PyObject *pipeline_ = pyPipeline_new(pipeline);
		PyObject *canvas_ = pyCanvas_new(canvas);
		PyObject *element_ = pyCanvasElement_new(element);
		if(func) {
			PyObject *args = Py_BuildValue("(OOO)", pipeline_, canvas_, element_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(element_);
		Py_DECREF(canvas_);
		Py_DECREF(pipeline_);
		return ret;
	}
	static bool pyCanvas_BeginCallback(Command command, Canvas canvas, PyObject *func) {
		bool ret = {};
		PyObject *command_ = pyCommand_new(command);
		PyObject *canvas_ = pyCanvas_new(canvas);
		if(func) {
			PyObject *args = Py_BuildValue("(OO)", command_, canvas_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(canvas_);
		Py_DECREF(command_);
		return ret;
	}
	static bool pyCanvas_DrawCallback(Command command, Canvas canvas, PyObject *func) {
		bool ret = {};
		PyObject *command_ = pyCommand_new(command);
		PyObject *canvas_ = pyCanvas_new(canvas);
		if(func) {
			PyObject *args = Py_BuildValue("(OO)", command_, canvas_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(canvas_);
		Py_DECREF(command_);
		return ret;
	}
	TS_PYAPI bool isPYCanvas(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCanvas_Type);
	}
	TS_PYAPI Canvas &pyCanvas_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCanvas_Type) return ((PYCanvas*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Canvas_get(): can't get Canvas from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Canvas_get(): can't get Canvas from None");
		static Canvas ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCanvas_new(const Canvas &ptr) {
		PYCanvas *ret = (PYCanvas*)PyObject_New(PYCanvas, &PYCanvas_Type);
		new(&ret->ptr) Canvas(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCanvas_new(Canvas &&ptr) {
		PYCanvas *ret = (PYCanvas*)PyObject_New(PYCanvas, &PYCanvas_Type);
		new(&ret->ptr) Canvas(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyCanvas_init(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Canvas();
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYCanvas(parent_)) break;
				Canvas *parent = (parent_) ? &pyCanvas_get(parent_) : nullptr;
				new(&self->ptr) Canvas(parent);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::Canvas(): unknown arguments:\n(void)\n(Canvas* parent)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCanvas_dealloc(PYCanvas *self) {
		self->ptr.~Canvas();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCanvas_equalPtr(PYCanvas *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCanvas_clonePtr(PYCanvas *self, PyObject *args) {
		return pyCanvas_new(self->ptr.clonePtr());
	}
	static PyObject *pyCanvas_clearPtr(PYCanvas *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvas_destroyPtr(PYCanvas *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvas_acquirePtr(PYCanvas *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvas_unacquirePtr(PYCanvas *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCanvas_isValidPtr(PYCanvas *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCanvas_isOwnerPtr(PYCanvas *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCanvas_isConstPtr(PYCanvas *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCanvas_getCountPtr(PYCanvas *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCanvas_getInternalPtr(PYCanvas *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Canvas_clear(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isCreated(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getScale(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *target_ = nullptr;
		uint32_t scale = 100;
		static const char *kwlist[] = { "target", "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|I", (char**)kwlist, &target_, &scale)) {
			if(!isPYTarget(target_)) break;
			const Target &target = pyTarget_get(target_);
			return PyLong_FromUnsignedLong(self->ptr.getScale(target, scale));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getScale(): unknown arguments:\n(const Target target, uint32_t scale) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_create(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t color = 0;
		uint32_t depth = 0;
		uint32_t multisample = 1;
		uint32_t scale = 0;
		static const char *kwlist[] = { "device", "color", "depth", "multisample", "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII|II", (char**)kwlist, &device_, &color, &depth, &multisample, &scale)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (Format)color, (Format)depth, multisample, scale));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *target_ = nullptr;
			uint32_t scale = 0;
			static const char *kwlist[] = { "device", "target", "scale", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &device_, &target_, &scale)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYTarget(target_)) break;
				const Target &target = pyTarget_get(target_);
				return PyLong_FromLong(self->ptr.create(device, target, scale));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::create(): unknown arguments:\n(const Device device, Format color, Format depth, uint32_t multisample, uint32_t scale) -> bool\n(const Device device, const Target target, uint32_t scale) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setPipelineHash(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t hash = {};
		static const char *kwlist[] = { "hash", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &hash)) {
			self->ptr.setPipelineHash(hash);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setPipelineHash(): unknown arguments:\n(uint32_t hash) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getPipelineHash(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPipelineHash());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getPipelineHash(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getColorFormat(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getColorFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getDepthFormat(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getDepthFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getMultisample(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMultisample());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getMultisample(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setOrder(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		int32_t order = {};
		static const char *kwlist[] = { "order", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &order)) {
			self->ptr.setOrder(order);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setOrder(): unknown arguments:\n(int32_t order) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getOrder(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getOrder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getOrder(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setEnabled(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setEnabled((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setEnabled(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isEnabled(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setViewport(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = {};
		static const char *kwlist[] = { "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &width, &height)) {
			self->ptr.setViewport(width, height);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float32_t width = {};
			float32_t height = {};
			static const char *kwlist[] = { "width", "height", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &width, &height)) {
				self->ptr.setViewport(width, height);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *viewport_ = nullptr;
			static const char *kwlist[] = { "viewport", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &viewport_)) {
				if(!isPYViewport(viewport_)) break;
				const Viewport &viewport = pyViewport_get(viewport_);
				self->ptr.setViewport(viewport);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setViewport(): unknown arguments:\n(uint32_t width, uint32_t height) -> void\n(float32_t width, float32_t height) -> void\n(const Viewport viewport) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getViewport(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyViewport_new(self->ptr.getViewport());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getViewport(): unknown arguments:\n(void) -> const Viewport\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getWidth(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getWidth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getHeight(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getHeight(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_clearColor(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearColor();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::clearColor(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setColor(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
			self->ptr.setColor(r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getColor(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_clearScissor(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearScissor();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::clearScissor(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setScissor(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *scissor_ = nullptr;
		static const char *kwlist[] = { "scissor", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &scissor_)) {
			if(!isPYRect(scissor_)) break;
			const Rect &scissor = pyRect_get(scissor_);
			self->ptr.setScissor(scissor);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setScissor(): unknown arguments:\n(const Rect scissor) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getScissor(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getScissor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getScissor(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_clearTransform(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearTransform();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::clearTransform(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setTransform(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *transform_ = nullptr;
		static const char *kwlist[] = { "transform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &transform_)) {
			if(!isPYMatrix4x4f(transform_)) break;
			const Matrix4x4f &transform = pyMatrix4x4f_get(transform_);
			self->ptr.setTransform(transform);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setTransform(): unknown arguments:\n(const Matrix4x4f transform) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getTransform(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyMatrix4x4f_new(self->ptr.getTransform());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getTransform(): unknown arguments:\n(void) -> const Matrix4x4f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setParent(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		static const char *kwlist[] = { "parent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
			if(!isPYCanvas(parent_)) break;
			Canvas &parent = pyCanvas_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent(parent));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setParent(): unknown arguments:\n(Canvas parent) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getParent(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvas_new(self->ptr.getParent());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvas_new(self->ptr.getParent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getParent(): unknown arguments:\n(void) -> const Canvas\n(void) -> Canvas\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_addChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			Canvas &child = pyCanvas_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.addChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::addChild(): unknown arguments:\n(Canvas child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_removeChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			Canvas &child = pyCanvas_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::removeChild(): unknown arguments:\n(Canvas child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_raiseChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			Canvas &child = pyCanvas_get(child_);
			return PyLong_FromLong(self->ptr.raiseChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::raiseChild(): unknown arguments:\n(Canvas child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_lowerChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			Canvas &child = pyCanvas_get(child_);
			return PyLong_FromLong(self->ptr.lowerChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::lowerChild(): unknown arguments:\n(Canvas child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_releaseChildren(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_findChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			const Canvas &child = pyCanvas_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.findChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::findChild(): unknown arguments:\n(const Canvas child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYCanvas(child_)) break;
			const Canvas &child = pyCanvas_get(child_);
			return PyLong_FromLong(self->ptr.isChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isChild(): unknown arguments:\n(const Canvas child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getNumChildren(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getChildren(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyCanvas_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyCanvas_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getChildren(): unknown arguments:\n(void) -> const Array<Canvas>\n(void) -> Array<Canvas>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getChild(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyCanvas_new(self->ptr.getChild(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyCanvas_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getChild(): unknown arguments:\n(uint32_t index) -> const Canvas\n(uint32_t index) -> Canvas\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_addElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromUnsignedLong(self->ptr.addElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::addElement(): unknown arguments:\n(CanvasElement element) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_removeElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromLong(self->ptr.removeElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::removeElement(): unknown arguments:\n(CanvasElement element) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_raiseElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromLong(self->ptr.raiseElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::raiseElement(): unknown arguments:\n(CanvasElement element) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_lowerElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromLong(self->ptr.lowerElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::lowerElement(): unknown arguments:\n(CanvasElement element) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_findElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			const CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromUnsignedLong(self->ptr.findElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::findElement(): unknown arguments:\n(const CanvasElement element) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *element_ = nullptr;
		static const char *kwlist[] = { "element", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &element_)) {
			if(!isPYCanvasElement(element_)) break;
			const CanvasElement &element = pyCanvasElement_get(element_);
			return PyLong_FromLong(self->ptr.isElement(element));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isElement(): unknown arguments:\n(const CanvasElement element) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getNumElements(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getNumElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getElements(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getElements();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyCanvasElement_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getElements();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyCanvasElement_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getElements(): unknown arguments:\n(void) -> const Array<CanvasElement>\n(void) -> Array<CanvasElement>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getElement(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyCanvasElement_new(self->ptr.getElement(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyCanvasElement_new(self->ptr.getElement(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getElement(): unknown arguments:\n(uint32_t index) -> const CanvasElement\n(uint32_t index) -> CanvasElement\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isFont(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isFont(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isFont(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_addFont(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "name", "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.addFont(name, stream));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			const uint8_t (*blob)[256] = nullptr;
			static const char *kwlist[] = { "name", "blob", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &blob)) {
				return PyLong_FromLong(self->ptr.addFont(name, nullptr));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::addFont(): unknown arguments:\n(const char* name, Stream stream) -> bool\n(const char* name, const uint8_t(*)[256] blob) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_removeFont(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.removeFont(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::removeFont(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getFont(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return pyFont_new(self->ptr.getFont(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getFont(): unknown arguments:\n(const char* name) -> Font\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_isTexture(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromLong(self->ptr.isTexture(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::isTexture(): unknown arguments:\n(const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_addTexture(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *stream_ = nullptr;
		static const char *kwlist[] = { "name", "stream", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &stream_)) {
			if(!isPYStream(stream_)) break;
			Stream &stream = pyStream_get(stream_);
			return PyLong_FromLong(self->ptr.addTexture(name, stream));
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "name", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &texture_)) {
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.addTexture(name, texture));
			}
		}
		PyErr_Clear();
		{
			const char *name = nullptr;
			const uint8_t (*blob)[256] = nullptr;
			static const char *kwlist[] = { "name", "blob", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &name, &blob)) {
				return PyLong_FromLong(self->ptr.addTexture(name, nullptr));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::addTexture(): unknown arguments:\n(const char* name, Stream stream) -> bool\n(const char* name, Texture texture) -> bool\n(const char* name, const uint8_t(*)[256] blob) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_removeTexture(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.removeTexture(name);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::removeTexture(): unknown arguments:\n(const char* name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getTexture(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return pyTexture_new(self->ptr.getTexture(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getTexture(): unknown arguments:\n(const char* name) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setDepthMask(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t mask = 0;
		static const char *kwlist[] = { "mask", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mask)) {
			self->ptr.setDepthMask((Pipeline::DepthMask)mask);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setDepthMask(): unknown arguments:\n(Pipeline.DepthMask mask) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getDepthMask(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getDepthMask(): unknown arguments:\n(void) -> Pipeline::DepthMask\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setDepthFunc(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		uint32_t func = 0;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &func)) {
			self->ptr.setDepthFunc((Pipeline::DepthFunc)func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setDepthFunc(): unknown arguments:\n(Pipeline.DepthFunc func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getDepthFunc(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getDepthFunc(): unknown arguments:\n(void) -> Pipeline::DepthFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_draw(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *command_ = nullptr;
		PyObject *target_ = nullptr;
		static const char *kwlist[] = { "command", "target", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &command_, &target_)) {
			if(!isPYCommand(command_)) break;
			Command &command = pyCommand_get(command_);
			if(!isPYTarget(target_)) break;
			const Target &target = pyTarget_get(target_);
			self->ptr.draw(command, target);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			static const char *kwlist[] = { "command", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &command_)) {
				if(!isPYCommand(command_)) break;
				Command &command = pyCommand_get(command_);
				self->ptr.draw(command);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::draw(): unknown arguments:\n(Command command, const Target target) -> void\n(Command command) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setCreateCallback(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvas_CreateCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setCreateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setCreateCallback(): unknown arguments:\n(const Canvas.CreateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setPipelineCallback(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvas_PipelineCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setPipelineCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setPipelineCallback(): unknown arguments:\n(const Canvas.PipelineCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setBeginCallback(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvas_BeginCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setBeginCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setBeginCallback(): unknown arguments:\n(const Canvas.BeginCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_setDrawCallback(PYCanvas *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvas_DrawCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setDrawCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::setDrawCallback(): unknown arguments:\n(const Canvas.DrawCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getNumDrawPipelines(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumDrawPipelines());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getNumDrawPipelines(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getNumDrawElements(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumDrawElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getNumDrawElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getNumDrawCommands(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumDrawCommands());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getNumDrawCommands(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_getRect(PYCanvas *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Canvas::getRect(): unknown arguments:\n(void) -> Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Canvas_get_pipeline_hash(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPipelineHash());
	}
	static PyObject *Canvas_get_color_format(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColorFormat());
	}
	static PyObject *Canvas_get_depth_format(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFormat());
	}
	static PyObject *Canvas_get_multisample(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMultisample());
	}
	static PyObject *Canvas_get_order(PYCanvas *self, void *offset) {
		return PyLong_FromLong(self->ptr.getOrder());
	}
	static PyObject *Canvas_get_viewport(PYCanvas *self, void *offset) {
		return pyViewport_new(self->ptr.getViewport());
	}
	static PyObject *Canvas_get_width(PYCanvas *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getWidth());
	}
	static PyObject *Canvas_get_height(PYCanvas *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHeight());
	}
	static PyObject *Canvas_get_color(PYCanvas *self, void *offset) {
		return pyColor_new(self->ptr.getColor());
	}
	static PyObject *Canvas_get_scissor(PYCanvas *self, void *offset) {
		return pyRect_new(self->ptr.getScissor());
	}
	static PyObject *Canvas_get_transform(PYCanvas *self, void *offset) {
		return pyMatrix4x4f_new(self->ptr.getTransform());
	}
	static PyObject *Canvas_get_parent(PYCanvas *self, void *offset) {
		return pyCanvas_new(self->ptr.getParent());
	}
	static PyObject *Canvas_get_num_children(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *Canvas_get_num_elements(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumElements());
	}
	static PyObject *Canvas_get_depth_mask(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthMask());
	}
	static PyObject *Canvas_get_depth_func(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDepthFunc());
	}
	static PyObject *Canvas_get_num_draw_pipelines(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumDrawPipelines());
	}
	static PyObject *Canvas_get_num_draw_elements(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumDrawElements());
	}
	static PyObject *Canvas_get_num_draw_commands(PYCanvas *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumDrawCommands());
	}
	static PyObject *Canvas_get_rect(PYCanvas *self, void *offset) {
		return pyRect_new(self->ptr.getRect());
	}
	static PyObject *pyCanvas_str(PYCanvas *self) {
		return PyUnicode_FromString(String::format("Canvas Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCanvas_bool(PYCanvas *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Control
	TS_PYAPI bool isPYControl(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYControl_Type || type == &PYControlRoot_Type || type == &PYControlText_Type || type == &PYControlRect_Type || type == &PYControlGrid_Type || type == &PYControlGroup_Type || type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type || type == &PYControlCheck_Type || type == &PYControlCombo_Type || type == &PYControlButton_Type || type == &PYControlSlider_Type || type == &PYControlScroll_Type || type == &PYControlSplit_Type || type == &PYControlArea_Type || type == &PYControlTree_Type || type == &PYControlEdit_Type);
	}
	TS_PYAPI Control &pyControl_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYControl_Type || type == &PYControlRoot_Type || type == &PYControlText_Type || type == &PYControlRect_Type || type == &PYControlGrid_Type || type == &PYControlGroup_Type || type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type || type == &PYControlCheck_Type || type == &PYControlCombo_Type || type == &PYControlButton_Type || type == &PYControlSlider_Type || type == &PYControlScroll_Type || type == &PYControlSplit_Type || type == &PYControlArea_Type || type == &PYControlTree_Type || type == &PYControlEdit_Type) return ((PYControl*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Control_get(): can't get Control from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Control_get(): can't get Control from None");
		static Control ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControl_new(const Control &ptr) {
		PYControl *ret = (PYControl*)PyObject_New(PYControl, &PYControl_Type);
		new(&ret->ptr) Control(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControl_new(Control &&ptr) {
		PYControl *ret = (PYControl*)PyObject_New(PYControl, &PYControl_Type);
		new(&ret->ptr) Control(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyControl_init(PYControl *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Control();
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) Control(parent);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			float32_t width = {};
			float32_t height = 0.0f;
			static const char *kwlist[] = { "parent", "width", "height", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of|f", (char**)kwlist, &parent_, &width, &height)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) Control(parent, width, height);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::Control(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, float32_t width, float32_t height)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControl_dealloc(PYControl *self) {
		self->ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControl_equalPtr(PYControl *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControl_clonePtr(PYControl *self, PyObject *args) {
		return pyControl_new(self->ptr.clonePtr());
	}
	static PyObject *pyControl_clearPtr(PYControl *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControl_destroyPtr(PYControl *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControl_acquirePtr(PYControl *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControl_unacquirePtr(PYControl *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControl_isValidPtr(PYControl *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControl_isOwnerPtr(PYControl *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControl_isConstPtr(PYControl *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControl_getCountPtr(PYControl *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControl_getInternalPtr(PYControl *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Control_getType(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getType());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getType(): unknown arguments:\n(void) -> Control::Type\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getTypeName(PYControl *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		static const char *kwlist[] = { "type", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &type)) {
			return PyUnicode_FromString(Control::getTypeName((Control::Type)type));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTypeName());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getTypeName(): unknown arguments:\n(Control.Type type) -> const char*\n(void) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isUnknown(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUnknown());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isUnknown(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isRoot(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isRoot(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isText(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isText());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isText(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isRect(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isRect(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isGrid(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGrid());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isGrid(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isGroup(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isGroup());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isGroup(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isPanel(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPanel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isPanel(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isDialog(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isDialog());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isDialog(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isWindow(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isWindow());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isWindow(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isCheck(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCheck());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isCheck(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isCombo(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCombo());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isCombo(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isButton(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isButton());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isButton(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isSlider(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSlider());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isSlider(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isScroll(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isScroll());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isScroll(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isSplit(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSplit());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isSplit(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isArea(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isArea());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isArea(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isTree(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTree());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isTree(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isEdit(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEdit());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isEdit(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setAlign(PYControl *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			self->ptr.setAlign((Control::Align)align);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setAlign(): unknown arguments:\n(Control.Align align) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getAlign(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_hasAlign(PYControl *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasAlign((Control::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::hasAlign(): unknown arguments:\n(Control.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_hasAligns(PYControl *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasAligns((Control::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::hasAligns(): unknown arguments:\n(Control.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isSpacer(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSpacer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isSpacer(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setEnabled(PYControl *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setEnabled((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setEnabled(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isEnabled(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_wasEnabled(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.wasEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::wasEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_wasUpdated(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.wasUpdated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::wasUpdated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setDisabled(PYControl *self, PyObject *args, PyObject *kwargs) {
		int32_t disabled = {};
		static const char *kwlist[] = { "disabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &disabled)) {
			self->ptr.setDisabled((disabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setDisabled(): unknown arguments:\n(bool disabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isDisabled(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isDisabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isDisabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getCanvas(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvas_new(self->ptr.getCanvas());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getCanvas(): unknown arguments:\n(void) -> Canvas\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getRoot(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlRoot_new(self->ptr.getRoot());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlRoot_new(self->ptr.getRoot());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getRoot(): unknown arguments:\n(void) -> const ControlRoot\n(void) -> ControlRoot\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getPanel(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlPanel_new(self->ptr.getPanel());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlPanel_new(self->ptr.getPanel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getPanel(): unknown arguments:\n(void) -> const ControlPanel\n(void) -> ControlPanel\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setParent(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *parent_ = nullptr;
		static const char *kwlist[] = { "parent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
			if(!isPYControl(parent_)) break;
			Control &parent = pyControl_get(parent_);
			return PyLong_FromUnsignedLong(self->ptr.setParent(parent));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setParent(): unknown arguments:\n(Control parent) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getParent(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getParent());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getParent());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getParent(): unknown arguments:\n(void) -> const Control\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isParentEnabled(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isParentEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isParentEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isParentDisabled(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isParentDisabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isParentDisabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_addChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			Control &child = pyControl_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.addChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::addChild(): unknown arguments:\n(Control child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_removeChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			Control &child = pyControl_get(child_);
			return PyLong_FromLong(self->ptr.removeChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::removeChild(): unknown arguments:\n(Control child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_raiseChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			Control &child = pyControl_get(child_);
			return PyLong_FromLong(self->ptr.raiseChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::raiseChild(): unknown arguments:\n(Control child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_lowerChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			Control &child = pyControl_get(child_);
			return PyLong_FromLong(self->ptr.lowerChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::lowerChild(): unknown arguments:\n(Control child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_releaseChildren(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.releaseChildren();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::releaseChildren(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_findChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			const Control &child = pyControl_get(child_);
			return PyLong_FromUnsignedLong(self->ptr.findChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::findChild(): unknown arguments:\n(const Control child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_isChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		PyObject *child_ = nullptr;
		static const char *kwlist[] = { "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &child_)) {
			if(!isPYControl(child_)) break;
			const Control &child = pyControl_get(child_);
			return PyLong_FromLong(self->ptr.isChild(child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::isChild(): unknown arguments:\n(const Control child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getNumChildren(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getNumChildren(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getChildren(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyControl_new(ret_[i]));
			return ret;
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getChildren();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, pyControl_new(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getChildren(): unknown arguments:\n(void) -> const Array<Control>\n(void) -> Array<Control>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getChild(PYControl *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyControl_new(self->ptr.getChild(index));
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			static const char *kwlist[] = { "index", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
				return pyControl_new(self->ptr.getChild(index));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getChild(): unknown arguments:\n(uint32_t index) -> const Control\n(uint32_t index) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setSize(PYControl *self, PyObject *args, PyObject *kwargs) {
		float32_t width = {};
		float32_t height = {};
		static const char *kwlist[] = { "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &width, &height)) {
			self->ptr.setSize(width, height);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *size_ = nullptr;
			static const char *kwlist[] = { "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &size_)) {
				if(!isPYVector2f(size_)) break;
				const Vector2f &size = pyVector2f_get(size_);
				self->ptr.setSize(size);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setSize(): unknown arguments:\n(float32_t width, float32_t height) -> void\n(const Vector2f size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getSize(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getWidth(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getWidth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getHeight(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getHeight(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setPosition(PYControl *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setPosition(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *position_ = nullptr;
			static const char *kwlist[] = { "position", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
				if(!isPYVector3f(position_)) break;
				const Vector3f &position = pyVector3f_get(position_);
				self->ptr.setPosition(position);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setPosition(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getPosition(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getPosition());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getPosition(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getPositionX(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getPositionX(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getPositionY(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getPositionY(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setOffset(PYControl *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		float32_t z = 0.0f;
		static const char *kwlist[] = { "x", "y", "z", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff|f", (char**)kwlist, &x, &y, &z)) {
			self->ptr.setOffset(x, y, z);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *offset_ = nullptr;
			static const char *kwlist[] = { "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &offset_)) {
				if(!isPYVector3f(offset_)) break;
				const Vector3f &offset = pyVector3f_get(offset_);
				self->ptr.setOffset(offset);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setOffset(): unknown arguments:\n(float32_t x, float32_t y, float32_t z) -> void\n(const Vector3f offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getOffset(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector3f_new(self->ptr.getOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getOffset(): unknown arguments:\n(void) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getOffsetX(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getOffsetX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getOffsetX(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getOffsetY(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getOffsetY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getOffsetY(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_setMargin(PYControl *self, PyObject *args, PyObject *kwargs) {
		float32_t left = {};
		float32_t right = {};
		float32_t bottom = {};
		float32_t top = {};
		static const char *kwlist[] = { "left", "right", "bottom", "top", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &left, &right, &bottom, &top)) {
			self->ptr.setMargin(left, right, bottom, top);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float32_t horizontal = {};
			float32_t vertical = {};
			static const char *kwlist[] = { "horizontal", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &horizontal, &vertical)) {
				self->ptr.setMargin(horizontal, vertical);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			float32_t value = {};
			static const char *kwlist[] = { "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &value)) {
				self->ptr.setMargin(value);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *margin_ = nullptr;
			static const char *kwlist[] = { "margin", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &margin_)) {
				if(!isPYRect(margin_)) break;
				const Rect &margin = pyRect_get(margin_);
				self->ptr.setMargin(margin);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::setMargin(): unknown arguments:\n(float32_t left, float32_t right, float32_t bottom, float32_t top) -> void\n(float32_t horizontal, float32_t vertical) -> void\n(float32_t value) -> void\n(const Rect margin) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getMargin(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getMargin());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getMargin(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getRect(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getRect(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_getState(PYControl *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getState());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Control::getState(): unknown arguments:\n(void) -> Control::State\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Control_get_type(PYControl *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getType());
	}
	static PyObject *Control_get_align(PYControl *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAlign());
	}
	static PyObject *Control_get_canvas(PYControl *self, void *offset) {
		return pyCanvas_new(self->ptr.getCanvas());
	}
	static PyObject *Control_get_root(PYControl *self, void *offset) {
		return pyControlRoot_new(self->ptr.getRoot());
	}
	static PyObject *Control_get_panel(PYControl *self, void *offset) {
		return pyControlPanel_new(self->ptr.getPanel());
	}
	static PyObject *Control_get_parent(PYControl *self, void *offset) {
		return pyControl_new(self->ptr.getParent());
	}
	static PyObject *Control_get_num_children(PYControl *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumChildren());
	}
	static PyObject *Control_get_size(PYControl *self, void *offset) {
		return pyVector2f_new(self->ptr.getSize());
	}
	static PyObject *Control_get_width(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getWidth());
	}
	static PyObject *Control_get_height(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHeight());
	}
	static PyObject *Control_get_position(PYControl *self, void *offset) {
		return pyVector3f_new(self->ptr.getPosition());
	}
	static PyObject *Control_get_position_x(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getPositionX());
	}
	static PyObject *Control_get_position_y(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getPositionY());
	}
	static PyObject *Control_get_offset(PYControl *self, void *offset) {
		return pyVector3f_new(self->ptr.getOffset());
	}
	static PyObject *Control_get_offset_x(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getOffsetX());
	}
	static PyObject *Control_get_offset_y(PYControl *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getOffsetY());
	}
	static PyObject *Control_get_margin(PYControl *self, void *offset) {
		return pyRect_new(self->ptr.getMargin());
	}
	static PyObject *Control_get_rect(PYControl *self, void *offset) {
		return pyRect_new(self->ptr.getRect());
	}
	static PyObject *Control_get_state(PYControl *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getState());
	}
	static PyObject *pyControl_str(PYControl *self) {
		return PyUnicode_FromString(String::format("Control Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControl_bool(PYControl *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlRoot
	static void pyControlRoot_CopyCallback(ControlRoot a0, const char *text, PyObject *func) {
		PyObject *a0_ = pyControlRoot_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(Os)", a0_, text);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static String pyControlRoot_PasteCallback(ControlRoot a0, PyObject *func) {
		String ret = {};
		PyObject *a0_ = pyControlRoot_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
		return ret;
	}
	static void pyControlRoot_base(PYControlRoot *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlRoot(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlRoot_Type);
	}
	TS_PYAPI ControlRoot &pyControlRoot_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlRoot_Type) return ((PYControlRoot*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlRoot_get(): can't get ControlRoot from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlRoot_get(): can't get ControlRoot from None");
		static ControlRoot ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlRoot_new(const ControlRoot &ptr) {
		PYControlRoot *ret = (PYControlRoot*)PyObject_New(PYControlRoot, &PYControlRoot_Type);
		new(&ret->ptr) ControlRoot(ptr); pyControlRoot_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlRoot_new(ControlRoot &&ptr) {
		PYControlRoot *ret = (PYControlRoot*)PyObject_New(PYControlRoot, &PYControlRoot_Type);
		new(&ret->ptr) ControlRoot(move(ptr)); pyControlRoot_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlRoot_init(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlRoot(((PYControl*)object)->ptr);
				pyControlRoot_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlRoot();
			pyControlRoot_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *canvas_ = nullptr;
			int32_t blob = false;
			static const char *kwlist[] = { "canvas", "blob", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &canvas_, &blob)) {
				if(!isPYCanvas(canvas_)) break;
				Canvas &canvas = pyCanvas_get(canvas_);
				new(&self->ptr) ControlRoot(canvas, (blob != 0));
				pyControlRoot_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::ControlRoot(): unknown arguments:\n(void)\n(Canvas canvas, bool blob)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlRoot_dealloc(PYControlRoot *self) {
		self->ptr.~ControlRoot();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlRoot_equalPtr(PYControlRoot *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlRoot_clonePtr(PYControlRoot *self, PyObject *args) {
		return pyControlRoot_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlRoot_clearPtr(PYControlRoot *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRoot_destroyPtr(PYControlRoot *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRoot_acquirePtr(PYControlRoot *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRoot_unacquirePtr(PYControlRoot *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRoot_isValidPtr(PYControlRoot *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlRoot_isOwnerPtr(PYControlRoot *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlRoot_isConstPtr(PYControlRoot *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlRoot_getCountPtr(PYControlRoot *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlRoot_getInternalPtr(PYControlRoot *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlRoot_getControl(PYControlRoot *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlRoot_setViewport(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t width = {};
		uint32_t height = {};
		static const char *kwlist[] = { "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &width, &height)) {
			self->ptr.setViewport(width, height);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float32_t width = {};
			float32_t height = {};
			static const char *kwlist[] = { "width", "height", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &width, &height)) {
				self->ptr.setViewport(width, height);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *viewport_ = nullptr;
			static const char *kwlist[] = { "viewport", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &viewport_)) {
				if(!isPYViewport(viewport_)) break;
				const Viewport &viewport = pyViewport_get(viewport_);
				self->ptr.setViewport(viewport);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setViewport(): unknown arguments:\n(uint32_t width, uint32_t height) -> void\n(float32_t width, float32_t height) -> void\n(const Viewport viewport) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getViewport(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyViewport_new(self->ptr.getViewport());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getViewport(): unknown arguments:\n(void) -> const Viewport\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getFontName(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFontName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getFontName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFontName(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setFontName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setFontName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFontName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFontBlob(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		const uint8_t (*blob)[256] = nullptr;
		const char *name = nullptr;
		static const char *kwlist[] = { "blob", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &blob, &name)) {
			return PyLong_FromLong(self->ptr.setFontBlob(nullptr, name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFontBlob(): unknown arguments:\n(const uint8_t(*)[256] blob, const char* name) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFontSize(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		int32_t update = false;
		static const char *kwlist[] = { "size", "update", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &size, &update)) {
			return PyLong_FromLong(self->ptr.setFontSize(size, (update != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFontSize(): unknown arguments:\n(uint32_t size, bool update) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getFontSize(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getFontSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFontScale(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t scale = {};
		int32_t update = false;
		static const char *kwlist[] = { "scale", "update", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &scale, &update)) {
			return PyLong_FromLong(self->ptr.setFontScale(scale, (update != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFontScale(): unknown arguments:\n(uint32_t scale, bool update) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getFontScale(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getFontScale(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFontStyle(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		int32_t update = false;
		static const char *kwlist[] = { "style", "update", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &style_, &update)) {
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return PyLong_FromLong(self->ptr.setFontStyle(style, (update != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFontStyle(): unknown arguments:\n(const FontStyle style, bool update) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getFontStyle(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getFontStyle(): unknown arguments:\n(void) -> const FontStyle\n(void) -> FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getTextureName(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setTextureName(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t width = 0;
		uint32_t height = 0;
		float32_t border = 0.0f;
		static const char *kwlist[] = { "name", "width", "height", "border", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|IIf", (char**)kwlist, &name, &width, &height, &border)) {
			return PyLong_FromLong(self->ptr.setTextureName(name, width, height, border));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t width = 0;
			uint32_t height = 0;
			float32_t border = 0.0f;
			static const char *kwlist[] = { "name", "width", "height", "border", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIf", (char**)kwlist, &name_, &width, &height, &border)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(self->ptr.setTextureName(name, width, height, border));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setTextureName(): unknown arguments:\n(const char* name, uint32_t width, uint32_t height, float32_t border) -> bool\n(const String name, uint32_t width, uint32_t height, float32_t border) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setTextureBlob(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		const uint8_t (*blob)[256] = nullptr;
		const char *name = nullptr;
		uint32_t width = 0;
		uint32_t height = 0;
		float32_t border = 0.0f;
		static const char *kwlist[] = { "blob", "name", "width", "height", "border", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|sIIf", (char**)kwlist, &blob, &name, &width, &height, &border)) {
			return PyLong_FromLong(self->ptr.setTextureBlob(nullptr, name, width, height, border));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setTextureBlob(): unknown arguments:\n(const uint8_t(*)[256] blob, const char* name, uint32_t width, uint32_t height, float32_t border) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getTextureWidth(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getTextureWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getTextureWidth(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getTextureHeight(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getTextureHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getTextureHeight(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setTextColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t state = 0;
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "type", "state", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO", (char**)kwlist, &type, &state, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setTextColor((Control::Type)type, (Control::State)state, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setTextColor(): unknown arguments:\n(Control.Type type, Control.State state, const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setTextOffset(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t state = 0;
		PyObject *offset_ = nullptr;
		static const char *kwlist[] = { "type", "state", "offset", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO", (char**)kwlist, &type, &state, &offset_)) {
			if(!isPYVector3f(offset_)) break;
			const Vector3f &offset = pyVector3f_get(offset_);
			self->ptr.setTextOffset((Control::Type)type, (Control::State)state, offset);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setTextOffset(): unknown arguments:\n(Control.Type type, Control.State state, const Vector3f offset) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getTextColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t state = 0;
		static const char *kwlist[] = { "type", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &type, &state)) {
			return pyColor_new(self->ptr.getTextColor((Control::Type)type, (Control::State)state));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getTextColor(): unknown arguments:\n(Control.Type type, Control.State state) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getTextOffset(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t type = 0;
		uint32_t state = 0;
		static const char *kwlist[] = { "type", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &type, &state)) {
			return pyVector3f_new(self->ptr.getTextOffset((Control::Type)type, (Control::State)state));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getTextOffset(): unknown arguments:\n(Control.Type type, Control.State state) -> const Vector3f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMeshColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		uint32_t state = 0;
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "mesh", "state", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIO", (char**)kwlist, &mesh, &state, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setMeshColor((Control::Mesh)mesh, (Control::State)state, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMeshColor(): unknown arguments:\n(Control.Mesh mesh, Control.State state, const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMeshRegion(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		PyObject *grid_ = nullptr;
		PyObject *region_ = nullptr;
		PyObject *border_ = nullptr;
		static const char *kwlist[] = { "mesh", "grid", "region", "border", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOOO", (char**)kwlist, &mesh, &grid_, &region_, &border_)) {
			if(!isPYRect(grid_)) break;
			const Rect &grid = pyRect_get(grid_);
			if(!isPYRect(region_)) break;
			const Rect &region = pyRect_get(region_);
			if(!isPYVector2f(border_)) break;
			const Vector2f &border = pyVector2f_get(border_);
			self->ptr.setMeshRegion((Control::Mesh)mesh, grid, region, border);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMeshRegion(): unknown arguments:\n(Control.Mesh mesh, const Rect grid, const Rect region, const Vector2f border) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMeshRegions(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		PyObject *grid_ = nullptr;
		PyObject *regions_ = nullptr;
		PyObject *border_ = nullptr;
		static const char *kwlist[] = { "mesh", "grid", "regions", "border", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IOOO", (char**)kwlist, &mesh, &grid_, &regions_, &border_)) {
			if(!isPYRect(grid_)) break;
			const Rect &grid = pyRect_get(grid_);
			if(!isPYRect(regions_)) break;
			const Rect &regions = pyRect_get(regions_);
			if(!isPYVector2f(border_)) break;
			const Vector2f &border = pyVector2f_get(border_);
			self->ptr.setMeshRegions((Control::Mesh)mesh, grid, regions, border);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMeshRegions(): unknown arguments:\n(Control.Mesh mesh, const Rect grid, const Rect regions, const Vector2f border) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMeshColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		uint32_t state = 0;
		static const char *kwlist[] = { "mesh", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &mesh, &state)) {
			return PyLong_FromUnsignedLong(self->ptr.getMeshColor((Control::Mesh)mesh, (Control::State)state));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMeshColor(): unknown arguments:\n(Control.Mesh mesh, Control.State state) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMeshGrid(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		static const char *kwlist[] = { "mesh", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mesh)) {
			return pyRect_new(self->ptr.getMeshGrid((Control::Mesh)mesh));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMeshGrid(): unknown arguments:\n(Control.Mesh mesh) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMeshMargin(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		static const char *kwlist[] = { "mesh", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mesh)) {
			return pyRect_new(self->ptr.getMeshMargin((Control::Mesh)mesh));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMeshMargin(): unknown arguments:\n(Control.Mesh mesh) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMeshRegion(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t mesh = 0;
		uint32_t state = 0;
		static const char *kwlist[] = { "mesh", "state", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &mesh, &state)) {
			return pyRect_new(self->ptr.getMeshRegion((Control::Mesh)mesh, (Control::State)state));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMeshRegion(): unknown arguments:\n(Control.Mesh mesh, Control.State state) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setGroupRadius(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setGroupRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setGroupRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setGroupColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setGroupColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setGroupColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getGroupRadius(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getGroupRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getGroupRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getGroupColor(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getGroupColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getGroupColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setPanelRadius(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setPanelRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setPanelRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setPanelColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setPanelColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setPanelColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getPanelRadius(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getPanelRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getPanelRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getPanelColor(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getPanelColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getPanelColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setCheckedColor(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setCheckedColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setCheckedColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getCheckedColor(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getCheckedColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getCheckedColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMouse(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		uint32_t buttons = 0;
		static const char *kwlist[] = { "x", "y", "buttons", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "iiI", (char**)kwlist, &x, &y, &buttons)) {
			self->ptr.setMouse(x, y, (Control::Button)buttons);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			float32_t x = {};
			float32_t y = {};
			uint32_t buttons = 0;
			static const char *kwlist[] = { "x", "y", "buttons", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffI", (char**)kwlist, &x, &y, &buttons)) {
				self->ptr.setMouse(x, y, (Control::Button)buttons);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMouse(): unknown arguments:\n(int32_t x, int32_t y, Control.Button buttons) -> void\n(float32_t x, float32_t y, Control.Button buttons) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouse(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getMouse());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouse(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouseButtons(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMouseButtons());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouseButtons(): unknown arguments:\n(void) -> Control::Button\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouseX(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMouseX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouseX(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouseY(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMouseY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouseY(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMouseAxis(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t axis = 0;
		float32_t delta = {};
		static const char *kwlist[] = { "axis", "delta", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &axis, &delta)) {
			self->ptr.setMouseAxis((Control::Axis)axis, delta);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMouseAxis(): unknown arguments:\n(Control.Axis axis, float32_t delta) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMouseAlign(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		int32_t clear = true;
		static const char *kwlist[] = { "align", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &align, &clear)) {
			self->ptr.setMouseAlign((Control::Align)align, (clear != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMouseAlign(): unknown arguments:\n(Control.Align align, bool clear) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouseAlign(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMouseAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouseAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_hasMouseAlign(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasMouseAlign((Control::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::hasMouseAlign(): unknown arguments:\n(Control.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_hasMouseAligns(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasMouseAligns((Control::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::hasMouseAligns(): unknown arguments:\n(Control.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setKeyboardKey(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t key = {};
		uint32_t code = {};
		int32_t value = {};
		static const char *kwlist[] = { "key", "code", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IIi", (char**)kwlist, &key, &code, &value)) {
			return PyLong_FromLong(self->ptr.setKeyboardKey(key, code, (value != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setKeyboardKey(): unknown arguments:\n(uint32_t key, uint32_t code, bool value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getKeyboardKey(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t key = {};
		int32_t clear = false;
		static const char *kwlist[] = { "key", "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &key, &clear)) {
			return PyLong_FromLong(self->ptr.getKeyboardKey(key, (clear != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getKeyboardKey(): unknown arguments:\n(uint32_t key, bool clear) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_clearCurrentControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearCurrentControl();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::clearCurrentControl(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setCurrentControl(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *control_ = nullptr;
		int32_t grab = false;
		static const char *kwlist[] = { "control", "grab", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &control_, &grab)) {
			if(!isPYControl(control_)) break;
			Control control = pyControl_get(control_);
			self->ptr.setCurrentControl(control, (grab != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setCurrentControl(): unknown arguments:\n(Control control, bool grab) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getCurrentControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getCurrentControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getCurrentControl(): unknown arguments:\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getControlGrab(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getControlGrab());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getControlGrab(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_clearFocusedControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearFocusedControl();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::clearFocusedControl(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setFocusedControl(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *control_ = nullptr;
		static const char *kwlist[] = { "control", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &control_)) {
			if(!isPYControl(control_)) break;
			Control control = pyControl_get(control_);
			self->ptr.setFocusedControl(control);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setFocusedControl(): unknown arguments:\n(Control control) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getFocusedControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getFocusedControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getFocusedControl(): unknown arguments:\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_isFocusedControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFocusedControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::isFocusedControl(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_clearMouseControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearMouseControl();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::clearMouseControl(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setMouseControl(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *control_ = nullptr;
		static const char *kwlist[] = { "control", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &control_)) {
			if(!isPYControl(control_)) break;
			Control control = pyControl_get(control_);
			self->ptr.setMouseControl(control);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setMouseControl(): unknown arguments:\n(Control control) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getMouseControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getMouseControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getMouseControl(): unknown arguments:\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_isMouseControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMouseControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::isMouseControl(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_clearInputControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearInputControl();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::clearInputControl(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setInputControl(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *control_ = nullptr;
		static const char *kwlist[] = { "control", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &control_)) {
			if(!isPYControl(control_)) break;
			Control control = pyControl_get(control_);
			self->ptr.setInputControl(control);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setInputControl(): unknown arguments:\n(Control control) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getInputControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getInputControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getInputControl(): unknown arguments:\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_isInputControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isInputControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::isInputControl(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_clearModalControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearModalControl();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::clearModalControl(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setModalControl(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *control_ = nullptr;
		static const char *kwlist[] = { "control", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &control_)) {
			if(!isPYControl(control_)) break;
			Control control = pyControl_get(control_);
			self->ptr.setModalControl(control);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setModalControl(): unknown arguments:\n(Control control) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getModalControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControl_new(self->ptr.getModalControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getModalControl(): unknown arguments:\n(void) -> Control\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_isModalControl(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isModalControl());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::isModalControl(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_update(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		uint32_t scale = 0;
		int32_t order = 0;
		static const char *kwlist[] = { "scale", "order", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|Ii", (char**)kwlist, &scale, &order)) {
			return PyLong_FromLong(self->ptr.update(scale, order));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::update(): unknown arguments:\n(uint32_t scale, int32_t order) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setCopyText(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setCopyText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setCopyText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setCopyText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_getPasteText(PYControlRoot *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPasteText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::getPasteText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setCopyCallback(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRoot_CopyCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setCopyCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setCopyCallback(): unknown arguments:\n(const ControlRoot.CopyCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_setPasteCallback(PYControlRoot *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRoot_PasteCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setPasteCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRoot::setPasteCallback(): unknown arguments:\n(const ControlRoot.PasteCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRoot_get_viewport(PYControlRoot *self, void *offset) {
		return pyViewport_new(self->ptr.getViewport());
	}
	static PyObject *ControlRoot_get_font_name(PYControlRoot *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFontName().get());
	}
	static PyObject *ControlRoot_get_font_size(PYControlRoot *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontSize());
	}
	static PyObject *ControlRoot_get_font_scale(PYControlRoot *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontScale());
	}
	static PyObject *ControlRoot_get_font_style(PYControlRoot *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyle());
	}
	static PyObject *ControlRoot_get_texture_name(PYControlRoot *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *ControlRoot_get_texture_width(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getTextureWidth());
	}
	static PyObject *ControlRoot_get_texture_height(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getTextureHeight());
	}
	static PyObject *ControlRoot_get_group_radius(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getGroupRadius());
	}
	static PyObject *ControlRoot_get_group_color(PYControlRoot *self, void *offset) {
		return pyColor_new(self->ptr.getGroupColor());
	}
	static PyObject *ControlRoot_get_panel_radius(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getPanelRadius());
	}
	static PyObject *ControlRoot_get_panel_color(PYControlRoot *self, void *offset) {
		return pyColor_new(self->ptr.getPanelColor());
	}
	static PyObject *ControlRoot_get_checked_color(PYControlRoot *self, void *offset) {
		return pyColor_new(self->ptr.getCheckedColor());
	}
	static PyObject *ControlRoot_get_mouse(PYControlRoot *self, void *offset) {
		return pyVector2f_new(self->ptr.getMouse());
	}
	static PyObject *ControlRoot_get_mouse_buttons(PYControlRoot *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMouseButtons());
	}
	static PyObject *ControlRoot_get_mouse_x(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMouseX());
	}
	static PyObject *ControlRoot_get_mouse_y(PYControlRoot *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMouseY());
	}
	static PyObject *ControlRoot_get_mouse_align(PYControlRoot *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMouseAlign());
	}
	static PyObject *ControlRoot_get_current_control(PYControlRoot *self, void *offset) {
		return pyControl_new(self->ptr.getCurrentControl());
	}
	static PyObject *ControlRoot_get_control_grab(PYControlRoot *self, void *offset) {
		return PyLong_FromLong(self->ptr.getControlGrab());
	}
	static PyObject *ControlRoot_get_focused_control(PYControlRoot *self, void *offset) {
		return pyControl_new(self->ptr.getFocusedControl());
	}
	static PyObject *ControlRoot_get_mouse_control(PYControlRoot *self, void *offset) {
		return pyControl_new(self->ptr.getMouseControl());
	}
	static PyObject *ControlRoot_get_input_control(PYControlRoot *self, void *offset) {
		return pyControl_new(self->ptr.getInputControl());
	}
	static PyObject *ControlRoot_get_modal_control(PYControlRoot *self, void *offset) {
		return pyControl_new(self->ptr.getModalControl());
	}
	static PyObject *ControlRoot_get_paste_text(PYControlRoot *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPasteText().get());
	}
	static PyObject *pyControlRoot_str(PYControlRoot *self) {
		return PyUnicode_FromString(String::format("ControlRoot Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlRoot_bool(PYControlRoot *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlText
	static void pyControlText_base(PYControlText *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlText(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYControlText_Type || type == &PYControlGroup_Type || type == &PYControlCheck_Type || type == &PYControlCombo_Type || type == &PYControlButton_Type || type == &PYControlSlider_Type || type == &PYControlScroll_Type || type == &PYControlTree_Type || type == &PYControlEdit_Type);
	}
	TS_PYAPI ControlText &pyControlText_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYControlText_Type || type == &PYControlGroup_Type || type == &PYControlCheck_Type || type == &PYControlCombo_Type || type == &PYControlButton_Type || type == &PYControlSlider_Type || type == &PYControlScroll_Type || type == &PYControlTree_Type || type == &PYControlEdit_Type) return ((PYControlText*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlText_get(): can't get ControlText from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlText_get(): can't get ControlText from None");
		static ControlText ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlText_new(const ControlText &ptr) {
		PYControlText *ret = (PYControlText*)PyObject_New(PYControlText, &PYControlText_Type);
		new(&ret->ptr) ControlText(ptr); pyControlText_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlText_new(ControlText &&ptr) {
		PYControlText *ret = (PYControlText*)PyObject_New(PYControlText, &PYControlText_Type);
		new(&ret->ptr) ControlText(move(ptr)); pyControlText_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlText_init(PYControlText *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlText(((PYControl*)object)->ptr);
				pyControlText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlText();
			pyControlText_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlText(parent);
				pyControlText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &text)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlText(parent, text);
				pyControlText_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &text_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlText(parent, text);
				pyControlText_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::ControlText(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, const char* text)\n(Control* parent, const String text)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlText_dealloc(PYControlText *self) {
		self->ptr.~ControlText();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlText_equalPtr(PYControlText *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlText_clonePtr(PYControlText *self, PyObject *args) {
		return pyControlText_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlText_clearPtr(PYControlText *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlText_destroyPtr(PYControlText *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlText_acquirePtr(PYControlText *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlText_unacquirePtr(PYControlText *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlText_isValidPtr(PYControlText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlText_isOwnerPtr(PYControlText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlText_isConstPtr(PYControlText *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlText_getCountPtr(PYControlText *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlText_getInternalPtr(PYControlText *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlText_getControl(PYControlText *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlText_setMode(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setMode((CanvasElement::Mode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setMode(): unknown arguments:\n(CanvasElement.Mode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getMode(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getMode(): unknown arguments:\n(void) -> CanvasElement::Mode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setPipeline(PYControlText *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "pipeline", "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &pipeline_, &func_)) {
			if(!isPYPipeline(pipeline_)) break;
			Pipeline &pipeline = pyPipeline_get(pipeline_);
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvasElement_DrawCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setPipeline(pipeline, func);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *pipeline_ = nullptr;
			static const char *kwlist[] = { "pipeline", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
				if(!isPYPipeline(pipeline_)) break;
				Pipeline &pipeline = pyPipeline_get(pipeline_);
				self->ptr.setPipeline(pipeline);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setPipeline(): unknown arguments:\n(Pipeline pipeline, const CanvasElement.DrawCallback func) -> void\n(Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getPipeline(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyPipeline_new(self->ptr.getPipeline());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getPipeline(): unknown arguments:\n(void) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setColor(PYControlText *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
			self->ptr.setColor(r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getColor(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFilter(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &filter)) {
			self->ptr.setFilter((Sampler::Filter)filter);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFilter(): unknown arguments:\n(Sampler.Filter filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFilter(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFilter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFilter(): unknown arguments:\n(void) -> Sampler::Filter\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setAnisotropy(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t anisotropy = {};
		static const char *kwlist[] = { "anisotropy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &anisotropy)) {
			self->ptr.setAnisotropy(anisotropy);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setAnisotropy(): unknown arguments:\n(uint32_t anisotropy) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getAnisotropy(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getAnisotropy(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setBlend(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
			self->ptr.setBlend((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setBlend(): unknown arguments:\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getBlendOp(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getBlendOp(): unknown arguments:\n(void) -> Pipeline::BlendOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getBlendSrcFunc(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getBlendSrcFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getBlendDestFunc(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getBlendDestFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFontName(PYControlText *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setFontName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setFontName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFontName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontName(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFontName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFontColor(PYControlText *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setFontColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFontColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontColor(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getFontColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFontSize(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			return PyLong_FromLong(self->ptr.setFontSize(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFontSize(): unknown arguments:\n(uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontSize(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFontStyle(PYControlText *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return PyLong_FromLong(self->ptr.setFontStyle(style));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFontStyle(): unknown arguments:\n(const FontStyle style) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontStyleConst(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontStyleConst(): unknown arguments:\n(void) -> const FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontStyle(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontStyle(): unknown arguments:\n(void) -> const FontStyle\n(void) -> FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setFontAlign(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			self->ptr.setFontAlign((Control::Align)align);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setFontAlign(): unknown arguments:\n(Control.Align align) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getFontAlign(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getFontAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_hasFontAlign(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasFontAlign((Control::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::hasFontAlign(): unknown arguments:\n(Control.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_hasFontAligns(PYControlText *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasFontAligns((Control::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::hasFontAligns(): unknown arguments:\n(Control.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_setText(PYControlText *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::setText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getText(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_getCanvasText(PYControlText *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasText_new(self->ptr.getCanvasText());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlText::getCanvasText(): unknown arguments:\n(void) -> CanvasText\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlText_get_mode(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMode());
	}
	static PyObject *ControlText_get_pipeline(PYControlText *self, void *offset) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *ControlText_get_color(PYControlText *self, void *offset) {
		return pyColor_new(self->ptr.getColor());
	}
	static PyObject *ControlText_get_filter(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFilter());
	}
	static PyObject *ControlText_get_anisotropy(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
	}
	static PyObject *ControlText_get_blend_op(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
	}
	static PyObject *ControlText_get_blend_src_func(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
	}
	static PyObject *ControlText_get_blend_dest_func(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
	}
	static PyObject *ControlText_get_font_name(PYControlText *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFontName().get());
	}
	static PyObject *ControlText_get_font_color(PYControlText *self, void *offset) {
		return pyColor_new(self->ptr.getFontColor());
	}
	static PyObject *ControlText_get_font_size(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontSize());
	}
	static PyObject *ControlText_get_font_style_const(PYControlText *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyleConst());
	}
	static PyObject *ControlText_get_font_style(PYControlText *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyle());
	}
	static PyObject *ControlText_get_font_align(PYControlText *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontAlign());
	}
	static PyObject *ControlText_get_text(PYControlText *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getText().get());
	}
	static PyObject *ControlText_get_canvas_text(PYControlText *self, void *offset) {
		return pyCanvasText_new(self->ptr.getCanvasText());
	}
	static PyObject *pyControlText_str(PYControlText *self) {
		return PyUnicode_FromString(String::format("ControlText Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlText_bool(PYControlText *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlRect
	static void pyControlRect_PressedCallback(ControlRect a0, float32_t x, float32_t y, PyObject *func) {
		PyObject *a0_ = pyControlRect_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(Off)", a0_, x, y);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlRect_ReleasedCallback(ControlRect a0, float32_t x, float32_t y, PyObject *func) {
		PyObject *a0_ = pyControlRect_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(Off)", a0_, x, y);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlRect_ClickedCallback(ControlRect a0, PyObject *func) {
		PyObject *a0_ = pyControlRect_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlRect_base(PYControlRect *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlRect(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYControlRect_Type || type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type);
	}
	TS_PYAPI ControlRect &pyControlRect_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYControlRect_Type || type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type) return ((PYControlRect*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlRect_get(): can't get ControlRect from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlRect_get(): can't get ControlRect from None");
		static ControlRect ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlRect_new(const ControlRect &ptr) {
		PYControlRect *ret = (PYControlRect*)PyObject_New(PYControlRect, &PYControlRect_Type);
		new(&ret->ptr) ControlRect(ptr); pyControlRect_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlRect_new(ControlRect &&ptr) {
		PYControlRect *ret = (PYControlRect*)PyObject_New(PYControlRect, &PYControlRect_Type);
		new(&ret->ptr) ControlRect(move(ptr)); pyControlRect_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlRect_init(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlRect(((PYControl*)object)->ptr);
				pyControlRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlRect();
			pyControlRect_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlRect(parent);
				pyControlRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "parent", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &texture_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				new(&self->ptr) ControlRect(parent, texture);
				pyControlRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "parent", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &name)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlRect(parent, name);
				pyControlRect_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t mode = 0;
			static const char *kwlist[] = { "parent", "mode", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &parent_, &mode)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlRect(parent, (CanvasElement::Mode)mode);
				pyControlRect_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::ControlRect(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, Texture texture)\n(Control* parent, const char* name)\n(Control* parent, CanvasElement.Mode mode)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlRect_dealloc(PYControlRect *self) {
		self->ptr.~ControlRect();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlRect_equalPtr(PYControlRect *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlRect_clonePtr(PYControlRect *self, PyObject *args) {
		return pyControlRect_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlRect_clearPtr(PYControlRect *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRect_destroyPtr(PYControlRect *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRect_acquirePtr(PYControlRect *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRect_unacquirePtr(PYControlRect *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlRect_isValidPtr(PYControlRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlRect_isOwnerPtr(PYControlRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlRect_isConstPtr(PYControlRect *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlRect_getCountPtr(PYControlRect *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlRect_getInternalPtr(PYControlRect *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlRect_getControl(PYControlRect *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlRect_setCallback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		int32_t callback = {};
		static const char *kwlist[] = { "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &callback)) {
			self->ptr.setCallback((callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setCallback(): unknown arguments:\n(bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getCallback(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getCallback());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getCallback(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setFullscreen(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		int32_t fullscreen = {};
		static const char *kwlist[] = { "fullscreen", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &fullscreen)) {
			self->ptr.setFullscreen((fullscreen != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setFullscreen(): unknown arguments:\n(bool fullscreen) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_isFullscreen(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFullscreen());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::isFullscreen(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setMode(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setMode((CanvasElement::Mode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setMode(): unknown arguments:\n(CanvasElement.Mode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getMode(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getMode(): unknown arguments:\n(void) -> CanvasElement::Mode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setPipeline(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *pipeline_ = nullptr;
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "pipeline", "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &pipeline_, &func_)) {
			if(!isPYPipeline(pipeline_)) break;
			Pipeline &pipeline = pyPipeline_get(pipeline_);
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyCanvasElement_DrawCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setPipeline(pipeline, func);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *pipeline_ = nullptr;
			static const char *kwlist[] = { "pipeline", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &pipeline_)) {
				if(!isPYPipeline(pipeline_)) break;
				Pipeline &pipeline = pyPipeline_get(pipeline_);
				self->ptr.setPipeline(pipeline);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setPipeline(): unknown arguments:\n(Pipeline pipeline, const CanvasElement.DrawCallback func) -> void\n(Pipeline pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getPipeline(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyPipeline_new(self->ptr.getPipeline());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getPipeline(): unknown arguments:\n(void) -> Pipeline\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setRadius(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getRadius(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setColor(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		float32_t r = {};
		float32_t g = {};
		float32_t b = {};
		float32_t a = {};
		static const char *kwlist[] = { "r", "g", "b", "a", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &r, &g, &b, &a)) {
			self->ptr.setColor(r, g, b, a);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
				if(!isPYColor(color_)) break;
				const Color &color = pyColor_get(color_);
				self->ptr.setColor(color);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setColor(): unknown arguments:\n(float32_t r, float32_t g, float32_t b, float32_t a) -> void\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getColor(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setStrokeStyle(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getStrokeStyleConst(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getStrokeStyle(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setGradientStyle(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getGradientStyleConst(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getGradientStyle(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setMipmap(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		float32_t mipmap = {};
		static const char *kwlist[] = { "mipmap", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &mipmap)) {
			self->ptr.setMipmap(mipmap);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setMipmap(): unknown arguments:\n(float32_t mipmap) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getMipmap(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMipmap());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getMipmap(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setFilter(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		uint32_t filter = 0;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &filter)) {
			self->ptr.setFilter((Sampler::Filter)filter);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setFilter(): unknown arguments:\n(Sampler.Filter filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getFilter(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFilter());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getFilter(): unknown arguments:\n(void) -> Sampler::Filter\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setAnisotropy(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		uint32_t anisotropy = {};
		static const char *kwlist[] = { "anisotropy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &anisotropy)) {
			self->ptr.setAnisotropy(anisotropy);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setAnisotropy(): unknown arguments:\n(uint32_t anisotropy) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getAnisotropy(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getAnisotropy(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setWrapMode(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setWrapMode((Sampler::WrapMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setWrapMode(): unknown arguments:\n(Sampler.WrapMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getWrapMode(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWrapMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getWrapMode(): unknown arguments:\n(void) -> Sampler::WrapMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setBlend(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		uint32_t op = 0;
		uint32_t src = 0;
		uint32_t dest = 0;
		static const char *kwlist[] = { "op", "src", "dest", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &op, &src, &dest)) {
			self->ptr.setBlend((Pipeline::BlendOp)op, (Pipeline::BlendFunc)src, (Pipeline::BlendFunc)dest);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setBlend(): unknown arguments:\n(Pipeline.BlendOp op, Pipeline.BlendFunc src, Pipeline.BlendFunc dest) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getBlendOp(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getBlendOp(): unknown arguments:\n(void) -> Pipeline::BlendOp\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getBlendSrcFunc(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getBlendSrcFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getBlendDestFunc(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getBlendDestFunc(): unknown arguments:\n(void) -> Pipeline::BlendFunc\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTexture(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		int32_t linear = false;
		static const char *kwlist[] = { "texture", "linear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &texture_, &linear)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.setTexture(texture, (linear != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTexture(): unknown arguments:\n(Texture texture, bool linear) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTexture(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.getTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTexture(): unknown arguments:\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureLinear(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureLinear());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureLinear(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTextureName(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setTextureName(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setTextureName(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTextureName(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureName(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTextureScale(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		float32_t scale_x = {};
		float32_t scale_y = {};
		static const char *kwlist[] = { "scale_x", "scale_y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &scale_x, &scale_y)) {
			self->ptr.setTextureScale(scale_x, scale_y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTextureScale(): unknown arguments:\n(float32_t scale_x, float32_t scale_y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureScaleX(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getTextureScaleX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureScaleX(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureScaleY(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getTextureScaleY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureScaleY(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTextureFlip(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		int32_t flip_x = {};
		int32_t flip_y = {};
		static const char *kwlist[] = { "flip_x", "flip_y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &flip_x, &flip_y)) {
			self->ptr.setTextureFlip((flip_x != 0), (flip_y != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTextureFlip(): unknown arguments:\n(bool flip_x, bool flip_y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureFlipX(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureFlipX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureFlipX(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureFlipY(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureFlipY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureFlipY(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTextureProj(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		int32_t projection = {};
		static const char *kwlist[] = { "projection", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &projection)) {
			self->ptr.setTextureProj((projection != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTextureProj(): unknown arguments:\n(bool projection) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTextureProj(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getTextureProj());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTextureProj(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setTexCoord(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		float32_t left = {};
		float32_t right = {};
		float32_t bottom = {};
		float32_t top = {};
		static const char *kwlist[] = { "left", "right", "bottom", "top", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", (char**)kwlist, &left, &right, &bottom, &top)) {
			self->ptr.setTexCoord(left, right, bottom, top);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *texcoord_ = nullptr;
			static const char *kwlist[] = { "texcoord", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &texcoord_)) {
				if(!isPYRect(texcoord_)) break;
				const Rect &texcoord = pyRect_get(texcoord_);
				self->ptr.setTexCoord(texcoord);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setTexCoord(): unknown arguments:\n(float32_t left, float32_t right, float32_t bottom, float32_t top) -> void\n(const Rect texcoord) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getTexCoord(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getTexCoord());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getTexCoord(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setPressedCallback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRect_PressedCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setPressedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setPressedCallback(): unknown arguments:\n(const ControlRect.PressedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setReleasedCallback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRect_ReleasedCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setReleasedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setReleasedCallback(): unknown arguments:\n(const ControlRect.ReleasedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setClickedCallback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRect_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setClickedCallback(): unknown arguments:\n(const ControlRect.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setClicked2Callback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRect_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClicked2Callback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setClicked2Callback(): unknown arguments:\n(const ControlRect.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_setClickedRightCallback(PYControlRect *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlRect_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedRightCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::setClickedRightCallback(): unknown arguments:\n(const ControlRect.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getCanvasRect(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasRect_new(self->ptr.getCanvasRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getCanvasRect(): unknown arguments:\n(void) -> CanvasRect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_getCanvasMesh(PYControlRect *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlRect::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlRect_get_callback(PYControlRect *self, void *offset) {
		return PyLong_FromLong(self->ptr.getCallback());
	}
	static PyObject *ControlRect_get_mode(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMode());
	}
	static PyObject *ControlRect_get_pipeline(PYControlRect *self, void *offset) {
		return pyPipeline_new(self->ptr.getPipeline());
	}
	static PyObject *ControlRect_get_radius(PYControlRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getRadius());
	}
	static PyObject *ControlRect_get_color(PYControlRect *self, void *offset) {
		return pyColor_new(self->ptr.getColor());
	}
	static PyObject *ControlRect_get_stroke_style_const(PYControlRect *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *ControlRect_get_stroke_style(PYControlRect *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *ControlRect_get_gradient_style_const(PYControlRect *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *ControlRect_get_gradient_style(PYControlRect *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *ControlRect_get_mipmap(PYControlRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMipmap());
	}
	static PyObject *ControlRect_get_filter(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFilter());
	}
	static PyObject *ControlRect_get_anisotropy(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getAnisotropy());
	}
	static PyObject *ControlRect_get_wrap_mode(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWrapMode());
	}
	static PyObject *ControlRect_get_blend_op(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendOp());
	}
	static PyObject *ControlRect_get_blend_src_func(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendSrcFunc());
	}
	static PyObject *ControlRect_get_blend_dest_func(PYControlRect *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBlendDestFunc());
	}
	static PyObject *ControlRect_get_texture(PYControlRect *self, void *offset) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *ControlRect_get_texture_linear(PYControlRect *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureLinear());
	}
	static PyObject *ControlRect_get_texture_name(PYControlRect *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *ControlRect_get_texture_scale_x(PYControlRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getTextureScaleX());
	}
	static PyObject *ControlRect_get_texture_scale_y(PYControlRect *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getTextureScaleY());
	}
	static PyObject *ControlRect_get_texture_flip_x(PYControlRect *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureFlipX());
	}
	static PyObject *ControlRect_get_texture_flip_y(PYControlRect *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureFlipY());
	}
	static PyObject *ControlRect_get_texture_proj(PYControlRect *self, void *offset) {
		return PyLong_FromLong(self->ptr.getTextureProj());
	}
	static PyObject *ControlRect_get_tex_coord(PYControlRect *self, void *offset) {
		return pyRect_new(self->ptr.getTexCoord());
	}
	static PyObject *ControlRect_get_canvas_rect(PYControlRect *self, void *offset) {
		return pyCanvasRect_new(self->ptr.getCanvasRect());
	}
	static PyObject *ControlRect_get_canvas_mesh(PYControlRect *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlRect_str(PYControlRect *self) {
		return PyUnicode_FromString(String::format("ControlRect Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlRect_bool(PYControlRect *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlGrid
	static void pyControlGrid_base(PYControlGrid *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlGrid(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlGrid_Type);
	}
	TS_PYAPI ControlGrid &pyControlGrid_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlGrid_Type) return ((PYControlGrid*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlGrid_get(): can't get ControlGrid from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlGrid_get(): can't get ControlGrid from None");
		static ControlGrid ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlGrid_new(const ControlGrid &ptr) {
		PYControlGrid *ret = (PYControlGrid*)PyObject_New(PYControlGrid, &PYControlGrid_Type);
		new(&ret->ptr) ControlGrid(ptr); pyControlGrid_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlGrid_new(ControlGrid &&ptr) {
		PYControlGrid *ret = (PYControlGrid*)PyObject_New(PYControlGrid, &PYControlGrid_Type);
		new(&ret->ptr) ControlGrid(move(ptr)); pyControlGrid_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlGrid_init(PYControlGrid *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlGrid(((PYControl*)object)->ptr);
				pyControlGrid_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlGrid();
			pyControlGrid_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGrid(parent);
				pyControlGrid_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			static const char *kwlist[] = { "parent", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &parent_, &columns)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGrid(parent, columns);
				pyControlGrid_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = 0.0f;
			static const char *kwlist[] = { "parent", "columns", "x", "y", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIf|f", (char**)kwlist, &parent_, &columns, &x, &y)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGrid(parent, columns, x, y);
				pyControlGrid_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::ControlGrid(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, uint32_t columns)\n(Control* parent, uint32_t columns, float32_t x, float32_t y)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlGrid_dealloc(PYControlGrid *self) {
		self->ptr.~ControlGrid();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlGrid_equalPtr(PYControlGrid *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlGrid_clonePtr(PYControlGrid *self, PyObject *args) {
		return pyControlGrid_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlGrid_clearPtr(PYControlGrid *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGrid_destroyPtr(PYControlGrid *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGrid_acquirePtr(PYControlGrid *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGrid_unacquirePtr(PYControlGrid *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGrid_isValidPtr(PYControlGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlGrid_isOwnerPtr(PYControlGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlGrid_isConstPtr(PYControlGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlGrid_getCountPtr(PYControlGrid *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlGrid_getInternalPtr(PYControlGrid *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlGrid_getControl(PYControlGrid *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlGrid_setColumns(PYControlGrid *self, PyObject *args, PyObject *kwargs) {
		uint32_t columns = {};
		static const char *kwlist[] = { "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &columns)) {
			self->ptr.setColumns(columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::setColumns(): unknown arguments:\n(uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_getColumns(PYControlGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColumns());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::getColumns(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_setSpacing(PYControlGrid *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &x, &y)) {
			self->ptr.setSpacing(x, y);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *spacing_ = nullptr;
			static const char *kwlist[] = { "spacing", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &spacing_)) {
				if(!isPYVector2f(spacing_)) break;
				const Vector2f &spacing = pyVector2f_get(spacing_);
				self->ptr.setSpacing(spacing);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::setSpacing(): unknown arguments:\n(float32_t x, float32_t y) -> void\n(const Vector2f spacing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_getSpacing(PYControlGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSpacing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::getSpacing(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_setColumnRatio(PYControlGrid *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t ratio = {};
		static const char *kwlist[] = { "index", "ratio", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &index, &ratio)) {
			self->ptr.setColumnRatio(index, ratio);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::setColumnRatio(): unknown arguments:\n(uint32_t index, float32_t ratio) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_getColumnRatio(PYControlGrid *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getColumnRatio(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::getColumnRatio(): unknown arguments:\n(uint32_t index) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_getControlsSize(PYControlGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGrid::getControlsSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGrid_get_columns(PYControlGrid *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColumns());
	}
	static PyObject *ControlGrid_get_spacing(PYControlGrid *self, void *offset) {
		return pyVector2f_new(self->ptr.getSpacing());
	}
	static PyObject *ControlGrid_get_controls_size(PYControlGrid *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsSize());
	}
	static PyObject *pyControlGrid_str(PYControlGrid *self) {
		return PyUnicode_FromString(String::format("ControlGrid Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlGrid_bool(PYControlGrid *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlGroup
	static void pyControlGroup_ClickedCallback(ControlGroup a0, PyObject *func) {
		PyObject *a0_ = pyControlGroup_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlGroup_base(PYControlGroup *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlGroup(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlGroup_Type);
	}
	TS_PYAPI ControlGroup &pyControlGroup_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlGroup_Type) return ((PYControlGroup*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlGroup_get(): can't get ControlGroup from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlGroup_get(): can't get ControlGroup from None");
		static ControlGroup ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlGroup_new(const ControlGroup &ptr) {
		PYControlGroup *ret = (PYControlGroup*)PyObject_New(PYControlGroup, &PYControlGroup_Type);
		new(&ret->ptr) ControlGroup(ptr); pyControlGroup_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlGroup_new(ControlGroup &&ptr) {
		PYControlGroup *ret = (PYControlGroup*)PyObject_New(PYControlGroup, &PYControlGroup_Type);
		new(&ret->ptr) ControlGroup(move(ptr)); pyControlGroup_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlGroup_init(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlGroup(((PYControlText*)object)->ptr);
				pyControlGroup_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlGroup(((PYControl*)object)->ptr);
				pyControlGroup_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlGroup();
			pyControlGroup_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			int32_t above = false;
			static const char *kwlist[] = { "parent", "above", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &above)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGroup(parent, (above != 0));
				pyControlGroup_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			int32_t above = false;
			static const char *kwlist[] = { "parent", "text", "above", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os|i", (char**)kwlist, &parent_, &text, &above)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGroup(parent, text, (above != 0));
				pyControlGroup_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			int32_t above = false;
			static const char *kwlist[] = { "parent", "text", "above", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|i", (char**)kwlist, &parent_, &text_, &above)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlGroup(parent, text, (above != 0));
				pyControlGroup_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t columns = {};
			int32_t above = false;
			static const char *kwlist[] = { "parent", "text", "columns", "above", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsI|i", (char**)kwlist, &parent_, &text, &columns, &above)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGroup(parent, text, columns, (above != 0));
				pyControlGroup_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = {};
			int32_t above = false;
			static const char *kwlist[] = { "parent", "text", "columns", "x", "y", "above", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsIff|i", (char**)kwlist, &parent_, &text, &columns, &x, &y, &above)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlGroup(parent, text, columns, x, y, (above != 0));
				pyControlGroup_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::ControlGroup(): unknown arguments:\n(void)\n(Control* parent, bool above)\n(Control* parent, const char* text, bool above)\n(Control* parent, const String text, bool above)\n(Control* parent, const char* text, uint32_t columns, bool above)\n(Control* parent, const char* text, uint32_t columns, float32_t x, float32_t y, bool above)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlGroup_dealloc(PYControlGroup *self) {
		self->ptr.~ControlGroup();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlGroup_equalPtr(PYControlGroup *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlGroup_clonePtr(PYControlGroup *self, PyObject *args) {
		return pyControlGroup_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlGroup_clearPtr(PYControlGroup *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGroup_destroyPtr(PYControlGroup *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGroup_acquirePtr(PYControlGroup *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGroup_unacquirePtr(PYControlGroup *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlGroup_isValidPtr(PYControlGroup *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlGroup_isOwnerPtr(PYControlGroup *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlGroup_isConstPtr(PYControlGroup *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlGroup_getCountPtr(PYControlGroup *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlGroup_getInternalPtr(PYControlGroup *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlGroup_getControlText(PYControlGroup *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlGroup_setAbove(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		int32_t above = {};
		int32_t text = true;
		static const char *kwlist[] = { "above", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &above, &text)) {
			self->ptr.setAbove((above != 0), (text != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setAbove(): unknown arguments:\n(bool above, bool text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_isAbove(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAbove());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::isAbove(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_isBelow(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isBelow());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::isBelow(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setFoldable(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		int32_t foldable = {};
		static const char *kwlist[] = { "foldable", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &foldable)) {
			self->ptr.setFoldable((foldable != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setFoldable(): unknown arguments:\n(bool foldable) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_isFoldable(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isFoldable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::isFoldable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setExpanded(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		int32_t expanded = {};
		static const char *kwlist[] = { "expanded", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &expanded)) {
			self->ptr.setExpanded((expanded != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setExpanded(): unknown arguments:\n(bool expanded) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_isExpanded(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isExpanded());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::isExpanded(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setBackground(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		int32_t background = {};
		static const char *kwlist[] = { "background", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &background)) {
			self->ptr.setBackground((background != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setBackground(): unknown arguments:\n(bool background) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getBackground(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getBackground());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getBackground(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setGroupRadius(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setGroupRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setGroupRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getGroupRadius(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getGroupRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getGroupRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setGroupColor(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setGroupColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setGroupColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getGroupColor(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getGroupColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getGroupColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setStrokeStyle(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getStrokeStyleConst(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getStrokeStyle(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setGradientStyle(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getGradientStyleConst(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getGradientStyle(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setFoldedText(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setFoldedText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setFoldedText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setFoldedText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getFoldedText(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFoldedText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getFoldedText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setExpandedText(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setExpandedText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setExpandedText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setExpandedText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getExpandedText(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getExpandedText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getExpandedText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setColumns(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		uint32_t columns = {};
		static const char *kwlist[] = { "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &columns)) {
			self->ptr.setColumns(columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setColumns(): unknown arguments:\n(uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getColumns(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColumns());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getColumns(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setSpacing(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &x, &y)) {
			self->ptr.setSpacing(x, y);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *spacing_ = nullptr;
			static const char *kwlist[] = { "spacing", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &spacing_)) {
				if(!isPYVector2f(spacing_)) break;
				const Vector2f &spacing = pyVector2f_get(spacing_);
				self->ptr.setSpacing(spacing);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setSpacing(): unknown arguments:\n(float32_t x, float32_t y) -> void\n(const Vector2f spacing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getSpacing(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSpacing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getSpacing(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setColumnRatio(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t ratio = {};
		static const char *kwlist[] = { "index", "ratio", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &index, &ratio)) {
			self->ptr.setColumnRatio(index, ratio);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setColumnRatio(): unknown arguments:\n(uint32_t index, float32_t ratio) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getColumnRatio(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getColumnRatio(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getColumnRatio(): unknown arguments:\n(uint32_t index) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getControlsSize(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getControlsSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_setClickedCallback(PYControlGroup *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlGroup_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::setClickedCallback(): unknown arguments:\n(const ControlGroup.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_isClicked(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_getCanvasRect(PYControlGroup *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasRect_new(self->ptr.getCanvasRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlGroup::getCanvasRect(): unknown arguments:\n(void) -> CanvasRect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlGroup_get_background(PYControlGroup *self, void *offset) {
		return PyLong_FromLong(self->ptr.getBackground());
	}
	static PyObject *ControlGroup_get_group_radius(PYControlGroup *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getGroupRadius());
	}
	static PyObject *ControlGroup_get_group_color(PYControlGroup *self, void *offset) {
		return pyColor_new(self->ptr.getGroupColor());
	}
	static PyObject *ControlGroup_get_stroke_style_const(PYControlGroup *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *ControlGroup_get_stroke_style(PYControlGroup *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *ControlGroup_get_gradient_style_const(PYControlGroup *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *ControlGroup_get_gradient_style(PYControlGroup *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *ControlGroup_get_folded_text(PYControlGroup *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFoldedText().get());
	}
	static PyObject *ControlGroup_get_expanded_text(PYControlGroup *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getExpandedText().get());
	}
	static PyObject *ControlGroup_get_columns(PYControlGroup *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColumns());
	}
	static PyObject *ControlGroup_get_spacing(PYControlGroup *self, void *offset) {
		return pyVector2f_new(self->ptr.getSpacing());
	}
	static PyObject *ControlGroup_get_controls_size(PYControlGroup *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsSize());
	}
	static PyObject *ControlGroup_get_canvas_rect(PYControlGroup *self, void *offset) {
		return pyCanvasRect_new(self->ptr.getCanvasRect());
	}
	static PyObject *pyControlGroup_str(PYControlGroup *self) {
		return PyUnicode_FromString(String::format("ControlGroup Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlGroup_bool(PYControlGroup *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlPanel
	static void pyControlPanel_base(PYControlPanel *self) {
		new(&self->base.ptr) ControlRect(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlPanel(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type);
	}
	TS_PYAPI ControlPanel &pyControlPanel_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYControlPanel_Type || type == &PYControlDialog_Type || type == &PYControlWindow_Type) return ((PYControlPanel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlPanel_get(): can't get ControlPanel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlPanel_get(): can't get ControlPanel from None");
		static ControlPanel ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlPanel_new(const ControlPanel &ptr) {
		PYControlPanel *ret = (PYControlPanel*)PyObject_New(PYControlPanel, &PYControlPanel_Type);
		new(&ret->ptr) ControlPanel(ptr); pyControlPanel_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlPanel_new(ControlPanel &&ptr) {
		PYControlPanel *ret = (PYControlPanel*)PyObject_New(PYControlPanel, &PYControlPanel_Type);
		new(&ret->ptr) ControlPanel(move(ptr)); pyControlPanel_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlPanel_init(PYControlPanel *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlRect(object)) {
				new(&self->ptr) ControlPanel(((PYControlRect*)object)->ptr);
				pyControlPanel_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlPanel(((PYControl*)object)->ptr);
				pyControlPanel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlPanel();
			pyControlPanel_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlPanel(parent);
				pyControlPanel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			static const char *kwlist[] = { "parent", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &parent_, &columns)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlPanel(parent, columns);
				pyControlPanel_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = {};
			static const char *kwlist[] = { "parent", "columns", "x", "y", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIff", (char**)kwlist, &parent_, &columns, &x, &y)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlPanel(parent, columns, x, y);
				pyControlPanel_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::ControlPanel(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, uint32_t columns)\n(Control* parent, uint32_t columns, float32_t x, float32_t y)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlPanel_dealloc(PYControlPanel *self) {
		self->ptr.~ControlPanel();
		self->base.ptr.~ControlRect();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlPanel_equalPtr(PYControlPanel *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlPanel_clonePtr(PYControlPanel *self, PyObject *args) {
		return pyControlPanel_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlPanel_clearPtr(PYControlPanel *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlPanel_destroyPtr(PYControlPanel *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlPanel_acquirePtr(PYControlPanel *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlPanel_unacquirePtr(PYControlPanel *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlPanel_isValidPtr(PYControlPanel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlPanel_isOwnerPtr(PYControlPanel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlPanel_isConstPtr(PYControlPanel *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlPanel_getCountPtr(PYControlPanel *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlPanel_getInternalPtr(PYControlPanel *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlPanel_getControlRect(PYControlPanel *self, PyObject *args) {
		return pyControlRect_new(self->ptr.getControlRect());
	}
	static PyObject *ControlPanel_setColumns(PYControlPanel *self, PyObject *args, PyObject *kwargs) {
		uint32_t columns = {};
		static const char *kwlist[] = { "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &columns)) {
			self->ptr.setColumns(columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::setColumns(): unknown arguments:\n(uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_getColumns(PYControlPanel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColumns());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::getColumns(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_setSpacing(PYControlPanel *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &x, &y)) {
			self->ptr.setSpacing(x, y);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *spacing_ = nullptr;
			static const char *kwlist[] = { "spacing", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &spacing_)) {
				if(!isPYVector2f(spacing_)) break;
				const Vector2f &spacing = pyVector2f_get(spacing_);
				self->ptr.setSpacing(spacing);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::setSpacing(): unknown arguments:\n(float32_t x, float32_t y) -> void\n(const Vector2f spacing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_getSpacing(PYControlPanel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSpacing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::getSpacing(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_setColumnRatio(PYControlPanel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t ratio = {};
		static const char *kwlist[] = { "index", "ratio", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &index, &ratio)) {
			self->ptr.setColumnRatio(index, ratio);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::setColumnRatio(): unknown arguments:\n(uint32_t index, float32_t ratio) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_getColumnRatio(PYControlPanel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getColumnRatio(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::getColumnRatio(): unknown arguments:\n(uint32_t index) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_getControlsSize(PYControlPanel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlPanel::getControlsSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlPanel_get_columns(PYControlPanel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColumns());
	}
	static PyObject *ControlPanel_get_spacing(PYControlPanel *self, void *offset) {
		return pyVector2f_new(self->ptr.getSpacing());
	}
	static PyObject *ControlPanel_get_controls_size(PYControlPanel *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsSize());
	}
	static PyObject *pyControlPanel_str(PYControlPanel *self) {
		return PyUnicode_FromString(String::format("ControlPanel Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlPanel_bool(PYControlPanel *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlDialog
	static void pyControlDialog_UpdatedCallback(ControlDialog a0, PyObject *func) {
		PyObject *a0_ = pyControlDialog_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlDialog_base(PYControlDialog *self) {
		new(&self->base.ptr) ControlPanel(self->ptr);
		new(&self->base.base.ptr) ControlRect(self->ptr);
		new(&self->base.base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlDialog(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		return (type == &PYControlDialog_Type || type == &PYControlWindow_Type);
	}
	TS_PYAPI ControlDialog &pyControlDialog_get(PyObject *object) {
		const PyTypeObject *type = (object) ? Py_TYPE(object) : nullptr;
		if(type == &PYControlDialog_Type || type == &PYControlWindow_Type) return ((PYControlDialog*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlDialog_get(): can't get ControlDialog from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlDialog_get(): can't get ControlDialog from None");
		static ControlDialog ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlDialog_new(const ControlDialog &ptr) {
		PYControlDialog *ret = (PYControlDialog*)PyObject_New(PYControlDialog, &PYControlDialog_Type);
		new(&ret->ptr) ControlDialog(ptr); pyControlDialog_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlDialog_new(ControlDialog &&ptr) {
		PYControlDialog *ret = (PYControlDialog*)PyObject_New(PYControlDialog, &PYControlDialog_Type);
		new(&ret->ptr) ControlDialog(move(ptr)); pyControlDialog_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlDialog_init(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlPanel(object)) {
				new(&self->ptr) ControlDialog(((PYControlPanel*)object)->ptr);
				pyControlDialog_base(self);
				return 0;
			}
			if(isPYControlRect(object)) {
				new(&self->ptr) ControlDialog(((PYControlRect*)object)->ptr);
				pyControlDialog_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlDialog(((PYControl*)object)->ptr);
				pyControlDialog_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlDialog();
			pyControlDialog_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlDialog(parent);
				pyControlDialog_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			static const char *kwlist[] = { "parent", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &parent_, &columns)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlDialog(parent, columns);
				pyControlDialog_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = {};
			static const char *kwlist[] = { "parent", "columns", "x", "y", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIff", (char**)kwlist, &parent_, &columns, &x, &y)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlDialog(parent, columns, x, y);
				pyControlDialog_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::ControlDialog(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, uint32_t columns)\n(Control* parent, uint32_t columns, float32_t x, float32_t y)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlDialog_dealloc(PYControlDialog *self) {
		self->ptr.~ControlDialog();
		self->base.ptr.~ControlPanel();
		self->base.base.ptr.~ControlRect();
		self->base.base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlDialog_equalPtr(PYControlDialog *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlDialog_clonePtr(PYControlDialog *self, PyObject *args) {
		return pyControlDialog_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlDialog_clearPtr(PYControlDialog *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlDialog_destroyPtr(PYControlDialog *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlDialog_acquirePtr(PYControlDialog *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlDialog_unacquirePtr(PYControlDialog *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlDialog_isValidPtr(PYControlDialog *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlDialog_isOwnerPtr(PYControlDialog *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlDialog_isConstPtr(PYControlDialog *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlDialog_getCountPtr(PYControlDialog *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlDialog_getInternalPtr(PYControlDialog *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlDialog_getControlPanel(PYControlDialog *self, PyObject *args) {
		return pyControlPanel_new(self->ptr.getControlPanel());
	}
	static PyObject *ControlDialog_setConstrained(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		int32_t contrained = {};
		static const char *kwlist[] = { "contrained", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &contrained)) {
			self->ptr.setConstrained((contrained != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::setConstrained(): unknown arguments:\n(bool contrained) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_isConstrained(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isConstrained());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::isConstrained(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_setResizable(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		int32_t resizable = {};
		static const char *kwlist[] = { "resizable", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &resizable)) {
			self->ptr.setResizable((resizable != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::setResizable(): unknown arguments:\n(bool resizable) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_isResizable(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isResizable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::isResizable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_setResizeArea(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		float32_t area = {};
		static const char *kwlist[] = { "area", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &area)) {
			self->ptr.setResizeArea(area);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::setResizeArea(): unknown arguments:\n(float32_t area) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_getResizeArea(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getResizeArea());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::getResizeArea(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_getResizeAlign(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getResizeAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::getResizeAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_hasResizeAlign(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasResizeAlign((Control::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::hasResizeAlign(): unknown arguments:\n(Control.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_hasResizeAligns(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasResizeAligns((Control::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::hasResizeAligns(): unknown arguments:\n(Control.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_setMousePosition(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		PyObject *position_ = nullptr;
		static const char *kwlist[] = { "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &position_)) {
			if(!isPYVector2f(position_)) break;
			const Vector2f &position = pyVector2f_get(position_);
			self->ptr.setMousePosition(position);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::setMousePosition(): unknown arguments:\n(const Vector2f position) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_getMousePosition(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getMousePosition());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::getMousePosition(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_setUpdatedCallback(PYControlDialog *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlDialog_UpdatedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setUpdatedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::setUpdatedCallback(): unknown arguments:\n(const ControlDialog.UpdatedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_isUpdated(PYControlDialog *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isUpdated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlDialog::isUpdated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlDialog_get_resize_area(PYControlDialog *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getResizeArea());
	}
	static PyObject *ControlDialog_get_resize_align(PYControlDialog *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getResizeAlign());
	}
	static PyObject *ControlDialog_get_mouse_position(PYControlDialog *self, void *offset) {
		return pyVector2f_new(self->ptr.getMousePosition());
	}
	static PyObject *pyControlDialog_str(PYControlDialog *self) {
		return PyUnicode_FromString(String::format("ControlDialog Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlDialog_bool(PYControlDialog *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlWindow
	static void pyControlWindow_base(PYControlWindow *self) {
		new(&self->base.ptr) ControlDialog(self->ptr);
		new(&self->base.base.ptr) ControlPanel(self->ptr);
		new(&self->base.base.base.ptr) ControlRect(self->ptr);
		new(&self->base.base.base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlWindow(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlWindow_Type);
	}
	TS_PYAPI ControlWindow &pyControlWindow_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlWindow_Type) return ((PYControlWindow*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlWindow_get(): can't get ControlWindow from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlWindow_get(): can't get ControlWindow from None");
		static ControlWindow ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlWindow_new(const ControlWindow &ptr) {
		PYControlWindow *ret = (PYControlWindow*)PyObject_New(PYControlWindow, &PYControlWindow_Type);
		new(&ret->ptr) ControlWindow(ptr); pyControlWindow_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlWindow_new(ControlWindow &&ptr) {
		PYControlWindow *ret = (PYControlWindow*)PyObject_New(PYControlWindow, &PYControlWindow_Type);
		new(&ret->ptr) ControlWindow(move(ptr)); pyControlWindow_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlWindow_init(PYControlWindow *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlDialog(object)) {
				new(&self->ptr) ControlWindow(((PYControlDialog*)object)->ptr);
				pyControlWindow_base(self);
				return 0;
			}
			if(isPYControlPanel(object)) {
				new(&self->ptr) ControlWindow(((PYControlPanel*)object)->ptr);
				pyControlWindow_base(self);
				return 0;
			}
			if(isPYControlRect(object)) {
				new(&self->ptr) ControlWindow(((PYControlRect*)object)->ptr);
				pyControlWindow_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlWindow(((PYControl*)object)->ptr);
				pyControlWindow_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlWindow();
			pyControlWindow_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *root_ = nullptr;
			PyObject *parent_ = nullptr;
			PyObject *window_ = nullptr;
			static const char *kwlist[] = { "root", "parent", "window", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO", (char**)kwlist, &root_, &parent_, &window_)) {
				if(!isPYControlRoot(root_)) break;
				ControlRoot *root = (root_) ? &pyControlRoot_get(root_) : nullptr;
				if(!isPYWindow(parent_)) break;
				Window &parent = pyWindow_get(parent_);
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) ControlWindow(root, parent, window);
				pyControlWindow_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *root_ = nullptr;
			PyObject *parent_ = nullptr;
			PyObject *window_ = nullptr;
			uint32_t columns = {};
			static const char *kwlist[] = { "root", "parent", "window", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI", (char**)kwlist, &root_, &parent_, &window_, &columns)) {
				if(!isPYControlRoot(root_)) break;
				ControlRoot *root = (root_) ? &pyControlRoot_get(root_) : nullptr;
				if(!isPYWindow(parent_)) break;
				Window &parent = pyWindow_get(parent_);
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) ControlWindow(root, parent, window, columns);
				pyControlWindow_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *root_ = nullptr;
			PyObject *parent_ = nullptr;
			PyObject *window_ = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = {};
			static const char *kwlist[] = { "root", "parent", "window", "columns", "x", "y", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOIff", (char**)kwlist, &root_, &parent_, &window_, &columns, &x, &y)) {
				if(!isPYControlRoot(root_)) break;
				ControlRoot *root = (root_) ? &pyControlRoot_get(root_) : nullptr;
				if(!isPYWindow(parent_)) break;
				Window &parent = pyWindow_get(parent_);
				if(!isPYWindow(window_)) break;
				Window &window = pyWindow_get(window_);
				new(&self->ptr) ControlWindow(root, parent, window, columns, x, y);
				pyControlWindow_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlWindow::ControlWindow(): unknown arguments:\n(void)\n(ControlRoot* root, Window parent, Window window)\n(ControlRoot* root, Window parent, Window window, uint32_t columns)\n(ControlRoot* root, Window parent, Window window, uint32_t columns, float32_t x, float32_t y)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlWindow_dealloc(PYControlWindow *self) {
		self->ptr.~ControlWindow();
		self->base.ptr.~ControlDialog();
		self->base.base.ptr.~ControlPanel();
		self->base.base.base.ptr.~ControlRect();
		self->base.base.base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlWindow_equalPtr(PYControlWindow *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlWindow_clonePtr(PYControlWindow *self, PyObject *args) {
		return pyControlWindow_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlWindow_clearPtr(PYControlWindow *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlWindow_destroyPtr(PYControlWindow *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlWindow_acquirePtr(PYControlWindow *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlWindow_unacquirePtr(PYControlWindow *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlWindow_isValidPtr(PYControlWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlWindow_isOwnerPtr(PYControlWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlWindow_isConstPtr(PYControlWindow *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlWindow_getCountPtr(PYControlWindow *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlWindow_getInternalPtr(PYControlWindow *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlWindow_getControlDialog(PYControlWindow *self, PyObject *args) {
		return pyControlDialog_new(self->ptr.getControlDialog());
	}
	static PyObject *ControlWindow_getParentWindow(PYControlWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyWindow_new(self->ptr.getParentWindow());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlWindow::getParentWindow(): unknown arguments:\n(void) -> Window\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlWindow_getDialogWindow(PYControlWindow *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyWindow_new(self->ptr.getDialogWindow());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlWindow::getDialogWindow(): unknown arguments:\n(void) -> Window\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlWindow_get_parent_window(PYControlWindow *self, void *offset) {
		return pyWindow_new(self->ptr.getParentWindow());
	}
	static PyObject *ControlWindow_get_dialog_window(PYControlWindow *self, void *offset) {
		return pyWindow_new(self->ptr.getDialogWindow());
	}
	static PyObject *pyControlWindow_str(PYControlWindow *self) {
		return PyUnicode_FromString(String::format("ControlWindow Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlWindow_bool(PYControlWindow *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlCheck
	static void pyControlCheck_ClickedCallback(ControlCheck a0, PyObject *func) {
		PyObject *a0_ = pyControlCheck_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlCheck_base(PYControlCheck *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlCheck(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlCheck_Type);
	}
	TS_PYAPI ControlCheck &pyControlCheck_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlCheck_Type) return ((PYControlCheck*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlCheck_get(): can't get ControlCheck from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlCheck_get(): can't get ControlCheck from None");
		static ControlCheck ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlCheck_new(const ControlCheck &ptr) {
		PYControlCheck *ret = (PYControlCheck*)PyObject_New(PYControlCheck, &PYControlCheck_Type);
		new(&ret->ptr) ControlCheck(ptr); pyControlCheck_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlCheck_new(ControlCheck &&ptr) {
		PYControlCheck *ret = (PYControlCheck*)PyObject_New(PYControlCheck, &PYControlCheck_Type);
		new(&ret->ptr) ControlCheck(move(ptr)); pyControlCheck_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlCheck_init(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlCheck(((PYControlText*)object)->ptr);
				pyControlCheck_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlCheck(((PYControl*)object)->ptr);
				pyControlCheck_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlCheck();
			pyControlCheck_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlCheck(parent);
				pyControlCheck_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &text)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlCheck(parent, text);
				pyControlCheck_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &text_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlCheck(parent, text);
				pyControlCheck_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			int32_t checked = {};
			static const char *kwlist[] = { "parent", "text", "checked", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Osi", (char**)kwlist, &parent_, &text, &checked)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlCheck(parent, text, (checked != 0));
				pyControlCheck_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			int32_t checked = {};
			static const char *kwlist[] = { "parent", "text", "checked", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOi", (char**)kwlist, &parent_, &text_, &checked)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlCheck(parent, text, (checked != 0));
				pyControlCheck_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::ControlCheck(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, const char* text)\n(Control* parent, const String text)\n(Control* parent, const char* text, bool checked)\n(Control* parent, const String text, bool checked)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlCheck_dealloc(PYControlCheck *self) {
		self->ptr.~ControlCheck();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlCheck_equalPtr(PYControlCheck *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlCheck_clonePtr(PYControlCheck *self, PyObject *args) {
		return pyControlCheck_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlCheck_clearPtr(PYControlCheck *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCheck_destroyPtr(PYControlCheck *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCheck_acquirePtr(PYControlCheck *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCheck_unacquirePtr(PYControlCheck *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCheck_isValidPtr(PYControlCheck *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlCheck_isOwnerPtr(PYControlCheck *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlCheck_isConstPtr(PYControlCheck *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlCheck_getCountPtr(PYControlCheck *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlCheck_getInternalPtr(PYControlCheck *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlCheck_getControlText(PYControlCheck *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlCheck_setCheckText(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setCheckText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setCheckText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::setCheckText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_getCheckText(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getCheckText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::getCheckText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_setCheckColor(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setCheckColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::setCheckColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_getCheckColor(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getCheckColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::getCheckColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_setCheckedColor(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setCheckedColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::setCheckedColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_getCheckedColor(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getCheckedColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::getCheckedColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_switchChecked(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		int32_t callback = false;
		static const char *kwlist[] = { "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &callback)) {
			return PyLong_FromLong(self->ptr.switchChecked((callback != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::switchChecked(): unknown arguments:\n(bool callback) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_setChecked(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		int32_t checked = {};
		int32_t callback = false;
		static const char *kwlist[] = { "checked", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &checked, &callback)) {
			self->ptr.setChecked((checked != 0), (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::setChecked(): unknown arguments:\n(bool checked, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_isChecked(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isChecked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::isChecked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_setClickedCallback(PYControlCheck *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlCheck_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::setClickedCallback(): unknown arguments:\n(const ControlCheck.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_isClicked(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_getCanvasMesh(PYControlCheck *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCheck::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCheck_get_check_text(PYControlCheck *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getCheckText().get());
	}
	static PyObject *ControlCheck_get_check_color(PYControlCheck *self, void *offset) {
		return pyColor_new(self->ptr.getCheckColor());
	}
	static PyObject *ControlCheck_get_checked_color(PYControlCheck *self, void *offset) {
		return pyColor_new(self->ptr.getCheckedColor());
	}
	static PyObject *ControlCheck_get_canvas_mesh(PYControlCheck *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlCheck_str(PYControlCheck *self) {
		return PyUnicode_FromString(String::format("ControlCheck Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlCheck_bool(PYControlCheck *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlCombo
	static void pyControlCombo_ClickedCallback(ControlCombo a0, PyObject *func) {
		PyObject *a0_ = pyControlCombo_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlCombo_ChangedCallback(ControlCombo a0, PyObject *func) {
		PyObject *a0_ = pyControlCombo_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlCombo_base(PYControlCombo *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlCombo(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlCombo_Type);
	}
	TS_PYAPI ControlCombo &pyControlCombo_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlCombo_Type) return ((PYControlCombo*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlCombo_get(): can't get ControlCombo from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlCombo_get(): can't get ControlCombo from None");
		static ControlCombo ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlCombo_new(const ControlCombo &ptr) {
		PYControlCombo *ret = (PYControlCombo*)PyObject_New(PYControlCombo, &PYControlCombo_Type);
		new(&ret->ptr) ControlCombo(ptr); pyControlCombo_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlCombo_new(ControlCombo &&ptr) {
		PYControlCombo *ret = (PYControlCombo*)PyObject_New(PYControlCombo, &PYControlCombo_Type);
		new(&ret->ptr) ControlCombo(move(ptr)); pyControlCombo_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlCombo_init(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlCombo(((PYControlText*)object)->ptr);
				pyControlCombo_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlCombo(((PYControl*)object)->ptr);
				pyControlCombo_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlCombo();
			pyControlCombo_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlCombo(parent);
				pyControlCombo_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::ControlCombo(): unknown arguments:\n(void)\n(Control* parent)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlCombo_dealloc(PYControlCombo *self) {
		self->ptr.~ControlCombo();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlCombo_equalPtr(PYControlCombo *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlCombo_clonePtr(PYControlCombo *self, PyObject *args) {
		return pyControlCombo_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlCombo_clearPtr(PYControlCombo *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCombo_destroyPtr(PYControlCombo *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCombo_acquirePtr(PYControlCombo *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCombo_unacquirePtr(PYControlCombo *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlCombo_isValidPtr(PYControlCombo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlCombo_isOwnerPtr(PYControlCombo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlCombo_isConstPtr(PYControlCombo *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlCombo_getCountPtr(PYControlCombo *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlCombo_getInternalPtr(PYControlCombo *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlCombo_getControlText(PYControlCombo *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlCombo_setMultiSelection(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		int32_t multi_selection = {};
		static const char *kwlist[] = { "multi_selection", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &multi_selection)) {
			self->ptr.setMultiSelection((multi_selection != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setMultiSelection(): unknown arguments:\n(bool multi_selection) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_isMultiSelection(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMultiSelection());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::isMultiSelection(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setComboText(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setComboText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setComboText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setComboText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getComboText(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getComboText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getComboText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setComboColor(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setComboColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setComboColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getComboColor(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getComboColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getComboColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setItemsSpacing(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		float32_t spacing = {};
		static const char *kwlist[] = { "spacing", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &spacing)) {
			self->ptr.setItemsSpacing(spacing);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setItemsSpacing(): unknown arguments:\n(float32_t spacing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getItemsSpacing(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getItemsSpacing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getItemsSpacing(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_clearItems(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearItems();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::clearItems(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_addItem(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const char *text = nullptr;
		static const char *kwlist[] = { "index", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &index, &text)) {
			self->ptr.addItem(index, text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "index", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.addItem(index, text);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
				return PyLong_FromUnsignedLong(self->ptr.addItem(text));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.addItem(text));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::addItem(): unknown arguments:\n(uint32_t index, const char* text) -> void\n(uint32_t index, const String text) -> void\n(const char* text) -> uint32_t\n(const String text) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_removeItem(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			self->ptr.removeItem(index);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::removeItem(): unknown arguments:\n(uint32_t index) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getNumItems(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumItems());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getNumItems(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_switchItemSelected(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.switchItemSelected(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::switchItemSelected(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setItemSelected(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t selected = {};
		static const char *kwlist[] = { "index", "selected", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &index, &selected)) {
			self->ptr.setItemSelected(index, (selected != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setItemSelected(): unknown arguments:\n(uint32_t index, bool selected) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_isItemSelected(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isItemSelected(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::isItemSelected(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setItemText(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const char *text = nullptr;
		static const char *kwlist[] = { "index", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &index, &text)) {
			self->ptr.setItemText(index, text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "index", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setItemText(index, text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setItemText(): unknown arguments:\n(uint32_t index, const char* text) -> void\n(uint32_t index, const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getItemText(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getItemText(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getItemText(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_findItemText(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			return PyLong_FromUnsignedLong(self->ptr.findItemText(text));
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.findItemText(text));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::findItemText(): unknown arguments:\n(const char* text) -> uint32_t\n(const String text) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setItemColor(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "index", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setItemColor(index, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setItemColor(): unknown arguments:\n(uint32_t index, const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getItemColor(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyColor_new(self->ptr.getItemColor(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getItemColor(): unknown arguments:\n(uint32_t index) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setCurrentIndex(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t callback = false;
		static const char *kwlist[] = { "index", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &index, &callback)) {
			self->ptr.setCurrentIndex(index, (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setCurrentIndex(): unknown arguments:\n(uint32_t index, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setCurrentText(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		int32_t callback = false;
		static const char *kwlist[] = { "text", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &text, &callback)) {
			self->ptr.setCurrentText(text, (callback != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			int32_t callback = false;
			static const char *kwlist[] = { "text", "callback", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &text_, &callback)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setCurrentText(text, (callback != 0));
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setCurrentText(): unknown arguments:\n(const char* text, bool callback) -> void\n(const String text, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getCurrentIndex(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCurrentIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getCurrentIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getCurrentText(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getCurrentText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getCurrentText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setClickedCallback(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlCombo_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setClickedCallback(): unknown arguments:\n(const ControlCombo.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_isClicked(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_setChangedCallback(PYControlCombo *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlCombo_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::setChangedCallback(): unknown arguments:\n(const ControlCombo.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_isChanged(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isChanged());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::isChanged(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_getCanvasMesh(PYControlCombo *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlCombo::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlCombo_get_combo_text(PYControlCombo *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getComboText().get());
	}
	static PyObject *ControlCombo_get_combo_color(PYControlCombo *self, void *offset) {
		return pyColor_new(self->ptr.getComboColor());
	}
	static PyObject *ControlCombo_get_items_spacing(PYControlCombo *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getItemsSpacing());
	}
	static PyObject *ControlCombo_get_num_items(PYControlCombo *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumItems());
	}
	static PyObject *ControlCombo_get_current_index(PYControlCombo *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCurrentIndex());
	}
	static PyObject *ControlCombo_get_current_text(PYControlCombo *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getCurrentText().get());
	}
	static PyObject *ControlCombo_get_canvas_mesh(PYControlCombo *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlCombo_str(PYControlCombo *self) {
		return PyUnicode_FromString(String::format("ControlCombo Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlCombo_bool(PYControlCombo *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlButton
	static void pyControlButton_PressedCallback(ControlButton a0, float32_t x, float32_t y, PyObject *func) {
		PyObject *a0_ = pyControlButton_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(Off)", a0_, x, y);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlButton_ReleasedCallback(ControlButton a0, float32_t x, float32_t y, PyObject *func) {
		PyObject *a0_ = pyControlButton_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(Off)", a0_, x, y);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlButton_ClickedCallback(ControlButton a0, PyObject *func) {
		PyObject *a0_ = pyControlButton_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlButton_base(PYControlButton *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlButton(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlButton_Type);
	}
	TS_PYAPI ControlButton &pyControlButton_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlButton_Type) return ((PYControlButton*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlButton_get(): can't get ControlButton from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlButton_get(): can't get ControlButton from None");
		static ControlButton ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlButton_new(const ControlButton &ptr) {
		PYControlButton *ret = (PYControlButton*)PyObject_New(PYControlButton, &PYControlButton_Type);
		new(&ret->ptr) ControlButton(ptr); pyControlButton_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlButton_new(ControlButton &&ptr) {
		PYControlButton *ret = (PYControlButton*)PyObject_New(PYControlButton, &PYControlButton_Type);
		new(&ret->ptr) ControlButton(move(ptr)); pyControlButton_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlButton_init(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlButton(((PYControlText*)object)->ptr);
				pyControlButton_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlButton(((PYControl*)object)->ptr);
				pyControlButton_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlButton();
			pyControlButton_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlButton(parent);
				pyControlButton_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &text)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlButton(parent, text);
				pyControlButton_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &text_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlButton(parent, text);
				pyControlButton_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::ControlButton(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, const char* text)\n(Control* parent, const String text)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlButton_dealloc(PYControlButton *self) {
		self->ptr.~ControlButton();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlButton_equalPtr(PYControlButton *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlButton_clonePtr(PYControlButton *self, PyObject *args) {
		return pyControlButton_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlButton_clearPtr(PYControlButton *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlButton_destroyPtr(PYControlButton *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlButton_acquirePtr(PYControlButton *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlButton_unacquirePtr(PYControlButton *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlButton_isValidPtr(PYControlButton *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlButton_isOwnerPtr(PYControlButton *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlButton_isConstPtr(PYControlButton *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlButton_getCountPtr(PYControlButton *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlButton_getInternalPtr(PYControlButton *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlButton_getControlText(PYControlButton *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlButton_setBackground(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		int32_t background = {};
		static const char *kwlist[] = { "background", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &background)) {
			self->ptr.setBackground((background != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setBackground(): unknown arguments:\n(bool background) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getBackground(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getBackground());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getBackground(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setButtonMode(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setButtonMode((CanvasElement::Mode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setButtonMode(): unknown arguments:\n(CanvasElement.Mode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getButtonMode(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getButtonMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getButtonMode(): unknown arguments:\n(void) -> CanvasElement::Mode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setButtonRadius(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		float32_t radius = {};
		static const char *kwlist[] = { "radius", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &radius)) {
			self->ptr.setButtonRadius(radius);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setButtonRadius(): unknown arguments:\n(float32_t radius) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getButtonRadius(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getButtonRadius());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getButtonRadius(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setButtonColor(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setButtonColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setButtonColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getButtonColor(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getButtonColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getButtonColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setStrokeStyle(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYStrokeStyle(style_)) break;
			const StrokeStyle &style = pyStrokeStyle_get(style_);
			self->ptr.setStrokeStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setStrokeStyle(): unknown arguments:\n(const StrokeStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getStrokeStyleConst(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getStrokeStyleConst(): unknown arguments:\n(void) -> const StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getStrokeStyle(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyStrokeStyle_new(self->ptr.getStrokeStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getStrokeStyle(): unknown arguments:\n(void) -> const StrokeStyle\n(void) -> StrokeStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setGradientStyle(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYGradientStyle(style_)) break;
			const GradientStyle &style = pyGradientStyle_get(style_);
			self->ptr.setGradientStyle(style);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setGradientStyle(): unknown arguments:\n(const GradientStyle style) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getGradientStyleConst(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getGradientStyleConst(): unknown arguments:\n(void) -> const GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getGradientStyle(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyGradientStyle_new(self->ptr.getGradientStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getGradientStyle(): unknown arguments:\n(void) -> const GradientStyle\n(void) -> GradientStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setPressedCallback(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlButton_PressedCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setPressedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setPressedCallback(): unknown arguments:\n(const ControlButton.PressedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_isPressed(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isPressed());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::isPressed(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setReleasedCallback(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlButton_ReleasedCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setReleasedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setReleasedCallback(): unknown arguments:\n(const ControlButton.ReleasedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_isReleased(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isReleased());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::isReleased(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_setClickedCallback(PYControlButton *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlButton_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::setClickedCallback(): unknown arguments:\n(const ControlButton.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_isClicked(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getCanvasRect(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasRect_new(self->ptr.getCanvasRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getCanvasRect(): unknown arguments:\n(void) -> CanvasRect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_getCanvasMesh(PYControlButton *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlButton::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlButton_get_background(PYControlButton *self, void *offset) {
		return PyLong_FromLong(self->ptr.getBackground());
	}
	static PyObject *ControlButton_get_button_mode(PYControlButton *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getButtonMode());
	}
	static PyObject *ControlButton_get_button_radius(PYControlButton *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getButtonRadius());
	}
	static PyObject *ControlButton_get_button_color(PYControlButton *self, void *offset) {
		return pyColor_new(self->ptr.getButtonColor());
	}
	static PyObject *ControlButton_get_stroke_style_const(PYControlButton *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyleConst());
	}
	static PyObject *ControlButton_get_stroke_style(PYControlButton *self, void *offset) {
		return pyStrokeStyle_new(self->ptr.getStrokeStyle());
	}
	static PyObject *ControlButton_get_gradient_style_const(PYControlButton *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyleConst());
	}
	static PyObject *ControlButton_get_gradient_style(PYControlButton *self, void *offset) {
		return pyGradientStyle_new(self->ptr.getGradientStyle());
	}
	static PyObject *ControlButton_get_canvas_rect(PYControlButton *self, void *offset) {
		return pyCanvasRect_new(self->ptr.getCanvasRect());
	}
	static PyObject *ControlButton_get_canvas_mesh(PYControlButton *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlButton_str(PYControlButton *self) {
		return PyUnicode_FromString(String::format("ControlButton Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlButton_bool(PYControlButton *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlSlider
	static String pyControlSlider_FormatCallback(ControlSlider a0, PyObject *func) {
		String ret = {};
		PyObject *a0_ = pyControlSlider_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
		return ret;
	}
	static void pyControlSlider_ReleasedCallback(ControlSlider a0, PyObject *func) {
		PyObject *a0_ = pyControlSlider_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlSlider_ClickedCallback(ControlSlider a0, PyObject *func) {
		PyObject *a0_ = pyControlSlider_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlSlider_ChangedCallback(ControlSlider a0, PyObject *func) {
		PyObject *a0_ = pyControlSlider_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlSlider_base(PYControlSlider *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlSlider(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlSlider_Type);
	}
	TS_PYAPI ControlSlider &pyControlSlider_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlSlider_Type) return ((PYControlSlider*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlSlider_get(): can't get ControlSlider from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlSlider_get(): can't get ControlSlider from None");
		static ControlSlider ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlSlider_new(const ControlSlider &ptr) {
		PYControlSlider *ret = (PYControlSlider*)PyObject_New(PYControlSlider, &PYControlSlider_Type);
		new(&ret->ptr) ControlSlider(ptr); pyControlSlider_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlSlider_new(ControlSlider &&ptr) {
		PYControlSlider *ret = (PYControlSlider*)PyObject_New(PYControlSlider, &PYControlSlider_Type);
		new(&ret->ptr) ControlSlider(move(ptr)); pyControlSlider_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlSlider_init(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlSlider(((PYControlText*)object)->ptr);
				pyControlSlider_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlSlider(((PYControl*)object)->ptr);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlSlider();
			pyControlSlider_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &text)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &text_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlSlider(parent, text);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t digits = {};
			static const char *kwlist[] = { "parent", "text", "digits", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsI", (char**)kwlist, &parent_, &text, &digits)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, digits);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t digits = {};
			float64_t value = {};
			static const char *kwlist[] = { "parent", "text", "digits", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsId", (char**)kwlist, &parent_, &text, &digits, &value)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, digits, value);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t digits = {};
			float64_t value = {};
			float64_t min = {};
			float64_t max = {};
			static const char *kwlist[] = { "parent", "text", "digits", "value", "min", "max", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsIddd", (char**)kwlist, &parent_, &text, &digits, &value, &min, &max)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, digits, value, min, max);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			float64_t value = {};
			float64_t min = {};
			float64_t max = {};
			static const char *kwlist[] = { "parent", "text", "value", "min", "max", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Osddd", (char**)kwlist, &parent_, &text, &value, &min, &max)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, value, min, max);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			uint32_t value = {};
			uint32_t min = {};
			uint32_t max = {};
			static const char *kwlist[] = { "parent", "text", "value", "min", "max", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OsIII", (char**)kwlist, &parent_, &text, &value, &min, &max)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, value, min, max);
				pyControlSlider_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			int32_t value = {};
			int32_t min = {};
			int32_t max = {};
			static const char *kwlist[] = { "parent", "text", "value", "min", "max", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Osiii", (char**)kwlist, &parent_, &text, &value, &min, &max)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSlider(parent, text, value, min, max);
				pyControlSlider_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::ControlSlider(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, const char* text)\n(Control* parent, const String text)\n(Control* parent, const char* text, uint32_t digits)\n(Control* parent, const char* text, uint32_t digits, float64_t value)\n(Control* parent, const char* text, uint32_t digits, float64_t value, float64_t min, float64_t max)\n(Control* parent, const char* text, float64_t value, float64_t min, float64_t max)\n(Control* parent, const char* text, uint32_t value, uint32_t min, uint32_t max)\n(Control* parent, const char* text, int32_t value, int32_t min, int32_t max)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlSlider_dealloc(PYControlSlider *self) {
		self->ptr.~ControlSlider();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlSlider_equalPtr(PYControlSlider *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlSlider_clonePtr(PYControlSlider *self, PyObject *args) {
		return pyControlSlider_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlSlider_clearPtr(PYControlSlider *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSlider_destroyPtr(PYControlSlider *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSlider_acquirePtr(PYControlSlider *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSlider_unacquirePtr(PYControlSlider *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSlider_isValidPtr(PYControlSlider *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlSlider_isOwnerPtr(PYControlSlider *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlSlider_isConstPtr(PYControlSlider *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlSlider_getCountPtr(PYControlSlider *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlSlider_getInternalPtr(PYControlSlider *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlSlider_getControlText(PYControlSlider *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlSlider_setSliderColor(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setSliderColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setSliderColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getSliderColor(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getSliderColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getSliderColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setDigits(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		uint32_t digits = {};
		static const char *kwlist[] = { "digits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &digits)) {
			self->ptr.setDigits(digits);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setDigits(): unknown arguments:\n(uint32_t digits) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getDigits(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDigits());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getDigits(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setTextEnabled(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		static const char *kwlist[] = { "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &enabled)) {
			self->ptr.setTextEnabled((enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setTextEnabled(): unknown arguments:\n(bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_isTextEnabled(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isTextEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::isTextEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setStep(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		float64_t step = {};
		static const char *kwlist[] = { "step", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &step)) {
			self->ptr.setStep(step);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setStep(): unknown arguments:\n(float64_t step) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getStep(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getStep());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getStep(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setBase(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		float64_t base = {};
		static const char *kwlist[] = { "base", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &base)) {
			self->ptr.setBase(base);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setBase(): unknown arguments:\n(float64_t base) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getBase(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getBase());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getBase(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setFormat(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		const char *format = nullptr;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &format)) {
			self->ptr.setFormat(format);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *format_ = nullptr;
			static const char *kwlist[] = { "format", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &format_)) {
				if(!isPYString(format_)) break;
				const String &format = (format_) ? ((PyUnicode_Check(format_)) ? String(PyUnicode_AsUTF8(format_)) : (String)pyString_get(format_)) : String::null;
				self->ptr.setFormat(format);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setFormat(): unknown arguments:\n(const char* format) -> void\n(const String format) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getFormat(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFormat().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getFormat(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setValue(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		float64_t value = {};
		int32_t callback = false;
		int32_t exponent = false;
		static const char *kwlist[] = { "value", "callback", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|ii", (char**)kwlist, &value, &callback, &exponent)) {
			self->ptr.setValue(value, (callback != 0), (exponent != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setValue(): unknown arguments:\n(float64_t value, bool callback, bool exponent) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getValue(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyFloat_FromDouble(self->ptr.getValue((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getValue(): unknown arguments:\n(bool exponent) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getValuef32(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyFloat_FromDouble(self->ptr.getValuef32((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getValuef32(): unknown arguments:\n(bool exponent) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getValueu32(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyLong_FromUnsignedLong(self->ptr.getValueu32((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getValueu32(): unknown arguments:\n(bool exponent) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getValuei32(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyLong_FromLong(self->ptr.getValuei32((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getValuei32(): unknown arguments:\n(bool exponent) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setRange(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		float64_t min = {};
		float64_t max = {};
		int32_t exponent = false;
		static const char *kwlist[] = { "min", "max", "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dd|i", (char**)kwlist, &min, &max, &exponent)) {
			self->ptr.setRange(min, max, (exponent != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setRange(): unknown arguments:\n(float64_t min, float64_t max, bool exponent) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getMinRange(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyFloat_FromDouble(self->ptr.getMinRange((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getMinRange(): unknown arguments:\n(bool exponent) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getMaxRange(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t exponent = false;
		static const char *kwlist[] = { "exponent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &exponent)) {
			return PyFloat_FromDouble(self->ptr.getMaxRange((exponent != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getMaxRange(): unknown arguments:\n(bool exponent) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setHandleSize(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		float32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &size)) {
			self->ptr.setHandleSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setHandleSize(): unknown arguments:\n(float32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getHandleSize(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHandleSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getHandleSize(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setFormatCallback(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlSlider_FormatCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setFormatCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setFormatCallback(): unknown arguments:\n(const ControlSlider.FormatCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setReleasedCallback(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlSlider_ReleasedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setReleasedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setReleasedCallback(): unknown arguments:\n(const ControlSlider.ReleasedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_isReleased(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isReleased());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::isReleased(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setClickedCallback(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlSlider_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setClickedCallback(): unknown arguments:\n(const ControlSlider.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_isClicked(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_setChangedCallback(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlSlider_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::setChangedCallback(): unknown arguments:\n(const ControlSlider.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_isChanged(PYControlSlider *self, PyObject *args, PyObject *kwargs) {
		int32_t clear = true;
		static const char *kwlist[] = { "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &clear)) {
			return PyLong_FromLong(self->ptr.isChanged((clear != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::isChanged(): unknown arguments:\n(bool clear) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_getCanvasMesh(PYControlSlider *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSlider::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSlider_get_slider_color(PYControlSlider *self, void *offset) {
		return pyColor_new(self->ptr.getSliderColor());
	}
	static PyObject *ControlSlider_get_digits(PYControlSlider *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDigits());
	}
	static PyObject *ControlSlider_get_step(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getStep());
	}
	static PyObject *ControlSlider_get_base(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getBase());
	}
	static PyObject *ControlSlider_get_format(PYControlSlider *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFormat().get());
	}
	static PyObject *ControlSlider_get_value(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getValue());
	}
	static PyObject *ControlSlider_get_valuef32(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getValuef32());
	}
	static PyObject *ControlSlider_get_valueu32(PYControlSlider *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getValueu32());
	}
	static PyObject *ControlSlider_get_valuei32(PYControlSlider *self, void *offset) {
		return PyLong_FromLong(self->ptr.getValuei32());
	}
	static PyObject *ControlSlider_get_min_range(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMinRange());
	}
	static PyObject *ControlSlider_get_max_range(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMaxRange());
	}
	static PyObject *ControlSlider_get_handle_size(PYControlSlider *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHandleSize());
	}
	static PyObject *ControlSlider_get_canvas_mesh(PYControlSlider *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlSlider_str(PYControlSlider *self) {
		return PyUnicode_FromString(String::format("ControlSlider Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlSlider_bool(PYControlSlider *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlScroll
	static void pyControlScroll_ClickedCallback(ControlScroll a0, PyObject *func) {
		PyObject *a0_ = pyControlScroll_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlScroll_ChangedCallback(ControlScroll a0, PyObject *func) {
		PyObject *a0_ = pyControlScroll_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlScroll_base(PYControlScroll *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlScroll(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlScroll_Type);
	}
	TS_PYAPI ControlScroll &pyControlScroll_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlScroll_Type) return ((PYControlScroll*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlScroll_get(): can't get ControlScroll from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlScroll_get(): can't get ControlScroll from None");
		static ControlScroll ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlScroll_new(const ControlScroll &ptr) {
		PYControlScroll *ret = (PYControlScroll*)PyObject_New(PYControlScroll, &PYControlScroll_Type);
		new(&ret->ptr) ControlScroll(ptr); pyControlScroll_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlScroll_new(ControlScroll &&ptr) {
		PYControlScroll *ret = (PYControlScroll*)PyObject_New(PYControlScroll, &PYControlScroll_Type);
		new(&ret->ptr) ControlScroll(move(ptr)); pyControlScroll_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlScroll_init(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlScroll(((PYControlText*)object)->ptr);
				pyControlScroll_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlScroll(((PYControl*)object)->ptr);
				pyControlScroll_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlScroll();
			pyControlScroll_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlScroll(parent, (vertical != 0));
				pyControlScroll_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			float64_t value = {};
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "value", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Od|i", (char**)kwlist, &parent_, &value, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlScroll(parent, value, (vertical != 0));
				pyControlScroll_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			float64_t value = {};
			float64_t frame = {};
			float64_t range = {};
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "value", "frame", "range", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oddd|i", (char**)kwlist, &parent_, &value, &frame, &range, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlScroll(parent, value, frame, range, (vertical != 0));
				pyControlScroll_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t value = {};
			uint32_t frame = {};
			uint32_t range = {};
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "value", "frame", "range", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIII|i", (char**)kwlist, &parent_, &value, &frame, &range, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlScroll(parent, value, frame, range, (vertical != 0));
				pyControlScroll_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			int32_t value = {};
			int32_t frame = {};
			int32_t range = {};
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "value", "frame", "range", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oiii|i", (char**)kwlist, &parent_, &value, &frame, &range, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlScroll(parent, value, frame, range, (vertical != 0));
				pyControlScroll_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::ControlScroll(): unknown arguments:\n(void)\n(Control* parent, bool vertical)\n(Control* parent, float64_t value, bool vertical)\n(Control* parent, float64_t value, float64_t frame, float64_t range, bool vertical)\n(Control* parent, uint32_t value, uint32_t frame, uint32_t range, bool vertical)\n(Control* parent, int32_t value, int32_t frame, int32_t range, bool vertical)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlScroll_dealloc(PYControlScroll *self) {
		self->ptr.~ControlScroll();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlScroll_equalPtr(PYControlScroll *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlScroll_clonePtr(PYControlScroll *self, PyObject *args) {
		return pyControlScroll_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlScroll_clearPtr(PYControlScroll *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlScroll_destroyPtr(PYControlScroll *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlScroll_acquirePtr(PYControlScroll *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlScroll_unacquirePtr(PYControlScroll *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlScroll_isValidPtr(PYControlScroll *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlScroll_isOwnerPtr(PYControlScroll *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlScroll_isConstPtr(PYControlScroll *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlScroll_getCountPtr(PYControlScroll *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlScroll_getInternalPtr(PYControlScroll *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlScroll_getControlText(PYControlScroll *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlScroll_setVertical(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		int32_t vertical = {};
		int32_t text = true;
		static const char *kwlist[] = { "vertical", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &vertical, &text)) {
			self->ptr.setVertical((vertical != 0), (text != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setVertical(): unknown arguments:\n(bool vertical, bool text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_isHorizontal(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHorizontal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::isHorizontal(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_isVertical(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVertical());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::isVertical(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setPrevText(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setPrevText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setPrevText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setPrevText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getPrevText(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getPrevText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getPrevText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setNextText(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setNextText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setNextText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setNextText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getNextText(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getNextText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getNextText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setScrollColor(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setScrollColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setScrollColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getScrollColor(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getScrollColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getScrollColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setStep(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		float64_t step = {};
		static const char *kwlist[] = { "step", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &step)) {
			self->ptr.setStep(step);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setStep(): unknown arguments:\n(float64_t step) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getStep(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getStep());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getStep(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setValue(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		float64_t value = {};
		int32_t callback = false;
		static const char *kwlist[] = { "value", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d|i", (char**)kwlist, &value, &callback)) {
			self->ptr.setValue(value, (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setValue(): unknown arguments:\n(float64_t value, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getValue(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getValue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getValue(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setFrame(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		float64_t frame = {};
		static const char *kwlist[] = { "frame", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &frame)) {
			self->ptr.setFrame(frame);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setFrame(): unknown arguments:\n(float64_t frame) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getFrame(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getFrame());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getFrame(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setRange(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		float64_t range = {};
		static const char *kwlist[] = { "range", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &range)) {
			self->ptr.setRange(range);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setRange(): unknown arguments:\n(float64_t range) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getRange(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getRange());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getRange(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setFrameAlign(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			self->ptr.setFrameAlign((Control::Align)align);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setFrameAlign(): unknown arguments:\n(Control.Align align) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getFrameAlign(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFrameAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getFrameAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_hasFrameAlign(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			return PyLong_FromLong(self->ptr.hasFrameAlign((Control::Align)align));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::hasFrameAlign(): unknown arguments:\n(Control.Align align) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_hasFrameAligns(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		uint32_t aligns = 0;
		static const char *kwlist[] = { "aligns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &aligns)) {
			return PyLong_FromLong(self->ptr.hasFrameAligns((Control::Align)aligns));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::hasFrameAligns(): unknown arguments:\n(Control.Align aligns) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setClickedCallback(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlScroll_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setClickedCallback(): unknown arguments:\n(const ControlScroll.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_isClicked(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_setChangedCallback(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlScroll_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::setChangedCallback(): unknown arguments:\n(const ControlScroll.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_isChanged(PYControlScroll *self, PyObject *args, PyObject *kwargs) {
		int32_t clear = true;
		static const char *kwlist[] = { "clear", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &clear)) {
			return PyLong_FromLong(self->ptr.isChanged((clear != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::isChanged(): unknown arguments:\n(bool clear) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_getCanvasMesh(PYControlScroll *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlScroll::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlScroll_get_prev_text(PYControlScroll *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getPrevText().get());
	}
	static PyObject *ControlScroll_get_next_text(PYControlScroll *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getNextText().get());
	}
	static PyObject *ControlScroll_get_scroll_color(PYControlScroll *self, void *offset) {
		return pyColor_new(self->ptr.getScrollColor());
	}
	static PyObject *ControlScroll_get_step(PYControlScroll *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getStep());
	}
	static PyObject *ControlScroll_get_value(PYControlScroll *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getValue());
	}
	static PyObject *ControlScroll_get_frame(PYControlScroll *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getFrame());
	}
	static PyObject *ControlScroll_get_range(PYControlScroll *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getRange());
	}
	static PyObject *ControlScroll_get_frame_align(PYControlScroll *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFrameAlign());
	}
	static PyObject *ControlScroll_get_canvas_mesh(PYControlScroll *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlScroll_str(PYControlScroll *self) {
		return PyUnicode_FromString(String::format("ControlScroll Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlScroll_bool(PYControlScroll *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlSplit
	static void pyControlSplit_base(PYControlSplit *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlSplit(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlSplit_Type);
	}
	TS_PYAPI ControlSplit &pyControlSplit_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlSplit_Type) return ((PYControlSplit*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlSplit_get(): can't get ControlSplit from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlSplit_get(): can't get ControlSplit from None");
		static ControlSplit ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlSplit_new(const ControlSplit &ptr) {
		PYControlSplit *ret = (PYControlSplit*)PyObject_New(PYControlSplit, &PYControlSplit_Type);
		new(&ret->ptr) ControlSplit(ptr); pyControlSplit_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlSplit_new(ControlSplit &&ptr) {
		PYControlSplit *ret = (PYControlSplit*)PyObject_New(PYControlSplit, &PYControlSplit_Type);
		new(&ret->ptr) ControlSplit(move(ptr)); pyControlSplit_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlSplit_init(PYControlSplit *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlSplit(((PYControl*)object)->ptr);
				pyControlSplit_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlSplit();
			pyControlSplit_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &parent_, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSplit(parent, (vertical != 0));
				pyControlSplit_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			float32_t value = {};
			int32_t vertical = false;
			static const char *kwlist[] = { "parent", "value", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Of|i", (char**)kwlist, &parent_, &value, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlSplit(parent, value, (vertical != 0));
				pyControlSplit_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::ControlSplit(): unknown arguments:\n(void)\n(Control* parent, bool vertical)\n(Control* parent, float32_t value, bool vertical)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlSplit_dealloc(PYControlSplit *self) {
		self->ptr.~ControlSplit();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlSplit_equalPtr(PYControlSplit *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlSplit_clonePtr(PYControlSplit *self, PyObject *args) {
		return pyControlSplit_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlSplit_clearPtr(PYControlSplit *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSplit_destroyPtr(PYControlSplit *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSplit_acquirePtr(PYControlSplit *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSplit_unacquirePtr(PYControlSplit *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlSplit_isValidPtr(PYControlSplit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlSplit_isOwnerPtr(PYControlSplit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlSplit_isConstPtr(PYControlSplit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlSplit_getCountPtr(PYControlSplit *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlSplit_getInternalPtr(PYControlSplit *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlSplit_getControl(PYControlSplit *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlSplit_setAbsolute(PYControlSplit *self, PyObject *args, PyObject *kwargs) {
		int32_t absolute = {};
		static const char *kwlist[] = { "absolute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &absolute)) {
			self->ptr.setAbsolute((absolute != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::setAbsolute(): unknown arguments:\n(bool absolute) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_isAbsolute(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAbsolute());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::isAbsolute(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_setVertical(PYControlSplit *self, PyObject *args, PyObject *kwargs) {
		int32_t vertical = {};
		static const char *kwlist[] = { "vertical", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &vertical)) {
			self->ptr.setVertical((vertical != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::setVertical(): unknown arguments:\n(bool vertical) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_isHorizontal(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHorizontal());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::isHorizontal(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_isVertical(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVertical());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::isVertical(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_setValue(PYControlSplit *self, PyObject *args, PyObject *kwargs) {
		float32_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &value)) {
			self->ptr.setValue(value);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::setValue(): unknown arguments:\n(float32_t value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_getValue(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getValue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::getValue(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_setHandleSize(PYControlSplit *self, PyObject *args, PyObject *kwargs) {
		float32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &size)) {
			self->ptr.setHandleSize(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::setHandleSize(): unknown arguments:\n(float32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_getHandleSize(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHandleSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::getHandleSize(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_getControlsSize(PYControlSplit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlSplit::getControlsSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlSplit_get_value(PYControlSplit *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getValue());
	}
	static PyObject *ControlSplit_get_handle_size(PYControlSplit *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHandleSize());
	}
	static PyObject *ControlSplit_get_controls_size(PYControlSplit *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsSize());
	}
	static PyObject *pyControlSplit_str(PYControlSplit *self) {
		return PyUnicode_FromString(String::format("ControlSplit Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlSplit_bool(PYControlSplit *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlArea
	static void pyControlArea_base(PYControlArea *self) {
		new(&self->base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlArea(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlArea_Type);
	}
	TS_PYAPI ControlArea &pyControlArea_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlArea_Type) return ((PYControlArea*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlArea_get(): can't get ControlArea from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlArea_get(): can't get ControlArea from None");
		static ControlArea ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlArea_new(const ControlArea &ptr) {
		PYControlArea *ret = (PYControlArea*)PyObject_New(PYControlArea, &PYControlArea_Type);
		new(&ret->ptr) ControlArea(ptr); pyControlArea_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlArea_new(ControlArea &&ptr) {
		PYControlArea *ret = (PYControlArea*)PyObject_New(PYControlArea, &PYControlArea_Type);
		new(&ret->ptr) ControlArea(move(ptr)); pyControlArea_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlArea_init(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControl(object)) {
				new(&self->ptr) ControlArea(((PYControl*)object)->ptr);
				pyControlArea_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlArea();
			pyControlArea_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlArea(parent);
				pyControlArea_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			static const char *kwlist[] = { "parent", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &parent_, &columns)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlArea(parent, columns);
				pyControlArea_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			int32_t horizontal = {};
			int32_t vertical = {};
			static const char *kwlist[] = { "parent", "horizontal", "vertical", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Oii", (char**)kwlist, &parent_, &horizontal, &vertical)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlArea(parent, (horizontal != 0), (vertical != 0));
				pyControlArea_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			uint32_t columns = {};
			float32_t x = {};
			float32_t y = {};
			static const char *kwlist[] = { "parent", "columns", "x", "y", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIff", (char**)kwlist, &parent_, &columns, &x, &y)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlArea(parent, columns, x, y);
				pyControlArea_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::ControlArea(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, uint32_t columns)\n(Control* parent, bool horizontal, bool vertical)\n(Control* parent, uint32_t columns, float32_t x, float32_t y)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlArea_dealloc(PYControlArea *self) {
		self->ptr.~ControlArea();
		self->base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlArea_equalPtr(PYControlArea *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlArea_clonePtr(PYControlArea *self, PyObject *args) {
		return pyControlArea_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlArea_clearPtr(PYControlArea *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlArea_destroyPtr(PYControlArea *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlArea_acquirePtr(PYControlArea *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlArea_unacquirePtr(PYControlArea *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlArea_isValidPtr(PYControlArea *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlArea_isOwnerPtr(PYControlArea *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlArea_isConstPtr(PYControlArea *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlArea_getCountPtr(PYControlArea *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlArea_getInternalPtr(PYControlArea *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlArea_getControl(PYControlArea *self, PyObject *args) {
		return pyControl_new(self->ptr.getControl());
	}
	static PyObject *ControlArea_setAbsolute(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		int32_t absolute = {};
		static const char *kwlist[] = { "absolute", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &absolute)) {
			self->ptr.setAbsolute((absolute != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setAbsolute(): unknown arguments:\n(bool absolute) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isAbsolute(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isAbsolute());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isAbsolute(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setScalable(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		int32_t scalable = {};
		static const char *kwlist[] = { "scalable", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &scalable)) {
			self->ptr.setScalable((scalable != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setScalable(): unknown arguments:\n(bool scalable) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isScalable(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isScalable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isScalable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setScrollable(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		int32_t scrollable = {};
		static const char *kwlist[] = { "scrollable", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &scrollable)) {
			self->ptr.setScrollable((scrollable != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setScrollable(): unknown arguments:\n(bool scrollable) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isScrollable(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isScrollable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isScrollable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setScale(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float32_t scale = {};
		static const char *kwlist[] = { "scale", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "f", (char**)kwlist, &scale)) {
			self->ptr.setScale(scale);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setScale(): unknown arguments:\n(float32_t scale) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getScale(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getScale(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setScaleRange(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float32_t min = {};
		float32_t max = {};
		static const char *kwlist[] = { "min", "max", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &min, &max)) {
			self->ptr.setScaleRange(min, max);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setScaleRange(): unknown arguments:\n(float32_t min, float32_t max) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getMinScale(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMinScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getMinScale(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getMaxScale(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getMaxScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getMaxScale(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setHorizontalStep(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t step = {};
		static const char *kwlist[] = { "step", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &step)) {
			self->ptr.setHorizontalStep(step);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setHorizontalStep(): unknown arguments:\n(float64_t step) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setVerticalStep(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t step = {};
		static const char *kwlist[] = { "step", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &step)) {
			self->ptr.setVerticalStep(step);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setVerticalStep(): unknown arguments:\n(float64_t step) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setStep(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t horizontal = {};
		float64_t vertical = {};
		static const char *kwlist[] = { "horizontal", "vertical", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dd", (char**)kwlist, &horizontal, &vertical)) {
			self->ptr.setStep(horizontal, vertical);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setStep(): unknown arguments:\n(float64_t horizontal, float64_t vertical) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getHorizontalStep(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHorizontalStep());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getHorizontalStep(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getVerticalStep(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getVerticalStep());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getVerticalStep(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setHorizontalValue(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &value)) {
			self->ptr.setHorizontalValue(value);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setHorizontalValue(): unknown arguments:\n(float64_t value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setVerticalValue(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t value = {};
		static const char *kwlist[] = { "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "d", (char**)kwlist, &value)) {
			self->ptr.setVerticalValue(value);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setVerticalValue(): unknown arguments:\n(float64_t value) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setValue(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float64_t horizontal = {};
		float64_t vertical = {};
		static const char *kwlist[] = { "horizontal", "vertical", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "dd", (char**)kwlist, &horizontal, &vertical)) {
			self->ptr.setValue(horizontal, vertical);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setValue(): unknown arguments:\n(float64_t horizontal, float64_t vertical) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getHorizontalValue(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHorizontalValue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getHorizontalValue(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getVerticalValue(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getVerticalValue());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getVerticalValue(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setFrameAlign(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		uint32_t align = 0;
		static const char *kwlist[] = { "align", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &align)) {
			self->ptr.setFrameAlign((Control::Align)align);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setFrameAlign(): unknown arguments:\n(Control.Align align) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getFrameAlign(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFrameAlign());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getFrameAlign(): unknown arguments:\n(void) -> Control::Align\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getHorizontalFrame(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHorizontalFrame());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getHorizontalFrame(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getVerticalFrame(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getVerticalFrame());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getVerticalFrame(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getHorizontalRange(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getHorizontalRange());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getHorizontalRange(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getVerticalRange(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getVerticalRange());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getVerticalRange(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setHorizontalEnabled(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		int32_t dynamic = false;
		static const char *kwlist[] = { "enabled", "dynamic", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &enabled, &dynamic)) {
			self->ptr.setHorizontalEnabled((enabled != 0), (dynamic != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setHorizontalEnabled(): unknown arguments:\n(bool enabled, bool dynamic) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isHorizontalEnabled(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHorizontalEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isHorizontalEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isHorizontalDynamic(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHorizontalDynamic());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isHorizontalDynamic(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isHorizontalHidden(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isHorizontalHidden());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isHorizontalHidden(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getHorizontalScroll(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlScroll_new(self->ptr.getHorizontalScroll());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlScroll_new(self->ptr.getHorizontalScroll());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getHorizontalScroll(): unknown arguments:\n(void) -> const ControlScroll\n(void) -> ControlScroll\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setVerticalEnabled(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		int32_t enabled = {};
		int32_t dynamic = false;
		static const char *kwlist[] = { "enabled", "dynamic", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", (char**)kwlist, &enabled, &dynamic)) {
			self->ptr.setVerticalEnabled((enabled != 0), (dynamic != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setVerticalEnabled(): unknown arguments:\n(bool enabled, bool dynamic) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isVerticalEnabled(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVerticalEnabled());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isVerticalEnabled(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isVerticalDynamic(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVerticalDynamic());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isVerticalDynamic(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_isVerticalHidden(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isVerticalHidden());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::isVerticalHidden(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getVerticalScroll(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlScroll_new(self->ptr.getVerticalScroll());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyControlScroll_new(self->ptr.getVerticalScroll());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getVerticalScroll(): unknown arguments:\n(void) -> const ControlScroll\n(void) -> ControlScroll\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setFontSize(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			return PyLong_FromLong(self->ptr.setFontSize(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setFontSize(): unknown arguments:\n(uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getFontSize(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFontSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getFontSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setFontStyle(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		PyObject *style_ = nullptr;
		static const char *kwlist[] = { "style", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &style_)) {
			if(!isPYFontStyle(style_)) break;
			const FontStyle &style = pyFontStyle_get(style_);
			return PyLong_FromLong(self->ptr.setFontStyle(style));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setFontStyle(): unknown arguments:\n(const FontStyle style) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getFontStyleConst(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyleConst());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getFontStyleConst(): unknown arguments:\n(void) -> const FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getFontStyle(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return pyFontStyle_new(self->ptr.getFontStyle());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getFontStyle(): unknown arguments:\n(void) -> const FontStyle\n(void) -> FontStyle\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setColumns(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		uint32_t columns = {};
		static const char *kwlist[] = { "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &columns)) {
			self->ptr.setColumns(columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setColumns(): unknown arguments:\n(uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getColumns(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getColumns());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getColumns(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setSpacing(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		float32_t x = {};
		float32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ff", (char**)kwlist, &x, &y)) {
			self->ptr.setSpacing(x, y);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *spacing_ = nullptr;
			static const char *kwlist[] = { "spacing", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &spacing_)) {
				if(!isPYVector2f(spacing_)) break;
				const Vector2f &spacing = pyVector2f_get(spacing_);
				self->ptr.setSpacing(spacing);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setSpacing(): unknown arguments:\n(float32_t x, float32_t y) -> void\n(const Vector2f spacing) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getSpacing(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getSpacing());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getSpacing(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_setColumnRatio(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		float32_t ratio = {};
		static const char *kwlist[] = { "index", "ratio", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &index, &ratio)) {
			self->ptr.setColumnRatio(index, ratio);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::setColumnRatio(): unknown arguments:\n(uint32_t index, float32_t ratio) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getColumnRatio(PYControlArea *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyFloat_FromDouble(self->ptr.getColumnRatio(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getColumnRatio(): unknown arguments:\n(uint32_t index) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getControlsSize(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getControlsSize(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getControlsOffset(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyVector2f_new(self->ptr.getControlsOffset());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getControlsOffset(): unknown arguments:\n(void) -> const Vector2f\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_getViewRect(PYControlArea *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRect_new(self->ptr.getViewRect());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlArea::getViewRect(): unknown arguments:\n(void) -> const Rect\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlArea_get_scale(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getScale());
	}
	static PyObject *ControlArea_get_min_scale(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMinScale());
	}
	static PyObject *ControlArea_get_max_scale(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getMaxScale());
	}
	static PyObject *ControlArea_get_horizontal_step(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHorizontalStep());
	}
	static PyObject *ControlArea_get_vertical_step(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getVerticalStep());
	}
	static PyObject *ControlArea_get_horizontal_value(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHorizontalValue());
	}
	static PyObject *ControlArea_get_vertical_value(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getVerticalValue());
	}
	static PyObject *ControlArea_get_frame_align(PYControlArea *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFrameAlign());
	}
	static PyObject *ControlArea_get_horizontal_frame(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHorizontalFrame());
	}
	static PyObject *ControlArea_get_vertical_frame(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getVerticalFrame());
	}
	static PyObject *ControlArea_get_horizontal_range(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getHorizontalRange());
	}
	static PyObject *ControlArea_get_vertical_range(PYControlArea *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getVerticalRange());
	}
	static PyObject *ControlArea_get_horizontal_scroll(PYControlArea *self, void *offset) {
		return pyControlScroll_new(self->ptr.getHorizontalScroll());
	}
	static PyObject *ControlArea_get_vertical_scroll(PYControlArea *self, void *offset) {
		return pyControlScroll_new(self->ptr.getVerticalScroll());
	}
	static PyObject *ControlArea_get_font_size(PYControlArea *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFontSize());
	}
	static PyObject *ControlArea_get_font_style_const(PYControlArea *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyleConst());
	}
	static PyObject *ControlArea_get_font_style(PYControlArea *self, void *offset) {
		return pyFontStyle_new(self->ptr.getFontStyle());
	}
	static PyObject *ControlArea_get_columns(PYControlArea *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getColumns());
	}
	static PyObject *ControlArea_get_spacing(PYControlArea *self, void *offset) {
		return pyVector2f_new(self->ptr.getSpacing());
	}
	static PyObject *ControlArea_get_controls_size(PYControlArea *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsSize());
	}
	static PyObject *ControlArea_get_controls_offset(PYControlArea *self, void *offset) {
		return pyVector2f_new(self->ptr.getControlsOffset());
	}
	static PyObject *ControlArea_get_view_rect(PYControlArea *self, void *offset) {
		return pyRect_new(self->ptr.getViewRect());
	}
	static PyObject *pyControlArea_str(PYControlArea *self) {
		return PyUnicode_FromString(String::format("ControlArea Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlArea_bool(PYControlArea *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlTree
	static void pyControlTree_ChangedCallback(ControlTree a0, uint32_t item, PyObject *func) {
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(OI)", a0_, item);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static bool pyControlTree_DraggedCallback(ControlTree a0, uint32_t item, PyObject *func) {
		bool ret = {};
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(OI)", a0_, item);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
		return ret;
	}
	static void pyControlTree_DroppedCallback(ControlTree a0, uint32_t item, PyObject *func) {
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(OI)", a0_, item);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlTree_ClickedCallback(ControlTree a0, uint32_t item, PyObject *func) {
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(OI)", a0_, item);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlTree_ExpandedCallback(ControlTree a0, uint32_t item, PyObject *func) {
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(OI)", a0_, item);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlTree_SelectedCallback(ControlTree a0, PyObject *func) {
		PyObject *a0_ = pyControlTree_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlTree_base(PYControlTree *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlTree(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlTree_Type);
	}
	TS_PYAPI ControlTree &pyControlTree_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlTree_Type) return ((PYControlTree*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlTree_get(): can't get ControlTree from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlTree_get(): can't get ControlTree from None");
		static ControlTree ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlTree_new(const ControlTree &ptr) {
		PYControlTree *ret = (PYControlTree*)PyObject_New(PYControlTree, &PYControlTree_Type);
		new(&ret->ptr) ControlTree(ptr); pyControlTree_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlTree_new(ControlTree &&ptr) {
		PYControlTree *ret = (PYControlTree*)PyObject_New(PYControlTree, &PYControlTree_Type);
		new(&ret->ptr) ControlTree(move(ptr)); pyControlTree_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlTree_init(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlTree(((PYControlText*)object)->ptr);
				pyControlTree_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlTree(((PYControl*)object)->ptr);
				pyControlTree_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlTree();
			pyControlTree_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlTree(parent);
				pyControlTree_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::ControlTree(): unknown arguments:\n(void)\n(Control* parent)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlTree_dealloc(PYControlTree *self) {
		self->ptr.~ControlTree();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlTree_equalPtr(PYControlTree *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlTree_clonePtr(PYControlTree *self, PyObject *args) {
		return pyControlTree_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlTree_clearPtr(PYControlTree *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlTree_destroyPtr(PYControlTree *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlTree_acquirePtr(PYControlTree *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlTree_unacquirePtr(PYControlTree *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlTree_isValidPtr(PYControlTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlTree_isOwnerPtr(PYControlTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlTree_isConstPtr(PYControlTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlTree_getCountPtr(PYControlTree *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlTree_getInternalPtr(PYControlTree *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlTree_getControlText(PYControlTree *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlTree_setSelectable(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		int32_t selectable = {};
		static const char *kwlist[] = { "selectable", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &selectable)) {
			self->ptr.setSelectable((selectable != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setSelectable(): unknown arguments:\n(bool selectable) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isSelectable(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isSelectable());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isSelectable(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setMultiSelection(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		int32_t multi_selection = {};
		static const char *kwlist[] = { "multi_selection", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &multi_selection)) {
			self->ptr.setMultiSelection((multi_selection != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setMultiSelection(): unknown arguments:\n(bool multi_selection) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isMultiSelection(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isMultiSelection());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isMultiSelection(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setFoldedText(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setFoldedText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setFoldedText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setFoldedText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getFoldedText(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFoldedText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getFoldedText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setExpandedText(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			self->ptr.setExpandedText(text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setExpandedText(text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setExpandedText(): unknown arguments:\n(const char* text) -> void\n(const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getExpandedText(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getExpandedText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getExpandedText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setTexture(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *texture_ = nullptr;
		uint32_t rows = 1;
		uint32_t columns = 1;
		static const char *kwlist[] = { "texture", "rows", "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|II", (char**)kwlist, &texture_, &rows, &columns)) {
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			self->ptr.setTexture(texture, rows, columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setTexture(): unknown arguments:\n(Texture texture, uint32_t rows, uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getTexture(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyTexture_new(self->ptr.getTexture());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getTexture(): unknown arguments:\n(void) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setTextureName(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		uint32_t rows = 1;
		uint32_t columns = 1;
		static const char *kwlist[] = { "name", "rows", "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|II", (char**)kwlist, &name, &rows, &columns)) {
			self->ptr.setTextureName(name, rows, columns);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			uint32_t rows = 1;
			uint32_t columns = 1;
			static const char *kwlist[] = { "name", "rows", "columns", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|II", (char**)kwlist, &name_, &rows, &columns)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setTextureName(name, rows, columns);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setTextureName(): unknown arguments:\n(const char* name, uint32_t rows, uint32_t columns) -> void\n(const String name, uint32_t rows, uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getTextureName(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTextureName().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getTextureName(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setTextureGrid(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t rows = {};
		uint32_t columns = {};
		static const char *kwlist[] = { "rows", "columns", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &rows, &columns)) {
			self->ptr.setTextureGrid(rows, columns);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setTextureGrid(): unknown arguments:\n(uint32_t rows, uint32_t columns) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getTextureRows(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureRows());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getTextureRows(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getTextureColumns(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getTextureColumns());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getTextureColumns(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_clearItems(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearItems();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::clearItems(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_addItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		uint32_t parent = Maxu32;
		int32_t expanded = true;
		static const char *kwlist[] = { "text", "parent", "expanded", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|Ii", (char**)kwlist, &text, &parent, &expanded)) {
			return PyLong_FromUnsignedLong(self->ptr.addItem(text, parent, (expanded != 0)));
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			uint32_t parent = Maxu32;
			int32_t expanded = true;
			static const char *kwlist[] = { "text", "parent", "expanded", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|Ii", (char**)kwlist, &text_, &parent, &expanded)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, parent, (expanded != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::addItem(): unknown arguments:\n(const char* text, uint32_t parent, bool expanded) -> uint32_t\n(const String text, uint32_t parent, bool expanded) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_removeItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &item, &children)) {
			self->ptr.removeItem(item, (children != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::removeItem(): unknown arguments:\n(uint32_t item, bool children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_viewItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			self->ptr.viewItem(item);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::viewItem(): unknown arguments:\n(uint32_t item) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getNumItems(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumItems());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getNumItems(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getItem(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItem(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_switchItemHidden(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &item, &children)) {
			return PyLong_FromLong(self->ptr.switchItemHidden(item, (children != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::switchItemHidden(): unknown arguments:\n(uint32_t item, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemHidden(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t hidden = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "hidden", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|i", (char**)kwlist, &item, &hidden, &children)) {
			self->ptr.setItemHidden(item, (hidden != 0), (children != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemHidden(): unknown arguments:\n(uint32_t item, bool hidden, bool children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isItemHidden(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromLong(self->ptr.isItemHidden(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isItemHidden(): unknown arguments:\n(uint32_t item) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_switchItemExpanded(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &item, &children)) {
			return PyLong_FromLong(self->ptr.switchItemExpanded(item, (children != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::switchItemExpanded(): unknown arguments:\n(uint32_t item, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemExpanded(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t expanded = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "expanded", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|i", (char**)kwlist, &item, &expanded, &children)) {
			self->ptr.setItemExpanded(item, (expanded != 0), (children != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemExpanded(): unknown arguments:\n(uint32_t item, bool expanded, bool children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isItemExpanded(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromLong(self->ptr.isItemExpanded(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isItemExpanded(): unknown arguments:\n(uint32_t item) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_switchItemSelected(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|i", (char**)kwlist, &item, &children)) {
			return PyLong_FromLong(self->ptr.switchItemSelected(item, (children != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::switchItemSelected(): unknown arguments:\n(uint32_t item, bool children) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemSelected(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t selected = {};
		int32_t children = false;
		static const char *kwlist[] = { "item", "selected", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|i", (char**)kwlist, &item, &selected, &children)) {
			self->ptr.setItemSelected(item, (selected != 0), (children != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemSelected(): unknown arguments:\n(uint32_t item, bool selected, bool children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isItemSelected(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromLong(self->ptr.isItemSelected(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isItemSelected(): unknown arguments:\n(uint32_t item) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemParent(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t parent = {};
		static const char *kwlist[] = { "item", "parent", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &parent)) {
			self->ptr.setItemParent(item, parent);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemParent(): unknown arguments:\n(uint32_t item, uint32_t parent) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemParent(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemParent(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemParent(): unknown arguments:\n(uint32_t item) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isItemParent(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t parent = {};
		int32_t hierarchy = false;
		static const char *kwlist[] = { "item", "parent", "hierarchy", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|i", (char**)kwlist, &item, &parent, &hierarchy)) {
			return PyLong_FromLong(self->ptr.isItemParent(item, parent, (hierarchy != 0)));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isItemParent(): unknown arguments:\n(uint32_t item, uint32_t parent, bool hierarchy) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_addItemChild(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t child = {};
		static const char *kwlist[] = { "item", "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &child)) {
			self->ptr.addItemChild(item, child);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::addItemChild(): unknown arguments:\n(uint32_t item, uint32_t child) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_removeItemChild(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t child = {};
		static const char *kwlist[] = { "item", "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &child)) {
			self->ptr.removeItemChild(item, child);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::removeItemChild(): unknown arguments:\n(uint32_t item, uint32_t child) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_addItemChildren(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		PyObject *children_ = nullptr;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &item, &children_)) {
			if(!isPYArray(children_)) break;
			Array<uint32_t> children; pyArray_get(children_, children);
			self->ptr.addItemChildren(item, children);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::addItemChildren(): unknown arguments:\n(uint32_t item, Array<uint32_t> children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_removeItemChildren(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		PyObject *children_ = nullptr;
		static const char *kwlist[] = { "item", "children", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &item, &children_)) {
			if(!isPYArray(children_)) break;
			Array<uint32_t> children; pyArray_get(children_, children);
			self->ptr.removeItemChildren(item, children);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::removeItemChildren(): unknown arguments:\n(uint32_t item, Array<uint32_t> children) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_findItemChild(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t child = {};
		static const char *kwlist[] = { "item", "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &child)) {
			return PyLong_FromUnsignedLong(self->ptr.findItemChild(item, child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::findItemChild(): unknown arguments:\n(uint32_t item, uint32_t child) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_isItemChild(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t child = {};
		static const char *kwlist[] = { "item", "child", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &child)) {
			return PyLong_FromLong(self->ptr.isItemChild(item, child));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::isItemChild(): unknown arguments:\n(uint32_t item, uint32_t child) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getNumItemChildren(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumItemChildren(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getNumItemChildren(): unknown arguments:\n(uint32_t item) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemChild(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t index = {};
		static const char *kwlist[] = { "item", "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &item, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemChild(item, index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemChild(): unknown arguments:\n(uint32_t item, uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemChildren(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			auto ret_ = self->ptr.getItemChildren(item);
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyLong_FromUnsignedLong(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemChildren(): unknown arguments:\n(uint32_t item) -> Array<uint32_t>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemText(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		const char *text = nullptr;
		static const char *kwlist[] = { "item", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &item, &text)) {
			self->ptr.setItemText(item, text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t item = {};
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "item", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &item, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setItemText(item, text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemText(): unknown arguments:\n(uint32_t item, const char* text) -> void\n(uint32_t item, const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemText(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyUnicode_FromString(self->ptr.getItemText(item).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemText(): unknown arguments:\n(uint32_t item) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_findItemText(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		static const char *kwlist[] = { "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &text)) {
			return PyLong_FromUnsignedLong(self->ptr.findItemText(text));
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.findItemText(text));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::findItemText(): unknown arguments:\n(const char* text) -> uint32_t\n(const String text) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemColor(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "item", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &item, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setItemColor(item, color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemColor(): unknown arguments:\n(uint32_t item, const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemColor(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return pyColor_new(self->ptr.getItemColor(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemColor(): unknown arguments:\n(uint32_t item) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemTexture(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		uint32_t row = {};
		uint32_t column = 0;
		static const char *kwlist[] = { "item", "row", "column", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II|I", (char**)kwlist, &item, &row, &column)) {
			self->ptr.setItemTexture(item, row, column);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemTexture(): unknown arguments:\n(uint32_t item, uint32_t row, uint32_t column) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemTextureRow(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemTextureRow(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemTextureRow(): unknown arguments:\n(uint32_t item) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemTextureColumn(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemTextureColumn(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemTextureColumn(): unknown arguments:\n(uint32_t item) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setItemUserData(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		void *data = nullptr;
		static const char *kwlist[] = { "item", "data", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "In", (char**)kwlist, &item, &data)) {
			self->ptr.setItemUserData(item, data);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setItemUserData(): unknown arguments:\n(uint32_t item, void* data) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getItemUserData(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		static const char *kwlist[] = { "item", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &item)) {
			return PyLong_FromVoidPtr(self->ptr.getItemUserData(item));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getItemUserData(): unknown arguments:\n(uint32_t item) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setCurrentItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t item = {};
		int32_t select = false;
		int32_t view = false;
		int32_t callback = false;
		static const char *kwlist[] = { "item", "select", "view", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|iii", (char**)kwlist, &item, &select, &view, &callback)) {
			self->ptr.setCurrentItem(item, (select != 0), (view != 0), (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setCurrentItem(): unknown arguments:\n(uint32_t item, bool select, bool view, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getCurrentItem(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCurrentItem());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getCurrentItem(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getCurrentText(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getCurrentText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getCurrentText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setSelection(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.setSelection();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setSelection(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_clearSelection(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearSelection();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::clearSelection(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_inverseSelection(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.inverseSelection();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::inverseSelection(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getNumSelectedItems(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumSelectedItems());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getNumSelectedItems(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getSelectedItem(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getSelectedItem(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getSelectedItem(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_getSelectedItems(PYControlTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			auto ret_ = self->ptr.getSelectedItems();
			PyObject *ret = PyTuple_New(ret_.size());
			for(uint32_t i = 0; i < ret_.size(); i++) PyTuple_SetItem(ret, i, PyLong_FromUnsignedLong(ret_[i]));
			return ret;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::getSelectedItems(): unknown arguments:\n(void) -> Array<uint32_t>\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setChangedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_ChangedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setChangedCallback(): unknown arguments:\n(const ControlTree.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setDraggedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_DraggedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setDraggedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setDraggedCallback(): unknown arguments:\n(const ControlTree.DraggedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setDroppedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_DroppedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setDroppedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setDroppedCallback(): unknown arguments:\n(const ControlTree.DroppedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setClickedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_ClickedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setClickedCallback(): unknown arguments:\n(const ControlTree.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setClicked2Callback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_ClickedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setClicked2Callback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setClicked2Callback(): unknown arguments:\n(const ControlTree.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setClickedRightCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_ClickedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setClickedRightCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setClickedRightCallback(): unknown arguments:\n(const ControlTree.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setExpandedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_ExpandedCallback);
			func.setArg2(func_);
			Py_INCREF(func_);
			self->ptr.setExpandedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setExpandedCallback(): unknown arguments:\n(const ControlTree.ExpandedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_setSelectedCallback(PYControlTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlTree_SelectedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setSelectedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlTree::setSelectedCallback(): unknown arguments:\n(const ControlTree.SelectedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlTree_get_folded_text(PYControlTree *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFoldedText().get());
	}
	static PyObject *ControlTree_get_expanded_text(PYControlTree *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getExpandedText().get());
	}
	static PyObject *ControlTree_get_texture(PYControlTree *self, void *offset) {
		return pyTexture_new(self->ptr.getTexture());
	}
	static PyObject *ControlTree_get_texture_name(PYControlTree *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTextureName().get());
	}
	static PyObject *ControlTree_get_texture_rows(PYControlTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureRows());
	}
	static PyObject *ControlTree_get_texture_columns(PYControlTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getTextureColumns());
	}
	static PyObject *ControlTree_get_num_items(PYControlTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumItems());
	}
	static PyObject *ControlTree_get_current_item(PYControlTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCurrentItem());
	}
	static PyObject *ControlTree_get_current_text(PYControlTree *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getCurrentText().get());
	}
	static PyObject *ControlTree_get_num_selected_items(PYControlTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumSelectedItems());
	}
	static PyObject *pyControlTree_str(PYControlTree *self) {
		return PyUnicode_FromString(String::format("ControlTree Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlTree_bool(PYControlTree *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::ControlEdit
	static void pyControlEdit_ClickedCallback(ControlEdit a0, PyObject *func) {
		PyObject *a0_ = pyControlEdit_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlEdit_ChangedCallback(ControlEdit a0, PyObject *func) {
		PyObject *a0_ = pyControlEdit_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlEdit_ReturnedCallback(ControlEdit a0, PyObject *func) {
		PyObject *a0_ = pyControlEdit_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static void pyControlEdit_base(PYControlEdit *self) {
		new(&self->base.ptr) ControlText(self->ptr);
		new(&self->base.base.ptr) Control(self->ptr);
	}
	TS_PYAPI bool isPYControlEdit(PyObject *object) {
		return (object && Py_TYPE(object) == &PYControlEdit_Type);
	}
	TS_PYAPI ControlEdit &pyControlEdit_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYControlEdit_Type) return ((PYControlEdit*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "ControlEdit_get(): can't get ControlEdit from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "ControlEdit_get(): can't get ControlEdit from None");
		static ControlEdit ret;
		return ret;
	}
	TS_PYAPI PyObject *pyControlEdit_new(const ControlEdit &ptr) {
		PYControlEdit *ret = (PYControlEdit*)PyObject_New(PYControlEdit, &PYControlEdit_Type);
		new(&ret->ptr) ControlEdit(ptr); pyControlEdit_base(ret);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyControlEdit_new(ControlEdit &&ptr) {
		PYControlEdit *ret = (PYControlEdit*)PyObject_New(PYControlEdit, &PYControlEdit_Type);
		new(&ret->ptr) ControlEdit(move(ptr)); pyControlEdit_base(ret);
		return (PyObject*)ret;
	}
	static int32_t pyControlEdit_init(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		if(PyTuple_Size(args) == 1 && !kwargs) {
			PyObject *object = PyTuple_GetItem(args, 0);
			if(isPYControlText(object)) {
				new(&self->ptr) ControlEdit(((PYControlText*)object)->ptr);
				pyControlEdit_base(self);
				return 0;
			}
			if(isPYControl(object)) {
				new(&self->ptr) ControlEdit(((PYControl*)object)->ptr);
				pyControlEdit_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) ControlEdit();
			pyControlEdit_base(self);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			static const char *kwlist[] = { "parent", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &parent_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlEdit(parent);
				pyControlEdit_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			const char *text = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &parent_, &text)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				new(&self->ptr) ControlEdit(parent, text);
				pyControlEdit_base(self);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *parent_ = nullptr;
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "parent", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &parent_, &text_)) {
				if(!isPYControl(parent_)) break;
				Control *parent = (parent_) ? &pyControl_get(parent_) : nullptr;
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				new(&self->ptr) ControlEdit(parent, text);
				pyControlEdit_base(self);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::ControlEdit(): unknown arguments:\n(void)\n(Control* parent)\n(Control* parent, const char* text)\n(Control* parent, const String text)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyControlEdit_dealloc(PYControlEdit *self) {
		self->ptr.~ControlEdit();
		self->base.ptr.~ControlText();
		self->base.base.ptr.~Control();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyControlEdit_equalPtr(PYControlEdit *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyControlEdit_clonePtr(PYControlEdit *self, PyObject *args) {
		return pyControlEdit_new(self->ptr.clonePtr());
	}
	static PyObject *pyControlEdit_clearPtr(PYControlEdit *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlEdit_destroyPtr(PYControlEdit *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlEdit_acquirePtr(PYControlEdit *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlEdit_unacquirePtr(PYControlEdit *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyControlEdit_isValidPtr(PYControlEdit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyControlEdit_isOwnerPtr(PYControlEdit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyControlEdit_isConstPtr(PYControlEdit *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyControlEdit_getCountPtr(PYControlEdit *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyControlEdit_getInternalPtr(PYControlEdit *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *pyControlEdit_getControlText(PYControlEdit *self, PyObject *args) {
		return pyControlText_new(self->ptr.getControlText());
	}
	static PyObject *ControlEdit_setFrame(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		int32_t frame = {};
		static const char *kwlist[] = { "frame", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &frame)) {
			self->ptr.setFrame((frame != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setFrame(): unknown arguments:\n(bool frame) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getFrame(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getFrame());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getFrame(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setBackground(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		int32_t background = {};
		static const char *kwlist[] = { "background", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)kwlist, &background)) {
			self->ptr.setBackground((background != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setBackground(): unknown arguments:\n(bool background) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getBackground(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getBackground());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getBackground(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setEditColor(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &color_)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setEditColor(color);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setEditColor(): unknown arguments:\n(const Color color) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getEditColor(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getEditColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getEditColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setEditMode(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			self->ptr.setEditMode((ControlEdit::EditMode)mode);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setEditMode(): unknown arguments:\n(ControlEdit.EditMode mode) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getEditMode(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getEditMode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getEditMode(): unknown arguments:\n(void) -> ControlEdit::EditMode\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setPasswordCode(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		uint32_t code = {};
		static const char *kwlist[] = { "code", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &code)) {
			self->ptr.setPasswordCode(code);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setPasswordCode(): unknown arguments:\n(uint32_t code) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getPasswordCode(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getPasswordCode());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getPasswordCode(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getNumCodes(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumCodes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getNumCodes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getCodes(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromVoidPtr((void*)self->ptr.getCodes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getCodes(): unknown arguments:\n(void) -> const uint32_t*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setCurrentIndex(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t selection_index = Maxu32;
		static const char *kwlist[] = { "index", "selection_index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I|I", (char**)kwlist, &index, &selection_index)) {
			self->ptr.setCurrentIndex(index, selection_index);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setCurrentIndex(): unknown arguments:\n(uint32_t index, uint32_t selection_index) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getCurrentIndex(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getCurrentIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getCurrentIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getSelectionIndex(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSelectionIndex());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getSelectionIndex(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setSelection(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		int32_t current = false;
		static const char *kwlist[] = { "current", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|i", (char**)kwlist, &current)) {
			self->ptr.setSelection((current != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setSelection(): unknown arguments:\n(bool current) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_clearSelection(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clearSelection();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::clearSelection(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getSelectedText(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getSelectedText().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getSelectedText(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setClickedCallback(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlEdit_ClickedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setClickedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setClickedCallback(): unknown arguments:\n(const ControlEdit.ClickedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_isClicked(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isClicked());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::isClicked(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setChangedCallback(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlEdit_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setChangedCallback(): unknown arguments:\n(const ControlEdit.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_isChanged(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isChanged());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::isChanged(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_setReturnedCallback(PYControlEdit *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyControlEdit_ReturnedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setReturnedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::setReturnedCallback(): unknown arguments:\n(const ControlEdit.ReturnedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_isReturned(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isReturned());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::isReturned(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_getCanvasMesh(PYControlEdit *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyCanvasMesh_new(self->ptr.getCanvasMesh());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "ControlEdit::getCanvasMesh(): unknown arguments:\n(void) -> CanvasMesh\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *ControlEdit_get_frame(PYControlEdit *self, void *offset) {
		return PyLong_FromLong(self->ptr.getFrame());
	}
	static PyObject *ControlEdit_get_background(PYControlEdit *self, void *offset) {
		return PyLong_FromLong(self->ptr.getBackground());
	}
	static PyObject *ControlEdit_get_edit_color(PYControlEdit *self, void *offset) {
		return pyColor_new(self->ptr.getEditColor());
	}
	static PyObject *ControlEdit_get_edit_mode(PYControlEdit *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getEditMode());
	}
	static PyObject *ControlEdit_get_password_code(PYControlEdit *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getPasswordCode());
	}
	static PyObject *ControlEdit_get_num_codes(PYControlEdit *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumCodes());
	}
	static PyObject *ControlEdit_get_codes(PYControlEdit *self, void *offset) {
		return PyLong_FromVoidPtr((void*)self->ptr.getCodes());
	}
	static PyObject *ControlEdit_get_current_index(PYControlEdit *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getCurrentIndex());
	}
	static PyObject *ControlEdit_get_selection_index(PYControlEdit *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSelectionIndex());
	}
	static PyObject *ControlEdit_get_selected_text(PYControlEdit *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getSelectedText().get());
	}
	static PyObject *ControlEdit_get_canvas_mesh(PYControlEdit *self, void *offset) {
		return pyCanvasMesh_new(self->ptr.getCanvasMesh());
	}
	static PyObject *pyControlEdit_str(PYControlEdit *self) {
		return PyUnicode_FromString(String::format("ControlEdit Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyControlEdit_bool(PYControlEdit *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogMessage
	static bool pyDialogMessage_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogMessage(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogMessage_Type);
	}
	TS_PYAPI DialogMessage &pyDialogMessage_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogMessage_Type) return ((PYDialogMessage*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogMessage_get(): can't get DialogMessage from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogMessage_get(): can't get DialogMessage from None");
		static DialogMessage ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogMessage_new(const DialogMessage &ptr) {
		PYDialogMessage *ret = (PYDialogMessage*)PyObject_New(PYDialogMessage, &PYDialogMessage_Type);
		new(&ret->ptr) DialogMessage(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogMessage_new(DialogMessage &&ptr) {
		PYDialogMessage *ret = (PYDialogMessage*)PyObject_New(PYDialogMessage, &PYDialogMessage_Type);
		new(&ret->ptr) DialogMessage(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogMessage_init(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		const char *message = nullptr;
		static const char *kwlist[] = { "title", "message", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &title, &message)) {
			new(&self->ptr) DialogMessage(title, message);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			const char *message = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &title_, &message)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				new(&self->ptr) DialogMessage(title, message);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *title = nullptr;
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &title, &message_)) {
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				new(&self->ptr) DialogMessage(title, message);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &title_, &message_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				new(&self->ptr) DialogMessage(title, message);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::DialogMessage(): unknown arguments:\n(const char* title, const char* message)\n(const String title, const char* message)\n(const char* title, const String message)\n(const String title, const String message)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogMessage_dealloc(PYDialogMessage *self) {
		self->ptr.~DialogMessage();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogMessage_equalPtr(PYDialogMessage *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogMessage_clonePtr(PYDialogMessage *self, PyObject *args) {
		return pyDialogMessage_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogMessage_clearPtr(PYDialogMessage *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMessage_destroyPtr(PYDialogMessage *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMessage_acquirePtr(PYDialogMessage *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMessage_unacquirePtr(PYDialogMessage *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMessage_isValidPtr(PYDialogMessage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogMessage_isOwnerPtr(PYDialogMessage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogMessage_isConstPtr(PYDialogMessage *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogMessage_getCountPtr(PYDialogMessage *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogMessage_getInternalPtr(PYDialogMessage *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogMessage_setPosition(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_getPositionX(PYDialogMessage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_getPositionY(PYDialogMessage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_setTitle(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_getTitle(PYDialogMessage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_setMessage(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		const char *message = nullptr;
		static const char *kwlist[] = { "message", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &message)) {
			self->ptr.setMessage(message);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &message_)) {
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				self->ptr.setMessage(message);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::setMessage(): unknown arguments:\n(const char* message) -> void\n(const String message) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_getMessage(PYDialogMessage *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getMessage().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::getMessage(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_setUpdateCallback(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogMessage_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::setUpdateCallback(): unknown arguments:\n(const DialogMessage.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_run(PYDialogMessage *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogMessage::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogMessage::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMessage::run(): unknown arguments:\n(DialogMessage.Flags flags) -> DialogMessage::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMessage_get_position_x(PYDialogMessage *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogMessage_get_position_y(PYDialogMessage *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogMessage_get_title(PYDialogMessage *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogMessage_get_message(PYDialogMessage *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getMessage().get());
	}
	static PyObject *pyDialogMessage_str(PYDialogMessage *self) {
		return PyUnicode_FromString(String::format("DialogMessage Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogMessage_bool(PYDialogMessage *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogFileOpen
	static bool pyDialogFileOpen_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogFileOpen(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogFileOpen_Type);
	}
	TS_PYAPI DialogFileOpen &pyDialogFileOpen_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogFileOpen_Type) return ((PYDialogFileOpen*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogFileOpen_get(): can't get DialogFileOpen from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogFileOpen_get(): can't get DialogFileOpen from None");
		static DialogFileOpen ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogFileOpen_new(const DialogFileOpen &ptr) {
		PYDialogFileOpen *ret = (PYDialogFileOpen*)PyObject_New(PYDialogFileOpen, &PYDialogFileOpen_Type);
		new(&ret->ptr) DialogFileOpen(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogFileOpen_new(DialogFileOpen &&ptr) {
		PYDialogFileOpen *ret = (PYDialogFileOpen*)PyObject_New(PYDialogFileOpen, &PYDialogFileOpen_Type);
		new(&ret->ptr) DialogFileOpen(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogFileOpen_init(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		const char *name = nullptr;
		static const char *kwlist[] = { "title", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &title, &name)) {
			new(&self->ptr) DialogFileOpen(title, name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &title_, &name)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				new(&self->ptr) DialogFileOpen(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *title = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &title, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogFileOpen(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &title_, &name_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogFileOpen(title, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::DialogFileOpen(): unknown arguments:\n(const char* title, const char* name)\n(const String title, const char* name)\n(const char* title, const String name)\n(const String title, const String name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogFileOpen_dealloc(PYDialogFileOpen *self) {
		self->ptr.~DialogFileOpen();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogFileOpen_equalPtr(PYDialogFileOpen *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogFileOpen_clonePtr(PYDialogFileOpen *self, PyObject *args) {
		return pyDialogFileOpen_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogFileOpen_clearPtr(PYDialogFileOpen *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileOpen_destroyPtr(PYDialogFileOpen *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileOpen_acquirePtr(PYDialogFileOpen *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileOpen_unacquirePtr(PYDialogFileOpen *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileOpen_isValidPtr(PYDialogFileOpen *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogFileOpen_isOwnerPtr(PYDialogFileOpen *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogFileOpen_isConstPtr(PYDialogFileOpen *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogFileOpen_getCountPtr(PYDialogFileOpen *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogFileOpen_getInternalPtr(PYDialogFileOpen *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogFileOpen_setPosition(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_getPositionX(PYDialogFileOpen *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_getPositionY(PYDialogFileOpen *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_setTitle(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_getTitle(PYDialogFileOpen *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_setFilter(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		const char *filter = nullptr;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &filter)) {
			self->ptr.setFilter(filter);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *filter_ = nullptr;
			static const char *kwlist[] = { "filter", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &filter_)) {
				if(!isPYString(filter_)) break;
				const String &filter = (filter_) ? ((PyUnicode_Check(filter_)) ? String(PyUnicode_AsUTF8(filter_)) : (String)pyString_get(filter_)) : String::null;
				self->ptr.setFilter(filter);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::setFilter(): unknown arguments:\n(const char* filter) -> void\n(const String filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_getFilter(PYDialogFileOpen *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFilter().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::getFilter(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_setFile(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setFile(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setFile(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::setFile(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_getFile(PYDialogFileOpen *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFile().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::getFile(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_setUpdateCallback(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogFileOpen_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::setUpdateCallback(): unknown arguments:\n(const DialogFileOpen.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_run(PYDialogFileOpen *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogFileOpen::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogFileOpen::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileOpen::run(): unknown arguments:\n(DialogFileOpen.Flags flags) -> DialogFileOpen::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileOpen_get_position_x(PYDialogFileOpen *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogFileOpen_get_position_y(PYDialogFileOpen *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogFileOpen_get_title(PYDialogFileOpen *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogFileOpen_get_filter(PYDialogFileOpen *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFilter().get());
	}
	static PyObject *DialogFileOpen_get_file(PYDialogFileOpen *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFile().get());
	}
	static PyObject *pyDialogFileOpen_str(PYDialogFileOpen *self) {
		return PyUnicode_FromString(String::format("DialogFileOpen Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogFileOpen_bool(PYDialogFileOpen *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogFileSave
	static bool pyDialogFileSave_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogFileSave(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogFileSave_Type);
	}
	TS_PYAPI DialogFileSave &pyDialogFileSave_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogFileSave_Type) return ((PYDialogFileSave*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogFileSave_get(): can't get DialogFileSave from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogFileSave_get(): can't get DialogFileSave from None");
		static DialogFileSave ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogFileSave_new(const DialogFileSave &ptr) {
		PYDialogFileSave *ret = (PYDialogFileSave*)PyObject_New(PYDialogFileSave, &PYDialogFileSave_Type);
		new(&ret->ptr) DialogFileSave(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogFileSave_new(DialogFileSave &&ptr) {
		PYDialogFileSave *ret = (PYDialogFileSave*)PyObject_New(PYDialogFileSave, &PYDialogFileSave_Type);
		new(&ret->ptr) DialogFileSave(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogFileSave_init(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		const char *name = nullptr;
		static const char *kwlist[] = { "title", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &title, &name)) {
			new(&self->ptr) DialogFileSave(title, name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &title_, &name)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				new(&self->ptr) DialogFileSave(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *title = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &title, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogFileSave(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &title_, &name_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogFileSave(title, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::DialogFileSave(): unknown arguments:\n(const char* title, const char* name)\n(const String title, const char* name)\n(const char* title, const String name)\n(const String title, const String name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogFileSave_dealloc(PYDialogFileSave *self) {
		self->ptr.~DialogFileSave();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogFileSave_equalPtr(PYDialogFileSave *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogFileSave_clonePtr(PYDialogFileSave *self, PyObject *args) {
		return pyDialogFileSave_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogFileSave_clearPtr(PYDialogFileSave *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileSave_destroyPtr(PYDialogFileSave *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileSave_acquirePtr(PYDialogFileSave *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileSave_unacquirePtr(PYDialogFileSave *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogFileSave_isValidPtr(PYDialogFileSave *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogFileSave_isOwnerPtr(PYDialogFileSave *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogFileSave_isConstPtr(PYDialogFileSave *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogFileSave_getCountPtr(PYDialogFileSave *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogFileSave_getInternalPtr(PYDialogFileSave *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogFileSave_setPosition(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_getPositionX(PYDialogFileSave *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_getPositionY(PYDialogFileSave *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_setTitle(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_getTitle(PYDialogFileSave *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_setFilter(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		const char *filter = nullptr;
		static const char *kwlist[] = { "filter", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &filter)) {
			self->ptr.setFilter(filter);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *filter_ = nullptr;
			static const char *kwlist[] = { "filter", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &filter_)) {
				if(!isPYString(filter_)) break;
				const String &filter = (filter_) ? ((PyUnicode_Check(filter_)) ? String(PyUnicode_AsUTF8(filter_)) : (String)pyString_get(filter_)) : String::null;
				self->ptr.setFilter(filter);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::setFilter(): unknown arguments:\n(const char* filter) -> void\n(const String filter) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_getFilter(PYDialogFileSave *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFilter().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::getFilter(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_setFile(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setFile(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setFile(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::setFile(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_getFile(PYDialogFileSave *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getFile().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::getFile(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_setUpdateCallback(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogFileSave_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::setUpdateCallback(): unknown arguments:\n(const DialogFileSave.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_run(PYDialogFileSave *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogFileSave::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogFileSave::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogFileSave::run(): unknown arguments:\n(DialogFileSave.Flags flags) -> DialogFileSave::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogFileSave_get_position_x(PYDialogFileSave *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogFileSave_get_position_y(PYDialogFileSave *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogFileSave_get_title(PYDialogFileSave *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogFileSave_get_filter(PYDialogFileSave *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFilter().get());
	}
	static PyObject *DialogFileSave_get_file(PYDialogFileSave *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getFile().get());
	}
	static PyObject *pyDialogFileSave_str(PYDialogFileSave *self) {
		return PyUnicode_FromString(String::format("DialogFileSave Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogFileSave_bool(PYDialogFileSave *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogDirectory
	static bool pyDialogDirectory_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogDirectory(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogDirectory_Type);
	}
	TS_PYAPI DialogDirectory &pyDialogDirectory_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogDirectory_Type) return ((PYDialogDirectory*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogDirectory_get(): can't get DialogDirectory from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogDirectory_get(): can't get DialogDirectory from None");
		static DialogDirectory ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogDirectory_new(const DialogDirectory &ptr) {
		PYDialogDirectory *ret = (PYDialogDirectory*)PyObject_New(PYDialogDirectory, &PYDialogDirectory_Type);
		new(&ret->ptr) DialogDirectory(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogDirectory_new(DialogDirectory &&ptr) {
		PYDialogDirectory *ret = (PYDialogDirectory*)PyObject_New(PYDialogDirectory, &PYDialogDirectory_Type);
		new(&ret->ptr) DialogDirectory(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogDirectory_init(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		const char *name = nullptr;
		static const char *kwlist[] = { "title", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &title, &name)) {
			new(&self->ptr) DialogDirectory(title, name);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			const char *name = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &title_, &name)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				new(&self->ptr) DialogDirectory(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *title = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &title, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogDirectory(title, name);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "title", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &title_, &name_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				new(&self->ptr) DialogDirectory(title, name);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::DialogDirectory(): unknown arguments:\n(const char* title, const char* name)\n(const String title, const char* name)\n(const char* title, const String name)\n(const String title, const String name)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogDirectory_dealloc(PYDialogDirectory *self) {
		self->ptr.~DialogDirectory();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogDirectory_equalPtr(PYDialogDirectory *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogDirectory_clonePtr(PYDialogDirectory *self, PyObject *args) {
		return pyDialogDirectory_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogDirectory_clearPtr(PYDialogDirectory *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogDirectory_destroyPtr(PYDialogDirectory *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogDirectory_acquirePtr(PYDialogDirectory *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogDirectory_unacquirePtr(PYDialogDirectory *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogDirectory_isValidPtr(PYDialogDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogDirectory_isOwnerPtr(PYDialogDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogDirectory_isConstPtr(PYDialogDirectory *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogDirectory_getCountPtr(PYDialogDirectory *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogDirectory_getInternalPtr(PYDialogDirectory *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogDirectory_setPosition(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_getPositionX(PYDialogDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_getPositionY(PYDialogDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_setTitle(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_getTitle(PYDialogDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_setDirectory(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			self->ptr.setDirectory(name);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				self->ptr.setDirectory(name);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::setDirectory(): unknown arguments:\n(const char* name) -> void\n(const String name) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_getDirectory(PYDialogDirectory *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getDirectory().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::getDirectory(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_setUpdateCallback(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogDirectory_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::setUpdateCallback(): unknown arguments:\n(const DialogDirectory.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_run(PYDialogDirectory *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogDirectory::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogDirectory::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogDirectory::run(): unknown arguments:\n(DialogDirectory.Flags flags) -> DialogDirectory::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogDirectory_get_position_x(PYDialogDirectory *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogDirectory_get_position_y(PYDialogDirectory *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogDirectory_get_title(PYDialogDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogDirectory_get_directory(PYDialogDirectory *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getDirectory().get());
	}
	static PyObject *pyDialogDirectory_str(PYDialogDirectory *self) {
		return PyUnicode_FromString(String::format("DialogDirectory Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogDirectory_bool(PYDialogDirectory *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogProgress
	TS_PYAPI bool isPYDialogProgress(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogProgress_Type);
	}
	TS_PYAPI DialogProgress &pyDialogProgress_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogProgress_Type) return ((PYDialogProgress*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogProgress_get(): can't get DialogProgress from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogProgress_get(): can't get DialogProgress from None");
		static DialogProgress ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogProgress_new(const DialogProgress &ptr) {
		PYDialogProgress *ret = (PYDialogProgress*)PyObject_New(PYDialogProgress, &PYDialogProgress_Type);
		new(&ret->ptr) DialogProgress(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogProgress_new(DialogProgress &&ptr) {
		PYDialogProgress *ret = (PYDialogProgress*)PyObject_New(PYDialogProgress, &PYDialogProgress_Type);
		new(&ret->ptr) DialogProgress(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogProgress_init(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		const char *message = nullptr;
		static const char *kwlist[] = { "title", "message", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|ss", (char**)kwlist, &title, &message)) {
			new(&self->ptr) DialogProgress(title, message);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			const char *message = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &title_, &message)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				new(&self->ptr) DialogProgress(title, message);
				return 0;
			}
		}
		PyErr_Clear();
		{
			const char *title = nullptr;
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO", (char**)kwlist, &title, &message_)) {
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				new(&self->ptr) DialogProgress(title, message);
				return 0;
			}
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "title", "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO", (char**)kwlist, &title_, &message_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				new(&self->ptr) DialogProgress(title, message);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::DialogProgress(): unknown arguments:\n(const char* title, const char* message)\n(const String title, const char* message)\n(const char* title, const String message)\n(const String title, const String message)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogProgress_dealloc(PYDialogProgress *self) {
		self->ptr.~DialogProgress();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogProgress_equalPtr(PYDialogProgress *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogProgress_clonePtr(PYDialogProgress *self, PyObject *args) {
		return pyDialogProgress_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogProgress_clearPtr(PYDialogProgress *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogProgress_destroyPtr(PYDialogProgress *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogProgress_acquirePtr(PYDialogProgress *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogProgress_unacquirePtr(PYDialogProgress *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogProgress_isValidPtr(PYDialogProgress *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogProgress_isOwnerPtr(PYDialogProgress *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogProgress_isConstPtr(PYDialogProgress *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogProgress_getCountPtr(PYDialogProgress *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogProgress_getInternalPtr(PYDialogProgress *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogProgress_setPosition(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_getPositionX(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_getPositionY(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_setTitle(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_getTitle(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_setMessage(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		const char *message = nullptr;
		static const char *kwlist[] = { "message", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &message)) {
			self->ptr.setMessage(message);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *message_ = nullptr;
			static const char *kwlist[] = { "message", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &message_)) {
				if(!isPYString(message_)) break;
				const String &message = (message_) ? ((PyUnicode_Check(message_)) ? String(PyUnicode_AsUTF8(message_)) : (String)pyString_get(message_)) : String::null;
				self->ptr.setMessage(message);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::setMessage(): unknown arguments:\n(const char* message) -> void\n(const String message) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_getMessage(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getMessage().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::getMessage(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_setProgress(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		uint32_t progress = {};
		static const char *kwlist[] = { "progress", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &progress)) {
			self->ptr.setProgress(progress);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::setProgress(): unknown arguments:\n(uint32_t progress) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_getProgress(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getProgress());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::getProgress(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_run(PYDialogProgress *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogProgress::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogProgress::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::run(): unknown arguments:\n(DialogProgress.Flags flags) -> DialogProgress::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_close(PYDialogProgress *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.close();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogProgress::close(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogProgress_get_position_x(PYDialogProgress *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogProgress_get_position_y(PYDialogProgress *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogProgress_get_title(PYDialogProgress *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogProgress_get_message(PYDialogProgress *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getMessage().get());
	}
	static PyObject *DialogProgress_get_progress(PYDialogProgress *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getProgress());
	}
	static PyObject *pyDialogProgress_str(PYDialogProgress *self) {
		return PyUnicode_FromString(String::format("DialogProgress Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogProgress_bool(PYDialogProgress *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogColor
	static void pyDialogColor_ChangedCallback(Color a0, PyObject *func) {
		PyObject *a0_ = pyColor_new(a0);
		if(func) {
			PyObject *args = Py_BuildValue("(O)", a0_);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		Py_DECREF(a0_);
	}
	static bool pyDialogColor_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogColor(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogColor_Type);
	}
	TS_PYAPI DialogColor &pyDialogColor_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogColor_Type) return ((PYDialogColor*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogColor_get(): can't get DialogColor from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogColor_get(): can't get DialogColor from None");
		static DialogColor ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogColor_new(const DialogColor &ptr) {
		PYDialogColor *ret = (PYDialogColor*)PyObject_New(PYDialogColor, &PYDialogColor_Type);
		new(&ret->ptr) DialogColor(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogColor_new(DialogColor &&ptr) {
		PYDialogColor *ret = (PYDialogColor*)PyObject_New(PYDialogColor, &PYDialogColor_Type);
		new(&ret->ptr) DialogColor(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogColor_init(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		PyObject *color_ = nullptr;
		static const char *kwlist[] = { "title", "color", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|sO", (char**)kwlist, &title, &color_)) {
			const Color &color = pyColor_get(color_);
			new(&self->ptr) DialogColor(title, color);
			return 0;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			PyObject *color_ = nullptr;
			static const char *kwlist[] = { "title", "color", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", (char**)kwlist, &title_, &color_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				const Color &color = pyColor_get(color_);
				new(&self->ptr) DialogColor(title, color);
				return 0;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::DialogColor(): unknown arguments:\n(const char* title, const Color color)\n(const String title, const Color color)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogColor_dealloc(PYDialogColor *self) {
		self->ptr.~DialogColor();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogColor_equalPtr(PYDialogColor *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogColor_clonePtr(PYDialogColor *self, PyObject *args) {
		return pyDialogColor_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogColor_clearPtr(PYDialogColor *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogColor_destroyPtr(PYDialogColor *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogColor_acquirePtr(PYDialogColor *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogColor_unacquirePtr(PYDialogColor *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogColor_isValidPtr(PYDialogColor *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogColor_isOwnerPtr(PYDialogColor *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogColor_isConstPtr(PYDialogColor *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogColor_getCountPtr(PYDialogColor *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogColor_getInternalPtr(PYDialogColor *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogColor_setPosition(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_getPositionX(PYDialogColor *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_getPositionY(PYDialogColor *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_setTitle(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		const char *title = nullptr;
		static const char *kwlist[] = { "title", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &title)) {
			self->ptr.setTitle(title);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *title_ = nullptr;
			static const char *kwlist[] = { "title", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &title_)) {
				if(!isPYString(title_)) break;
				const String &title = (title_) ? ((PyUnicode_Check(title_)) ? String(PyUnicode_AsUTF8(title_)) : (String)pyString_get(title_)) : String::null;
				self->ptr.setTitle(title);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::setTitle(): unknown arguments:\n(const char* title) -> void\n(const String title) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_getTitle(PYDialogColor *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyUnicode_FromString(self->ptr.getTitle().get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::getTitle(): unknown arguments:\n(void) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_setColor(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		PyObject *color_ = nullptr;
		int32_t callback = false;
		static const char *kwlist[] = { "color", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &color_, &callback)) {
			if(!isPYColor(color_)) break;
			const Color &color = pyColor_get(color_);
			self->ptr.setColor(color, (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::setColor(): unknown arguments:\n(const Color color, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_getColor(PYDialogColor *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyColor_new(self->ptr.getColor());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::getColor(): unknown arguments:\n(void) -> const Color\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_setChangedCallback(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogColor_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			self->ptr.setChangedCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::setChangedCallback(): unknown arguments:\n(const DialogColor.ChangedCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_setUpdateCallback(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogColor_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::setUpdateCallback(): unknown arguments:\n(const DialogColor.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_run(PYDialogColor *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogColor::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogColor::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogColor::run(): unknown arguments:\n(DialogColor.Flags flags) -> DialogColor::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogColor_get_position_x(PYDialogColor *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogColor_get_position_y(PYDialogColor *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogColor_get_title(PYDialogColor *self, void *offset) {
		return PyUnicode_FromString(self->ptr.getTitle().get());
	}
	static PyObject *DialogColor_get_color(PYDialogColor *self, void *offset) {
		return pyColor_new(self->ptr.getColor());
	}
	static PyObject *pyDialogColor_str(PYDialogColor *self) {
		return PyUnicode_FromString(String::format("DialogColor Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogColor_bool(PYDialogColor *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DialogMenu
	static void pyDialogMenu_ClickedCallback(PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static void pyDialogMenu_ChangedCallback(bool a0, PyObject *func) {
		if(func) {
			PyObject *args = Py_BuildValue("(i)", a0);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
	}
	static bool pyDialogMenu_UpdateCallback(PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("()");
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYDialogMenu(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDialogMenu_Type);
	}
	TS_PYAPI DialogMenu &pyDialogMenu_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDialogMenu_Type) return ((PYDialogMenu*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DialogMenu_get(): can't get DialogMenu from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DialogMenu_get(): can't get DialogMenu from None");
		static DialogMenu ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDialogMenu_new(const DialogMenu &ptr) {
		PYDialogMenu *ret = (PYDialogMenu*)PyObject_New(PYDialogMenu, &PYDialogMenu_Type);
		new(&ret->ptr) DialogMenu(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDialogMenu_new(DialogMenu &&ptr) {
		PYDialogMenu *ret = (PYDialogMenu*)PyObject_New(PYDialogMenu, &PYDialogMenu_Type);
		new(&ret->ptr) DialogMenu(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDialogMenu_init(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) DialogMenu();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::DialogMenu(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDialogMenu_dealloc(PYDialogMenu *self) {
		self->ptr.~DialogMenu();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDialogMenu_equalPtr(PYDialogMenu *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDialogMenu_clonePtr(PYDialogMenu *self, PyObject *args) {
		return pyDialogMenu_new(self->ptr.clonePtr());
	}
	static PyObject *pyDialogMenu_clearPtr(PYDialogMenu *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMenu_destroyPtr(PYDialogMenu *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMenu_acquirePtr(PYDialogMenu *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMenu_unacquirePtr(PYDialogMenu *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDialogMenu_isValidPtr(PYDialogMenu *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDialogMenu_isOwnerPtr(PYDialogMenu *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDialogMenu_isConstPtr(PYDialogMenu *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDialogMenu_getCountPtr(PYDialogMenu *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDialogMenu_getInternalPtr(PYDialogMenu *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DialogMenu_setPosition(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			self->ptr.setPosition(x, y);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setPosition(): unknown arguments:\n(int32_t x, int32_t y) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getPositionX(PYDialogMenu *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getPositionX(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getPositionY(PYDialogMenu *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getPositionY(): unknown arguments:\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getNumItems(PYDialogMenu *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumItems());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getNumItems(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemText(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const char *text = nullptr;
		static const char *kwlist[] = { "index", "text", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &index, &text)) {
			self->ptr.setItemText(index, text);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t index = {};
			PyObject *text_ = nullptr;
			static const char *kwlist[] = { "index", "text", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &text_)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				self->ptr.setItemText(index, text);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemText(): unknown arguments:\n(uint32_t index, const char* text) -> void\n(uint32_t index, const String text) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getItemText(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getItemText(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getItemText(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemKey(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		const char *key = nullptr;
		static const char *kwlist[] = { "index", "key", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &index, &key)) {
			self->ptr.setItemKey(index, key);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemKey(): unknown arguments:\n(uint32_t index, const char* key) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getItemKey(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getItemKey(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getItemKey(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemImage(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		PyObject *image_ = nullptr;
		static const char *kwlist[] = { "index", "image", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &index, &image_)) {
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			self->ptr.setItemImage(index, image);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemImage(): unknown arguments:\n(uint32_t index, const Image image) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getItemImage(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return pyImage_new(self->ptr.getItemImage(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getItemImage(): unknown arguments:\n(uint32_t index) -> Image\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemChecked(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t checked = {};
		int32_t callback = false;
		static const char *kwlist[] = { "index", "checked", "callback", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii|i", (char**)kwlist, &index, &checked, &callback)) {
			self->ptr.setItemChecked(index, (checked != 0), (callback != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemChecked(): unknown arguments:\n(uint32_t index, bool checked, bool callback) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_isItemChecked(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isItemChecked(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::isItemChecked(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemEnabled(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t enabled = {};
		static const char *kwlist[] = { "index", "enabled", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &index, &enabled)) {
			self->ptr.setItemEnabled(index, (enabled != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemEnabled(): unknown arguments:\n(uint32_t index, bool enabled) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_isItemEnabled(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isItemEnabled(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::isItemEnabled(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemHidden(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		int32_t hidden = {};
		static const char *kwlist[] = { "index", "hidden", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Ii", (char**)kwlist, &index, &hidden)) {
			self->ptr.setItemHidden(index, (hidden != 0));
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemHidden(): unknown arguments:\n(uint32_t index, bool hidden) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_isItemHidden(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.isItemHidden(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::isItemHidden(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setItemsGroup(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t size = {};
		static const char *kwlist[] = { "index", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &size)) {
			self->ptr.setItemsGroup(index, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setItemsGroup(): unknown arguments:\n(uint32_t index, uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getItemGroupIndex(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemGroupIndex(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getItemGroupIndex(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_getItemGroupSize(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getItemGroupSize(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::getItemGroupSize(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_addItem(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		const char *text = nullptr;
		PyObject *image_ = nullptr;
		int32_t checked = {};
		PyObject *func_ = nullptr;
		const char *key = nullptr;
		static const char *kwlist[] = { "text", "image", "checked", "func", "key", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sOiO|s", (char**)kwlist, &text, &image_, &checked, &func_, &key)) {
			if(!isPYImage(image_)) break;
			const Image &image = pyImage_get(image_);
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogMenu_ChangedCallback);
			func.setArg1(func_);
			Py_INCREF(func_);
			return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, (checked != 0), func, key));
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			PyObject *image_ = nullptr;
			int32_t checked = {};
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "image", "checked", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOiO|s", (char**)kwlist, &text_, &image_, &checked, &func_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ChangedCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, (checked != 0), func, key));
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			PyObject *image_ = nullptr;
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "image", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sOO|s", (char**)kwlist, &text, &image_, &func_, &key)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ClickedCallback);
				func.setArg0(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, func, key));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			PyObject *image_ = nullptr;
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "image", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|s", (char**)kwlist, &text_, &image_, &func_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ClickedCallback);
				func.setArg0(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, func, key));
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			int32_t checked = {};
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "checked", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "siO|s", (char**)kwlist, &text, &checked, &func_, &key)) {
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ChangedCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, (checked != 0), func, key));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			int32_t checked = {};
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "checked", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OiO|s", (char**)kwlist, &text_, &checked, &func_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ChangedCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, (checked != 0), func, key));
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			PyObject *image_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "image", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO|s", (char**)kwlist, &text, &image_, &key)) {
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, key));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			PyObject *image_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "image", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|s", (char**)kwlist, &text_, &image_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				if(!isPYImage(image_)) break;
				const Image &image = pyImage_get(image_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, image, key));
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "sO|s", (char**)kwlist, &text, &func_, &key)) {
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ClickedCallback);
				func.setArg0(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, func, key));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			PyObject *func_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "func", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|s", (char**)kwlist, &text_, &func_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyDialogMenu_ClickedCallback);
				func.setArg0(func_);
				Py_INCREF(func_);
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, func, key));
			}
		}
		PyErr_Clear();
		{
			const char *text = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|s", (char**)kwlist, &text, &key)) {
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, key));
			}
		}
		PyErr_Clear();
		{
			PyObject *text_ = nullptr;
			const char *key = nullptr;
			static const char *kwlist[] = { "text", "key", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|s", (char**)kwlist, &text_, &key)) {
				if(!isPYString(text_)) break;
				const String &text = (text_) ? ((PyUnicode_Check(text_)) ? String(PyUnicode_AsUTF8(text_)) : (String)pyString_get(text_)) : String::null;
				return PyLong_FromUnsignedLong(self->ptr.addItem(text, key));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::addItem(): unknown arguments:\n(const char* text, const Image image, bool checked, const DialogMenu.ChangedCallback func, const char* key) -> uint32_t\n(const String text, const Image image, bool checked, const DialogMenu.ChangedCallback func, const char* key) -> uint32_t\n(const char* text, const Image image, const DialogMenu.ClickedCallback func, const char* key) -> uint32_t\n(const String text, const Image image, const DialogMenu.ClickedCallback func, const char* key) -> uint32_t\n(const char* text, bool checked, const DialogMenu.ChangedCallback func, const char* key) -> uint32_t\n(const String text, bool checked, const DialogMenu.ChangedCallback func, const char* key) -> uint32_t\n(const char* text, const Image image, const char* key) -> uint32_t\n(const String text, const Image image, const char* key) -> uint32_t\n(const char* text, const DialogMenu.ClickedCallback func, const char* key) -> uint32_t\n(const String text, const DialogMenu.ClickedCallback func, const char* key) -> uint32_t\n(const char* text, const char* key) -> uint32_t\n(const String text, const char* key) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_setUpdateCallback(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyDialogMenu_UpdateCallback);
			func.setArg0(func_);
			Py_INCREF(func_);
			self->ptr.setUpdateCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::setUpdateCallback(): unknown arguments:\n(const DialogMenu.UpdateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_run(PYDialogMenu *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = DialogMenu::DefaultFlags;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "|I", (char**)kwlist, &flags)) {
			return PyLong_FromUnsignedLong(self->ptr.run((DialogMenu::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DialogMenu::run(): unknown arguments:\n(DialogMenu.Flags flags) -> DialogMenu::Result\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DialogMenu_get_position_x(PYDialogMenu *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *DialogMenu_get_position_y(PYDialogMenu *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *DialogMenu_get_num_items(PYDialogMenu *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumItems());
	}
	static PyObject *pyDialogMenu_str(PYDialogMenu *self) {
		return PyUnicode_FromString(String::format("DialogMenu Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDialogMenu_bool(PYDialogMenu *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::CubeFilter
	TS_PYAPI bool isPYCubeFilter(PyObject *object) {
		return (object && Py_TYPE(object) == &PYCubeFilter_Type);
	}
	TS_PYAPI CubeFilter &pyCubeFilter_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYCubeFilter_Type) return ((PYCubeFilter*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "CubeFilter_get(): can't get CubeFilter from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "CubeFilter_get(): can't get CubeFilter from None");
		static CubeFilter ret;
		return ret;
	}
	TS_PYAPI PyObject *pyCubeFilter_new(const CubeFilter &ptr) {
		PYCubeFilter *ret = (PYCubeFilter*)PyObject_New(PYCubeFilter, &PYCubeFilter_Type);
		new(&ret->ptr) CubeFilter(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyCubeFilter_new(CubeFilter &&ptr) {
		PYCubeFilter *ret = (PYCubeFilter*)PyObject_New(PYCubeFilter, &PYCubeFilter_Type);
		new(&ret->ptr) CubeFilter(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyCubeFilter_init(PYCubeFilter *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) CubeFilter();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::CubeFilter(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyCubeFilter_dealloc(PYCubeFilter *self) {
		self->ptr.~CubeFilter();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyCubeFilter_equalPtr(PYCubeFilter *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyCubeFilter_clonePtr(PYCubeFilter *self, PyObject *args) {
		return pyCubeFilter_new(self->ptr.clonePtr());
	}
	static PyObject *pyCubeFilter_clearPtr(PYCubeFilter *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCubeFilter_destroyPtr(PYCubeFilter *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCubeFilter_acquirePtr(PYCubeFilter *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCubeFilter_unacquirePtr(PYCubeFilter *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyCubeFilter_isValidPtr(PYCubeFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyCubeFilter_isOwnerPtr(PYCubeFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyCubeFilter_isConstPtr(PYCubeFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyCubeFilter_getCountPtr(PYCubeFilter *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyCubeFilter_getInternalPtr(PYCubeFilter *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *CubeFilter_clear(PYCubeFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_isCreated(PYCubeFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((CubeFilter::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::isCreated(): unknown arguments:\n(CubeFilter.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_getGroupSize(PYCubeFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_getMaxOrder(PYCubeFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxOrder());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::getMaxOrder(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_getMaxSize(PYCubeFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::getMaxSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_getHarmonics(PYCubeFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHarmonics());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::getHarmonics(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_create(PYCubeFilter *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		uint32_t order = 3;
		uint32_t size = 1024;
		uint32_t groups = 256;
		static const char *kwlist[] = { "device", "mode", "order", "size", "groups", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|III", (char**)kwlist, &device_, &mode, &order, &size, &groups)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (CubeFilter::Mode)mode, order, size, groups));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			uint32_t order = 3;
			uint32_t size = 1024;
			uint32_t groups = 256;
			static const char *kwlist[] = { "device", "flags", "order", "size", "groups", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|III", (char**)kwlist, &device_, &flags, &order, &size, &groups)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				return PyLong_FromLong(self->ptr.create(device, (CubeFilter::Flags)flags, order, size, groups));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::create(): unknown arguments:\n(const Device device, CubeFilter.Mode mode, uint32_t order, uint32_t size, uint32_t groups) -> bool\n(const Device device, CubeFilter.Flags flags, uint32_t order, uint32_t size, uint32_t groups) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_dispatch(PYCubeFilter *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *buffer_ = nullptr;
		uint32_t offset = {};
		PyObject *texture_ = nullptr;
		PyObject *slice_ = nullptr;
		static const char *kwlist[] = { "compute", "buffer", "offset", "texture", "slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIOO", (char**)kwlist, &compute_, &buffer_, &offset, &texture_, &slice_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(buffer_)) break;
			Buffer &buffer = pyBuffer_get(buffer_);
			if(!isPYTexture(texture_)) break;
			Texture &texture = pyTexture_get(texture_);
			if(!isPYSlice(slice_)) break;
			const Slice &slice = pySlice_get(slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, buffer, offset, texture, slice));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *texture_ = nullptr;
			PyObject *slice_ = nullptr;
			PyObject *buffer_ = nullptr;
			uint32_t offset = {};
			static const char *kwlist[] = { "compute", "texture", "slice", "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOI", (char**)kwlist, &compute_, &texture_, &slice_, &buffer_, &offset)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYSlice(slice_)) break;
				const Slice &slice = pySlice_get(slice_);
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.dispatch(compute, texture, slice, buffer, offset));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *buffer_ = nullptr;
			uint32_t offset = {};
			PyObject *texture_ = nullptr;
			static const char *kwlist[] = { "compute", "buffer", "offset", "texture", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIO", (char**)kwlist, &compute_, &buffer_, &offset, &texture_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				return PyLong_FromLong(self->ptr.dispatch(compute, buffer, offset, texture));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *texture_ = nullptr;
			PyObject *buffer_ = nullptr;
			uint32_t offset = {};
			static const char *kwlist[] = { "compute", "texture", "buffer", "offset", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI", (char**)kwlist, &compute_, &texture_, &buffer_, &offset)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(texture_)) break;
				Texture &texture = pyTexture_get(texture_);
				if(!isPYBuffer(buffer_)) break;
				Buffer &buffer = pyBuffer_get(buffer_);
				return PyLong_FromLong(self->ptr.dispatch(compute, texture, buffer, offset));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "CubeFilter::dispatch(): unknown arguments:\n(Compute compute, Buffer buffer, uint32_t offset, Texture texture, const Slice slice) -> bool\n(Compute compute, Texture texture, const Slice slice, Buffer buffer, uint32_t offset) -> bool\n(Compute compute, Buffer buffer, uint32_t offset, Texture texture) -> bool\n(Compute compute, Texture texture, Buffer buffer, uint32_t offset) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *CubeFilter_get_group_size(PYCubeFilter *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *CubeFilter_get_max_order(PYCubeFilter *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxOrder());
	}
	static PyObject *CubeFilter_get_max_size(PYCubeFilter *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxSize());
	}
	static PyObject *CubeFilter_get_harmonics(PYCubeFilter *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHarmonics());
	}
	static PyObject *pyCubeFilter_str(PYCubeFilter *self) {
		return PyUnicode_FromString(String::format("CubeFilter Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyCubeFilter_bool(PYCubeFilter *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::DecoderJPEG
	TS_PYAPI bool isPYDecoderJPEG(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDecoderJPEG_Type);
	}
	TS_PYAPI DecoderJPEG &pyDecoderJPEG_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDecoderJPEG_Type) return ((PYDecoderJPEG*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "DecoderJPEG_get(): can't get DecoderJPEG from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "DecoderJPEG_get(): can't get DecoderJPEG from None");
		static DecoderJPEG ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDecoderJPEG_new(const DecoderJPEG &ptr) {
		PYDecoderJPEG *ret = (PYDecoderJPEG*)PyObject_New(PYDecoderJPEG, &PYDecoderJPEG_Type);
		new(&ret->ptr) DecoderJPEG(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDecoderJPEG_new(DecoderJPEG &&ptr) {
		PYDecoderJPEG *ret = (PYDecoderJPEG*)PyObject_New(PYDecoderJPEG, &PYDecoderJPEG_Type);
		new(&ret->ptr) DecoderJPEG(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDecoderJPEG_init(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) DecoderJPEG();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::DecoderJPEG(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDecoderJPEG_dealloc(PYDecoderJPEG *self) {
		self->ptr.~DecoderJPEG();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDecoderJPEG_equalPtr(PYDecoderJPEG *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDecoderJPEG_clonePtr(PYDecoderJPEG *self, PyObject *args) {
		return pyDecoderJPEG_new(self->ptr.clonePtr());
	}
	static PyObject *pyDecoderJPEG_clearPtr(PYDecoderJPEG *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDecoderJPEG_destroyPtr(PYDecoderJPEG *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDecoderJPEG_acquirePtr(PYDecoderJPEG *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDecoderJPEG_unacquirePtr(PYDecoderJPEG *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDecoderJPEG_isValidPtr(PYDecoderJPEG *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDecoderJPEG_isOwnerPtr(PYDecoderJPEG *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDecoderJPEG_isConstPtr(PYDecoderJPEG *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDecoderJPEG_getCountPtr(PYDecoderJPEG *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDecoderJPEG_getInternalPtr(PYDecoderJPEG *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *DecoderJPEG_clear(PYDecoderJPEG *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_isCreated(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((DecoderJPEG::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::isCreated(): unknown arguments:\n(DecoderJPEG.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_isYUV(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(DecoderJPEG::isYUV((DecoderJPEG::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::isYUV(): unknown arguments:\n(DecoderJPEG.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_create(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		static const char *kwlist[] = { "device", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &mode)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (DecoderJPEG::Mode)mode));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "device", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				return PyLong_FromLong(self->ptr.create(device, (DecoderJPEG::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::create(): unknown arguments:\n(const Device device, DecoderJPEG.Mode mode) -> bool\n(const Device device, DecoderJPEG.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_load(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		PyObject *image_ = nullptr;
		uint32_t mode = 0;
		PyObject *size_ = nullptr;
		static const char *kwlist[] = { "name", "image", "mode", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "sOIO", (char**)kwlist, &name, &image_, &mode, &size_)) {
			if(!isPYImage(image_)) break;
			Image &image = pyImage_get(image_);
			if(!isPYSize(size_)) break;
			Size &size = pySize_get(size_);
			return PyLong_FromLong(DecoderJPEG::load(name, image, (DecoderJPEG::Mode&)mode, size));
		}
		PyErr_Clear();
		{
			PyObject *stream_ = nullptr;
			PyObject *image_ = nullptr;
			uint32_t mode = 0;
			PyObject *size_ = nullptr;
			static const char *kwlist[] = { "stream", "image", "mode", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIO", (char**)kwlist, &stream_, &image_, &mode, &size_)) {
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				if(!isPYImage(image_)) break;
				Image &image = pyImage_get(image_);
				if(!isPYSize(size_)) break;
				Size &size = pySize_get(size_);
				return PyLong_FromLong(DecoderJPEG::load(stream, image, (DecoderJPEG::Mode&)mode, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::load(): unknown arguments:\n(const char* name, Image image, DecoderJPEG.Mode mode, Size size) -> bool\n(Stream stream, Image image, DecoderJPEG.Mode mode, Size size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_loadTexture(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		const char *name = nullptr;
		uint32_t flags = Texture::DefaultFlags;
		static const char *kwlist[] = { "device", "name", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os|I", (char**)kwlist, &device_, &name, &flags)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return pyTexture_new(self->ptr.loadTexture(device, name, (Texture::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *stream_ = nullptr;
			uint32_t flags = Texture::DefaultFlags;
			static const char *kwlist[] = { "device", "stream", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &device_, &stream_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				return pyTexture_new(self->ptr.loadTexture(device, stream, (Texture::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::loadTexture(): unknown arguments:\n(const Device device, const char* name, Texture.Flags flags) -> Texture\n(const Device device, Stream stream, Texture.Flags flags) -> Texture\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_dispatch(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "compute", "mode", "dest", "src", "dest_slice", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &dest_slice_, &src_slice_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (DecoderJPEG::Mode)mode, dest, src, dest_slice, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &src_slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (DecoderJPEG::Mode)mode, dest, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO", (char**)kwlist, &compute_, &mode, &dest_, &src_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (DecoderJPEG::Mode)mode, dest, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::dispatch(): unknown arguments:\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice) -> bool\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src, const Slice src_slice) -> bool\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *DecoderJPEG_dispatchYUV(PYDecoderJPEG *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "compute", "mode", "dest", "src", "dest_slice", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &dest_slice_, &src_slice_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatchYUV(compute, (DecoderJPEG::Mode)mode, dest, src, dest_slice, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &src_slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatchYUV(compute, (DecoderJPEG::Mode)mode, dest, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO", (char**)kwlist, &compute_, &mode, &dest_, &src_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatchYUV(compute, (DecoderJPEG::Mode)mode, dest, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "DecoderJPEG::dispatchYUV(): unknown arguments:\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice) -> bool\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src, const Slice src_slice) -> bool\n(Compute compute, DecoderJPEG.Mode mode, Texture dest, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyDecoderJPEG_str(PYDecoderJPEG *self) {
		return PyUnicode_FromString(String::format("DecoderJPEG Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDecoderJPEG_bool(PYDecoderJPEG *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::EncoderBC15
	TS_PYAPI bool isPYEncoderBC15(PyObject *object) {
		return (object && Py_TYPE(object) == &PYEncoderBC15_Type);
	}
	TS_PYAPI EncoderBC15 &pyEncoderBC15_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYEncoderBC15_Type) return ((PYEncoderBC15*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "EncoderBC15_get(): can't get EncoderBC15 from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "EncoderBC15_get(): can't get EncoderBC15 from None");
		static EncoderBC15 ret;
		return ret;
	}
	TS_PYAPI PyObject *pyEncoderBC15_new(const EncoderBC15 &ptr) {
		PYEncoderBC15 *ret = (PYEncoderBC15*)PyObject_New(PYEncoderBC15, &PYEncoderBC15_Type);
		new(&ret->ptr) EncoderBC15(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyEncoderBC15_new(EncoderBC15 &&ptr) {
		PYEncoderBC15 *ret = (PYEncoderBC15*)PyObject_New(PYEncoderBC15, &PYEncoderBC15_Type);
		new(&ret->ptr) EncoderBC15(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyEncoderBC15_init(PYEncoderBC15 *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) EncoderBC15();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC15::EncoderBC15(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyEncoderBC15_dealloc(PYEncoderBC15 *self) {
		self->ptr.~EncoderBC15();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyEncoderBC15_equalPtr(PYEncoderBC15 *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyEncoderBC15_clonePtr(PYEncoderBC15 *self, PyObject *args) {
		return pyEncoderBC15_new(self->ptr.clonePtr());
	}
	static PyObject *pyEncoderBC15_clearPtr(PYEncoderBC15 *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC15_destroyPtr(PYEncoderBC15 *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC15_acquirePtr(PYEncoderBC15 *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC15_unacquirePtr(PYEncoderBC15 *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC15_isValidPtr(PYEncoderBC15 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyEncoderBC15_isOwnerPtr(PYEncoderBC15 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyEncoderBC15_isConstPtr(PYEncoderBC15 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyEncoderBC15_getCountPtr(PYEncoderBC15 *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyEncoderBC15_getInternalPtr(PYEncoderBC15 *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *EncoderBC15_clear(PYEncoderBC15 *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC15::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC15_isCreated(PYEncoderBC15 *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((EncoderBC15::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC15::isCreated(): unknown arguments:\n(EncoderBC15.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC15_create(PYEncoderBC15 *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		static const char *kwlist[] = { "device", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &mode)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (EncoderBC15::Mode)mode));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "device", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				return PyLong_FromLong(self->ptr.create(device, (EncoderBC15::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC15::create(): unknown arguments:\n(const Device device, EncoderBC15.Mode mode) -> bool\n(const Device device, EncoderBC15.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC15_dispatch(PYEncoderBC15 *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "compute", "mode", "dest", "src", "dest_slice", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &dest_slice_, &src_slice_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC15::Mode)mode, dest, src, dest_slice, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO", (char**)kwlist, &compute_, &mode, &dest_, &src_, &src_slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC15::Mode)mode, dest, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO", (char**)kwlist, &compute_, &mode, &dest_, &src_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC15::Mode)mode, dest, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC15::dispatch(): unknown arguments:\n(Compute compute, EncoderBC15.Mode mode, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice) -> bool\n(Compute compute, EncoderBC15.Mode mode, Texture dest, Texture src, const Slice src_slice) -> bool\n(Compute compute, EncoderBC15.Mode mode, Texture dest, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyEncoderBC15_str(PYEncoderBC15 *self) {
		return PyUnicode_FromString(String::format("EncoderBC15 Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyEncoderBC15_bool(PYEncoderBC15 *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::EncoderBC67
	TS_PYAPI bool isPYEncoderBC67(PyObject *object) {
		return (object && Py_TYPE(object) == &PYEncoderBC67_Type);
	}
	TS_PYAPI EncoderBC67 &pyEncoderBC67_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYEncoderBC67_Type) return ((PYEncoderBC67*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "EncoderBC67_get(): can't get EncoderBC67 from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "EncoderBC67_get(): can't get EncoderBC67 from None");
		static EncoderBC67 ret;
		return ret;
	}
	TS_PYAPI PyObject *pyEncoderBC67_new(const EncoderBC67 &ptr) {
		PYEncoderBC67 *ret = (PYEncoderBC67*)PyObject_New(PYEncoderBC67, &PYEncoderBC67_Type);
		new(&ret->ptr) EncoderBC67(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyEncoderBC67_new(EncoderBC67 &&ptr) {
		PYEncoderBC67 *ret = (PYEncoderBC67*)PyObject_New(PYEncoderBC67, &PYEncoderBC67_Type);
		new(&ret->ptr) EncoderBC67(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyEncoderBC67_init(PYEncoderBC67 *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) EncoderBC67();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC67::EncoderBC67(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyEncoderBC67_dealloc(PYEncoderBC67 *self) {
		self->ptr.~EncoderBC67();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyEncoderBC67_equalPtr(PYEncoderBC67 *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyEncoderBC67_clonePtr(PYEncoderBC67 *self, PyObject *args) {
		return pyEncoderBC67_new(self->ptr.clonePtr());
	}
	static PyObject *pyEncoderBC67_clearPtr(PYEncoderBC67 *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC67_destroyPtr(PYEncoderBC67 *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC67_acquirePtr(PYEncoderBC67 *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC67_unacquirePtr(PYEncoderBC67 *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderBC67_isValidPtr(PYEncoderBC67 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyEncoderBC67_isOwnerPtr(PYEncoderBC67 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyEncoderBC67_isConstPtr(PYEncoderBC67 *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyEncoderBC67_getCountPtr(PYEncoderBC67 *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyEncoderBC67_getInternalPtr(PYEncoderBC67 *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *EncoderBC67_clear(PYEncoderBC67 *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC67::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC67_isCreated(PYEncoderBC67 *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((EncoderBC67::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC67::isCreated(): unknown arguments:\n(EncoderBC67.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC67_create(PYEncoderBC67 *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		static const char *kwlist[] = { "device", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &mode)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (EncoderBC67::Mode)mode));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "device", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				return PyLong_FromLong(self->ptr.create(device, (EncoderBC67::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC67::create(): unknown arguments:\n(const Device device, EncoderBC67.Mode mode) -> bool\n(const Device device, EncoderBC67.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderBC67_dispatch(PYEncoderBC67 *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		uint32_t components = 4;
		static const char *kwlist[] = { "compute", "mode", "dest", "src", "dest_slice", "src_slice", "components", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &dest_slice_, &src_slice_, &components)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC67::Mode)mode, dest, src, dest_slice, src_slice, components));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			uint32_t components = 4;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "src_slice", "components", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &src_slice_, &components)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC67::Mode)mode, dest, src, src_slice, components));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			uint32_t components = 4;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "components", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &components)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderBC67::Mode)mode, dest, src, components));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderBC67::dispatch(): unknown arguments:\n(Compute compute, EncoderBC67.Mode mode, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice, uint32_t components) -> bool\n(Compute compute, EncoderBC67.Mode mode, Texture dest, Texture src, const Slice src_slice, uint32_t components) -> bool\n(Compute compute, EncoderBC67.Mode mode, Texture dest, Texture src, uint32_t components) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyEncoderBC67_str(PYEncoderBC67 *self) {
		return PyUnicode_FromString(String::format("EncoderBC67 Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyEncoderBC67_bool(PYEncoderBC67 *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::EncoderASTC
	TS_PYAPI bool isPYEncoderASTC(PyObject *object) {
		return (object && Py_TYPE(object) == &PYEncoderASTC_Type);
	}
	TS_PYAPI EncoderASTC &pyEncoderASTC_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYEncoderASTC_Type) return ((PYEncoderASTC*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "EncoderASTC_get(): can't get EncoderASTC from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "EncoderASTC_get(): can't get EncoderASTC from None");
		static EncoderASTC ret;
		return ret;
	}
	TS_PYAPI PyObject *pyEncoderASTC_new(const EncoderASTC &ptr) {
		PYEncoderASTC *ret = (PYEncoderASTC*)PyObject_New(PYEncoderASTC, &PYEncoderASTC_Type);
		new(&ret->ptr) EncoderASTC(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyEncoderASTC_new(EncoderASTC &&ptr) {
		PYEncoderASTC *ret = (PYEncoderASTC*)PyObject_New(PYEncoderASTC, &PYEncoderASTC_Type);
		new(&ret->ptr) EncoderASTC(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyEncoderASTC_init(PYEncoderASTC *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) EncoderASTC();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderASTC::EncoderASTC(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyEncoderASTC_dealloc(PYEncoderASTC *self) {
		self->ptr.~EncoderASTC();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyEncoderASTC_equalPtr(PYEncoderASTC *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyEncoderASTC_clonePtr(PYEncoderASTC *self, PyObject *args) {
		return pyEncoderASTC_new(self->ptr.clonePtr());
	}
	static PyObject *pyEncoderASTC_clearPtr(PYEncoderASTC *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderASTC_destroyPtr(PYEncoderASTC *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderASTC_acquirePtr(PYEncoderASTC *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderASTC_unacquirePtr(PYEncoderASTC *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyEncoderASTC_isValidPtr(PYEncoderASTC *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyEncoderASTC_isOwnerPtr(PYEncoderASTC *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyEncoderASTC_isConstPtr(PYEncoderASTC *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyEncoderASTC_getCountPtr(PYEncoderASTC *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyEncoderASTC_getInternalPtr(PYEncoderASTC *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *EncoderASTC_clear(PYEncoderASTC *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderASTC::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderASTC_isCreated(PYEncoderASTC *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((EncoderASTC::Mode)mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderASTC::isCreated(): unknown arguments:\n(EncoderASTC.Mode mode) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderASTC_create(PYEncoderASTC *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		static const char *kwlist[] = { "device", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &mode)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (EncoderASTC::Mode)mode));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			static const char *kwlist[] = { "device", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &device_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				return PyLong_FromLong(self->ptr.create(device, (EncoderASTC::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderASTC::create(): unknown arguments:\n(const Device device, EncoderASTC.Mode mode) -> bool\n(const Device device, EncoderASTC.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *EncoderASTC_dispatch(PYEncoderASTC *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		uint32_t components = 4;
		static const char *kwlist[] = { "compute", "mode", "dest", "src", "dest_slice", "src_slice", "components", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &dest_slice_, &src_slice_, &components)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderASTC::Mode)mode, dest, src, dest_slice, src_slice, components));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			uint32_t components = 4;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "src_slice", "components", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &src_slice_, &components)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderASTC::Mode)mode, dest, src, src_slice, components));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			uint32_t components = 4;
			static const char *kwlist[] = { "compute", "mode", "dest", "src", "components", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO|I", (char**)kwlist, &compute_, &mode, &dest_, &src_, &components)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (EncoderASTC::Mode)mode, dest, src, components));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "EncoderASTC::dispatch(): unknown arguments:\n(Compute compute, EncoderASTC.Mode mode, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice, uint32_t components) -> bool\n(Compute compute, EncoderASTC.Mode mode, Texture dest, Texture src, const Slice src_slice, uint32_t components) -> bool\n(Compute compute, EncoderASTC.Mode mode, Texture dest, Texture src, uint32_t components) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyEncoderASTC_str(PYEncoderASTC *self) {
		return PyUnicode_FromString(String::format("EncoderASTC Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyEncoderASTC_bool(PYEncoderASTC *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::MeshModel
	static bool pyMeshModel_CreateCallback(const void *src, size_t size, bool owner, PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("(nni)", src, size, owner);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	TS_PYAPI bool isPYMeshModel(PyObject *object) {
		return (object && Py_TYPE(object) == &PYMeshModel_Type);
	}
	TS_PYAPI MeshModel &pyMeshModel_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYMeshModel_Type) return ((PYMeshModel*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "MeshModel_get(): can't get MeshModel from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "MeshModel_get(): can't get MeshModel from None");
		return *(MeshModel*)nullptr;
	}
	static int32_t pyMeshModel_init(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) MeshModel();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::MeshModel(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyMeshModel_dealloc(PYMeshModel *self) {
		self->ptr.~MeshModel();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *MeshModel_clear(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_isCreated(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getFlags(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getFlags());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getFlags(): unknown arguments:\n(void) -> MeshModel::Flags\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_hasFlag(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlag((MeshModel::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::hasFlag(): unknown arguments:\n(MeshModel.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_hasFlags(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.hasFlags((MeshModel::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::hasFlags(): unknown arguments:\n(MeshModel.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_load(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		PyObject *pipeline_ = nullptr;
		const char *name = nullptr;
		uint32_t flags = MeshModel::DefaultFlags;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "pipeline", "name", "flags", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOs|IO", (char**)kwlist, &device_, &pipeline_, &name, &flags, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYPipeline(pipeline_)) break;
			const Pipeline &pipeline = pyPipeline_get(pipeline_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.load(device, pipeline, name, (MeshModel::Flags)flags, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *pipeline_ = nullptr;
			PyObject *stream_ = nullptr;
			uint32_t flags = MeshModel::DefaultFlags;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "pipeline", "stream", "flags", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|IO", (char**)kwlist, &device_, &pipeline_, &stream_, &flags, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYPipeline(pipeline_)) break;
				const Pipeline &pipeline = pyPipeline_get(pipeline_);
				if(!isPYStream(stream_)) break;
				Stream &stream = pyStream_get(stream_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.load(device, pipeline, stream, (MeshModel::Flags)flags, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::load(): unknown arguments:\n(const Device device, const Pipeline pipeline, const char* name, MeshModel.Flags flags, Async* async) -> bool\n(const Device device, const Pipeline pipeline, Stream stream, MeshModel.Flags flags, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_create(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		PyObject *pipeline_ = nullptr;
		const char *name = nullptr;
		uint32_t flags = MeshModel::DefaultFlags;
		static const char *kwlist[] = { "device", "pipeline", "name", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOs|I", (char**)kwlist, &device_, &pipeline_, &name, &flags)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYPipeline(pipeline_)) break;
			const Pipeline &pipeline = pyPipeline_get(pipeline_);
			return PyLong_FromLong(self->ptr.create(device, pipeline, name, (MeshModel::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *pipeline_ = nullptr;
			PyObject *mesh_ = nullptr;
			uint32_t flags = MeshModel::DefaultFlags;
			static const char *kwlist[] = { "device", "pipeline", "mesh", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|I", (char**)kwlist, &device_, &pipeline_, &mesh_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYPipeline(pipeline_)) break;
				const Pipeline &pipeline = pyPipeline_get(pipeline_);
				if(!isPYMesh(mesh_)) break;
				const Mesh &mesh = pyMesh_get(mesh_);
				return PyLong_FromLong(self->ptr.create(device, pipeline, mesh, (MeshModel::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *pipeline_ = nullptr;
			PyObject *geometry_ = nullptr;
			uint32_t flags = MeshModel::DefaultFlags;
			static const char *kwlist[] = { "device", "pipeline", "geometry", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|I", (char**)kwlist, &device_, &pipeline_, &geometry_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYPipeline(pipeline_)) break;
				const Pipeline &pipeline = pyPipeline_get(pipeline_);
				if(!isPYMeshGeometry(geometry_)) break;
				const MeshGeometry &geometry = pyMeshGeometry_get(geometry_);
				return PyLong_FromLong(self->ptr.create(device, pipeline, geometry, (MeshModel::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			PyObject *pipeline_ = nullptr;
			PyObject *geometries_ = nullptr;
			uint32_t flags = MeshModel::DefaultFlags;
			static const char *kwlist[] = { "device", "pipeline", "geometries", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|I", (char**)kwlist, &device_, &pipeline_, &geometries_, &flags)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYPipeline(pipeline_)) break;
				const Pipeline &pipeline = pyPipeline_get(pipeline_);
				if(!isPYArray(geometries_)) break;
				Array<MeshGeometry> geometries; Array<PyObject*> geometries__; pyArray_get(geometries_, geometries__);
				for(PyObject *object : geometries__) geometries.append(pyMeshGeometry_get(object));
				return PyLong_FromLong(self->ptr.create(device, pipeline, geometries, (MeshModel::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::create(): unknown arguments:\n(const Device device, const Pipeline pipeline, const char* name, MeshModel.Flags flags) -> bool\n(const Device device, const Pipeline pipeline, const Mesh mesh, MeshModel.Flags flags) -> bool\n(const Device device, const Pipeline pipeline, const MeshGeometry geometry, MeshModel.Flags flags) -> bool\n(const Device device, const Pipeline pipeline, Array<MeshGeometry> geometries, MeshModel.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_setVertexBufferCallback(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyMeshModel_CreateCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setVertexBufferCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::setVertexBufferCallback(): unknown arguments:\n(const MeshModel.CreateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_setIndexBufferCallback(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyMeshModel_CreateCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setIndexBufferCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::setIndexBufferCallback(): unknown arguments:\n(const MeshModel.CreateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_setMeshBufferCallback(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *func_ = nullptr;
		static const char *kwlist[] = { "func", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &func_)) {
			if(!PyCallable_Check(func_)) break;
			auto func = makeFunction(pyMeshModel_CreateCallback);
			func.setArg3(func_);
			Py_INCREF(func_);
			self->ptr.setMeshBufferCallback(func);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::setMeshBufferCallback(): unknown arguments:\n(const MeshModel.CreateCallback func) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_setBuffers(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *command_ = nullptr;
		uint32_t index = 0;
		PyObject *pipeline_ = nullptr;
		static const char *kwlist[] = { "command", "index", "pipeline", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IO", (char**)kwlist, &command_, &index, &pipeline_)) {
			if(!isPYCommand(command_)) break;
			Command &command = pyCommand_get(command_);
			const Pipeline *pipeline = (pipeline_) ? &pyPipeline_get(pipeline_) : nullptr;
			self->ptr.setBuffers(command, index, pipeline);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::setBuffers(): unknown arguments:\n(Command command, uint32_t index, const Pipeline* pipeline) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_draw(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *command_ = nullptr;
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "command", "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII", (char**)kwlist, &command_, &geometry, &material)) {
			if(!isPYCommand(command_)) break;
			Command &command = pyCommand_get(command_);
			self->ptr.draw(command, geometry, material);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			uint32_t geometry = {};
			static const char *kwlist[] = { "command", "geometry", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI", (char**)kwlist, &command_, &geometry)) {
				if(!isPYCommand(command_)) break;
				Command &command = pyCommand_get(command_);
				self->ptr.draw(command, geometry);
				Py_RETURN_NONE;
			}
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			static const char *kwlist[] = { "command", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &command_)) {
				if(!isPYCommand(command_)) break;
				Command &command = pyCommand_get(command_);
				self->ptr.draw(command);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::draw(): unknown arguments:\n(Command command, uint32_t geometry, uint32_t material) -> void\n(Command command, uint32_t geometry) -> void\n(Command command) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_drawInstanced(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		PyObject *command_ = nullptr;
		uint32_t geometry = {};
		uint32_t material = {};
		uint32_t num_instances = {};
		uint32_t base_instance = {};
		static const char *kwlist[] = { "command", "geometry", "material", "num_instances", "base_instance", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIII", (char**)kwlist, &command_, &geometry, &material, &num_instances, &base_instance)) {
			if(!isPYCommand(command_)) break;
			Command &command = pyCommand_get(command_);
			self->ptr.drawInstanced(command, geometry, material, num_instances, base_instance);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			uint32_t geometry = {};
			uint32_t num_instances = {};
			uint32_t base_instance = 0;
			static const char *kwlist[] = { "command", "geometry", "num_instances", "base_instance", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII|I", (char**)kwlist, &command_, &geometry, &num_instances, &base_instance)) {
				if(!isPYCommand(command_)) break;
				Command &command = pyCommand_get(command_);
				self->ptr.drawInstanced(command, geometry, num_instances, base_instance);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::drawInstanced(): unknown arguments:\n(Command command, uint32_t geometry, uint32_t material, uint32_t num_instances, uint32_t base_instance) -> void\n(Command command, uint32_t geometry, uint32_t num_instances, uint32_t base_instance) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumVertices(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumVertices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumVertexBuffers(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumVertexBuffers());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumVertexBuffers(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getVertexBufferStride(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getVertexBufferStride(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getVertexBufferStride(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getVertexBufferOffset(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromSize_t(self->ptr.getVertexBufferOffset(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getVertexBufferOffset(): unknown arguments:\n(uint32_t index) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getVertexBuffer(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getVertexBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getVertexBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumIndices(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumIndices());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumIndices(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getIndexFormat(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getIndexFormat());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getIndexFormat(): unknown arguments:\n(void) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getIndexBuffer(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getIndexBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getIndexBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumMeshlets(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMeshlets());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumMeshlets(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getMeshletBuffer(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getMeshletBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getMeshletBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumGeometries(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumGeometries(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumGeometryIndices(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometryIndices(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumGeometryIndices(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumGeometryVertices(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometryVertices(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumGeometryVertices(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumGeometryMeshlets(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumGeometryMeshlets(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumGeometryMeshlets(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getGeometryBaseIndex(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getGeometryBaseIndex(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getGeometryBaseIndex(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getGeometryBaseVertex(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getGeometryBaseVertex(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getGeometryBaseVertex(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getGeometryBaseMeshlet(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getGeometryBaseMeshlet(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getGeometryBaseMeshlet(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumMaterials(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		static const char *kwlist[] = { "geometry", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &geometry)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMaterials(geometry));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumMaterials(): unknown arguments:\n(uint32_t geometry) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumMaterialIndices(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMaterialIndices(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumMaterialIndices(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumMaterialVertices(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMaterialVertices(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumMaterialVertices(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getNumMaterialMeshlets(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumMaterialMeshlets(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getNumMaterialMeshlets(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getMaterialBaseIndex(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getMaterialBaseIndex(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getMaterialBaseIndex(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getMaterialBaseVertex(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getMaterialBaseVertex(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getMaterialBaseVertex(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getMaterialBaseMeshlet(PYMeshModel *self, PyObject *args, PyObject *kwargs) {
		uint32_t geometry = {};
		uint32_t material = {};
		static const char *kwlist[] = { "geometry", "material", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &geometry, &material)) {
			return PyLong_FromUnsignedLong(self->ptr.getMaterialBaseMeshlet(geometry, material));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getMaterialBaseMeshlet(): unknown arguments:\n(uint32_t geometry, uint32_t material) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_getMemory(PYMeshModel *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(self->ptr.getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshModel::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *MeshModel_get_flags(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getFlags());
	}
	static PyObject *MeshModel_get_num_vertices(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumVertices());
	}
	static PyObject *MeshModel_get_num_vertex_buffers(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumVertexBuffers());
	}
	static PyObject *MeshModel_get_vertex_buffer(PYMeshModel *self, void *offset) {
		return pyBuffer_new(self->ptr.getVertexBuffer());
	}
	static PyObject *MeshModel_get_num_indices(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumIndices());
	}
	static PyObject *MeshModel_get_index_format(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getIndexFormat());
	}
	static PyObject *MeshModel_get_index_buffer(PYMeshModel *self, void *offset) {
		return pyBuffer_new(self->ptr.getIndexBuffer());
	}
	static PyObject *MeshModel_get_num_meshlets(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumMeshlets());
	}
	static PyObject *MeshModel_get_meshlet_buffer(PYMeshModel *self, void *offset) {
		return pyBuffer_new(self->ptr.getMeshletBuffer());
	}
	static PyObject *MeshModel_get_num_geometries(PYMeshModel *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumGeometries());
	}
	static PyObject *MeshModel_get_memory(PYMeshModel *self, void *offset) {
		return PyLong_FromSize_t(self->ptr.getMemory());
	}
	static PyObject *pyMeshModel_str(PYMeshModel *self) {
		return PyUnicode_FromString("MeshModel");
	}
	static int32_t pyMeshModel_bool(PYMeshModel *self) {
		return 1;
	}
	
	// Tellusim::SeparableFilter
	TS_PYAPI bool isPYSeparableFilter(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSeparableFilter_Type);
	}
	TS_PYAPI SeparableFilter &pySeparableFilter_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSeparableFilter_Type) return ((PYSeparableFilter*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SeparableFilter_get(): can't get SeparableFilter from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SeparableFilter_get(): can't get SeparableFilter from None");
		static SeparableFilter ret;
		return ret;
	}
	TS_PYAPI PyObject *pySeparableFilter_new(const SeparableFilter &ptr) {
		PYSeparableFilter *ret = (PYSeparableFilter*)PyObject_New(PYSeparableFilter, &PYSeparableFilter_Type);
		new(&ret->ptr) SeparableFilter(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySeparableFilter_new(SeparableFilter &&ptr) {
		PYSeparableFilter *ret = (PYSeparableFilter*)PyObject_New(PYSeparableFilter, &PYSeparableFilter_Type);
		new(&ret->ptr) SeparableFilter(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pySeparableFilter_init(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) SeparableFilter();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::SeparableFilter(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySeparableFilter_dealloc(PYSeparableFilter *self) {
		self->ptr.~SeparableFilter();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySeparableFilter_equalPtr(PYSeparableFilter *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySeparableFilter_clonePtr(PYSeparableFilter *self, PyObject *args) {
		return pySeparableFilter_new(self->ptr.clonePtr());
	}
	static PyObject *pySeparableFilter_clearPtr(PYSeparableFilter *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySeparableFilter_destroyPtr(PYSeparableFilter *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySeparableFilter_acquirePtr(PYSeparableFilter *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySeparableFilter_unacquirePtr(PYSeparableFilter *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySeparableFilter_isValidPtr(PYSeparableFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySeparableFilter_isOwnerPtr(PYSeparableFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySeparableFilter_isConstPtr(PYSeparableFilter *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySeparableFilter_getCountPtr(PYSeparableFilter *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySeparableFilter_getInternalPtr(PYSeparableFilter *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *SeparableFilter_clear(PYSeparableFilter *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_isCreated(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t size = {};
		static const char *kwlist[] = { "format", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &format, &size)) {
			return PyLong_FromLong(self->ptr.isCreated((Format)format, size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::isCreated(): unknown arguments:\n(Format format, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setInputSource(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		const char *src = nullptr;
		static const char *kwlist[] = { "mode", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &mode, &src)) {
			self->ptr.setInputSource((SeparableFilter::Mode)mode, src);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setInputSource(): unknown arguments:\n(SeparableFilter.Mode mode, const char* src) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_getInputSource(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyUnicode_FromString(self->ptr.getInputSource((SeparableFilter::Mode)mode).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::getInputSource(): unknown arguments:\n(SeparableFilter.Mode mode) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setOutputSource(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		const char *src = nullptr;
		static const char *kwlist[] = { "mode", "src", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &mode, &src)) {
			self->ptr.setOutputSource((SeparableFilter::Mode)mode, src);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setOutputSource(): unknown arguments:\n(SeparableFilter.Mode mode, const char* src) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_getOutputSource(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyUnicode_FromString(self->ptr.getOutputSource((SeparableFilter::Mode)mode).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::getOutputSource(): unknown arguments:\n(SeparableFilter.Mode mode) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_create(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t format = 0;
		uint32_t size = {};
		uint32_t flags = SeparableFilter::DefaultFlags;
		static const char *kwlist[] = { "device", "format", "size", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII|I", (char**)kwlist, &device_, &format, &size, &flags)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			return PyLong_FromLong(self->ptr.create(device, (Format)format, size, (SeparableFilter::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::create(): unknown arguments:\n(const Device device, Format format, uint32_t size, SeparableFilter.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setWeights(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		PyObject *weights_ = nullptr;
		int32_t normalize = false;
		static const char *kwlist[] = { "mode", "weights", "normalize", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|i", (char**)kwlist, &mode, &weights_, &normalize)) {
			if(!isPYArray(weights_)) break;
			Array<Vector4f> weights; Array<PyObject*> weights__; pyArray_get(weights_, weights__);
			for(PyObject *object : weights__) weights.append(pyVector4f_get(object));
			self->ptr.setWeights((SeparableFilter::Mode)mode, weights, (normalize != 0));
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t mode = 0;
			PyObject *weights_ = nullptr;
			int32_t normalize = false;
			static const char *kwlist[] = { "mode", "weights", "normalize", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO|i", (char**)kwlist, &mode, &weights_, &normalize)) {
				if(!isPYArray(weights_)) break;
				Array<float32_t> weights; pyArray_get(weights_, weights);
				self->ptr.setWeights((SeparableFilter::Mode)mode, weights, (normalize != 0));
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setWeights(): unknown arguments:\n(SeparableFilter.Mode mode, Array<Vector4f> weights, bool normalize) -> void\n(SeparableFilter.Mode mode, Array<float32_t> weights, bool normalize) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setGaussianWeights(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		PyObject *sigma_ = nullptr;
		static const char *kwlist[] = { "size", "sigma", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "IO", (char**)kwlist, &size, &sigma_)) {
			if(!isPYVector4f(sigma_)) break;
			const Vector4f &sigma = pyVector4f_get(sigma_);
			self->ptr.setGaussianWeights(size, sigma);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			uint32_t size = {};
			float32_t sigma = {};
			static const char *kwlist[] = { "size", "sigma", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "If", (char**)kwlist, &size, &sigma)) {
				self->ptr.setGaussianWeights(size, sigma);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setGaussianWeights(): unknown arguments:\n(uint32_t size, const Vector4f sigma) -> void\n(uint32_t size, float32_t sigma) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setSobelXWeights(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setSobelXWeights(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setSobelXWeights(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setSobelYWeights(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setSobelYWeights(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setSobelYWeights(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_setBoxWeights(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		uint32_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &size)) {
			self->ptr.setBoxWeights(size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::setBoxWeights(): unknown arguments:\n(uint32_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SeparableFilter_dispatch(PYSeparableFilter *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		uint32_t size = {};
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		PyObject *values_ = nullptr;
		static const char *kwlist[] = { "compute", "mode", "size", "dest", "src", "dest_slice", "src_slice", "values", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOOOO|O", (char**)kwlist, &compute_, &mode, &size, &dest_, &src_, &dest_slice_, &src_slice_, &values_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			const Vector4f &values = pyVector4f_get(values_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (SeparableFilter::Mode)mode, size, dest, src, dest_slice, src_slice, values));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			uint32_t size = {};
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			PyObject *values_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "size", "dest", "src", "src_slice", "values", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOOO|O", (char**)kwlist, &compute_, &mode, &size, &dest_, &src_, &src_slice_, &values_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				const Vector4f &values = pyVector4f_get(values_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (SeparableFilter::Mode)mode, size, dest, src, src_slice, values));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			uint32_t size = {};
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *values_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "size", "dest", "src", "values", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOO|O", (char**)kwlist, &compute_, &mode, &size, &dest_, &src_, &values_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				const Vector4f &values = pyVector4f_get(values_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (SeparableFilter::Mode)mode, size, dest, src, values));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SeparableFilter::dispatch(): unknown arguments:\n(Compute compute, SeparableFilter.Mode mode, uint32_t size, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice, const Vector4f values) -> bool\n(Compute compute, SeparableFilter.Mode mode, uint32_t size, Texture dest, Texture src, const Slice src_slice, const Vector4f values) -> bool\n(Compute compute, SeparableFilter.Mode mode, uint32_t size, Texture dest, Texture src, const Vector4f values) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pySeparableFilter_str(PYSeparableFilter *self) {
		return PyUnicode_FromString(String::format("SeparableFilter Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySeparableFilter_bool(PYSeparableFilter *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::PrefixScan
	TS_PYAPI bool isPYPrefixScan(PyObject *object) {
		return (object && Py_TYPE(object) == &PYPrefixScan_Type);
	}
	TS_PYAPI PrefixScan &pyPrefixScan_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYPrefixScan_Type) return ((PYPrefixScan*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "PrefixScan_get(): can't get PrefixScan from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "PrefixScan_get(): can't get PrefixScan from None");
		static PrefixScan ret;
		return ret;
	}
	TS_PYAPI PyObject *pyPrefixScan_new(const PrefixScan &ptr) {
		PYPrefixScan *ret = (PYPrefixScan*)PyObject_New(PYPrefixScan, &PYPrefixScan_Type);
		new(&ret->ptr) PrefixScan(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyPrefixScan_new(PrefixScan &&ptr) {
		PYPrefixScan *ret = (PYPrefixScan*)PyObject_New(PYPrefixScan, &PYPrefixScan_Type);
		new(&ret->ptr) PrefixScan(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyPrefixScan_init(PYPrefixScan *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) PrefixScan();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::PrefixScan(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyPrefixScan_dealloc(PYPrefixScan *self) {
		self->ptr.~PrefixScan();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyPrefixScan_equalPtr(PYPrefixScan *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyPrefixScan_clonePtr(PYPrefixScan *self, PyObject *args) {
		return pyPrefixScan_new(self->ptr.clonePtr());
	}
	static PyObject *pyPrefixScan_clearPtr(PYPrefixScan *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPrefixScan_destroyPtr(PYPrefixScan *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPrefixScan_acquirePtr(PYPrefixScan *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPrefixScan_unacquirePtr(PYPrefixScan *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyPrefixScan_isValidPtr(PYPrefixScan *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyPrefixScan_isOwnerPtr(PYPrefixScan *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyPrefixScan_isConstPtr(PYPrefixScan *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyPrefixScan_getCountPtr(PYPrefixScan *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyPrefixScan_getInternalPtr(PYPrefixScan *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *PrefixScan_clear(PYPrefixScan *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_isCreated(PYPrefixScan *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.isCreated((PrefixScan::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::isCreated(): unknown arguments:\n(PrefixScan.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_getGroupSize(PYPrefixScan *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_getScanElements(PYPrefixScan *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getScanElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::getScanElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_getMaxElements(PYPrefixScan *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::getMaxElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_getMaxRegions(PYPrefixScan *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::getMaxRegions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_create(PYPrefixScan *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		uint32_t groups = 256;
		uint32_t regions = 1;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "mode", "groups", "regions", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|IIO", (char**)kwlist, &device_, &mode, &groups, &regions, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (PrefixScan::Mode)mode, groups, regions, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			uint32_t groups = 256;
			uint32_t regions = 1;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "flags", "groups", "regions", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OI|IIO", (char**)kwlist, &device_, &flags, &groups, &regions, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.create(device, (PrefixScan::Flags)flags, groups, regions, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::create(): unknown arguments:\n(const Device device, PrefixScan.Mode mode, uint32_t groups, uint32_t regions, Async* async) -> bool\n(const Device device, PrefixScan.Flags flags, uint32_t groups, uint32_t regions, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_dispatch(PYPrefixScan *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		uint32_t count = {};
		const uint32_t *offsets = nullptr;
		const uint32_t *sizes = nullptr;
		uint32_t flags = PrefixScan::FlagNone;
		static const char *kwlist[] = { "compute", "data", "count", "offsets", "sizes", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOInn|I", (char**)kwlist, &compute_, &data_, &count, &offsets, &sizes, &flags)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			return PyLong_FromLong(self->ptr.dispatch(compute, data, count, offsets, sizes, (PrefixScan::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t offset = {};
			uint32_t size = {};
			static const char *kwlist[] = { "compute", "data", "offset", "size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOII", (char**)kwlist, &compute_, &data_, &offset, &size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				return PyLong_FromLong(self->ptr.dispatch(compute, data, offset, size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::dispatch(): unknown arguments:\n(Compute compute, Buffer data, uint32_t count, const uint32_t* offsets, const uint32_t* sizes, PrefixScan.Flags flags) -> bool\n(Compute compute, Buffer data, uint32_t offset, uint32_t size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_dispatchIndirect(PYPrefixScan *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		PyObject *count_ = nullptr;
		PyObject *dispatch_ = nullptr;
		uint32_t count_offset = {};
		uint32_t dispatch_offset = {};
		uint32_t flags = PrefixScan::FlagNone;
		uint32_t max_size = Maxu32;
		static const char *kwlist[] = { "compute", "data", "count", "dispatch", "count_offset", "dispatch_offset", "flags", "max_size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOII|II", (char**)kwlist, &compute_, &data_, &count_, &dispatch_, &count_offset, &dispatch_offset, &flags, &max_size)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			if(!isPYBuffer(count_)) break;
			Buffer &count = pyBuffer_get(count_);
			if(!isPYBuffer(dispatch_)) break;
			Buffer &dispatch = pyBuffer_get(dispatch_);
			return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, count_offset, dispatch_offset, (PrefixScan::Flags)flags, max_size));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t count = {};
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = PrefixScan::FlagNone;
			uint32_t max_size = Maxu32;
			static const char *kwlist[] = { "compute", "data", "count", "dispatch", "offset", "flags", "max_size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIOI|II", (char**)kwlist, &compute_, &data_, &count, &dispatch_, &offset, &flags, &max_size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, offset, (PrefixScan::Flags)flags, max_size));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = PrefixScan::FlagNone;
			uint32_t max_size = Maxu32;
			static const char *kwlist[] = { "compute", "data", "dispatch", "offset", "flags", "max_size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI|II", (char**)kwlist, &compute_, &data_, &dispatch_, &offset, &flags, &max_size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, dispatch, offset, (PrefixScan::Flags)flags, max_size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "PrefixScan::dispatchIndirect(): unknown arguments:\n(Compute compute, Buffer data, Buffer count, Buffer dispatch, uint32_t count_offset, uint32_t dispatch_offset, PrefixScan.Flags flags, uint32_t max_size) -> bool\n(Compute compute, Buffer data, uint32_t count, Buffer dispatch, uint32_t offset, PrefixScan.Flags flags, uint32_t max_size) -> bool\n(Compute compute, Buffer data, Buffer dispatch, uint32_t offset, PrefixScan.Flags flags, uint32_t max_size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PrefixScan_get_group_size(PYPrefixScan *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *PrefixScan_get_scan_elements(PYPrefixScan *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getScanElements());
	}
	static PyObject *PrefixScan_get_max_elements(PYPrefixScan *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxElements());
	}
	static PyObject *PrefixScan_get_max_regions(PYPrefixScan *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
	}
	static PyObject *pyPrefixScan_str(PYPrefixScan *self) {
		return PyUnicode_FromString(String::format("PrefixScan Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyPrefixScan_bool(PYPrefixScan *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::PrefixScan::DispatchParameters
	TS_PYAPI bool isPYPrefixScanDispatchParameters(PyObject *object) {
		return (object && Py_TYPE(object) == &PYPrefixScanDispatchParameters_Type);
	}
	TS_PYAPI PrefixScan::DispatchParameters &pyPrefixScanDispatchParameters_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYPrefixScanDispatchParameters_Type) return ((PYPrefixScanDispatchParameters*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "PrefixScanDispatchParameters_get(): can't get PrefixScanDispatchParameters from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "PrefixScanDispatchParameters_get(): can't get PrefixScanDispatchParameters from None");
		static PrefixScan::DispatchParameters ret;
		return ret;
	}
	TS_PYAPI PyObject *pyPrefixScanDispatchParameters_new(const PrefixScan::DispatchParameters &ptr) {
		PYPrefixScanDispatchParameters *ret = (PYPrefixScanDispatchParameters*)PyObject_New(PYPrefixScanDispatchParameters, &PYPrefixScanDispatchParameters_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyPrefixScanDispatchParameters_buffer(PYPrefixScanDispatchParameters *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(PrefixScan::DispatchParameters);
			view->itemsize = sizeof(PrefixScan::DispatchParameters);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::RadixSort
	TS_PYAPI bool isPYRadixSort(PyObject *object) {
		return (object && Py_TYPE(object) == &PYRadixSort_Type);
	}
	TS_PYAPI RadixSort &pyRadixSort_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYRadixSort_Type) return ((PYRadixSort*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "RadixSort_get(): can't get RadixSort from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "RadixSort_get(): can't get RadixSort from None");
		static RadixSort ret;
		return ret;
	}
	TS_PYAPI PyObject *pyRadixSort_new(const RadixSort &ptr) {
		PYRadixSort *ret = (PYRadixSort*)PyObject_New(PYRadixSort, &PYRadixSort_Type);
		new(&ret->ptr) RadixSort(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyRadixSort_new(RadixSort &&ptr) {
		PYRadixSort *ret = (PYRadixSort*)PyObject_New(PYRadixSort, &PYRadixSort_Type);
		new(&ret->ptr) RadixSort(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyRadixSort_init(PYRadixSort *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) RadixSort();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::RadixSort(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyRadixSort_dealloc(PYRadixSort *self) {
		self->ptr.~RadixSort();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyRadixSort_equalPtr(PYRadixSort *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyRadixSort_clonePtr(PYRadixSort *self, PyObject *args) {
		return pyRadixSort_new(self->ptr.clonePtr());
	}
	static PyObject *pyRadixSort_clearPtr(PYRadixSort *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyRadixSort_destroyPtr(PYRadixSort *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyRadixSort_acquirePtr(PYRadixSort *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyRadixSort_unacquirePtr(PYRadixSort *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyRadixSort_isValidPtr(PYRadixSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyRadixSort_isOwnerPtr(PYRadixSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyRadixSort_isConstPtr(PYRadixSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyRadixSort_getCountPtr(PYRadixSort *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyRadixSort_getInternalPtr(PYRadixSort *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *RadixSort_clear(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_isCreated(PYRadixSort *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.isCreated((RadixSort::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::isCreated(): unknown arguments:\n(RadixSort.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getDataSize(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDataSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getDataSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getGroupSize(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getSortElements(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSortElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getSortElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getUpdateElements(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getUpdateElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getUpdateElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getMaxElements(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getMaxElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getMaxRegions(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getMaxRegions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getPrefixScan(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyPrefixScan_new(self->ptr.getPrefixScan());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getPrefixScan(): unknown arguments:\n(void) -> PrefixScan\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_getDataBuffer(PYRadixSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getDataBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::getDataBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_create(PYRadixSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		PyObject *scan_ = nullptr;
		uint32_t size = {};
		uint32_t groups = 256;
		uint32_t regions = 1;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "mode", "scan", "size", "groups", "regions", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOI|IIO", (char**)kwlist, &device_, &mode, &scan_, &size, &groups, &regions, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYPrefixScan(scan_)) break;
			PrefixScan &scan = pyPrefixScan_get(scan_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (RadixSort::Mode)mode, scan, size, groups, regions, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			PyObject *scan_ = nullptr;
			uint32_t size = {};
			uint32_t groups = 256;
			uint32_t regions = 1;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "flags", "scan", "size", "groups", "regions", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOI|IIO", (char**)kwlist, &device_, &flags, &scan_, &size, &groups, &regions, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYPrefixScan(scan_)) break;
				PrefixScan &scan = pyPrefixScan_get(scan_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.create(device, (RadixSort::Flags)flags, scan, size, groups, regions, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::create(): unknown arguments:\n(const Device device, RadixSort.Mode mode, PrefixScan scan, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n(const Device device, RadixSort.Flags flags, PrefixScan scan, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_dispatch(PYRadixSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		uint32_t count = {};
		const uint32_t *keys_offsets = nullptr;
		const uint32_t *data_offsets = nullptr;
		const uint32_t *sizes = nullptr;
		uint32_t flags = RadixSort::FlagNone;
		uint32_t bits = 32;
		static const char *kwlist[] = { "compute", "data", "count", "keys_offsets", "data_offsets", "sizes", "flags", "bits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOInnn|II", (char**)kwlist, &compute_, &data_, &count, &keys_offsets, &data_offsets, &sizes, &flags, &bits)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			return PyLong_FromLong(self->ptr.dispatch(compute, data, count, keys_offsets, data_offsets, sizes, (RadixSort::Flags)flags, bits));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t keys_offset = {};
			uint32_t data_offset = {};
			uint32_t size = {};
			uint32_t flags = RadixSort::FlagNone;
			uint32_t bits = 32;
			static const char *kwlist[] = { "compute", "data", "keys_offset", "data_offset", "size", "flags", "bits", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIII|II", (char**)kwlist, &compute_, &data_, &keys_offset, &data_offset, &size, &flags, &bits)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				return PyLong_FromLong(self->ptr.dispatch(compute, data, keys_offset, data_offset, size, (RadixSort::Flags)flags, bits));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::dispatch(): unknown arguments:\n(Compute compute, Buffer data, uint32_t count, const uint32_t* keys_offsets, const uint32_t* data_offsets, const uint32_t* sizes, RadixSort.Flags flags, uint32_t bits) -> bool\n(Compute compute, Buffer data, uint32_t keys_offset, uint32_t data_offset, uint32_t size, RadixSort.Flags flags, uint32_t bits) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_dispatchIndirect(PYRadixSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		PyObject *count_ = nullptr;
		PyObject *dispatch_ = nullptr;
		uint32_t count_offset = {};
		uint32_t dispatch_offset = {};
		uint32_t flags = RadixSort::FlagNone;
		uint32_t bits = 32;
		uint32_t max_size = Maxu32;
		static const char *kwlist[] = { "compute", "data", "count", "dispatch", "count_offset", "dispatch_offset", "flags", "bits", "max_size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOII|III", (char**)kwlist, &compute_, &data_, &count_, &dispatch_, &count_offset, &dispatch_offset, &flags, &bits, &max_size)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			if(!isPYBuffer(count_)) break;
			Buffer &count = pyBuffer_get(count_);
			if(!isPYBuffer(dispatch_)) break;
			Buffer &dispatch = pyBuffer_get(dispatch_);
			return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, count_offset, dispatch_offset, (RadixSort::Flags)flags, bits, max_size));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t count = {};
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = RadixSort::FlagNone;
			uint32_t bits = 32;
			uint32_t max_size = Maxu32;
			static const char *kwlist[] = { "compute", "data", "count", "dispatch", "offset", "flags", "bits", "max_size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIOI|III", (char**)kwlist, &compute_, &data_, &count, &dispatch_, &offset, &flags, &bits, &max_size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, offset, (RadixSort::Flags)flags, bits, max_size));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = RadixSort::FlagNone;
			uint32_t bits = 32;
			uint32_t max_size = Maxu32;
			static const char *kwlist[] = { "compute", "data", "dispatch", "offset", "flags", "bits", "max_size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI|III", (char**)kwlist, &compute_, &data_, &dispatch_, &offset, &flags, &bits, &max_size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, dispatch, offset, (RadixSort::Flags)flags, bits, max_size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "RadixSort::dispatchIndirect(): unknown arguments:\n(Compute compute, Buffer data, Buffer count, Buffer dispatch, uint32_t count_offset, uint32_t dispatch_offset, RadixSort.Flags flags, uint32_t bits, uint32_t max_size) -> bool\n(Compute compute, Buffer data, uint32_t count, Buffer dispatch, uint32_t offset, RadixSort.Flags flags, uint32_t bits, uint32_t max_size) -> bool\n(Compute compute, Buffer data, Buffer dispatch, uint32_t offset, RadixSort.Flags flags, uint32_t bits, uint32_t max_size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *RadixSort_get_data_size(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDataSize());
	}
	static PyObject *RadixSort_get_group_size(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *RadixSort_get_sort_elements(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSortElements());
	}
	static PyObject *RadixSort_get_update_elements(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getUpdateElements());
	}
	static PyObject *RadixSort_get_max_elements(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxElements());
	}
	static PyObject *RadixSort_get_max_regions(PYRadixSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
	}
	static PyObject *RadixSort_get_prefix_scan(PYRadixSort *self, void *offset) {
		return pyPrefixScan_new(self->ptr.getPrefixScan());
	}
	static PyObject *RadixSort_get_data_buffer(PYRadixSort *self, void *offset) {
		return pyBuffer_new(self->ptr.getDataBuffer());
	}
	static PyObject *pyRadixSort_str(PYRadixSort *self) {
		return PyUnicode_FromString(String::format("RadixSort Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyRadixSort_bool(PYRadixSort *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::RadixSort::DispatchParameters
	TS_PYAPI bool isPYRadixSortDispatchParameters(PyObject *object) {
		return (object && Py_TYPE(object) == &PYRadixSortDispatchParameters_Type);
	}
	TS_PYAPI RadixSort::DispatchParameters &pyRadixSortDispatchParameters_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYRadixSortDispatchParameters_Type) return ((PYRadixSortDispatchParameters*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "RadixSortDispatchParameters_get(): can't get RadixSortDispatchParameters from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "RadixSortDispatchParameters_get(): can't get RadixSortDispatchParameters from None");
		static RadixSort::DispatchParameters ret;
		return ret;
	}
	TS_PYAPI PyObject *pyRadixSortDispatchParameters_new(const RadixSort::DispatchParameters &ptr) {
		PYRadixSortDispatchParameters *ret = (PYRadixSortDispatchParameters*)PyObject_New(PYRadixSortDispatchParameters, &PYRadixSortDispatchParameters_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyRadixSortDispatchParameters_buffer(PYRadixSortDispatchParameters *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(RadixSort::DispatchParameters);
			view->itemsize = sizeof(RadixSort::DispatchParameters);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::BitonicSort
	TS_PYAPI bool isPYBitonicSort(PyObject *object) {
		return (object && Py_TYPE(object) == &PYBitonicSort_Type);
	}
	TS_PYAPI BitonicSort &pyBitonicSort_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYBitonicSort_Type) return ((PYBitonicSort*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "BitonicSort_get(): can't get BitonicSort from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "BitonicSort_get(): can't get BitonicSort from None");
		static BitonicSort ret;
		return ret;
	}
	TS_PYAPI PyObject *pyBitonicSort_new(const BitonicSort &ptr) {
		PYBitonicSort *ret = (PYBitonicSort*)PyObject_New(PYBitonicSort, &PYBitonicSort_Type);
		new(&ret->ptr) BitonicSort(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyBitonicSort_new(BitonicSort &&ptr) {
		PYBitonicSort *ret = (PYBitonicSort*)PyObject_New(PYBitonicSort, &PYBitonicSort_Type);
		new(&ret->ptr) BitonicSort(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyBitonicSort_init(PYBitonicSort *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) BitonicSort();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::BitonicSort(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyBitonicSort_dealloc(PYBitonicSort *self) {
		self->ptr.~BitonicSort();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyBitonicSort_equalPtr(PYBitonicSort *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyBitonicSort_clonePtr(PYBitonicSort *self, PyObject *args) {
		return pyBitonicSort_new(self->ptr.clonePtr());
	}
	static PyObject *pyBitonicSort_clearPtr(PYBitonicSort *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBitonicSort_destroyPtr(PYBitonicSort *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBitonicSort_acquirePtr(PYBitonicSort *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBitonicSort_unacquirePtr(PYBitonicSort *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyBitonicSort_isValidPtr(PYBitonicSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyBitonicSort_isOwnerPtr(PYBitonicSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyBitonicSort_isConstPtr(PYBitonicSort *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyBitonicSort_getCountPtr(PYBitonicSort *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyBitonicSort_getInternalPtr(PYBitonicSort *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *BitonicSort_clear(PYBitonicSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_isCreated(PYBitonicSort *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.isCreated((BitonicSort::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::isCreated(): unknown arguments:\n(BitonicSort.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_getDataSize(PYBitonicSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getDataSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::getDataSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_getGroupSize(PYBitonicSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_getSortElements(PYBitonicSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getSortElements());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::getSortElements(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_getMaxRegions(PYBitonicSort *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::getMaxRegions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_create(PYBitonicSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		uint32_t size = {};
		uint32_t groups = 256;
		uint32_t regions = 1;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "mode", "size", "groups", "regions", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII|IIO", (char**)kwlist, &device_, &mode, &size, &groups, &regions, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (BitonicSort::Mode)mode, size, groups, regions, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			uint32_t size = {};
			uint32_t groups = 256;
			uint32_t regions = 1;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "flags", "size", "groups", "regions", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OII|IIO", (char**)kwlist, &device_, &flags, &size, &groups, &regions, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.create(device, (BitonicSort::Flags)flags, size, groups, regions, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::create(): unknown arguments:\n(const Device device, BitonicSort.Mode mode, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n(const Device device, BitonicSort.Flags flags, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_dispatch(PYBitonicSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		uint32_t count = {};
		const uint32_t *keys_offsets = nullptr;
		const uint32_t *data_offsets = nullptr;
		const uint32_t *sizes = nullptr;
		uint32_t flags = BitonicSort::FlagNone;
		static const char *kwlist[] = { "compute", "data", "count", "keys_offsets", "data_offsets", "sizes", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOInnn|I", (char**)kwlist, &compute_, &data_, &count, &keys_offsets, &data_offsets, &sizes, &flags)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			return PyLong_FromLong(self->ptr.dispatch(compute, data, count, keys_offsets, data_offsets, sizes, (BitonicSort::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t keys_offset = {};
			uint32_t data_offset = {};
			uint32_t size = {};
			uint32_t flags = BitonicSort::FlagNone;
			static const char *kwlist[] = { "compute", "data", "keys_offset", "data_offset", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIII|I", (char**)kwlist, &compute_, &data_, &keys_offset, &data_offset, &size, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				return PyLong_FromLong(self->ptr.dispatch(compute, data, keys_offset, data_offset, size, (BitonicSort::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::dispatch(): unknown arguments:\n(Compute compute, Buffer data, uint32_t count, const uint32_t* keys_offsets, const uint32_t* data_offsets, const uint32_t* sizes, BitonicSort.Flags flags) -> bool\n(Compute compute, Buffer data, uint32_t keys_offset, uint32_t data_offset, uint32_t size, BitonicSort.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_dispatchIndirect(PYBitonicSort *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		PyObject *count_ = nullptr;
		PyObject *dispatch_ = nullptr;
		uint32_t count_offset = {};
		uint32_t dispatch_offset = {};
		uint32_t flags = BitonicSort::FlagNone;
		static const char *kwlist[] = { "compute", "data", "count", "dispatch", "count_offset", "dispatch_offset", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOOII|I", (char**)kwlist, &compute_, &data_, &count_, &dispatch_, &count_offset, &dispatch_offset, &flags)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			if(!isPYBuffer(count_)) break;
			Buffer &count = pyBuffer_get(count_);
			if(!isPYBuffer(dispatch_)) break;
			Buffer &dispatch = pyBuffer_get(dispatch_);
			return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, count_offset, dispatch_offset, (BitonicSort::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			uint32_t count = {};
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = BitonicSort::FlagNone;
			static const char *kwlist[] = { "compute", "data", "count", "dispatch", "offset", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOIOI|I", (char**)kwlist, &compute_, &data_, &count, &dispatch_, &offset, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, count, dispatch, offset, (BitonicSort::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *data_ = nullptr;
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t flags = BitonicSort::FlagNone;
			static const char *kwlist[] = { "compute", "data", "dispatch", "offset", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI|I", (char**)kwlist, &compute_, &data_, &dispatch_, &offset, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(data_)) break;
				Buffer &data = pyBuffer_get(data_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, dispatch, offset, (BitonicSort::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "BitonicSort::dispatchIndirect(): unknown arguments:\n(Compute compute, Buffer data, Buffer count, Buffer dispatch, uint32_t count_offset, uint32_t dispatch_offset, BitonicSort.Flags flags) -> bool\n(Compute compute, Buffer data, uint32_t count, Buffer dispatch, uint32_t offset, BitonicSort.Flags flags) -> bool\n(Compute compute, Buffer data, Buffer dispatch, uint32_t offset, BitonicSort.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *BitonicSort_get_data_size(PYBitonicSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getDataSize());
	}
	static PyObject *BitonicSort_get_group_size(PYBitonicSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *BitonicSort_get_sort_elements(PYBitonicSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getSortElements());
	}
	static PyObject *BitonicSort_get_max_regions(PYBitonicSort *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
	}
	static PyObject *pyBitonicSort_str(PYBitonicSort *self) {
		return PyUnicode_FromString(String::format("BitonicSort Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyBitonicSort_bool(PYBitonicSort *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::BitonicSort::DispatchParameters
	TS_PYAPI bool isPYBitonicSortDispatchParameters(PyObject *object) {
		return (object && Py_TYPE(object) == &PYBitonicSortDispatchParameters_Type);
	}
	TS_PYAPI BitonicSort::DispatchParameters &pyBitonicSortDispatchParameters_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYBitonicSortDispatchParameters_Type) return ((PYBitonicSortDispatchParameters*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "BitonicSortDispatchParameters_get(): can't get BitonicSortDispatchParameters from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "BitonicSortDispatchParameters_get(): can't get BitonicSortDispatchParameters from None");
		static BitonicSort::DispatchParameters ret;
		return ret;
	}
	TS_PYAPI PyObject *pyBitonicSortDispatchParameters_new(const BitonicSort::DispatchParameters &ptr) {
		PYBitonicSortDispatchParameters *ret = (PYBitonicSortDispatchParameters*)PyObject_New(PYBitonicSortDispatchParameters, &PYBitonicSortDispatchParameters_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pyBitonicSortDispatchParameters_buffer(PYBitonicSortDispatchParameters *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(BitonicSort::DispatchParameters);
			view->itemsize = sizeof(BitonicSort::DispatchParameters);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::SpatialGrid
	TS_PYAPI bool isPYSpatialGrid(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSpatialGrid_Type);
	}
	TS_PYAPI SpatialGrid &pySpatialGrid_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSpatialGrid_Type) return ((PYSpatialGrid*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SpatialGrid_get(): can't get SpatialGrid from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SpatialGrid_get(): can't get SpatialGrid from None");
		static SpatialGrid ret;
		return ret;
	}
	TS_PYAPI PyObject *pySpatialGrid_new(const SpatialGrid &ptr) {
		PYSpatialGrid *ret = (PYSpatialGrid*)PyObject_New(PYSpatialGrid, &PYSpatialGrid_Type);
		new(&ret->ptr) SpatialGrid(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySpatialGrid_new(SpatialGrid &&ptr) {
		PYSpatialGrid *ret = (PYSpatialGrid*)PyObject_New(PYSpatialGrid, &PYSpatialGrid_Type);
		new(&ret->ptr) SpatialGrid(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pySpatialGrid_init(PYSpatialGrid *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) SpatialGrid();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::SpatialGrid(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySpatialGrid_dealloc(PYSpatialGrid *self) {
		self->ptr.~SpatialGrid();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySpatialGrid_equalPtr(PYSpatialGrid *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySpatialGrid_clonePtr(PYSpatialGrid *self, PyObject *args) {
		return pySpatialGrid_new(self->ptr.clonePtr());
	}
	static PyObject *pySpatialGrid_clearPtr(PYSpatialGrid *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialGrid_destroyPtr(PYSpatialGrid *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialGrid_acquirePtr(PYSpatialGrid *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialGrid_unacquirePtr(PYSpatialGrid *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialGrid_isValidPtr(PYSpatialGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySpatialGrid_isOwnerPtr(PYSpatialGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySpatialGrid_isConstPtr(PYSpatialGrid *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySpatialGrid_getCountPtr(PYSpatialGrid *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySpatialGrid_getInternalPtr(PYSpatialGrid *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *SpatialGrid_clear(PYSpatialGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_isCreated(PYSpatialGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_getGroupSize(PYSpatialGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_getRadixSort(PYSpatialGrid *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRadixSort_new(self->ptr.getRadixSort());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::getRadixSort(): unknown arguments:\n(void) -> RadixSort\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_create(PYSpatialGrid *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		PyObject *sort_ = nullptr;
		uint32_t groups = 256;
		static const char *kwlist[] = { "device", "sort", "groups", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|I", (char**)kwlist, &device_, &sort_, &groups)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYRadixSort(sort_)) break;
			RadixSort &sort = pyRadixSort_get(sort_);
			return PyLong_FromLong(self->ptr.create(device, sort, groups));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::create(): unknown arguments:\n(const Device device, RadixSort sort, uint32_t groups) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_dispatch(PYSpatialGrid *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		uint32_t offset = {};
		uint32_t size = {};
		uint32_t bits = 32;
		static const char *kwlist[] = { "compute", "data", "offset", "size", "bits", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOII|I", (char**)kwlist, &compute_, &data_, &offset, &size, &bits)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			return PyLong_FromLong(self->ptr.dispatch(compute, data, offset, size, bits));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::dispatch(): unknown arguments:\n(Compute compute, Buffer data, uint32_t offset, uint32_t size, uint32_t bits) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_dispatchIndirect(PYSpatialGrid *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		PyObject *data_ = nullptr;
		PyObject *dispatch_ = nullptr;
		uint32_t offset = {};
		uint32_t max_size = Maxu32;
		static const char *kwlist[] = { "compute", "data", "dispatch", "offset", "max_size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOI|I", (char**)kwlist, &compute_, &data_, &dispatch_, &offset, &max_size)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(data_)) break;
			Buffer &data = pyBuffer_get(data_);
			if(!isPYBuffer(dispatch_)) break;
			Buffer &dispatch = pyBuffer_get(dispatch_);
			return PyLong_FromLong(self->ptr.dispatchIndirect(compute, data, dispatch, offset, max_size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialGrid::dispatchIndirect(): unknown arguments:\n(Compute compute, Buffer data, Buffer dispatch, uint32_t offset, uint32_t max_size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialGrid_get_group_size(PYSpatialGrid *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *SpatialGrid_get_radix_sort(PYSpatialGrid *self, void *offset) {
		return pyRadixSort_new(self->ptr.getRadixSort());
	}
	static PyObject *pySpatialGrid_str(PYSpatialGrid *self) {
		return PyUnicode_FromString(String::format("SpatialGrid Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySpatialGrid_bool(PYSpatialGrid *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::SpatialGrid::DispatchParameters
	TS_PYAPI bool isPYSpatialGridDispatchParameters(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSpatialGridDispatchParameters_Type);
	}
	TS_PYAPI SpatialGrid::DispatchParameters &pySpatialGridDispatchParameters_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSpatialGridDispatchParameters_Type) return ((PYSpatialGridDispatchParameters*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SpatialGridDispatchParameters_get(): can't get SpatialGridDispatchParameters from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SpatialGridDispatchParameters_get(): can't get SpatialGridDispatchParameters from None");
		static SpatialGrid::DispatchParameters ret;
		return ret;
	}
	TS_PYAPI PyObject *pySpatialGridDispatchParameters_new(const SpatialGrid::DispatchParameters &ptr) {
		PYSpatialGridDispatchParameters *ret = (PYSpatialGridDispatchParameters*)PyObject_New(PYSpatialGridDispatchParameters, &PYSpatialGridDispatchParameters_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pySpatialGridDispatchParameters_buffer(PYSpatialGridDispatchParameters *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(SpatialGrid::DispatchParameters);
			view->itemsize = sizeof(SpatialGrid::DispatchParameters);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::SpatialTree
	TS_PYAPI bool isPYSpatialTree(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSpatialTree_Type);
	}
	TS_PYAPI SpatialTree &pySpatialTree_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSpatialTree_Type) return ((PYSpatialTree*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SpatialTree_get(): can't get SpatialTree from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SpatialTree_get(): can't get SpatialTree from None");
		static SpatialTree ret;
		return ret;
	}
	TS_PYAPI PyObject *pySpatialTree_new(const SpatialTree &ptr) {
		PYSpatialTree *ret = (PYSpatialTree*)PyObject_New(PYSpatialTree, &PYSpatialTree_Type);
		new(&ret->ptr) SpatialTree(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pySpatialTree_new(SpatialTree &&ptr) {
		PYSpatialTree *ret = (PYSpatialTree*)PyObject_New(PYSpatialTree, &PYSpatialTree_Type);
		new(&ret->ptr) SpatialTree(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pySpatialTree_init(PYSpatialTree *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) SpatialTree();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::SpatialTree(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pySpatialTree_dealloc(PYSpatialTree *self) {
		self->ptr.~SpatialTree();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pySpatialTree_equalPtr(PYSpatialTree *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pySpatialTree_clonePtr(PYSpatialTree *self, PyObject *args) {
		return pySpatialTree_new(self->ptr.clonePtr());
	}
	static PyObject *pySpatialTree_clearPtr(PYSpatialTree *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialTree_destroyPtr(PYSpatialTree *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialTree_acquirePtr(PYSpatialTree *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialTree_unacquirePtr(PYSpatialTree *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pySpatialTree_isValidPtr(PYSpatialTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pySpatialTree_isOwnerPtr(PYSpatialTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pySpatialTree_isConstPtr(PYSpatialTree *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pySpatialTree_getCountPtr(PYSpatialTree *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pySpatialTree_getInternalPtr(PYSpatialTree *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *SpatialTree_clear(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_isCreated(PYSpatialTree *self, PyObject *args, PyObject *kwargs) {
		uint32_t flags = 0;
		static const char *kwlist[] = { "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
			return PyLong_FromLong(self->ptr.isCreated((SpatialTree::Flags)flags));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::isCreated(): unknown arguments:\n(SpatialTree.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getGroupSize(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getGroupSize(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getBoundsNodes(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getBoundsNodes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getBoundsNodes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getMaxNodes(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxNodes());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getMaxNodes(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getMaxRegions(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getMaxRegions(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getRadixSort(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyRadixSort_new(self->ptr.getRadixSort());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getRadixSort(): unknown arguments:\n(void) -> RadixSort\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getHashBuffer(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getHashBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getHashBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getParentsBuffer(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getParentsBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getParentsBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_getCounterBuffer(PYSpatialTree *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return pyBuffer_new(self->ptr.getCounterBuffer());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::getCounterBuffer(): unknown arguments:\n(void) -> Buffer\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_create(PYSpatialTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		PyObject *sort_ = nullptr;
		uint32_t size = {};
		uint32_t groups = 256;
		uint32_t regions = 1;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "mode", "sort", "size", "groups", "regions", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOI|IIO", (char**)kwlist, &device_, &mode, &sort_, &size, &groups, &regions, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			if(!isPYRadixSort(sort_)) break;
			RadixSort &sort = pyRadixSort_get(sort_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (SpatialTree::Mode)mode, sort, size, groups, regions, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			PyObject *sort_ = nullptr;
			uint32_t size = {};
			uint32_t groups = 256;
			uint32_t regions = 1;
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "flags", "sort", "size", "groups", "regions", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOI|IIO", (char**)kwlist, &device_, &flags, &sort_, &size, &groups, &regions, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				if(!isPYRadixSort(sort_)) break;
				RadixSort &sort = pyRadixSort_get(sort_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.create(device, (SpatialTree::Flags)flags, sort, size, groups, regions, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::create(): unknown arguments:\n(const Device device, SpatialTree.Mode mode, RadixSort sort, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n(const Device device, SpatialTree.Flags flags, RadixSort sort, uint32_t size, uint32_t groups, uint32_t regions, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_dispatch(PYSpatialTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t hash = 0;
		PyObject *nodes_ = nullptr;
		uint32_t count = {};
		const uint32_t *offsets = nullptr;
		const uint32_t *sizes = nullptr;
		uint32_t flags = SpatialTree::FlagNone;
		static const char *kwlist[] = { "compute", "hash", "nodes", "count", "offsets", "sizes", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOInn|I", (char**)kwlist, &compute_, &hash, &nodes_, &count, &offsets, &sizes, &flags)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(nodes_)) break;
			Buffer &nodes = pyBuffer_get(nodes_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (SpatialTree::Hash)hash, nodes, count, offsets, sizes, (SpatialTree::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t hash = 0;
			PyObject *nodes_ = nullptr;
			uint32_t offset = {};
			uint32_t size = {};
			uint32_t flags = SpatialTree::FlagNone;
			static const char *kwlist[] = { "compute", "hash", "nodes", "offset", "size", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOII|I", (char**)kwlist, &compute_, &hash, &nodes_, &offset, &size, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(nodes_)) break;
				Buffer &nodes = pyBuffer_get(nodes_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (SpatialTree::Hash)hash, nodes, offset, size, (SpatialTree::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::dispatch(): unknown arguments:\n(Compute compute, SpatialTree.Hash hash, Buffer nodes, uint32_t count, const uint32_t* offsets, const uint32_t* sizes, SpatialTree.Flags flags) -> bool\n(Compute compute, SpatialTree.Hash hash, Buffer nodes, uint32_t offset, uint32_t size, SpatialTree.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_dispatchIndirect(PYSpatialTree *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t hash = 0;
		PyObject *nodes_ = nullptr;
		uint32_t count = {};
		PyObject *dispatch_ = nullptr;
		uint32_t offset = {};
		uint32_t max_size = Maxu32;
		static const char *kwlist[] = { "compute", "hash", "nodes", "count", "dispatch", "offset", "max_size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOIOI|I", (char**)kwlist, &compute_, &hash, &nodes_, &count, &dispatch_, &offset, &max_size)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYBuffer(nodes_)) break;
			Buffer &nodes = pyBuffer_get(nodes_);
			if(!isPYBuffer(dispatch_)) break;
			Buffer &dispatch = pyBuffer_get(dispatch_);
			return PyLong_FromLong(self->ptr.dispatchIndirect(compute, (SpatialTree::Hash)hash, nodes, count, dispatch, offset, max_size));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t hash = 0;
			PyObject *nodes_ = nullptr;
			PyObject *dispatch_ = nullptr;
			uint32_t offset = {};
			uint32_t max_size = Maxu32;
			static const char *kwlist[] = { "compute", "hash", "nodes", "dispatch", "offset", "max_size", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOI|I", (char**)kwlist, &compute_, &hash, &nodes_, &dispatch_, &offset, &max_size)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYBuffer(nodes_)) break;
				Buffer &nodes = pyBuffer_get(nodes_);
				if(!isPYBuffer(dispatch_)) break;
				Buffer &dispatch = pyBuffer_get(dispatch_);
				return PyLong_FromLong(self->ptr.dispatchIndirect(compute, (SpatialTree::Hash)hash, nodes, dispatch, offset, max_size));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "SpatialTree::dispatchIndirect(): unknown arguments:\n(Compute compute, SpatialTree.Hash hash, Buffer nodes, uint32_t count, Buffer dispatch, uint32_t offset, uint32_t max_size) -> bool\n(Compute compute, SpatialTree.Hash hash, Buffer nodes, Buffer dispatch, uint32_t offset, uint32_t max_size) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *SpatialTree_get_group_size(PYSpatialTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getGroupSize());
	}
	static PyObject *SpatialTree_get_bounds_nodes(PYSpatialTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getBoundsNodes());
	}
	static PyObject *SpatialTree_get_max_nodes(PYSpatialTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxNodes());
	}
	static PyObject *SpatialTree_get_max_regions(PYSpatialTree *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxRegions());
	}
	static PyObject *SpatialTree_get_radix_sort(PYSpatialTree *self, void *offset) {
		return pyRadixSort_new(self->ptr.getRadixSort());
	}
	static PyObject *SpatialTree_get_hash_buffer(PYSpatialTree *self, void *offset) {
		return pyBuffer_new(self->ptr.getHashBuffer());
	}
	static PyObject *SpatialTree_get_parents_buffer(PYSpatialTree *self, void *offset) {
		return pyBuffer_new(self->ptr.getParentsBuffer());
	}
	static PyObject *SpatialTree_get_counter_buffer(PYSpatialTree *self, void *offset) {
		return pyBuffer_new(self->ptr.getCounterBuffer());
	}
	static PyObject *pySpatialTree_str(PYSpatialTree *self) {
		return PyUnicode_FromString(String::format("SpatialTree Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pySpatialTree_bool(PYSpatialTree *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::SpatialTree::Node
	TS_PYAPI bool isPYSpatialTreeNode(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSpatialTreeNode_Type);
	}
	TS_PYAPI SpatialTree::Node &pySpatialTreeNode_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSpatialTreeNode_Type) return ((PYSpatialTreeNode*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SpatialTreeNode_get(): can't get SpatialTreeNode from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SpatialTreeNode_get(): can't get SpatialTreeNode from None");
		static SpatialTree::Node ret;
		return ret;
	}
	TS_PYAPI PyObject *pySpatialTreeNode_new(const SpatialTree::Node &ptr) {
		PYSpatialTreeNode *ret = (PYSpatialTreeNode*)PyObject_New(PYSpatialTreeNode, &PYSpatialTreeNode_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pySpatialTreeNode_buffer(PYSpatialTreeNode *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(SpatialTree::Node);
			view->itemsize = sizeof(SpatialTree::Node);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::SpatialTree::DispatchParameters
	TS_PYAPI bool isPYSpatialTreeDispatchParameters(PyObject *object) {
		return (object && Py_TYPE(object) == &PYSpatialTreeDispatchParameters_Type);
	}
	TS_PYAPI SpatialTree::DispatchParameters &pySpatialTreeDispatchParameters_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYSpatialTreeDispatchParameters_Type) return ((PYSpatialTreeDispatchParameters*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "SpatialTreeDispatchParameters_get(): can't get SpatialTreeDispatchParameters from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "SpatialTreeDispatchParameters_get(): can't get SpatialTreeDispatchParameters from None");
		static SpatialTree::DispatchParameters ret;
		return ret;
	}
	TS_PYAPI PyObject *pySpatialTreeDispatchParameters_new(const SpatialTree::DispatchParameters &ptr) {
		PYSpatialTreeDispatchParameters *ret = (PYSpatialTreeDispatchParameters*)PyObject_New(PYSpatialTreeDispatchParameters, &PYSpatialTreeDispatchParameters_Type);
		ret->ptr = ptr;
		return (PyObject*)ret;
	}
	static int32_t pySpatialTreeDispatchParameters_buffer(PYSpatialTreeDispatchParameters *self, Py_buffer *view, int32_t flags) {
		static Py_ssize_t shape = 1;
		if(view) {
			view->buf = &self->ptr;
			view->obj = (PyObject*)self;
			view->len = sizeof(SpatialTree::DispatchParameters);
			view->itemsize = sizeof(SpatialTree::DispatchParameters);
			view->ndim = 1;
			view->format = nullptr;
			view->shape = &shape;
			view->strides = &view->itemsize;
			view->suboffsets = nullptr;
			Py_INCREF(self);
			return 0;
		}
		return -1;
	}
	
	// Tellusim::FourierTransform
	TS_PYAPI bool isPYFourierTransform(PyObject *object) {
		return (object && Py_TYPE(object) == &PYFourierTransform_Type);
	}
	TS_PYAPI FourierTransform &pyFourierTransform_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYFourierTransform_Type) return ((PYFourierTransform*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "FourierTransform_get(): can't get FourierTransform from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "FourierTransform_get(): can't get FourierTransform from None");
		static FourierTransform ret;
		return ret;
	}
	TS_PYAPI PyObject *pyFourierTransform_new(const FourierTransform &ptr) {
		PYFourierTransform *ret = (PYFourierTransform*)PyObject_New(PYFourierTransform, &PYFourierTransform_Type);
		new(&ret->ptr) FourierTransform(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyFourierTransform_new(FourierTransform &&ptr) {
		PYFourierTransform *ret = (PYFourierTransform*)PyObject_New(PYFourierTransform, &PYFourierTransform_Type);
		new(&ret->ptr) FourierTransform(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyFourierTransform_init(PYFourierTransform *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) FourierTransform();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::FourierTransform(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyFourierTransform_dealloc(PYFourierTransform *self) {
		self->ptr.~FourierTransform();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyFourierTransform_equalPtr(PYFourierTransform *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyFourierTransform_clonePtr(PYFourierTransform *self, PyObject *args) {
		return pyFourierTransform_new(self->ptr.clonePtr());
	}
	static PyObject *pyFourierTransform_clearPtr(PYFourierTransform *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFourierTransform_destroyPtr(PYFourierTransform *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFourierTransform_acquirePtr(PYFourierTransform *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFourierTransform_unacquirePtr(PYFourierTransform *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyFourierTransform_isValidPtr(PYFourierTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyFourierTransform_isOwnerPtr(PYFourierTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyFourierTransform_isConstPtr(PYFourierTransform *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyFourierTransform_getCountPtr(PYFourierTransform *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyFourierTransform_getInternalPtr(PYFourierTransform *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *FourierTransform_clear(PYFourierTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_isCreated(PYFourierTransform *self, PyObject *args, PyObject *kwargs) {
		uint32_t mode = 0;
		static const char *kwlist[] = { "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &mode)) {
			return PyLong_FromLong(self->ptr.isCreated((FourierTransform::Mode)mode));
		}
		PyErr_Clear();
		{
			uint32_t flags = 0;
			static const char *kwlist[] = { "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &flags)) {
				return PyLong_FromLong(self->ptr.isCreated((FourierTransform::Flags)flags));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::isCreated(): unknown arguments:\n(FourierTransform.Mode mode) -> bool\n(FourierTransform.Flags flags) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_getMaxWidth(PYFourierTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::getMaxWidth(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_getMaxHeight(PYFourierTransform *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getMaxHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::getMaxHeight(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_create(PYFourierTransform *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t mode = 0;
		uint32_t width = {};
		uint32_t height = {};
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "mode", "width", "height", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIII|O", (char**)kwlist, &device_, &mode, &width, &height, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (FourierTransform::Mode)mode, width, height, async));
		}
		PyErr_Clear();
		{
			PyObject *device_ = nullptr;
			uint32_t flags = 0;
			uint32_t width = {};
			uint32_t height = {};
			PyObject *async_ = nullptr;
			static const char *kwlist[] = { "device", "flags", "width", "height", "tasks", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIII|O", (char**)kwlist, &device_, &flags, &width, &height, &async_)) {
				if(!isPYDevice(device_)) break;
				const Device &device = pyDevice_get(device_);
				Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
				return PyLong_FromLong(self->ptr.create(device, (FourierTransform::Flags)flags, width, height, async));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::create(): unknown arguments:\n(const Device device, FourierTransform.Mode mode, uint32_t width, uint32_t height, Async* async) -> bool\n(const Device device, FourierTransform.Flags flags, uint32_t width, uint32_t height, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_dispatch(PYFourierTransform *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t mode = 0;
		uint32_t op = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		PyObject *dest_slice_ = nullptr;
		PyObject *src_slice_ = nullptr;
		static const char *kwlist[] = { "compute", "mode", "op", "dest", "src", "dest_slice", "src_slice", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOOOO", (char**)kwlist, &compute_, &mode, &op, &dest_, &src_, &dest_slice_, &src_slice_)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTexture(dest_)) break;
			Texture &dest = pyTexture_get(dest_);
			if(!isPYTexture(src_)) break;
			Texture &src = pyTexture_get(src_);
			if(!isPYSlice(dest_slice_)) break;
			const Slice &dest_slice = pySlice_get(dest_slice_);
			if(!isPYSlice(src_slice_)) break;
			const Slice &src_slice = pySlice_get(src_slice_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (FourierTransform::Mode)mode, (FourierTransform::Operation)op, dest, src, dest_slice, src_slice));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			uint32_t op = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *src_slice_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "op", "dest", "src", "src_slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOOO", (char**)kwlist, &compute_, &mode, &op, &dest_, &src_, &src_slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYSlice(src_slice_)) break;
				const Slice &src_slice = pySlice_get(src_slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (FourierTransform::Mode)mode, (FourierTransform::Operation)op, dest, src, src_slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t mode = 0;
			uint32_t op = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			static const char *kwlist[] = { "compute", "mode", "op", "dest", "src", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIIOO", (char**)kwlist, &compute_, &mode, &op, &dest_, &src_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (FourierTransform::Mode)mode, (FourierTransform::Operation)op, dest, src));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "FourierTransform::dispatch(): unknown arguments:\n(Compute compute, FourierTransform.Mode mode, FourierTransform.Operation op, Texture dest, Texture src, const Slice dest_slice, const Slice src_slice) -> bool\n(Compute compute, FourierTransform.Mode mode, FourierTransform.Operation op, Texture dest, Texture src, const Slice src_slice) -> bool\n(Compute compute, FourierTransform.Mode mode, FourierTransform.Operation op, Texture dest, Texture src) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *FourierTransform_get_max_width(PYFourierTransform *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxWidth());
	}
	static PyObject *FourierTransform_get_max_height(PYFourierTransform *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getMaxHeight());
	}
	static PyObject *pyFourierTransform_str(PYFourierTransform *self) {
		return PyUnicode_FromString(String::format("FourierTransform Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyFourierTransform_bool(PYFourierTransform *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::TensorGraph
	TS_PYAPI bool isPYTensorGraph(PyObject *object) {
		return (object && Py_TYPE(object) == &PYTensorGraph_Type);
	}
	TS_PYAPI TensorGraph &pyTensorGraph_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYTensorGraph_Type) return ((PYTensorGraph*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "TensorGraph_get(): can't get TensorGraph from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "TensorGraph_get(): can't get TensorGraph from None");
		static TensorGraph ret;
		return ret;
	}
	TS_PYAPI PyObject *pyTensorGraph_new(const TensorGraph &ptr) {
		PYTensorGraph *ret = (PYTensorGraph*)PyObject_New(PYTensorGraph, &PYTensorGraph_Type);
		new(&ret->ptr) TensorGraph(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyTensorGraph_new(TensorGraph &&ptr) {
		PYTensorGraph *ret = (PYTensorGraph*)PyObject_New(PYTensorGraph, &PYTensorGraph_Type);
		new(&ret->ptr) TensorGraph(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyTensorGraph_init(PYTensorGraph *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) TensorGraph();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TensorGraph::TensorGraph(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyTensorGraph_dealloc(PYTensorGraph *self) {
		self->ptr.~TensorGraph();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyTensorGraph_equalPtr(PYTensorGraph *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyTensorGraph_clonePtr(PYTensorGraph *self, PyObject *args) {
		return pyTensorGraph_new(self->ptr.clonePtr());
	}
	static PyObject *pyTensorGraph_clearPtr(PYTensorGraph *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTensorGraph_destroyPtr(PYTensorGraph *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTensorGraph_acquirePtr(PYTensorGraph *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTensorGraph_unacquirePtr(PYTensorGraph *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyTensorGraph_isValidPtr(PYTensorGraph *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyTensorGraph_isOwnerPtr(PYTensorGraph *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyTensorGraph_isConstPtr(PYTensorGraph *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyTensorGraph_getCountPtr(PYTensorGraph *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyTensorGraph_getInternalPtr(PYTensorGraph *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *TensorGraph_clear(PYTensorGraph *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			self->ptr.clear();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TensorGraph::clear(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TensorGraph_isCreated(PYTensorGraph *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.isCreated());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TensorGraph::isCreated(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TensorGraph_create(PYTensorGraph *self, PyObject *args, PyObject *kwargs) {
		PyObject *device_ = nullptr;
		uint32_t flags = TensorGraph::FlagsAll;
		uint32_t masks = TensorGraph::MasksAll;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "device", "flags", "masks", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|IIO", (char**)kwlist, &device_, &flags, &masks, &async_)) {
			if(!isPYDevice(device_)) break;
			const Device &device = pyDevice_get(device_);
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(self->ptr.create(device, (TensorGraph::Flags)flags, (TensorGraph::Masks)masks, async));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TensorGraph::create(): unknown arguments:\n(const Device device, TensorGraph.Flags flags, TensorGraph.Masks masks, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *TensorGraph_dispatch(PYTensorGraph *self, PyObject *args, PyObject *kwargs) {
		PyObject *compute_ = nullptr;
		uint32_t op = 0;
		PyObject *dest_ = nullptr;
		PyObject *src_0_ = nullptr;
		PyObject *src_1_ = nullptr;
		PyObject *src_2_ = nullptr;
		uint32_t flags = TensorGraph::FlagNone;
		static const char *kwlist[] = { "compute", "op", "dest", "src_0", "src_1", "src_2", "flags", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOOO|I", (char**)kwlist, &compute_, &op, &dest_, &src_0_, &src_1_, &src_2_, &flags)) {
			if(!isPYCompute(compute_)) break;
			Compute &compute = pyCompute_get(compute_);
			if(!isPYTensor(dest_)) break;
			Tensor &dest = pyTensor_get(dest_);
			if(!isPYTensor(src_0_)) break;
			const Tensor &src_0 = pyTensor_get(src_0_);
			if(!isPYTensor(src_1_)) break;
			const Tensor &src_1 = pyTensor_get(src_1_);
			if(!isPYTensor(src_2_)) break;
			const Tensor &src_2 = pyTensor_get(src_2_);
			return PyLong_FromLong(self->ptr.dispatch(compute, (TensorGraph::Operation)op, dest, src_0, src_1, src_2, (TensorGraph::Flags)flags));
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t op = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_0_ = nullptr;
			PyObject *src_1_ = nullptr;
			uint32_t flags = TensorGraph::FlagNone;
			static const char *kwlist[] = { "compute", "op", "dest", "src_0", "src_1", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOOO|I", (char**)kwlist, &compute_, &op, &dest_, &src_0_, &src_1_, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTensor(dest_)) break;
				Tensor &dest = pyTensor_get(dest_);
				if(!isPYTensor(src_0_)) break;
				const Tensor &src_0 = pyTensor_get(src_0_);
				if(!isPYTensor(src_1_)) break;
				const Tensor &src_1 = pyTensor_get(src_1_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (TensorGraph::Operation)op, dest, src_0, src_1, (TensorGraph::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t op = 0;
			PyObject *dest_ = nullptr;
			PyObject *src_0_ = nullptr;
			uint32_t flags = TensorGraph::FlagNone;
			static const char *kwlist[] = { "compute", "op", "dest", "src_0", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIOO|I", (char**)kwlist, &compute_, &op, &dest_, &src_0_, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTensor(dest_)) break;
				Tensor &dest = pyTensor_get(dest_);
				if(!isPYTensor(src_0_)) break;
				const Tensor &src_0 = pyTensor_get(src_0_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (TensorGraph::Operation)op, dest, src_0, (TensorGraph::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *region_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "compute", "dest", "src", "region", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO|O", (char**)kwlist, &compute_, &dest_, &src_, &region_, &slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTensor(dest_)) break;
				const Tensor &dest = pyTensor_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, dest, src, region, slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *region_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "compute", "dest", "src", "region", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOOO|O", (char**)kwlist, &compute_, &dest_, &src_, &region_, &slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTensor(src_)) break;
				const Tensor &src = pyTensor_get(src_);
				if(!isPYRegion(region_)) break;
				const Region &region = pyRegion_get(region_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, dest, src, region, slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			uint32_t op = 0;
			PyObject *dest_ = nullptr;
			uint32_t flags = TensorGraph::FlagNone;
			static const char *kwlist[] = { "compute", "op", "dest", "flags", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OIO|I", (char**)kwlist, &compute_, &op, &dest_, &flags)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTensor(dest_)) break;
				const Tensor &dest = pyTensor_get(dest_);
				return PyLong_FromLong(self->ptr.dispatch(compute, (TensorGraph::Operation)op, dest, (TensorGraph::Flags)flags));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "compute", "dest", "src", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|O", (char**)kwlist, &compute_, &dest_, &src_, &slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTensor(dest_)) break;
				const Tensor &dest = pyTensor_get(dest_);
				if(!isPYTexture(src_)) break;
				Texture &src = pyTexture_get(src_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, dest, src, slice));
			}
		}
		PyErr_Clear();
		{
			PyObject *compute_ = nullptr;
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			PyObject *slice_ = nullptr;
			static const char *kwlist[] = { "compute", "dest", "src", "slice", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOO|O", (char**)kwlist, &compute_, &dest_, &src_, &slice_)) {
				if(!isPYCompute(compute_)) break;
				Compute &compute = pyCompute_get(compute_);
				if(!isPYTexture(dest_)) break;
				Texture &dest = pyTexture_get(dest_);
				if(!isPYTensor(src_)) break;
				const Tensor &src = pyTensor_get(src_);
				const Slice &slice = pySlice_get(slice_);
				return PyLong_FromLong(self->ptr.dispatch(compute, dest, src, slice));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "TensorGraph::dispatch(): unknown arguments:\n(Compute compute, TensorGraph.Operation op, Tensor dest, const Tensor src_0, const Tensor src_1, const Tensor src_2, TensorGraph.Flags flags) -> bool\n(Compute compute, TensorGraph.Operation op, Tensor dest, const Tensor src_0, const Tensor src_1, TensorGraph.Flags flags) -> bool\n(Compute compute, TensorGraph.Operation op, Tensor dest, const Tensor src_0, TensorGraph.Flags flags) -> bool\n(Compute compute, const Tensor dest, Texture src, const Region region, const Slice slice) -> bool\n(Compute compute, Texture dest, const Tensor src, const Region region, const Slice slice) -> bool\n(Compute compute, TensorGraph.Operation op, const Tensor dest, TensorGraph.Flags flags) -> bool\n(Compute compute, const Tensor dest, Texture src, const Slice slice) -> bool\n(Compute compute, Texture dest, const Tensor src, const Slice slice) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *pyTensorGraph_str(PYTensorGraph *self) {
		return PyUnicode_FromString(String::format("TensorGraph Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyTensorGraph_bool(PYTensorGraph *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim::Desktop
	TS_PYAPI bool isPYDesktop(PyObject *object) {
		return (object && Py_TYPE(object) == &PYDesktop_Type);
	}
	TS_PYAPI Desktop &pyDesktop_get(PyObject *object) {
		if(object && Py_TYPE(object) == &PYDesktop_Type) return ((PYDesktop*)object)->ptr;
		if(object) PyErr_Format(PyExc_TypeError, "Desktop_get(): can't get Desktop from %s", Py_TYPE(object)->tp_name);
		else PyErr_SetString(PyExc_TypeError, "Desktop_get(): can't get Desktop from None");
		static Desktop ret;
		return ret;
	}
	TS_PYAPI PyObject *pyDesktop_new(const Desktop &ptr) {
		PYDesktop *ret = (PYDesktop*)PyObject_New(PYDesktop, &PYDesktop_Type);
		new(&ret->ptr) Desktop(ptr);
		return (PyObject*)ret;
	}
	TS_PYAPI PyObject *pyDesktop_new(Desktop &&ptr) {
		PYDesktop *ret = (PYDesktop*)PyObject_New(PYDesktop, &PYDesktop_Type);
		new(&ret->ptr) Desktop(move(ptr));
		return (PyObject*)ret;
	}
	static int32_t pyDesktop_init(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		if(!args || PyTuple_Size(args) == 0) {
			new(&self->ptr) Desktop();
			return 0;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::Desktop(): unknown arguments:\n(void)\n");
		#else
			pyBadArguments();
		#endif
		return -1;
	}
	static void pyDesktop_dealloc(PYDesktop *self) {
		self->ptr.~Desktop();
		Py_TYPE(self)->tp_free((PyObject*)self);
	}
	static PyObject *pyDesktop_equalPtr(PYDesktop *self, PyObject *args) {
		return nullptr;
	}
	static PyObject *pyDesktop_clonePtr(PYDesktop *self, PyObject *args) {
		return pyDesktop_new(self->ptr.clonePtr());
	}
	static PyObject *pyDesktop_clearPtr(PYDesktop *self, PyObject *args) {
		self->ptr.clearPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDesktop_destroyPtr(PYDesktop *self, PyObject *args) {
		self->ptr.destroyPtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDesktop_acquirePtr(PYDesktop *self, PyObject *args) {
		self->ptr.acquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDesktop_unacquirePtr(PYDesktop *self, PyObject *args) {
		self->ptr.unacquirePtr();
		Py_RETURN_NONE;
	}
	static PyObject *pyDesktop_isValidPtr(PYDesktop *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isValidPtr());
	}
	static PyObject *pyDesktop_isOwnerPtr(PYDesktop *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isOwnerPtr());
	}
	static PyObject *pyDesktop_isConstPtr(PYDesktop *self, PyObject *args) {
		return PyBool_FromLong(self->ptr.isConstPtr());
	}
	static PyObject *pyDesktop_getCountPtr(PYDesktop *self, PyObject *args) {
		return PyLong_FromUnsignedLong(self->ptr.getCountPtr());
	}
	static PyObject *pyDesktop_getInternalPtr(PYDesktop *self, PyObject *args) {
		return PyLong_FromVoidPtr((void*)self->ptr.getInternalPtr());
	}
	static PyObject *Desktop_update(PYDesktop *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.update());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::update(): unknown arguments:\n(void) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getWidth(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth(index));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getWidth());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getWidth(): unknown arguments:\n(uint32_t index) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getHeight(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight(index));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getHeight());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getHeight(): unknown arguments:\n(uint32_t index) -> uint32_t\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getPositionX(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.getPositionX(index));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionX());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getPositionX(): unknown arguments:\n(uint32_t index) -> int32_t\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getPositionY(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.getPositionY(index));
		}
		PyErr_Clear();
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromLong(self->ptr.getPositionY());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getPositionY(): unknown arguments:\n(uint32_t index) -> int32_t\n(void) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScale(PYDesktop *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(self->ptr.getScale());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScale(): unknown arguments:\n(void) -> float32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getNumScreens(PYDesktop *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(self->ptr.getNumScreens());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getNumScreens(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenName(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getScreenName(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenName(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenDevice(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyUnicode_FromString(self->ptr.getScreenDevice(index).get());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenDevice(): unknown arguments:\n(uint32_t index) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenWidth(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getScreenWidth(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenWidth(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenHeight(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getScreenHeight(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenHeight(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenPositionX(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.getScreenPositionX(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenPositionX(): unknown arguments:\n(uint32_t index) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenPositionY(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.getScreenPositionY(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenPositionY(): unknown arguments:\n(uint32_t index) -> int32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenFrequency(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getScreenFrequency(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenFrequency(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getNumModes(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromUnsignedLong(self->ptr.getNumModes(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getNumModes(): unknown arguments:\n(uint32_t index) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getModeWidth(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mode = {};
		static const char *kwlist[] = { "index", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mode)) {
			return PyLong_FromUnsignedLong(self->ptr.getModeWidth(index, mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getModeWidth(): unknown arguments:\n(uint32_t index, uint32_t mode) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getModeHeight(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t mode = {};
		static const char *kwlist[] = { "index", "mode", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &index, &mode)) {
			return PyLong_FromUnsignedLong(self->ptr.getModeHeight(index, mode));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getModeHeight(): unknown arguments:\n(uint32_t index, uint32_t mode) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getModeIndex(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t width = {};
		uint32_t height = {};
		static const char *kwlist[] = { "index", "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &width, &height)) {
			return PyLong_FromUnsignedLong(self->ptr.getModeIndex(index, width, height));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getModeIndex(): unknown arguments:\n(uint32_t index, uint32_t width, uint32_t height) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_setMode(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		uint32_t width = {};
		uint32_t height = {};
		static const char *kwlist[] = { "index", "width", "height", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "III", (char**)kwlist, &index, &width, &height)) {
			return PyLong_FromLong(self->ptr.setMode(index, width, height));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::setMode(): unknown arguments:\n(uint32_t index, uint32_t width, uint32_t height) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_restoreMode(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		uint32_t index = {};
		static const char *kwlist[] = { "index", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &index)) {
			return PyLong_FromLong(self->ptr.restoreMode(index));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::restoreMode(): unknown arguments:\n(uint32_t index) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getScreenIndex(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			return PyLong_FromUnsignedLong(self->ptr.getScreenIndex(x, y));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getScreenIndex(): unknown arguments:\n(int32_t x, int32_t y) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_setMouse(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			return PyLong_FromLong(self->ptr.setMouse(x, y));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::setMouse(): unknown arguments:\n(int32_t x, int32_t y) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_getMouse(PYDesktop *self, PyObject *args, PyObject *kwargs) {
		int32_t x = {};
		int32_t y = {};
		static const char *kwlist[] = { "x", "y", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)kwlist, &x, &y)) {
			return PyLong_FromLong(self->ptr.getMouse(x, y));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Desktop::getMouse(): unknown arguments:\n(int32_t x, int32_t y) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Desktop_get_width(PYDesktop *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getWidth());
	}
	static PyObject *Desktop_get_height(PYDesktop *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getHeight());
	}
	static PyObject *Desktop_get_position_x(PYDesktop *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionX());
	}
	static PyObject *Desktop_get_position_y(PYDesktop *self, void *offset) {
		return PyLong_FromLong(self->ptr.getPositionY());
	}
	static PyObject *Desktop_get_scale(PYDesktop *self, void *offset) {
		return PyFloat_FromDouble(self->ptr.getScale());
	}
	static PyObject *Desktop_get_num_screens(PYDesktop *self, void *offset) {
		return PyLong_FromUnsignedLong(self->ptr.getNumScreens());
	}
	static PyObject *pyDesktop_str(PYDesktop *self) {
		return PyUnicode_FromString(String::format("Desktop Valid: %u; Owner: %u; Const: %u; Count: %u; Internal: %p", self->ptr.isValidPtr(), self->ptr.isOwnerPtr(), self->ptr.isConstPtr(), self->ptr.getCountPtr(), self->ptr.getInternalPtr()).get());
	}
	static int32_t pyDesktop_bool(PYDesktop *self) {
		return self->ptr.isValidPtr();
	}
	
	// Tellusim
	static PyObject *PY_getPlatformName(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t platform = 0;
		static const char *kwlist[] = { "platform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &platform)) {
			return PyUnicode_FromString(getPlatformName((Platform)platform));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getPlatformName(): unknown arguments:\n(Platform platform) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_findPlatformName(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(findPlatformName(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::findPlatformName(): unknown arguments:\n(const char* name) -> Platform\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isPlatformAvailable(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t platform = 0;
		static const char *kwlist[] = { "platform", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &platform)) {
			return PyLong_FromLong(isPlatformAvailable((Platform)platform));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isPlatformAvailable(): unknown arguments:\n(Platform platform) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatName(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyUnicode_FromString(getFormatName((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatName(): unknown arguments:\n(Format format) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_findFormatName(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(findFormatName(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::findFormatName(): unknown arguments:\n(const char* name) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getGLSLFormatName(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyUnicode_FromString(getGLSLFormatName((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getGLSLFormatName(): unknown arguments:\n(Format format) -> const char*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_findGLSLFormatName(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromUnsignedLong(findGLSLFormatName(name));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::findGLSLFormatName(): unknown arguments:\n(const char* name) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isColorFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isColorFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isColorFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isDepthFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isDepthFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isDepthFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isPixelFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isPixelFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isPixelFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isPlainFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isPlainFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isPlainFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isMixedFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isMixedFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isMixedFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isBlockFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isBlockFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isBlockFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isStencilFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isStencilFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isStencilFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toPixelFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toPixelFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toPixelFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isNormFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isNormFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isNormFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isSRGBFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isSRGBFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isSRGBFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isSignedFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isSignedFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isSignedFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isUnsignedFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isUnsignedFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isUnsignedFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isIntegerFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isIntegerFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isIntegerFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isFloatFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isFloatFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isFloatFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toNormFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toNormFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toNormFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toSRGBFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toSRGBFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toSRGBFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toSignedFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toSignedFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toSignedFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toUnsignedFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toUnsignedFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toUnsignedFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toFloatFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(toFloatFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toFloatFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isi8Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isi8Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isi8Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isu8Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isu8Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isu8Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_is8BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(is8BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::is8BitFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_to8BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(to8BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::to8BitFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isi16Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isi16Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isi16Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isu16Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isu16Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isu16Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isf16Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isf16Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isf16Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_is16BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(is16BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::is16BitFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_to16BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(to16BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::to16BitFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isi32Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isi32Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isi32Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isu32Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isu32Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isu32Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isf32Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isf32Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isf32Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_is32BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(is32BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::is32BitFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_to32BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(to32BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::to32BitFormat(): unknown arguments:\n(Format format) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isi64Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isi64Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isi64Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isu64Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isu64Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isu64Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isf64Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isf64Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isf64Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_is64BitFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(is64BitFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::is64BitFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isBC15Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isBC15Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isBC15Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isBC67Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isBC67Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isBC67Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isETC2Format(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isETC2Format((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isETC2Format(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_isASTCFormat(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromLong(isASTCFormat((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::isASTCFormat(): unknown arguments:\n(Format format) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatComponents(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(getFormatComponents((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatComponents(): unknown arguments:\n(Format format) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_toFormatComponents(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		uint32_t components = {};
		static const char *kwlist[] = { "format", "components", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "II", (char**)kwlist, &format, &components)) {
			return PyLong_FromUnsignedLong(toFormatComponents((Format)format, components));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::toFormatComponents(): unknown arguments:\n(Format format, uint32_t components) -> Format\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatPixelSize(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(getFormatPixelSize((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatPixelSize(): unknown arguments:\n(Format format) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatBlockSize(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(getFormatBlockSize((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatBlockSize(): unknown arguments:\n(Format format) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatBlockWidth(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(getFormatBlockWidth((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatBlockWidth(): unknown arguments:\n(Format format) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *PY_getFormatBlockHeight(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t format = 0;
		static const char *kwlist[] = { "format", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &format)) {
			return PyLong_FromUnsignedLong(getFormatBlockHeight((Format)format));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "::getFormatBlockHeight(): unknown arguments:\n(Format format) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::Allocator
	static PyObject *Allocator_allocate(PyObject *self, PyObject *args, PyObject *kwargs) {
		size_t size = {};
		static const char *kwlist[] = { "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &size)) {
			return PyLong_FromVoidPtr(Allocator::allocate(size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Allocator::allocate(): unknown arguments:\n(size_t size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Allocator_reallocate(PyObject *self, PyObject *args, PyObject *kwargs) {
		void *ptr = nullptr;
		size_t old_size = {};
		size_t new_size = {};
		static const char *kwlist[] = { "ptr", "old_size", "new_size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nnn", (char**)kwlist, &ptr, &old_size, &new_size)) {
			return PyLong_FromVoidPtr(Allocator::reallocate(ptr, old_size, new_size));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Allocator::reallocate(): unknown arguments:\n(void* ptr, size_t old_size, size_t new_size) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Allocator_free(PyObject *self, PyObject *args, PyObject *kwargs) {
		const void *ptr = nullptr;
		size_t size = {};
		static const char *kwlist[] = { "ptr", "size", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "nn", (char**)kwlist, &ptr, &size)) {
			Allocator::free(ptr, size);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Allocator::free(): unknown arguments:\n(const void* ptr, size_t size) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Allocator_getMemory(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(Allocator::getMemory());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Allocator::getMemory(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Allocator_getAllocations(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromSize_t(Allocator::getAllocations());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Allocator::getAllocations(): unknown arguments:\n(void) -> size_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::Log
	static PyObject *Log_setLevel(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t level = 0;
		static const char *kwlist[] = { "level", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &level)) {
			Log::setLevel((Log::Level)level);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::setLevel(): unknown arguments:\n(Log.Level level) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Log_getLevel(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(Log::getLevel());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::getLevel(): unknown arguments:\n(void) -> Log::Level\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Log_unlockCallback(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			Log::unlockCallback();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::unlockCallback(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Log_lockCallback(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			Log::lockCallback();
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::lockCallback(): unknown arguments:\n(void) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Log_print(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t level = 0;
		const char *str = nullptr;
		static const char *kwlist[] = { "level", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &level, &str)) {
			Log::print((Log::Level)level, str);
			Py_RETURN_NONE;
		}
		PyErr_Clear();
		{
			const char *str = nullptr;
			static const char *kwlist[] = { "str", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &str)) {
				Log::print(str);
				Py_RETURN_NONE;
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::print(): unknown arguments:\n(Log.Level level, const char* str) -> void\n(const char* str) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Log_printe(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t level = 0;
		const char *str = nullptr;
		static const char *kwlist[] = { "level", "str", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "Is", (char**)kwlist, &level, &str)) {
			Log::printe((Log::Level)level, str);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Log::printe(): unknown arguments:\n(Log.Level level, const char* str) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::Time
	static PyObject *Time_current(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLongLong(Time::current());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Time::current(): unknown arguments:\n(void) -> uint64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Time_seconds(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyFloat_FromDouble(Time::seconds());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Time::seconds(): unknown arguments:\n(void) -> float64_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *Time_sleep(PyObject *self, PyObject *args, PyObject *kwargs) {
		uint32_t usec = {};
		static const char *kwlist[] = { "usec", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "I", (char**)kwlist, &usec)) {
			Time::sleep(usec);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "Time::sleep(): unknown arguments:\n(uint32_t usec) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::System
	static PyObject *System_getThreadID(PyObject *self, PyObject *args) {
		if(!args || PyTuple_Size(args) == 0) {
			return PyLong_FromUnsignedLong(System::getThreadID());
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::getThreadID(): unknown arguments:\n(void) -> uint32_t\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_setEnvironment(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		const char *value = nullptr;
		static const char *kwlist[] = { "name", "value", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ss", (char**)kwlist, &name, &value)) {
			return PyLong_FromLong(System::setEnvironment(name, value));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			const char *value = nullptr;
			static const char *kwlist[] = { "name", "value", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "Os", (char**)kwlist, &name_, &value)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromLong(System::setEnvironment(name, value));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::setEnvironment(): unknown arguments:\n(const char* name, const char* value) -> bool\n(const String name, const char* value) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_getEnvironment(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyUnicode_FromString(System::getEnvironment(name).get());
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyUnicode_FromString(System::getEnvironment(name).get());
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::getEnvironment(): unknown arguments:\n(const char* name) -> String\n(const String name) -> String\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_loadLibrary(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *name = nullptr;
		static const char *kwlist[] = { "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &name)) {
			return PyLong_FromVoidPtr(System::loadLibrary(name));
		}
		PyErr_Clear();
		{
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromVoidPtr(System::loadLibrary(name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::loadLibrary(): unknown arguments:\n(const char* name) -> void*\n(const String name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_getFunction(PyObject *self, PyObject *args, PyObject *kwargs) {
		void *handle = nullptr;
		const char *name = nullptr;
		static const char *kwlist[] = { "handle", "name", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "ns", (char**)kwlist, &handle, &name)) {
			return PyLong_FromVoidPtr(System::getFunction(handle, name));
		}
		PyErr_Clear();
		{
			void *handle = nullptr;
			PyObject *name_ = nullptr;
			static const char *kwlist[] = { "handle", "name", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "nO", (char**)kwlist, &handle, &name_)) {
				if(!isPYString(name_)) break;
				const String &name = (name_) ? ((PyUnicode_Check(name_)) ? String(PyUnicode_AsUTF8(name_)) : (String)pyString_get(name_)) : String::null;
				return PyLong_FromVoidPtr(System::getFunction(handle, name));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::getFunction(): unknown arguments:\n(void* handle, const char* name) -> void*\n(void* handle, const String name) -> void*\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_closeLibrary(PyObject *self, PyObject *args, PyObject *kwargs) {
		void *handle = nullptr;
		static const char *kwlist[] = { "handle", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "n", (char**)kwlist, &handle)) {
			System::closeLibrary(handle);
			Py_RETURN_NONE;
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::closeLibrary(): unknown arguments:\n(void* handle) -> void\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_exec(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *command = nullptr;
		int32_t wait = false;
		static const char *kwlist[] = { "command", "wait", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", (char**)kwlist, &command, &wait)) {
			return PyLong_FromLong(System::exec(command, (wait != 0)));
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			int32_t wait = false;
			static const char *kwlist[] = { "command", "wait", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", (char**)kwlist, &command_, &wait)) {
				if(!isPYString(command_)) break;
				const String &command = (command_) ? ((PyUnicode_Check(command_)) ? String(PyUnicode_AsUTF8(command_)) : (String)pyString_get(command_)) : String::null;
				return PyLong_FromLong(System::exec(command, (wait != 0)));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::exec(): unknown arguments:\n(const char* command, bool wait) -> bool\n(const String command, bool wait) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	static PyObject *System_open(PyObject *self, PyObject *args, PyObject *kwargs) {
		const char *command = nullptr;
		static const char *kwlist[] = { "command", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "s", (char**)kwlist, &command)) {
			return PyLong_FromLong(System::open(command));
		}
		PyErr_Clear();
		{
			PyObject *command_ = nullptr;
			static const char *kwlist[] = { "command", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)kwlist, &command_)) {
				if(!isPYString(command_)) break;
				const String &command = (command_) ? ((PyUnicode_Check(command_)) ? String(PyUnicode_AsUTF8(command_)) : (String)pyString_get(command_)) : String::null;
				return PyLong_FromLong(System::open(command));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "System::open(): unknown arguments:\n(const char* command) -> bool\n(const String command) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::MeshGraph
	static bool pyMeshGraph_ProgressCallback(uint32_t progress, PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("(I)", progress);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	static PyObject *MeshGraph_create(PyObject *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		uint32_t max_attributes = {};
		uint32_t max_primitives = {};
		PyObject *func_ = nullptr;
		PyObject *async_ = nullptr;
		static const char *kwlist[] = { "dest", "src", "max_attributes", "max_primitives", "func", "tasks", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOII|OO", (char**)kwlist, &dest_, &src_, &max_attributes, &max_primitives, &func_, &async_)) {
			if(!isPYMesh(dest_)) break;
			Mesh &dest = pyMesh_get(dest_);
			if(!isPYMesh(src_)) break;
			Mesh &src = pyMesh_get(src_);
			MeshGraph::ProgressCallback func__;
			if(func_) {
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyMeshGraph_ProgressCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				func__ = func;
			}
			Async *async = (async_) ? &pyAsync_get(async_) : nullptr;
			return PyLong_FromLong(MeshGraph::create(dest, src, max_attributes, max_primitives, &func__, async));
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshGraph::create(): unknown arguments:\n(Mesh dest, Mesh src, uint32_t max_attributes, uint32_t max_primitives, const MeshGraph.ProgressCallback* func, Async* async) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::MeshReduce
	static bool pyMeshReduce_ProgressCallback(uint32_t progress, PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("(I)", progress);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	static PyObject *MeshReduce_collapse(PyObject *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		float32_t ratio = {};
		float32_t threshold = 0.0f;
		PyObject *func_ = nullptr;
		uint32_t position = Maxu32;
		static const char *kwlist[] = { "dest", "src", "ratio", "threshold", "func", "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOf|fOI", (char**)kwlist, &dest_, &src_, &ratio, &threshold, &func_, &position)) {
			if(!isPYMeshGeometry(dest_)) break;
			MeshGeometry &dest = pyMeshGeometry_get(dest_);
			if(!isPYMeshGeometry(src_)) break;
			const MeshGeometry &src = pyMeshGeometry_get(src_);
			MeshReduce::ProgressCallback func__;
			if(func_) {
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyMeshReduce_ProgressCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				func__ = func;
			}
			return PyLong_FromLong(MeshReduce::collapse(dest, src, ratio, threshold, &func__, position));
		}
		PyErr_Clear();
		{
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			float32_t ratio = {};
			float32_t threshold = 0.0f;
			PyObject *func_ = nullptr;
			static const char *kwlist[] = { "dest", "src", "ratio", "threshold", "func", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOf|fO", (char**)kwlist, &dest_, &src_, &ratio, &threshold, &func_)) {
				if(!isPYMesh(dest_)) break;
				Mesh &dest = pyMesh_get(dest_);
				if(!isPYMesh(src_)) break;
				const Mesh &src = pyMesh_get(src_);
				MeshReduce::ProgressCallback func__;
				if(func_) {
					if(!PyCallable_Check(func_)) break;
					auto func = makeFunction(pyMeshReduce_ProgressCallback);
					func.setArg1(func_);
					Py_INCREF(func_);
					func__ = func;
				}
				return PyLong_FromLong(MeshReduce::collapse(dest, src, ratio, threshold, &func__));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshReduce::collapse(): unknown arguments:\n(MeshGeometry dest, const MeshGeometry src, float32_t ratio, float32_t threshold, const MeshReduce.ProgressCallback* func, uint32_t position) -> bool\n(Mesh dest, const Mesh src, float32_t ratio, float32_t threshold, const MeshReduce.ProgressCallback* func) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::MeshRefine
	static PyObject *MeshRefine_subdiv(PyObject *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		uint32_t steps = {};
		uint32_t position = Maxu32;
		static const char *kwlist[] = { "dest", "src", "steps", "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOI|I", (char**)kwlist, &dest_, &src_, &steps, &position)) {
			if(!isPYMeshGeometry(dest_)) break;
			MeshGeometry &dest = pyMeshGeometry_get(dest_);
			if(!isPYMeshGeometry(src_)) break;
			const MeshGeometry &src = pyMeshGeometry_get(src_);
			return PyLong_FromLong(MeshRefine::subdiv(dest, src, steps, position));
		}
		PyErr_Clear();
		{
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			uint32_t steps = {};
			static const char *kwlist[] = { "dest", "src", "steps", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OOI", (char**)kwlist, &dest_, &src_, &steps)) {
				if(!isPYMesh(dest_)) break;
				Mesh &dest = pyMesh_get(dest_);
				if(!isPYMesh(src_)) break;
				const Mesh &src = pyMesh_get(src_);
				return PyLong_FromLong(MeshRefine::subdiv(dest, src, steps));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshRefine::subdiv(): unknown arguments:\n(MeshGeometry dest, const MeshGeometry src, uint32_t steps, uint32_t position) -> bool\n(Mesh dest, const Mesh src, uint32_t steps) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Tellusim::MeshSolid
	static bool pyMeshSolid_ProgressCallback(uint32_t progress, PyObject *func) {
		bool ret = {};
		if(func) {
			PyObject *args = Py_BuildValue("(I)", progress);
			PyObject *ret_ = PyObject_CallObject(func, args);
			if(ret_) {
				ret = (Py_IsTrue(ret_) != 0);
				Py_DECREF(ret_);
			} else if(PyErr_Occurred()) {
				PyErr_PrintEx(0);
				PyErr_Clear();
			}
			Py_DECREF(args);
		}
		return ret;
	}
	static PyObject *MeshSolid_create(PyObject *self, PyObject *args, PyObject *kwargs) {
		PyObject *dest_ = nullptr;
		PyObject *src_ = nullptr;
		float32_t ratio = 1.0f;
		float32_t threshold = 0.9f;
		PyObject *func_ = nullptr;
		uint32_t position = Maxu32;
		static const char *kwlist[] = { "dest", "src", "ratio", "threshold", "func", "position", nullptr };
		while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|ffOI", (char**)kwlist, &dest_, &src_, &ratio, &threshold, &func_, &position)) {
			if(!isPYMeshGeometry(dest_)) break;
			MeshGeometry &dest = pyMeshGeometry_get(dest_);
			if(!isPYMeshGeometry(src_)) break;
			const MeshGeometry &src = pyMeshGeometry_get(src_);
			MeshSolid::ProgressCallback func__;
			if(func_) {
				if(!PyCallable_Check(func_)) break;
				auto func = makeFunction(pyMeshSolid_ProgressCallback);
				func.setArg1(func_);
				Py_INCREF(func_);
				func__ = func;
			}
			return PyLong_FromLong(MeshSolid::create(dest, src, ratio, threshold, &func__, position));
		}
		PyErr_Clear();
		{
			PyObject *dest_ = nullptr;
			PyObject *src_ = nullptr;
			float32_t ratio = 1.0f;
			float32_t threshold = 0.9f;
			PyObject *func_ = nullptr;
			static const char *kwlist[] = { "dest", "src", "ratio", "threshold", "func", nullptr };
			while(PyArg_ParseTupleAndKeywords(args, kwargs, "OO|ffO", (char**)kwlist, &dest_, &src_, &ratio, &threshold, &func_)) {
				if(!isPYMesh(dest_)) break;
				Mesh &dest = pyMesh_get(dest_);
				if(!isPYMesh(src_)) break;
				const Mesh &src = pyMesh_get(src_);
				MeshSolid::ProgressCallback func__;
				if(func_) {
					if(!PyCallable_Check(func_)) break;
					auto func = makeFunction(pyMeshSolid_ProgressCallback);
					func.setArg1(func_);
					Py_INCREF(func_);
					func__ = func;
				}
				return PyLong_FromLong(MeshSolid::create(dest, src, ratio, threshold, &func__));
			}
		}
		#if TS_DEBUG
			PyErr_SetString(PyExc_TypeError, "MeshSolid::create(): unknown arguments:\n(MeshGeometry dest, const MeshGeometry src, float32_t ratio, float32_t threshold, const MeshSolid.ProgressCallback* func, uint32_t position) -> bool\n(Mesh dest, const Mesh src, float32_t ratio, float32_t threshold, const MeshSolid.ProgressCallback* func) -> bool\n");
		#else
			pyBadArguments();
		#endif
		return nullptr;
	}
	
	// Init Tellusim API
	bool pyInitAPI(Array<PyMethodDef> &methods) {
		
		// Tellusim::String
		PYString_methods.reserve(PYString_methods.size() + 67);
		PYString_methods.append(PyMethodDef { "reserve", (PyCFunction)String_reserve, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "resize", (PyCFunction)String_resize, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "release", (PyCFunction)String_release, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "clear", (PyCFunction)String_clear, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "copy", (PyCFunction)String_copy, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "append", (PyCFunction)String_append, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "insert", (PyCFunction)String_insert, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "removeBack", (PyCFunction)String_removeBack, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "remove", (PyCFunction)String_remove, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "reverse", (PyCFunction)String_reverse, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "size", (PyCFunction)String_size, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "empty", (PyCFunction)String_empty, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "get", (PyCFunction)String_get, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "find", (PyCFunction)String_find, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "rfind", (PyCFunction)String_rfind, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "count", (PyCFunction)String_count, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "begins", (PyCFunction)String_begins, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "contains", (PyCFunction)String_contains, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "match", (PyCFunction)String_match, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "compare", (PyCFunction)String_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "distance", (PyCFunction)String_distance, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "begin", (PyCFunction)String_begin, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "end", (PyCFunction)String_end, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "front", (PyCFunction)String_front, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "back", (PyCFunction)String_back, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "substring", (PyCFunction)String_substring, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "replace", (PyCFunction)String_replace, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "split", (PyCFunction)String_split, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "extension", (PyCFunction)String_extension, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "pathname", (PyCFunction)String_pathname, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "basename", (PyCFunction)String_basename, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "dirname", (PyCFunction)String_dirname, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "relname", (PyCFunction)String_relname, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "capitalize", (PyCFunction)String_capitalize, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "lower", (PyCFunction)String_lower, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "upper", (PyCFunction)String_upper, METH_NOARGS, "" });
		PYString_methods.append(PyMethodDef { "toUtf32", (PyCFunction)String_toUtf32, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toUtf16", (PyCFunction)String_toUtf16, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "fromUtf32", (PyCFunction)String_fromUtf32, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromUtf16", (PyCFunction)String_fromUtf16, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromUrl", (PyCFunction)String_fromUrl, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromi32", (PyCFunction)String_fromi32, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromi64", (PyCFunction)String_fromi64, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromu32", (PyCFunction)String_fromu32, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromu64", (PyCFunction)String_fromu64, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromf32", (PyCFunction)String_fromf32, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromf64", (PyCFunction)String_fromf64, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "toi32", (PyCFunction)String_toi32, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toi64", (PyCFunction)String_toi64, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "tou32", (PyCFunction)String_tou32, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "tou64", (PyCFunction)String_tou64, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "tof32", (PyCFunction)String_tof32, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "tof64", (PyCFunction)String_tof64, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toHashu32", (PyCFunction)String_toHashu32, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toHashu64", (PyCFunction)String_toHashu64, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toRGBAu8", (PyCFunction)String_toRGBAu8, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "fromTime", (PyCFunction)String_fromTime, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromBytes", (PyCFunction)String_fromBytes, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromNumber", (PyCFunction)String_fromNumber, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromFrequency", (PyCFunction)String_fromFrequency, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromLength", (PyCFunction)String_fromLength, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "fromAngle", (PyCFunction)String_fromAngle, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYString_methods.append(PyMethodDef { "toBytes", (PyCFunction)String_toBytes, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toNumber", (PyCFunction)String_toNumber, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toFrequency", (PyCFunction)String_toFrequency, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef { "toLength", (PyCFunction)String_toLength, METH_VARARGS | METH_KEYWORDS, "" });
		PYString_methods.append(PyMethodDef {});
		PYString_getsets.reserve(PYString_getsets.size() + 1);
		PYString_getsets.append(PyGetSetDef {});
		PYString_Type.tp_dealloc = (destructor)pyString_dealloc;
		PYString_number.nb_bool = (inquiry)pyString_bool;
		PYString_Type.tp_name = "tellusim.String";
		PYString_Type.tp_basicsize = sizeof(PYString);
		PYString_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYString_Type.tp_doc = "";
		PYString_Type.tp_str = (reprfunc)pyString_str;
		PYString_Type.tp_as_number = &PYString_number;
		PYString_Type.tp_methods = PYString_methods.discard();
		PYString_Type.tp_getset = PYString_getsets.discard();
		PYString_Type.tp_init = (initproc)pyString_init;
		PYString_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYString_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "String");
			return false;
		}
		Py_INCREF(&PYString_Type);
		
		// Tellusim::App
		PYApp_methods.reserve(PYApp_methods.size() + 20);
		PYApp_methods.append(PyMethodDef { "clear", (PyCFunction)App_clear, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getPlatform", (PyCFunction)App_getPlatform, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getDevice", (PyCFunction)App_getDevice, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getWidth", (PyCFunction)App_getWidth, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getHeight", (PyCFunction)App_getHeight, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getMultisample", (PyCFunction)App_getMultisample, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getNumArguments", (PyCFunction)App_getNumArguments, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "getArgument", (PyCFunction)App_getArgument, METH_VARARGS | METH_KEYWORDS, "" });
		PYApp_methods.append(PyMethodDef { "getArguments", (PyCFunction)App_getArguments, METH_NOARGS, "" });
		PYApp_methods.append(PyMethodDef { "isArgument", (PyCFunction)App_isArgument, METH_VARARGS | METH_KEYWORDS, "" });
		PYApp_methods.append(PyMethodDef { "create", (PyCFunction)App_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYApp_methods.append(PyMethodDef { "setPlatform", (PyCFunction)App_setPlatform, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "setSize", (PyCFunction)App_setSize, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "isBuildDebug", (PyCFunction)App_isBuildDebug, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "isBuildFloat64", (PyCFunction)App_isBuildFloat64, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "getBuildDate", (PyCFunction)App_getBuildDate, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "getBuildInfo", (PyCFunction)App_getBuildInfo, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "getVersion", (PyCFunction)App_getVersion, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef { "getAPIHash", (PyCFunction)App_getAPIHash, METH_NOARGS | METH_STATIC, "" });
		PYApp_methods.append(PyMethodDef {});
		PYApp_getsets.reserve(PYApp_getsets.size() + 11);
		PYApp_getsets.append(PyGetSetDef { "platform", (getter)App_get_platform, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "device", (getter)App_get_device, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "width", (getter)App_get_width, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "height", (getter)App_get_height, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "multisample", (getter)App_get_multisample, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "num_arguments", (getter)App_get_num_arguments, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "build_date", (getter)App_get_build_date, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "build_info", (getter)App_get_build_info, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "version", (getter)App_get_version, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef { "api_hash", (getter)App_get_api_hash, nullptr, "", nullptr });
		PYApp_getsets.append(PyGetSetDef {});
		PYApp_Type.tp_dealloc = (destructor)pyApp_dealloc;
		PYApp_number.nb_bool = (inquiry)pyApp_bool;
		PYApp_Type.tp_name = "tellusim.App";
		PYApp_Type.tp_basicsize = sizeof(PYApp);
		PYApp_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYApp_Type.tp_doc = "";
		PYApp_Type.tp_str = (reprfunc)pyApp_str;
		PYApp_Type.tp_as_number = &PYApp_number;
		PYApp_Type.tp_methods = PYApp_methods.discard();
		PYApp_Type.tp_getset = PYApp_getsets.discard();
		PYApp_Type.tp_init = (initproc)pyApp_init;
		PYApp_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYApp_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "App");
			return false;
		}
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_19", PyLong_FromLong(20221010));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_20", PyLong_FromLong(20221109));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_21", PyLong_FromLong(20221122));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_22", PyLong_FromLong(20221222));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_23", PyLong_FromLong(20230117));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_24", PyLong_FromLong(20230217));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_25", PyLong_FromLong(20230402));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_26", PyLong_FromLong(20230509));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_27", PyLong_FromLong(20230612));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_28", PyLong_FromLong(20230718));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_29", PyLong_FromLong(20230824));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_30", PyLong_FromLong(20231029));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_31", PyLong_FromLong(20231113));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_32", PyLong_FromLong(20231212));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_33", PyLong_FromLong(20240116));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_34", PyLong_FromLong(20240216));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_35", PyLong_FromLong(20240320));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_36", PyLong_FromLong(20240427));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version_37", PyLong_FromLong(20240515));
		PyDict_SetItemString(PYApp_Type.tp_dict, "Version", PyLong_FromLong(20240515));
		PyType_Modified(&PYApp_Type);
		Py_INCREF(&PYApp_Type);
		
		// Tellusim::Async
		PYAsync_methods.reserve(PYAsync_methods.size() + 21);
		PYAsync_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyAsync_equalPtr, METH_VARARGS, "" });
		PYAsync_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyAsync_clonePtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyAsync_clearPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyAsync_destroyPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyAsync_acquirePtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyAsync_unacquirePtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyAsync_isValidPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyAsync_isOwnerPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyAsync_isConstPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyAsync_getCountPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyAsync_getInternalPtr, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "init", (PyCFunction)Async_init, METH_VARARGS | METH_KEYWORDS, "" });
		PYAsync_methods.append(PyMethodDef { "shutdown", (PyCFunction)Async_shutdown, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "isInitialized", (PyCFunction)Async_isInitialized, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "getNumCores", (PyCFunction)Async_getNumCores, METH_NOARGS | METH_STATIC, "" });
		PYAsync_methods.append(PyMethodDef { "getNumThreads", (PyCFunction)Async_getNumThreads, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "clear", (PyCFunction)Async_clear, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "getNumTasks", (PyCFunction)Async_getNumTasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYAsync_methods.append(PyMethodDef { "check", (PyCFunction)Async_check, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef { "wait", (PyCFunction)Async_wait, METH_NOARGS, "" });
		PYAsync_methods.append(PyMethodDef {});
		PYAsync_getsets.reserve(PYAsync_getsets.size() + 4);
		PYAsync_getsets.append(PyGetSetDef { "num_cores", (getter)Async_get_num_cores, nullptr, "", nullptr });
		PYAsync_getsets.append(PyGetSetDef { "num_threads", (getter)Async_get_num_threads, nullptr, "", nullptr });
		PYAsync_getsets.append(PyGetSetDef { "num_tasks", (getter)Async_get_num_tasks, nullptr, "", nullptr });
		PYAsync_getsets.append(PyGetSetDef {});
		PYAsync_Type.tp_dealloc = (destructor)pyAsync_dealloc;
		PYAsync_number.nb_bool = (inquiry)pyAsync_bool;
		PYAsync_Type.tp_name = "tellusim.Async";
		PYAsync_Type.tp_basicsize = sizeof(PYAsync);
		PYAsync_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYAsync_Type.tp_doc = "";
		PYAsync_Type.tp_str = (reprfunc)pyAsync_str;
		PYAsync_Type.tp_as_number = &PYAsync_number;
		PYAsync_Type.tp_methods = PYAsync_methods.discard();
		PYAsync_Type.tp_getset = PYAsync_getsets.discard();
		PYAsync_Type.tp_init = (initproc)pyAsync_init;
		PYAsync_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYAsync_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Async");
			return false;
		}
		Py_INCREF(&PYAsync_Type);
		
		// Tellusim::Stream
		PYStream_methods.reserve(PYStream_methods.size() + 78);
		PYStream_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyStream_equalPtr, METH_VARARGS, "" });
		PYStream_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyStream_clonePtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyStream_clearPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyStream_destroyPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyStream_acquirePtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyStream_unacquirePtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyStream_isValidPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyStream_isOwnerPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyStream_isConstPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyStream_getCountPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyStream_getInternalPtr, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "move", (PyCFunction)Stream_move, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isOpened", (PyCFunction)Stream_isOpened, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isMapped", (PyCFunction)Stream_isMapped, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "isAvailable", (PyCFunction)Stream_isAvailable, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "getSize", (PyCFunction)Stream_getSize, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "getName", (PyCFunction)Stream_getName, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "tell", (PyCFunction)Stream_tell, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "seek", (PyCFunction)Stream_seek, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "seekBack", (PyCFunction)Stream_seekBack, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "seekCur", (PyCFunction)Stream_seekCur, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "getData", (PyCFunction)Stream_getData, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "read", (PyCFunction)Stream_read, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "write", (PyCFunction)Stream_write, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "flush", (PyCFunction)Stream_flush, METH_NOARGS, "" });
		PYStream_methods.append(PyMethodDef { "puts", (PyCFunction)Stream_puts, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "gets", (PyCFunction)Stream_gets, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi8", (PyCFunction)Stream_readi8, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei8", (PyCFunction)Stream_writei8, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu8", (PyCFunction)Stream_readu8, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu8", (PyCFunction)Stream_writeu8, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi16", (PyCFunction)Stream_readi16, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei16", (PyCFunction)Stream_writei16, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu16", (PyCFunction)Stream_readu16, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu16", (PyCFunction)Stream_writeu16, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi32", (PyCFunction)Stream_readi32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei32", (PyCFunction)Stream_writei32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu32", (PyCFunction)Stream_readu32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu32", (PyCFunction)Stream_writeu32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi64", (PyCFunction)Stream_readi64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei64", (PyCFunction)Stream_writei64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu64", (PyCFunction)Stream_readu64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu64", (PyCFunction)Stream_writeu64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readf32", (PyCFunction)Stream_readf32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writef32", (PyCFunction)Stream_writef32, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readf64", (PyCFunction)Stream_readf64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writef64", (PyCFunction)Stream_writef64, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi32e", (PyCFunction)Stream_readi32e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei32e", (PyCFunction)Stream_writei32e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu32e", (PyCFunction)Stream_readu32e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu32e", (PyCFunction)Stream_writeu32e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readi64e", (PyCFunction)Stream_readi64e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writei64e", (PyCFunction)Stream_writei64e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readu64e", (PyCFunction)Stream_readu64e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeu64e", (PyCFunction)Stream_writeu64e, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readString", (PyCFunction)Stream_readString, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeString", (PyCFunction)Stream_writeString, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readToken", (PyCFunction)Stream_readToken, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readLine", (PyCFunction)Stream_readLine, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readStream", (PyCFunction)Stream_readStream, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeStream", (PyCFunction)Stream_writeStream, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readZip", (PyCFunction)Stream_readZip, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeZip", (PyCFunction)Stream_writeZip, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeZipFast", (PyCFunction)Stream_writeZipFast, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeZipBest", (PyCFunction)Stream_writeZipBest, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "readLz4", (PyCFunction)Stream_readLz4, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeLz4", (PyCFunction)Stream_writeLz4, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeLz4Fast", (PyCFunction)Stream_writeLz4Fast, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "writeLz4Best", (PyCFunction)Stream_writeLz4Best, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "decodeZip", (PyCFunction)Stream_decodeZip, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeZip", (PyCFunction)Stream_encodeZip, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeZipFast", (PyCFunction)Stream_encodeZipFast, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeZipBest", (PyCFunction)Stream_encodeZipBest, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "decodeLz4", (PyCFunction)Stream_decodeLz4, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeLz4", (PyCFunction)Stream_encodeLz4, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeLz4Fast", (PyCFunction)Stream_encodeLz4Fast, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef { "encodeLz4Best", (PyCFunction)Stream_encodeLz4Best, METH_VARARGS | METH_KEYWORDS, "" });
		PYStream_methods.append(PyMethodDef {});
		PYStream_getsets.reserve(PYStream_getsets.size() + 4);
		PYStream_getsets.append(PyGetSetDef { "size", (getter)Stream_get_size, nullptr, "", nullptr });
		PYStream_getsets.append(PyGetSetDef { "name", (getter)Stream_get_name, nullptr, "", nullptr });
		PYStream_getsets.append(PyGetSetDef { "data", (getter)Stream_get_data, nullptr, "", nullptr });
		PYStream_getsets.append(PyGetSetDef {});
		PYStream_Type.tp_dealloc = (destructor)pyStream_dealloc;
		PYStream_number.nb_bool = (inquiry)pyStream_bool;
		PYStream_Type.tp_name = "tellusim.Stream";
		PYStream_Type.tp_basicsize = sizeof(PYStream);
		PYStream_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYStream_Type.tp_doc = "";
		PYStream_Type.tp_str = (reprfunc)pyStream_str;
		PYStream_Type.tp_as_number = &PYStream_number;
		PYStream_Type.tp_methods = PYStream_methods.discard();
		PYStream_Type.tp_getset = PYStream_getsets.discard();
		PYStream_Type.tp_init = (initproc)pyStream_init;
		PYStream_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYStream_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Stream");
			return false;
		}
		Py_INCREF(&PYStream_Type);
		
		// Tellusim::Blob
		PYBlob_methods.reserve(PYBlob_methods.size() + 24);
		PYBlob_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyBlob_equalPtr, METH_VARARGS, "" });
		PYBlob_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyBlob_clonePtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyBlob_clearPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyBlob_destroyPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyBlob_acquirePtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyBlob_unacquirePtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyBlob_isValidPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyBlob_isOwnerPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyBlob_isConstPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyBlob_getCountPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyBlob_getInternalPtr, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "release", (PyCFunction)Blob_release, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "clear", (PyCFunction)Blob_clear, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "setName", (PyCFunction)Blob_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "setSize", (PyCFunction)Blob_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "setCapacity", (PyCFunction)Blob_setCapacity, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "getCapacity", (PyCFunction)Blob_getCapacity, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "setData", (PyCFunction)Blob_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "getData", (PyCFunction)Blob_getData, METH_NOARGS, "" });
		PYBlob_methods.append(PyMethodDef { "encodeBase64", (PyCFunction)Blob_encodeBase64, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "decodeBase64", (PyCFunction)Blob_decodeBase64, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "getMD5", (PyCFunction)Blob_getMD5, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef { "getSHA1", (PyCFunction)Blob_getSHA1, METH_VARARGS | METH_KEYWORDS, "" });
		PYBlob_methods.append(PyMethodDef {});
		PYBlob_getsets.reserve(PYBlob_getsets.size() + 5);
		PYBlob_getsets.append(PyGetSetDef { "capacity", (getter)Blob_get_capacity, nullptr, "", nullptr });
		PYBlob_getsets.append(PyGetSetDef { "data", (getter)Blob_get_data, nullptr, "", nullptr });
		PYBlob_getsets.append(PyGetSetDef { "md5", (getter)Blob_get_md5, nullptr, "", nullptr });
		PYBlob_getsets.append(PyGetSetDef { "sha1", (getter)Blob_get_sha1, nullptr, "", nullptr });
		PYBlob_getsets.append(PyGetSetDef {});
		PYBlob_Type.tp_base = &PYStream_Type;
		PYBlob_Type.tp_dealloc = (destructor)pyBlob_dealloc;
		PYBlob_number.nb_bool = (inquiry)pyBlob_bool;
		PYBlob_Type.tp_name = "tellusim.Blob";
		PYBlob_Type.tp_basicsize = sizeof(PYBlob);
		PYBlob_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYBlob_Type.tp_doc = "";
		PYBlob_Type.tp_str = (reprfunc)pyBlob_str;
		PYBlob_Type.tp_as_number = &PYBlob_number;
		PYBlob_Type.tp_methods = PYBlob_methods.discard();
		PYBlob_Type.tp_getset = PYBlob_getsets.discard();
		PYBlob_Type.tp_init = (initproc)pyBlob_init;
		PYBlob_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYBlob_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Blob");
			return false;
		}
		Py_INCREF(&PYBlob_Type);
		
		// Tellusim::File
		PYFile_methods.reserve(PYFile_methods.size() + 19);
		PYFile_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFile_equalPtr, METH_VARARGS, "" });
		PYFile_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFile_clonePtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFile_clearPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFile_destroyPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFile_acquirePtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFile_unacquirePtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFile_isValidPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFile_isOwnerPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFile_isConstPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFile_getCountPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFile_getInternalPtr, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "open", (PyCFunction)File_open, METH_VARARGS | METH_KEYWORDS, "" });
		PYFile_methods.append(PyMethodDef { "popen", (PyCFunction)File_popen, METH_VARARGS | METH_KEYWORDS, "" });
		PYFile_methods.append(PyMethodDef { "close", (PyCFunction)File_close, METH_NOARGS, "" });
		PYFile_methods.append(PyMethodDef { "isFile", (PyCFunction)File_isFile, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYFile_methods.append(PyMethodDef { "getMTime", (PyCFunction)File_getMTime, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYFile_methods.append(PyMethodDef { "getSize", (PyCFunction)File_getSize, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYFile_methods.append(PyMethodDef { "remove", (PyCFunction)File_remove, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYFile_methods.append(PyMethodDef {});
		PYFile_getsets.reserve(PYFile_getsets.size() + 1);
		PYFile_getsets.append(PyGetSetDef {});
		PYFile_Type.tp_base = &PYStream_Type;
		PYFile_Type.tp_dealloc = (destructor)pyFile_dealloc;
		PYFile_number.nb_bool = (inquiry)pyFile_bool;
		PYFile_Type.tp_name = "tellusim.File";
		PYFile_Type.tp_basicsize = sizeof(PYFile);
		PYFile_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFile_Type.tp_doc = "";
		PYFile_Type.tp_str = (reprfunc)pyFile_str;
		PYFile_Type.tp_as_number = &PYFile_number;
		PYFile_Type.tp_methods = PYFile_methods.discard();
		PYFile_Type.tp_getset = PYFile_getsets.discard();
		PYFile_Type.tp_init = (initproc)pyFile_init;
		PYFile_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFile_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "File");
			return false;
		}
		Py_INCREF(&PYFile_Type);
		
		// Tellusim::Socket
		PYSocket_methods.reserve(PYSocket_methods.size() + 28);
		PYSocket_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySocket_equalPtr, METH_VARARGS, "" });
		PYSocket_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySocket_clonePtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySocket_clearPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySocket_destroyPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySocket_acquirePtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySocket_unacquirePtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySocket_isValidPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySocket_isOwnerPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySocket_isConstPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySocket_getCountPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySocket_getInternalPtr, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "open", (PyCFunction)Socket_open, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "close", (PyCFunction)Socket_close, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "connect", (PyCFunction)Socket_connect, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "accept", (PyCFunction)Socket_accept, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "select", (PyCFunction)Socket_select, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "setTimeout", (PyCFunction)Socket_setTimeout, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "getTimeout", (PyCFunction)Socket_getTimeout, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "setBlock", (PyCFunction)Socket_setBlock, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "getBlock", (PyCFunction)Socket_getBlock, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "setDelay", (PyCFunction)Socket_setDelay, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "getDelay", (PyCFunction)Socket_getDelay, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "setName", (PyCFunction)Socket_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocket_methods.append(PyMethodDef { "getPort", (PyCFunction)Socket_getPort, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "getFD", (PyCFunction)Socket_getFD, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "getType", (PyCFunction)Socket_getType, METH_NOARGS, "" });
		PYSocket_methods.append(PyMethodDef { "getAddress", (PyCFunction)Socket_getAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSocket_methods.append(PyMethodDef {});
		PYSocket_getsets.reserve(PYSocket_getsets.size() + 8);
		PYSocket_getsets.append(PyGetSetDef { "timeout", (getter)Socket_get_timeout, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "block", (getter)Socket_get_block, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "delay", (getter)Socket_get_delay, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "port", (getter)Socket_get_port, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "fd", (getter)Socket_get_fd, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "type", (getter)Socket_get_type, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef { "address", (getter)Socket_get_address, nullptr, "", nullptr });
		PYSocket_getsets.append(PyGetSetDef {});
		PYSocket_Type.tp_base = &PYStream_Type;
		PYSocket_Type.tp_dealloc = (destructor)pySocket_dealloc;
		PYSocket_number.nb_bool = (inquiry)pySocket_bool;
		PYSocket_Type.tp_name = "tellusim.Socket";
		PYSocket_Type.tp_basicsize = sizeof(PYSocket);
		PYSocket_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYSocket_Type.tp_doc = "";
		PYSocket_Type.tp_str = (reprfunc)pySocket_str;
		PYSocket_Type.tp_as_number = &PYSocket_number;
		PYSocket_Type.tp_methods = PYSocket_methods.discard();
		PYSocket_Type.tp_getset = PYSocket_getsets.discard();
		PYSocket_Type.tp_init = (initproc)pySocket_init;
		PYSocket_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSocket_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Socket");
			return false;
		}
		PyDict_SetItemString(PYSocket_Type.tp_dict, "TypeStream", PyLong_FromLong(0));
		PyDict_SetItemString(PYSocket_Type.tp_dict, "TypeDatagram", PyLong_FromLong(1));
		PyDict_SetItemString(PYSocket_Type.tp_dict, "NumTypes", PyLong_FromLong(2));
		PyType_Modified(&PYSocket_Type);
		Py_INCREF(&PYSocket_Type);
		
		// Tellusim::SocketSSL
		PYSocketSSL_methods.reserve(PYSocketSSL_methods.size() + 17);
		PYSocketSSL_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySocketSSL_equalPtr, METH_VARARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySocketSSL_clonePtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySocketSSL_clearPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySocketSSL_destroyPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySocketSSL_acquirePtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySocketSSL_unacquirePtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySocketSSL_isValidPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySocketSSL_isOwnerPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySocketSSL_isConstPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySocketSSL_getCountPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySocketSSL_getInternalPtr, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "getSocket", (PyCFunction)pySocketSSL_getSocket, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "handshake", (PyCFunction)SocketSSL_handshake, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "accept", (PyCFunction)SocketSSL_accept, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "load", (PyCFunction)SocketSSL_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYSocketSSL_methods.append(PyMethodDef { "isConnected", (PyCFunction)SocketSSL_isConnected, METH_NOARGS, "" });
		PYSocketSSL_methods.append(PyMethodDef {});
		PYSocketSSL_getsets.reserve(PYSocketSSL_getsets.size() + 1);
		PYSocketSSL_getsets.append(PyGetSetDef {});
		PYSocketSSL_Type.tp_base = &PYSocket_Type;
		PYSocketSSL_Type.tp_dealloc = (destructor)pySocketSSL_dealloc;
		PYSocketSSL_number.nb_bool = (inquiry)pySocketSSL_bool;
		PYSocketSSL_Type.tp_name = "tellusim.SocketSSL";
		PYSocketSSL_Type.tp_basicsize = sizeof(PYSocketSSL);
		PYSocketSSL_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYSocketSSL_Type.tp_doc = "";
		PYSocketSSL_Type.tp_str = (reprfunc)pySocketSSL_str;
		PYSocketSSL_Type.tp_as_number = &PYSocketSSL_number;
		PYSocketSSL_Type.tp_methods = PYSocketSSL_methods.discard();
		PYSocketSSL_Type.tp_getset = PYSocketSSL_getsets.discard();
		PYSocketSSL_Type.tp_init = (initproc)pySocketSSL_init;
		PYSocketSSL_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSocketSSL_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SocketSSL");
			return false;
		}
		Py_INCREF(&PYSocketSSL_Type);
		
		// Tellusim::Source
		PYSource_methods.reserve(PYSource_methods.size() + 19);
		PYSource_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySource_equalPtr, METH_VARARGS, "" });
		PYSource_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySource_clonePtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySource_clearPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySource_destroyPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySource_acquirePtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySource_unacquirePtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySource_isValidPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySource_isOwnerPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySource_isConstPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySource_getCountPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySource_getInternalPtr, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "open", (PyCFunction)Source_open, METH_VARARGS | METH_KEYWORDS, "" });
		PYSource_methods.append(PyMethodDef { "close", (PyCFunction)Source_close, METH_NOARGS, "" });
		PYSource_methods.append(PyMethodDef { "setName", (PyCFunction)Source_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYSource_methods.append(PyMethodDef { "setData", (PyCFunction)Source_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYSource_methods.append(PyMethodDef { "isSource", (PyCFunction)Source_isSource, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSource_methods.append(PyMethodDef { "getMTime", (PyCFunction)Source_getMTime, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSource_methods.append(PyMethodDef { "getSize", (PyCFunction)Source_getSize, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSource_methods.append(PyMethodDef {});
		PYSource_getsets.reserve(PYSource_getsets.size() + 1);
		PYSource_getsets.append(PyGetSetDef {});
		PYSource_Type.tp_base = &PYStream_Type;
		PYSource_Type.tp_dealloc = (destructor)pySource_dealloc;
		PYSource_number.nb_bool = (inquiry)pySource_bool;
		PYSource_Type.tp_name = "tellusim.Source";
		PYSource_Type.tp_basicsize = sizeof(PYSource);
		PYSource_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYSource_Type.tp_doc = "";
		PYSource_Type.tp_str = (reprfunc)pySource_str;
		PYSource_Type.tp_as_number = &PYSource_number;
		PYSource_Type.tp_methods = PYSource_methods.discard();
		PYSource_Type.tp_getset = PYSource_getsets.discard();
		PYSource_Type.tp_init = (initproc)pySource_init;
		PYSource_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSource_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Source");
			return false;
		}
		Py_INCREF(&PYSource_Type);
		
		// Tellusim::Date
		PYDate_methods.reserve(PYDate_methods.size() + 32);
		PYDate_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDate_equalPtr, METH_VARARGS, "" });
		PYDate_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDate_clonePtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDate_clearPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDate_destroyPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDate_acquirePtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDate_unacquirePtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDate_isValidPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDate_isOwnerPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDate_isConstPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDate_getCountPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDate_getInternalPtr, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "clear", (PyCFunction)Date_clear, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "setTime", (PyCFunction)Date_setTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "getTime", (PyCFunction)Date_getTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setString", (PyCFunction)Date_setString, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "getString", (PyCFunction)Date_getString, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setYear", (PyCFunction)Date_setYear, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setMonth", (PyCFunction)Date_setMonth, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setDate", (PyCFunction)Date_setDate, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setDay", (PyCFunction)Date_setDay, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setHours", (PyCFunction)Date_setHours, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setMinutes", (PyCFunction)Date_setMinutes, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "setSeconds", (PyCFunction)Date_setSeconds, METH_VARARGS | METH_KEYWORDS, "" });
		PYDate_methods.append(PyMethodDef { "getYear", (PyCFunction)Date_getYear, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getMonth", (PyCFunction)Date_getMonth, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getDate", (PyCFunction)Date_getDate, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getDay", (PyCFunction)Date_getDay, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getHours", (PyCFunction)Date_getHours, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getMinutes", (PyCFunction)Date_getMinutes, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getSeconds", (PyCFunction)Date_getSeconds, METH_NOARGS, "" });
		PYDate_methods.append(PyMethodDef { "getTimeZone", (PyCFunction)Date_getTimeZone, METH_NOARGS | METH_STATIC, "" });
		PYDate_methods.append(PyMethodDef {});
		PYDate_getsets.reserve(PYDate_getsets.size() + 11);
		PYDate_getsets.append(PyGetSetDef { "time", (getter)Date_get_time, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "string", (getter)Date_get_string, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "year", (getter)Date_get_year, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "month", (getter)Date_get_month, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "date", (getter)Date_get_date, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "day", (getter)Date_get_day, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "hours", (getter)Date_get_hours, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "minutes", (getter)Date_get_minutes, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "seconds", (getter)Date_get_seconds, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef { "time_zone", (getter)Date_get_time_zone, nullptr, "", nullptr });
		PYDate_getsets.append(PyGetSetDef {});
		PYDate_Type.tp_dealloc = (destructor)pyDate_dealloc;
		PYDate_number.nb_bool = (inquiry)pyDate_bool;
		PYDate_Type.tp_name = "tellusim.Date";
		PYDate_Type.tp_basicsize = sizeof(PYDate);
		PYDate_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDate_Type.tp_doc = "";
		PYDate_Type.tp_str = (reprfunc)pyDate_str;
		PYDate_Type.tp_as_number = &PYDate_number;
		PYDate_Type.tp_methods = PYDate_methods.discard();
		PYDate_Type.tp_getset = PYDate_getsets.discard();
		PYDate_Type.tp_init = (initproc)pyDate_init;
		PYDate_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDate_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Date");
			return false;
		}
		Py_INCREF(&PYDate_Type);
		
		// Tellusim::Info
		PYInfo_methods.reserve(PYInfo_methods.size() + 41);
		PYInfo_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyInfo_equalPtr, METH_VARARGS, "" });
		PYInfo_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyInfo_clonePtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyInfo_clearPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyInfo_destroyPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyInfo_acquirePtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyInfo_unacquirePtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyInfo_isValidPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyInfo_isOwnerPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyInfo_isConstPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyInfo_getCountPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyInfo_getInternalPtr, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getSystemMemory", (PyCFunction)Info_getSystemMemory, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getSystemUptime", (PyCFunction)Info_getSystemUptime, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getSystemName", (PyCFunction)Info_getSystemName, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getSystemVersion", (PyCFunction)Info_getSystemVersion, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getKernelVersion", (PyCFunction)Info_getKernelVersion, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUCount", (PyCFunction)Info_getCPUCount, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUName", (PyCFunction)Info_getCPUName, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUVendor", (PyCFunction)Info_getCPUVendor, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUCores", (PyCFunction)Info_getCPUCores, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUThreads", (PyCFunction)Info_getCPUThreads, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUFrequency", (PyCFunction)Info_getCPUFrequency, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUTemperature", (PyCFunction)Info_getCPUTemperature, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUUtilization", (PyCFunction)Info_getCPUUtilization, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUFanSpeed", (PyCFunction)Info_getCPUFanSpeed, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getCPUPower", (PyCFunction)Info_getCPUPower, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUCount", (PyCFunction)Info_getGPUCount, METH_NOARGS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUName", (PyCFunction)Info_getGPUName, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUVendor", (PyCFunction)Info_getGPUVendor, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUSerial", (PyCFunction)Info_getGPUSerial, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUDevice", (PyCFunction)Info_getGPUDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUVersion", (PyCFunction)Info_getGPUVersion, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUMemory", (PyCFunction)Info_getGPUMemory, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUScreens", (PyCFunction)Info_getGPUScreens, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUFrequency", (PyCFunction)Info_getGPUFrequency, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUTemperature", (PyCFunction)Info_getGPUTemperature, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUUtilization", (PyCFunction)Info_getGPUUtilization, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUFanSpeed", (PyCFunction)Info_getGPUFanSpeed, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "getGPUPower", (PyCFunction)Info_getGPUPower, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef { "isGPUThrottling", (PyCFunction)Info_isGPUThrottling, METH_VARARGS | METH_KEYWORDS, "" });
		PYInfo_methods.append(PyMethodDef {});
		PYInfo_getsets.reserve(PYInfo_getsets.size() + 8);
		PYInfo_getsets.append(PyGetSetDef { "system_memory", (getter)Info_get_system_memory, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "system_uptime", (getter)Info_get_system_uptime, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "system_name", (getter)Info_get_system_name, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "system_version", (getter)Info_get_system_version, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "kernel_version", (getter)Info_get_kernel_version, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "cpu_count", (getter)Info_get_cpu_count, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef { "gpu_count", (getter)Info_get_gpu_count, nullptr, "", nullptr });
		PYInfo_getsets.append(PyGetSetDef {});
		PYInfo_Type.tp_dealloc = (destructor)pyInfo_dealloc;
		PYInfo_number.nb_bool = (inquiry)pyInfo_bool;
		PYInfo_Type.tp_name = "tellusim.Info";
		PYInfo_Type.tp_basicsize = sizeof(PYInfo);
		PYInfo_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYInfo_Type.tp_doc = "";
		PYInfo_Type.tp_str = (reprfunc)pyInfo_str;
		PYInfo_Type.tp_as_number = &PYInfo_number;
		PYInfo_Type.tp_methods = PYInfo_methods.discard();
		PYInfo_Type.tp_getset = PYInfo_getsets.discard();
		PYInfo_Type.tp_init = (initproc)pyInfo_init;
		PYInfo_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYInfo_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Info");
			return false;
		}
		Py_INCREF(&PYInfo_Type);
		
		// Tellusim::Directory
		PYDirectory_methods.reserve(PYDirectory_methods.size() + 47);
		PYDirectory_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDirectory_equalPtr, METH_VARARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDirectory_clonePtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDirectory_clearPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDirectory_destroyPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDirectory_acquirePtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDirectory_unacquirePtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDirectory_isValidPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDirectory_isOwnerPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDirectory_isConstPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDirectory_getCountPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDirectory_getInternalPtr, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "open", (PyCFunction)Directory_open, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "close", (PyCFunction)Directory_close, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "isOpened", (PyCFunction)Directory_isOpened, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getName", (PyCFunction)Directory_getName, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getNumFiles", (PyCFunction)Directory_getNumFiles, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileName", (PyCFunction)Directory_getFileName, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileAttributes", (PyCFunction)Directory_getFileAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileMTime", (PyCFunction)Directory_getFileMTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileATime", (PyCFunction)Directory_getFileATime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileCTime", (PyCFunction)Directory_getFileCTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFileSize", (PyCFunction)Directory_getFileSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getFiles", (PyCFunction)Directory_getFiles, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getNumDirectories", (PyCFunction)Directory_getNumDirectories, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "getDirectoryName", (PyCFunction)Directory_getDirectoryName, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getDirectoryAttributes", (PyCFunction)Directory_getDirectoryAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getDirectoryCTime", (PyCFunction)Directory_getDirectoryCTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getDirectorySize", (PyCFunction)Directory_getDirectorySize, METH_VARARGS | METH_KEYWORDS, "" });
		PYDirectory_methods.append(PyMethodDef { "getDirectories", (PyCFunction)Directory_getDirectories, METH_NOARGS, "" });
		PYDirectory_methods.append(PyMethodDef { "isFile", (PyCFunction)Directory_isFile, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "setFileAttributes", (PyCFunction)Directory_setFileAttributes, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "setFileMTime", (PyCFunction)Directory_setFileMTime, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "removeFile", (PyCFunction)Directory_removeFile, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "copyFile", (PyCFunction)Directory_copyFile, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "isDirectory", (PyCFunction)Directory_isDirectory, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "changeDirectory", (PyCFunction)Directory_changeDirectory, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "createDirectory", (PyCFunction)Directory_createDirectory, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "removeDirectory", (PyCFunction)Directory_removeDirectory, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "copyDirectory", (PyCFunction)Directory_copyDirectory, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "rename", (PyCFunction)Directory_rename, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getCurrentDirectory", (PyCFunction)Directory_getCurrentDirectory, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getHomeDirectory", (PyCFunction)Directory_getHomeDirectory, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getTempDirectory", (PyCFunction)Directory_getTempDirectory, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getConfigDirectory", (PyCFunction)Directory_getConfigDirectory, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getDocumentsDirectory", (PyCFunction)Directory_getDocumentsDirectory, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef { "getDriveNames", (PyCFunction)Directory_getDriveNames, METH_NOARGS | METH_STATIC, "" });
		PYDirectory_methods.append(PyMethodDef {});
		PYDirectory_getsets.reserve(PYDirectory_getsets.size() + 9);
		PYDirectory_getsets.append(PyGetSetDef { "name", (getter)Directory_get_name, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "num_files", (getter)Directory_get_num_files, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "num_directories", (getter)Directory_get_num_directories, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "current_directory", (getter)Directory_get_current_directory, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "home_directory", (getter)Directory_get_home_directory, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "temp_directory", (getter)Directory_get_temp_directory, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "config_directory", (getter)Directory_get_config_directory, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef { "documents_directory", (getter)Directory_get_documents_directory, nullptr, "", nullptr });
		PYDirectory_getsets.append(PyGetSetDef {});
		PYDirectory_Type.tp_dealloc = (destructor)pyDirectory_dealloc;
		PYDirectory_number.nb_bool = (inquiry)pyDirectory_bool;
		PYDirectory_Type.tp_name = "tellusim.Directory";
		PYDirectory_Type.tp_basicsize = sizeof(PYDirectory);
		PYDirectory_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDirectory_Type.tp_doc = "";
		PYDirectory_Type.tp_str = (reprfunc)pyDirectory_str;
		PYDirectory_Type.tp_as_number = &PYDirectory_number;
		PYDirectory_Type.tp_methods = PYDirectory_methods.discard();
		PYDirectory_Type.tp_getset = PYDirectory_getsets.discard();
		PYDirectory_Type.tp_init = (initproc)pyDirectory_init;
		PYDirectory_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDirectory_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Directory");
			return false;
		}
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeRead", PyLong_FromLong(1));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeWrite", PyLong_FromLong(2));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeHidden", PyLong_FromLong(4));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeExecute", PyLong_FromLong(8));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "AttributeTemporary", PyLong_FromLong(16));
		PyDict_SetItemString(PYDirectory_Type.tp_dict, "NumAttributes", PyLong_FromLong(5));
		PyType_Modified(&PYDirectory_Type);
		Py_INCREF(&PYDirectory_Type);
		
		// Tellusim::Archive
		PYArchive_methods.reserve(PYArchive_methods.size() + 12);
		PYArchive_methods.append(PyMethodDef { "open", (PyCFunction)Archive_open, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "close", (PyCFunction)Archive_close, METH_NOARGS, "" });
		PYArchive_methods.append(PyMethodDef { "isOpened", (PyCFunction)Archive_isOpened, METH_NOARGS, "" });
		PYArchive_methods.append(PyMethodDef { "getName", (PyCFunction)Archive_getName, METH_NOARGS, "" });
		PYArchive_methods.append(PyMethodDef { "getNumFiles", (PyCFunction)Archive_getNumFiles, METH_NOARGS, "" });
		PYArchive_methods.append(PyMethodDef { "getFileName", (PyCFunction)Archive_getFileName, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "getFileMTime", (PyCFunction)Archive_getFileMTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "getFileSize", (PyCFunction)Archive_getFileSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "findFile", (PyCFunction)Archive_findFile, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "isFile", (PyCFunction)Archive_isFile, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef { "openFile", (PyCFunction)Archive_openFile, METH_VARARGS | METH_KEYWORDS, "" });
		PYArchive_methods.append(PyMethodDef {});
		PYArchive_getsets.reserve(PYArchive_getsets.size() + 3);
		PYArchive_getsets.append(PyGetSetDef { "name", (getter)Archive_get_name, nullptr, "", nullptr });
		PYArchive_getsets.append(PyGetSetDef { "num_files", (getter)Archive_get_num_files, nullptr, "", nullptr });
		PYArchive_getsets.append(PyGetSetDef {});
		PYArchive_Type.tp_dealloc = (destructor)pyArchive_dealloc;
		PYArchive_number.nb_bool = (inquiry)pyArchive_bool;
		PYArchive_Type.tp_name = "tellusim.Archive";
		PYArchive_Type.tp_basicsize = sizeof(PYArchive);
		PYArchive_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYArchive_Type.tp_doc = "";
		PYArchive_Type.tp_str = (reprfunc)pyArchive_str;
		PYArchive_Type.tp_as_number = &PYArchive_number;
		PYArchive_Type.tp_methods = PYArchive_methods.discard();
		PYArchive_Type.tp_getset = PYArchive_getsets.discard();
		PYArchive_Type.tp_init = (initproc)pyArchive_init;
		PYArchive_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYArchive_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Archive");
			return false;
		}
		Py_INCREF(&PYArchive_Type);
		
		// Tellusim::Image
		PYImage_methods.reserve(PYImage_methods.size() + 98);
		PYImage_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyImage_equalPtr, METH_VARARGS, "" });
		PYImage_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyImage_clonePtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyImage_clearPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyImage_destroyPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyImage_acquirePtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyImage_unacquirePtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyImage_isValidPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyImage_isOwnerPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyImage_isConstPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyImage_getCountPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyImage_getInternalPtr, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "clear", (PyCFunction)Image_clear, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isLoaded", (PyCFunction)Image_isLoaded, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isAllocated", (PyCFunction)Image_isAllocated, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getType", (PyCFunction)Image_getType, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Image_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "is2DType", (PyCFunction)Image_is2DType, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "is3DType", (PyCFunction)Image_is3DType, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isCubeType", (PyCFunction)Image_isCubeType, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getFormat", (PyCFunction)Image_getFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getFormatName", (PyCFunction)Image_getFormatName, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isColorFormat", (PyCFunction)Image_isColorFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isDepthFormat", (PyCFunction)Image_isDepthFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isPixelFormat", (PyCFunction)Image_isPixelFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isPlainFormat", (PyCFunction)Image_isPlainFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isMixedFormat", (PyCFunction)Image_isMixedFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isBlockFormat", (PyCFunction)Image_isBlockFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isStencilFormat", (PyCFunction)Image_isStencilFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isNormFormat", (PyCFunction)Image_isNormFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isSRGBFormat", (PyCFunction)Image_isSRGBFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isFloatFormat", (PyCFunction)Image_isFloatFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isSignedFormat", (PyCFunction)Image_isSignedFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isUnsignedFormat", (PyCFunction)Image_isUnsignedFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isIntegerFormat", (PyCFunction)Image_isIntegerFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isi8Format", (PyCFunction)Image_isi8Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isu8Format", (PyCFunction)Image_isu8Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "is8BitFormat", (PyCFunction)Image_is8BitFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isi16Format", (PyCFunction)Image_isi16Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isu16Format", (PyCFunction)Image_isu16Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isf16Format", (PyCFunction)Image_isf16Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "is16BitFormat", (PyCFunction)Image_is16BitFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isi32Format", (PyCFunction)Image_isi32Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isu32Format", (PyCFunction)Image_isu32Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isf32Format", (PyCFunction)Image_isf32Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "is32BitFormat", (PyCFunction)Image_is32BitFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isi64Format", (PyCFunction)Image_isi64Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isu64Format", (PyCFunction)Image_isu64Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isf64Format", (PyCFunction)Image_isf64Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "is64BitFormat", (PyCFunction)Image_is64BitFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isBC15Format", (PyCFunction)Image_isBC15Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isBC67Format", (PyCFunction)Image_isBC67Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isETC2Format", (PyCFunction)Image_isETC2Format, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "isASTCFormat", (PyCFunction)Image_isASTCFormat, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getComponents", (PyCFunction)Image_getComponents, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getPixelSize", (PyCFunction)Image_getPixelSize, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getBlockSize", (PyCFunction)Image_getBlockSize, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getBlockWidth", (PyCFunction)Image_getBlockWidth, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getBlockHeight", (PyCFunction)Image_getBlockHeight, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getWidth", (PyCFunction)Image_getWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getHeight", (PyCFunction)Image_getHeight, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getDepth", (PyCFunction)Image_getDepth, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getFaces", (PyCFunction)Image_getFaces, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getLayers", (PyCFunction)Image_getLayers, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getMipmaps", (PyCFunction)Image_getMipmaps, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "findMipmap", (PyCFunction)Image_findMipmap, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "hasLayers", (PyCFunction)Image_hasLayers, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "hasMipmaps", (PyCFunction)Image_hasMipmaps, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getSize", (PyCFunction)Image_getSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getRegion", (PyCFunction)Image_getRegion, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getSlice", (PyCFunction)Image_getSlice, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "setMetaInfo", (PyCFunction)Image_setMetaInfo, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getMetaInfo", (PyCFunction)Image_getMetaInfo, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getDescription", (PyCFunction)Image_getDescription, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef { "getOffset", (PyCFunction)Image_getOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getStride", (PyCFunction)Image_getStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getMipmapSize", (PyCFunction)Image_getMipmapSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getLayerSize", (PyCFunction)Image_getLayerSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getDataSize", (PyCFunction)Image_getDataSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "create", (PyCFunction)Image_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "create2D", (PyCFunction)Image_create2D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "create3D", (PyCFunction)Image_create3D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "createCube", (PyCFunction)Image_createCube, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "info", (PyCFunction)Image_info, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "load", (PyCFunction)Image_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "save", (PyCFunction)Image_save, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "swap", (PyCFunction)Image_swap, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "copy", (PyCFunction)Image_copy, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "flipX", (PyCFunction)Image_flipX, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "flipY", (PyCFunction)Image_flipY, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "toType", (PyCFunction)Image_toType, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "toFormat", (PyCFunction)Image_toFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getComponent", (PyCFunction)Image_getComponent, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getRotated", (PyCFunction)Image_getRotated, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getResized", (PyCFunction)Image_getResized, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getMipmapped", (PyCFunction)Image_getMipmapped, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "compare", (PyCFunction)Image_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYImage_methods.append(PyMethodDef { "getMemory", (PyCFunction)Image_getMemory, METH_NOARGS, "" });
		PYImage_methods.append(PyMethodDef {});
		PYImage_getsets.reserve(PYImage_getsets.size() + 24);
		PYImage_getsets.append(PyGetSetDef { "type", (getter)Image_get_type, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "format", (getter)Image_get_format, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "format_name", (getter)Image_get_format_name, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "components", (getter)Image_get_components, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "pixel_size", (getter)Image_get_pixel_size, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "block_size", (getter)Image_get_block_size, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "block_width", (getter)Image_get_block_width, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "block_height", (getter)Image_get_block_height, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "width", (getter)Image_get_width, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "height", (getter)Image_get_height, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "depth", (getter)Image_get_depth, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "faces", (getter)Image_get_faces, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "layers", (getter)Image_get_layers, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "mipmaps", (getter)Image_get_mipmaps, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "size", (getter)Image_get_size, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "region", (getter)Image_get_region, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "slice", (getter)Image_get_slice, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "meta_info", (getter)Image_get_meta_info, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "description", (getter)Image_get_description, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "stride", (getter)Image_get_stride, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "layer_size", (getter)Image_get_layer_size, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "data_size", (getter)Image_get_data_size, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef { "memory", (getter)Image_get_memory, nullptr, "", nullptr });
		PYImage_getsets.append(PyGetSetDef {});
		PYImage_Type.tp_dealloc = (destructor)pyImage_dealloc;
		PYImage_Type.tp_as_buffer = &PYImage_buffer;
		PYImage_number.nb_bool = (inquiry)pyImage_bool;
		PYImage_Type.tp_name = "tellusim.Image";
		PYImage_Type.tp_basicsize = sizeof(PYImage);
		PYImage_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYImage_Type.tp_doc = "";
		PYImage_Type.tp_str = (reprfunc)pyImage_str;
		PYImage_Type.tp_as_number = &PYImage_number;
		PYImage_Type.tp_methods = PYImage_methods.discard();
		PYImage_Type.tp_getset = PYImage_getsets.discard();
		PYImage_Type.tp_init = (initproc)pyImage_init;
		PYImage_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYImage_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Image");
			return false;
		}
		PyDict_SetItemString(PYImage_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYImage_Type.tp_dict, "Type2D", PyLong_FromLong(1));
		PyDict_SetItemString(PYImage_Type.tp_dict, "Type3D", PyLong_FromLong(2));
		PyDict_SetItemString(PYImage_Type.tp_dict, "TypeCube", PyLong_FromLong(3));
		PyDict_SetItemString(PYImage_Type.tp_dict, "NumTypes", PyLong_FromLong(4));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagMipmaps", PyLong_FromLong(1));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagNoClear", PyLong_FromLong(2));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagNoAllocate", PyLong_FromLong(4));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagFast", PyLong_FromLong(8));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagBest", PyLong_FromLong(16));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagPerceptual", PyLong_FromLong(32));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagPanorama", PyLong_FromLong(64));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagNormalize", PyLong_FromLong(128));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagGamma", PyLong_FromLong(256));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FlagSRGB", PyLong_FromLong(512));
		PyDict_SetItemString(PYImage_Type.tp_dict, "NumFlags", PyLong_FromLong(10));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterPoint", PyLong_FromLong(1));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterLinear", PyLong_FromLong(2));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterCubic", PyLong_FromLong(3));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterSinc", PyLong_FromLong(4));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterBox", PyLong_FromLong(5));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterMax", PyLong_FromLong(6));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterMin", PyLong_FromLong(7));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterMip", PyLong_FromLong(8));
		PyDict_SetItemString(PYImage_Type.tp_dict, "FilterCR", PyLong_FromLong(9));
		PyDict_SetItemString(PYImage_Type.tp_dict, "NumFilters", PyLong_FromLong(10));
		PyType_Modified(&PYImage_Type);
		Py_INCREF(&PYImage_Type);
		
		// Tellusim::ImageSampler
		PYImageSampler_methods.reserve(PYImageSampler_methods.size() + 32);
		PYImageSampler_methods.append(PyMethodDef { "clear", (PyCFunction)ImageSampler_clear, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "isCreated", (PyCFunction)ImageSampler_isCreated, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getType", (PyCFunction)ImageSampler_getType, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "is2DType", (PyCFunction)ImageSampler_is2DType, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "is3DType", (PyCFunction)ImageSampler_is3DType, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "isCubeType", (PyCFunction)ImageSampler_isCubeType, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getFormat", (PyCFunction)ImageSampler_getFormat, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getFormatName", (PyCFunction)ImageSampler_getFormatName, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getWidth", (PyCFunction)ImageSampler_getWidth, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getHeight", (PyCFunction)ImageSampler_getHeight, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getDepth", (PyCFunction)ImageSampler_getDepth, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getFaces", (PyCFunction)ImageSampler_getFaces, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getTexels", (PyCFunction)ImageSampler_getTexels, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getSize", (PyCFunction)ImageSampler_getSize, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getRegion", (PyCFunction)ImageSampler_getRegion, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getStride", (PyCFunction)ImageSampler_getStride, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getLayerSize", (PyCFunction)ImageSampler_getLayerSize, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getPixelSize", (PyCFunction)ImageSampler_getPixelSize, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getComponents", (PyCFunction)ImageSampler_getComponents, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getData", (PyCFunction)ImageSampler_getData, METH_NOARGS, "" });
		PYImageSampler_methods.append(PyMethodDef { "create", (PyCFunction)ImageSampler_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "mad", (PyCFunction)ImageSampler_mad, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "set2D", (PyCFunction)ImageSampler_set2D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "get2D", (PyCFunction)ImageSampler_get2D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "set3D", (PyCFunction)ImageSampler_set3D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "get3D", (PyCFunction)ImageSampler_get3D, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "setCube", (PyCFunction)ImageSampler_setCube, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getCube", (PyCFunction)ImageSampler_getCube, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getCubeFace", (PyCFunction)ImageSampler_getCubeFace, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "setTexel", (PyCFunction)ImageSampler_setTexel, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef { "getTexel", (PyCFunction)ImageSampler_getTexel, METH_VARARGS | METH_KEYWORDS, "" });
		PYImageSampler_methods.append(PyMethodDef {});
		PYImageSampler_getsets.reserve(PYImageSampler_getsets.size() + 16);
		PYImageSampler_getsets.append(PyGetSetDef { "type", (getter)ImageSampler_get_type, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "format", (getter)ImageSampler_get_format, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "format_name", (getter)ImageSampler_get_format_name, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "width", (getter)ImageSampler_get_width, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "height", (getter)ImageSampler_get_height, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "depth", (getter)ImageSampler_get_depth, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "faces", (getter)ImageSampler_get_faces, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "texels", (getter)ImageSampler_get_texels, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "size", (getter)ImageSampler_get_size, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "region", (getter)ImageSampler_get_region, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "stride", (getter)ImageSampler_get_stride, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "layer_size", (getter)ImageSampler_get_layer_size, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "pixel_size", (getter)ImageSampler_get_pixel_size, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "components", (getter)ImageSampler_get_components, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef { "data", (getter)ImageSampler_get_data, nullptr, "", nullptr });
		PYImageSampler_getsets.append(PyGetSetDef {});
		PYImageSampler_Type.tp_dealloc = (destructor)pyImageSampler_dealloc;
		PYImageSampler_Type.tp_as_buffer = &PYImageSampler_buffer;
		PYImageSampler_number.nb_bool = (inquiry)pyImageSampler_bool;
		PYImageSampler_Type.tp_name = "tellusim.ImageSampler";
		PYImageSampler_Type.tp_basicsize = sizeof(PYImageSampler);
		PYImageSampler_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYImageSampler_Type.tp_doc = "";
		PYImageSampler_Type.tp_str = (reprfunc)pyImageSampler_str;
		PYImageSampler_Type.tp_as_number = &PYImageSampler_number;
		PYImageSampler_Type.tp_methods = PYImageSampler_methods.discard();
		PYImageSampler_Type.tp_getset = PYImageSampler_getsets.discard();
		PYImageSampler_Type.tp_init = (initproc)pyImageSampler_init;
		PYImageSampler_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYImageSampler_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ImageSampler");
			return false;
		}
		Py_INCREF(&PYImageSampler_Type);
		
		// Tellusim::MeshNode
		PYMeshNode_methods.reserve(PYMeshNode_methods.size() + 60);
		PYMeshNode_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshNode_equalPtr, METH_VARARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshNode_clonePtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshNode_clearPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshNode_destroyPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshNode_acquirePtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshNode_unacquirePtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshNode_isValidPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshNode_isOwnerPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshNode_isConstPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshNode_getCountPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshNode_getInternalPtr, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clear", (PyCFunction)MeshNode_clear, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clone", (PyCFunction)MeshNode_clone, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setName", (PyCFunction)MeshNode_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getName", (PyCFunction)MeshNode_getName, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getIndex", (PyCFunction)MeshNode_getIndex, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setMesh", (PyCFunction)MeshNode_setMesh, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getMesh", (PyCFunction)MeshNode_getMesh, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setParent", (PyCFunction)MeshNode_setParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getParent", (PyCFunction)MeshNode_getParent, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "isRoot", (PyCFunction)MeshNode_isRoot, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "reserveChildren", (PyCFunction)MeshNode_reserveChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "addChild", (PyCFunction)MeshNode_addChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "removeChild", (PyCFunction)MeshNode_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)MeshNode_releaseChildren, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "findChild", (PyCFunction)MeshNode_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)MeshNode_getNumChildren, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getChildren", (PyCFunction)MeshNode_getChildren, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getChild", (PyCFunction)MeshNode_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clearGeometries", (PyCFunction)MeshNode_clearGeometries, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "reserveGeometries", (PyCFunction)MeshNode_reserveGeometries, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "addGeometry", (PyCFunction)MeshNode_addGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "removeGeometry", (PyCFunction)MeshNode_removeGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "replaceGeometry", (PyCFunction)MeshNode_replaceGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "findGeometry", (PyCFunction)MeshNode_findGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getNumGeometries", (PyCFunction)MeshNode_getNumGeometries, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getGeometries", (PyCFunction)MeshNode_getGeometries, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getGeometry", (PyCFunction)MeshNode_getGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "clearAttachments", (PyCFunction)MeshNode_clearAttachments, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "reserveAttachments", (PyCFunction)MeshNode_reserveAttachments, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "addAttachment", (PyCFunction)MeshNode_addAttachment, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "removeAttachment", (PyCFunction)MeshNode_removeAttachment, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "replaceAttachment", (PyCFunction)MeshNode_replaceAttachment, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "findAttachment", (PyCFunction)MeshNode_findAttachment, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getNumAttachments", (PyCFunction)MeshNode_getNumAttachments, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getAttachments", (PyCFunction)MeshNode_getAttachments, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getAttachment", (PyCFunction)MeshNode_getAttachment, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setLocalTransform", (PyCFunction)MeshNode_setLocalTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getLocalTransform", (PyCFunction)MeshNode_getLocalTransform, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setGlobalTransform", (PyCFunction)MeshNode_setGlobalTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getGlobalTransform", (PyCFunction)MeshNode_getGlobalTransform, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setPivotTransform", (PyCFunction)MeshNode_setPivotTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getPivotTransform", (PyCFunction)MeshNode_getPivotTransform, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setMorphTransform", (PyCFunction)MeshNode_setMorphTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getMorphTransform", (PyCFunction)MeshNode_getMorphTransform, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef { "createLocalTransforms", (PyCFunction)MeshNode_createLocalTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "createGlobalTransforms", (PyCFunction)MeshNode_createGlobalTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshNode_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshNode_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshNode_getMemory, METH_NOARGS, "" });
		PYMeshNode_methods.append(PyMethodDef {});
		PYMeshNode_getsets.reserve(PYMeshNode_getsets.size() + 13);
		PYMeshNode_getsets.append(PyGetSetDef { "name", (getter)MeshNode_get_name, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "index", (getter)MeshNode_get_index, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "mesh", (getter)MeshNode_get_mesh, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "parent", (getter)MeshNode_get_parent, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "num_children", (getter)MeshNode_get_num_children, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "num_geometries", (getter)MeshNode_get_num_geometries, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "num_attachments", (getter)MeshNode_get_num_attachments, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "local_transform", (getter)MeshNode_get_local_transform, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "global_transform", (getter)MeshNode_get_global_transform, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "pivot_transform", (getter)MeshNode_get_pivot_transform, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "morph_transform", (getter)MeshNode_get_morph_transform, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef { "memory", (getter)MeshNode_get_memory, nullptr, "", nullptr });
		PYMeshNode_getsets.append(PyGetSetDef {});
		PYMeshNode_Type.tp_dealloc = (destructor)pyMeshNode_dealloc;
		PYMeshNode_number.nb_bool = (inquiry)pyMeshNode_bool;
		PYMeshNode_Type.tp_name = "tellusim.MeshNode";
		PYMeshNode_Type.tp_basicsize = sizeof(PYMeshNode);
		PYMeshNode_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshNode_Type.tp_doc = "";
		PYMeshNode_Type.tp_str = (reprfunc)pyMeshNode_str;
		PYMeshNode_Type.tp_as_number = &PYMeshNode_number;
		PYMeshNode_Type.tp_methods = PYMeshNode_methods.discard();
		PYMeshNode_Type.tp_getset = PYMeshNode_getsets.discard();
		PYMeshNode_Type.tp_init = (initproc)pyMeshNode_init;
		PYMeshNode_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshNode_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshNode");
			return false;
		}
		Py_INCREF(&PYMeshNode_Type);
		
		// Tellusim::MeshIndices
		PYMeshIndices_methods.reserve(PYMeshIndices_methods.size() + 52);
		PYMeshIndices_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshIndices_equalPtr, METH_VARARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshIndices_clonePtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshIndices_clearPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshIndices_destroyPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshIndices_acquirePtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshIndices_unacquirePtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshIndices_isValidPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshIndices_isOwnerPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshIndices_isConstPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshIndices_getCountPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshIndices_getInternalPtr, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "clear", (PyCFunction)MeshIndices_clear, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "setName", (PyCFunction)MeshIndices_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getName", (PyCFunction)MeshIndices_getName, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "create", (PyCFunction)MeshIndices_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getType", (PyCFunction)MeshIndices_getType, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getTypeName", (PyCFunction)MeshIndices_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isUnknown", (PyCFunction)MeshIndices_isUnknown, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isPoint", (PyCFunction)MeshIndices_isPoint, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isLine", (PyCFunction)MeshIndices_isLine, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isTriangle", (PyCFunction)MeshIndices_isTriangle, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isQuadrilateral", (PyCFunction)MeshIndices_isQuadrilateral, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isTetrahedron", (PyCFunction)MeshIndices_isTetrahedron, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isPrimitive", (PyCFunction)MeshIndices_isPrimitive, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isSolid", (PyCFunction)MeshIndices_isSolid, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isVolume", (PyCFunction)MeshIndices_isVolume, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isMaterial", (PyCFunction)MeshIndices_isMaterial, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isGroup", (PyCFunction)MeshIndices_isGroup, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isJoint", (PyCFunction)MeshIndices_isJoint, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isEdge", (PyCFunction)MeshIndices_isEdge, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getPrimitiveSize", (PyCFunction)MeshIndices_getPrimitiveSize, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getFormat", (PyCFunction)MeshIndices_getFormat, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getFormatName", (PyCFunction)MeshIndices_getFormatName, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "setGeometry", (PyCFunction)MeshIndices_setGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getGeometry", (PyCFunction)MeshIndices_getGeometry, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "setSize", (PyCFunction)MeshIndices_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getSize", (PyCFunction)MeshIndices_getSize, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getStride", (PyCFunction)MeshIndices_getStride, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getBytes", (PyCFunction)MeshIndices_getBytes, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "set", (PyCFunction)MeshIndices_set, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "get", (PyCFunction)MeshIndices_get, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getPtr", (PyCFunction)MeshIndices_getPtr, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isDirect", (PyCFunction)MeshIndices_isDirect, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "isUniform", (PyCFunction)MeshIndices_isUniform, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getMinIndex", (PyCFunction)MeshIndices_getMinIndex, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getMaxIndex", (PyCFunction)MeshIndices_getMaxIndex, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "compare", (PyCFunction)MeshIndices_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "addIndices", (PyCFunction)MeshIndices_addIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "toFormat", (PyCFunction)MeshIndices_toFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "toType", (PyCFunction)MeshIndices_toType, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshIndices_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshIndices_getMemory, METH_NOARGS, "" });
		PYMeshIndices_methods.append(PyMethodDef {});
		PYMeshIndices_getsets.reserve(PYMeshIndices_getsets.size() + 13);
		PYMeshIndices_getsets.append(PyGetSetDef { "name", (getter)MeshIndices_get_name, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "type", (getter)MeshIndices_get_type, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "primitive_size", (getter)MeshIndices_get_primitive_size, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "format", (getter)MeshIndices_get_format, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "format_name", (getter)MeshIndices_get_format_name, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "geometry", (getter)MeshIndices_get_geometry, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "size", (getter)MeshIndices_get_size, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "stride", (getter)MeshIndices_get_stride, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "bytes", (getter)MeshIndices_get_bytes, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "min_index", (getter)MeshIndices_get_min_index, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "max_index", (getter)MeshIndices_get_max_index, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef { "memory", (getter)MeshIndices_get_memory, nullptr, "", nullptr });
		PYMeshIndices_getsets.append(PyGetSetDef {});
		PYMeshIndices_Type.tp_dealloc = (destructor)pyMeshIndices_dealloc;
		PYMeshIndices_Type.tp_as_buffer = &PYMeshIndices_buffer;
		PYMeshIndices_number.nb_bool = (inquiry)pyMeshIndices_bool;
		PYMeshIndices_Type.tp_name = "tellusim.MeshIndices";
		PYMeshIndices_Type.tp_basicsize = sizeof(PYMeshIndices);
		PYMeshIndices_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshIndices_Type.tp_doc = "";
		PYMeshIndices_Type.tp_str = (reprfunc)pyMeshIndices_str;
		PYMeshIndices_Type.tp_as_number = &PYMeshIndices_number;
		PYMeshIndices_Type.tp_methods = PYMeshIndices_methods.discard();
		PYMeshIndices_Type.tp_getset = PYMeshIndices_getsets.discard();
		PYMeshIndices_Type.tp_init = (initproc)pyMeshIndices_init;
		PYMeshIndices_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshIndices_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshIndices");
			return false;
		}
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypePoint", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeLine", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeTriangle", PyLong_FromLong(3));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeQuadrilateral", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeTetrahedron", PyLong_FromLong(5));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeMaterial", PyLong_FromLong(6));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeIsland", PyLong_FromLong(7));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeGroup", PyLong_FromLong(8));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeJoint", PyLong_FromLong(9));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "TypeEdge", PyLong_FromLong(10));
		PyDict_SetItemString(PYMeshIndices_Type.tp_dict, "NumTypes", PyLong_FromLong(11));
		PyType_Modified(&PYMeshIndices_Type);
		Py_INCREF(&PYMeshIndices_Type);
		
		// Tellusim::MeshAttribute
		PYMeshAttribute_methods.reserve(PYMeshAttribute_methods.size() + 64);
		PYMeshAttribute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshAttribute_equalPtr, METH_VARARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshAttribute_clonePtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshAttribute_clearPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshAttribute_destroyPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshAttribute_acquirePtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshAttribute_unacquirePtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshAttribute_isValidPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshAttribute_isOwnerPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshAttribute_isConstPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshAttribute_getCountPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshAttribute_getInternalPtr, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "clear", (PyCFunction)MeshAttribute_clear, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setName", (PyCFunction)MeshAttribute_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getName", (PyCFunction)MeshAttribute_getName, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "create", (PyCFunction)MeshAttribute_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getType", (PyCFunction)MeshAttribute_getType, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getTypeName", (PyCFunction)MeshAttribute_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isUnknown", (PyCFunction)MeshAttribute_isUnknown, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isPosition", (PyCFunction)MeshAttribute_isPosition, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isBasis", (PyCFunction)MeshAttribute_isBasis, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isNormal", (PyCFunction)MeshAttribute_isNormal, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isTangent", (PyCFunction)MeshAttribute_isTangent, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isBinormal", (PyCFunction)MeshAttribute_isBinormal, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isSpatial", (PyCFunction)MeshAttribute_isSpatial, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isNormalized", (PyCFunction)MeshAttribute_isNormalized, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isTexCoord", (PyCFunction)MeshAttribute_isTexCoord, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isWeights", (PyCFunction)MeshAttribute_isWeights, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isJoints", (PyCFunction)MeshAttribute_isJoints, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isColor", (PyCFunction)MeshAttribute_isColor, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isVertex", (PyCFunction)MeshAttribute_isVertex, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isCrease", (PyCFunction)MeshAttribute_isCrease, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getFormat", (PyCFunction)MeshAttribute_getFormat, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getFormatName", (PyCFunction)MeshAttribute_getFormatName, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getComponents", (PyCFunction)MeshAttribute_getComponents, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "isPacked", (PyCFunction)MeshAttribute_isPacked, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setIndex", (PyCFunction)MeshAttribute_setIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getIndex", (PyCFunction)MeshAttribute_getIndex, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setIndices", (PyCFunction)MeshAttribute_setIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getIndices", (PyCFunction)MeshAttribute_getIndices, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setGeometry", (PyCFunction)MeshAttribute_setGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getGeometry", (PyCFunction)MeshAttribute_getGeometry, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setSize", (PyCFunction)MeshAttribute_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getSize", (PyCFunction)MeshAttribute_getSize, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getStride", (PyCFunction)MeshAttribute_getStride, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getBytes", (PyCFunction)MeshAttribute_getBytes, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setValue", (PyCFunction)MeshAttribute_setValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getValue", (PyCFunction)MeshAttribute_getValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getPtr", (PyCFunction)MeshAttribute_getPtr, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "compare", (PyCFunction)MeshAttribute_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "addAttribute", (PyCFunction)MeshAttribute_addAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshAttribute_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "morphAttribute", (PyCFunction)MeshAttribute_morphAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "packAttributes", (PyCFunction)MeshAttribute_packAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "unpackAttributes", (PyCFunction)MeshAttribute_unpackAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "optimizeAttribute", (PyCFunction)MeshAttribute_optimizeAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "toDirect", (PyCFunction)MeshAttribute_toDirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "toFormat", (PyCFunction)MeshAttribute_toFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "toType", (PyCFunction)MeshAttribute_toType, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getCovarianceMatrix", (PyCFunction)MeshAttribute_getCovarianceMatrix, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getMinTransform", (PyCFunction)MeshAttribute_getMinTransform, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getBoundBox", (PyCFunction)MeshAttribute_getBoundBox, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getBoundSphere", (PyCFunction)MeshAttribute_getBoundSphere, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshAttribute_getMemory, METH_NOARGS, "" });
		PYMeshAttribute_methods.append(PyMethodDef {});
		PYMeshAttribute_getsets.reserve(PYMeshAttribute_getsets.size() + 17);
		PYMeshAttribute_getsets.append(PyGetSetDef { "name", (getter)MeshAttribute_get_name, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "type", (getter)MeshAttribute_get_type, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "format", (getter)MeshAttribute_get_format, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "format_name", (getter)MeshAttribute_get_format_name, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "components", (getter)MeshAttribute_get_components, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "index", (getter)MeshAttribute_get_index, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "indices", (getter)MeshAttribute_get_indices, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "geometry", (getter)MeshAttribute_get_geometry, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "size", (getter)MeshAttribute_get_size, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "stride", (getter)MeshAttribute_get_stride, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "bytes", (getter)MeshAttribute_get_bytes, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "covariance_matrix", (getter)MeshAttribute_get_covariance_matrix, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "min_transform", (getter)MeshAttribute_get_min_transform, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "bound_box", (getter)MeshAttribute_get_bound_box, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "bound_sphere", (getter)MeshAttribute_get_bound_sphere, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef { "memory", (getter)MeshAttribute_get_memory, nullptr, "", nullptr });
		PYMeshAttribute_getsets.append(PyGetSetDef {});
		PYMeshAttribute_Type.tp_dealloc = (destructor)pyMeshAttribute_dealloc;
		PYMeshAttribute_Type.tp_as_buffer = &PYMeshAttribute_buffer;
		PYMeshAttribute_number.nb_bool = (inquiry)pyMeshAttribute_bool;
		PYMeshAttribute_Type.tp_name = "tellusim.MeshAttribute";
		PYMeshAttribute_Type.tp_basicsize = sizeof(PYMeshAttribute);
		PYMeshAttribute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshAttribute_Type.tp_doc = "";
		PYMeshAttribute_Type.tp_str = (reprfunc)pyMeshAttribute_str;
		PYMeshAttribute_Type.tp_as_number = &PYMeshAttribute_number;
		PYMeshAttribute_Type.tp_methods = PYMeshAttribute_methods.discard();
		PYMeshAttribute_Type.tp_getset = PYMeshAttribute_getsets.discard();
		PYMeshAttribute_Type.tp_init = (initproc)pyMeshAttribute_init;
		PYMeshAttribute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshAttribute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshAttribute");
			return false;
		}
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypePosition", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeBasis", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeNormal", PyLong_FromLong(3));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeTangent", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeBinormal", PyLong_FromLong(5));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeTexCoord", PyLong_FromLong(6));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeWeights", PyLong_FromLong(7));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeJoints", PyLong_FromLong(8));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeColor", PyLong_FromLong(9));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "TypeCrease", PyLong_FromLong(10));
		PyDict_SetItemString(PYMeshAttribute_Type.tp_dict, "NumTypes", PyLong_FromLong(11));
		PyType_Modified(&PYMeshAttribute_Type);
		Py_INCREF(&PYMeshAttribute_Type);
		
		// Tellusim::MeshJoint
		PYMeshJoint_methods.reserve(PYMeshJoint_methods.size() + 32);
		PYMeshJoint_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshJoint_equalPtr, METH_VARARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshJoint_clonePtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshJoint_clearPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshJoint_destroyPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshJoint_acquirePtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshJoint_unacquirePtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshJoint_isValidPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshJoint_isOwnerPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshJoint_isConstPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshJoint_getCountPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshJoint_getInternalPtr, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "clear", (PyCFunction)MeshJoint_clear, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setName", (PyCFunction)MeshJoint_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getName", (PyCFunction)MeshJoint_getName, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setNode", (PyCFunction)MeshJoint_setNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getNode", (PyCFunction)MeshJoint_getNode, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getNodeIndex", (PyCFunction)MeshJoint_getNodeIndex, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getLocalTransform", (PyCFunction)MeshJoint_getLocalTransform, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getGlobalTransform", (PyCFunction)MeshJoint_getGlobalTransform, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setIndices", (PyCFunction)MeshJoint_setIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getIndices", (PyCFunction)MeshJoint_getIndices, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setGeometry", (PyCFunction)MeshJoint_setGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getGeometry", (PyCFunction)MeshJoint_getGeometry, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setBoundBox", (PyCFunction)MeshJoint_setBoundBox, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getBoundBox", (PyCFunction)MeshJoint_getBoundBox, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setBoundSphere", (PyCFunction)MeshJoint_setBoundSphere, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getBoundSphere", (PyCFunction)MeshJoint_getBoundSphere, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "setITransform", (PyCFunction)MeshJoint_setITransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getITransform", (PyCFunction)MeshJoint_getITransform, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "compare", (PyCFunction)MeshJoint_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshJoint_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshJoint_getMemory, METH_NOARGS, "" });
		PYMeshJoint_methods.append(PyMethodDef {});
		PYMeshJoint_getsets.reserve(PYMeshJoint_getsets.size() + 12);
		PYMeshJoint_getsets.append(PyGetSetDef { "name", (getter)MeshJoint_get_name, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "node", (getter)MeshJoint_get_node, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "node_index", (getter)MeshJoint_get_node_index, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "local_transform", (getter)MeshJoint_get_local_transform, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "global_transform", (getter)MeshJoint_get_global_transform, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "indices", (getter)MeshJoint_get_indices, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "geometry", (getter)MeshJoint_get_geometry, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "bound_box", (getter)MeshJoint_get_bound_box, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "bound_sphere", (getter)MeshJoint_get_bound_sphere, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "itransform", (getter)MeshJoint_get_itransform, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef { "memory", (getter)MeshJoint_get_memory, nullptr, "", nullptr });
		PYMeshJoint_getsets.append(PyGetSetDef {});
		PYMeshJoint_Type.tp_dealloc = (destructor)pyMeshJoint_dealloc;
		PYMeshJoint_number.nb_bool = (inquiry)pyMeshJoint_bool;
		PYMeshJoint_Type.tp_name = "tellusim.MeshJoint";
		PYMeshJoint_Type.tp_basicsize = sizeof(PYMeshJoint);
		PYMeshJoint_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshJoint_Type.tp_doc = "";
		PYMeshJoint_Type.tp_str = (reprfunc)pyMeshJoint_str;
		PYMeshJoint_Type.tp_as_number = &PYMeshJoint_number;
		PYMeshJoint_Type.tp_methods = PYMeshJoint_methods.discard();
		PYMeshJoint_Type.tp_getset = PYMeshJoint_getsets.discard();
		PYMeshJoint_Type.tp_init = (initproc)pyMeshJoint_init;
		PYMeshJoint_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshJoint_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshJoint");
			return false;
		}
		Py_INCREF(&PYMeshJoint_Type);
		
		// Tellusim::MeshMaterial
		PYMeshMaterial_methods.reserve(PYMeshMaterial_methods.size() + 44);
		PYMeshMaterial_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshMaterial_equalPtr, METH_VARARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshMaterial_clonePtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshMaterial_clearPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshMaterial_destroyPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshMaterial_acquirePtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshMaterial_unacquirePtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshMaterial_isValidPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshMaterial_isOwnerPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshMaterial_isConstPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshMaterial_getCountPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshMaterial_getInternalPtr, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "clear", (PyCFunction)MeshMaterial_clear, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "setName", (PyCFunction)MeshMaterial_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getName", (PyCFunction)MeshMaterial_getName, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getIndex", (PyCFunction)MeshMaterial_getIndex, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "setIndices", (PyCFunction)MeshMaterial_setIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getIndices", (PyCFunction)MeshMaterial_getIndices, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "setGeometry", (PyCFunction)MeshMaterial_setGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getGeometry", (PyCFunction)MeshMaterial_getGeometry, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "setData", (PyCFunction)MeshMaterial_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getData", (PyCFunction)MeshMaterial_getData, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "clearParameters", (PyCFunction)MeshMaterial_clearParameters, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "removeParameter", (PyCFunction)MeshMaterial_removeParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "copyParameters", (PyCFunction)MeshMaterial_copyParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "findParameter", (PyCFunction)MeshMaterial_findParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "hasParameter", (PyCFunction)MeshMaterial_hasParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getNumParameters", (PyCFunction)MeshMaterial_getNumParameters, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterType", (PyCFunction)MeshMaterial_getParameterType, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "addParameter", (PyCFunction)MeshMaterial_addParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterFlags", (PyCFunction)MeshMaterial_getParameterFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "hasParameterFlag", (PyCFunction)MeshMaterial_hasParameterFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "hasParameterFlags", (PyCFunction)MeshMaterial_hasParameterFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterBool", (PyCFunction)MeshMaterial_getParameterBool, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterScalarf32", (PyCFunction)MeshMaterial_getParameterScalarf32, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterVector4f", (PyCFunction)MeshMaterial_getParameterVector4f, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterMatrix3x2f", (PyCFunction)MeshMaterial_getParameterMatrix3x2f, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterColor", (PyCFunction)MeshMaterial_getParameterColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterName", (PyCFunction)MeshMaterial_getParameterName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterLayout", (PyCFunction)MeshMaterial_getParameterLayout, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterImage", (PyCFunction)MeshMaterial_getParameterImage, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getParameterBlob", (PyCFunction)MeshMaterial_getParameterBlob, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "compare", (PyCFunction)MeshMaterial_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshMaterial_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshMaterial_getMemory, METH_NOARGS, "" });
		PYMeshMaterial_methods.append(PyMethodDef {});
		PYMeshMaterial_getsets.reserve(PYMeshMaterial_getsets.size() + 8);
		PYMeshMaterial_getsets.append(PyGetSetDef { "name", (getter)MeshMaterial_get_name, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "index", (getter)MeshMaterial_get_index, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "indices", (getter)MeshMaterial_get_indices, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "geometry", (getter)MeshMaterial_get_geometry, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "data", (getter)MeshMaterial_get_data, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "num_parameters", (getter)MeshMaterial_get_num_parameters, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef { "memory", (getter)MeshMaterial_get_memory, nullptr, "", nullptr });
		PYMeshMaterial_getsets.append(PyGetSetDef {});
		PYMeshMaterial_Type.tp_dealloc = (destructor)pyMeshMaterial_dealloc;
		PYMeshMaterial_number.nb_bool = (inquiry)pyMeshMaterial_bool;
		PYMeshMaterial_Type.tp_name = "tellusim.MeshMaterial";
		PYMeshMaterial_Type.tp_basicsize = sizeof(PYMeshMaterial);
		PYMeshMaterial_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshMaterial_Type.tp_doc = "";
		PYMeshMaterial_Type.tp_str = (reprfunc)pyMeshMaterial_str;
		PYMeshMaterial_Type.tp_as_number = &PYMeshMaterial_number;
		PYMeshMaterial_Type.tp_methods = PYMeshMaterial_methods.discard();
		PYMeshMaterial_Type.tp_getset = PYMeshMaterial_getsets.discard();
		PYMeshMaterial_Type.tp_init = (initproc)pyMeshMaterial_init;
		PYMeshMaterial_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshMaterial_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshMaterial");
			return false;
		}
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagBool", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagScalarf32", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagVector4f", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagMatrix3x2f", PyLong_FromLong(8));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagColor", PyLong_FromLong(16));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagName", PyLong_FromLong(32));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagLayout", PyLong_FromLong(64));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagBlob", PyLong_FromLong(128));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagImage", PyLong_FromLong(256));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "FlagTexture", PyLong_FromLong(416));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeBump", PyUnicode_FromString(MeshMaterial::TypeBump));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeNormal", PyUnicode_FromString(MeshMaterial::TypeNormal));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeEmission", PyUnicode_FromString(MeshMaterial::TypeEmission));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeOcclusion", PyUnicode_FromString(MeshMaterial::TypeOcclusion));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeOpacity", PyUnicode_FromString(MeshMaterial::TypeOpacity));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeAmbient", PyUnicode_FromString(MeshMaterial::TypeAmbient));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeDiffuse", PyUnicode_FromString(MeshMaterial::TypeDiffuse));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeSpecular", PyUnicode_FromString(MeshMaterial::TypeSpecular));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeMetallic", PyUnicode_FromString(MeshMaterial::TypeMetallic));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeRoughness", PyUnicode_FromString(MeshMaterial::TypeRoughness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeShininess", PyUnicode_FromString(MeshMaterial::TypeShininess));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeGlossiness", PyUnicode_FromString(MeshMaterial::TypeGlossiness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeTransparent", PyUnicode_FromString(MeshMaterial::TypeTransparent));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeTransparency", PyUnicode_FromString(MeshMaterial::TypeTransparency));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeTransmission", PyUnicode_FromString(MeshMaterial::TypeTransmission));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeReflective", PyUnicode_FromString(MeshMaterial::TypeReflective));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeReflectivity", PyUnicode_FromString(MeshMaterial::TypeReflectivity));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeRefractiveIndex", PyUnicode_FromString(MeshMaterial::TypeRefractiveIndex));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeClearcoat", PyUnicode_FromString(MeshMaterial::TypeClearcoat));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeClearcoatNormal", PyUnicode_FromString(MeshMaterial::TypeClearcoatNormal));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeClearcoatRoughness", PyUnicode_FromString(MeshMaterial::TypeClearcoatRoughness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeClearcoatGlossiness", PyUnicode_FromString(MeshMaterial::TypeClearcoatGlossiness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeIridescence", PyUnicode_FromString(MeshMaterial::TypeIridescence));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeIridescenceThickness", PyUnicode_FromString(MeshMaterial::TypeIridescenceThickness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeIridescenceRefractiveIndex", PyUnicode_FromString(MeshMaterial::TypeIridescenceRefractiveIndex));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeSheen", PyUnicode_FromString(MeshMaterial::TypeSheen));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeSheenRoughness", PyUnicode_FromString(MeshMaterial::TypeSheenRoughness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeVolume", PyUnicode_FromString(MeshMaterial::TypeVolume));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeVolumeThickness", PyUnicode_FromString(MeshMaterial::TypeVolumeThickness));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeAnisotropy", PyUnicode_FromString(MeshMaterial::TypeAnisotropy));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeAnisotropyAngle", PyUnicode_FromString(MeshMaterial::TypeAnisotropyAngle));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeDoubleSided", PyUnicode_FromString(MeshMaterial::TypeDoubleSided));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeAlphaBlend", PyUnicode_FromString(MeshMaterial::TypeAlphaBlend));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeAlphaMask", PyUnicode_FromString(MeshMaterial::TypeAlphaMask));
		PyDict_SetItemString(PYMeshMaterial_Type.tp_dict, "TypeTechnique", PyUnicode_FromString(MeshMaterial::TypeTechnique));
		PyType_Modified(&PYMeshMaterial_Type);
		Py_INCREF(&PYMeshMaterial_Type);
		
		// Tellusim::MeshGeometry
		PYMeshGeometry_methods.reserve(PYMeshGeometry_methods.size() + 101);
		PYMeshGeometry_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshGeometry_equalPtr, METH_VARARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshGeometry_clonePtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshGeometry_clearPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshGeometry_destroyPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshGeometry_acquirePtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshGeometry_unacquirePtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshGeometry_isValidPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshGeometry_isOwnerPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshGeometry_isConstPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshGeometry_getCountPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshGeometry_getInternalPtr, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clear", (PyCFunction)MeshGeometry_clear, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setName", (PyCFunction)MeshGeometry_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getName", (PyCFunction)MeshGeometry_getName, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getIndex", (PyCFunction)MeshGeometry_getIndex, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setMesh", (PyCFunction)MeshGeometry_setMesh, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMesh", (PyCFunction)MeshGeometry_getMesh, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setParent0", (PyCFunction)MeshGeometry_setParent0, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setParent1", (PyCFunction)MeshGeometry_setParent1, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getParent0", (PyCFunction)MeshGeometry_getParent0, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getParent1", (PyCFunction)MeshGeometry_getParent1, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "isRoot", (PyCFunction)MeshGeometry_isRoot, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "reserveChildren", (PyCFunction)MeshGeometry_reserveChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addChild0", (PyCFunction)MeshGeometry_addChild0, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addChild1", (PyCFunction)MeshGeometry_addChild1, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "removeChild", (PyCFunction)MeshGeometry_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)MeshGeometry_releaseChildren, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "findChild", (PyCFunction)MeshGeometry_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)MeshGeometry_getNumChildren, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getChildren", (PyCFunction)MeshGeometry_getChildren, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getChild", (PyCFunction)MeshGeometry_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clearIndices", (PyCFunction)MeshGeometry_clearIndices, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "reserveIndices", (PyCFunction)MeshGeometry_reserveIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addIndices", (PyCFunction)MeshGeometry_addIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "removeIndices", (PyCFunction)MeshGeometry_removeIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "replaceIndices", (PyCFunction)MeshGeometry_replaceIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "findIndices", (PyCFunction)MeshGeometry_findIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "hasIndices", (PyCFunction)MeshGeometry_hasIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "hasSolidIndices", (PyCFunction)MeshGeometry_hasSolidIndices, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getNumIndices", (PyCFunction)MeshGeometry_getNumIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getIndices", (PyCFunction)MeshGeometry_getIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clearAttributes", (PyCFunction)MeshGeometry_clearAttributes, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "reserveAttributes", (PyCFunction)MeshGeometry_reserveAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addAttribute", (PyCFunction)MeshGeometry_addAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "removeAttribute", (PyCFunction)MeshGeometry_removeAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "replaceAttribute", (PyCFunction)MeshGeometry_replaceAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "replaceAttributeIndices", (PyCFunction)MeshGeometry_replaceAttributeIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "findAttribute", (PyCFunction)MeshGeometry_findAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "hasAttribute", (PyCFunction)MeshGeometry_hasAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getNumAttributes", (PyCFunction)MeshGeometry_getNumAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getAttribute", (PyCFunction)MeshGeometry_getAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getAttributes", (PyCFunction)MeshGeometry_getAttributes, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clearJoints", (PyCFunction)MeshGeometry_clearJoints, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "reserveJoints", (PyCFunction)MeshGeometry_reserveJoints, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addJoint", (PyCFunction)MeshGeometry_addJoint, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "removeJoint", (PyCFunction)MeshGeometry_removeJoint, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "replaceJoint", (PyCFunction)MeshGeometry_replaceJoint, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "findJoint", (PyCFunction)MeshGeometry_findJoint, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getNumJoints", (PyCFunction)MeshGeometry_getNumJoints, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getJoints", (PyCFunction)MeshGeometry_getJoints, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getJoint", (PyCFunction)MeshGeometry_getJoint, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "clearMaterials", (PyCFunction)MeshGeometry_clearMaterials, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "reserveMaterials", (PyCFunction)MeshGeometry_reserveMaterials, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "addMaterial", (PyCFunction)MeshGeometry_addMaterial, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "removeMaterial", (PyCFunction)MeshGeometry_removeMaterial, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "replaceMaterial", (PyCFunction)MeshGeometry_replaceMaterial, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "findMaterial", (PyCFunction)MeshGeometry_findMaterial, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getNumMaterials", (PyCFunction)MeshGeometry_getNumMaterials, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMaterials", (PyCFunction)MeshGeometry_getMaterials, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMaterial", (PyCFunction)MeshGeometry_getMaterial, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setBoundBox", (PyCFunction)MeshGeometry_setBoundBox, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getBoundBox", (PyCFunction)MeshGeometry_getBoundBox, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setBoundSphere", (PyCFunction)MeshGeometry_setBoundSphere, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getBoundSphere", (PyCFunction)MeshGeometry_getBoundSphere, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshGeometry_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getTransform", (PyCFunction)MeshGeometry_getTransform, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setJointITransform", (PyCFunction)MeshGeometry_setJointITransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getJointITransform", (PyCFunction)MeshGeometry_getJointITransform, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setMinVisibility", (PyCFunction)MeshGeometry_setMinVisibility, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setMaxVisibility", (PyCFunction)MeshGeometry_setMaxVisibility, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setVisibilityRange", (PyCFunction)MeshGeometry_setVisibilityRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMinVisibility", (PyCFunction)MeshGeometry_getMinVisibility, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMaxVisibility", (PyCFunction)MeshGeometry_getMaxVisibility, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "hasVisibilityRange", (PyCFunction)MeshGeometry_hasVisibilityRange, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "setVisibilityError", (PyCFunction)MeshGeometry_setVisibilityError, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getVisibilityError", (PyCFunction)MeshGeometry_getVisibilityError, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "createBounds", (PyCFunction)MeshGeometry_createBounds, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "createBasis", (PyCFunction)MeshGeometry_createBasis, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "createNormals", (PyCFunction)MeshGeometry_createNormals, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "createTangents", (PyCFunction)MeshGeometry_createTangents, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "createIslands", (PyCFunction)MeshGeometry_createIslands, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "optimizeIndices", (PyCFunction)MeshGeometry_optimizeIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "optimizeAttributes", (PyCFunction)MeshGeometry_optimizeAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "optimizeMaterials", (PyCFunction)MeshGeometry_optimizeMaterials, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "packAttributes", (PyCFunction)MeshGeometry_packAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "unpackAttributes", (PyCFunction)MeshGeometry_unpackAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "compare", (PyCFunction)MeshGeometry_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "isOptimized", (PyCFunction)MeshGeometry_isOptimized, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "validate", (PyCFunction)MeshGeometry_validate, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshGeometry_getMemory, METH_NOARGS, "" });
		PYMeshGeometry_methods.append(PyMethodDef {});
		PYMeshGeometry_getsets.reserve(PYMeshGeometry_getsets.size() + 17);
		PYMeshGeometry_getsets.append(PyGetSetDef { "name", (getter)MeshGeometry_get_name, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "index", (getter)MeshGeometry_get_index, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "mesh", (getter)MeshGeometry_get_mesh, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "parent0", (getter)MeshGeometry_get_parent0, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "parent1", (getter)MeshGeometry_get_parent1, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "num_children", (getter)MeshGeometry_get_num_children, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "num_joints", (getter)MeshGeometry_get_num_joints, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "num_materials", (getter)MeshGeometry_get_num_materials, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "bound_box", (getter)MeshGeometry_get_bound_box, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "bound_sphere", (getter)MeshGeometry_get_bound_sphere, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "transform", (getter)MeshGeometry_get_transform, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "joint_itransform", (getter)MeshGeometry_get_joint_itransform, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "min_visibility", (getter)MeshGeometry_get_min_visibility, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "max_visibility", (getter)MeshGeometry_get_max_visibility, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "visibility_error", (getter)MeshGeometry_get_visibility_error, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef { "memory", (getter)MeshGeometry_get_memory, nullptr, "", nullptr });
		PYMeshGeometry_getsets.append(PyGetSetDef {});
		PYMeshGeometry_Type.tp_dealloc = (destructor)pyMeshGeometry_dealloc;
		PYMeshGeometry_number.nb_bool = (inquiry)pyMeshGeometry_bool;
		PYMeshGeometry_Type.tp_name = "tellusim.MeshGeometry";
		PYMeshGeometry_Type.tp_basicsize = sizeof(PYMeshGeometry);
		PYMeshGeometry_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshGeometry_Type.tp_doc = "";
		PYMeshGeometry_Type.tp_str = (reprfunc)pyMeshGeometry_str;
		PYMeshGeometry_Type.tp_as_number = &PYMeshGeometry_number;
		PYMeshGeometry_Type.tp_methods = PYMeshGeometry_methods.discard();
		PYMeshGeometry_Type.tp_getset = PYMeshGeometry_getsets.discard();
		PYMeshGeometry_Type.tp_init = (initproc)pyMeshGeometry_init;
		PYMeshGeometry_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshGeometry_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshGeometry");
			return false;
		}
		Py_INCREF(&PYMeshGeometry_Type);
		
		// Tellusim::MeshTransform
		PYMeshTransform_methods.reserve(PYMeshTransform_methods.size() + 31);
		PYMeshTransform_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshTransform_equalPtr, METH_VARARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshTransform_clonePtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshTransform_clearPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshTransform_destroyPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshTransform_acquirePtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshTransform_unacquirePtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshTransform_isValidPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshTransform_isOwnerPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshTransform_isConstPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshTransform_getCountPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshTransform_getInternalPtr, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "clear", (PyCFunction)MeshTransform_clear, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getMinTime", (PyCFunction)MeshTransform_getMinTime, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getMaxTime", (PyCFunction)MeshTransform_getMaxTime, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshTransform_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "setTranslate", (PyCFunction)MeshTransform_setTranslate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "setRotate", (PyCFunction)MeshTransform_setRotate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "setScale", (PyCFunction)MeshTransform_setScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "setMorph", (PyCFunction)MeshTransform_setMorph, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getTransform", (PyCFunction)MeshTransform_getTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getTranslate", (PyCFunction)MeshTransform_getTranslate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getRotate", (PyCFunction)MeshTransform_getRotate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getScale", (PyCFunction)MeshTransform_getScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getMorph", (PyCFunction)MeshTransform_getMorph, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "hasTransformKeys", (PyCFunction)MeshTransform_hasTransformKeys, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "hasTranslateKeys", (PyCFunction)MeshTransform_hasTranslateKeys, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "hasRotateKeys", (PyCFunction)MeshTransform_hasRotateKeys, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "hasScaleKeys", (PyCFunction)MeshTransform_hasScaleKeys, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "hasMorphKeys", (PyCFunction)MeshTransform_hasMorphKeys, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshTransform_getMemory, METH_NOARGS, "" });
		PYMeshTransform_methods.append(PyMethodDef {});
		PYMeshTransform_getsets.reserve(PYMeshTransform_getsets.size() + 4);
		PYMeshTransform_getsets.append(PyGetSetDef { "min_time", (getter)MeshTransform_get_min_time, nullptr, "", nullptr });
		PYMeshTransform_getsets.append(PyGetSetDef { "max_time", (getter)MeshTransform_get_max_time, nullptr, "", nullptr });
		PYMeshTransform_getsets.append(PyGetSetDef { "memory", (getter)MeshTransform_get_memory, nullptr, "", nullptr });
		PYMeshTransform_getsets.append(PyGetSetDef {});
		PYMeshTransform_Type.tp_dealloc = (destructor)pyMeshTransform_dealloc;
		PYMeshTransform_number.nb_bool = (inquiry)pyMeshTransform_bool;
		PYMeshTransform_Type.tp_name = "tellusim.MeshTransform";
		PYMeshTransform_Type.tp_basicsize = sizeof(PYMeshTransform);
		PYMeshTransform_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshTransform_Type.tp_doc = "";
		PYMeshTransform_Type.tp_str = (reprfunc)pyMeshTransform_str;
		PYMeshTransform_Type.tp_as_number = &PYMeshTransform_number;
		PYMeshTransform_Type.tp_methods = PYMeshTransform_methods.discard();
		PYMeshTransform_Type.tp_getset = PYMeshTransform_getsets.discard();
		PYMeshTransform_Type.tp_init = (initproc)pyMeshTransform_init;
		PYMeshTransform_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshTransform_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshTransform");
			return false;
		}
		Py_INCREF(&PYMeshTransform_Type);
		
		// Tellusim::MeshAnimation
		PYMeshAnimation_methods.reserve(PYMeshAnimation_methods.size() + 36);
		PYMeshAnimation_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshAnimation_equalPtr, METH_VARARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshAnimation_clonePtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshAnimation_clearPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshAnimation_destroyPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshAnimation_acquirePtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshAnimation_unacquirePtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshAnimation_isValidPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshAnimation_isOwnerPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshAnimation_isConstPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshAnimation_getCountPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshAnimation_getInternalPtr, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "clear", (PyCFunction)MeshAnimation_clear, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getIndex", (PyCFunction)MeshAnimation_getIndex, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setName", (PyCFunction)MeshAnimation_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getName", (PyCFunction)MeshAnimation_getName, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setMesh", (PyCFunction)MeshAnimation_setMesh, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getMesh", (PyCFunction)MeshAnimation_getMesh, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getMinTime", (PyCFunction)MeshAnimation_getMinTime, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getMaxTime", (PyCFunction)MeshAnimation_getMaxTime, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setNumTransforms", (PyCFunction)MeshAnimation_setNumTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getNumTransforms", (PyCFunction)MeshAnimation_getNumTransforms, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getTransforms", (PyCFunction)MeshAnimation_getTransforms, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getTransform", (PyCFunction)MeshAnimation_getTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshAnimation_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setTranslate", (PyCFunction)MeshAnimation_setTranslate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setRotate", (PyCFunction)MeshAnimation_setRotate, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setScale", (PyCFunction)MeshAnimation_setScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setMorph", (PyCFunction)MeshAnimation_setMorph, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "setTime", (PyCFunction)MeshAnimation_setTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getLocalTransform", (PyCFunction)MeshAnimation_getLocalTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getGlobalTransform", (PyCFunction)MeshAnimation_getGlobalTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getMorphTransform", (PyCFunction)MeshAnimation_getMorphTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getBoundBox", (PyCFunction)MeshAnimation_getBoundBox, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "optimizeTransforms", (PyCFunction)MeshAnimation_optimizeTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAnimation_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshAnimation_getMemory, METH_NOARGS, "" });
		PYMeshAnimation_methods.append(PyMethodDef {});
		PYMeshAnimation_getsets.reserve(PYMeshAnimation_getsets.size() + 9);
		PYMeshAnimation_getsets.append(PyGetSetDef { "index", (getter)MeshAnimation_get_index, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "name", (getter)MeshAnimation_get_name, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "mesh", (getter)MeshAnimation_get_mesh, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "min_time", (getter)MeshAnimation_get_min_time, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "max_time", (getter)MeshAnimation_get_max_time, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "num_transforms", (getter)MeshAnimation_get_num_transforms, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "bound_box", (getter)MeshAnimation_get_bound_box, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef { "memory", (getter)MeshAnimation_get_memory, nullptr, "", nullptr });
		PYMeshAnimation_getsets.append(PyGetSetDef {});
		PYMeshAnimation_Type.tp_dealloc = (destructor)pyMeshAnimation_dealloc;
		PYMeshAnimation_number.nb_bool = (inquiry)pyMeshAnimation_bool;
		PYMeshAnimation_Type.tp_name = "tellusim.MeshAnimation";
		PYMeshAnimation_Type.tp_basicsize = sizeof(PYMeshAnimation);
		PYMeshAnimation_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshAnimation_Type.tp_doc = "";
		PYMeshAnimation_Type.tp_str = (reprfunc)pyMeshAnimation_str;
		PYMeshAnimation_Type.tp_as_number = &PYMeshAnimation_number;
		PYMeshAnimation_Type.tp_methods = PYMeshAnimation_methods.discard();
		PYMeshAnimation_Type.tp_getset = PYMeshAnimation_getsets.discard();
		PYMeshAnimation_Type.tp_init = (initproc)pyMeshAnimation_init;
		PYMeshAnimation_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshAnimation_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshAnimation");
			return false;
		}
		Py_INCREF(&PYMeshAnimation_Type);
		
		// Tellusim::MeshAttachment
		PYMeshAttachment_methods.reserve(PYMeshAttachment_methods.size() + 45);
		PYMeshAttachment_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMeshAttachment_equalPtr, METH_VARARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMeshAttachment_clonePtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMeshAttachment_clearPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMeshAttachment_destroyPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMeshAttachment_acquirePtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMeshAttachment_unacquirePtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMeshAttachment_isValidPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMeshAttachment_isOwnerPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMeshAttachment_isConstPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMeshAttachment_getCountPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMeshAttachment_getInternalPtr, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "clear", (PyCFunction)MeshAttachment_clear, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "setType", (PyCFunction)MeshAttachment_setType, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getType", (PyCFunction)MeshAttachment_getType, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getTypeName", (PyCFunction)MeshAttachment_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isUnknown", (PyCFunction)MeshAttachment_isUnknown, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isLight", (PyCFunction)MeshAttachment_isLight, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "isCamera", (PyCFunction)MeshAttachment_isCamera, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "setName", (PyCFunction)MeshAttachment_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getName", (PyCFunction)MeshAttachment_getName, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "setNode", (PyCFunction)MeshAttachment_setNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getNode", (PyCFunction)MeshAttachment_getNode, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "setData", (PyCFunction)MeshAttachment_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getData", (PyCFunction)MeshAttachment_getData, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "clearParameters", (PyCFunction)MeshAttachment_clearParameters, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "removeParameter", (PyCFunction)MeshAttachment_removeParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "copyParameters", (PyCFunction)MeshAttachment_copyParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "findParameter", (PyCFunction)MeshAttachment_findParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "hasParameter", (PyCFunction)MeshAttachment_hasParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getNumParameters", (PyCFunction)MeshAttachment_getNumParameters, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterType", (PyCFunction)MeshAttachment_getParameterType, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "addParameter", (PyCFunction)MeshAttachment_addParameter, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterFlags", (PyCFunction)MeshAttachment_getParameterFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "hasParameterFlag", (PyCFunction)MeshAttachment_hasParameterFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "hasParameterFlags", (PyCFunction)MeshAttachment_hasParameterFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterBool", (PyCFunction)MeshAttachment_getParameterBool, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterScalarf32", (PyCFunction)MeshAttachment_getParameterScalarf32, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterVector4f", (PyCFunction)MeshAttachment_getParameterVector4f, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterColor", (PyCFunction)MeshAttachment_getParameterColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getParameterName", (PyCFunction)MeshAttachment_getParameterName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "setTransform", (PyCFunction)MeshAttachment_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getTransform", (PyCFunction)MeshAttachment_getTransform, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "compare", (PyCFunction)MeshAttachment_compare, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshAttachment_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshAttachment_getMemory, METH_NOARGS, "" });
		PYMeshAttachment_methods.append(PyMethodDef {});
		PYMeshAttachment_getsets.reserve(PYMeshAttachment_getsets.size() + 8);
		PYMeshAttachment_getsets.append(PyGetSetDef { "type", (getter)MeshAttachment_get_type, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "name", (getter)MeshAttachment_get_name, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "node", (getter)MeshAttachment_get_node, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "data", (getter)MeshAttachment_get_data, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "num_parameters", (getter)MeshAttachment_get_num_parameters, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "transform", (getter)MeshAttachment_get_transform, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef { "memory", (getter)MeshAttachment_get_memory, nullptr, "", nullptr });
		PYMeshAttachment_getsets.append(PyGetSetDef {});
		PYMeshAttachment_Type.tp_dealloc = (destructor)pyMeshAttachment_dealloc;
		PYMeshAttachment_number.nb_bool = (inquiry)pyMeshAttachment_bool;
		PYMeshAttachment_Type.tp_name = "tellusim.MeshAttachment";
		PYMeshAttachment_Type.tp_basicsize = sizeof(PYMeshAttachment);
		PYMeshAttachment_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshAttachment_Type.tp_doc = "";
		PYMeshAttachment_Type.tp_str = (reprfunc)pyMeshAttachment_str;
		PYMeshAttachment_Type.tp_as_number = &PYMeshAttachment_number;
		PYMeshAttachment_Type.tp_methods = PYMeshAttachment_methods.discard();
		PYMeshAttachment_Type.tp_getset = PYMeshAttachment_getsets.discard();
		PYMeshAttachment_Type.tp_init = (initproc)pyMeshAttachment_init;
		PYMeshAttachment_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshAttachment_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshAttachment");
			return false;
		}
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeLightGlobal", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeLightPoint", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeLightSpot", PyLong_FromLong(3));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeLightImage", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeCameraPerspective", PyLong_FromLong(5));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeCameraOrthographic", PyLong_FromLong(6));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "NumTypes", PyLong_FromLong(7));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagBool", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagScalarf32", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagVector4f", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagColor", PyLong_FromLong(8));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "FlagName", PyLong_FromLong(16));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeColor", PyUnicode_FromString(MeshAttachment::TypeColor));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeIntensity", PyUnicode_FromString(MeshAttachment::TypeIntensity));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeTemperature", PyUnicode_FromString(MeshAttachment::TypeTemperature));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeInnerAngle", PyUnicode_FromString(MeshAttachment::TypeInnerAngle));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeOuterAngle", PyUnicode_FromString(MeshAttachment::TypeOuterAngle));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeAttenuation", PyUnicode_FromString(MeshAttachment::TypeAttenuation));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeDiffuse", PyUnicode_FromString(MeshAttachment::TypeDiffuse));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeSpecular", PyUnicode_FromString(MeshAttachment::TypeSpecular));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeWidth", PyUnicode_FromString(MeshAttachment::TypeWidth));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeHeight", PyUnicode_FromString(MeshAttachment::TypeHeight));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeRadius", PyUnicode_FromString(MeshAttachment::TypeRadius));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeLength", PyUnicode_FromString(MeshAttachment::TypeLength));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeShadow", PyUnicode_FromString(MeshAttachment::TypeShadow));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeAspect", PyUnicode_FromString(MeshAttachment::TypeAspect));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeFovX", PyUnicode_FromString(MeshAttachment::TypeFovX));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeFovY", PyUnicode_FromString(MeshAttachment::TypeFovY));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeSizeX", PyUnicode_FromString(MeshAttachment::TypeSizeX));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeSizeY", PyUnicode_FromString(MeshAttachment::TypeSizeY));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeZNear", PyUnicode_FromString(MeshAttachment::TypeZNear));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeZFar", PyUnicode_FromString(MeshAttachment::TypeZFar));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeFStop", PyUnicode_FromString(MeshAttachment::TypeFStop));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeExposure", PyUnicode_FromString(MeshAttachment::TypeExposure));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeApertureX", PyUnicode_FromString(MeshAttachment::TypeApertureX));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeApertureY", PyUnicode_FromString(MeshAttachment::TypeApertureY));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeFocalLength", PyUnicode_FromString(MeshAttachment::TypeFocalLength));
		PyDict_SetItemString(PYMeshAttachment_Type.tp_dict, "TypeFocusDistance", PyUnicode_FromString(MeshAttachment::TypeFocusDistance));
		PyType_Modified(&PYMeshAttachment_Type);
		Py_INCREF(&PYMeshAttachment_Type);
		
		// Tellusim::Mesh
		PYMesh_methods.reserve(PYMesh_methods.size() + 78);
		PYMesh_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMesh_equalPtr, METH_VARARGS, "" });
		PYMesh_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMesh_clonePtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMesh_clearPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMesh_destroyPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMesh_acquirePtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMesh_unacquirePtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMesh_isValidPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMesh_isOwnerPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMesh_isConstPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMesh_getCountPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMesh_getInternalPtr, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "clear", (PyCFunction)Mesh_clear, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "isLoaded", (PyCFunction)Mesh_isLoaded, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "info", (PyCFunction)Mesh_info, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "load", (PyCFunction)Mesh_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "save", (PyCFunction)Mesh_save, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "setName", (PyCFunction)Mesh_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getName", (PyCFunction)Mesh_getName, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "setBasis", (PyCFunction)Mesh_setBasis, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getFrontAxis", (PyCFunction)Mesh_getFrontAxis, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getRightAxis", (PyCFunction)Mesh_getRightAxis, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getUpAxis", (PyCFunction)Mesh_getUpAxis, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getBasis", (PyCFunction)Mesh_getBasis, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getFrontAxisName", (PyCFunction)Mesh_getFrontAxisName, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getRightAxisName", (PyCFunction)Mesh_getRightAxisName, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getUpAxisName", (PyCFunction)Mesh_getUpAxisName, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getBasisName", (PyCFunction)Mesh_getBasisName, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "clearNodes", (PyCFunction)Mesh_clearNodes, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "reserveNodes", (PyCFunction)Mesh_reserveNodes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "addNode", (PyCFunction)Mesh_addNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "removeNode", (PyCFunction)Mesh_removeNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "findNode", (PyCFunction)Mesh_findNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getNumNodes", (PyCFunction)Mesh_getNumNodes, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getNodes", (PyCFunction)Mesh_getNodes, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getNode", (PyCFunction)Mesh_getNode, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createLocalTransforms", (PyCFunction)Mesh_createLocalTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createGlobalTransforms", (PyCFunction)Mesh_createGlobalTransforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "clearGeometries", (PyCFunction)Mesh_clearGeometries, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "reserveGeometries", (PyCFunction)Mesh_reserveGeometries, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "addGeometry", (PyCFunction)Mesh_addGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "removeGeometry", (PyCFunction)Mesh_removeGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "replaceGeometry", (PyCFunction)Mesh_replaceGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "findGeometry", (PyCFunction)Mesh_findGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getNumGeometries", (PyCFunction)Mesh_getNumGeometries, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getGeometries", (PyCFunction)Mesh_getGeometries, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getGeometry", (PyCFunction)Mesh_getGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "hasGeometryIndices", (PyCFunction)Mesh_hasGeometryIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "hasGeometryAttribute", (PyCFunction)Mesh_hasGeometryAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getNumGeometryPositions", (PyCFunction)Mesh_getNumGeometryPositions, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getNumGeometryPrimitives", (PyCFunction)Mesh_getNumGeometryPrimitives, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "clearAnimations", (PyCFunction)Mesh_clearAnimations, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "reserveAnimations", (PyCFunction)Mesh_reserveAnimations, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "addAnimation", (PyCFunction)Mesh_addAnimation, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "removeAnimation", (PyCFunction)Mesh_removeAnimation, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "replaceAnimation", (PyCFunction)Mesh_replaceAnimation, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "findAnimation", (PyCFunction)Mesh_findAnimation, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getNumAnimations", (PyCFunction)Mesh_getNumAnimations, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getAnimations", (PyCFunction)Mesh_getAnimations, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "getAnimation", (PyCFunction)Mesh_getAnimation, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getBoundBox", (PyCFunction)Mesh_getBoundBox, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createBounds", (PyCFunction)Mesh_createBounds, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createBasis", (PyCFunction)Mesh_createBasis, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createNormals", (PyCFunction)Mesh_createNormals, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createTangents", (PyCFunction)Mesh_createTangents, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "createIslands", (PyCFunction)Mesh_createIslands, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeIndices", (PyCFunction)Mesh_optimizeIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeAttributes", (PyCFunction)Mesh_optimizeAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeMaterials", (PyCFunction)Mesh_optimizeMaterials, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeWinding", (PyCFunction)Mesh_optimizeWinding, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeGeometries", (PyCFunction)Mesh_optimizeGeometries, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeAnimations", (PyCFunction)Mesh_optimizeAnimations, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "optimizeOrder", (PyCFunction)Mesh_optimizeOrder, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "mergeGeometries", (PyCFunction)Mesh_mergeGeometries, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef { "packAttributes", (PyCFunction)Mesh_packAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "unpackAttributes", (PyCFunction)Mesh_unpackAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "setTransform", (PyCFunction)Mesh_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYMesh_methods.append(PyMethodDef { "getMemory", (PyCFunction)Mesh_getMemory, METH_NOARGS, "" });
		PYMesh_methods.append(PyMethodDef {});
		PYMesh_getsets.reserve(PYMesh_getsets.size() + 17);
		PYMesh_getsets.append(PyGetSetDef { "name", (getter)Mesh_get_name, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "front_axis", (getter)Mesh_get_front_axis, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "right_axis", (getter)Mesh_get_right_axis, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "up_axis", (getter)Mesh_get_up_axis, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "basis", (getter)Mesh_get_basis, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "front_axis_name", (getter)Mesh_get_front_axis_name, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "right_axis_name", (getter)Mesh_get_right_axis_name, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "up_axis_name", (getter)Mesh_get_up_axis_name, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "basis_name", (getter)Mesh_get_basis_name, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "num_nodes", (getter)Mesh_get_num_nodes, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "num_geometries", (getter)Mesh_get_num_geometries, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "num_geometry_positions", (getter)Mesh_get_num_geometry_positions, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "num_geometry_primitives", (getter)Mesh_get_num_geometry_primitives, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "num_animations", (getter)Mesh_get_num_animations, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "bound_box", (getter)Mesh_get_bound_box, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef { "memory", (getter)Mesh_get_memory, nullptr, "", nullptr });
		PYMesh_getsets.append(PyGetSetDef {});
		PYMesh_Type.tp_dealloc = (destructor)pyMesh_dealloc;
		PYMesh_number.nb_bool = (inquiry)pyMesh_bool;
		PYMesh_Type.tp_name = "tellusim.Mesh";
		PYMesh_Type.tp_basicsize = sizeof(PYMesh);
		PYMesh_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMesh_Type.tp_doc = "";
		PYMesh_Type.tp_str = (reprfunc)pyMesh_str;
		PYMesh_Type.tp_as_number = &PYMesh_number;
		PYMesh_Type.tp_methods = PYMesh_methods.discard();
		PYMesh_Type.tp_getset = PYMesh_getsets.discard();
		PYMesh_Type.tp_init = (initproc)pyMesh_init;
		PYMesh_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMesh_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Mesh");
			return false;
		}
		PyDict_SetItemString(PYMesh_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "FlagEmbed", PyLong_FromLong(1));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "Flag32Bit", PyLong_FromLong(2));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisXUpRight", PyLong_FromLong(1));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisYUpRight", PyLong_FromLong(2));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisZUpRight", PyLong_FromLong(3));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisXUpLeft", PyLong_FromLong(4));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisYUpLeft", PyLong_FromLong(5));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisZUpLeft", PyLong_FromLong(6));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "BasisZUpMaya", PyLong_FromLong(7));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "NumBases", PyLong_FromLong(8));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisPX", PyLong_FromLong(1));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisPY", PyLong_FromLong(2));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisPZ", PyLong_FromLong(3));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisNX", PyLong_FromLong(4));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisNY", PyLong_FromLong(5));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "AxisNZ", PyLong_FromLong(6));
		PyDict_SetItemString(PYMesh_Type.tp_dict, "NumAxes", PyLong_FromLong(7));
		PyType_Modified(&PYMesh_Type);
		Py_INCREF(&PYMesh_Type);
		
		// Tellusim::Json
		PYJson_methods.reserve(PYJson_methods.size() + 50);
		PYJson_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyJson_equalPtr, METH_VARARGS, "" });
		PYJson_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyJson_clonePtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyJson_clearPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyJson_destroyPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyJson_acquirePtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyJson_unacquirePtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyJson_isValidPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyJson_isOwnerPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyJson_isConstPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyJson_getCountPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyJson_getInternalPtr, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "clear", (PyCFunction)Json_clear, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "create", (PyCFunction)Json_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "load", (PyCFunction)Json_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "save", (PyCFunction)Json_save, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getRoot", (PyCFunction)Json_getRoot, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "setParent", (PyCFunction)Json_setParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getParent", (PyCFunction)Json_getParent, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "addChild", (PyCFunction)Json_addChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "removeChild", (PyCFunction)Json_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)Json_releaseChildren, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "findChild", (PyCFunction)Json_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "isChild", (PyCFunction)Json_isChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getChild", (PyCFunction)Json_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)Json_getNumChildren, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getChildren", (PyCFunction)Json_getChildren, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getPathName", (PyCFunction)Json_getPathName, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "setName", (PyCFunction)Json_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getName", (PyCFunction)Json_getName, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "setType", (PyCFunction)Json_setType, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getType", (PyCFunction)Json_getType, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Json_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "isUnknown", (PyCFunction)Json_isUnknown, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isNull", (PyCFunction)Json_isNull, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isBool", (PyCFunction)Json_isBool, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isNumber", (PyCFunction)Json_isNumber, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isString", (PyCFunction)Json_isString, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isObject", (PyCFunction)Json_isObject, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "isArray", (PyCFunction)Json_isArray, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "setData", (PyCFunction)Json_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getData", (PyCFunction)Json_getData, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getDataBool", (PyCFunction)Json_getDataBool, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getDatai32", (PyCFunction)Json_getDatai32, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getDatau32", (PyCFunction)Json_getDatau32, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getDatau64", (PyCFunction)Json_getDatau64, METH_VARARGS | METH_KEYWORDS, "" });
		PYJson_methods.append(PyMethodDef { "getDataf32", (PyCFunction)Json_getDataf32, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getDataf64", (PyCFunction)Json_getDataf64, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getNumber", (PyCFunction)Json_getNumber, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef { "getString", (PyCFunction)Json_getString, METH_NOARGS, "" });
		PYJson_methods.append(PyMethodDef {});
		PYJson_getsets.reserve(PYJson_getsets.size() + 16);
		PYJson_getsets.append(PyGetSetDef { "root", (getter)Json_get_root, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "parent", (getter)Json_get_parent, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "num_children", (getter)Json_get_num_children, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "path_name", (getter)Json_get_path_name, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "name", (getter)Json_get_name, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "type", (getter)Json_get_type, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "data", (getter)Json_get_data, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "data_bool", (getter)Json_get_data_bool, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "datai32", (getter)Json_get_datai32, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "datau32", (getter)Json_get_datau32, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "datau64", (getter)Json_get_datau64, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "dataf32", (getter)Json_get_dataf32, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "dataf64", (getter)Json_get_dataf64, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "number", (getter)Json_get_number, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef { "string", (getter)Json_get_string, nullptr, "", nullptr });
		PYJson_getsets.append(PyGetSetDef {});
		PYJson_Type.tp_dealloc = (destructor)pyJson_dealloc;
		PYJson_number.nb_bool = (inquiry)pyJson_bool;
		PYJson_Type.tp_name = "tellusim.Json";
		PYJson_Type.tp_basicsize = sizeof(PYJson);
		PYJson_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYJson_Type.tp_doc = "";
		PYJson_Type.tp_str = (reprfunc)pyJson_str;
		PYJson_Type.tp_as_number = &PYJson_number;
		PYJson_Type.tp_methods = PYJson_methods.discard();
		PYJson_Type.tp_getset = PYJson_getsets.discard();
		PYJson_Type.tp_init = (initproc)pyJson_init;
		PYJson_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYJson_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Json");
			return false;
		}
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeNull", PyLong_FromLong(1));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeBool", PyLong_FromLong(2));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeNumber", PyLong_FromLong(3));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeString", PyLong_FromLong(4));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeObject", PyLong_FromLong(5));
		PyDict_SetItemString(PYJson_Type.tp_dict, "TypeArray", PyLong_FromLong(6));
		PyDict_SetItemString(PYJson_Type.tp_dict, "NumTypes", PyLong_FromLong(7));
		PyType_Modified(&PYJson_Type);
		Py_INCREF(&PYJson_Type);
		
		// Tellusim::Xml
		PYXml_methods.reserve(PYXml_methods.size() + 53);
		PYXml_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyXml_equalPtr, METH_VARARGS, "" });
		PYXml_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyXml_clonePtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyXml_clearPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyXml_destroyPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyXml_acquirePtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyXml_unacquirePtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyXml_isValidPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyXml_isOwnerPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyXml_isConstPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyXml_getCountPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyXml_getInternalPtr, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "clear", (PyCFunction)Xml_clear, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "create", (PyCFunction)Xml_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "load", (PyCFunction)Xml_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "save", (PyCFunction)Xml_save, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getRoot", (PyCFunction)Xml_getRoot, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "setParent", (PyCFunction)Xml_setParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getParent", (PyCFunction)Xml_getParent, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "addChild", (PyCFunction)Xml_addChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "removeChild", (PyCFunction)Xml_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)Xml_releaseChildren, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "findChild", (PyCFunction)Xml_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "isChild", (PyCFunction)Xml_isChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getChild", (PyCFunction)Xml_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)Xml_getNumChildren, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getChildren", (PyCFunction)Xml_getChildren, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getPathName", (PyCFunction)Xml_getPathName, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "setName", (PyCFunction)Xml_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getName", (PyCFunction)Xml_getName, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "setData", (PyCFunction)Xml_setData, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getData", (PyCFunction)Xml_getData, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getDataBool", (PyCFunction)Xml_getDataBool, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getDatai32", (PyCFunction)Xml_getDatai32, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getDatau32", (PyCFunction)Xml_getDatau32, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getDatau64", (PyCFunction)Xml_getDatau64, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getDataf32", (PyCFunction)Xml_getDataf32, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getDataf64", (PyCFunction)Xml_getDataf64, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "addAttribute", (PyCFunction)Xml_addAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "removeAttribute", (PyCFunction)Xml_removeAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "findAttribute", (PyCFunction)Xml_findAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "isAttribute", (PyCFunction)Xml_isAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "removeAttributes", (PyCFunction)Xml_removeAttributes, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getNumAttributes", (PyCFunction)Xml_getNumAttributes, METH_NOARGS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributeName", (PyCFunction)Xml_getAttributeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "setAttributes", (PyCFunction)Xml_setAttributes, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "setAttribute", (PyCFunction)Xml_setAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttribute", (PyCFunction)Xml_getAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributei32", (PyCFunction)Xml_getAttributei32, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributeu32", (PyCFunction)Xml_getAttributeu32, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributeu64", (PyCFunction)Xml_getAttributeu64, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributef32", (PyCFunction)Xml_getAttributef32, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef { "getAttributef64", (PyCFunction)Xml_getAttributef64, METH_VARARGS | METH_KEYWORDS, "" });
		PYXml_methods.append(PyMethodDef {});
		PYXml_getsets.reserve(PYXml_getsets.size() + 14);
		PYXml_getsets.append(PyGetSetDef { "root", (getter)Xml_get_root, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "parent", (getter)Xml_get_parent, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "num_children", (getter)Xml_get_num_children, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "path_name", (getter)Xml_get_path_name, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "name", (getter)Xml_get_name, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "data", (getter)Xml_get_data, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "data_bool", (getter)Xml_get_data_bool, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "datai32", (getter)Xml_get_datai32, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "datau32", (getter)Xml_get_datau32, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "datau64", (getter)Xml_get_datau64, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "dataf32", (getter)Xml_get_dataf32, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "dataf64", (getter)Xml_get_dataf64, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef { "num_attributes", (getter)Xml_get_num_attributes, nullptr, "", nullptr });
		PYXml_getsets.append(PyGetSetDef {});
		PYXml_Type.tp_dealloc = (destructor)pyXml_dealloc;
		PYXml_number.nb_bool = (inquiry)pyXml_bool;
		PYXml_Type.tp_name = "tellusim.Xml";
		PYXml_Type.tp_basicsize = sizeof(PYXml);
		PYXml_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYXml_Type.tp_doc = "";
		PYXml_Type.tp_str = (reprfunc)pyXml_str;
		PYXml_Type.tp_as_number = &PYXml_number;
		PYXml_Type.tp_methods = PYXml_methods.discard();
		PYXml_Type.tp_getset = PYXml_getsets.discard();
		PYXml_Type.tp_init = (initproc)pyXml_init;
		PYXml_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYXml_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Xml");
			return false;
		}
		Py_INCREF(&PYXml_Type);
		
		// Tellusim::Buffer
		PYBuffer_methods.reserve(PYBuffer_methods.size() + 32);
		PYBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyBuffer_equalPtr, METH_VARARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyBuffer_clonePtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyBuffer_clearPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyBuffer_destroyPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyBuffer_acquirePtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyBuffer_unacquirePtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyBuffer_isValidPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyBuffer_isConstPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyBuffer_getCountPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyBuffer_getInternalPtr, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Buffer_getPlatform, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Buffer_getPlatformName, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getIndex", (PyCFunction)Buffer_getIndex, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "clear", (PyCFunction)Buffer_clear, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "isCreated", (PyCFunction)Buffer_isCreated, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "setName", (PyCFunction)Buffer_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYBuffer_methods.append(PyMethodDef { "getName", (PyCFunction)Buffer_getName, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "create", (PyCFunction)Buffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYBuffer_methods.append(PyMethodDef { "isMapped", (PyCFunction)Buffer_isMapped, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getFlags", (PyCFunction)Buffer_getFlags, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "hasFlag", (PyCFunction)Buffer_hasFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYBuffer_methods.append(PyMethodDef { "hasFlags", (PyCFunction)Buffer_hasFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYBuffer_methods.append(PyMethodDef { "getFlagsName", (PyCFunction)Buffer_getFlagsName, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getFormat", (PyCFunction)Buffer_getFormat, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getFormatName", (PyCFunction)Buffer_getFormatName, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getComponents", (PyCFunction)Buffer_getComponents, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getPixelSize", (PyCFunction)Buffer_getPixelSize, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getSize", (PyCFunction)Buffer_getSize, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getPageSize", (PyCFunction)Buffer_getPageSize, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef { "getDescription", (PyCFunction)Buffer_getDescription, METH_NOARGS, "" });
		PYBuffer_methods.append(PyMethodDef {});
		PYBuffer_getsets.reserve(PYBuffer_getsets.size() + 14);
		PYBuffer_getsets.append(PyGetSetDef { "platform", (getter)Buffer_get_platform, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "platform_name", (getter)Buffer_get_platform_name, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "index", (getter)Buffer_get_index, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "name", (getter)Buffer_get_name, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "flags", (getter)Buffer_get_flags, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "flags_name", (getter)Buffer_get_flags_name, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "format", (getter)Buffer_get_format, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "format_name", (getter)Buffer_get_format_name, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "components", (getter)Buffer_get_components, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "pixel_size", (getter)Buffer_get_pixel_size, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "size", (getter)Buffer_get_size, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "page_size", (getter)Buffer_get_page_size, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef { "description", (getter)Buffer_get_description, nullptr, "", nullptr });
		PYBuffer_getsets.append(PyGetSetDef {});
		PYBuffer_Type.tp_dealloc = (destructor)pyBuffer_dealloc;
		PYBuffer_number.nb_bool = (inquiry)pyBuffer_bool;
		PYBuffer_Type.tp_name = "tellusim.Buffer";
		PYBuffer_Type.tp_basicsize = sizeof(PYBuffer);
		PYBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYBuffer_Type.tp_doc = "";
		PYBuffer_Type.tp_str = (reprfunc)pyBuffer_str;
		PYBuffer_Type.tp_as_number = &PYBuffer_number;
		PYBuffer_Type.tp_methods = PYBuffer_methods.discard();
		PYBuffer_Type.tp_getset = PYBuffer_getsets.discard();
		PYBuffer_Type.tp_init = (initproc)pyBuffer_init;
		PYBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Buffer");
			return false;
		}
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagRead", PyLong_FromLong(1));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagWrite", PyLong_FromLong(2));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagSource", PyLong_FromLong(4));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagSparse", PyLong_FromLong(8));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagShared", PyLong_FromLong(16));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagMapped", PyLong_FromLong(32));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagExtern", PyLong_FromLong(64));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagInterop", PyLong_FromLong(128));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagDynamic", PyLong_FromLong(256));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagUniform", PyLong_FromLong(512));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagStorage", PyLong_FromLong(1024));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagAddress", PyLong_FromLong(2048));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagTracing", PyLong_FromLong(4096));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagScratch", PyLong_FromLong(8192));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagBinding", PyLong_FromLong(16384));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagIndirect", PyLong_FromLong(32768));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagConditional", PyLong_FromLong(65536));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagVertex", PyLong_FromLong(131072));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagIndex", PyLong_FromLong(262144));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagTexel", PyLong_FromLong(524288));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "FlagAccel", PyLong_FromLong(1048576));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYBuffer_Type.tp_dict, "NumFlags", PyLong_FromLong(21));
		PyType_Modified(&PYBuffer_Type);
		Py_INCREF(&PYBuffer_Type);
		
		// Tellusim::BufferTable
		PYBufferTable_methods.reserve(PYBufferTable_methods.size() + 24);
		PYBufferTable_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyBufferTable_equalPtr, METH_VARARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyBufferTable_clonePtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyBufferTable_clearPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyBufferTable_destroyPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyBufferTable_acquirePtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyBufferTable_unacquirePtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyBufferTable_isValidPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyBufferTable_isOwnerPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyBufferTable_isConstPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyBufferTable_getCountPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyBufferTable_getInternalPtr, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getPlatform", (PyCFunction)BufferTable_getPlatform, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)BufferTable_getPlatformName, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getIndex", (PyCFunction)BufferTable_getIndex, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "clear", (PyCFunction)BufferTable_clear, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "isCreated", (PyCFunction)BufferTable_isCreated, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "setName", (PyCFunction)BufferTable_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getName", (PyCFunction)BufferTable_getName, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "create", (PyCFunction)BufferTable_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getSize", (PyCFunction)BufferTable_getSize, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef { "get", (PyCFunction)BufferTable_get, METH_VARARGS | METH_KEYWORDS, "" });
		PYBufferTable_methods.append(PyMethodDef { "isOwner", (PyCFunction)BufferTable_isOwner, METH_VARARGS | METH_KEYWORDS, "" });
		PYBufferTable_methods.append(PyMethodDef { "getMemory", (PyCFunction)BufferTable_getMemory, METH_NOARGS, "" });
		PYBufferTable_methods.append(PyMethodDef {});
		PYBufferTable_getsets.reserve(PYBufferTable_getsets.size() + 7);
		PYBufferTable_getsets.append(PyGetSetDef { "platform", (getter)BufferTable_get_platform, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef { "platform_name", (getter)BufferTable_get_platform_name, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef { "index", (getter)BufferTable_get_index, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef { "name", (getter)BufferTable_get_name, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef { "size", (getter)BufferTable_get_size, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef { "memory", (getter)BufferTable_get_memory, nullptr, "", nullptr });
		PYBufferTable_getsets.append(PyGetSetDef {});
		PYBufferTable_Type.tp_dealloc = (destructor)pyBufferTable_dealloc;
		PYBufferTable_number.nb_bool = (inquiry)pyBufferTable_bool;
		PYBufferTable_Type.tp_name = "tellusim.BufferTable";
		PYBufferTable_Type.tp_basicsize = sizeof(PYBufferTable);
		PYBufferTable_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYBufferTable_Type.tp_doc = "";
		PYBufferTable_Type.tp_str = (reprfunc)pyBufferTable_str;
		PYBufferTable_Type.tp_as_number = &PYBufferTable_number;
		PYBufferTable_Type.tp_methods = PYBufferTable_methods.discard();
		PYBufferTable_Type.tp_getset = PYBufferTable_getsets.discard();
		PYBufferTable_Type.tp_init = (initproc)pyBufferTable_init;
		PYBufferTable_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYBufferTable_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "BufferTable");
			return false;
		}
		Py_INCREF(&PYBufferTable_Type);
		
		// Tellusim::D3D12Buffer
		PYD3D12Buffer_methods.reserve(PYD3D12Buffer_methods.size() + 22);
		PYD3D12Buffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Buffer_equalPtr, METH_VARARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Buffer_clonePtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Buffer_clearPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Buffer_destroyPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Buffer_acquirePtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Buffer_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Buffer_isValidPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Buffer_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Buffer_isConstPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Buffer_getCountPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Buffer_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyD3D12Buffer_getBuffer, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "create", (PyCFunction)D3D12Buffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getD3D12Buffer", (PyCFunction)D3D12Buffer_getD3D12Buffer, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getUnorderedAccessView", (PyCFunction)D3D12Buffer_getUnorderedAccessView, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getShaderResourceView", (PyCFunction)D3D12Buffer_getShaderResourceView, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getBufferAddress", (PyCFunction)D3D12Buffer_getBufferAddress, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "setBufferState", (PyCFunction)D3D12Buffer_setBufferState, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getBufferState", (PyCFunction)D3D12Buffer_getBufferState, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getSharedHandle", (PyCFunction)D3D12Buffer_getSharedHandle, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)D3D12Buffer_getInteropHandle, METH_NOARGS, "" });
		PYD3D12Buffer_methods.append(PyMethodDef {});
		PYD3D12Buffer_getsets.reserve(PYD3D12Buffer_getsets.size() + 8);
		PYD3D12Buffer_getsets.append(PyGetSetDef { "d3d12_buffer", (getter)D3D12Buffer_get_d3d12_buffer, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "unordered_access_view", (getter)D3D12Buffer_get_unordered_access_view, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "shader_resource_view", (getter)D3D12Buffer_get_shader_resource_view, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "buffer_address", (getter)D3D12Buffer_get_buffer_address, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "buffer_state", (getter)D3D12Buffer_get_buffer_state, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "shared_handle", (getter)D3D12Buffer_get_shared_handle, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef { "interop_handle", (getter)D3D12Buffer_get_interop_handle, nullptr, "", nullptr });
		PYD3D12Buffer_getsets.append(PyGetSetDef {});
		PYD3D12Buffer_Type.tp_base = &PYBuffer_Type;
		PYD3D12Buffer_Type.tp_dealloc = (destructor)pyD3D12Buffer_dealloc;
		PYD3D12Buffer_number.nb_bool = (inquiry)pyD3D12Buffer_bool;
		PYD3D12Buffer_Type.tp_name = "tellusim.D3D12Buffer";
		PYD3D12Buffer_Type.tp_basicsize = sizeof(PYD3D12Buffer);
		PYD3D12Buffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Buffer_Type.tp_doc = "";
		PYD3D12Buffer_Type.tp_str = (reprfunc)pyD3D12Buffer_str;
		PYD3D12Buffer_Type.tp_as_number = &PYD3D12Buffer_number;
		PYD3D12Buffer_Type.tp_methods = PYD3D12Buffer_methods.discard();
		PYD3D12Buffer_Type.tp_getset = PYD3D12Buffer_getsets.discard();
		PYD3D12Buffer_Type.tp_init = (initproc)pyD3D12Buffer_init;
		PYD3D12Buffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Buffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Buffer");
			return false;
		}
		Py_INCREF(&PYD3D12Buffer_Type);
		
		// Tellusim::D3D11Buffer
		PYD3D11Buffer_methods.reserve(PYD3D11Buffer_methods.size() + 18);
		PYD3D11Buffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Buffer_equalPtr, METH_VARARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Buffer_clonePtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Buffer_clearPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Buffer_destroyPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Buffer_acquirePtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Buffer_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Buffer_isValidPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Buffer_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Buffer_isConstPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Buffer_getCountPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Buffer_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyD3D11Buffer_getBuffer, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "create", (PyCFunction)D3D11Buffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getD3D11Buffer", (PyCFunction)D3D11Buffer_getD3D11Buffer, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getUnorderedAccessView", (PyCFunction)D3D11Buffer_getUnorderedAccessView, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getShaderResourceView", (PyCFunction)D3D11Buffer_getShaderResourceView, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)D3D11Buffer_getInteropHandle, METH_NOARGS, "" });
		PYD3D11Buffer_methods.append(PyMethodDef {});
		PYD3D11Buffer_getsets.reserve(PYD3D11Buffer_getsets.size() + 5);
		PYD3D11Buffer_getsets.append(PyGetSetDef { "d3d11_buffer", (getter)D3D11Buffer_get_d3d11_buffer, nullptr, "", nullptr });
		PYD3D11Buffer_getsets.append(PyGetSetDef { "unordered_access_view", (getter)D3D11Buffer_get_unordered_access_view, nullptr, "", nullptr });
		PYD3D11Buffer_getsets.append(PyGetSetDef { "shader_resource_view", (getter)D3D11Buffer_get_shader_resource_view, nullptr, "", nullptr });
		PYD3D11Buffer_getsets.append(PyGetSetDef { "interop_handle", (getter)D3D11Buffer_get_interop_handle, nullptr, "", nullptr });
		PYD3D11Buffer_getsets.append(PyGetSetDef {});
		PYD3D11Buffer_Type.tp_base = &PYBuffer_Type;
		PYD3D11Buffer_Type.tp_dealloc = (destructor)pyD3D11Buffer_dealloc;
		PYD3D11Buffer_number.nb_bool = (inquiry)pyD3D11Buffer_bool;
		PYD3D11Buffer_Type.tp_name = "tellusim.D3D11Buffer";
		PYD3D11Buffer_Type.tp_basicsize = sizeof(PYD3D11Buffer);
		PYD3D11Buffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Buffer_Type.tp_doc = "";
		PYD3D11Buffer_Type.tp_str = (reprfunc)pyD3D11Buffer_str;
		PYD3D11Buffer_Type.tp_as_number = &PYD3D11Buffer_number;
		PYD3D11Buffer_Type.tp_methods = PYD3D11Buffer_methods.discard();
		PYD3D11Buffer_Type.tp_getset = PYD3D11Buffer_getsets.discard();
		PYD3D11Buffer_Type.tp_init = (initproc)pyD3D11Buffer_init;
		PYD3D11Buffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Buffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Buffer");
			return false;
		}
		Py_INCREF(&PYD3D11Buffer_Type);
		
		// Tellusim::MTLBuffer
		PYMTLBuffer_methods.reserve(PYMTLBuffer_methods.size() + 16);
		PYMTLBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLBuffer_equalPtr, METH_VARARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLBuffer_clonePtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLBuffer_clearPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLBuffer_destroyPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLBuffer_acquirePtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLBuffer_unacquirePtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLBuffer_isValidPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLBuffer_isConstPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLBuffer_getCountPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLBuffer_getInternalPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyMTLBuffer_getBuffer, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "create", (PyCFunction)MTLBuffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "getMTLBuffer", (PyCFunction)MTLBuffer_getMTLBuffer, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef { "getSharedPtr", (PyCFunction)MTLBuffer_getSharedPtr, METH_NOARGS, "" });
		PYMTLBuffer_methods.append(PyMethodDef {});
		PYMTLBuffer_getsets.reserve(PYMTLBuffer_getsets.size() + 3);
		PYMTLBuffer_getsets.append(PyGetSetDef { "mtl_buffer", (getter)MTLBuffer_get_mtl_buffer, nullptr, "", nullptr });
		PYMTLBuffer_getsets.append(PyGetSetDef { "shared_ptr", (getter)MTLBuffer_get_shared_ptr, nullptr, "", nullptr });
		PYMTLBuffer_getsets.append(PyGetSetDef {});
		PYMTLBuffer_Type.tp_base = &PYBuffer_Type;
		PYMTLBuffer_Type.tp_dealloc = (destructor)pyMTLBuffer_dealloc;
		PYMTLBuffer_number.nb_bool = (inquiry)pyMTLBuffer_bool;
		PYMTLBuffer_Type.tp_name = "tellusim.MTLBuffer";
		PYMTLBuffer_Type.tp_basicsize = sizeof(PYMTLBuffer);
		PYMTLBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLBuffer_Type.tp_doc = "";
		PYMTLBuffer_Type.tp_str = (reprfunc)pyMTLBuffer_str;
		PYMTLBuffer_Type.tp_as_number = &PYMTLBuffer_number;
		PYMTLBuffer_Type.tp_methods = PYMTLBuffer_methods.discard();
		PYMTLBuffer_Type.tp_getset = PYMTLBuffer_getsets.discard();
		PYMTLBuffer_Type.tp_init = (initproc)pyMTLBuffer_init;
		PYMTLBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLBuffer");
			return false;
		}
		Py_INCREF(&PYMTLBuffer_Type);
		
		// Tellusim::VKBuffer
		PYVKBuffer_methods.reserve(PYVKBuffer_methods.size() + 21);
		PYVKBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKBuffer_equalPtr, METH_VARARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKBuffer_clonePtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKBuffer_clearPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKBuffer_destroyPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKBuffer_acquirePtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKBuffer_unacquirePtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKBuffer_isValidPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKBuffer_isConstPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKBuffer_getCountPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKBuffer_getInternalPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyVKBuffer_getBuffer, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "create", (PyCFunction)VKBuffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getVKBuffer", (PyCFunction)VKBuffer_getVKBuffer, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getBufferView", (PyCFunction)VKBuffer_getBufferView, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getBufferAddress", (PyCFunction)VKBuffer_getBufferAddress, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "setBufferAccess", (PyCFunction)VKBuffer_setBufferAccess, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getBufferAccess", (PyCFunction)VKBuffer_getBufferAccess, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getSharedPtr", (PyCFunction)VKBuffer_getSharedPtr, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)VKBuffer_getInteropHandle, METH_NOARGS, "" });
		PYVKBuffer_methods.append(PyMethodDef {});
		PYVKBuffer_getsets.reserve(PYVKBuffer_getsets.size() + 7);
		PYVKBuffer_getsets.append(PyGetSetDef { "vk_buffer", (getter)VKBuffer_get_vk_buffer, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef { "buffer_view", (getter)VKBuffer_get_buffer_view, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef { "buffer_address", (getter)VKBuffer_get_buffer_address, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef { "buffer_access", (getter)VKBuffer_get_buffer_access, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef { "shared_ptr", (getter)VKBuffer_get_shared_ptr, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef { "interop_handle", (getter)VKBuffer_get_interop_handle, nullptr, "", nullptr });
		PYVKBuffer_getsets.append(PyGetSetDef {});
		PYVKBuffer_Type.tp_base = &PYBuffer_Type;
		PYVKBuffer_Type.tp_dealloc = (destructor)pyVKBuffer_dealloc;
		PYVKBuffer_number.nb_bool = (inquiry)pyVKBuffer_bool;
		PYVKBuffer_Type.tp_name = "tellusim.VKBuffer";
		PYVKBuffer_Type.tp_basicsize = sizeof(PYVKBuffer);
		PYVKBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKBuffer_Type.tp_doc = "";
		PYVKBuffer_Type.tp_str = (reprfunc)pyVKBuffer_str;
		PYVKBuffer_Type.tp_as_number = &PYVKBuffer_number;
		PYVKBuffer_Type.tp_methods = PYVKBuffer_methods.discard();
		PYVKBuffer_Type.tp_getset = PYVKBuffer_getsets.discard();
		PYVKBuffer_Type.tp_init = (initproc)pyVKBuffer_init;
		PYVKBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKBuffer");
			return false;
		}
		Py_INCREF(&PYVKBuffer_Type);
		
		// Tellusim::GLBuffer
		PYGLBuffer_methods.reserve(PYGLBuffer_methods.size() + 16);
		PYGLBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLBuffer_equalPtr, METH_VARARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLBuffer_clonePtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLBuffer_clearPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLBuffer_destroyPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLBuffer_acquirePtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLBuffer_unacquirePtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLBuffer_isValidPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLBuffer_isConstPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLBuffer_getCountPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLBuffer_getInternalPtr, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyGLBuffer_getBuffer, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "create", (PyCFunction)GLBuffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "getTarget", (PyCFunction)GLBuffer_getTarget, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef { "getBufferID", (PyCFunction)GLBuffer_getBufferID, METH_NOARGS, "" });
		PYGLBuffer_methods.append(PyMethodDef {});
		PYGLBuffer_getsets.reserve(PYGLBuffer_getsets.size() + 3);
		PYGLBuffer_getsets.append(PyGetSetDef { "target", (getter)GLBuffer_get_target, nullptr, "", nullptr });
		PYGLBuffer_getsets.append(PyGetSetDef { "buffer_id", (getter)GLBuffer_get_buffer_id, nullptr, "", nullptr });
		PYGLBuffer_getsets.append(PyGetSetDef {});
		PYGLBuffer_Type.tp_base = &PYBuffer_Type;
		PYGLBuffer_Type.tp_dealloc = (destructor)pyGLBuffer_dealloc;
		PYGLBuffer_number.nb_bool = (inquiry)pyGLBuffer_bool;
		PYGLBuffer_Type.tp_name = "tellusim.GLBuffer";
		PYGLBuffer_Type.tp_basicsize = sizeof(PYGLBuffer);
		PYGLBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLBuffer_Type.tp_doc = "";
		PYGLBuffer_Type.tp_str = (reprfunc)pyGLBuffer_str;
		PYGLBuffer_Type.tp_as_number = &PYGLBuffer_number;
		PYGLBuffer_Type.tp_methods = PYGLBuffer_methods.discard();
		PYGLBuffer_Type.tp_getset = PYGLBuffer_getsets.discard();
		PYGLBuffer_Type.tp_init = (initproc)pyGLBuffer_init;
		PYGLBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLBuffer");
			return false;
		}
		Py_INCREF(&PYGLBuffer_Type);
		
		// Tellusim::GLESBuffer
		PYGLESBuffer_methods.reserve(PYGLESBuffer_methods.size() + 16);
		PYGLESBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESBuffer_equalPtr, METH_VARARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESBuffer_clonePtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESBuffer_clearPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESBuffer_destroyPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESBuffer_acquirePtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESBuffer_unacquirePtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESBuffer_isValidPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESBuffer_isConstPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESBuffer_getCountPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESBuffer_getInternalPtr, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyGLESBuffer_getBuffer, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "create", (PyCFunction)GLESBuffer_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "getTarget", (PyCFunction)GLESBuffer_getTarget, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef { "getBufferID", (PyCFunction)GLESBuffer_getBufferID, METH_NOARGS, "" });
		PYGLESBuffer_methods.append(PyMethodDef {});
		PYGLESBuffer_getsets.reserve(PYGLESBuffer_getsets.size() + 3);
		PYGLESBuffer_getsets.append(PyGetSetDef { "target", (getter)GLESBuffer_get_target, nullptr, "", nullptr });
		PYGLESBuffer_getsets.append(PyGetSetDef { "buffer_id", (getter)GLESBuffer_get_buffer_id, nullptr, "", nullptr });
		PYGLESBuffer_getsets.append(PyGetSetDef {});
		PYGLESBuffer_Type.tp_base = &PYBuffer_Type;
		PYGLESBuffer_Type.tp_dealloc = (destructor)pyGLESBuffer_dealloc;
		PYGLESBuffer_number.nb_bool = (inquiry)pyGLESBuffer_bool;
		PYGLESBuffer_Type.tp_name = "tellusim.GLESBuffer";
		PYGLESBuffer_Type.tp_basicsize = sizeof(PYGLESBuffer);
		PYGLESBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESBuffer_Type.tp_doc = "";
		PYGLESBuffer_Type.tp_str = (reprfunc)pyGLESBuffer_str;
		PYGLESBuffer_Type.tp_as_number = &PYGLESBuffer_number;
		PYGLESBuffer_Type.tp_methods = PYGLESBuffer_methods.discard();
		PYGLESBuffer_Type.tp_getset = PYGLESBuffer_getsets.discard();
		PYGLESBuffer_Type.tp_init = (initproc)pyGLESBuffer_init;
		PYGLESBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESBuffer");
			return false;
		}
		Py_INCREF(&PYGLESBuffer_Type);
		
		// Tellusim::CUBuffer
		PYCUBuffer_methods.reserve(PYCUBuffer_methods.size() + 19);
		PYCUBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCUBuffer_equalPtr, METH_VARARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCUBuffer_clonePtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCUBuffer_clearPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCUBuffer_destroyPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCUBuffer_acquirePtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCUBuffer_unacquirePtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCUBuffer_isValidPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCUBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCUBuffer_isConstPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCUBuffer_getCountPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCUBuffer_getInternalPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyCUBuffer_getBuffer, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getBufferPtr", (PyCFunction)CUBuffer_getBufferPtr, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getBufferData", (PyCFunction)CUBuffer_getBufferData, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getBufferEvent", (PyCFunction)CUBuffer_getBufferEvent, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getArrayFormat", (PyCFunction)CUBuffer_getArrayFormat, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getArrayChannels", (PyCFunction)CUBuffer_getArrayChannels, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef { "getSharedMemory", (PyCFunction)CUBuffer_getSharedMemory, METH_NOARGS, "" });
		PYCUBuffer_methods.append(PyMethodDef {});
		PYCUBuffer_getsets.reserve(PYCUBuffer_getsets.size() + 7);
		PYCUBuffer_getsets.append(PyGetSetDef { "buffer_ptr", (getter)CUBuffer_get_buffer_ptr, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef { "buffer_data", (getter)CUBuffer_get_buffer_data, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef { "buffer_event", (getter)CUBuffer_get_buffer_event, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef { "array_format", (getter)CUBuffer_get_array_format, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef { "array_channels", (getter)CUBuffer_get_array_channels, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef { "shared_memory", (getter)CUBuffer_get_shared_memory, nullptr, "", nullptr });
		PYCUBuffer_getsets.append(PyGetSetDef {});
		PYCUBuffer_Type.tp_base = &PYBuffer_Type;
		PYCUBuffer_Type.tp_dealloc = (destructor)pyCUBuffer_dealloc;
		PYCUBuffer_number.nb_bool = (inquiry)pyCUBuffer_bool;
		PYCUBuffer_Type.tp_name = "tellusim.CUBuffer";
		PYCUBuffer_Type.tp_basicsize = sizeof(PYCUBuffer);
		PYCUBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCUBuffer_Type.tp_doc = "";
		PYCUBuffer_Type.tp_str = (reprfunc)pyCUBuffer_str;
		PYCUBuffer_Type.tp_as_number = &PYCUBuffer_number;
		PYCUBuffer_Type.tp_methods = PYCUBuffer_methods.discard();
		PYCUBuffer_Type.tp_getset = PYCUBuffer_getsets.discard();
		PYCUBuffer_Type.tp_init = (initproc)pyCUBuffer_init;
		PYCUBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCUBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CUBuffer");
			return false;
		}
		Py_INCREF(&PYCUBuffer_Type);
		
		// Tellusim::HIPBuffer
		PYHIPBuffer_methods.reserve(PYHIPBuffer_methods.size() + 19);
		PYHIPBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyHIPBuffer_equalPtr, METH_VARARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyHIPBuffer_clonePtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyHIPBuffer_clearPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyHIPBuffer_destroyPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyHIPBuffer_acquirePtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyHIPBuffer_unacquirePtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyHIPBuffer_isValidPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyHIPBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyHIPBuffer_isConstPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyHIPBuffer_getCountPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyHIPBuffer_getInternalPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyHIPBuffer_getBuffer, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getBufferPtr", (PyCFunction)HIPBuffer_getBufferPtr, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getBufferData", (PyCFunction)HIPBuffer_getBufferData, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getBufferEvent", (PyCFunction)HIPBuffer_getBufferEvent, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getArrayFormat", (PyCFunction)HIPBuffer_getArrayFormat, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getArrayChannels", (PyCFunction)HIPBuffer_getArrayChannels, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef { "getSharedMemory", (PyCFunction)HIPBuffer_getSharedMemory, METH_NOARGS, "" });
		PYHIPBuffer_methods.append(PyMethodDef {});
		PYHIPBuffer_getsets.reserve(PYHIPBuffer_getsets.size() + 7);
		PYHIPBuffer_getsets.append(PyGetSetDef { "buffer_ptr", (getter)HIPBuffer_get_buffer_ptr, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef { "buffer_data", (getter)HIPBuffer_get_buffer_data, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef { "buffer_event", (getter)HIPBuffer_get_buffer_event, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef { "array_format", (getter)HIPBuffer_get_array_format, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef { "array_channels", (getter)HIPBuffer_get_array_channels, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef { "shared_memory", (getter)HIPBuffer_get_shared_memory, nullptr, "", nullptr });
		PYHIPBuffer_getsets.append(PyGetSetDef {});
		PYHIPBuffer_Type.tp_base = &PYBuffer_Type;
		PYHIPBuffer_Type.tp_dealloc = (destructor)pyHIPBuffer_dealloc;
		PYHIPBuffer_number.nb_bool = (inquiry)pyHIPBuffer_bool;
		PYHIPBuffer_Type.tp_name = "tellusim.HIPBuffer";
		PYHIPBuffer_Type.tp_basicsize = sizeof(PYHIPBuffer);
		PYHIPBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYHIPBuffer_Type.tp_doc = "";
		PYHIPBuffer_Type.tp_str = (reprfunc)pyHIPBuffer_str;
		PYHIPBuffer_Type.tp_as_number = &PYHIPBuffer_number;
		PYHIPBuffer_Type.tp_methods = PYHIPBuffer_methods.discard();
		PYHIPBuffer_Type.tp_getset = PYHIPBuffer_getsets.discard();
		PYHIPBuffer_Type.tp_init = (initproc)pyHIPBuffer_init;
		PYHIPBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYHIPBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "HIPBuffer");
			return false;
		}
		Py_INCREF(&PYHIPBuffer_Type);
		
		// Tellusim::FUBuffer
		PYFUBuffer_methods.reserve(PYFUBuffer_methods.size() + 17);
		PYFUBuffer_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUBuffer_equalPtr, METH_VARARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUBuffer_clonePtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUBuffer_clearPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUBuffer_destroyPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUBuffer_acquirePtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUBuffer_unacquirePtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUBuffer_isValidPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUBuffer_isOwnerPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUBuffer_isConstPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUBuffer_getCountPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUBuffer_getInternalPtr, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)pyFUBuffer_getBuffer, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "setMask", (PyCFunction)FUBuffer_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getMask", (PyCFunction)FUBuffer_getMask, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getNumBuffers", (PyCFunction)FUBuffer_getNumBuffers, METH_NOARGS, "" });
		PYFUBuffer_methods.append(PyMethodDef { "getBuffer", (PyCFunction)FUBuffer_getBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUBuffer_methods.append(PyMethodDef {});
		PYFUBuffer_getsets.reserve(PYFUBuffer_getsets.size() + 3);
		PYFUBuffer_getsets.append(PyGetSetDef { "mask", (getter)FUBuffer_get_mask, nullptr, "", nullptr });
		PYFUBuffer_getsets.append(PyGetSetDef { "num_buffers", (getter)FUBuffer_get_num_buffers, nullptr, "", nullptr });
		PYFUBuffer_getsets.append(PyGetSetDef {});
		PYFUBuffer_Type.tp_base = &PYBuffer_Type;
		PYFUBuffer_Type.tp_dealloc = (destructor)pyFUBuffer_dealloc;
		PYFUBuffer_number.nb_bool = (inquiry)pyFUBuffer_bool;
		PYFUBuffer_Type.tp_name = "tellusim.FUBuffer";
		PYFUBuffer_Type.tp_basicsize = sizeof(PYFUBuffer);
		PYFUBuffer_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUBuffer_Type.tp_doc = "";
		PYFUBuffer_Type.tp_str = (reprfunc)pyFUBuffer_str;
		PYFUBuffer_Type.tp_as_number = &PYFUBuffer_number;
		PYFUBuffer_Type.tp_methods = PYFUBuffer_methods.discard();
		PYFUBuffer_Type.tp_getset = PYFUBuffer_getsets.discard();
		PYFUBuffer_Type.tp_init = (initproc)pyFUBuffer_init;
		PYFUBuffer_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUBuffer_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUBuffer");
			return false;
		}
		Py_INCREF(&PYFUBuffer_Type);
		
		// Tellusim::Command
		PYCommand_methods.reserve(PYCommand_methods.size() + 72);
		PYCommand_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCommand_equalPtr, METH_VARARGS, "" });
		PYCommand_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCommand_clonePtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCommand_clearPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCommand_destroyPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCommand_acquirePtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCommand_unacquirePtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCommand_isValidPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCommand_isOwnerPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCommand_isConstPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCommand_getCountPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCommand_getInternalPtr, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Command_getPlatform, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Command_getPlatformName, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "getIndex", (PyCFunction)Command_getIndex, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "setPipeline", (PyCFunction)Command_setPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getPipeline", (PyCFunction)Command_getPipeline, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "setViewport", (PyCFunction)Command_setViewport, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setViewports", (PyCFunction)Command_setViewports, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setScissor", (PyCFunction)Command_setScissor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setScissors", (PyCFunction)Command_setScissors, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setSampler", (PyCFunction)Command_setSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setSamplers", (PyCFunction)Command_setSamplers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTexture", (PyCFunction)Command_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTextures", (PyCFunction)Command_setTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setSurfaceTexture", (PyCFunction)Command_setSurfaceTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setSurfaceTextures", (PyCFunction)Command_setSurfaceTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getUniformData", (PyCFunction)Command_getUniformData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setUniformData", (PyCFunction)Command_setUniformData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setUniformBuffer", (PyCFunction)Command_setUniformBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Command_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setUniformBuffers", (PyCFunction)Command_setUniformBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getStorageData", (PyCFunction)Command_getStorageData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageData", (PyCFunction)Command_setStorageData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageBuffer", (PyCFunction)Command_setStorageBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Command_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageBuffers", (PyCFunction)Command_setStorageBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTracing", (PyCFunction)Command_setTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTracings", (PyCFunction)Command_setTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTexelBuffer", (PyCFunction)Command_setTexelBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTexelBuffers", (PyCFunction)Command_setTexelBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTextureTable", (PyCFunction)Command_setTextureTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setTextureTables", (PyCFunction)Command_setTextureTables, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageTable", (PyCFunction)Command_setStorageTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStorageTables", (PyCFunction)Command_setStorageTables, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getVertexData", (PyCFunction)Command_getVertexData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setVertexData", (PyCFunction)Command_setVertexData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setVertexBuffer", (PyCFunction)Command_setVertexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setVertexOffset", (PyCFunction)Command_setVertexOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setVertexBuffers", (PyCFunction)Command_setVertexBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getIndexData", (PyCFunction)Command_getIndexData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndexData", (PyCFunction)Command_setIndexData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndexBuffer", (PyCFunction)Command_setIndexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndexOffset", (PyCFunction)Command_setIndexOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "getIndirectData", (PyCFunction)Command_getIndirectData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndirectData", (PyCFunction)Command_setIndirectData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndirectBuffer", (PyCFunction)Command_setIndirectBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setIndirectOffset", (PyCFunction)Command_setIndirectOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setBlendColor", (PyCFunction)Command_setBlendColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "setStencilRef", (PyCFunction)Command_setStencilRef, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawArrays", (PyCFunction)Command_drawArrays, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawArraysInstanced", (PyCFunction)Command_drawArraysInstanced, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawArraysIndirect", (PyCFunction)Command_drawArraysIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawElements", (PyCFunction)Command_drawElements, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawElementsInstanced", (PyCFunction)Command_drawElementsInstanced, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawElementsIndirect", (PyCFunction)Command_drawElementsIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawMesh", (PyCFunction)Command_drawMesh, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "drawMeshIndirect", (PyCFunction)Command_drawMeshIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "beginConditional", (PyCFunction)Command_beginConditional, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "endConditional", (PyCFunction)Command_endConditional, METH_NOARGS, "" });
		PYCommand_methods.append(PyMethodDef { "beginQuery", (PyCFunction)Command_beginQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef { "endQuery", (PyCFunction)Command_endQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYCommand_methods.append(PyMethodDef {});
		PYCommand_getsets.reserve(PYCommand_getsets.size() + 5);
		PYCommand_getsets.append(PyGetSetDef { "platform", (getter)Command_get_platform, nullptr, "", nullptr });
		PYCommand_getsets.append(PyGetSetDef { "platform_name", (getter)Command_get_platform_name, nullptr, "", nullptr });
		PYCommand_getsets.append(PyGetSetDef { "index", (getter)Command_get_index, nullptr, "", nullptr });
		PYCommand_getsets.append(PyGetSetDef { "pipeline", (getter)Command_get_pipeline, nullptr, "", nullptr });
		PYCommand_getsets.append(PyGetSetDef {});
		PYCommand_Type.tp_dealloc = (destructor)pyCommand_dealloc;
		PYCommand_number.nb_bool = (inquiry)pyCommand_bool;
		PYCommand_Type.tp_name = "tellusim.Command";
		PYCommand_Type.tp_basicsize = sizeof(PYCommand);
		PYCommand_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYCommand_Type.tp_doc = "";
		PYCommand_Type.tp_str = (reprfunc)pyCommand_str;
		PYCommand_Type.tp_as_number = &PYCommand_number;
		PYCommand_Type.tp_methods = PYCommand_methods.discard();
		PYCommand_Type.tp_getset = PYCommand_getsets.discard();
		PYCommand_Type.tp_init = (initproc)pyCommand_init;
		PYCommand_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCommand_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Command");
			return false;
		}
		Py_INCREF(&PYCommand_Type);
		
		// Tellusim::Command::DrawArraysIndirect
		PYCommandDrawArraysIndirect_methods.append(PyMethodDef {});
		PYCommandDrawArraysIndirect_members.reserve(PYCommandDrawArraysIndirect_members.size() + 5);
		PYCommandDrawArraysIndirect_getsets.reserve(PYCommandDrawArraysIndirect_getsets.size() + 1);
		PYCommandDrawArraysIndirect_members.append(PyMemberDef { "num_vertices", T_UINT, offsetof(PYCommandDrawArraysIndirect, ptr.num_vertices), 0, "" });
		PYCommandDrawArraysIndirect_members.append(PyMemberDef { "num_instances", T_UINT, offsetof(PYCommandDrawArraysIndirect, ptr.num_instances), 0, "" });
		PYCommandDrawArraysIndirect_members.append(PyMemberDef { "base_vertex", T_UINT, offsetof(PYCommandDrawArraysIndirect, ptr.base_vertex), 0, "" });
		PYCommandDrawArraysIndirect_members.append(PyMemberDef { "base_instance", T_UINT, offsetof(PYCommandDrawArraysIndirect, ptr.base_instance), 0, "" });
		PYCommandDrawArraysIndirect_members.append(PyMemberDef {});
		PYCommandDrawArraysIndirect_getsets.append(PyGetSetDef {});
		PYCommandDrawArraysIndirect_buffer.bf_getbuffer = (getbufferproc)pyCommandDrawArraysIndirect_buffer;
		PYCommandDrawArraysIndirect_Type.tp_name = "tellusim.CommandDrawArraysIndirect";
		PYCommandDrawArraysIndirect_Type.tp_basicsize = sizeof(PYCommandDrawArraysIndirect);
		PYCommandDrawArraysIndirect_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYCommandDrawArraysIndirect_Type.tp_doc = "";
		PYCommandDrawArraysIndirect_Type.tp_as_number = &PYCommandDrawArraysIndirect_number;
		PYCommandDrawArraysIndirect_Type.tp_as_buffer = &PYCommandDrawArraysIndirect_buffer;
		PYCommandDrawArraysIndirect_Type.tp_methods = PYCommandDrawArraysIndirect_methods.discard();
		PYCommandDrawArraysIndirect_Type.tp_members = PYCommandDrawArraysIndirect_members.discard();
		PYCommandDrawArraysIndirect_Type.tp_getset = PYCommandDrawArraysIndirect_getsets.discard();
		PYCommandDrawArraysIndirect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCommandDrawArraysIndirect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Command::DrawArraysIndirect");
			return false;
		}
		Py_INCREF(&PYCommandDrawArraysIndirect_Type);
		
		// Tellusim::Command::DrawElementsIndirect
		PYCommandDrawElementsIndirect_methods.append(PyMethodDef {});
		PYCommandDrawElementsIndirect_members.reserve(PYCommandDrawElementsIndirect_members.size() + 6);
		PYCommandDrawElementsIndirect_getsets.reserve(PYCommandDrawElementsIndirect_getsets.size() + 1);
		PYCommandDrawElementsIndirect_members.append(PyMemberDef { "num_indices", T_UINT, offsetof(PYCommandDrawElementsIndirect, ptr.num_indices), 0, "" });
		PYCommandDrawElementsIndirect_members.append(PyMemberDef { "num_instances", T_UINT, offsetof(PYCommandDrawElementsIndirect, ptr.num_instances), 0, "" });
		PYCommandDrawElementsIndirect_members.append(PyMemberDef { "base_index", T_UINT, offsetof(PYCommandDrawElementsIndirect, ptr.base_index), 0, "" });
		PYCommandDrawElementsIndirect_members.append(PyMemberDef { "base_vertex", T_INT, offsetof(PYCommandDrawElementsIndirect, ptr.base_vertex), 0, "" });
		PYCommandDrawElementsIndirect_members.append(PyMemberDef { "base_instance", T_UINT, offsetof(PYCommandDrawElementsIndirect, ptr.base_instance), 0, "" });
		PYCommandDrawElementsIndirect_members.append(PyMemberDef {});
		PYCommandDrawElementsIndirect_getsets.append(PyGetSetDef {});
		PYCommandDrawElementsIndirect_buffer.bf_getbuffer = (getbufferproc)pyCommandDrawElementsIndirect_buffer;
		PYCommandDrawElementsIndirect_Type.tp_name = "tellusim.CommandDrawElementsIndirect";
		PYCommandDrawElementsIndirect_Type.tp_basicsize = sizeof(PYCommandDrawElementsIndirect);
		PYCommandDrawElementsIndirect_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYCommandDrawElementsIndirect_Type.tp_doc = "";
		PYCommandDrawElementsIndirect_Type.tp_as_number = &PYCommandDrawElementsIndirect_number;
		PYCommandDrawElementsIndirect_Type.tp_as_buffer = &PYCommandDrawElementsIndirect_buffer;
		PYCommandDrawElementsIndirect_Type.tp_methods = PYCommandDrawElementsIndirect_methods.discard();
		PYCommandDrawElementsIndirect_Type.tp_members = PYCommandDrawElementsIndirect_members.discard();
		PYCommandDrawElementsIndirect_Type.tp_getset = PYCommandDrawElementsIndirect_getsets.discard();
		PYCommandDrawElementsIndirect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCommandDrawElementsIndirect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Command::DrawElementsIndirect");
			return false;
		}
		Py_INCREF(&PYCommandDrawElementsIndirect_Type);
		
		// Tellusim::Command::DrawMeshIndirect
		PYCommandDrawMeshIndirect_methods.append(PyMethodDef {});
		PYCommandDrawMeshIndirect_members.reserve(PYCommandDrawMeshIndirect_members.size() + 4);
		PYCommandDrawMeshIndirect_getsets.reserve(PYCommandDrawMeshIndirect_getsets.size() + 1);
		PYCommandDrawMeshIndirect_members.append(PyMemberDef { "group_width", T_UINT, offsetof(PYCommandDrawMeshIndirect, ptr.group_width), 0, "" });
		PYCommandDrawMeshIndirect_members.append(PyMemberDef { "group_height", T_UINT, offsetof(PYCommandDrawMeshIndirect, ptr.group_height), 0, "" });
		PYCommandDrawMeshIndirect_members.append(PyMemberDef { "group_depth", T_UINT, offsetof(PYCommandDrawMeshIndirect, ptr.group_depth), 0, "" });
		PYCommandDrawMeshIndirect_members.append(PyMemberDef {});
		PYCommandDrawMeshIndirect_getsets.append(PyGetSetDef {});
		PYCommandDrawMeshIndirect_buffer.bf_getbuffer = (getbufferproc)pyCommandDrawMeshIndirect_buffer;
		PYCommandDrawMeshIndirect_Type.tp_name = "tellusim.CommandDrawMeshIndirect";
		PYCommandDrawMeshIndirect_Type.tp_basicsize = sizeof(PYCommandDrawMeshIndirect);
		PYCommandDrawMeshIndirect_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYCommandDrawMeshIndirect_Type.tp_doc = "";
		PYCommandDrawMeshIndirect_Type.tp_as_number = &PYCommandDrawMeshIndirect_number;
		PYCommandDrawMeshIndirect_Type.tp_as_buffer = &PYCommandDrawMeshIndirect_buffer;
		PYCommandDrawMeshIndirect_Type.tp_methods = PYCommandDrawMeshIndirect_methods.discard();
		PYCommandDrawMeshIndirect_Type.tp_members = PYCommandDrawMeshIndirect_members.discard();
		PYCommandDrawMeshIndirect_Type.tp_getset = PYCommandDrawMeshIndirect_getsets.discard();
		PYCommandDrawMeshIndirect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCommandDrawMeshIndirect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Command::DrawMeshIndirect");
			return false;
		}
		Py_INCREF(&PYCommandDrawMeshIndirect_Type);
		
		// Tellusim::D3D12Command
		PYD3D12Command_methods.reserve(PYD3D12Command_methods.size() + 15);
		PYD3D12Command_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Command_equalPtr, METH_VARARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Command_clonePtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Command_clearPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Command_destroyPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Command_acquirePtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Command_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Command_isValidPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Command_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Command_isConstPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Command_getCountPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Command_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "getCommand", (PyCFunction)pyD3D12Command_getCommand, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "getD3D12Command", (PyCFunction)D3D12Command_getD3D12Command, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef { "update", (PyCFunction)D3D12Command_update, METH_NOARGS, "" });
		PYD3D12Command_methods.append(PyMethodDef {});
		PYD3D12Command_getsets.reserve(PYD3D12Command_getsets.size() + 2);
		PYD3D12Command_getsets.append(PyGetSetDef { "d3d12_command", (getter)D3D12Command_get_d3d12_command, nullptr, "", nullptr });
		PYD3D12Command_getsets.append(PyGetSetDef {});
		PYD3D12Command_Type.tp_base = &PYCommand_Type;
		PYD3D12Command_Type.tp_dealloc = (destructor)pyD3D12Command_dealloc;
		PYD3D12Command_number.nb_bool = (inquiry)pyD3D12Command_bool;
		PYD3D12Command_Type.tp_name = "tellusim.D3D12Command";
		PYD3D12Command_Type.tp_basicsize = sizeof(PYD3D12Command);
		PYD3D12Command_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Command_Type.tp_doc = "";
		PYD3D12Command_Type.tp_str = (reprfunc)pyD3D12Command_str;
		PYD3D12Command_Type.tp_as_number = &PYD3D12Command_number;
		PYD3D12Command_Type.tp_methods = PYD3D12Command_methods.discard();
		PYD3D12Command_Type.tp_getset = PYD3D12Command_getsets.discard();
		PYD3D12Command_Type.tp_init = (initproc)pyD3D12Command_init;
		PYD3D12Command_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Command_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Command");
			return false;
		}
		Py_INCREF(&PYD3D12Command_Type);
		
		// Tellusim::MTLCommand
		PYMTLCommand_methods.reserve(PYMTLCommand_methods.size() + 16);
		PYMTLCommand_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLCommand_equalPtr, METH_VARARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLCommand_clonePtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLCommand_clearPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLCommand_destroyPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLCommand_acquirePtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLCommand_unacquirePtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLCommand_isValidPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLCommand_isOwnerPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLCommand_isConstPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLCommand_getCountPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLCommand_getInternalPtr, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "getCommand", (PyCFunction)pyMTLCommand_getCommand, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "getEncoder", (PyCFunction)MTLCommand_getEncoder, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "flush", (PyCFunction)MTLCommand_flush, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLCommand_methods.append(PyMethodDef { "update", (PyCFunction)MTLCommand_update, METH_NOARGS, "" });
		PYMTLCommand_methods.append(PyMethodDef {});
		PYMTLCommand_getsets.reserve(PYMTLCommand_getsets.size() + 2);
		PYMTLCommand_getsets.append(PyGetSetDef { "encoder", (getter)MTLCommand_get_encoder, nullptr, "", nullptr });
		PYMTLCommand_getsets.append(PyGetSetDef {});
		PYMTLCommand_Type.tp_base = &PYCommand_Type;
		PYMTLCommand_Type.tp_dealloc = (destructor)pyMTLCommand_dealloc;
		PYMTLCommand_number.nb_bool = (inquiry)pyMTLCommand_bool;
		PYMTLCommand_Type.tp_name = "tellusim.MTLCommand";
		PYMTLCommand_Type.tp_basicsize = sizeof(PYMTLCommand);
		PYMTLCommand_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLCommand_Type.tp_doc = "";
		PYMTLCommand_Type.tp_str = (reprfunc)pyMTLCommand_str;
		PYMTLCommand_Type.tp_as_number = &PYMTLCommand_number;
		PYMTLCommand_Type.tp_methods = PYMTLCommand_methods.discard();
		PYMTLCommand_Type.tp_getset = PYMTLCommand_getsets.discard();
		PYMTLCommand_Type.tp_init = (initproc)pyMTLCommand_init;
		PYMTLCommand_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLCommand_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLCommand");
			return false;
		}
		Py_INCREF(&PYMTLCommand_Type);
		
		// Tellusim::VKCommand
		PYVKCommand_methods.reserve(PYVKCommand_methods.size() + 20);
		PYVKCommand_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKCommand_equalPtr, METH_VARARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKCommand_clonePtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKCommand_clearPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKCommand_destroyPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKCommand_acquirePtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKCommand_unacquirePtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKCommand_isValidPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKCommand_isOwnerPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKCommand_isConstPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKCommand_getCountPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKCommand_getInternalPtr, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getCommand", (PyCFunction)pyVKCommand_getCommand, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getVKCommand", (PyCFunction)VKCommand_getVKCommand, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getSamplerDescriptor", (PyCFunction)VKCommand_getSamplerDescriptor, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getImageDescriptor", (PyCFunction)VKCommand_getImageDescriptor, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getBufferDescriptor", (PyCFunction)VKCommand_getBufferDescriptor, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getTracingDescriptor", (PyCFunction)VKCommand_getTracingDescriptor, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "getTexelDescriptor", (PyCFunction)VKCommand_getTexelDescriptor, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef { "update", (PyCFunction)VKCommand_update, METH_NOARGS, "" });
		PYVKCommand_methods.append(PyMethodDef {});
		PYVKCommand_getsets.reserve(PYVKCommand_getsets.size() + 7);
		PYVKCommand_getsets.append(PyGetSetDef { "vk_command", (getter)VKCommand_get_vk_command, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef { "sampler_descriptor", (getter)VKCommand_get_sampler_descriptor, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef { "image_descriptor", (getter)VKCommand_get_image_descriptor, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef { "buffer_descriptor", (getter)VKCommand_get_buffer_descriptor, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef { "tracing_descriptor", (getter)VKCommand_get_tracing_descriptor, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef { "texel_descriptor", (getter)VKCommand_get_texel_descriptor, nullptr, "", nullptr });
		PYVKCommand_getsets.append(PyGetSetDef {});
		PYVKCommand_Type.tp_base = &PYCommand_Type;
		PYVKCommand_Type.tp_dealloc = (destructor)pyVKCommand_dealloc;
		PYVKCommand_number.nb_bool = (inquiry)pyVKCommand_bool;
		PYVKCommand_Type.tp_name = "tellusim.VKCommand";
		PYVKCommand_Type.tp_basicsize = sizeof(PYVKCommand);
		PYVKCommand_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKCommand_Type.tp_doc = "";
		PYVKCommand_Type.tp_str = (reprfunc)pyVKCommand_str;
		PYVKCommand_Type.tp_as_number = &PYVKCommand_number;
		PYVKCommand_Type.tp_methods = PYVKCommand_methods.discard();
		PYVKCommand_Type.tp_getset = PYVKCommand_getsets.discard();
		PYVKCommand_Type.tp_init = (initproc)pyVKCommand_init;
		PYVKCommand_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKCommand_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKCommand");
			return false;
		}
		Py_INCREF(&PYVKCommand_Type);
		
		// Tellusim::FUCommand
		PYFUCommand_methods.reserve(PYFUCommand_methods.size() + 17);
		PYFUCommand_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUCommand_equalPtr, METH_VARARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUCommand_clonePtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUCommand_clearPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUCommand_destroyPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUCommand_acquirePtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUCommand_unacquirePtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUCommand_isValidPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUCommand_isOwnerPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUCommand_isConstPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUCommand_getCountPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUCommand_getInternalPtr, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getCommand", (PyCFunction)pyFUCommand_getCommand, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "setMask", (PyCFunction)FUCommand_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getMask", (PyCFunction)FUCommand_getMask, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getNumCommands", (PyCFunction)FUCommand_getNumCommands, METH_NOARGS, "" });
		PYFUCommand_methods.append(PyMethodDef { "getCommand", (PyCFunction)FUCommand_getCommand, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUCommand_methods.append(PyMethodDef {});
		PYFUCommand_getsets.reserve(PYFUCommand_getsets.size() + 3);
		PYFUCommand_getsets.append(PyGetSetDef { "mask", (getter)FUCommand_get_mask, nullptr, "", nullptr });
		PYFUCommand_getsets.append(PyGetSetDef { "num_commands", (getter)FUCommand_get_num_commands, nullptr, "", nullptr });
		PYFUCommand_getsets.append(PyGetSetDef {});
		PYFUCommand_Type.tp_base = &PYCommand_Type;
		PYFUCommand_Type.tp_dealloc = (destructor)pyFUCommand_dealloc;
		PYFUCommand_number.nb_bool = (inquiry)pyFUCommand_bool;
		PYFUCommand_Type.tp_name = "tellusim.FUCommand";
		PYFUCommand_Type.tp_basicsize = sizeof(PYFUCommand);
		PYFUCommand_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUCommand_Type.tp_doc = "";
		PYFUCommand_Type.tp_str = (reprfunc)pyFUCommand_str;
		PYFUCommand_Type.tp_as_number = &PYFUCommand_number;
		PYFUCommand_Type.tp_methods = PYFUCommand_methods.discard();
		PYFUCommand_Type.tp_getset = PYFUCommand_getsets.discard();
		PYFUCommand_Type.tp_init = (initproc)pyFUCommand_init;
		PYFUCommand_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUCommand_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUCommand");
			return false;
		}
		Py_INCREF(&PYFUCommand_Type);
		
		// Tellusim::Compute
		PYCompute_methods.reserve(PYCompute_methods.size() + 59);
		PYCompute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCompute_equalPtr, METH_VARARGS, "" });
		PYCompute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCompute_clonePtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCompute_clearPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCompute_destroyPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCompute_acquirePtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCompute_unacquirePtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCompute_isValidPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCompute_isOwnerPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCompute_isConstPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCompute_getCountPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCompute_getInternalPtr, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Compute_getPlatform, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Compute_getPlatformName, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "getIndex", (PyCFunction)Compute_getIndex, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "setKernel", (PyCFunction)Compute_setKernel, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "getKernel", (PyCFunction)Compute_getKernel, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "setTraversal", (PyCFunction)Compute_setTraversal, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "getTraversal", (PyCFunction)Compute_getTraversal, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "setSampler", (PyCFunction)Compute_setSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setSamplers", (PyCFunction)Compute_setSamplers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTexture", (PyCFunction)Compute_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTextures", (PyCFunction)Compute_setTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setSurfaceTexture", (PyCFunction)Compute_setSurfaceTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setSurfaceTextures", (PyCFunction)Compute_setSurfaceTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "getUniformData", (PyCFunction)Compute_getUniformData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setUniformData", (PyCFunction)Compute_setUniformData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setUniformBuffer", (PyCFunction)Compute_setUniformBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Compute_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setUniformBuffers", (PyCFunction)Compute_setUniformBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "getStorageData", (PyCFunction)Compute_getStorageData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageData", (PyCFunction)Compute_setStorageData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageBuffer", (PyCFunction)Compute_setStorageBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Compute_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageBuffers", (PyCFunction)Compute_setStorageBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTracing", (PyCFunction)Compute_setTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTracings", (PyCFunction)Compute_setTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTexelBuffer", (PyCFunction)Compute_setTexelBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTexelBuffers", (PyCFunction)Compute_setTexelBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTextureTable", (PyCFunction)Compute_setTextureTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setTextureTables", (PyCFunction)Compute_setTextureTables, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageTable", (PyCFunction)Compute_setStorageTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setStorageTables", (PyCFunction)Compute_setStorageTables, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "getIndirectData", (PyCFunction)Compute_getIndirectData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setIndirectData", (PyCFunction)Compute_setIndirectData, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setIndirectBuffer", (PyCFunction)Compute_setIndirectBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "setIndirectOffset", (PyCFunction)Compute_setIndirectOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "dispatch", (PyCFunction)Compute_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)Compute_dispatchIndirect, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "setBuffer", (PyCFunction)Compute_setBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "copyBuffer", (PyCFunction)Compute_copyBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "clearBuffer", (PyCFunction)Compute_clearBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "copyTexture", (PyCFunction)Compute_copyTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "clearTexture", (PyCFunction)Compute_clearTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "barrier", (PyCFunction)Compute_barrier, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "beginConditional", (PyCFunction)Compute_beginConditional, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "endConditional", (PyCFunction)Compute_endConditional, METH_NOARGS, "" });
		PYCompute_methods.append(PyMethodDef { "beginQuery", (PyCFunction)Compute_beginQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef { "endQuery", (PyCFunction)Compute_endQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYCompute_methods.append(PyMethodDef {});
		PYCompute_getsets.reserve(PYCompute_getsets.size() + 6);
		PYCompute_getsets.append(PyGetSetDef { "platform", (getter)Compute_get_platform, nullptr, "", nullptr });
		PYCompute_getsets.append(PyGetSetDef { "platform_name", (getter)Compute_get_platform_name, nullptr, "", nullptr });
		PYCompute_getsets.append(PyGetSetDef { "index", (getter)Compute_get_index, nullptr, "", nullptr });
		PYCompute_getsets.append(PyGetSetDef { "kernel", (getter)Compute_get_kernel, nullptr, "", nullptr });
		PYCompute_getsets.append(PyGetSetDef { "traversal", (getter)Compute_get_traversal, nullptr, "", nullptr });
		PYCompute_getsets.append(PyGetSetDef {});
		PYCompute_Type.tp_dealloc = (destructor)pyCompute_dealloc;
		PYCompute_number.nb_bool = (inquiry)pyCompute_bool;
		PYCompute_Type.tp_name = "tellusim.Compute";
		PYCompute_Type.tp_basicsize = sizeof(PYCompute);
		PYCompute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYCompute_Type.tp_doc = "";
		PYCompute_Type.tp_str = (reprfunc)pyCompute_str;
		PYCompute_Type.tp_as_number = &PYCompute_number;
		PYCompute_Type.tp_methods = PYCompute_methods.discard();
		PYCompute_Type.tp_getset = PYCompute_getsets.discard();
		PYCompute_Type.tp_init = (initproc)pyCompute_init;
		PYCompute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCompute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Compute");
			return false;
		}
		Py_INCREF(&PYCompute_Type);
		
		// Tellusim::Compute::DispatchIndirect
		PYComputeDispatchIndirect_methods.append(PyMethodDef {});
		PYComputeDispatchIndirect_members.reserve(PYComputeDispatchIndirect_members.size() + 4);
		PYComputeDispatchIndirect_getsets.reserve(PYComputeDispatchIndirect_getsets.size() + 1);
		PYComputeDispatchIndirect_members.append(PyMemberDef { "group_width", T_UINT, offsetof(PYComputeDispatchIndirect, ptr.group_width), 0, "" });
		PYComputeDispatchIndirect_members.append(PyMemberDef { "group_height", T_UINT, offsetof(PYComputeDispatchIndirect, ptr.group_height), 0, "" });
		PYComputeDispatchIndirect_members.append(PyMemberDef { "group_depth", T_UINT, offsetof(PYComputeDispatchIndirect, ptr.group_depth), 0, "" });
		PYComputeDispatchIndirect_members.append(PyMemberDef {});
		PYComputeDispatchIndirect_getsets.append(PyGetSetDef {});
		PYComputeDispatchIndirect_buffer.bf_getbuffer = (getbufferproc)pyComputeDispatchIndirect_buffer;
		PYComputeDispatchIndirect_Type.tp_name = "tellusim.ComputeDispatchIndirect";
		PYComputeDispatchIndirect_Type.tp_basicsize = sizeof(PYComputeDispatchIndirect);
		PYComputeDispatchIndirect_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYComputeDispatchIndirect_Type.tp_doc = "";
		PYComputeDispatchIndirect_Type.tp_as_number = &PYComputeDispatchIndirect_number;
		PYComputeDispatchIndirect_Type.tp_as_buffer = &PYComputeDispatchIndirect_buffer;
		PYComputeDispatchIndirect_Type.tp_methods = PYComputeDispatchIndirect_methods.discard();
		PYComputeDispatchIndirect_Type.tp_members = PYComputeDispatchIndirect_members.discard();
		PYComputeDispatchIndirect_Type.tp_getset = PYComputeDispatchIndirect_getsets.discard();
		PYComputeDispatchIndirect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYComputeDispatchIndirect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Compute::DispatchIndirect");
			return false;
		}
		Py_INCREF(&PYComputeDispatchIndirect_Type);
		
		// Tellusim::D3D12Compute
		PYD3D12Compute_methods.reserve(PYD3D12Compute_methods.size() + 15);
		PYD3D12Compute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Compute_equalPtr, METH_VARARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Compute_clonePtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Compute_clearPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Compute_destroyPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Compute_acquirePtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Compute_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Compute_isValidPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Compute_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Compute_isConstPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Compute_getCountPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Compute_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "getCompute", (PyCFunction)pyD3D12Compute_getCompute, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "getCommand", (PyCFunction)D3D12Compute_getCommand, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef { "update", (PyCFunction)D3D12Compute_update, METH_NOARGS, "" });
		PYD3D12Compute_methods.append(PyMethodDef {});
		PYD3D12Compute_getsets.reserve(PYD3D12Compute_getsets.size() + 2);
		PYD3D12Compute_getsets.append(PyGetSetDef { "command", (getter)D3D12Compute_get_command, nullptr, "", nullptr });
		PYD3D12Compute_getsets.append(PyGetSetDef {});
		PYD3D12Compute_Type.tp_base = &PYCompute_Type;
		PYD3D12Compute_Type.tp_dealloc = (destructor)pyD3D12Compute_dealloc;
		PYD3D12Compute_number.nb_bool = (inquiry)pyD3D12Compute_bool;
		PYD3D12Compute_Type.tp_name = "tellusim.D3D12Compute";
		PYD3D12Compute_Type.tp_basicsize = sizeof(PYD3D12Compute);
		PYD3D12Compute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Compute_Type.tp_doc = "";
		PYD3D12Compute_Type.tp_str = (reprfunc)pyD3D12Compute_str;
		PYD3D12Compute_Type.tp_as_number = &PYD3D12Compute_number;
		PYD3D12Compute_Type.tp_methods = PYD3D12Compute_methods.discard();
		PYD3D12Compute_Type.tp_getset = PYD3D12Compute_getsets.discard();
		PYD3D12Compute_Type.tp_init = (initproc)pyD3D12Compute_init;
		PYD3D12Compute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Compute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Compute");
			return false;
		}
		Py_INCREF(&PYD3D12Compute_Type);
		
		// Tellusim::MTLCompute
		PYMTLCompute_methods.reserve(PYMTLCompute_methods.size() + 16);
		PYMTLCompute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLCompute_equalPtr, METH_VARARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLCompute_clonePtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLCompute_clearPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLCompute_destroyPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLCompute_acquirePtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLCompute_unacquirePtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLCompute_isValidPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLCompute_isOwnerPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLCompute_isConstPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLCompute_getCountPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLCompute_getInternalPtr, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "getCompute", (PyCFunction)pyMTLCompute_getCompute, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "getEncoder", (PyCFunction)MTLCompute_getEncoder, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "flush", (PyCFunction)MTLCompute_flush, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLCompute_methods.append(PyMethodDef { "update", (PyCFunction)MTLCompute_update, METH_NOARGS, "" });
		PYMTLCompute_methods.append(PyMethodDef {});
		PYMTLCompute_getsets.reserve(PYMTLCompute_getsets.size() + 2);
		PYMTLCompute_getsets.append(PyGetSetDef { "encoder", (getter)MTLCompute_get_encoder, nullptr, "", nullptr });
		PYMTLCompute_getsets.append(PyGetSetDef {});
		PYMTLCompute_Type.tp_base = &PYCompute_Type;
		PYMTLCompute_Type.tp_dealloc = (destructor)pyMTLCompute_dealloc;
		PYMTLCompute_number.nb_bool = (inquiry)pyMTLCompute_bool;
		PYMTLCompute_Type.tp_name = "tellusim.MTLCompute";
		PYMTLCompute_Type.tp_basicsize = sizeof(PYMTLCompute);
		PYMTLCompute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLCompute_Type.tp_doc = "";
		PYMTLCompute_Type.tp_str = (reprfunc)pyMTLCompute_str;
		PYMTLCompute_Type.tp_as_number = &PYMTLCompute_number;
		PYMTLCompute_Type.tp_methods = PYMTLCompute_methods.discard();
		PYMTLCompute_Type.tp_getset = PYMTLCompute_getsets.discard();
		PYMTLCompute_Type.tp_init = (initproc)pyMTLCompute_init;
		PYMTLCompute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLCompute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLCompute");
			return false;
		}
		Py_INCREF(&PYMTLCompute_Type);
		
		// Tellusim::VKCompute
		PYVKCompute_methods.reserve(PYVKCompute_methods.size() + 20);
		PYVKCompute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKCompute_equalPtr, METH_VARARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKCompute_clonePtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKCompute_clearPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKCompute_destroyPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKCompute_acquirePtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKCompute_unacquirePtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKCompute_isValidPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKCompute_isOwnerPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKCompute_isConstPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKCompute_getCountPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKCompute_getInternalPtr, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getCompute", (PyCFunction)pyVKCompute_getCompute, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getCommand", (PyCFunction)VKCompute_getCommand, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getSamplerDescriptor", (PyCFunction)VKCompute_getSamplerDescriptor, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getImageDescriptor", (PyCFunction)VKCompute_getImageDescriptor, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getBufferDescriptor", (PyCFunction)VKCompute_getBufferDescriptor, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getTracingDescriptor", (PyCFunction)VKCompute_getTracingDescriptor, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "getTexelDescriptor", (PyCFunction)VKCompute_getTexelDescriptor, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef { "update", (PyCFunction)VKCompute_update, METH_NOARGS, "" });
		PYVKCompute_methods.append(PyMethodDef {});
		PYVKCompute_getsets.reserve(PYVKCompute_getsets.size() + 7);
		PYVKCompute_getsets.append(PyGetSetDef { "command", (getter)VKCompute_get_command, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef { "sampler_descriptor", (getter)VKCompute_get_sampler_descriptor, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef { "image_descriptor", (getter)VKCompute_get_image_descriptor, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef { "buffer_descriptor", (getter)VKCompute_get_buffer_descriptor, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef { "tracing_descriptor", (getter)VKCompute_get_tracing_descriptor, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef { "texel_descriptor", (getter)VKCompute_get_texel_descriptor, nullptr, "", nullptr });
		PYVKCompute_getsets.append(PyGetSetDef {});
		PYVKCompute_Type.tp_base = &PYCompute_Type;
		PYVKCompute_Type.tp_dealloc = (destructor)pyVKCompute_dealloc;
		PYVKCompute_number.nb_bool = (inquiry)pyVKCompute_bool;
		PYVKCompute_Type.tp_name = "tellusim.VKCompute";
		PYVKCompute_Type.tp_basicsize = sizeof(PYVKCompute);
		PYVKCompute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKCompute_Type.tp_doc = "";
		PYVKCompute_Type.tp_str = (reprfunc)pyVKCompute_str;
		PYVKCompute_Type.tp_as_number = &PYVKCompute_number;
		PYVKCompute_Type.tp_methods = PYVKCompute_methods.discard();
		PYVKCompute_Type.tp_getset = PYVKCompute_getsets.discard();
		PYVKCompute_Type.tp_init = (initproc)pyVKCompute_init;
		PYVKCompute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKCompute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKCompute");
			return false;
		}
		Py_INCREF(&PYVKCompute_Type);
		
		// Tellusim::FUCompute
		PYFUCompute_methods.reserve(PYFUCompute_methods.size() + 17);
		PYFUCompute_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUCompute_equalPtr, METH_VARARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUCompute_clonePtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUCompute_clearPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUCompute_destroyPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUCompute_acquirePtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUCompute_unacquirePtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUCompute_isValidPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUCompute_isOwnerPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUCompute_isConstPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUCompute_getCountPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUCompute_getInternalPtr, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getCompute", (PyCFunction)pyFUCompute_getCompute, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "setMask", (PyCFunction)FUCompute_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getMask", (PyCFunction)FUCompute_getMask, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getNumComputes", (PyCFunction)FUCompute_getNumComputes, METH_NOARGS, "" });
		PYFUCompute_methods.append(PyMethodDef { "getCompute", (PyCFunction)FUCompute_getCompute, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUCompute_methods.append(PyMethodDef {});
		PYFUCompute_getsets.reserve(PYFUCompute_getsets.size() + 3);
		PYFUCompute_getsets.append(PyGetSetDef { "mask", (getter)FUCompute_get_mask, nullptr, "", nullptr });
		PYFUCompute_getsets.append(PyGetSetDef { "num_computes", (getter)FUCompute_get_num_computes, nullptr, "", nullptr });
		PYFUCompute_getsets.append(PyGetSetDef {});
		PYFUCompute_Type.tp_base = &PYCompute_Type;
		PYFUCompute_Type.tp_dealloc = (destructor)pyFUCompute_dealloc;
		PYFUCompute_number.nb_bool = (inquiry)pyFUCompute_bool;
		PYFUCompute_Type.tp_name = "tellusim.FUCompute";
		PYFUCompute_Type.tp_basicsize = sizeof(PYFUCompute);
		PYFUCompute_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUCompute_Type.tp_doc = "";
		PYFUCompute_Type.tp_str = (reprfunc)pyFUCompute_str;
		PYFUCompute_Type.tp_as_number = &PYFUCompute_number;
		PYFUCompute_Type.tp_methods = PYFUCompute_methods.discard();
		PYFUCompute_Type.tp_getset = PYFUCompute_getsets.discard();
		PYFUCompute_Type.tp_init = (initproc)pyFUCompute_init;
		PYFUCompute_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUCompute_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUCompute");
			return false;
		}
		Py_INCREF(&PYFUCompute_Type);
		
		// Tellusim::Context
		PYContext_methods.reserve(PYContext_methods.size() + 19);
		PYContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyContext_equalPtr, METH_VARARGS, "" });
		PYContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyContext_clonePtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyContext_clearPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyContext_destroyPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyContext_acquirePtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyContext_unacquirePtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyContext_isValidPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyContext_isOwnerPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyContext_isConstPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyContext_getCountPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyContext_getInternalPtr, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Context_getPlatform, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Context_getPlatformName, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "getIndex", (PyCFunction)Context_getIndex, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "isCreated", (PyCFunction)Context_isCreated, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "create", (PyCFunction)Context_create, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "flush", (PyCFunction)Context_flush, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef { "finish", (PyCFunction)Context_finish, METH_NOARGS, "" });
		PYContext_methods.append(PyMethodDef {});
		PYContext_getsets.reserve(PYContext_getsets.size() + 4);
		PYContext_getsets.append(PyGetSetDef { "platform", (getter)Context_get_platform, nullptr, "", nullptr });
		PYContext_getsets.append(PyGetSetDef { "platform_name", (getter)Context_get_platform_name, nullptr, "", nullptr });
		PYContext_getsets.append(PyGetSetDef { "index", (getter)Context_get_index, nullptr, "", nullptr });
		PYContext_getsets.append(PyGetSetDef {});
		PYContext_Type.tp_dealloc = (destructor)pyContext_dealloc;
		PYContext_number.nb_bool = (inquiry)pyContext_bool;
		PYContext_Type.tp_name = "tellusim.Context";
		PYContext_Type.tp_basicsize = sizeof(PYContext);
		PYContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYContext_Type.tp_doc = "";
		PYContext_Type.tp_str = (reprfunc)pyContext_str;
		PYContext_Type.tp_as_number = &PYContext_number;
		PYContext_Type.tp_methods = PYContext_methods.discard();
		PYContext_Type.tp_getset = PYContext_getsets.discard();
		PYContext_Type.tp_init = (initproc)pyContext_init;
		PYContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Context");
			return false;
		}
		Py_INCREF(&PYContext_Type);
		
		// Tellusim::D3D12Context
		PYD3D12Context_methods.reserve(PYD3D12Context_methods.size() + 20);
		PYD3D12Context_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Context_equalPtr, METH_VARARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Context_clonePtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Context_clearPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Context_destroyPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Context_acquirePtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Context_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Context_isValidPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Context_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Context_isConstPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Context_getCountPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Context_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getContext", (PyCFunction)pyD3D12Context_getContext, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "create", (PyCFunction)D3D12Context_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getFactory", (PyCFunction)D3D12Context_getFactory, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getDevice", (PyCFunction)D3D12Context_getDevice, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getQueue", (PyCFunction)D3D12Context_getQueue, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getCommand", (PyCFunction)D3D12Context_getCommand, METH_NOARGS, "" });
		PYD3D12Context_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)D3D12Context_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYD3D12Context_methods.append(PyMethodDef { "error", (PyCFunction)D3D12Context_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYD3D12Context_methods.append(PyMethodDef {});
		PYD3D12Context_getsets.reserve(PYD3D12Context_getsets.size() + 5);
		PYD3D12Context_getsets.append(PyGetSetDef { "factory", (getter)D3D12Context_get_factory, nullptr, "", nullptr });
		PYD3D12Context_getsets.append(PyGetSetDef { "device", (getter)D3D12Context_get_device, nullptr, "", nullptr });
		PYD3D12Context_getsets.append(PyGetSetDef { "queue", (getter)D3D12Context_get_queue, nullptr, "", nullptr });
		PYD3D12Context_getsets.append(PyGetSetDef { "command", (getter)D3D12Context_get_command, nullptr, "", nullptr });
		PYD3D12Context_getsets.append(PyGetSetDef {});
		PYD3D12Context_Type.tp_base = &PYContext_Type;
		PYD3D12Context_Type.tp_dealloc = (destructor)pyD3D12Context_dealloc;
		PYD3D12Context_number.nb_bool = (inquiry)pyD3D12Context_bool;
		PYD3D12Context_Type.tp_name = "tellusim.D3D12Context";
		PYD3D12Context_Type.tp_basicsize = sizeof(PYD3D12Context);
		PYD3D12Context_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Context_Type.tp_doc = "";
		PYD3D12Context_Type.tp_str = (reprfunc)pyD3D12Context_str;
		PYD3D12Context_Type.tp_as_number = &PYD3D12Context_number;
		PYD3D12Context_Type.tp_methods = PYD3D12Context_methods.discard();
		PYD3D12Context_Type.tp_getset = PYD3D12Context_getsets.discard();
		PYD3D12Context_Type.tp_init = (initproc)pyD3D12Context_init;
		PYD3D12Context_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Context_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Context");
			return false;
		}
		Py_INCREF(&PYD3D12Context_Type);
		
		// Tellusim::D3D11Context
		PYD3D11Context_methods.reserve(PYD3D11Context_methods.size() + 19);
		PYD3D11Context_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Context_equalPtr, METH_VARARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Context_clonePtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Context_clearPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Context_destroyPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Context_acquirePtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Context_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Context_isValidPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Context_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Context_isConstPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Context_getCountPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Context_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getContext", (PyCFunction)pyD3D11Context_getContext, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "create", (PyCFunction)D3D11Context_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getFactory", (PyCFunction)D3D11Context_getFactory, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getDevice", (PyCFunction)D3D11Context_getDevice, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getD3D11Context", (PyCFunction)D3D11Context_getD3D11Context, METH_NOARGS, "" });
		PYD3D11Context_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)D3D11Context_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYD3D11Context_methods.append(PyMethodDef { "error", (PyCFunction)D3D11Context_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYD3D11Context_methods.append(PyMethodDef {});
		PYD3D11Context_getsets.reserve(PYD3D11Context_getsets.size() + 4);
		PYD3D11Context_getsets.append(PyGetSetDef { "factory", (getter)D3D11Context_get_factory, nullptr, "", nullptr });
		PYD3D11Context_getsets.append(PyGetSetDef { "device", (getter)D3D11Context_get_device, nullptr, "", nullptr });
		PYD3D11Context_getsets.append(PyGetSetDef { "d3d11_context", (getter)D3D11Context_get_d3d11_context, nullptr, "", nullptr });
		PYD3D11Context_getsets.append(PyGetSetDef {});
		PYD3D11Context_Type.tp_base = &PYContext_Type;
		PYD3D11Context_Type.tp_dealloc = (destructor)pyD3D11Context_dealloc;
		PYD3D11Context_number.nb_bool = (inquiry)pyD3D11Context_bool;
		PYD3D11Context_Type.tp_name = "tellusim.D3D11Context";
		PYD3D11Context_Type.tp_basicsize = sizeof(PYD3D11Context);
		PYD3D11Context_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Context_Type.tp_doc = "";
		PYD3D11Context_Type.tp_str = (reprfunc)pyD3D11Context_str;
		PYD3D11Context_Type.tp_as_number = &PYD3D11Context_number;
		PYD3D11Context_Type.tp_methods = PYD3D11Context_methods.discard();
		PYD3D11Context_Type.tp_getset = PYD3D11Context_getsets.discard();
		PYD3D11Context_Type.tp_init = (initproc)pyD3D11Context_init;
		PYD3D11Context_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Context_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Context");
			return false;
		}
		Py_INCREF(&PYD3D11Context_Type);
		
		// Tellusim::MTLContext
		PYMTLContext_methods.reserve(PYMTLContext_methods.size() + 23);
		PYMTLContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLContext_equalPtr, METH_VARARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLContext_clonePtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLContext_clearPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLContext_destroyPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLContext_acquirePtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLContext_unacquirePtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLContext_isValidPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLContext_isOwnerPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLContext_isConstPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLContext_getCountPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLContext_getInternalPtr, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyMTLContext_getContext, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "create", (PyCFunction)MTLContext_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getDevice", (PyCFunction)MTLContext_getDevice, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getQueue", (PyCFunction)MTLContext_getQueue, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getCommand", (PyCFunction)MTLContext_getCommand, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getEncoder", (PyCFunction)MTLContext_getEncoder, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getRenderEncoder", (PyCFunction)MTLContext_getRenderEncoder, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getComputeEncoder", (PyCFunction)MTLContext_getComputeEncoder, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getTracingEncoder", (PyCFunction)MTLContext_getTracingEncoder, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "getBlitEncoder", (PyCFunction)MTLContext_getBlitEncoder, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef { "endEncoder", (PyCFunction)MTLContext_endEncoder, METH_NOARGS, "" });
		PYMTLContext_methods.append(PyMethodDef {});
		PYMTLContext_getsets.reserve(PYMTLContext_getsets.size() + 8);
		PYMTLContext_getsets.append(PyGetSetDef { "device", (getter)MTLContext_get_device, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "queue", (getter)MTLContext_get_queue, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "command", (getter)MTLContext_get_command, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "encoder", (getter)MTLContext_get_encoder, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "compute_encoder", (getter)MTLContext_get_compute_encoder, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "tracing_encoder", (getter)MTLContext_get_tracing_encoder, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef { "blit_encoder", (getter)MTLContext_get_blit_encoder, nullptr, "", nullptr });
		PYMTLContext_getsets.append(PyGetSetDef {});
		PYMTLContext_Type.tp_base = &PYContext_Type;
		PYMTLContext_Type.tp_dealloc = (destructor)pyMTLContext_dealloc;
		PYMTLContext_number.nb_bool = (inquiry)pyMTLContext_bool;
		PYMTLContext_Type.tp_name = "tellusim.MTLContext";
		PYMTLContext_Type.tp_basicsize = sizeof(PYMTLContext);
		PYMTLContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLContext_Type.tp_doc = "";
		PYMTLContext_Type.tp_str = (reprfunc)pyMTLContext_str;
		PYMTLContext_Type.tp_as_number = &PYMTLContext_number;
		PYMTLContext_Type.tp_methods = PYMTLContext_methods.discard();
		PYMTLContext_Type.tp_getset = PYMTLContext_getsets.discard();
		PYMTLContext_Type.tp_init = (initproc)pyMTLContext_init;
		PYMTLContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLContext");
			return false;
		}
		Py_INCREF(&PYMTLContext_Type);
		
		// Tellusim::VKContext
		PYVKContext_methods.reserve(PYVKContext_methods.size() + 30);
		PYVKContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKContext_equalPtr, METH_VARARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKContext_clonePtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKContext_clearPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKContext_destroyPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKContext_acquirePtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKContext_unacquirePtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKContext_isValidPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKContext_isOwnerPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKContext_isConstPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKContext_getCountPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKContext_getInternalPtr, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyVKContext_getContext, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "create", (PyCFunction)VKContext_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKContext_methods.append(PyMethodDef { "getInstance", (PyCFunction)VKContext_getInstance, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getAdapter", (PyCFunction)VKContext_getAdapter, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getDevice", (PyCFunction)VKContext_getDevice, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getQueue", (PyCFunction)VKContext_getQueue, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getCommand", (PyCFunction)VKContext_getCommand, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getFamily", (PyCFunction)VKContext_getFamily, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getNumQueues", (PyCFunction)VKContext_getNumQueues, METH_NOARGS, "" });
		PYVKContext_methods.append(PyMethodDef { "getQueueFlags", (PyCFunction)VKContext_getQueueFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKContext_methods.append(PyMethodDef { "getQueueFamily", (PyCFunction)VKContext_getQueueFamily, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKContext_methods.append(PyMethodDef { "addContextExtension", (PyCFunction)VKContext_addContextExtension, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "addAdapterExtension", (PyCFunction)VKContext_addAdapterExtension, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "addAdapterFeatures", (PyCFunction)VKContext_addAdapterFeatures, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "getInstanceProcAddress", (PyCFunction)VKContext_getInstanceProcAddress, METH_NOARGS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "getDeviceProcAddress", (PyCFunction)VKContext_getDeviceProcAddress, METH_NOARGS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)VKContext_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef { "error", (PyCFunction)VKContext_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYVKContext_methods.append(PyMethodDef {});
		PYVKContext_getsets.reserve(PYVKContext_getsets.size() + 10);
		PYVKContext_getsets.append(PyGetSetDef { "instance", (getter)VKContext_get_instance, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "adapter", (getter)VKContext_get_adapter, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "device", (getter)VKContext_get_device, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "queue", (getter)VKContext_get_queue, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "command", (getter)VKContext_get_command, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "family", (getter)VKContext_get_family, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "num_queues", (getter)VKContext_get_num_queues, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "instance_proc_address", (getter)VKContext_get_instance_proc_address, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef { "device_proc_address", (getter)VKContext_get_device_proc_address, nullptr, "", nullptr });
		PYVKContext_getsets.append(PyGetSetDef {});
		PYVKContext_Type.tp_base = &PYContext_Type;
		PYVKContext_Type.tp_dealloc = (destructor)pyVKContext_dealloc;
		PYVKContext_number.nb_bool = (inquiry)pyVKContext_bool;
		PYVKContext_Type.tp_name = "tellusim.VKContext";
		PYVKContext_Type.tp_basicsize = sizeof(PYVKContext);
		PYVKContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKContext_Type.tp_doc = "";
		PYVKContext_Type.tp_str = (reprfunc)pyVKContext_str;
		PYVKContext_Type.tp_as_number = &PYVKContext_number;
		PYVKContext_Type.tp_methods = PYVKContext_methods.discard();
		PYVKContext_Type.tp_getset = PYVKContext_getsets.discard();
		PYVKContext_Type.tp_init = (initproc)pyVKContext_init;
		PYVKContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKContext");
			return false;
		}
		Py_INCREF(&PYVKContext_Type);
		
		// Tellusim::GLContext
		PYGLContext_methods.reserve(PYGLContext_methods.size() + 22);
		PYGLContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLContext_equalPtr, METH_VARARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLContext_clonePtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLContext_clearPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLContext_destroyPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLContext_acquirePtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLContext_unacquirePtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLContext_isValidPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLContext_isOwnerPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLContext_isConstPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLContext_getCountPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLContext_getInternalPtr, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyGLContext_getContext, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "create", (PyCFunction)GLContext_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLContext_methods.append(PyMethodDef { "getGLDisplay", (PyCFunction)GLContext_getGLDisplay, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getGLVisual", (PyCFunction)GLContext_getGLVisual, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getGLConfig", (PyCFunction)GLContext_getGLConfig, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getGLSurface", (PyCFunction)GLContext_getGLSurface, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getGLContext", (PyCFunction)GLContext_getGLContext, METH_NOARGS, "" });
		PYGLContext_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)GLContext_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYGLContext_methods.append(PyMethodDef { "error", (PyCFunction)GLContext_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYGLContext_methods.append(PyMethodDef { "check", (PyCFunction)GLContext_check, METH_NOARGS | METH_STATIC, "" });
		PYGLContext_methods.append(PyMethodDef {});
		PYGLContext_getsets.reserve(PYGLContext_getsets.size() + 6);
		PYGLContext_getsets.append(PyGetSetDef { "gl_display", (getter)GLContext_get_gl_display, nullptr, "", nullptr });
		PYGLContext_getsets.append(PyGetSetDef { "gl_visual", (getter)GLContext_get_gl_visual, nullptr, "", nullptr });
		PYGLContext_getsets.append(PyGetSetDef { "gl_config", (getter)GLContext_get_gl_config, nullptr, "", nullptr });
		PYGLContext_getsets.append(PyGetSetDef { "gl_surface", (getter)GLContext_get_gl_surface, nullptr, "", nullptr });
		PYGLContext_getsets.append(PyGetSetDef { "gl_context", (getter)GLContext_get_gl_context, nullptr, "", nullptr });
		PYGLContext_getsets.append(PyGetSetDef {});
		PYGLContext_Type.tp_base = &PYContext_Type;
		PYGLContext_Type.tp_dealloc = (destructor)pyGLContext_dealloc;
		PYGLContext_number.nb_bool = (inquiry)pyGLContext_bool;
		PYGLContext_Type.tp_name = "tellusim.GLContext";
		PYGLContext_Type.tp_basicsize = sizeof(PYGLContext);
		PYGLContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLContext_Type.tp_doc = "";
		PYGLContext_Type.tp_str = (reprfunc)pyGLContext_str;
		PYGLContext_Type.tp_as_number = &PYGLContext_number;
		PYGLContext_Type.tp_methods = PYGLContext_methods.discard();
		PYGLContext_Type.tp_getset = PYGLContext_getsets.discard();
		PYGLContext_Type.tp_init = (initproc)pyGLContext_init;
		PYGLContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLContext");
			return false;
		}
		Py_INCREF(&PYGLContext_Type);
		
		// Tellusim::GLESContext
		PYGLESContext_methods.reserve(PYGLESContext_methods.size() + 20);
		PYGLESContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESContext_equalPtr, METH_VARARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESContext_clonePtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESContext_clearPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESContext_destroyPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESContext_acquirePtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESContext_unacquirePtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESContext_isValidPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESContext_isOwnerPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESContext_isConstPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESContext_getCountPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESContext_getInternalPtr, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyGLESContext_getContext, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "create", (PyCFunction)GLESContext_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getGLESDisplay", (PyCFunction)GLESContext_getGLESDisplay, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getGLESConfig", (PyCFunction)GLESContext_getGLESConfig, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getGLESContext", (PyCFunction)GLESContext_getGLESContext, METH_NOARGS, "" });
		PYGLESContext_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)GLESContext_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYGLESContext_methods.append(PyMethodDef { "error", (PyCFunction)GLESContext_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYGLESContext_methods.append(PyMethodDef { "check", (PyCFunction)GLESContext_check, METH_NOARGS | METH_STATIC, "" });
		PYGLESContext_methods.append(PyMethodDef {});
		PYGLESContext_getsets.reserve(PYGLESContext_getsets.size() + 4);
		PYGLESContext_getsets.append(PyGetSetDef { "gles_display", (getter)GLESContext_get_gles_display, nullptr, "", nullptr });
		PYGLESContext_getsets.append(PyGetSetDef { "gles_config", (getter)GLESContext_get_gles_config, nullptr, "", nullptr });
		PYGLESContext_getsets.append(PyGetSetDef { "gles_context", (getter)GLESContext_get_gles_context, nullptr, "", nullptr });
		PYGLESContext_getsets.append(PyGetSetDef {});
		PYGLESContext_Type.tp_base = &PYContext_Type;
		PYGLESContext_Type.tp_dealloc = (destructor)pyGLESContext_dealloc;
		PYGLESContext_number.nb_bool = (inquiry)pyGLESContext_bool;
		PYGLESContext_Type.tp_name = "tellusim.GLESContext";
		PYGLESContext_Type.tp_basicsize = sizeof(PYGLESContext);
		PYGLESContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESContext_Type.tp_doc = "";
		PYGLESContext_Type.tp_str = (reprfunc)pyGLESContext_str;
		PYGLESContext_Type.tp_as_number = &PYGLESContext_number;
		PYGLESContext_Type.tp_methods = PYGLESContext_methods.discard();
		PYGLESContext_Type.tp_getset = PYGLESContext_getsets.discard();
		PYGLESContext_Type.tp_init = (initproc)pyGLESContext_init;
		PYGLESContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESContext");
			return false;
		}
		Py_INCREF(&PYGLESContext_Type);
		
		// Tellusim::WGContext
		PYWGContext_methods.reserve(PYWGContext_methods.size() + 18);
		PYWGContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyWGContext_equalPtr, METH_VARARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyWGContext_clonePtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyWGContext_clearPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyWGContext_destroyPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyWGContext_acquirePtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyWGContext_unacquirePtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyWGContext_isValidPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyWGContext_isOwnerPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyWGContext_isConstPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyWGContext_getCountPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyWGContext_getInternalPtr, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyWGContext_getContext, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "open", (PyCFunction)WGContext_open, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYWGContext_methods.append(PyMethodDef { "create", (PyCFunction)WGContext_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYWGContext_methods.append(PyMethodDef { "getInstance", (PyCFunction)WGContext_getInstance, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "getAdapter", (PyCFunction)WGContext_getAdapter, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef { "getDevice", (PyCFunction)WGContext_getDevice, METH_NOARGS, "" });
		PYWGContext_methods.append(PyMethodDef {});
		PYWGContext_getsets.reserve(PYWGContext_getsets.size() + 4);
		PYWGContext_getsets.append(PyGetSetDef { "instance", (getter)WGContext_get_instance, nullptr, "", nullptr });
		PYWGContext_getsets.append(PyGetSetDef { "adapter", (getter)WGContext_get_adapter, nullptr, "", nullptr });
		PYWGContext_getsets.append(PyGetSetDef { "device", (getter)WGContext_get_device, nullptr, "", nullptr });
		PYWGContext_getsets.append(PyGetSetDef {});
		PYWGContext_Type.tp_base = &PYContext_Type;
		PYWGContext_Type.tp_dealloc = (destructor)pyWGContext_dealloc;
		PYWGContext_number.nb_bool = (inquiry)pyWGContext_bool;
		PYWGContext_Type.tp_name = "tellusim.WGContext";
		PYWGContext_Type.tp_basicsize = sizeof(PYWGContext);
		PYWGContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYWGContext_Type.tp_doc = "";
		PYWGContext_Type.tp_str = (reprfunc)pyWGContext_str;
		PYWGContext_Type.tp_as_number = &PYWGContext_number;
		PYWGContext_Type.tp_methods = PYWGContext_methods.discard();
		PYWGContext_Type.tp_getset = PYWGContext_getsets.discard();
		PYWGContext_Type.tp_init = (initproc)pyWGContext_init;
		PYWGContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYWGContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "WGContext");
			return false;
		}
		Py_INCREF(&PYWGContext_Type);
		
		// Tellusim::CUContext
		PYCUContext_methods.reserve(PYCUContext_methods.size() + 18);
		PYCUContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCUContext_equalPtr, METH_VARARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCUContext_clonePtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCUContext_clearPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCUContext_destroyPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCUContext_acquirePtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCUContext_unacquirePtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCUContext_isValidPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCUContext_isOwnerPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCUContext_isConstPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCUContext_getCountPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCUContext_getInternalPtr, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyCUContext_getContext, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getDevice", (PyCFunction)CUContext_getDevice, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getCUContext", (PyCFunction)CUContext_getCUContext, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getStream", (PyCFunction)CUContext_getStream, METH_NOARGS, "" });
		PYCUContext_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)CUContext_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYCUContext_methods.append(PyMethodDef { "error", (PyCFunction)CUContext_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYCUContext_methods.append(PyMethodDef {});
		PYCUContext_getsets.reserve(PYCUContext_getsets.size() + 4);
		PYCUContext_getsets.append(PyGetSetDef { "device", (getter)CUContext_get_device, nullptr, "", nullptr });
		PYCUContext_getsets.append(PyGetSetDef { "cu_context", (getter)CUContext_get_cu_context, nullptr, "", nullptr });
		PYCUContext_getsets.append(PyGetSetDef { "stream", (getter)CUContext_get_stream, nullptr, "", nullptr });
		PYCUContext_getsets.append(PyGetSetDef {});
		PYCUContext_Type.tp_base = &PYContext_Type;
		PYCUContext_Type.tp_dealloc = (destructor)pyCUContext_dealloc;
		PYCUContext_number.nb_bool = (inquiry)pyCUContext_bool;
		PYCUContext_Type.tp_name = "tellusim.CUContext";
		PYCUContext_Type.tp_basicsize = sizeof(PYCUContext);
		PYCUContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCUContext_Type.tp_doc = "";
		PYCUContext_Type.tp_str = (reprfunc)pyCUContext_str;
		PYCUContext_Type.tp_as_number = &PYCUContext_number;
		PYCUContext_Type.tp_methods = PYCUContext_methods.discard();
		PYCUContext_Type.tp_getset = PYCUContext_getsets.discard();
		PYCUContext_Type.tp_init = (initproc)pyCUContext_init;
		PYCUContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCUContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CUContext");
			return false;
		}
		Py_INCREF(&PYCUContext_Type);
		
		// Tellusim::HIPContext
		PYHIPContext_methods.reserve(PYHIPContext_methods.size() + 18);
		PYHIPContext_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyHIPContext_equalPtr, METH_VARARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyHIPContext_clonePtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyHIPContext_clearPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyHIPContext_destroyPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyHIPContext_acquirePtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyHIPContext_unacquirePtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyHIPContext_isValidPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyHIPContext_isOwnerPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyHIPContext_isConstPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyHIPContext_getCountPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyHIPContext_getInternalPtr, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getContext", (PyCFunction)pyHIPContext_getContext, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getDevice", (PyCFunction)HIPContext_getDevice, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getHIPContext", (PyCFunction)HIPContext_getHIPContext, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getStream", (PyCFunction)HIPContext_getStream, METH_NOARGS, "" });
		PYHIPContext_methods.append(PyMethodDef { "getProcAddress", (PyCFunction)HIPContext_getProcAddress, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYHIPContext_methods.append(PyMethodDef { "error", (PyCFunction)HIPContext_error, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYHIPContext_methods.append(PyMethodDef {});
		PYHIPContext_getsets.reserve(PYHIPContext_getsets.size() + 4);
		PYHIPContext_getsets.append(PyGetSetDef { "device", (getter)HIPContext_get_device, nullptr, "", nullptr });
		PYHIPContext_getsets.append(PyGetSetDef { "hip_context", (getter)HIPContext_get_hip_context, nullptr, "", nullptr });
		PYHIPContext_getsets.append(PyGetSetDef { "stream", (getter)HIPContext_get_stream, nullptr, "", nullptr });
		PYHIPContext_getsets.append(PyGetSetDef {});
		PYHIPContext_Type.tp_base = &PYContext_Type;
		PYHIPContext_Type.tp_dealloc = (destructor)pyHIPContext_dealloc;
		PYHIPContext_number.nb_bool = (inquiry)pyHIPContext_bool;
		PYHIPContext_Type.tp_name = "tellusim.HIPContext";
		PYHIPContext_Type.tp_basicsize = sizeof(PYHIPContext);
		PYHIPContext_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYHIPContext_Type.tp_doc = "";
		PYHIPContext_Type.tp_str = (reprfunc)pyHIPContext_str;
		PYHIPContext_Type.tp_as_number = &PYHIPContext_number;
		PYHIPContext_Type.tp_methods = PYHIPContext_methods.discard();
		PYHIPContext_Type.tp_getset = PYHIPContext_getsets.discard();
		PYHIPContext_Type.tp_init = (initproc)pyHIPContext_init;
		PYHIPContext_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYHIPContext_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "HIPContext");
			return false;
		}
		Py_INCREF(&PYHIPContext_Type);
		
		// Tellusim::Query
		PYQuery_methods.reserve(PYQuery_methods.size() + 35);
		PYQuery_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyQuery_equalPtr, METH_VARARGS, "" });
		PYQuery_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyQuery_clonePtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyQuery_clearPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyQuery_destroyPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyQuery_acquirePtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyQuery_unacquirePtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyQuery_isValidPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyQuery_isOwnerPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyQuery_isConstPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyQuery_getCountPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyQuery_getInternalPtr, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Query_getPlatform, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Query_getPlatformName, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getIndex", (PyCFunction)Query_getIndex, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "clear", (PyCFunction)Query_clear, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isCreated", (PyCFunction)Query_isCreated, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isAvailable", (PyCFunction)Query_isAvailable, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isBegan", (PyCFunction)Query_isBegan, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isEnded", (PyCFunction)Query_isEnded, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "create", (PyCFunction)Query_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef { "getType", (PyCFunction)Query_getType, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Query_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef { "getTypeSize", (PyCFunction)Query_getTypeSize, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isTime", (PyCFunction)Query_isTime, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isClock", (PyCFunction)Query_isClock, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isSamples", (PyCFunction)Query_isSamples, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isSamples1", (PyCFunction)Query_isSamples1, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isStatistics", (PyCFunction)Query_isStatistics, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isTimeType", (PyCFunction)Query_isTimeType, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "isSamplesType", (PyCFunction)Query_isSamplesType, METH_NOARGS, "" });
		PYQuery_methods.append(PyMethodDef { "get", (PyCFunction)Query_get, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef { "getTime", (PyCFunction)Query_getTime, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef { "getSamples", (PyCFunction)Query_getSamples, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef { "getStatistics", (PyCFunction)Query_getStatistics, METH_VARARGS | METH_KEYWORDS, "" });
		PYQuery_methods.append(PyMethodDef {});
		PYQuery_getsets.reserve(PYQuery_getsets.size() + 9);
		PYQuery_getsets.append(PyGetSetDef { "platform", (getter)Query_get_platform, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "platform_name", (getter)Query_get_platform_name, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "index", (getter)Query_get_index, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "type", (getter)Query_get_type, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "type_size", (getter)Query_get_type_size, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "time", (getter)Query_get_time, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "samples", (getter)Query_get_samples, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef { "statistics", (getter)Query_get_statistics, nullptr, "", nullptr });
		PYQuery_getsets.append(PyGetSetDef {});
		PYQuery_Type.tp_dealloc = (destructor)pyQuery_dealloc;
		PYQuery_number.nb_bool = (inquiry)pyQuery_bool;
		PYQuery_Type.tp_name = "tellusim.Query";
		PYQuery_Type.tp_basicsize = sizeof(PYQuery);
		PYQuery_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYQuery_Type.tp_doc = "";
		PYQuery_Type.tp_str = (reprfunc)pyQuery_str;
		PYQuery_Type.tp_as_number = &PYQuery_number;
		PYQuery_Type.tp_methods = PYQuery_methods.discard();
		PYQuery_Type.tp_getset = PYQuery_getsets.discard();
		PYQuery_Type.tp_init = (initproc)pyQuery_init;
		PYQuery_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYQuery_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Query");
			return false;
		}
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeTime", PyLong_FromLong(1));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeClock", PyLong_FromLong(2));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeSamples", PyLong_FromLong(3));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeSamples1", PyLong_FromLong(4));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "TypeStatistics", PyLong_FromLong(5));
		PyDict_SetItemString(PYQuery_Type.tp_dict, "NumTypes", PyLong_FromLong(6));
		PyType_Modified(&PYQuery_Type);
		Py_INCREF(&PYQuery_Type);
		
		// Tellusim::Query::Statistics
		PYQueryStatistics_methods.append(PyMethodDef {});
		PYQueryStatistics_members.reserve(PYQueryStatistics_members.size() + 12);
		PYQueryStatistics_getsets.reserve(PYQueryStatistics_getsets.size() + 1);
		PYQueryStatistics_members.append(PyMemberDef { "num_vertices", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.num_vertices), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "num_primitives", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.num_primitives), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "vertex_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.vertex_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "control_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.control_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "evaluate_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.evaluate_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "geometry_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.geometry_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "geometry_primitives", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.geometry_primitives), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "fragment_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.fragment_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "compute_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.compute_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "clipping_invocations", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.clipping_invocations), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef { "clipping_primitives", T_ULONGLONG, offsetof(PYQueryStatistics, ptr.clipping_primitives), 0, "" });
		PYQueryStatistics_members.append(PyMemberDef {});
		PYQueryStatistics_getsets.append(PyGetSetDef {});
		PYQueryStatistics_buffer.bf_getbuffer = (getbufferproc)pyQueryStatistics_buffer;
		PYQueryStatistics_Type.tp_str = (reprfunc)pyQueryStatistics_str;
		PYQueryStatistics_Type.tp_name = "tellusim.QueryStatistics";
		PYQueryStatistics_Type.tp_basicsize = sizeof(PYQueryStatistics);
		PYQueryStatistics_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYQueryStatistics_Type.tp_doc = "";
		PYQueryStatistics_Type.tp_as_number = &PYQueryStatistics_number;
		PYQueryStatistics_Type.tp_as_buffer = &PYQueryStatistics_buffer;
		PYQueryStatistics_Type.tp_methods = PYQueryStatistics_methods.discard();
		PYQueryStatistics_Type.tp_members = PYQueryStatistics_members.discard();
		PYQueryStatistics_Type.tp_getset = PYQueryStatistics_getsets.discard();
		PYQueryStatistics_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYQueryStatistics_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Query::Statistics");
			return false;
		}
		Py_INCREF(&PYQueryStatistics_Type);
		
		// Tellusim::FUQuery
		PYFUQuery_methods.reserve(PYFUQuery_methods.size() + 17);
		PYFUQuery_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUQuery_equalPtr, METH_VARARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUQuery_clonePtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUQuery_clearPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUQuery_destroyPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUQuery_acquirePtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUQuery_unacquirePtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUQuery_isValidPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUQuery_isOwnerPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUQuery_isConstPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUQuery_getCountPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUQuery_getInternalPtr, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getQuery", (PyCFunction)pyFUQuery_getQuery, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "setMask", (PyCFunction)FUQuery_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getMask", (PyCFunction)FUQuery_getMask, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getNumQueries", (PyCFunction)FUQuery_getNumQueries, METH_NOARGS, "" });
		PYFUQuery_methods.append(PyMethodDef { "getQuery", (PyCFunction)FUQuery_getQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUQuery_methods.append(PyMethodDef {});
		PYFUQuery_getsets.reserve(PYFUQuery_getsets.size() + 3);
		PYFUQuery_getsets.append(PyGetSetDef { "mask", (getter)FUQuery_get_mask, nullptr, "", nullptr });
		PYFUQuery_getsets.append(PyGetSetDef { "num_queries", (getter)FUQuery_get_num_queries, nullptr, "", nullptr });
		PYFUQuery_getsets.append(PyGetSetDef {});
		PYFUQuery_Type.tp_base = &PYQuery_Type;
		PYFUQuery_Type.tp_dealloc = (destructor)pyFUQuery_dealloc;
		PYFUQuery_number.nb_bool = (inquiry)pyFUQuery_bool;
		PYFUQuery_Type.tp_name = "tellusim.FUQuery";
		PYFUQuery_Type.tp_basicsize = sizeof(PYFUQuery);
		PYFUQuery_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUQuery_Type.tp_doc = "";
		PYFUQuery_Type.tp_str = (reprfunc)pyFUQuery_str;
		PYFUQuery_Type.tp_as_number = &PYFUQuery_number;
		PYFUQuery_Type.tp_methods = PYFUQuery_methods.discard();
		PYFUQuery_Type.tp_getset = PYFUQuery_getsets.discard();
		PYFUQuery_Type.tp_init = (initproc)pyFUQuery_init;
		PYFUQuery_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUQuery_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUQuery");
			return false;
		}
		Py_INCREF(&PYFUQuery_Type);
		
		// Tellusim::Fence
		PYFence_methods.reserve(PYFence_methods.size() + 23);
		PYFence_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFence_equalPtr, METH_VARARGS, "" });
		PYFence_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFence_clonePtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFence_clearPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFence_destroyPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFence_acquirePtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFence_unacquirePtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFence_isValidPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFence_isOwnerPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFence_isConstPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFence_getCountPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFence_getInternalPtr, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Fence_getPlatform, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Fence_getPlatformName, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getIndex", (PyCFunction)Fence_getIndex, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "clear", (PyCFunction)Fence_clear, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "isCreated", (PyCFunction)Fence_isCreated, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "create", (PyCFunction)Fence_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYFence_methods.append(PyMethodDef { "getFlags", (PyCFunction)Fence_getFlags, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "hasFlag", (PyCFunction)Fence_hasFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYFence_methods.append(PyMethodDef { "hasFlags", (PyCFunction)Fence_hasFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYFence_methods.append(PyMethodDef { "getFlagsName", (PyCFunction)Fence_getFlagsName, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef { "getDescription", (PyCFunction)Fence_getDescription, METH_NOARGS, "" });
		PYFence_methods.append(PyMethodDef {});
		PYFence_getsets.reserve(PYFence_getsets.size() + 7);
		PYFence_getsets.append(PyGetSetDef { "platform", (getter)Fence_get_platform, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef { "platform_name", (getter)Fence_get_platform_name, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef { "index", (getter)Fence_get_index, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef { "flags", (getter)Fence_get_flags, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef { "flags_name", (getter)Fence_get_flags_name, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef { "description", (getter)Fence_get_description, nullptr, "", nullptr });
		PYFence_getsets.append(PyGetSetDef {});
		PYFence_Type.tp_dealloc = (destructor)pyFence_dealloc;
		PYFence_number.nb_bool = (inquiry)pyFence_bool;
		PYFence_Type.tp_name = "tellusim.Fence";
		PYFence_Type.tp_basicsize = sizeof(PYFence);
		PYFence_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYFence_Type.tp_doc = "";
		PYFence_Type.tp_str = (reprfunc)pyFence_str;
		PYFence_Type.tp_as_number = &PYFence_number;
		PYFence_Type.tp_methods = PYFence_methods.discard();
		PYFence_Type.tp_getset = PYFence_getsets.discard();
		PYFence_Type.tp_init = (initproc)pyFence_init;
		PYFence_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFence_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Fence");
			return false;
		}
		PyDict_SetItemString(PYFence_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYFence_Type.tp_dict, "FlagSemaphore", PyLong_FromLong(1));
		PyDict_SetItemString(PYFence_Type.tp_dict, "FlagSignaled", PyLong_FromLong(2));
		PyDict_SetItemString(PYFence_Type.tp_dict, "FlagShared", PyLong_FromLong(4));
		PyDict_SetItemString(PYFence_Type.tp_dict, "FlagExtern", PyLong_FromLong(8));
		PyDict_SetItemString(PYFence_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYFence_Type.tp_dict, "NumFlags", PyLong_FromLong(4));
		PyType_Modified(&PYFence_Type);
		Py_INCREF(&PYFence_Type);
		
		// Tellusim::VKFence
		PYVKFence_methods.reserve(PYVKFence_methods.size() + 16);
		PYVKFence_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKFence_equalPtr, METH_VARARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKFence_clonePtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKFence_clearPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKFence_destroyPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKFence_acquirePtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKFence_unacquirePtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKFence_isValidPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKFence_isOwnerPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKFence_isConstPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKFence_getCountPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKFence_getInternalPtr, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getFence", (PyCFunction)pyVKFence_getFence, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getVKFence", (PyCFunction)VKFence_getVKFence, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getSemaphore", (PyCFunction)VKFence_getSemaphore, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef { "getSharedHandle", (PyCFunction)VKFence_getSharedHandle, METH_NOARGS, "" });
		PYVKFence_methods.append(PyMethodDef {});
		PYVKFence_getsets.reserve(PYVKFence_getsets.size() + 4);
		PYVKFence_getsets.append(PyGetSetDef { "vk_fence", (getter)VKFence_get_vk_fence, nullptr, "", nullptr });
		PYVKFence_getsets.append(PyGetSetDef { "semaphore", (getter)VKFence_get_semaphore, nullptr, "", nullptr });
		PYVKFence_getsets.append(PyGetSetDef { "shared_handle", (getter)VKFence_get_shared_handle, nullptr, "", nullptr });
		PYVKFence_getsets.append(PyGetSetDef {});
		PYVKFence_Type.tp_base = &PYFence_Type;
		PYVKFence_Type.tp_dealloc = (destructor)pyVKFence_dealloc;
		PYVKFence_number.nb_bool = (inquiry)pyVKFence_bool;
		PYVKFence_Type.tp_name = "tellusim.VKFence";
		PYVKFence_Type.tp_basicsize = sizeof(PYVKFence);
		PYVKFence_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKFence_Type.tp_doc = "";
		PYVKFence_Type.tp_str = (reprfunc)pyVKFence_str;
		PYVKFence_Type.tp_as_number = &PYVKFence_number;
		PYVKFence_Type.tp_methods = PYVKFence_methods.discard();
		PYVKFence_Type.tp_getset = PYVKFence_getsets.discard();
		PYVKFence_Type.tp_init = (initproc)pyVKFence_init;
		PYVKFence_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKFence_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKFence");
			return false;
		}
		Py_INCREF(&PYVKFence_Type);
		
		// Tellusim::FUFence
		PYFUFence_methods.reserve(PYFUFence_methods.size() + 17);
		PYFUFence_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUFence_equalPtr, METH_VARARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUFence_clonePtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUFence_clearPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUFence_destroyPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUFence_acquirePtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUFence_unacquirePtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUFence_isValidPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUFence_isOwnerPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUFence_isConstPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUFence_getCountPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUFence_getInternalPtr, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "getFence", (PyCFunction)pyFUFence_getFence, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "setMask", (PyCFunction)FUFence_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUFence_methods.append(PyMethodDef { "getMask", (PyCFunction)FUFence_getMask, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "getNumFences", (PyCFunction)FUFence_getNumFences, METH_NOARGS, "" });
		PYFUFence_methods.append(PyMethodDef { "getFence", (PyCFunction)FUFence_getFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUFence_methods.append(PyMethodDef {});
		PYFUFence_getsets.reserve(PYFUFence_getsets.size() + 3);
		PYFUFence_getsets.append(PyGetSetDef { "mask", (getter)FUFence_get_mask, nullptr, "", nullptr });
		PYFUFence_getsets.append(PyGetSetDef { "num_fences", (getter)FUFence_get_num_fences, nullptr, "", nullptr });
		PYFUFence_getsets.append(PyGetSetDef {});
		PYFUFence_Type.tp_base = &PYFence_Type;
		PYFUFence_Type.tp_dealloc = (destructor)pyFUFence_dealloc;
		PYFUFence_number.nb_bool = (inquiry)pyFUFence_bool;
		PYFUFence_Type.tp_name = "tellusim.FUFence";
		PYFUFence_Type.tp_basicsize = sizeof(PYFUFence);
		PYFUFence_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUFence_Type.tp_doc = "";
		PYFUFence_Type.tp_str = (reprfunc)pyFUFence_str;
		PYFUFence_Type.tp_as_number = &PYFUFence_number;
		PYFUFence_Type.tp_methods = PYFUFence_methods.discard();
		PYFUFence_Type.tp_getset = PYFUFence_getsets.discard();
		PYFUFence_Type.tp_init = (initproc)pyFUFence_init;
		PYFUFence_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUFence_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUFence");
			return false;
		}
		Py_INCREF(&PYFUFence_Type);
		
		// Tellusim::Shader
		PYShader_methods.reserve(PYShader_methods.size() + 83);
		PYShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyShader_equalPtr, METH_VARARGS, "" });
		PYShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyShader_clonePtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyShader_clearPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyShader_destroyPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyShader_acquirePtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyShader_unacquirePtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyShader_isValidPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyShader_isOwnerPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyShader_isConstPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyShader_getCountPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyShader_getInternalPtr, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Shader_getPlatform, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Shader_getPlatformName, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getIndex", (PyCFunction)Shader_getIndex, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "clear", (PyCFunction)Shader_clear, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isCreated", (PyCFunction)Shader_isCreated, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "saveState", (PyCFunction)Shader_saveState, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getType", (PyCFunction)Shader_getType, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Shader_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "isVertex", (PyCFunction)Shader_isVertex, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isControl", (PyCFunction)Shader_isControl, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isEvaluate", (PyCFunction)Shader_isEvaluate, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isGeometry", (PyCFunction)Shader_isGeometry, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isFragment", (PyCFunction)Shader_isFragment, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isCompute", (PyCFunction)Shader_isCompute, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isTask", (PyCFunction)Shader_isTask, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isMesh", (PyCFunction)Shader_isMesh, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isRayGen", (PyCFunction)Shader_isRayGen, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isRayMiss", (PyCFunction)Shader_isRayMiss, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isClosest", (PyCFunction)Shader_isClosest, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isFirstHit", (PyCFunction)Shader_isFirstHit, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isIntersection", (PyCFunction)Shader_isIntersection, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isCallable", (PyCFunction)Shader_isCallable, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isGraphicsType", (PyCFunction)Shader_isGraphicsType, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isTessellationType", (PyCFunction)Shader_isTessellationType, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isTracingType", (PyCFunction)Shader_isTracingType, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "isMeshType", (PyCFunction)Shader_isMeshType, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getName", (PyCFunction)Shader_getName, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "getMacros", (PyCFunction)Shader_getMacros, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setSamplerOffset", (PyCFunction)Shader_setSamplerOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getSamplerOffset", (PyCFunction)Shader_getSamplerOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setTextureOffset", (PyCFunction)Shader_setTextureOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getTextureOffset", (PyCFunction)Shader_getTextureOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setSurfaceOffset", (PyCFunction)Shader_setSurfaceOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getSurfaceOffset", (PyCFunction)Shader_getSurfaceOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Shader_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getUniformOffset", (PyCFunction)Shader_getUniformOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Shader_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getStorageOffset", (PyCFunction)Shader_getStorageOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setTracingOffset", (PyCFunction)Shader_setTracingOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getTracingOffset", (PyCFunction)Shader_getTracingOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setTexelOffset", (PyCFunction)Shader_setTexelOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getTexelOffset", (PyCFunction)Shader_getTexelOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setTableOffset", (PyCFunction)Shader_setTableOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getTableOffset", (PyCFunction)Shader_getTableOffset, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setPatchSize", (PyCFunction)Shader_setPatchSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getPatchSize", (PyCFunction)Shader_getPatchSize, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setInputSize", (PyCFunction)Shader_setInputSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getInputSize", (PyCFunction)Shader_getInputSize, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "setOutputSize", (PyCFunction)Shader_setOutputSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "getOutputSize", (PyCFunction)Shader_getOutputSize, METH_NOARGS, "" });
		PYShader_methods.append(PyMethodDef { "load", (PyCFunction)Shader_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "create", (PyCFunction)Shader_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "loadGLSL", (PyCFunction)Shader_loadGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "createGLSL", (PyCFunction)Shader_createGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "loadSPIRV", (PyCFunction)Shader_loadSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "createSPIRV", (PyCFunction)Shader_createSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYShader_methods.append(PyMethodDef { "hasCache", (PyCFunction)Shader_hasCache, METH_NOARGS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "setCache", (PyCFunction)Shader_setCache, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "loadCache", (PyCFunction)Shader_loadCache, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "saveCache", (PyCFunction)Shader_saveCache, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "clearCache", (PyCFunction)Shader_clearCache, METH_NOARGS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "isMacro", (PyCFunction)Shader_isMacro, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "setMacro", (PyCFunction)Shader_setMacro, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "setMacros", (PyCFunction)Shader_setMacros, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "removeMacro", (PyCFunction)Shader_removeMacro, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "clearMacros", (PyCFunction)Shader_clearMacros, METH_NOARGS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "isInclude", (PyCFunction)Shader_isInclude, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "setInclude", (PyCFunction)Shader_setInclude, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "removeInclude", (PyCFunction)Shader_removeInclude, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "clearIncludes", (PyCFunction)Shader_clearIncludes, METH_NOARGS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef { "preprocessor", (PyCFunction)Shader_preprocessor, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYShader_methods.append(PyMethodDef {});
		PYShader_getsets.reserve(PYShader_getsets.size() + 18);
		PYShader_getsets.append(PyGetSetDef { "platform", (getter)Shader_get_platform, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "platform_name", (getter)Shader_get_platform_name, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "index", (getter)Shader_get_index, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "type", (getter)Shader_get_type, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "name", (getter)Shader_get_name, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "macros", (getter)Shader_get_macros, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "sampler_offset", (getter)Shader_get_sampler_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "texture_offset", (getter)Shader_get_texture_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "surface_offset", (getter)Shader_get_surface_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "uniform_offset", (getter)Shader_get_uniform_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "storage_offset", (getter)Shader_get_storage_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "tracing_offset", (getter)Shader_get_tracing_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "texel_offset", (getter)Shader_get_texel_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "table_offset", (getter)Shader_get_table_offset, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "patch_size", (getter)Shader_get_patch_size, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "input_size", (getter)Shader_get_input_size, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef { "output_size", (getter)Shader_get_output_size, nullptr, "", nullptr });
		PYShader_getsets.append(PyGetSetDef {});
		PYShader_Type.tp_dealloc = (destructor)pyShader_dealloc;
		PYShader_number.nb_bool = (inquiry)pyShader_bool;
		PYShader_Type.tp_name = "tellusim.Shader";
		PYShader_Type.tp_basicsize = sizeof(PYShader);
		PYShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYShader_Type.tp_doc = "";
		PYShader_Type.tp_str = (reprfunc)pyShader_str;
		PYShader_Type.tp_as_number = &PYShader_number;
		PYShader_Type.tp_methods = PYShader_methods.discard();
		PYShader_Type.tp_getset = PYShader_getsets.discard();
		PYShader_Type.tp_init = (initproc)pyShader_init;
		PYShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Shader");
			return false;
		}
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeVertex", PyLong_FromLong(1));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeControl", PyLong_FromLong(2));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeEvaluate", PyLong_FromLong(3));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeGeometry", PyLong_FromLong(4));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeFragment", PyLong_FromLong(5));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeCompute", PyLong_FromLong(6));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeTask", PyLong_FromLong(7));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeMesh", PyLong_FromLong(8));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeRayGen", PyLong_FromLong(9));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeRayMiss", PyLong_FromLong(10));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeClosest", PyLong_FromLong(11));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeFirstHit", PyLong_FromLong(12));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeIntersection", PyLong_FromLong(13));
		PyDict_SetItemString(PYShader_Type.tp_dict, "TypeCallable", PyLong_FromLong(14));
		PyDict_SetItemString(PYShader_Type.tp_dict, "NumTypes", PyLong_FromLong(15));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskVertex", PyLong_FromLong(2));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskControl", PyLong_FromLong(4));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskEvaluate", PyLong_FromLong(8));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskGeometry", PyLong_FromLong(16));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskFragment", PyLong_FromLong(32));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskCompute", PyLong_FromLong(64));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskTask", PyLong_FromLong(128));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskMesh", PyLong_FromLong(256));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskRayGen", PyLong_FromLong(512));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskRayMiss", PyLong_FromLong(1024));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskClosest", PyLong_FromLong(2048));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskFirstHit", PyLong_FromLong(4096));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskIntersection", PyLong_FromLong(8192));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskCallable", PyLong_FromLong(16384));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskVertexFragment", PyLong_FromLong(34));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskGraphics", PyLong_FromLong(62));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskTracing", PyLong_FromLong(32256));
		PyDict_SetItemString(PYShader_Type.tp_dict, "MaskAll", PyLong_FromLong(32766));
		PyType_Modified(&PYShader_Type);
		Py_INCREF(&PYShader_Type);
		
		// Tellusim::ShaderCompiler
		PYShaderCompiler_methods.reserve(PYShaderCompiler_methods.size() + 17);
		PYShaderCompiler_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyShaderCompiler_equalPtr, METH_VARARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyShaderCompiler_clonePtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyShaderCompiler_clearPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyShaderCompiler_destroyPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyShaderCompiler_acquirePtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyShaderCompiler_unacquirePtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyShaderCompiler_isValidPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyShaderCompiler_isOwnerPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyShaderCompiler_isConstPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyShaderCompiler_getCountPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyShaderCompiler_getInternalPtr, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getShader", (PyCFunction)pyShaderCompiler_getShader, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "setFlags", (PyCFunction)ShaderCompiler_setFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getFlags", (PyCFunction)ShaderCompiler_getFlags, METH_NOARGS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getBinary", (PyCFunction)ShaderCompiler_getBinary, METH_VARARGS | METH_KEYWORDS, "" });
		PYShaderCompiler_methods.append(PyMethodDef { "getSource", (PyCFunction)ShaderCompiler_getSource, METH_VARARGS | METH_KEYWORDS, "" });
		PYShaderCompiler_methods.append(PyMethodDef {});
		PYShaderCompiler_getsets.reserve(PYShaderCompiler_getsets.size() + 3);
		PYShaderCompiler_getsets.append(PyGetSetDef { "flags", (getter)ShaderCompiler_get_flags, nullptr, "", nullptr });
		PYShaderCompiler_getsets.append(PyGetSetDef { "source", (getter)ShaderCompiler_get_source, nullptr, "", nullptr });
		PYShaderCompiler_getsets.append(PyGetSetDef {});
		PYShaderCompiler_Type.tp_base = &PYShader_Type;
		PYShaderCompiler_Type.tp_dealloc = (destructor)pyShaderCompiler_dealloc;
		PYShaderCompiler_number.nb_bool = (inquiry)pyShaderCompiler_bool;
		PYShaderCompiler_Type.tp_name = "tellusim.ShaderCompiler";
		PYShaderCompiler_Type.tp_basicsize = sizeof(PYShaderCompiler);
		PYShaderCompiler_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYShaderCompiler_Type.tp_doc = "";
		PYShaderCompiler_Type.tp_str = (reprfunc)pyShaderCompiler_str;
		PYShaderCompiler_Type.tp_as_number = &PYShaderCompiler_number;
		PYShaderCompiler_Type.tp_methods = PYShaderCompiler_methods.discard();
		PYShaderCompiler_Type.tp_getset = PYShaderCompiler_getsets.discard();
		PYShaderCompiler_Type.tp_init = (initproc)pyShaderCompiler_init;
		PYShaderCompiler_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYShaderCompiler_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ShaderCompiler");
			return false;
		}
		PyDict_SetItemString(PYShaderCompiler_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYShaderCompiler_Type.tp_dict, "FlagMSLIndirect", PyLong_FromLong(1));
		PyType_Modified(&PYShaderCompiler_Type);
		Py_INCREF(&PYShaderCompiler_Type);
		
		// Tellusim::D3D12Shader
		PYD3D12Shader_methods.reserve(PYD3D12Shader_methods.size() + 14);
		PYD3D12Shader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Shader_equalPtr, METH_VARARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Shader_clonePtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Shader_clearPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Shader_destroyPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Shader_acquirePtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Shader_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Shader_isValidPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Shader_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Shader_isConstPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Shader_getCountPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Shader_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyD3D12Shader_getShader, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef { "getShaderBlob", (PyCFunction)D3D12Shader_getShaderBlob, METH_NOARGS, "" });
		PYD3D12Shader_methods.append(PyMethodDef {});
		PYD3D12Shader_getsets.reserve(PYD3D12Shader_getsets.size() + 2);
		PYD3D12Shader_getsets.append(PyGetSetDef { "shader_blob", (getter)D3D12Shader_get_shader_blob, nullptr, "", nullptr });
		PYD3D12Shader_getsets.append(PyGetSetDef {});
		PYD3D12Shader_Type.tp_base = &PYShader_Type;
		PYD3D12Shader_Type.tp_dealloc = (destructor)pyD3D12Shader_dealloc;
		PYD3D12Shader_number.nb_bool = (inquiry)pyD3D12Shader_bool;
		PYD3D12Shader_Type.tp_name = "tellusim.D3D12Shader";
		PYD3D12Shader_Type.tp_basicsize = sizeof(PYD3D12Shader);
		PYD3D12Shader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Shader_Type.tp_doc = "";
		PYD3D12Shader_Type.tp_str = (reprfunc)pyD3D12Shader_str;
		PYD3D12Shader_Type.tp_as_number = &PYD3D12Shader_number;
		PYD3D12Shader_Type.tp_methods = PYD3D12Shader_methods.discard();
		PYD3D12Shader_Type.tp_getset = PYD3D12Shader_getsets.discard();
		PYD3D12Shader_Type.tp_init = (initproc)pyD3D12Shader_init;
		PYD3D12Shader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Shader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Shader");
			return false;
		}
		Py_INCREF(&PYD3D12Shader_Type);
		
		// Tellusim::D3D11Shader
		PYD3D11Shader_methods.reserve(PYD3D11Shader_methods.size() + 15);
		PYD3D11Shader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Shader_equalPtr, METH_VARARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Shader_clonePtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Shader_clearPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Shader_destroyPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Shader_acquirePtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Shader_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Shader_isValidPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Shader_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Shader_isConstPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Shader_getCountPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Shader_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyD3D11Shader_getShader, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "getD3D11Shader", (PyCFunction)D3D11Shader_getD3D11Shader, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef { "getShaderBlob", (PyCFunction)D3D11Shader_getShaderBlob, METH_NOARGS, "" });
		PYD3D11Shader_methods.append(PyMethodDef {});
		PYD3D11Shader_getsets.reserve(PYD3D11Shader_getsets.size() + 3);
		PYD3D11Shader_getsets.append(PyGetSetDef { "d3d11_shader", (getter)D3D11Shader_get_d3d11_shader, nullptr, "", nullptr });
		PYD3D11Shader_getsets.append(PyGetSetDef { "shader_blob", (getter)D3D11Shader_get_shader_blob, nullptr, "", nullptr });
		PYD3D11Shader_getsets.append(PyGetSetDef {});
		PYD3D11Shader_Type.tp_base = &PYShader_Type;
		PYD3D11Shader_Type.tp_dealloc = (destructor)pyD3D11Shader_dealloc;
		PYD3D11Shader_number.nb_bool = (inquiry)pyD3D11Shader_bool;
		PYD3D11Shader_Type.tp_name = "tellusim.D3D11Shader";
		PYD3D11Shader_Type.tp_basicsize = sizeof(PYD3D11Shader);
		PYD3D11Shader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Shader_Type.tp_doc = "";
		PYD3D11Shader_Type.tp_str = (reprfunc)pyD3D11Shader_str;
		PYD3D11Shader_Type.tp_as_number = &PYD3D11Shader_number;
		PYD3D11Shader_Type.tp_methods = PYD3D11Shader_methods.discard();
		PYD3D11Shader_Type.tp_getset = PYD3D11Shader_getsets.discard();
		PYD3D11Shader_Type.tp_init = (initproc)pyD3D11Shader_init;
		PYD3D11Shader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Shader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Shader");
			return false;
		}
		Py_INCREF(&PYD3D11Shader_Type);
		
		// Tellusim::MTLShader
		PYMTLShader_methods.reserve(PYMTLShader_methods.size() + 17);
		PYMTLShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLShader_equalPtr, METH_VARARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLShader_clonePtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLShader_clearPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLShader_destroyPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLShader_acquirePtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLShader_unacquirePtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLShader_isValidPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLShader_isOwnerPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLShader_isConstPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLShader_getCountPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLShader_getInternalPtr, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyMTLShader_getShader, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "setIndirect", (PyCFunction)MTLShader_setIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLShader_methods.append(PyMethodDef { "isIndirect", (PyCFunction)MTLShader_isIndirect, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "getLibrary", (PyCFunction)MTLShader_getLibrary, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef { "getFunction", (PyCFunction)MTLShader_getFunction, METH_NOARGS, "" });
		PYMTLShader_methods.append(PyMethodDef {});
		PYMTLShader_getsets.reserve(PYMTLShader_getsets.size() + 3);
		PYMTLShader_getsets.append(PyGetSetDef { "library", (getter)MTLShader_get_library, nullptr, "", nullptr });
		PYMTLShader_getsets.append(PyGetSetDef { "function", (getter)MTLShader_get_function, nullptr, "", nullptr });
		PYMTLShader_getsets.append(PyGetSetDef {});
		PYMTLShader_Type.tp_base = &PYShader_Type;
		PYMTLShader_Type.tp_dealloc = (destructor)pyMTLShader_dealloc;
		PYMTLShader_number.nb_bool = (inquiry)pyMTLShader_bool;
		PYMTLShader_Type.tp_name = "tellusim.MTLShader";
		PYMTLShader_Type.tp_basicsize = sizeof(PYMTLShader);
		PYMTLShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLShader_Type.tp_doc = "";
		PYMTLShader_Type.tp_str = (reprfunc)pyMTLShader_str;
		PYMTLShader_Type.tp_as_number = &PYMTLShader_number;
		PYMTLShader_Type.tp_methods = PYMTLShader_methods.discard();
		PYMTLShader_Type.tp_getset = PYMTLShader_getsets.discard();
		PYMTLShader_Type.tp_init = (initproc)pyMTLShader_init;
		PYMTLShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLShader");
			return false;
		}
		Py_INCREF(&PYMTLShader_Type);
		
		// Tellusim::VKShader
		PYVKShader_methods.reserve(PYVKShader_methods.size() + 14);
		PYVKShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKShader_equalPtr, METH_VARARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKShader_clonePtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKShader_clearPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKShader_destroyPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKShader_acquirePtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKShader_unacquirePtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKShader_isValidPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKShader_isOwnerPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKShader_isConstPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKShader_getCountPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKShader_getInternalPtr, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyVKShader_getShader, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef { "getModule", (PyCFunction)VKShader_getModule, METH_NOARGS, "" });
		PYVKShader_methods.append(PyMethodDef {});
		PYVKShader_getsets.reserve(PYVKShader_getsets.size() + 2);
		PYVKShader_getsets.append(PyGetSetDef { "module", (getter)VKShader_get_module, nullptr, "", nullptr });
		PYVKShader_getsets.append(PyGetSetDef {});
		PYVKShader_Type.tp_base = &PYShader_Type;
		PYVKShader_Type.tp_dealloc = (destructor)pyVKShader_dealloc;
		PYVKShader_number.nb_bool = (inquiry)pyVKShader_bool;
		PYVKShader_Type.tp_name = "tellusim.VKShader";
		PYVKShader_Type.tp_basicsize = sizeof(PYVKShader);
		PYVKShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKShader_Type.tp_doc = "";
		PYVKShader_Type.tp_str = (reprfunc)pyVKShader_str;
		PYVKShader_Type.tp_as_number = &PYVKShader_number;
		PYVKShader_Type.tp_methods = PYVKShader_methods.discard();
		PYVKShader_Type.tp_getset = PYVKShader_getsets.discard();
		PYVKShader_Type.tp_init = (initproc)pyVKShader_init;
		PYVKShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKShader");
			return false;
		}
		Py_INCREF(&PYVKShader_Type);
		
		// Tellusim::GLShader
		PYGLShader_methods.reserve(PYGLShader_methods.size() + 16);
		PYGLShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLShader_equalPtr, METH_VARARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLShader_clonePtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLShader_clearPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLShader_destroyPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLShader_acquirePtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLShader_unacquirePtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLShader_isValidPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLShader_isOwnerPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLShader_isConstPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLShader_getCountPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLShader_getInternalPtr, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyGLShader_getShader, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "attachShader", (PyCFunction)GLShader_attachShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLShader_methods.append(PyMethodDef { "getShaderType", (PyCFunction)GLShader_getShaderType, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef { "getShaderID", (PyCFunction)GLShader_getShaderID, METH_NOARGS, "" });
		PYGLShader_methods.append(PyMethodDef {});
		PYGLShader_getsets.reserve(PYGLShader_getsets.size() + 3);
		PYGLShader_getsets.append(PyGetSetDef { "shader_type", (getter)GLShader_get_shader_type, nullptr, "", nullptr });
		PYGLShader_getsets.append(PyGetSetDef { "shader_id", (getter)GLShader_get_shader_id, nullptr, "", nullptr });
		PYGLShader_getsets.append(PyGetSetDef {});
		PYGLShader_Type.tp_base = &PYShader_Type;
		PYGLShader_Type.tp_dealloc = (destructor)pyGLShader_dealloc;
		PYGLShader_number.nb_bool = (inquiry)pyGLShader_bool;
		PYGLShader_Type.tp_name = "tellusim.GLShader";
		PYGLShader_Type.tp_basicsize = sizeof(PYGLShader);
		PYGLShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLShader_Type.tp_doc = "";
		PYGLShader_Type.tp_str = (reprfunc)pyGLShader_str;
		PYGLShader_Type.tp_as_number = &PYGLShader_number;
		PYGLShader_Type.tp_methods = PYGLShader_methods.discard();
		PYGLShader_Type.tp_getset = PYGLShader_getsets.discard();
		PYGLShader_Type.tp_init = (initproc)pyGLShader_init;
		PYGLShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLShader");
			return false;
		}
		Py_INCREF(&PYGLShader_Type);
		
		// Tellusim::GLESShader
		PYGLESShader_methods.reserve(PYGLESShader_methods.size() + 16);
		PYGLESShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESShader_equalPtr, METH_VARARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESShader_clonePtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESShader_clearPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESShader_destroyPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESShader_acquirePtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESShader_unacquirePtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESShader_isValidPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESShader_isOwnerPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESShader_isConstPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESShader_getCountPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESShader_getInternalPtr, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyGLESShader_getShader, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "attachShader", (PyCFunction)GLESShader_attachShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESShader_methods.append(PyMethodDef { "getShaderType", (PyCFunction)GLESShader_getShaderType, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef { "getShaderID", (PyCFunction)GLESShader_getShaderID, METH_NOARGS, "" });
		PYGLESShader_methods.append(PyMethodDef {});
		PYGLESShader_getsets.reserve(PYGLESShader_getsets.size() + 3);
		PYGLESShader_getsets.append(PyGetSetDef { "shader_type", (getter)GLESShader_get_shader_type, nullptr, "", nullptr });
		PYGLESShader_getsets.append(PyGetSetDef { "shader_id", (getter)GLESShader_get_shader_id, nullptr, "", nullptr });
		PYGLESShader_getsets.append(PyGetSetDef {});
		PYGLESShader_Type.tp_base = &PYShader_Type;
		PYGLESShader_Type.tp_dealloc = (destructor)pyGLESShader_dealloc;
		PYGLESShader_number.nb_bool = (inquiry)pyGLESShader_bool;
		PYGLESShader_Type.tp_name = "tellusim.GLESShader";
		PYGLESShader_Type.tp_basicsize = sizeof(PYGLESShader);
		PYGLESShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESShader_Type.tp_doc = "";
		PYGLESShader_Type.tp_str = (reprfunc)pyGLESShader_str;
		PYGLESShader_Type.tp_as_number = &PYGLESShader_number;
		PYGLESShader_Type.tp_methods = PYGLESShader_methods.discard();
		PYGLESShader_Type.tp_getset = PYGLESShader_getsets.discard();
		PYGLESShader_Type.tp_init = (initproc)pyGLESShader_init;
		PYGLESShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESShader");
			return false;
		}
		Py_INCREF(&PYGLESShader_Type);
		
		// Tellusim::CUShader
		PYCUShader_methods.reserve(PYCUShader_methods.size() + 15);
		PYCUShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCUShader_equalPtr, METH_VARARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCUShader_clonePtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCUShader_clearPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCUShader_destroyPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCUShader_acquirePtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCUShader_unacquirePtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCUShader_isValidPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCUShader_isOwnerPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCUShader_isConstPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCUShader_getCountPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCUShader_getInternalPtr, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyCUShader_getShader, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "getModule", (PyCFunction)CUShader_getModule, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef { "getFunction", (PyCFunction)CUShader_getFunction, METH_NOARGS, "" });
		PYCUShader_methods.append(PyMethodDef {});
		PYCUShader_getsets.reserve(PYCUShader_getsets.size() + 3);
		PYCUShader_getsets.append(PyGetSetDef { "module", (getter)CUShader_get_module, nullptr, "", nullptr });
		PYCUShader_getsets.append(PyGetSetDef { "function", (getter)CUShader_get_function, nullptr, "", nullptr });
		PYCUShader_getsets.append(PyGetSetDef {});
		PYCUShader_Type.tp_base = &PYShader_Type;
		PYCUShader_Type.tp_dealloc = (destructor)pyCUShader_dealloc;
		PYCUShader_number.nb_bool = (inquiry)pyCUShader_bool;
		PYCUShader_Type.tp_name = "tellusim.CUShader";
		PYCUShader_Type.tp_basicsize = sizeof(PYCUShader);
		PYCUShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCUShader_Type.tp_doc = "";
		PYCUShader_Type.tp_str = (reprfunc)pyCUShader_str;
		PYCUShader_Type.tp_as_number = &PYCUShader_number;
		PYCUShader_Type.tp_methods = PYCUShader_methods.discard();
		PYCUShader_Type.tp_getset = PYCUShader_getsets.discard();
		PYCUShader_Type.tp_init = (initproc)pyCUShader_init;
		PYCUShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCUShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CUShader");
			return false;
		}
		Py_INCREF(&PYCUShader_Type);
		
		// Tellusim::HIPShader
		PYHIPShader_methods.reserve(PYHIPShader_methods.size() + 15);
		PYHIPShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyHIPShader_equalPtr, METH_VARARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyHIPShader_clonePtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyHIPShader_clearPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyHIPShader_destroyPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyHIPShader_acquirePtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyHIPShader_unacquirePtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyHIPShader_isValidPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyHIPShader_isOwnerPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyHIPShader_isConstPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyHIPShader_getCountPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyHIPShader_getInternalPtr, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyHIPShader_getShader, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "getModule", (PyCFunction)HIPShader_getModule, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef { "getFunction", (PyCFunction)HIPShader_getFunction, METH_NOARGS, "" });
		PYHIPShader_methods.append(PyMethodDef {});
		PYHIPShader_getsets.reserve(PYHIPShader_getsets.size() + 3);
		PYHIPShader_getsets.append(PyGetSetDef { "module", (getter)HIPShader_get_module, nullptr, "", nullptr });
		PYHIPShader_getsets.append(PyGetSetDef { "function", (getter)HIPShader_get_function, nullptr, "", nullptr });
		PYHIPShader_getsets.append(PyGetSetDef {});
		PYHIPShader_Type.tp_base = &PYShader_Type;
		PYHIPShader_Type.tp_dealloc = (destructor)pyHIPShader_dealloc;
		PYHIPShader_number.nb_bool = (inquiry)pyHIPShader_bool;
		PYHIPShader_Type.tp_name = "tellusim.HIPShader";
		PYHIPShader_Type.tp_basicsize = sizeof(PYHIPShader);
		PYHIPShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYHIPShader_Type.tp_doc = "";
		PYHIPShader_Type.tp_str = (reprfunc)pyHIPShader_str;
		PYHIPShader_Type.tp_as_number = &PYHIPShader_number;
		PYHIPShader_Type.tp_methods = PYHIPShader_methods.discard();
		PYHIPShader_Type.tp_getset = PYHIPShader_getsets.discard();
		PYHIPShader_Type.tp_init = (initproc)pyHIPShader_init;
		PYHIPShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYHIPShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "HIPShader");
			return false;
		}
		Py_INCREF(&PYHIPShader_Type);
		
		// Tellusim::FUShader
		PYFUShader_methods.reserve(PYFUShader_methods.size() + 17);
		PYFUShader_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUShader_equalPtr, METH_VARARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUShader_clonePtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUShader_clearPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUShader_destroyPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUShader_acquirePtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUShader_unacquirePtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUShader_isValidPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUShader_isOwnerPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUShader_isConstPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUShader_getCountPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUShader_getInternalPtr, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "getShader", (PyCFunction)pyFUShader_getShader, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "setMask", (PyCFunction)FUShader_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUShader_methods.append(PyMethodDef { "getMask", (PyCFunction)FUShader_getMask, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "getNumShaders", (PyCFunction)FUShader_getNumShaders, METH_NOARGS, "" });
		PYFUShader_methods.append(PyMethodDef { "getShader", (PyCFunction)FUShader_getShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUShader_methods.append(PyMethodDef {});
		PYFUShader_getsets.reserve(PYFUShader_getsets.size() + 3);
		PYFUShader_getsets.append(PyGetSetDef { "mask", (getter)FUShader_get_mask, nullptr, "", nullptr });
		PYFUShader_getsets.append(PyGetSetDef { "num_shaders", (getter)FUShader_get_num_shaders, nullptr, "", nullptr });
		PYFUShader_getsets.append(PyGetSetDef {});
		PYFUShader_Type.tp_base = &PYShader_Type;
		PYFUShader_Type.tp_dealloc = (destructor)pyFUShader_dealloc;
		PYFUShader_number.nb_bool = (inquiry)pyFUShader_bool;
		PYFUShader_Type.tp_name = "tellusim.FUShader";
		PYFUShader_Type.tp_basicsize = sizeof(PYFUShader);
		PYFUShader_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUShader_Type.tp_doc = "";
		PYFUShader_Type.tp_str = (reprfunc)pyFUShader_str;
		PYFUShader_Type.tp_as_number = &PYFUShader_number;
		PYFUShader_Type.tp_methods = PYFUShader_methods.discard();
		PYFUShader_Type.tp_getset = PYFUShader_getsets.discard();
		PYFUShader_Type.tp_init = (initproc)pyFUShader_init;
		PYFUShader_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUShader_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUShader");
			return false;
		}
		Py_INCREF(&PYFUShader_Type);
		
		// Tellusim::Sampler
		PYSampler_methods.reserve(PYSampler_methods.size() + 45);
		PYSampler_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySampler_equalPtr, METH_VARARGS, "" });
		PYSampler_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySampler_clonePtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySampler_clearPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySampler_destroyPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySampler_acquirePtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySampler_unacquirePtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySampler_isValidPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySampler_isOwnerPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySampler_isConstPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySampler_getCountPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySampler_getInternalPtr, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Sampler_getPlatform, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Sampler_getPlatformName, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "getIndex", (PyCFunction)Sampler_getIndex, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "clear", (PyCFunction)Sampler_clear, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "isCreated", (PyCFunction)Sampler_isCreated, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "create", (PyCFunction)Sampler_create, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setParameters", (PyCFunction)Sampler_setParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "setFilter", (PyCFunction)Sampler_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getFilter", (PyCFunction)Sampler_getFilter, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "isPointFilter", (PyCFunction)Sampler_isPointFilter, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setAnisotropy", (PyCFunction)Sampler_setAnisotropy, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getAnisotropy", (PyCFunction)Sampler_getAnisotropy, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "hasAnisotropy", (PyCFunction)Sampler_hasAnisotropy, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setWrapMode", (PyCFunction)Sampler_setWrapMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "setWrapModeS", (PyCFunction)Sampler_setWrapModeS, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getWrapModeS", (PyCFunction)Sampler_getWrapModeS, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setWrapModeT", (PyCFunction)Sampler_setWrapModeT, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getWrapModeT", (PyCFunction)Sampler_getWrapModeT, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setWrapModeR", (PyCFunction)Sampler_setWrapModeR, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getWrapModeR", (PyCFunction)Sampler_getWrapModeR, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setLod", (PyCFunction)Sampler_setLod, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "setLodMin", (PyCFunction)Sampler_setLodMin, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getLodMin", (PyCFunction)Sampler_getLodMin, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setLodMax", (PyCFunction)Sampler_setLodMax, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getLodMax", (PyCFunction)Sampler_getLodMax, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setLodBias", (PyCFunction)Sampler_setLodBias, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getLodBias", (PyCFunction)Sampler_getLodBias, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setBorderColor", (PyCFunction)Sampler_setBorderColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getBorderColor", (PyCFunction)Sampler_getBorderColor, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setCompareFunc", (PyCFunction)Sampler_setCompareFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getCompareFunc", (PyCFunction)Sampler_getCompareFunc, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef { "setReductionMode", (PyCFunction)Sampler_setReductionMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYSampler_methods.append(PyMethodDef { "getReductionMode", (PyCFunction)Sampler_getReductionMode, METH_NOARGS, "" });
		PYSampler_methods.append(PyMethodDef {});
		PYSampler_getsets.reserve(PYSampler_getsets.size() + 15);
		PYSampler_getsets.append(PyGetSetDef { "platform", (getter)Sampler_get_platform, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "platform_name", (getter)Sampler_get_platform_name, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "index", (getter)Sampler_get_index, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "filter", (getter)Sampler_get_filter, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "anisotropy", (getter)Sampler_get_anisotropy, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "wrap_mode_s", (getter)Sampler_get_wrap_mode_s, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "wrap_mode_t", (getter)Sampler_get_wrap_mode_t, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "wrap_mode_r", (getter)Sampler_get_wrap_mode_r, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "lod_min", (getter)Sampler_get_lod_min, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "lod_max", (getter)Sampler_get_lod_max, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "lod_bias", (getter)Sampler_get_lod_bias, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "border_color", (getter)Sampler_get_border_color, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "compare_func", (getter)Sampler_get_compare_func, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef { "reduction_mode", (getter)Sampler_get_reduction_mode, nullptr, "", nullptr });
		PYSampler_getsets.append(PyGetSetDef {});
		PYSampler_Type.tp_dealloc = (destructor)pySampler_dealloc;
		PYSampler_number.nb_bool = (inquiry)pySampler_bool;
		PYSampler_Type.tp_name = "tellusim.Sampler";
		PYSampler_Type.tp_basicsize = sizeof(PYSampler);
		PYSampler_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYSampler_Type.tp_doc = "";
		PYSampler_Type.tp_str = (reprfunc)pySampler_str;
		PYSampler_Type.tp_as_number = &PYSampler_number;
		PYSampler_Type.tp_methods = PYSampler_methods.discard();
		PYSampler_Type.tp_getset = PYSampler_getsets.discard();
		PYSampler_Type.tp_init = (initproc)pySampler_init;
		PYSampler_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSampler_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Sampler");
			return false;
		}
		PyDict_SetItemString(PYSampler_Type.tp_dict, "FilterPoint", PyLong_FromLong(0));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "FilterLinear", PyLong_FromLong(1));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "FilterBipoint", PyLong_FromLong(2));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "FilterBilinear", PyLong_FromLong(3));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "FilterTrilinear", PyLong_FromLong(4));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "NumFilters", PyLong_FromLong(5));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "MinAnisotropy", PyLong_FromLong(1));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "MaxAnisotropy", PyLong_FromLong(16));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "WrapModeClamp", PyLong_FromLong(0));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "WrapModeRepeat", PyLong_FromLong(1));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "WrapModeMirror", PyLong_FromLong(2));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "WrapModeBorder", PyLong_FromLong(3));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "NumWrapModes", PyLong_FromLong(4));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncEqual", PyLong_FromLong(1));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncLess", PyLong_FromLong(2));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncGreater", PyLong_FromLong(3));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncNotEqual", PyLong_FromLong(4));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncLessEqual", PyLong_FromLong(5));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "CompareFuncGreaterEqual", PyLong_FromLong(6));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "NumCompareFunctions", PyLong_FromLong(7));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "ReductionModeAverage", PyLong_FromLong(0));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "ReductionModeMin", PyLong_FromLong(1));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "ReductionModeMax", PyLong_FromLong(2));
		PyDict_SetItemString(PYSampler_Type.tp_dict, "NumReductionModes", PyLong_FromLong(3));
		PyType_Modified(&PYSampler_Type);
		Py_INCREF(&PYSampler_Type);
		
		// Tellusim::MTLSampler
		PYMTLSampler_methods.reserve(PYMTLSampler_methods.size() + 15);
		PYMTLSampler_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLSampler_equalPtr, METH_VARARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLSampler_clonePtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLSampler_clearPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLSampler_destroyPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLSampler_acquirePtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLSampler_unacquirePtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLSampler_isValidPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLSampler_isOwnerPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLSampler_isConstPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLSampler_getCountPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLSampler_getInternalPtr, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "getSampler", (PyCFunction)pyMTLSampler_getSampler, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "setIndirect", (PyCFunction)MTLSampler_setIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLSampler_methods.append(PyMethodDef { "isIndirect", (PyCFunction)MTLSampler_isIndirect, METH_NOARGS, "" });
		PYMTLSampler_methods.append(PyMethodDef {});
		PYMTLSampler_getsets.reserve(PYMTLSampler_getsets.size() + 1);
		PYMTLSampler_getsets.append(PyGetSetDef {});
		PYMTLSampler_Type.tp_base = &PYSampler_Type;
		PYMTLSampler_Type.tp_dealloc = (destructor)pyMTLSampler_dealloc;
		PYMTLSampler_number.nb_bool = (inquiry)pyMTLSampler_bool;
		PYMTLSampler_Type.tp_name = "tellusim.MTLSampler";
		PYMTLSampler_Type.tp_basicsize = sizeof(PYMTLSampler);
		PYMTLSampler_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLSampler_Type.tp_doc = "";
		PYMTLSampler_Type.tp_str = (reprfunc)pyMTLSampler_str;
		PYMTLSampler_Type.tp_as_number = &PYMTLSampler_number;
		PYMTLSampler_Type.tp_methods = PYMTLSampler_methods.discard();
		PYMTLSampler_Type.tp_getset = PYMTLSampler_getsets.discard();
		PYMTLSampler_Type.tp_init = (initproc)pyMTLSampler_init;
		PYMTLSampler_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLSampler_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLSampler");
			return false;
		}
		Py_INCREF(&PYMTLSampler_Type);
		
		// Tellusim::FUSampler
		PYFUSampler_methods.reserve(PYFUSampler_methods.size() + 17);
		PYFUSampler_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUSampler_equalPtr, METH_VARARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUSampler_clonePtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUSampler_clearPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUSampler_destroyPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUSampler_acquirePtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUSampler_unacquirePtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUSampler_isValidPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUSampler_isOwnerPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUSampler_isConstPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUSampler_getCountPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUSampler_getInternalPtr, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getSampler", (PyCFunction)pyFUSampler_getSampler, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "setMask", (PyCFunction)FUSampler_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getMask", (PyCFunction)FUSampler_getMask, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getNumSamplers", (PyCFunction)FUSampler_getNumSamplers, METH_NOARGS, "" });
		PYFUSampler_methods.append(PyMethodDef { "getSampler", (PyCFunction)FUSampler_getSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUSampler_methods.append(PyMethodDef {});
		PYFUSampler_getsets.reserve(PYFUSampler_getsets.size() + 3);
		PYFUSampler_getsets.append(PyGetSetDef { "mask", (getter)FUSampler_get_mask, nullptr, "", nullptr });
		PYFUSampler_getsets.append(PyGetSetDef { "num_samplers", (getter)FUSampler_get_num_samplers, nullptr, "", nullptr });
		PYFUSampler_getsets.append(PyGetSetDef {});
		PYFUSampler_Type.tp_base = &PYSampler_Type;
		PYFUSampler_Type.tp_dealloc = (destructor)pyFUSampler_dealloc;
		PYFUSampler_number.nb_bool = (inquiry)pyFUSampler_bool;
		PYFUSampler_Type.tp_name = "tellusim.FUSampler";
		PYFUSampler_Type.tp_basicsize = sizeof(PYFUSampler);
		PYFUSampler_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUSampler_Type.tp_doc = "";
		PYFUSampler_Type.tp_str = (reprfunc)pyFUSampler_str;
		PYFUSampler_Type.tp_as_number = &PYFUSampler_number;
		PYFUSampler_Type.tp_methods = PYFUSampler_methods.discard();
		PYFUSampler_Type.tp_getset = PYFUSampler_getsets.discard();
		PYFUSampler_Type.tp_init = (initproc)pyFUSampler_init;
		PYFUSampler_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUSampler_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUSampler");
			return false;
		}
		Py_INCREF(&PYFUSampler_Type);
		
		// Tellusim::Texture
		PYTexture_methods.reserve(PYTexture_methods.size() + 93);
		PYTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTexture_equalPtr, METH_VARARGS, "" });
		PYTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTexture_clonePtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTexture_clearPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTexture_destroyPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTexture_acquirePtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTexture_unacquirePtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTexture_isValidPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTexture_isOwnerPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTexture_isConstPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTexture_getCountPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTexture_getInternalPtr, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Texture_getPlatform, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Texture_getPlatformName, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getIndex", (PyCFunction)Texture_getIndex, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "clear", (PyCFunction)Texture_clear, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isCreated", (PyCFunction)Texture_isCreated, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "setName", (PyCFunction)Texture_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getName", (PyCFunction)Texture_getName, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "create", (PyCFunction)Texture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "create2D", (PyCFunction)Texture_create2D, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "create3D", (PyCFunction)Texture_create3D, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "createCube", (PyCFunction)Texture_createCube, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getType", (PyCFunction)Texture_getType, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Texture_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "is2DType", (PyCFunction)Texture_is2DType, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "is3DType", (PyCFunction)Texture_is3DType, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isCubeType", (PyCFunction)Texture_isCubeType, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getFormat", (PyCFunction)Texture_getFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getFormatName", (PyCFunction)Texture_getFormatName, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isColorFormat", (PyCFunction)Texture_isColorFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isDepthFormat", (PyCFunction)Texture_isDepthFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isPixelFormat", (PyCFunction)Texture_isPixelFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isPlainFormat", (PyCFunction)Texture_isPlainFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isMixedFormat", (PyCFunction)Texture_isMixedFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isBlockFormat", (PyCFunction)Texture_isBlockFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isStencilFormat", (PyCFunction)Texture_isStencilFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isNormFormat", (PyCFunction)Texture_isNormFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isSRGBFormat", (PyCFunction)Texture_isSRGBFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isFloatFormat", (PyCFunction)Texture_isFloatFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isSignedFormat", (PyCFunction)Texture_isSignedFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isUnsignedFormat", (PyCFunction)Texture_isUnsignedFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isIntegerFormat", (PyCFunction)Texture_isIntegerFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isi8Format", (PyCFunction)Texture_isi8Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isu8Format", (PyCFunction)Texture_isu8Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "is8BitFormat", (PyCFunction)Texture_is8BitFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isi16Format", (PyCFunction)Texture_isi16Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isu16Format", (PyCFunction)Texture_isu16Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isf16Format", (PyCFunction)Texture_isf16Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "is16BitFormat", (PyCFunction)Texture_is16BitFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isi32Format", (PyCFunction)Texture_isi32Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isu32Format", (PyCFunction)Texture_isu32Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isf32Format", (PyCFunction)Texture_isf32Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "is32BitFormat", (PyCFunction)Texture_is32BitFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isi64Format", (PyCFunction)Texture_isi64Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isu64Format", (PyCFunction)Texture_isu64Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isf64Format", (PyCFunction)Texture_isf64Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "is64BitFormat", (PyCFunction)Texture_is64BitFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isBC15Format", (PyCFunction)Texture_isBC15Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isBC67Format", (PyCFunction)Texture_isBC67Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isETC2Format", (PyCFunction)Texture_isETC2Format, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "isASTCFormat", (PyCFunction)Texture_isASTCFormat, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getComponents", (PyCFunction)Texture_getComponents, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getPixelSize", (PyCFunction)Texture_getPixelSize, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getBlockSize", (PyCFunction)Texture_getBlockSize, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getBlockWidth", (PyCFunction)Texture_getBlockWidth, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getBlockHeight", (PyCFunction)Texture_getBlockHeight, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getFlags", (PyCFunction)Texture_getFlags, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "hasFlag", (PyCFunction)Texture_hasFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "hasFlags", (PyCFunction)Texture_hasFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getFlagsName", (PyCFunction)Texture_getFlagsName, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Texture_getMultisample, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "hasMultisample", (PyCFunction)Texture_hasMultisample, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getWidth", (PyCFunction)Texture_getWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getHeight", (PyCFunction)Texture_getHeight, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getDepth", (PyCFunction)Texture_getDepth, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getFaces", (PyCFunction)Texture_getFaces, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getLayers", (PyCFunction)Texture_getLayers, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getMipmaps", (PyCFunction)Texture_getMipmaps, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "findMipmap", (PyCFunction)Texture_findMipmap, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "hasFaces", (PyCFunction)Texture_hasFaces, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "hasLayers", (PyCFunction)Texture_hasLayers, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "hasMipmaps", (PyCFunction)Texture_hasMipmaps, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getSize", (PyCFunction)Texture_getSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getRegion", (PyCFunction)Texture_getRegion, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getSlice", (PyCFunction)Texture_getSlice, METH_VARARGS | METH_KEYWORDS, "" });
		PYTexture_methods.append(PyMethodDef { "getTileWidth", (PyCFunction)Texture_getTileWidth, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getTileHeight", (PyCFunction)Texture_getTileHeight, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getTileDepth", (PyCFunction)Texture_getTileDepth, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getTileMipmaps", (PyCFunction)Texture_getTileMipmaps, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getTileSize", (PyCFunction)Texture_getTileSize, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getDescription", (PyCFunction)Texture_getDescription, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef { "getMemory", (PyCFunction)Texture_getMemory, METH_NOARGS, "" });
		PYTexture_methods.append(PyMethodDef {});
		PYTexture_getsets.reserve(PYTexture_getsets.size() + 32);
		PYTexture_getsets.append(PyGetSetDef { "platform", (getter)Texture_get_platform, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "platform_name", (getter)Texture_get_platform_name, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "index", (getter)Texture_get_index, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "name", (getter)Texture_get_name, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "type", (getter)Texture_get_type, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "format", (getter)Texture_get_format, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "format_name", (getter)Texture_get_format_name, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "components", (getter)Texture_get_components, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "pixel_size", (getter)Texture_get_pixel_size, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "block_size", (getter)Texture_get_block_size, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "block_width", (getter)Texture_get_block_width, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "block_height", (getter)Texture_get_block_height, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "flags", (getter)Texture_get_flags, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "flags_name", (getter)Texture_get_flags_name, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "multisample", (getter)Texture_get_multisample, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "width", (getter)Texture_get_width, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "height", (getter)Texture_get_height, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "depth", (getter)Texture_get_depth, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "faces", (getter)Texture_get_faces, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "layers", (getter)Texture_get_layers, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "mipmaps", (getter)Texture_get_mipmaps, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "size", (getter)Texture_get_size, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "region", (getter)Texture_get_region, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "slice", (getter)Texture_get_slice, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "tile_width", (getter)Texture_get_tile_width, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "tile_height", (getter)Texture_get_tile_height, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "tile_depth", (getter)Texture_get_tile_depth, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "tile_mipmaps", (getter)Texture_get_tile_mipmaps, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "tile_size", (getter)Texture_get_tile_size, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "description", (getter)Texture_get_description, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef { "memory", (getter)Texture_get_memory, nullptr, "", nullptr });
		PYTexture_getsets.append(PyGetSetDef {});
		PYTexture_Type.tp_dealloc = (destructor)pyTexture_dealloc;
		PYTexture_number.nb_bool = (inquiry)pyTexture_bool;
		PYTexture_Type.tp_name = "tellusim.Texture";
		PYTexture_Type.tp_basicsize = sizeof(PYTexture);
		PYTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYTexture_Type.tp_doc = "";
		PYTexture_Type.tp_str = (reprfunc)pyTexture_str;
		PYTexture_Type.tp_as_number = &PYTexture_number;
		PYTexture_Type.tp_methods = PYTexture_methods.discard();
		PYTexture_Type.tp_getset = PYTexture_getsets.discard();
		PYTexture_Type.tp_init = (initproc)pyTexture_init;
		PYTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Texture");
			return false;
		}
		PyDict_SetItemString(PYTexture_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "Type2D", PyLong_FromLong(1));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "Type3D", PyLong_FromLong(2));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "TypeCube", PyLong_FromLong(3));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "NumTypes", PyLong_FromLong(4));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagRead", PyLong_FromLong(1));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagWrite", PyLong_FromLong(2));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagTarget", PyLong_FromLong(4));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagBuffer", PyLong_FromLong(8));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagSource", PyLong_FromLong(16));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagSparse", PyLong_FromLong(32));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagShared", PyLong_FromLong(64));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagExtern", PyLong_FromLong(128));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagInterop", PyLong_FromLong(256));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagSurface", PyLong_FromLong(512));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMutable", PyLong_FromLong(1024));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMipmaps", PyLong_FromLong(2048));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagGenerate", PyLong_FromLong(4096));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagFormatNorm", PyLong_FromLong(8192));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagFormatSRGB", PyLong_FromLong(16384));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagFormatSigned", PyLong_FromLong(32768));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMultisample2", PyLong_FromLong(65536));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMultisample4", PyLong_FromLong(131072));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMultisample8", PyLong_FromLong(262144));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagClearOne", PyLong_FromLong(524288));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagClearZero", PyLong_FromLong(1048576));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagClearNormal", PyLong_FromLong(2097152));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "FlagMultisample", PyLong_FromLong(458752));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYTexture_Type.tp_dict, "NumFlags", PyLong_FromLong(22));
		PyType_Modified(&PYTexture_Type);
		Py_INCREF(&PYTexture_Type);
		
		// Tellusim::TextureTable
		PYTextureTable_methods.reserve(PYTextureTable_methods.size() + 26);
		PYTextureTable_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTextureTable_equalPtr, METH_VARARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTextureTable_clonePtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTextureTable_clearPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTextureTable_destroyPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTextureTable_acquirePtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTextureTable_unacquirePtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTextureTable_isValidPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTextureTable_isOwnerPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTextureTable_isConstPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTextureTable_getCountPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTextureTable_getInternalPtr, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getPlatform", (PyCFunction)TextureTable_getPlatform, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)TextureTable_getPlatformName, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getIndex", (PyCFunction)TextureTable_getIndex, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "clear", (PyCFunction)TextureTable_clear, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "isCreated", (PyCFunction)TextureTable_isCreated, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "setName", (PyCFunction)TextureTable_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getName", (PyCFunction)TextureTable_getName, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "create", (PyCFunction)TextureTable_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getType", (PyCFunction)TextureTable_getType, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getTypeName", (PyCFunction)TextureTable_getTypeName, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getSize", (PyCFunction)TextureTable_getSize, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef { "get", (PyCFunction)TextureTable_get, METH_VARARGS | METH_KEYWORDS, "" });
		PYTextureTable_methods.append(PyMethodDef { "isOwner", (PyCFunction)TextureTable_isOwner, METH_VARARGS | METH_KEYWORDS, "" });
		PYTextureTable_methods.append(PyMethodDef { "getMemory", (PyCFunction)TextureTable_getMemory, METH_NOARGS, "" });
		PYTextureTable_methods.append(PyMethodDef {});
		PYTextureTable_getsets.reserve(PYTextureTable_getsets.size() + 9);
		PYTextureTable_getsets.append(PyGetSetDef { "platform", (getter)TextureTable_get_platform, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "platform_name", (getter)TextureTable_get_platform_name, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "index", (getter)TextureTable_get_index, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "name", (getter)TextureTable_get_name, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "type", (getter)TextureTable_get_type, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "type_name", (getter)TextureTable_get_type_name, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "size", (getter)TextureTable_get_size, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef { "memory", (getter)TextureTable_get_memory, nullptr, "", nullptr });
		PYTextureTable_getsets.append(PyGetSetDef {});
		PYTextureTable_Type.tp_dealloc = (destructor)pyTextureTable_dealloc;
		PYTextureTable_number.nb_bool = (inquiry)pyTextureTable_bool;
		PYTextureTable_Type.tp_name = "tellusim.TextureTable";
		PYTextureTable_Type.tp_basicsize = sizeof(PYTextureTable);
		PYTextureTable_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYTextureTable_Type.tp_doc = "";
		PYTextureTable_Type.tp_str = (reprfunc)pyTextureTable_str;
		PYTextureTable_Type.tp_as_number = &PYTextureTable_number;
		PYTextureTable_Type.tp_methods = PYTextureTable_methods.discard();
		PYTextureTable_Type.tp_getset = PYTextureTable_getsets.discard();
		PYTextureTable_Type.tp_init = (initproc)pyTextureTable_init;
		PYTextureTable_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTextureTable_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "TextureTable");
			return false;
		}
		Py_INCREF(&PYTextureTable_Type);
		
		// Tellusim::D3D12Texture
		PYD3D12Texture_methods.reserve(PYD3D12Texture_methods.size() + 24);
		PYD3D12Texture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Texture_equalPtr, METH_VARARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Texture_clonePtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Texture_clearPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Texture_destroyPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Texture_acquirePtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Texture_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Texture_isValidPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Texture_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Texture_isConstPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Texture_getCountPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Texture_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyD3D12Texture_getTexture, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "create", (PyCFunction)D3D12Texture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getDXGIFormat", (PyCFunction)D3D12Texture_getDXGIFormat, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getD3D12Texture", (PyCFunction)D3D12Texture_getD3D12Texture, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getShaderResourceView", (PyCFunction)D3D12Texture_getShaderResourceView, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getRenderTargetView", (PyCFunction)D3D12Texture_getRenderTargetView, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D12Texture_getDepthStencilView, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getUnorderedAccessView", (PyCFunction)D3D12Texture_getUnorderedAccessView, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "setTextureState", (PyCFunction)D3D12Texture_setTextureState, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getTextureState", (PyCFunction)D3D12Texture_getTextureState, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getSharedHandle", (PyCFunction)D3D12Texture_getSharedHandle, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)D3D12Texture_getInteropHandle, METH_NOARGS, "" });
		PYD3D12Texture_methods.append(PyMethodDef {});
		PYD3D12Texture_getsets.reserve(PYD3D12Texture_getsets.size() + 10);
		PYD3D12Texture_getsets.append(PyGetSetDef { "dxgi_format", (getter)D3D12Texture_get_dxgi_format, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "d3d12_texture", (getter)D3D12Texture_get_d3d12_texture, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "shader_resource_view", (getter)D3D12Texture_get_shader_resource_view, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "render_target_view", (getter)D3D12Texture_get_render_target_view, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D12Texture_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "unordered_access_view", (getter)D3D12Texture_get_unordered_access_view, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "texture_state", (getter)D3D12Texture_get_texture_state, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "shared_handle", (getter)D3D12Texture_get_shared_handle, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef { "interop_handle", (getter)D3D12Texture_get_interop_handle, nullptr, "", nullptr });
		PYD3D12Texture_getsets.append(PyGetSetDef {});
		PYD3D12Texture_Type.tp_base = &PYTexture_Type;
		PYD3D12Texture_Type.tp_dealloc = (destructor)pyD3D12Texture_dealloc;
		PYD3D12Texture_number.nb_bool = (inquiry)pyD3D12Texture_bool;
		PYD3D12Texture_Type.tp_name = "tellusim.D3D12Texture";
		PYD3D12Texture_Type.tp_basicsize = sizeof(PYD3D12Texture);
		PYD3D12Texture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Texture_Type.tp_doc = "";
		PYD3D12Texture_Type.tp_str = (reprfunc)pyD3D12Texture_str;
		PYD3D12Texture_Type.tp_as_number = &PYD3D12Texture_number;
		PYD3D12Texture_Type.tp_methods = PYD3D12Texture_methods.discard();
		PYD3D12Texture_Type.tp_getset = PYD3D12Texture_getsets.discard();
		PYD3D12Texture_Type.tp_init = (initproc)pyD3D12Texture_init;
		PYD3D12Texture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Texture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Texture");
			return false;
		}
		Py_INCREF(&PYD3D12Texture_Type);
		
		// Tellusim::D3D11Texture
		PYD3D11Texture_methods.reserve(PYD3D11Texture_methods.size() + 21);
		PYD3D11Texture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Texture_equalPtr, METH_VARARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Texture_clonePtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Texture_clearPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Texture_destroyPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Texture_acquirePtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Texture_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Texture_isValidPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Texture_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Texture_isConstPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Texture_getCountPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Texture_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyD3D11Texture_getTexture, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "create", (PyCFunction)D3D11Texture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getDXGIFormat", (PyCFunction)D3D11Texture_getDXGIFormat, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getD3D11Texture", (PyCFunction)D3D11Texture_getD3D11Texture, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getShaderResourceView", (PyCFunction)D3D11Texture_getShaderResourceView, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getRenderTargetView", (PyCFunction)D3D11Texture_getRenderTargetView, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D11Texture_getDepthStencilView, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getUnorderedAccessView", (PyCFunction)D3D11Texture_getUnorderedAccessView, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)D3D11Texture_getInteropHandle, METH_NOARGS, "" });
		PYD3D11Texture_methods.append(PyMethodDef {});
		PYD3D11Texture_getsets.reserve(PYD3D11Texture_getsets.size() + 8);
		PYD3D11Texture_getsets.append(PyGetSetDef { "dxgi_format", (getter)D3D11Texture_get_dxgi_format, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "d3d11_texture", (getter)D3D11Texture_get_d3d11_texture, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "shader_resource_view", (getter)D3D11Texture_get_shader_resource_view, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "render_target_view", (getter)D3D11Texture_get_render_target_view, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D11Texture_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "unordered_access_view", (getter)D3D11Texture_get_unordered_access_view, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef { "interop_handle", (getter)D3D11Texture_get_interop_handle, nullptr, "", nullptr });
		PYD3D11Texture_getsets.append(PyGetSetDef {});
		PYD3D11Texture_Type.tp_base = &PYTexture_Type;
		PYD3D11Texture_Type.tp_dealloc = (destructor)pyD3D11Texture_dealloc;
		PYD3D11Texture_number.nb_bool = (inquiry)pyD3D11Texture_bool;
		PYD3D11Texture_Type.tp_name = "tellusim.D3D11Texture";
		PYD3D11Texture_Type.tp_basicsize = sizeof(PYD3D11Texture);
		PYD3D11Texture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Texture_Type.tp_doc = "";
		PYD3D11Texture_Type.tp_str = (reprfunc)pyD3D11Texture_str;
		PYD3D11Texture_Type.tp_as_number = &PYD3D11Texture_number;
		PYD3D11Texture_Type.tp_methods = PYD3D11Texture_methods.discard();
		PYD3D11Texture_Type.tp_getset = PYD3D11Texture_getsets.discard();
		PYD3D11Texture_Type.tp_init = (initproc)pyD3D11Texture_init;
		PYD3D11Texture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Texture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Texture");
			return false;
		}
		Py_INCREF(&PYD3D11Texture_Type);
		
		// Tellusim::MTLTexture
		PYMTLTexture_methods.reserve(PYMTLTexture_methods.size() + 19);
		PYMTLTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLTexture_equalPtr, METH_VARARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLTexture_clonePtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLTexture_clearPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLTexture_destroyPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLTexture_acquirePtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLTexture_unacquirePtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLTexture_isValidPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLTexture_isOwnerPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLTexture_isConstPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLTexture_getCountPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLTexture_getInternalPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyMTLTexture_getTexture, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "create", (PyCFunction)MTLTexture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getPixelFormat", (PyCFunction)MTLTexture_getPixelFormat, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getTextureType", (PyCFunction)MTLTexture_getTextureType, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getMTLTexture", (PyCFunction)MTLTexture_getMTLTexture, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getMTLBuffer", (PyCFunction)MTLTexture_getMTLBuffer, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef { "getSharedPtr", (PyCFunction)MTLTexture_getSharedPtr, METH_NOARGS, "" });
		PYMTLTexture_methods.append(PyMethodDef {});
		PYMTLTexture_getsets.reserve(PYMTLTexture_getsets.size() + 6);
		PYMTLTexture_getsets.append(PyGetSetDef { "pixel_format", (getter)MTLTexture_get_pixel_format, nullptr, "", nullptr });
		PYMTLTexture_getsets.append(PyGetSetDef { "texture_type", (getter)MTLTexture_get_texture_type, nullptr, "", nullptr });
		PYMTLTexture_getsets.append(PyGetSetDef { "mtl_texture", (getter)MTLTexture_get_mtl_texture, nullptr, "", nullptr });
		PYMTLTexture_getsets.append(PyGetSetDef { "mtl_buffer", (getter)MTLTexture_get_mtl_buffer, nullptr, "", nullptr });
		PYMTLTexture_getsets.append(PyGetSetDef { "shared_ptr", (getter)MTLTexture_get_shared_ptr, nullptr, "", nullptr });
		PYMTLTexture_getsets.append(PyGetSetDef {});
		PYMTLTexture_Type.tp_base = &PYTexture_Type;
		PYMTLTexture_Type.tp_dealloc = (destructor)pyMTLTexture_dealloc;
		PYMTLTexture_number.nb_bool = (inquiry)pyMTLTexture_bool;
		PYMTLTexture_Type.tp_name = "tellusim.MTLTexture";
		PYMTLTexture_Type.tp_basicsize = sizeof(PYMTLTexture);
		PYMTLTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLTexture_Type.tp_doc = "";
		PYMTLTexture_Type.tp_str = (reprfunc)pyMTLTexture_str;
		PYMTLTexture_Type.tp_as_number = &PYMTLTexture_number;
		PYMTLTexture_Type.tp_methods = PYMTLTexture_methods.discard();
		PYMTLTexture_Type.tp_getset = PYMTLTexture_getsets.discard();
		PYMTLTexture_Type.tp_init = (initproc)pyMTLTexture_init;
		PYMTLTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLTexture");
			return false;
		}
		Py_INCREF(&PYMTLTexture_Type);
		
		// Tellusim::VKTexture
		PYVKTexture_methods.reserve(PYVKTexture_methods.size() + 22);
		PYVKTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKTexture_equalPtr, METH_VARARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKTexture_clonePtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKTexture_clearPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKTexture_destroyPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKTexture_acquirePtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKTexture_unacquirePtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKTexture_isValidPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKTexture_isOwnerPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKTexture_isConstPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKTexture_getCountPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKTexture_getInternalPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyVKTexture_getTexture, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "create", (PyCFunction)VKTexture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getPixelFormat", (PyCFunction)VKTexture_getPixelFormat, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getVKTexture", (PyCFunction)VKTexture_getVKTexture, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getTextureView", (PyCFunction)VKTexture_getTextureView, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "setTextureLayout", (PyCFunction)VKTexture_setTextureLayout, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getTextureLayout", (PyCFunction)VKTexture_getTextureLayout, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getTextureRange", (PyCFunction)VKTexture_getTextureRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getSharedPtr", (PyCFunction)VKTexture_getSharedPtr, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef { "getInteropHandle", (PyCFunction)VKTexture_getInteropHandle, METH_NOARGS, "" });
		PYVKTexture_methods.append(PyMethodDef {});
		PYVKTexture_getsets.reserve(PYVKTexture_getsets.size() + 7);
		PYVKTexture_getsets.append(PyGetSetDef { "pixel_format", (getter)VKTexture_get_pixel_format, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef { "vk_texture", (getter)VKTexture_get_vk_texture, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef { "texture_view", (getter)VKTexture_get_texture_view, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef { "texture_layout", (getter)VKTexture_get_texture_layout, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef { "shared_ptr", (getter)VKTexture_get_shared_ptr, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef { "interop_handle", (getter)VKTexture_get_interop_handle, nullptr, "", nullptr });
		PYVKTexture_getsets.append(PyGetSetDef {});
		PYVKTexture_Type.tp_base = &PYTexture_Type;
		PYVKTexture_Type.tp_dealloc = (destructor)pyVKTexture_dealloc;
		PYVKTexture_number.nb_bool = (inquiry)pyVKTexture_bool;
		PYVKTexture_Type.tp_name = "tellusim.VKTexture";
		PYVKTexture_Type.tp_basicsize = sizeof(PYVKTexture);
		PYVKTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKTexture_Type.tp_doc = "";
		PYVKTexture_Type.tp_str = (reprfunc)pyVKTexture_str;
		PYVKTexture_Type.tp_as_number = &PYVKTexture_number;
		PYVKTexture_Type.tp_methods = PYVKTexture_methods.discard();
		PYVKTexture_Type.tp_getset = PYVKTexture_getsets.discard();
		PYVKTexture_Type.tp_init = (initproc)pyVKTexture_init;
		PYVKTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKTexture");
			return false;
		}
		Py_INCREF(&PYVKTexture_Type);
		
		// Tellusim::GLTexture
		PYGLTexture_methods.reserve(PYGLTexture_methods.size() + 17);
		PYGLTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLTexture_equalPtr, METH_VARARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLTexture_clonePtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLTexture_clearPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLTexture_destroyPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLTexture_acquirePtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLTexture_unacquirePtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLTexture_isValidPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLTexture_isOwnerPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLTexture_isConstPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLTexture_getCountPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLTexture_getInternalPtr, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyGLTexture_getTexture, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "create", (PyCFunction)GLTexture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getTarget", (PyCFunction)GLTexture_getTarget, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getInternalFormat", (PyCFunction)GLTexture_getInternalFormat, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef { "getTextureID", (PyCFunction)GLTexture_getTextureID, METH_NOARGS, "" });
		PYGLTexture_methods.append(PyMethodDef {});
		PYGLTexture_getsets.reserve(PYGLTexture_getsets.size() + 4);
		PYGLTexture_getsets.append(PyGetSetDef { "target", (getter)GLTexture_get_target, nullptr, "", nullptr });
		PYGLTexture_getsets.append(PyGetSetDef { "internal_format", (getter)GLTexture_get_internal_format, nullptr, "", nullptr });
		PYGLTexture_getsets.append(PyGetSetDef { "texture_id", (getter)GLTexture_get_texture_id, nullptr, "", nullptr });
		PYGLTexture_getsets.append(PyGetSetDef {});
		PYGLTexture_Type.tp_base = &PYTexture_Type;
		PYGLTexture_Type.tp_dealloc = (destructor)pyGLTexture_dealloc;
		PYGLTexture_number.nb_bool = (inquiry)pyGLTexture_bool;
		PYGLTexture_Type.tp_name = "tellusim.GLTexture";
		PYGLTexture_Type.tp_basicsize = sizeof(PYGLTexture);
		PYGLTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLTexture_Type.tp_doc = "";
		PYGLTexture_Type.tp_str = (reprfunc)pyGLTexture_str;
		PYGLTexture_Type.tp_as_number = &PYGLTexture_number;
		PYGLTexture_Type.tp_methods = PYGLTexture_methods.discard();
		PYGLTexture_Type.tp_getset = PYGLTexture_getsets.discard();
		PYGLTexture_Type.tp_init = (initproc)pyGLTexture_init;
		PYGLTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLTexture");
			return false;
		}
		Py_INCREF(&PYGLTexture_Type);
		
		// Tellusim::GLESTexture
		PYGLESTexture_methods.reserve(PYGLESTexture_methods.size() + 17);
		PYGLESTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESTexture_equalPtr, METH_VARARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESTexture_clonePtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESTexture_clearPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESTexture_destroyPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESTexture_acquirePtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESTexture_unacquirePtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESTexture_isValidPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESTexture_isOwnerPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESTexture_isConstPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESTexture_getCountPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESTexture_getInternalPtr, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyGLESTexture_getTexture, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "create", (PyCFunction)GLESTexture_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getTarget", (PyCFunction)GLESTexture_getTarget, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getInternalFormat", (PyCFunction)GLESTexture_getInternalFormat, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef { "getTextureID", (PyCFunction)GLESTexture_getTextureID, METH_NOARGS, "" });
		PYGLESTexture_methods.append(PyMethodDef {});
		PYGLESTexture_getsets.reserve(PYGLESTexture_getsets.size() + 4);
		PYGLESTexture_getsets.append(PyGetSetDef { "target", (getter)GLESTexture_get_target, nullptr, "", nullptr });
		PYGLESTexture_getsets.append(PyGetSetDef { "internal_format", (getter)GLESTexture_get_internal_format, nullptr, "", nullptr });
		PYGLESTexture_getsets.append(PyGetSetDef { "texture_id", (getter)GLESTexture_get_texture_id, nullptr, "", nullptr });
		PYGLESTexture_getsets.append(PyGetSetDef {});
		PYGLESTexture_Type.tp_base = &PYTexture_Type;
		PYGLESTexture_Type.tp_dealloc = (destructor)pyGLESTexture_dealloc;
		PYGLESTexture_number.nb_bool = (inquiry)pyGLESTexture_bool;
		PYGLESTexture_Type.tp_name = "tellusim.GLESTexture";
		PYGLESTexture_Type.tp_basicsize = sizeof(PYGLESTexture);
		PYGLESTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESTexture_Type.tp_doc = "";
		PYGLESTexture_Type.tp_str = (reprfunc)pyGLESTexture_str;
		PYGLESTexture_Type.tp_as_number = &PYGLESTexture_number;
		PYGLESTexture_Type.tp_methods = PYGLESTexture_methods.discard();
		PYGLESTexture_Type.tp_getset = PYGLESTexture_getsets.discard();
		PYGLESTexture_Type.tp_init = (initproc)pyGLESTexture_init;
		PYGLESTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESTexture");
			return false;
		}
		Py_INCREF(&PYGLESTexture_Type);
		
		// Tellusim::CUTexture
		PYCUTexture_methods.reserve(PYCUTexture_methods.size() + 17);
		PYCUTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCUTexture_equalPtr, METH_VARARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCUTexture_clonePtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCUTexture_clearPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCUTexture_destroyPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCUTexture_acquirePtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCUTexture_unacquirePtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCUTexture_isValidPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCUTexture_isOwnerPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCUTexture_isConstPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCUTexture_getCountPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCUTexture_getInternalPtr, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyCUTexture_getTexture, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getTextureLevel", (PyCFunction)CUTexture_getTextureLevel, METH_VARARGS | METH_KEYWORDS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getArrayFormat", (PyCFunction)CUTexture_getArrayFormat, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getArrayChannels", (PyCFunction)CUTexture_getArrayChannels, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef { "getSharedMemory", (PyCFunction)CUTexture_getSharedMemory, METH_NOARGS, "" });
		PYCUTexture_methods.append(PyMethodDef {});
		PYCUTexture_getsets.reserve(PYCUTexture_getsets.size() + 4);
		PYCUTexture_getsets.append(PyGetSetDef { "array_format", (getter)CUTexture_get_array_format, nullptr, "", nullptr });
		PYCUTexture_getsets.append(PyGetSetDef { "array_channels", (getter)CUTexture_get_array_channels, nullptr, "", nullptr });
		PYCUTexture_getsets.append(PyGetSetDef { "shared_memory", (getter)CUTexture_get_shared_memory, nullptr, "", nullptr });
		PYCUTexture_getsets.append(PyGetSetDef {});
		PYCUTexture_Type.tp_base = &PYTexture_Type;
		PYCUTexture_Type.tp_dealloc = (destructor)pyCUTexture_dealloc;
		PYCUTexture_number.nb_bool = (inquiry)pyCUTexture_bool;
		PYCUTexture_Type.tp_name = "tellusim.CUTexture";
		PYCUTexture_Type.tp_basicsize = sizeof(PYCUTexture);
		PYCUTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCUTexture_Type.tp_doc = "";
		PYCUTexture_Type.tp_str = (reprfunc)pyCUTexture_str;
		PYCUTexture_Type.tp_as_number = &PYCUTexture_number;
		PYCUTexture_Type.tp_methods = PYCUTexture_methods.discard();
		PYCUTexture_Type.tp_getset = PYCUTexture_getsets.discard();
		PYCUTexture_Type.tp_init = (initproc)pyCUTexture_init;
		PYCUTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCUTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CUTexture");
			return false;
		}
		Py_INCREF(&PYCUTexture_Type);
		
		// Tellusim::HIPTexture
		PYHIPTexture_methods.reserve(PYHIPTexture_methods.size() + 16);
		PYHIPTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyHIPTexture_equalPtr, METH_VARARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyHIPTexture_clonePtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyHIPTexture_clearPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyHIPTexture_destroyPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyHIPTexture_acquirePtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyHIPTexture_unacquirePtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyHIPTexture_isValidPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyHIPTexture_isOwnerPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyHIPTexture_isConstPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyHIPTexture_getCountPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyHIPTexture_getInternalPtr, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyHIPTexture_getTexture, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getTextureArray", (PyCFunction)HIPTexture_getTextureArray, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getTextureLevel", (PyCFunction)HIPTexture_getTextureLevel, METH_VARARGS | METH_KEYWORDS, "" });
		PYHIPTexture_methods.append(PyMethodDef { "getChannelFormat", (PyCFunction)HIPTexture_getChannelFormat, METH_NOARGS, "" });
		PYHIPTexture_methods.append(PyMethodDef {});
		PYHIPTexture_getsets.reserve(PYHIPTexture_getsets.size() + 3);
		PYHIPTexture_getsets.append(PyGetSetDef { "texture_array", (getter)HIPTexture_get_texture_array, nullptr, "", nullptr });
		PYHIPTexture_getsets.append(PyGetSetDef { "channel_format", (getter)HIPTexture_get_channel_format, nullptr, "", nullptr });
		PYHIPTexture_getsets.append(PyGetSetDef {});
		PYHIPTexture_Type.tp_base = &PYTexture_Type;
		PYHIPTexture_Type.tp_dealloc = (destructor)pyHIPTexture_dealloc;
		PYHIPTexture_number.nb_bool = (inquiry)pyHIPTexture_bool;
		PYHIPTexture_Type.tp_name = "tellusim.HIPTexture";
		PYHIPTexture_Type.tp_basicsize = sizeof(PYHIPTexture);
		PYHIPTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYHIPTexture_Type.tp_doc = "";
		PYHIPTexture_Type.tp_str = (reprfunc)pyHIPTexture_str;
		PYHIPTexture_Type.tp_as_number = &PYHIPTexture_number;
		PYHIPTexture_Type.tp_methods = PYHIPTexture_methods.discard();
		PYHIPTexture_Type.tp_getset = PYHIPTexture_getsets.discard();
		PYHIPTexture_Type.tp_init = (initproc)pyHIPTexture_init;
		PYHIPTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYHIPTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "HIPTexture");
			return false;
		}
		Py_INCREF(&PYHIPTexture_Type);
		
		// Tellusim::FUTexture
		PYFUTexture_methods.reserve(PYFUTexture_methods.size() + 17);
		PYFUTexture_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUTexture_equalPtr, METH_VARARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUTexture_clonePtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUTexture_clearPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUTexture_destroyPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUTexture_acquirePtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUTexture_unacquirePtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUTexture_isValidPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUTexture_isOwnerPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUTexture_isConstPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUTexture_getCountPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUTexture_getInternalPtr, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)pyFUTexture_getTexture, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "setMask", (PyCFunction)FUTexture_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getMask", (PyCFunction)FUTexture_getMask, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getNumTextures", (PyCFunction)FUTexture_getNumTextures, METH_NOARGS, "" });
		PYFUTexture_methods.append(PyMethodDef { "getTexture", (PyCFunction)FUTexture_getTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTexture_methods.append(PyMethodDef {});
		PYFUTexture_getsets.reserve(PYFUTexture_getsets.size() + 3);
		PYFUTexture_getsets.append(PyGetSetDef { "mask", (getter)FUTexture_get_mask, nullptr, "", nullptr });
		PYFUTexture_getsets.append(PyGetSetDef { "num_textures", (getter)FUTexture_get_num_textures, nullptr, "", nullptr });
		PYFUTexture_getsets.append(PyGetSetDef {});
		PYFUTexture_Type.tp_base = &PYTexture_Type;
		PYFUTexture_Type.tp_dealloc = (destructor)pyFUTexture_dealloc;
		PYFUTexture_number.nb_bool = (inquiry)pyFUTexture_bool;
		PYFUTexture_Type.tp_name = "tellusim.FUTexture";
		PYFUTexture_Type.tp_basicsize = sizeof(PYFUTexture);
		PYFUTexture_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUTexture_Type.tp_doc = "";
		PYFUTexture_Type.tp_str = (reprfunc)pyFUTexture_str;
		PYFUTexture_Type.tp_as_number = &PYFUTexture_number;
		PYFUTexture_Type.tp_methods = PYFUTexture_methods.discard();
		PYFUTexture_Type.tp_getset = PYFUTexture_getsets.discard();
		PYFUTexture_Type.tp_init = (initproc)pyFUTexture_init;
		PYFUTexture_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUTexture_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUTexture");
			return false;
		}
		Py_INCREF(&PYFUTexture_Type);
		
		// Tellusim::Tracing
		PYTracing_methods.reserve(PYTracing_methods.size() + 64);
		PYTracing_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTracing_equalPtr, METH_VARARGS, "" });
		PYTracing_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTracing_clonePtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTracing_clearPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTracing_destroyPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTracing_acquirePtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTracing_unacquirePtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTracing_isValidPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTracing_isOwnerPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTracing_isConstPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTracing_getCountPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTracing_getInternalPtr, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Tracing_getPlatform, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Tracing_getPlatformName, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndex", (PyCFunction)Tracing_getIndex, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "clear", (PyCFunction)Tracing_clear, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isCreated", (PyCFunction)Tracing_isCreated, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isBuilt", (PyCFunction)Tracing_isBuilt, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "setName", (PyCFunction)Tracing_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getName", (PyCFunction)Tracing_getName, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "create", (PyCFunction)Tracing_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getType", (PyCFunction)Tracing_getType, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Tracing_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "isInstanceType", (PyCFunction)Tracing_isInstanceType, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isTriangleType", (PyCFunction)Tracing_isTriangleType, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isBoundType", (PyCFunction)Tracing_isBoundType, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "isGeometryType", (PyCFunction)Tracing_isGeometryType, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "setParameters", (PyCFunction)Tracing_setParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getNumGeometries", (PyCFunction)Tracing_getNumGeometries, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "setInstanceBuffer", (PyCFunction)Tracing_setInstanceBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setNumInstances", (PyCFunction)Tracing_setNumInstances, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getNumInstances", (PyCFunction)Tracing_getNumInstances, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getInstanceBuffer", (PyCFunction)Tracing_getInstanceBuffer, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getInstanceOffset", (PyCFunction)Tracing_getInstanceOffset, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "setIndirectBuffer", (PyCFunction)Tracing_setIndirectBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndirectBuffer", (PyCFunction)Tracing_getIndirectBuffer, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndirectOffset", (PyCFunction)Tracing_getIndirectOffset, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "addVertexBuffer", (PyCFunction)Tracing_addVertexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setVertexBuffer", (PyCFunction)Tracing_setVertexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setNumVertices", (PyCFunction)Tracing_setNumVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getNumVertices", (PyCFunction)Tracing_getNumVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getVertexFormat", (PyCFunction)Tracing_getVertexFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getVertexStride", (PyCFunction)Tracing_getVertexStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getVertexBuffer", (PyCFunction)Tracing_getVertexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getVertexOffset", (PyCFunction)Tracing_getVertexOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "addIndexBuffer", (PyCFunction)Tracing_addIndexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setIndexBuffer", (PyCFunction)Tracing_setIndexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setNumIndices", (PyCFunction)Tracing_setNumIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getNumIndices", (PyCFunction)Tracing_getNumIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndexFormat", (PyCFunction)Tracing_getIndexFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndexBuffer", (PyCFunction)Tracing_getIndexBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getIndexOffset", (PyCFunction)Tracing_getIndexOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "addBoundBuffer", (PyCFunction)Tracing_addBoundBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setBoundBuffer", (PyCFunction)Tracing_setBoundBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "setNumBounds", (PyCFunction)Tracing_setNumBounds, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getNumBounds", (PyCFunction)Tracing_getNumBounds, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getBoundStride", (PyCFunction)Tracing_getBoundStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getBoundBuffer", (PyCFunction)Tracing_getBoundBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getBoundOffset", (PyCFunction)Tracing_getBoundOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTracing_methods.append(PyMethodDef { "getDescription", (PyCFunction)Tracing_getDescription, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getTracingAddress", (PyCFunction)Tracing_getTracingAddress, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getBuildSize", (PyCFunction)Tracing_getBuildSize, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getUpdateSize", (PyCFunction)Tracing_getUpdateSize, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef { "getMemory", (PyCFunction)Tracing_getMemory, METH_NOARGS, "" });
		PYTracing_methods.append(PyMethodDef {});
		PYTracing_getsets.reserve(PYTracing_getsets.size() + 17);
		PYTracing_getsets.append(PyGetSetDef { "platform", (getter)Tracing_get_platform, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "platform_name", (getter)Tracing_get_platform_name, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "index", (getter)Tracing_get_index, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "name", (getter)Tracing_get_name, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "type", (getter)Tracing_get_type, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "num_geometries", (getter)Tracing_get_num_geometries, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "num_instances", (getter)Tracing_get_num_instances, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "instance_buffer", (getter)Tracing_get_instance_buffer, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "instance_offset", (getter)Tracing_get_instance_offset, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "indirect_buffer", (getter)Tracing_get_indirect_buffer, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "indirect_offset", (getter)Tracing_get_indirect_offset, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "description", (getter)Tracing_get_description, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "tracing_address", (getter)Tracing_get_tracing_address, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "build_size", (getter)Tracing_get_build_size, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "update_size", (getter)Tracing_get_update_size, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef { "memory", (getter)Tracing_get_memory, nullptr, "", nullptr });
		PYTracing_getsets.append(PyGetSetDef {});
		PYTracing_Type.tp_dealloc = (destructor)pyTracing_dealloc;
		PYTracing_number.nb_bool = (inquiry)pyTracing_bool;
		PYTracing_Type.tp_name = "tellusim.Tracing";
		PYTracing_Type.tp_basicsize = sizeof(PYTracing);
		PYTracing_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYTracing_Type.tp_doc = "";
		PYTracing_Type.tp_str = (reprfunc)pyTracing_str;
		PYTracing_Type.tp_as_number = &PYTracing_number;
		PYTracing_Type.tp_methods = PYTracing_methods.discard();
		PYTracing_Type.tp_getset = PYTracing_getsets.discard();
		PYTracing_Type.tp_init = (initproc)pyTracing_init;
		PYTracing_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTracing_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Tracing");
			return false;
		}
		PyDict_SetItemString(PYTracing_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "TypeInstance", PyLong_FromLong(1));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "TypeTriangle", PyLong_FromLong(2));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "TypeBound", PyLong_FromLong(3));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "NumTypes", PyLong_FromLong(4));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagInfo", PyLong_FromLong(1));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagUpdate", PyLong_FromLong(2));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagCompact", PyLong_FromLong(4));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagTransparent", PyLong_FromLong(8));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagFastBuild", PyLong_FromLong(16));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "FlagFastTrace", PyLong_FromLong(32));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "NumFlags", PyLong_FromLong(6));
		PyDict_SetItemString(PYTracing_Type.tp_dict, "InstanceSize", PyLong_FromLong(64));
		PyType_Modified(&PYTracing_Type);
		Py_INCREF(&PYTracing_Type);
		
		// Tellusim::Tracing::Instance
		PYTracingInstance_methods.append(PyMethodDef {});
		PYTracingInstance_members.reserve(PYTracingInstance_members.size() + 5);
		PYTracingInstance_getsets.reserve(PYTracingInstance_getsets.size() + 2);
		PYTracingInstance_getsets.append(PyGetSetDef { "transform", pyMatrix4x3f_getter, pyMatrix4x3f_setter, "", (void*)offsetof(PYTracingInstance, ptr.transform) });
		PYTracingInstance_members.append(PyMemberDef { "data", T_UINT, offsetof(PYTracingInstance, ptr.data), 0, "" });
		PYTracingInstance_members.append(PyMemberDef { "mask", T_UINT, offsetof(PYTracingInstance, ptr.mask), 0, "" });
		PYTracingInstance_members.append(PyMemberDef { "flags", T_UINT, offsetof(PYTracingInstance, ptr.flags), 0, "" });
		PYTracingInstance_members.append(PyMemberDef { "offset", T_UINT, offsetof(PYTracingInstance, ptr.offset), 0, "" });
		PYTracingInstance_members.append(PyMemberDef {});
		PYTracingInstance_getsets.append(PyGetSetDef {});
		PYTracingInstance_buffer.bf_getbuffer = (getbufferproc)pyTracingInstance_buffer;
		PYTracingInstance_Type.tp_name = "tellusim.TracingInstance";
		PYTracingInstance_Type.tp_basicsize = sizeof(PYTracingInstance);
		PYTracingInstance_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYTracingInstance_Type.tp_doc = "";
		PYTracingInstance_Type.tp_as_number = &PYTracingInstance_number;
		PYTracingInstance_Type.tp_as_buffer = &PYTracingInstance_buffer;
		PYTracingInstance_Type.tp_methods = PYTracingInstance_methods.discard();
		PYTracingInstance_Type.tp_members = PYTracingInstance_members.discard();
		PYTracingInstance_Type.tp_getset = PYTracingInstance_getsets.discard();
		PYTracingInstance_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTracingInstance_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Tracing::Instance");
			return false;
		}
		Py_INCREF(&PYTracingInstance_Type);
		
		// Tellusim::Tracing::BuildIndirect
		PYTracingBuildIndirect_methods.append(PyMethodDef {});
		PYTracingBuildIndirect_members.reserve(PYTracingBuildIndirect_members.size() + 5);
		PYTracingBuildIndirect_getsets.reserve(PYTracingBuildIndirect_getsets.size() + 1);
		PYTracingBuildIndirect_members.append(PyMemberDef { "num_primitives", T_UINT, offsetof(PYTracingBuildIndirect, ptr.num_primitives), 0, "" });
		PYTracingBuildIndirect_members.append(PyMemberDef { "base_primitive", T_UINT, offsetof(PYTracingBuildIndirect, ptr.base_primitive), 0, "" });
		PYTracingBuildIndirect_members.append(PyMemberDef { "base_vertex", T_UINT, offsetof(PYTracingBuildIndirect, ptr.base_vertex), 0, "" });
		PYTracingBuildIndirect_members.append(PyMemberDef { "base_transform", T_UINT, offsetof(PYTracingBuildIndirect, ptr.base_transform), 0, "" });
		PYTracingBuildIndirect_members.append(PyMemberDef {});
		PYTracingBuildIndirect_getsets.append(PyGetSetDef {});
		PYTracingBuildIndirect_buffer.bf_getbuffer = (getbufferproc)pyTracingBuildIndirect_buffer;
		PYTracingBuildIndirect_Type.tp_name = "tellusim.TracingBuildIndirect";
		PYTracingBuildIndirect_Type.tp_basicsize = sizeof(PYTracingBuildIndirect);
		PYTracingBuildIndirect_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYTracingBuildIndirect_Type.tp_doc = "";
		PYTracingBuildIndirect_Type.tp_as_number = &PYTracingBuildIndirect_number;
		PYTracingBuildIndirect_Type.tp_as_buffer = &PYTracingBuildIndirect_buffer;
		PYTracingBuildIndirect_Type.tp_methods = PYTracingBuildIndirect_methods.discard();
		PYTracingBuildIndirect_Type.tp_members = PYTracingBuildIndirect_members.discard();
		PYTracingBuildIndirect_Type.tp_getset = PYTracingBuildIndirect_getsets.discard();
		PYTracingBuildIndirect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTracingBuildIndirect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Tracing::BuildIndirect");
			return false;
		}
		Py_INCREF(&PYTracingBuildIndirect_Type);
		
		// Tellusim::D3D12Tracing
		PYD3D12Tracing_methods.reserve(PYD3D12Tracing_methods.size() + 19);
		PYD3D12Tracing_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Tracing_equalPtr, METH_VARARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Tracing_clonePtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Tracing_clearPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Tracing_destroyPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Tracing_acquirePtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Tracing_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Tracing_isValidPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Tracing_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Tracing_isConstPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Tracing_getCountPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Tracing_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getTracing", (PyCFunction)pyD3D12Tracing_getTracing, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getGeometryDesc", (PyCFunction)D3D12Tracing_getGeometryDesc, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getBuildInputs", (PyCFunction)D3D12Tracing_getBuildInputs, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getPrebuildInfo", (PyCFunction)D3D12Tracing_getPrebuildInfo, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getBuildDesc", (PyCFunction)D3D12Tracing_getBuildDesc, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getTracingBuffer", (PyCFunction)D3D12Tracing_getTracingBuffer, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef { "getShaderResourceView", (PyCFunction)D3D12Tracing_getShaderResourceView, METH_NOARGS, "" });
		PYD3D12Tracing_methods.append(PyMethodDef {});
		PYD3D12Tracing_getsets.reserve(PYD3D12Tracing_getsets.size() + 6);
		PYD3D12Tracing_getsets.append(PyGetSetDef { "build_inputs", (getter)D3D12Tracing_get_build_inputs, nullptr, "", nullptr });
		PYD3D12Tracing_getsets.append(PyGetSetDef { "prebuild_info", (getter)D3D12Tracing_get_prebuild_info, nullptr, "", nullptr });
		PYD3D12Tracing_getsets.append(PyGetSetDef { "build_desc", (getter)D3D12Tracing_get_build_desc, nullptr, "", nullptr });
		PYD3D12Tracing_getsets.append(PyGetSetDef { "tracing_buffer", (getter)D3D12Tracing_get_tracing_buffer, nullptr, "", nullptr });
		PYD3D12Tracing_getsets.append(PyGetSetDef { "shader_resource_view", (getter)D3D12Tracing_get_shader_resource_view, nullptr, "", nullptr });
		PYD3D12Tracing_getsets.append(PyGetSetDef {});
		PYD3D12Tracing_Type.tp_base = &PYTracing_Type;
		PYD3D12Tracing_Type.tp_dealloc = (destructor)pyD3D12Tracing_dealloc;
		PYD3D12Tracing_number.nb_bool = (inquiry)pyD3D12Tracing_bool;
		PYD3D12Tracing_Type.tp_name = "tellusim.D3D12Tracing";
		PYD3D12Tracing_Type.tp_basicsize = sizeof(PYD3D12Tracing);
		PYD3D12Tracing_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Tracing_Type.tp_doc = "";
		PYD3D12Tracing_Type.tp_str = (reprfunc)pyD3D12Tracing_str;
		PYD3D12Tracing_Type.tp_as_number = &PYD3D12Tracing_number;
		PYD3D12Tracing_Type.tp_methods = PYD3D12Tracing_methods.discard();
		PYD3D12Tracing_Type.tp_getset = PYD3D12Tracing_getsets.discard();
		PYD3D12Tracing_Type.tp_init = (initproc)pyD3D12Tracing_init;
		PYD3D12Tracing_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Tracing_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Tracing");
			return false;
		}
		Py_INCREF(&PYD3D12Tracing_Type);
		
		// Tellusim::MTLTracing
		PYMTLTracing_methods.reserve(PYMTLTracing_methods.size() + 17);
		PYMTLTracing_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLTracing_equalPtr, METH_VARARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLTracing_clonePtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLTracing_clearPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLTracing_destroyPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLTracing_acquirePtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLTracing_unacquirePtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLTracing_isValidPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLTracing_isOwnerPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLTracing_isConstPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLTracing_getCountPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLTracing_getInternalPtr, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getTracing", (PyCFunction)pyMTLTracing_getTracing, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getGeometryDesc", (PyCFunction)MTLTracing_getGeometryDesc, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getPrimitiveDesc", (PyCFunction)MTLTracing_getPrimitiveDesc, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getInstanceDesc", (PyCFunction)MTLTracing_getInstanceDesc, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef { "getAccelerationStructure", (PyCFunction)MTLTracing_getAccelerationStructure, METH_NOARGS, "" });
		PYMTLTracing_methods.append(PyMethodDef {});
		PYMTLTracing_getsets.reserve(PYMTLTracing_getsets.size() + 4);
		PYMTLTracing_getsets.append(PyGetSetDef { "primitive_desc", (getter)MTLTracing_get_primitive_desc, nullptr, "", nullptr });
		PYMTLTracing_getsets.append(PyGetSetDef { "instance_desc", (getter)MTLTracing_get_instance_desc, nullptr, "", nullptr });
		PYMTLTracing_getsets.append(PyGetSetDef { "acceleration_structure", (getter)MTLTracing_get_acceleration_structure, nullptr, "", nullptr });
		PYMTLTracing_getsets.append(PyGetSetDef {});
		PYMTLTracing_Type.tp_base = &PYTracing_Type;
		PYMTLTracing_Type.tp_dealloc = (destructor)pyMTLTracing_dealloc;
		PYMTLTracing_number.nb_bool = (inquiry)pyMTLTracing_bool;
		PYMTLTracing_Type.tp_name = "tellusim.MTLTracing";
		PYMTLTracing_Type.tp_basicsize = sizeof(PYMTLTracing);
		PYMTLTracing_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLTracing_Type.tp_doc = "";
		PYMTLTracing_Type.tp_str = (reprfunc)pyMTLTracing_str;
		PYMTLTracing_Type.tp_as_number = &PYMTLTracing_number;
		PYMTLTracing_Type.tp_methods = PYMTLTracing_methods.discard();
		PYMTLTracing_Type.tp_getset = PYMTLTracing_getsets.discard();
		PYMTLTracing_Type.tp_init = (initproc)pyMTLTracing_init;
		PYMTLTracing_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLTracing_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLTracing");
			return false;
		}
		Py_INCREF(&PYMTLTracing_Type);
		
		// Tellusim::VKTracing
		PYVKTracing_methods.reserve(PYVKTracing_methods.size() + 17);
		PYVKTracing_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKTracing_equalPtr, METH_VARARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKTracing_clonePtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKTracing_clearPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKTracing_destroyPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKTracing_acquirePtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKTracing_unacquirePtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKTracing_isValidPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKTracing_isOwnerPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKTracing_isConstPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKTracing_getCountPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKTracing_getInternalPtr, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getTracing", (PyCFunction)pyVKTracing_getTracing, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getBuildGeometryInfo", (PyCFunction)VKTracing_getBuildGeometryInfo, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getBuildSizeInfo", (PyCFunction)VKTracing_getBuildSizeInfo, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getTracingBuffer", (PyCFunction)VKTracing_getTracingBuffer, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef { "getAccelerationStructure", (PyCFunction)VKTracing_getAccelerationStructure, METH_NOARGS, "" });
		PYVKTracing_methods.append(PyMethodDef {});
		PYVKTracing_getsets.reserve(PYVKTracing_getsets.size() + 5);
		PYVKTracing_getsets.append(PyGetSetDef { "build_geometry_info", (getter)VKTracing_get_build_geometry_info, nullptr, "", nullptr });
		PYVKTracing_getsets.append(PyGetSetDef { "build_size_info", (getter)VKTracing_get_build_size_info, nullptr, "", nullptr });
		PYVKTracing_getsets.append(PyGetSetDef { "tracing_buffer", (getter)VKTracing_get_tracing_buffer, nullptr, "", nullptr });
		PYVKTracing_getsets.append(PyGetSetDef { "acceleration_structure", (getter)VKTracing_get_acceleration_structure, nullptr, "", nullptr });
		PYVKTracing_getsets.append(PyGetSetDef {});
		PYVKTracing_Type.tp_base = &PYTracing_Type;
		PYVKTracing_Type.tp_dealloc = (destructor)pyVKTracing_dealloc;
		PYVKTracing_number.nb_bool = (inquiry)pyVKTracing_bool;
		PYVKTracing_Type.tp_name = "tellusim.VKTracing";
		PYVKTracing_Type.tp_basicsize = sizeof(PYVKTracing);
		PYVKTracing_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKTracing_Type.tp_doc = "";
		PYVKTracing_Type.tp_str = (reprfunc)pyVKTracing_str;
		PYVKTracing_Type.tp_as_number = &PYVKTracing_number;
		PYVKTracing_Type.tp_methods = PYVKTracing_methods.discard();
		PYVKTracing_Type.tp_getset = PYVKTracing_getsets.discard();
		PYVKTracing_Type.tp_init = (initproc)pyVKTracing_init;
		PYVKTracing_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKTracing_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKTracing");
			return false;
		}
		Py_INCREF(&PYVKTracing_Type);
		
		// Tellusim::FUTracing
		PYFUTracing_methods.reserve(PYFUTracing_methods.size() + 17);
		PYFUTracing_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUTracing_equalPtr, METH_VARARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUTracing_clonePtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUTracing_clearPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUTracing_destroyPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUTracing_acquirePtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUTracing_unacquirePtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUTracing_isValidPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUTracing_isOwnerPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUTracing_isConstPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUTracing_getCountPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUTracing_getInternalPtr, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getTracing", (PyCFunction)pyFUTracing_getTracing, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "setMask", (PyCFunction)FUTracing_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getMask", (PyCFunction)FUTracing_getMask, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getNumTracings", (PyCFunction)FUTracing_getNumTracings, METH_NOARGS, "" });
		PYFUTracing_methods.append(PyMethodDef { "getTracing", (PyCFunction)FUTracing_getTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTracing_methods.append(PyMethodDef {});
		PYFUTracing_getsets.reserve(PYFUTracing_getsets.size() + 3);
		PYFUTracing_getsets.append(PyGetSetDef { "mask", (getter)FUTracing_get_mask, nullptr, "", nullptr });
		PYFUTracing_getsets.append(PyGetSetDef { "num_tracings", (getter)FUTracing_get_num_tracings, nullptr, "", nullptr });
		PYFUTracing_getsets.append(PyGetSetDef {});
		PYFUTracing_Type.tp_base = &PYTracing_Type;
		PYFUTracing_Type.tp_dealloc = (destructor)pyFUTracing_dealloc;
		PYFUTracing_number.nb_bool = (inquiry)pyFUTracing_bool;
		PYFUTracing_Type.tp_name = "tellusim.FUTracing";
		PYFUTracing_Type.tp_basicsize = sizeof(PYFUTracing);
		PYFUTracing_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUTracing_Type.tp_doc = "";
		PYFUTracing_Type.tp_str = (reprfunc)pyFUTracing_str;
		PYFUTracing_Type.tp_as_number = &PYFUTracing_number;
		PYFUTracing_Type.tp_methods = PYFUTracing_methods.discard();
		PYFUTracing_Type.tp_getset = PYFUTracing_getsets.discard();
		PYFUTracing_Type.tp_init = (initproc)pyFUTracing_init;
		PYFUTracing_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUTracing_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUTracing");
			return false;
		}
		Py_INCREF(&PYFUTracing_Type);
		
		// Tellusim::Target
		PYTarget_methods.reserve(PYTarget_methods.size() + 51);
		PYTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTarget_equalPtr, METH_VARARGS, "" });
		PYTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTarget_clonePtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTarget_clearPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTarget_destroyPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTarget_acquirePtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTarget_unacquirePtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTarget_isValidPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTarget_isOwnerPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTarget_isConstPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTarget_getCountPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTarget_getInternalPtr, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Target_getPlatform, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Target_getPlatformName, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getIndex", (PyCFunction)Target_getIndex, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "begin", (PyCFunction)Target_begin, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "end", (PyCFunction)Target_end, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "swap", (PyCFunction)Target_swap, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "isEnabled", (PyCFunction)Target_isEnabled, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorFormat", (PyCFunction)Target_getColorFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthFormat", (PyCFunction)Target_getDepthFormat, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Target_getMultisample, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "hasMultisample", (PyCFunction)Target_hasMultisample, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "isFlipped", (PyCFunction)Target_isFlipped, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "isAtomic", (PyCFunction)Target_isAtomic, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getWidth", (PyCFunction)Target_getWidth, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getHeight", (PyCFunction)Target_getHeight, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepth", (PyCFunction)Target_getDepth, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getFaces", (PyCFunction)Target_getFaces, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getLayers", (PyCFunction)Target_getLayers, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getMipmaps", (PyCFunction)Target_getMipmaps, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "setClearColor", (PyCFunction)Target_setClearColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "setColorTexture", (PyCFunction)Target_setColorTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "setColorResolve", (PyCFunction)Target_setColorResolve, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getNumTargets", (PyCFunction)Target_getNumTargets, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getClearColor", (PyCFunction)Target_getClearColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorOp", (PyCFunction)Target_getColorOp, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorTexture", (PyCFunction)Target_getColorTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorResolve", (PyCFunction)Target_getColorResolve, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorTextureSlice", (PyCFunction)Target_getColorTextureSlice, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getColorResolveSlice", (PyCFunction)Target_getColorResolveSlice, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "setClearDepth", (PyCFunction)Target_setClearDepth, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "setDepthTexture", (PyCFunction)Target_setDepthTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "setDepthResolve", (PyCFunction)Target_setDepthResolve, METH_VARARGS | METH_KEYWORDS, "" });
		PYTarget_methods.append(PyMethodDef { "getClearDepth", (PyCFunction)Target_getClearDepth, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getClearStencil", (PyCFunction)Target_getClearStencil, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthOp", (PyCFunction)Target_getDepthOp, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthTexture", (PyCFunction)Target_getDepthTexture, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthResolve", (PyCFunction)Target_getDepthResolve, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthTextureSlice", (PyCFunction)Target_getDepthTextureSlice, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef { "getDepthResolveSlice", (PyCFunction)Target_getDepthResolveSlice, METH_NOARGS, "" });
		PYTarget_methods.append(PyMethodDef {});
		PYTarget_getsets.reserve(PYTarget_getsets.size() + 23);
		PYTarget_getsets.append(PyGetSetDef { "platform", (getter)Target_get_platform, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "platform_name", (getter)Target_get_platform_name, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "index", (getter)Target_get_index, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "color_format", (getter)Target_get_color_format, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_format", (getter)Target_get_depth_format, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "multisample", (getter)Target_get_multisample, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "width", (getter)Target_get_width, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "height", (getter)Target_get_height, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth", (getter)Target_get_depth, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "faces", (getter)Target_get_faces, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "layers", (getter)Target_get_layers, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "mipmaps", (getter)Target_get_mipmaps, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "num_targets", (getter)Target_get_num_targets, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "clear_color", (getter)Target_get_clear_color, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "color_op", (getter)Target_get_color_op, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "clear_depth", (getter)Target_get_clear_depth, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "clear_stencil", (getter)Target_get_clear_stencil, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_op", (getter)Target_get_depth_op, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_texture", (getter)Target_get_depth_texture, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_resolve", (getter)Target_get_depth_resolve, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_texture_slice", (getter)Target_get_depth_texture_slice, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef { "depth_resolve_slice", (getter)Target_get_depth_resolve_slice, nullptr, "", nullptr });
		PYTarget_getsets.append(PyGetSetDef {});
		PYTarget_Type.tp_dealloc = (destructor)pyTarget_dealloc;
		PYTarget_number.nb_bool = (inquiry)pyTarget_bool;
		PYTarget_Type.tp_name = "tellusim.Target";
		PYTarget_Type.tp_basicsize = sizeof(PYTarget);
		PYTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYTarget_Type.tp_doc = "";
		PYTarget_Type.tp_str = (reprfunc)pyTarget_str;
		PYTarget_Type.tp_as_number = &PYTarget_number;
		PYTarget_Type.tp_methods = PYTarget_methods.discard();
		PYTarget_Type.tp_getset = PYTarget_getsets.discard();
		PYTarget_Type.tp_init = (initproc)pyTarget_init;
		PYTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Target");
			return false;
		}
		PyDict_SetItemString(PYTarget_Type.tp_dict, "BeginLoad", PyLong_FromLong(1));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "BeginClear", PyLong_FromLong(2));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "BeginDiscard", PyLong_FromLong(4));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "BeginMask", PyLong_FromLong(7));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "EndStore", PyLong_FromLong(8));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "EndResolve", PyLong_FromLong(16));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "EndDiscard", PyLong_FromLong(32));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "EndMask", PyLong_FromLong(56));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpLoad", PyLong_FromLong(1));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpLoadStore", PyLong_FromLong(9));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpClearStore", PyLong_FromLong(10));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpClearDiscard", PyLong_FromLong(34));
		PyDict_SetItemString(PYTarget_Type.tp_dict, "OpDefault", PyLong_FromLong(10));
		PyType_Modified(&PYTarget_Type);
		Py_INCREF(&PYTarget_Type);
		
		// Tellusim::D3D12Target
		PYD3D12Target_methods.reserve(PYD3D12Target_methods.size() + 15);
		PYD3D12Target_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Target_equalPtr, METH_VARARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Target_clonePtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Target_clearPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Target_destroyPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Target_acquirePtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Target_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Target_isValidPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Target_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Target_isConstPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Target_getCountPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Target_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyD3D12Target_getTarget, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "getRenderTargetViews", (PyCFunction)D3D12Target_getRenderTargetViews, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D12Target_getDepthStencilView, METH_NOARGS, "" });
		PYD3D12Target_methods.append(PyMethodDef {});
		PYD3D12Target_getsets.reserve(PYD3D12Target_getsets.size() + 3);
		PYD3D12Target_getsets.append(PyGetSetDef { "render_target_views", (getter)D3D12Target_get_render_target_views, nullptr, "", nullptr });
		PYD3D12Target_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D12Target_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D12Target_getsets.append(PyGetSetDef {});
		PYD3D12Target_Type.tp_base = &PYTarget_Type;
		PYD3D12Target_Type.tp_dealloc = (destructor)pyD3D12Target_dealloc;
		PYD3D12Target_number.nb_bool = (inquiry)pyD3D12Target_bool;
		PYD3D12Target_Type.tp_name = "tellusim.D3D12Target";
		PYD3D12Target_Type.tp_basicsize = sizeof(PYD3D12Target);
		PYD3D12Target_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Target_Type.tp_doc = "";
		PYD3D12Target_Type.tp_str = (reprfunc)pyD3D12Target_str;
		PYD3D12Target_Type.tp_as_number = &PYD3D12Target_number;
		PYD3D12Target_Type.tp_methods = PYD3D12Target_methods.discard();
		PYD3D12Target_Type.tp_getset = PYD3D12Target_getsets.discard();
		PYD3D12Target_Type.tp_init = (initproc)pyD3D12Target_init;
		PYD3D12Target_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Target_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Target");
			return false;
		}
		Py_INCREF(&PYD3D12Target_Type);
		
		// Tellusim::D3D11Target
		PYD3D11Target_methods.reserve(PYD3D11Target_methods.size() + 15);
		PYD3D11Target_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Target_equalPtr, METH_VARARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Target_clonePtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Target_clearPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Target_destroyPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Target_acquirePtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Target_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Target_isValidPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Target_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Target_isConstPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Target_getCountPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Target_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyD3D11Target_getTarget, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "getRenderTargetViews", (PyCFunction)D3D11Target_getRenderTargetViews, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D11Target_getDepthStencilView, METH_NOARGS, "" });
		PYD3D11Target_methods.append(PyMethodDef {});
		PYD3D11Target_getsets.reserve(PYD3D11Target_getsets.size() + 3);
		PYD3D11Target_getsets.append(PyGetSetDef { "render_target_views", (getter)D3D11Target_get_render_target_views, nullptr, "", nullptr });
		PYD3D11Target_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D11Target_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D11Target_getsets.append(PyGetSetDef {});
		PYD3D11Target_Type.tp_base = &PYTarget_Type;
		PYD3D11Target_Type.tp_dealloc = (destructor)pyD3D11Target_dealloc;
		PYD3D11Target_number.nb_bool = (inquiry)pyD3D11Target_bool;
		PYD3D11Target_Type.tp_name = "tellusim.D3D11Target";
		PYD3D11Target_Type.tp_basicsize = sizeof(PYD3D11Target);
		PYD3D11Target_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Target_Type.tp_doc = "";
		PYD3D11Target_Type.tp_str = (reprfunc)pyD3D11Target_str;
		PYD3D11Target_Type.tp_as_number = &PYD3D11Target_number;
		PYD3D11Target_Type.tp_methods = PYD3D11Target_methods.discard();
		PYD3D11Target_Type.tp_getset = PYD3D11Target_getsets.discard();
		PYD3D11Target_Type.tp_init = (initproc)pyD3D11Target_init;
		PYD3D11Target_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Target_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Target");
			return false;
		}
		Py_INCREF(&PYD3D11Target_Type);
		
		// Tellusim::MTLTarget
		PYMTLTarget_methods.reserve(PYMTLTarget_methods.size() + 14);
		PYMTLTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLTarget_equalPtr, METH_VARARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLTarget_clonePtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLTarget_clearPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLTarget_destroyPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLTarget_acquirePtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLTarget_unacquirePtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLTarget_isValidPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLTarget_isOwnerPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLTarget_isConstPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLTarget_getCountPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLTarget_getInternalPtr, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyMTLTarget_getTarget, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef { "getDescriptor", (PyCFunction)MTLTarget_getDescriptor, METH_NOARGS, "" });
		PYMTLTarget_methods.append(PyMethodDef {});
		PYMTLTarget_getsets.reserve(PYMTLTarget_getsets.size() + 2);
		PYMTLTarget_getsets.append(PyGetSetDef { "descriptor", (getter)MTLTarget_get_descriptor, nullptr, "", nullptr });
		PYMTLTarget_getsets.append(PyGetSetDef {});
		PYMTLTarget_Type.tp_base = &PYTarget_Type;
		PYMTLTarget_Type.tp_dealloc = (destructor)pyMTLTarget_dealloc;
		PYMTLTarget_number.nb_bool = (inquiry)pyMTLTarget_bool;
		PYMTLTarget_Type.tp_name = "tellusim.MTLTarget";
		PYMTLTarget_Type.tp_basicsize = sizeof(PYMTLTarget);
		PYMTLTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLTarget_Type.tp_doc = "";
		PYMTLTarget_Type.tp_str = (reprfunc)pyMTLTarget_str;
		PYMTLTarget_Type.tp_as_number = &PYMTLTarget_number;
		PYMTLTarget_Type.tp_methods = PYMTLTarget_methods.discard();
		PYMTLTarget_Type.tp_getset = PYMTLTarget_getsets.discard();
		PYMTLTarget_Type.tp_init = (initproc)pyMTLTarget_init;
		PYMTLTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLTarget");
			return false;
		}
		Py_INCREF(&PYMTLTarget_Type);
		
		// Tellusim::VKTarget
		PYVKTarget_methods.reserve(PYVKTarget_methods.size() + 15);
		PYVKTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKTarget_equalPtr, METH_VARARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKTarget_clonePtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKTarget_clearPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKTarget_destroyPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKTarget_acquirePtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKTarget_unacquirePtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKTarget_isValidPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKTarget_isOwnerPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKTarget_isConstPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKTarget_getCountPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKTarget_getInternalPtr, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyVKTarget_getTarget, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "getRenderPass", (PyCFunction)VKTarget_getRenderPass, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef { "getFramebuffer", (PyCFunction)VKTarget_getFramebuffer, METH_NOARGS, "" });
		PYVKTarget_methods.append(PyMethodDef {});
		PYVKTarget_getsets.reserve(PYVKTarget_getsets.size() + 3);
		PYVKTarget_getsets.append(PyGetSetDef { "render_pass", (getter)VKTarget_get_render_pass, nullptr, "", nullptr });
		PYVKTarget_getsets.append(PyGetSetDef { "framebuffer", (getter)VKTarget_get_framebuffer, nullptr, "", nullptr });
		PYVKTarget_getsets.append(PyGetSetDef {});
		PYVKTarget_Type.tp_base = &PYTarget_Type;
		PYVKTarget_Type.tp_dealloc = (destructor)pyVKTarget_dealloc;
		PYVKTarget_number.nb_bool = (inquiry)pyVKTarget_bool;
		PYVKTarget_Type.tp_name = "tellusim.VKTarget";
		PYVKTarget_Type.tp_basicsize = sizeof(PYVKTarget);
		PYVKTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKTarget_Type.tp_doc = "";
		PYVKTarget_Type.tp_str = (reprfunc)pyVKTarget_str;
		PYVKTarget_Type.tp_as_number = &PYVKTarget_number;
		PYVKTarget_Type.tp_methods = PYVKTarget_methods.discard();
		PYVKTarget_Type.tp_getset = PYVKTarget_getsets.discard();
		PYVKTarget_Type.tp_init = (initproc)pyVKTarget_init;
		PYVKTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKTarget");
			return false;
		}
		Py_INCREF(&PYVKTarget_Type);
		
		// Tellusim::GLTarget
		PYGLTarget_methods.reserve(PYGLTarget_methods.size() + 14);
		PYGLTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLTarget_equalPtr, METH_VARARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLTarget_clonePtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLTarget_clearPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLTarget_destroyPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLTarget_acquirePtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLTarget_unacquirePtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLTarget_isValidPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLTarget_isOwnerPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLTarget_isConstPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLTarget_getCountPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLTarget_getInternalPtr, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyGLTarget_getTarget, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef { "getFramebufferID", (PyCFunction)GLTarget_getFramebufferID, METH_NOARGS, "" });
		PYGLTarget_methods.append(PyMethodDef {});
		PYGLTarget_getsets.reserve(PYGLTarget_getsets.size() + 2);
		PYGLTarget_getsets.append(PyGetSetDef { "framebuffer_id", (getter)GLTarget_get_framebuffer_id, nullptr, "", nullptr });
		PYGLTarget_getsets.append(PyGetSetDef {});
		PYGLTarget_Type.tp_base = &PYTarget_Type;
		PYGLTarget_Type.tp_dealloc = (destructor)pyGLTarget_dealloc;
		PYGLTarget_number.nb_bool = (inquiry)pyGLTarget_bool;
		PYGLTarget_Type.tp_name = "tellusim.GLTarget";
		PYGLTarget_Type.tp_basicsize = sizeof(PYGLTarget);
		PYGLTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLTarget_Type.tp_doc = "";
		PYGLTarget_Type.tp_str = (reprfunc)pyGLTarget_str;
		PYGLTarget_Type.tp_as_number = &PYGLTarget_number;
		PYGLTarget_Type.tp_methods = PYGLTarget_methods.discard();
		PYGLTarget_Type.tp_getset = PYGLTarget_getsets.discard();
		PYGLTarget_Type.tp_init = (initproc)pyGLTarget_init;
		PYGLTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLTarget");
			return false;
		}
		Py_INCREF(&PYGLTarget_Type);
		
		// Tellusim::GLESTarget
		PYGLESTarget_methods.reserve(PYGLESTarget_methods.size() + 14);
		PYGLESTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESTarget_equalPtr, METH_VARARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESTarget_clonePtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESTarget_clearPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESTarget_destroyPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESTarget_acquirePtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESTarget_unacquirePtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESTarget_isValidPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESTarget_isOwnerPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESTarget_isConstPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESTarget_getCountPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESTarget_getInternalPtr, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyGLESTarget_getTarget, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef { "getFramebufferID", (PyCFunction)GLESTarget_getFramebufferID, METH_NOARGS, "" });
		PYGLESTarget_methods.append(PyMethodDef {});
		PYGLESTarget_getsets.reserve(PYGLESTarget_getsets.size() + 2);
		PYGLESTarget_getsets.append(PyGetSetDef { "framebuffer_id", (getter)GLESTarget_get_framebuffer_id, nullptr, "", nullptr });
		PYGLESTarget_getsets.append(PyGetSetDef {});
		PYGLESTarget_Type.tp_base = &PYTarget_Type;
		PYGLESTarget_Type.tp_dealloc = (destructor)pyGLESTarget_dealloc;
		PYGLESTarget_number.nb_bool = (inquiry)pyGLESTarget_bool;
		PYGLESTarget_Type.tp_name = "tellusim.GLESTarget";
		PYGLESTarget_Type.tp_basicsize = sizeof(PYGLESTarget);
		PYGLESTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESTarget_Type.tp_doc = "";
		PYGLESTarget_Type.tp_str = (reprfunc)pyGLESTarget_str;
		PYGLESTarget_Type.tp_as_number = &PYGLESTarget_number;
		PYGLESTarget_Type.tp_methods = PYGLESTarget_methods.discard();
		PYGLESTarget_Type.tp_getset = PYGLESTarget_getsets.discard();
		PYGLESTarget_Type.tp_init = (initproc)pyGLESTarget_init;
		PYGLESTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESTarget");
			return false;
		}
		Py_INCREF(&PYGLESTarget_Type);
		
		// Tellusim::FUTarget
		PYFUTarget_methods.reserve(PYFUTarget_methods.size() + 17);
		PYFUTarget_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUTarget_equalPtr, METH_VARARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUTarget_clonePtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUTarget_clearPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUTarget_destroyPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUTarget_acquirePtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUTarget_unacquirePtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUTarget_isValidPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUTarget_isOwnerPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUTarget_isConstPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUTarget_getCountPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUTarget_getInternalPtr, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)pyFUTarget_getTarget, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "setMask", (PyCFunction)FUTarget_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getMask", (PyCFunction)FUTarget_getMask, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getNumTargets", (PyCFunction)FUTarget_getNumTargets, METH_NOARGS, "" });
		PYFUTarget_methods.append(PyMethodDef { "getTarget", (PyCFunction)FUTarget_getTarget, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTarget_methods.append(PyMethodDef {});
		PYFUTarget_getsets.reserve(PYFUTarget_getsets.size() + 3);
		PYFUTarget_getsets.append(PyGetSetDef { "mask", (getter)FUTarget_get_mask, nullptr, "", nullptr });
		PYFUTarget_getsets.append(PyGetSetDef { "num_targets", (getter)FUTarget_get_num_targets, nullptr, "", nullptr });
		PYFUTarget_getsets.append(PyGetSetDef {});
		PYFUTarget_Type.tp_base = &PYTarget_Type;
		PYFUTarget_Type.tp_dealloc = (destructor)pyFUTarget_dealloc;
		PYFUTarget_number.nb_bool = (inquiry)pyFUTarget_bool;
		PYFUTarget_Type.tp_name = "tellusim.FUTarget";
		PYFUTarget_Type.tp_basicsize = sizeof(PYFUTarget);
		PYFUTarget_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUTarget_Type.tp_doc = "";
		PYFUTarget_Type.tp_str = (reprfunc)pyFUTarget_str;
		PYFUTarget_Type.tp_as_number = &PYFUTarget_number;
		PYFUTarget_Type.tp_methods = PYFUTarget_methods.discard();
		PYFUTarget_Type.tp_getset = PYFUTarget_getsets.discard();
		PYFUTarget_Type.tp_init = (initproc)pyFUTarget_init;
		PYFUTarget_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUTarget_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUTarget");
			return false;
		}
		Py_INCREF(&PYFUTarget_Type);
		
		// Tellusim::Device
		PYDevice_methods.reserve(PYDevice_methods.size() + 97);
		PYDevice_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDevice_equalPtr, METH_VARARGS, "" });
		PYDevice_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDevice_clonePtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDevice_clearPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDevice_destroyPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDevice_acquirePtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDevice_unacquirePtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDevice_isValidPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDevice_isOwnerPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDevice_isConstPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDevice_getCountPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDevice_getInternalPtr, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Device_getPlatform, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Device_getPlatformName, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getIndex", (PyCFunction)Device_getIndex, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getName", (PyCFunction)Device_getName, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getVendor", (PyCFunction)Device_getVendor, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getVersion", (PyCFunction)Device_getVersion, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "getFeatures", (PyCFunction)Device_getFeatures, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "hasQuery", (PyCFunction)Device_hasQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "hasShader", (PyCFunction)Device_hasShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "hasTarget", (PyCFunction)Device_hasTarget, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "hasTexture", (PyCFunction)Device_hasTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "hasSurface", (PyCFunction)Device_hasSurface, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createDevice", (PyCFunction)Device_createDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createCommandDevice", (PyCFunction)Device_createCommandDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createComputeDevice", (PyCFunction)Device_createComputeDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createCopyDevice", (PyCFunction)Device_createCopyDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createQuery", (PyCFunction)Device_createQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createFence", (PyCFunction)Device_createFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createBuffer", (PyCFunction)Device_createBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createSampler", (PyCFunction)Device_createSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTexture", (PyCFunction)Device_createTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTexture2D", (PyCFunction)Device_createTexture2D, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTexture3D", (PyCFunction)Device_createTexture3D, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTextureCube", (PyCFunction)Device_createTextureCube, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "loadTexture", (PyCFunction)Device_loadTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTracing", (PyCFunction)Device_createTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createBufferTable", (PyCFunction)Device_createBufferTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTextureTable", (PyCFunction)Device_createTextureTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createShader", (PyCFunction)Device_createShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "loadShader", (PyCFunction)Device_loadShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "loadShaderGLSL", (PyCFunction)Device_loadShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "loadShaderSPIRV", (PyCFunction)Device_loadShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createShaderGLSL", (PyCFunction)Device_createShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createShaderSPIRV", (PyCFunction)Device_createShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createKernel", (PyCFunction)Device_createKernel, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseKernel", (PyCFunction)Device_releaseKernel, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createPipeline", (PyCFunction)Device_createPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releasePipeline", (PyCFunction)Device_releasePipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTraversal", (PyCFunction)Device_createTraversal, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseTraversal", (PyCFunction)Device_releaseTraversal, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createTarget", (PyCFunction)Device_createTarget, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createCompute", (PyCFunction)Device_createCompute, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "createCommand", (PyCFunction)Device_createCommand, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "setBuffer", (PyCFunction)Device_setBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "getBuffer", (PyCFunction)Device_getBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "mapBuffer", (PyCFunction)Device_mapBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "unmapBuffer", (PyCFunction)Device_unmapBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyBuffer", (PyCFunction)Device_copyBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "clearBuffer", (PyCFunction)Device_clearBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushBuffer", (PyCFunction)Device_flushBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushBuffers", (PyCFunction)Device_flushBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseBuffer", (PyCFunction)Device_releaseBuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseSampler", (PyCFunction)Device_releaseSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "setTexture", (PyCFunction)Device_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "getTexture", (PyCFunction)Device_getTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyTexture", (PyCFunction)Device_copyTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "clearTexture", (PyCFunction)Device_clearTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "bindTexture", (PyCFunction)Device_bindTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "createMipmaps", (PyCFunction)Device_createMipmaps, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushTexture", (PyCFunction)Device_flushTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushTextures", (PyCFunction)Device_flushTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseTexture", (PyCFunction)Device_releaseTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "setTracing", (PyCFunction)Device_setTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "buildTracing", (PyCFunction)Device_buildTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "buildTracings", (PyCFunction)Device_buildTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyTracing", (PyCFunction)Device_copyTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyTracings", (PyCFunction)Device_copyTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushTracing", (PyCFunction)Device_flushTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flushTracings", (PyCFunction)Device_flushTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseTracing", (PyCFunction)Device_releaseTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "setBufferTable", (PyCFunction)Device_setBufferTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseBufferTable", (PyCFunction)Device_releaseBufferTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "setTextureTable", (PyCFunction)Device_setTextureTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "releaseTextureTable", (PyCFunction)Device_releaseTextureTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "beginQuery", (PyCFunction)Device_beginQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "endQuery", (PyCFunction)Device_endQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyQuery", (PyCFunction)Device_copyQuery, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "copyQueries", (PyCFunction)Device_copyQueries, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "waitFence", (PyCFunction)Device_waitFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "signalFence", (PyCFunction)Device_signalFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "execute", (PyCFunction)Device_execute, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flip", (PyCFunction)Device_flip, METH_VARARGS | METH_KEYWORDS, "" });
		PYDevice_methods.append(PyMethodDef { "flush", (PyCFunction)Device_flush, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "finish", (PyCFunction)Device_finish, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef { "check", (PyCFunction)Device_check, METH_NOARGS, "" });
		PYDevice_methods.append(PyMethodDef {});
		PYDevice_getsets.reserve(PYDevice_getsets.size() + 8);
		PYDevice_getsets.append(PyGetSetDef { "platform", (getter)Device_get_platform, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "platform_name", (getter)Device_get_platform_name, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "index", (getter)Device_get_index, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "name", (getter)Device_get_name, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "vendor", (getter)Device_get_vendor, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "version", (getter)Device_get_version, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef { "features", (getter)Device_get_features, nullptr, "", nullptr });
		PYDevice_getsets.append(PyGetSetDef {});
		PYDevice_Type.tp_dealloc = (destructor)pyDevice_dealloc;
		PYDevice_number.nb_bool = (inquiry)pyDevice_bool;
		PYDevice_Type.tp_name = "tellusim.Device";
		PYDevice_Type.tp_basicsize = sizeof(PYDevice);
		PYDevice_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYDevice_Type.tp_doc = "";
		PYDevice_Type.tp_str = (reprfunc)pyDevice_str;
		PYDevice_Type.tp_as_number = &PYDevice_number;
		PYDevice_Type.tp_methods = PYDevice_methods.discard();
		PYDevice_Type.tp_getset = PYDevice_getsets.discard();
		PYDevice_Type.tp_init = (initproc)pyDevice_init;
		PYDevice_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDevice_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Device");
			return false;
		}
		Py_INCREF(&PYDevice_Type);
		
		// Tellusim::Device::Features
		PYDeviceFeatures_methods.append(PyMethodDef {});
		PYDeviceFeatures_members.reserve(PYDeviceFeatures_members.size() + 79);
		PYDeviceFeatures_getsets.reserve(PYDeviceFeatures_getsets.size() + 1);
		PYDeviceFeatures_members.append(PyMemberDef { "threadAccess", T_BOOL, offsetof(PYDeviceFeatures, ptr.threadAccess), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "sparseBuffer", T_BOOL, offsetof(PYDeviceFeatures, ptr.sparseBuffer), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "bufferTable", T_BOOL, offsetof(PYDeviceFeatures, ptr.bufferTable), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "sparseTexture", T_BOOL, offsetof(PYDeviceFeatures, ptr.sparseTexture), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "sparseArrayTexture", T_BOOL, offsetof(PYDeviceFeatures, ptr.sparseArrayTexture), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "cubeArrayTexture", T_BOOL, offsetof(PYDeviceFeatures, ptr.cubeArrayTexture), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "textureTable", T_BOOL, offsetof(PYDeviceFeatures, ptr.textureTable), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "baseInstanceIndex", T_BOOL, offsetof(PYDeviceFeatures, ptr.baseInstanceIndex), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "drawIndirectIndex", T_BOOL, offsetof(PYDeviceFeatures, ptr.drawIndirectIndex), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "drawIndirectCount", T_BOOL, offsetof(PYDeviceFeatures, ptr.drawIndirectCount), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "taskIndirectCount", T_BOOL, offsetof(PYDeviceFeatures, ptr.taskIndirectCount), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "vertexStorage", T_BOOL, offsetof(PYDeviceFeatures, ptr.vertexStorage), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "vertexIndexLayer", T_BOOL, offsetof(PYDeviceFeatures, ptr.vertexIndexLayer), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "geometryPassthrough", T_BOOL, offsetof(PYDeviceFeatures, ptr.geometryPassthrough), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "fragmentBarycentric", T_BOOL, offsetof(PYDeviceFeatures, ptr.fragmentBarycentric), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "fragmentStencilExport", T_BOOL, offsetof(PYDeviceFeatures, ptr.fragmentStencilExport), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "dualSourceBlending", T_BOOL, offsetof(PYDeviceFeatures, ptr.dualSourceBlending), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "depthRangeOneToOne", T_BOOL, offsetof(PYDeviceFeatures, ptr.depthRangeOneToOne), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "conservativeRaster", T_BOOL, offsetof(PYDeviceFeatures, ptr.conservativeRaster), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "conditionalRendering", T_BOOL, offsetof(PYDeviceFeatures, ptr.conditionalRendering), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "rayTracing", T_BOOL, offsetof(PYDeviceFeatures, ptr.rayTracing), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "computeTracing", T_BOOL, offsetof(PYDeviceFeatures, ptr.computeTracing), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "fragmentTracing", T_BOOL, offsetof(PYDeviceFeatures, ptr.fragmentTracing), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "indirectTracing", T_BOOL, offsetof(PYDeviceFeatures, ptr.indirectTracing), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "recursionDepth", T_UINT, offsetof(PYDeviceFeatures, ptr.recursionDepth), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "subgroupVote", T_BOOL, offsetof(PYDeviceFeatures, ptr.subgroupVote), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "subgroupMath", T_BOOL, offsetof(PYDeviceFeatures, ptr.subgroupMath), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "subgroupShuffle", T_BOOL, offsetof(PYDeviceFeatures, ptr.subgroupShuffle), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "subgroupSize", T_UINT, offsetof(PYDeviceFeatures, ptr.subgroupSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "minSubgroupSize", T_UINT, offsetof(PYDeviceFeatures, ptr.minSubgroupSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxSubgroupSize", T_UINT, offsetof(PYDeviceFeatures, ptr.maxSubgroupSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "shaderu8", T_BOOL, offsetof(PYDeviceFeatures, ptr.shaderu8), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "shaderf16", T_BOOL, offsetof(PYDeviceFeatures, ptr.shaderf16), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "shaderu16", T_BOOL, offsetof(PYDeviceFeatures, ptr.shaderu16), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "shaderf64", T_BOOL, offsetof(PYDeviceFeatures, ptr.shaderf64), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "shaderu64", T_BOOL, offsetof(PYDeviceFeatures, ptr.shaderu64), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicGroupf32", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicGroupf32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicGroupu64", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicGroupu64), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicBufferf32", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicBufferf32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicBufferu64", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicBufferu64), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicTexturef32", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicTexturef32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicTextureu32", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicTextureu32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "atomicTextureu64", T_BOOL, offsetof(PYDeviceFeatures, ptr.atomicTextureu64), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16f16", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16f16), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16x8x8f16", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16x8x8f16), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16x8x16f16", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16x8x16f16), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16f16f32", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16f16f32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16x8x8f16f32", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16x8x8f16f32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "matrix16x8x16f16f32", T_BOOL, offsetof(PYDeviceFeatures, ptr.matrix16x8x16f16f32), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "uniformAlignment", T_UINT, offsetof(PYDeviceFeatures, ptr.uniformAlignment), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "storageAlignment", T_UINT, offsetof(PYDeviceFeatures, ptr.storageAlignment), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTextureSamples", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTextureSamples), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTexture2DSize", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTexture2DSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTexture3DSize", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTexture3DSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTextureLayers", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTextureLayers), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupSizeX", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupSizeX), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupSizeY", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupSizeY), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupSizeZ", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupSizeZ), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupCountX", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupCountX), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupCountY", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupCountY), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxGroupCountZ", T_UINT, offsetof(PYDeviceFeatures, ptr.maxGroupCountZ), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTaskCount", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTaskCount), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTaskMemory", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTaskMemory), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxTaskMeshes", T_UINT, offsetof(PYDeviceFeatures, ptr.maxTaskMeshes), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxMeshMemory", T_UINT, offsetof(PYDeviceFeatures, ptr.maxMeshMemory), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxMeshVertices", T_UINT, offsetof(PYDeviceFeatures, ptr.maxMeshVertices), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxMeshPrimitives", T_UINT, offsetof(PYDeviceFeatures, ptr.maxMeshPrimitives), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxViewportCount", T_UINT, offsetof(PYDeviceFeatures, ptr.maxViewportCount), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxClipCullCount", T_UINT, offsetof(PYDeviceFeatures, ptr.maxClipCullCount), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxUniformSize", T_ULONGLONG, offsetof(PYDeviceFeatures, ptr.maxUniformSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "maxStorageSize", T_ULONGLONG, offsetof(PYDeviceFeatures, ptr.maxStorageSize), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "groupMemory", T_UINT, offsetof(PYDeviceFeatures, ptr.groupMemory), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "videoMemory", T_ULONGLONG, offsetof(PYDeviceFeatures, ptr.videoMemory), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "vendorID", T_UINT, offsetof(PYDeviceFeatures, ptr.vendorID), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "deviceID", T_UINT, offsetof(PYDeviceFeatures, ptr.deviceID), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "pciBusID", T_UINT, offsetof(PYDeviceFeatures, ptr.pciBusID), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "pciDomainID", T_UINT, offsetof(PYDeviceFeatures, ptr.pciDomainID), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef { "pciDeviceID", T_UINT, offsetof(PYDeviceFeatures, ptr.pciDeviceID), 0, "" });
		PYDeviceFeatures_members.append(PyMemberDef {});
		PYDeviceFeatures_getsets.append(PyGetSetDef {});
		PYDeviceFeatures_buffer.bf_getbuffer = (getbufferproc)pyDeviceFeatures_buffer;
		PYDeviceFeatures_Type.tp_str = (reprfunc)pyDeviceFeatures_str;
		PYDeviceFeatures_Type.tp_name = "tellusim.DeviceFeatures";
		PYDeviceFeatures_Type.tp_basicsize = sizeof(PYDeviceFeatures);
		PYDeviceFeatures_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYDeviceFeatures_Type.tp_doc = "";
		PYDeviceFeatures_Type.tp_as_number = &PYDeviceFeatures_number;
		PYDeviceFeatures_Type.tp_as_buffer = &PYDeviceFeatures_buffer;
		PYDeviceFeatures_Type.tp_methods = PYDeviceFeatures_methods.discard();
		PYDeviceFeatures_Type.tp_members = PYDeviceFeatures_members.discard();
		PYDeviceFeatures_Type.tp_getset = PYDeviceFeatures_getsets.discard();
		PYDeviceFeatures_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDeviceFeatures_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Device::Features");
			return false;
		}
		Py_INCREF(&PYDeviceFeatures_Type);
		
		// Tellusim::D3D12Device
		PYD3D12Device_methods.reserve(PYD3D12Device_methods.size() + 18);
		PYD3D12Device_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Device_equalPtr, METH_VARARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Device_clonePtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Device_clearPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Device_destroyPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Device_acquirePtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Device_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Device_isValidPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Device_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Device_isConstPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Device_getCountPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Device_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getDevice", (PyCFunction)pyD3D12Device_getDevice, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "setBufferState", (PyCFunction)D3D12Device_setBufferState, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "setTextureState", (PyCFunction)D3D12Device_setTextureState, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getD3D12Device", (PyCFunction)D3D12Device_getD3D12Device, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getQueue", (PyCFunction)D3D12Device_getQueue, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef { "getCommand", (PyCFunction)D3D12Device_getCommand, METH_NOARGS, "" });
		PYD3D12Device_methods.append(PyMethodDef {});
		PYD3D12Device_getsets.reserve(PYD3D12Device_getsets.size() + 4);
		PYD3D12Device_getsets.append(PyGetSetDef { "d3d12_device", (getter)D3D12Device_get_d3d12_device, nullptr, "", nullptr });
		PYD3D12Device_getsets.append(PyGetSetDef { "queue", (getter)D3D12Device_get_queue, nullptr, "", nullptr });
		PYD3D12Device_getsets.append(PyGetSetDef { "command", (getter)D3D12Device_get_command, nullptr, "", nullptr });
		PYD3D12Device_getsets.append(PyGetSetDef {});
		PYD3D12Device_Type.tp_base = &PYDevice_Type;
		PYD3D12Device_Type.tp_dealloc = (destructor)pyD3D12Device_dealloc;
		PYD3D12Device_number.nb_bool = (inquiry)pyD3D12Device_bool;
		PYD3D12Device_Type.tp_name = "tellusim.D3D12Device";
		PYD3D12Device_Type.tp_basicsize = sizeof(PYD3D12Device);
		PYD3D12Device_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Device_Type.tp_doc = "";
		PYD3D12Device_Type.tp_str = (reprfunc)pyD3D12Device_str;
		PYD3D12Device_Type.tp_as_number = &PYD3D12Device_number;
		PYD3D12Device_Type.tp_methods = PYD3D12Device_methods.discard();
		PYD3D12Device_Type.tp_getset = PYD3D12Device_getsets.discard();
		PYD3D12Device_Type.tp_init = (initproc)pyD3D12Device_init;
		PYD3D12Device_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Device_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Device");
			return false;
		}
		Py_INCREF(&PYD3D12Device_Type);
		
		// Tellusim::D3D11Device
		PYD3D11Device_methods.reserve(PYD3D11Device_methods.size() + 15);
		PYD3D11Device_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Device_equalPtr, METH_VARARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Device_clonePtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Device_clearPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Device_destroyPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Device_acquirePtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Device_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Device_isValidPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Device_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Device_isConstPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Device_getCountPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Device_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "getDevice", (PyCFunction)pyD3D11Device_getDevice, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "getD3D11Device", (PyCFunction)D3D11Device_getD3D11Device, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef { "getCommand", (PyCFunction)D3D11Device_getCommand, METH_NOARGS, "" });
		PYD3D11Device_methods.append(PyMethodDef {});
		PYD3D11Device_getsets.reserve(PYD3D11Device_getsets.size() + 3);
		PYD3D11Device_getsets.append(PyGetSetDef { "d3d11_device", (getter)D3D11Device_get_d3d11_device, nullptr, "", nullptr });
		PYD3D11Device_getsets.append(PyGetSetDef { "command", (getter)D3D11Device_get_command, nullptr, "", nullptr });
		PYD3D11Device_getsets.append(PyGetSetDef {});
		PYD3D11Device_Type.tp_base = &PYDevice_Type;
		PYD3D11Device_Type.tp_dealloc = (destructor)pyD3D11Device_dealloc;
		PYD3D11Device_number.nb_bool = (inquiry)pyD3D11Device_bool;
		PYD3D11Device_Type.tp_name = "tellusim.D3D11Device";
		PYD3D11Device_Type.tp_basicsize = sizeof(PYD3D11Device);
		PYD3D11Device_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Device_Type.tp_doc = "";
		PYD3D11Device_Type.tp_str = (reprfunc)pyD3D11Device_str;
		PYD3D11Device_Type.tp_as_number = &PYD3D11Device_number;
		PYD3D11Device_Type.tp_methods = PYD3D11Device_methods.discard();
		PYD3D11Device_Type.tp_getset = PYD3D11Device_getsets.discard();
		PYD3D11Device_Type.tp_init = (initproc)pyD3D11Device_init;
		PYD3D11Device_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Device_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Device");
			return false;
		}
		Py_INCREF(&PYD3D11Device_Type);
		
		// Tellusim::MTLDevice
		PYMTLDevice_methods.reserve(PYMTLDevice_methods.size() + 22);
		PYMTLDevice_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLDevice_equalPtr, METH_VARARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLDevice_clonePtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLDevice_clearPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLDevice_destroyPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLDevice_acquirePtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLDevice_unacquirePtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLDevice_isValidPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLDevice_isOwnerPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLDevice_isConstPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLDevice_getCountPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLDevice_getInternalPtr, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getDevice", (PyCFunction)pyMTLDevice_getDevice, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getMTLDevice", (PyCFunction)MTLDevice_getMTLDevice, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getQueue", (PyCFunction)MTLDevice_getQueue, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getCommand", (PyCFunction)MTLDevice_getCommand, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getEncoder", (PyCFunction)MTLDevice_getEncoder, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getRenderEncoder", (PyCFunction)MTLDevice_getRenderEncoder, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getComputeEncoder", (PyCFunction)MTLDevice_getComputeEncoder, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getTracingEncoder", (PyCFunction)MTLDevice_getTracingEncoder, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "getBlitEncoder", (PyCFunction)MTLDevice_getBlitEncoder, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef { "endEncoder", (PyCFunction)MTLDevice_endEncoder, METH_NOARGS, "" });
		PYMTLDevice_methods.append(PyMethodDef {});
		PYMTLDevice_getsets.reserve(PYMTLDevice_getsets.size() + 8);
		PYMTLDevice_getsets.append(PyGetSetDef { "mtl_device", (getter)MTLDevice_get_mtl_device, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "queue", (getter)MTLDevice_get_queue, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "command", (getter)MTLDevice_get_command, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "encoder", (getter)MTLDevice_get_encoder, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "compute_encoder", (getter)MTLDevice_get_compute_encoder, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "tracing_encoder", (getter)MTLDevice_get_tracing_encoder, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef { "blit_encoder", (getter)MTLDevice_get_blit_encoder, nullptr, "", nullptr });
		PYMTLDevice_getsets.append(PyGetSetDef {});
		PYMTLDevice_Type.tp_base = &PYDevice_Type;
		PYMTLDevice_Type.tp_dealloc = (destructor)pyMTLDevice_dealloc;
		PYMTLDevice_number.nb_bool = (inquiry)pyMTLDevice_bool;
		PYMTLDevice_Type.tp_name = "tellusim.MTLDevice";
		PYMTLDevice_Type.tp_basicsize = sizeof(PYMTLDevice);
		PYMTLDevice_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLDevice_Type.tp_doc = "";
		PYMTLDevice_Type.tp_str = (reprfunc)pyMTLDevice_str;
		PYMTLDevice_Type.tp_as_number = &PYMTLDevice_number;
		PYMTLDevice_Type.tp_methods = PYMTLDevice_methods.discard();
		PYMTLDevice_Type.tp_getset = PYMTLDevice_getsets.discard();
		PYMTLDevice_Type.tp_init = (initproc)pyMTLDevice_init;
		PYMTLDevice_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLDevice_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLDevice");
			return false;
		}
		Py_INCREF(&PYMTLDevice_Type);
		
		// Tellusim::VKDevice
		PYVKDevice_methods.reserve(PYVKDevice_methods.size() + 27);
		PYVKDevice_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKDevice_equalPtr, METH_VARARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKDevice_clonePtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKDevice_clearPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKDevice_destroyPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKDevice_acquirePtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKDevice_unacquirePtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKDevice_isValidPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKDevice_isOwnerPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKDevice_isConstPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKDevice_getCountPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKDevice_getInternalPtr, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getDevice", (PyCFunction)pyVKDevice_getDevice, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "setBufferAccess", (PyCFunction)VKDevice_setBufferAccess, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "setTextureLayout", (PyCFunction)VKDevice_setTextureLayout, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "waitVKFence", (PyCFunction)VKDevice_waitVKFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "signalVKFence", (PyCFunction)VKDevice_signalVKFence, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "waitSemaphore", (PyCFunction)VKDevice_waitSemaphore, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "signalSemaphore", (PyCFunction)VKDevice_signalSemaphore, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "hasMemoryType", (PyCFunction)VKDevice_hasMemoryType, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getMemoryIndex", (PyCFunction)VKDevice_getMemoryIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getInstance", (PyCFunction)VKDevice_getInstance, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getAdapter", (PyCFunction)VKDevice_getAdapter, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getVKDevice", (PyCFunction)VKDevice_getVKDevice, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getQueue", (PyCFunction)VKDevice_getQueue, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getCommand", (PyCFunction)VKDevice_getCommand, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef { "getFamily", (PyCFunction)VKDevice_getFamily, METH_NOARGS, "" });
		PYVKDevice_methods.append(PyMethodDef {});
		PYVKDevice_getsets.reserve(PYVKDevice_getsets.size() + 7);
		PYVKDevice_getsets.append(PyGetSetDef { "instance", (getter)VKDevice_get_instance, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef { "adapter", (getter)VKDevice_get_adapter, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef { "vk_device", (getter)VKDevice_get_vk_device, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef { "queue", (getter)VKDevice_get_queue, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef { "command", (getter)VKDevice_get_command, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef { "family", (getter)VKDevice_get_family, nullptr, "", nullptr });
		PYVKDevice_getsets.append(PyGetSetDef {});
		PYVKDevice_Type.tp_base = &PYDevice_Type;
		PYVKDevice_Type.tp_dealloc = (destructor)pyVKDevice_dealloc;
		PYVKDevice_number.nb_bool = (inquiry)pyVKDevice_bool;
		PYVKDevice_Type.tp_name = "tellusim.VKDevice";
		PYVKDevice_Type.tp_basicsize = sizeof(PYVKDevice);
		PYVKDevice_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKDevice_Type.tp_doc = "";
		PYVKDevice_Type.tp_str = (reprfunc)pyVKDevice_str;
		PYVKDevice_Type.tp_as_number = &PYVKDevice_number;
		PYVKDevice_Type.tp_methods = PYVKDevice_methods.discard();
		PYVKDevice_Type.tp_getset = PYVKDevice_getsets.discard();
		PYVKDevice_Type.tp_init = (initproc)pyVKDevice_init;
		PYVKDevice_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKDevice_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKDevice");
			return false;
		}
		Py_INCREF(&PYVKDevice_Type);
		
		// Tellusim::FUDevice
		PYFUDevice_methods.reserve(PYFUDevice_methods.size() + 17);
		PYFUDevice_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUDevice_equalPtr, METH_VARARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUDevice_clonePtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUDevice_clearPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUDevice_destroyPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUDevice_acquirePtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUDevice_unacquirePtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUDevice_isValidPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUDevice_isOwnerPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUDevice_isConstPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUDevice_getCountPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUDevice_getInternalPtr, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getDevice", (PyCFunction)pyFUDevice_getDevice, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "setMask", (PyCFunction)FUDevice_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getMask", (PyCFunction)FUDevice_getMask, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getNumDevices", (PyCFunction)FUDevice_getNumDevices, METH_NOARGS, "" });
		PYFUDevice_methods.append(PyMethodDef { "getDevice", (PyCFunction)FUDevice_getDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUDevice_methods.append(PyMethodDef {});
		PYFUDevice_getsets.reserve(PYFUDevice_getsets.size() + 3);
		PYFUDevice_getsets.append(PyGetSetDef { "mask", (getter)FUDevice_get_mask, nullptr, "", nullptr });
		PYFUDevice_getsets.append(PyGetSetDef { "num_devices", (getter)FUDevice_get_num_devices, nullptr, "", nullptr });
		PYFUDevice_getsets.append(PyGetSetDef {});
		PYFUDevice_Type.tp_base = &PYDevice_Type;
		PYFUDevice_Type.tp_dealloc = (destructor)pyFUDevice_dealloc;
		PYFUDevice_number.nb_bool = (inquiry)pyFUDevice_bool;
		PYFUDevice_Type.tp_name = "tellusim.FUDevice";
		PYFUDevice_Type.tp_basicsize = sizeof(PYFUDevice);
		PYFUDevice_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUDevice_Type.tp_doc = "";
		PYFUDevice_Type.tp_str = (reprfunc)pyFUDevice_str;
		PYFUDevice_Type.tp_as_number = &PYFUDevice_number;
		PYFUDevice_Type.tp_methods = PYFUDevice_methods.discard();
		PYFUDevice_Type.tp_getset = PYFUDevice_getsets.discard();
		PYFUDevice_Type.tp_init = (initproc)pyFUDevice_init;
		PYFUDevice_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUDevice_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUDevice");
			return false;
		}
		Py_INCREF(&PYFUDevice_Type);
		
		// Tellusim::Kernel
		PYKernel_methods.reserve(PYKernel_methods.size() + 88);
		PYKernel_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyKernel_equalPtr, METH_VARARGS, "" });
		PYKernel_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyKernel_clonePtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyKernel_clearPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyKernel_destroyPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyKernel_acquirePtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyKernel_unacquirePtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyKernel_isValidPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyKernel_isOwnerPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyKernel_isConstPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyKernel_getCountPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyKernel_getInternalPtr, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Kernel_getPlatform, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Kernel_getPlatformName, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getIndex", (PyCFunction)Kernel_getIndex, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "clear", (PyCFunction)Kernel_clear, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "isCreated", (PyCFunction)Kernel_isCreated, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setName", (PyCFunction)Kernel_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getName", (PyCFunction)Kernel_getName, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "create", (PyCFunction)Kernel_create, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setParameters", (PyCFunction)Kernel_setParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "saveState", (PyCFunction)Kernel_saveState, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "setShader", (PyCFunction)Kernel_setShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getComputeShader", (PyCFunction)Kernel_getComputeShader, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "loadShader", (PyCFunction)Kernel_loadShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "loadShaderGLSL", (PyCFunction)Kernel_loadShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "loadShaderSPIRV", (PyCFunction)Kernel_loadShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "createShader", (PyCFunction)Kernel_createShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "createShaderGLSL", (PyCFunction)Kernel_createShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "createShaderSPIRV", (PyCFunction)Kernel_createShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addSampler", (PyCFunction)Kernel_addSampler, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSamplers", (PyCFunction)Kernel_setSamplers, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumSamplers", (PyCFunction)Kernel_getNumSamplers, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSamplerOffset", (PyCFunction)Kernel_setSamplerOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getSamplerOffset", (PyCFunction)Kernel_getSamplerOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSamplerArray", (PyCFunction)Kernel_setSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getSamplerArray", (PyCFunction)Kernel_getSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addTexture", (PyCFunction)Kernel_addTexture, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTextures", (PyCFunction)Kernel_setTextures, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumTextures", (PyCFunction)Kernel_getNumTextures, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTextureOffset", (PyCFunction)Kernel_setTextureOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTextureOffset", (PyCFunction)Kernel_getTextureOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTextureArray", (PyCFunction)Kernel_setTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTextureArray", (PyCFunction)Kernel_getTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addSurface", (PyCFunction)Kernel_addSurface, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSurfaces", (PyCFunction)Kernel_setSurfaces, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumSurfaces", (PyCFunction)Kernel_getNumSurfaces, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSurfaceOffset", (PyCFunction)Kernel_setSurfaceOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getSurfaceOffset", (PyCFunction)Kernel_getSurfaceOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setSurfaceArray", (PyCFunction)Kernel_setSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getSurfaceArray", (PyCFunction)Kernel_getSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addUniform", (PyCFunction)Kernel_addUniform, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "setUniforms", (PyCFunction)Kernel_setUniforms, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumUniforms", (PyCFunction)Kernel_getNumUniforms, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Kernel_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getUniformOffset", (PyCFunction)Kernel_getUniformOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setUniformFlags", (PyCFunction)Kernel_setUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getUniformFlags", (PyCFunction)Kernel_getUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addStorage", (PyCFunction)Kernel_addStorage, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "setStorages", (PyCFunction)Kernel_setStorages, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumStorages", (PyCFunction)Kernel_getNumStorages, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Kernel_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getStorageOffset", (PyCFunction)Kernel_getStorageOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setStorageFlags", (PyCFunction)Kernel_setStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getStorageFlags", (PyCFunction)Kernel_getStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "addTracing", (PyCFunction)Kernel_addTracing, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTracings", (PyCFunction)Kernel_setTracings, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumTracings", (PyCFunction)Kernel_getNumTracings, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTracingOffset", (PyCFunction)Kernel_setTracingOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTracingOffset", (PyCFunction)Kernel_getTracingOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "addTexel", (PyCFunction)Kernel_addTexel, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTexels", (PyCFunction)Kernel_setTexels, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumTexels", (PyCFunction)Kernel_getNumTexels, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTexelOffset", (PyCFunction)Kernel_setTexelOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTexelOffset", (PyCFunction)Kernel_getTexelOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "addTable", (PyCFunction)Kernel_addTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getNumTables", (PyCFunction)Kernel_getNumTables, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTableOffset", (PyCFunction)Kernel_setTableOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTableOffset", (PyCFunction)Kernel_getTableOffset, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "setTableType", (PyCFunction)Kernel_setTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTableType", (PyCFunction)Kernel_getTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTableSize", (PyCFunction)Kernel_getTableSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "setTableFlags", (PyCFunction)Kernel_setTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getTableFlags", (PyCFunction)Kernel_getTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "setGroupSize", (PyCFunction)Kernel_setGroupSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYKernel_methods.append(PyMethodDef { "getGroupSizeX", (PyCFunction)Kernel_getGroupSizeX, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getGroupSizeY", (PyCFunction)Kernel_getGroupSizeY, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef { "getGroupSizeZ", (PyCFunction)Kernel_getGroupSizeZ, METH_NOARGS, "" });
		PYKernel_methods.append(PyMethodDef {});
		PYKernel_getsets.reserve(PYKernel_getsets.size() + 25);
		PYKernel_getsets.append(PyGetSetDef { "platform", (getter)Kernel_get_platform, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "platform_name", (getter)Kernel_get_platform_name, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "index", (getter)Kernel_get_index, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "name", (getter)Kernel_get_name, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "compute_shader", (getter)Kernel_get_compute_shader, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_samplers", (getter)Kernel_get_num_samplers, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "sampler_offset", (getter)Kernel_get_sampler_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_textures", (getter)Kernel_get_num_textures, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "texture_offset", (getter)Kernel_get_texture_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_surfaces", (getter)Kernel_get_num_surfaces, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "surface_offset", (getter)Kernel_get_surface_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_uniforms", (getter)Kernel_get_num_uniforms, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "uniform_offset", (getter)Kernel_get_uniform_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_storages", (getter)Kernel_get_num_storages, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "storage_offset", (getter)Kernel_get_storage_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_tracings", (getter)Kernel_get_num_tracings, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "tracing_offset", (getter)Kernel_get_tracing_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_texels", (getter)Kernel_get_num_texels, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "texel_offset", (getter)Kernel_get_texel_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "num_tables", (getter)Kernel_get_num_tables, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "table_offset", (getter)Kernel_get_table_offset, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "group_size_x", (getter)Kernel_get_group_size_x, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "group_size_y", (getter)Kernel_get_group_size_y, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef { "group_size_z", (getter)Kernel_get_group_size_z, nullptr, "", nullptr });
		PYKernel_getsets.append(PyGetSetDef {});
		PYKernel_Type.tp_dealloc = (destructor)pyKernel_dealloc;
		PYKernel_number.nb_bool = (inquiry)pyKernel_bool;
		PYKernel_Type.tp_name = "tellusim.Kernel";
		PYKernel_Type.tp_basicsize = sizeof(PYKernel);
		PYKernel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYKernel_Type.tp_doc = "";
		PYKernel_Type.tp_str = (reprfunc)pyKernel_str;
		PYKernel_Type.tp_as_number = &PYKernel_number;
		PYKernel_Type.tp_methods = PYKernel_methods.discard();
		PYKernel_Type.tp_getset = PYKernel_getsets.discard();
		PYKernel_Type.tp_init = (initproc)pyKernel_init;
		PYKernel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYKernel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Kernel");
			return false;
		}
		Py_INCREF(&PYKernel_Type);
		
		// Tellusim::D3D12Kernel
		PYD3D12Kernel_methods.reserve(PYD3D12Kernel_methods.size() + 14);
		PYD3D12Kernel_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Kernel_equalPtr, METH_VARARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Kernel_clonePtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Kernel_clearPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Kernel_destroyPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Kernel_acquirePtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Kernel_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Kernel_isValidPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Kernel_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Kernel_isConstPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Kernel_getCountPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Kernel_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "getKernel", (PyCFunction)pyD3D12Kernel_getKernel, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef { "getRootSignature", (PyCFunction)D3D12Kernel_getRootSignature, METH_NOARGS, "" });
		PYD3D12Kernel_methods.append(PyMethodDef {});
		PYD3D12Kernel_getsets.reserve(PYD3D12Kernel_getsets.size() + 2);
		PYD3D12Kernel_getsets.append(PyGetSetDef { "root_signature", (getter)D3D12Kernel_get_root_signature, nullptr, "", nullptr });
		PYD3D12Kernel_getsets.append(PyGetSetDef {});
		PYD3D12Kernel_Type.tp_base = &PYKernel_Type;
		PYD3D12Kernel_Type.tp_dealloc = (destructor)pyD3D12Kernel_dealloc;
		PYD3D12Kernel_number.nb_bool = (inquiry)pyD3D12Kernel_bool;
		PYD3D12Kernel_Type.tp_name = "tellusim.D3D12Kernel";
		PYD3D12Kernel_Type.tp_basicsize = sizeof(PYD3D12Kernel);
		PYD3D12Kernel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Kernel_Type.tp_doc = "";
		PYD3D12Kernel_Type.tp_str = (reprfunc)pyD3D12Kernel_str;
		PYD3D12Kernel_Type.tp_as_number = &PYD3D12Kernel_number;
		PYD3D12Kernel_Type.tp_methods = PYD3D12Kernel_methods.discard();
		PYD3D12Kernel_Type.tp_getset = PYD3D12Kernel_getsets.discard();
		PYD3D12Kernel_Type.tp_init = (initproc)pyD3D12Kernel_init;
		PYD3D12Kernel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Kernel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Kernel");
			return false;
		}
		Py_INCREF(&PYD3D12Kernel_Type);
		
		// Tellusim::MTLKernel
		PYMTLKernel_methods.reserve(PYMTLKernel_methods.size() + 16);
		PYMTLKernel_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLKernel_equalPtr, METH_VARARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLKernel_clonePtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLKernel_clearPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLKernel_destroyPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLKernel_acquirePtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLKernel_unacquirePtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLKernel_isValidPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLKernel_isOwnerPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLKernel_isConstPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLKernel_getCountPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLKernel_getInternalPtr, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "getKernel", (PyCFunction)pyMTLKernel_getKernel, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "setIndirect", (PyCFunction)MTLKernel_setIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "isIndirect", (PyCFunction)MTLKernel_isIndirect, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef { "getComputeFunction", (PyCFunction)MTLKernel_getComputeFunction, METH_NOARGS, "" });
		PYMTLKernel_methods.append(PyMethodDef {});
		PYMTLKernel_getsets.reserve(PYMTLKernel_getsets.size() + 2);
		PYMTLKernel_getsets.append(PyGetSetDef { "compute_function", (getter)MTLKernel_get_compute_function, nullptr, "", nullptr });
		PYMTLKernel_getsets.append(PyGetSetDef {});
		PYMTLKernel_Type.tp_base = &PYKernel_Type;
		PYMTLKernel_Type.tp_dealloc = (destructor)pyMTLKernel_dealloc;
		PYMTLKernel_number.nb_bool = (inquiry)pyMTLKernel_bool;
		PYMTLKernel_Type.tp_name = "tellusim.MTLKernel";
		PYMTLKernel_Type.tp_basicsize = sizeof(PYMTLKernel);
		PYMTLKernel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLKernel_Type.tp_doc = "";
		PYMTLKernel_Type.tp_str = (reprfunc)pyMTLKernel_str;
		PYMTLKernel_Type.tp_as_number = &PYMTLKernel_number;
		PYMTLKernel_Type.tp_methods = PYMTLKernel_methods.discard();
		PYMTLKernel_Type.tp_getset = PYMTLKernel_getsets.discard();
		PYMTLKernel_Type.tp_init = (initproc)pyMTLKernel_init;
		PYMTLKernel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLKernel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLKernel");
			return false;
		}
		Py_INCREF(&PYMTLKernel_Type);
		
		// Tellusim::FUKernel
		PYFUKernel_methods.reserve(PYFUKernel_methods.size() + 17);
		PYFUKernel_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUKernel_equalPtr, METH_VARARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUKernel_clonePtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUKernel_clearPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUKernel_destroyPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUKernel_acquirePtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUKernel_unacquirePtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUKernel_isValidPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUKernel_isOwnerPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUKernel_isConstPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUKernel_getCountPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUKernel_getInternalPtr, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getKernel", (PyCFunction)pyFUKernel_getKernel, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "setMask", (PyCFunction)FUKernel_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getMask", (PyCFunction)FUKernel_getMask, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getNumKernels", (PyCFunction)FUKernel_getNumKernels, METH_NOARGS, "" });
		PYFUKernel_methods.append(PyMethodDef { "getKernel", (PyCFunction)FUKernel_getKernel, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUKernel_methods.append(PyMethodDef {});
		PYFUKernel_getsets.reserve(PYFUKernel_getsets.size() + 3);
		PYFUKernel_getsets.append(PyGetSetDef { "mask", (getter)FUKernel_get_mask, nullptr, "", nullptr });
		PYFUKernel_getsets.append(PyGetSetDef { "num_kernels", (getter)FUKernel_get_num_kernels, nullptr, "", nullptr });
		PYFUKernel_getsets.append(PyGetSetDef {});
		PYFUKernel_Type.tp_base = &PYKernel_Type;
		PYFUKernel_Type.tp_dealloc = (destructor)pyFUKernel_dealloc;
		PYFUKernel_number.nb_bool = (inquiry)pyFUKernel_bool;
		PYFUKernel_Type.tp_name = "tellusim.FUKernel";
		PYFUKernel_Type.tp_basicsize = sizeof(PYFUKernel);
		PYFUKernel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUKernel_Type.tp_doc = "";
		PYFUKernel_Type.tp_str = (reprfunc)pyFUKernel_str;
		PYFUKernel_Type.tp_as_number = &PYFUKernel_number;
		PYFUKernel_Type.tp_methods = PYFUKernel_methods.discard();
		PYFUKernel_Type.tp_getset = PYFUKernel_getsets.discard();
		PYFUKernel_Type.tp_init = (initproc)pyFUKernel_init;
		PYFUKernel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUKernel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUKernel");
			return false;
		}
		Py_INCREF(&PYFUKernel_Type);
		
		// Tellusim::Pipeline
		PYPipeline_methods.reserve(PYPipeline_methods.size() + 203);
		PYPipeline_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyPipeline_equalPtr, METH_VARARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyPipeline_clonePtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyPipeline_clearPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyPipeline_destroyPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyPipeline_acquirePtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyPipeline_unacquirePtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyPipeline_isValidPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyPipeline_isOwnerPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyPipeline_isConstPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyPipeline_getCountPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyPipeline_getInternalPtr, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Pipeline_getPlatform, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Pipeline_getPlatformName, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getIndex", (PyCFunction)Pipeline_getIndex, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "clear", (PyCFunction)Pipeline_clear, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "isCreated", (PyCFunction)Pipeline_isCreated, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setName", (PyCFunction)Pipeline_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getName", (PyCFunction)Pipeline_getName, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "create", (PyCFunction)Pipeline_create, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setParameters", (PyCFunction)Pipeline_setParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "saveState", (PyCFunction)Pipeline_saveState, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addShader", (PyCFunction)Pipeline_addShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getVertexShader", (PyCFunction)Pipeline_getVertexShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getControlShader", (PyCFunction)Pipeline_getControlShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getEvaluateShader", (PyCFunction)Pipeline_getEvaluateShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getGeometryShader", (PyCFunction)Pipeline_getGeometryShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getFragmentShader", (PyCFunction)Pipeline_getFragmentShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTaskShader", (PyCFunction)Pipeline_getTaskShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getMeshShader", (PyCFunction)Pipeline_getMeshShader, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "loadShader", (PyCFunction)Pipeline_loadShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "loadShaderGLSL", (PyCFunction)Pipeline_loadShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "loadShaderSPIRV", (PyCFunction)Pipeline_loadShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "createShader", (PyCFunction)Pipeline_createShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "createShaderGLSL", (PyCFunction)Pipeline_createShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "createShaderSPIRV", (PyCFunction)Pipeline_createShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addSampler", (PyCFunction)Pipeline_addSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumSamplers", (PyCFunction)Pipeline_getNumSamplers, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSamplerOffset", (PyCFunction)Pipeline_setSamplerOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSamplerOffset", (PyCFunction)Pipeline_getSamplerOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSamplerMask", (PyCFunction)Pipeline_setSamplerMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSamplerMask", (PyCFunction)Pipeline_getSamplerMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSamplerMasks", (PyCFunction)Pipeline_setSamplerMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSamplerMasks", (PyCFunction)Pipeline_getSamplerMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSamplerArray", (PyCFunction)Pipeline_setSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSamplerArray", (PyCFunction)Pipeline_getSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addTexture", (PyCFunction)Pipeline_addTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumTextures", (PyCFunction)Pipeline_getNumTextures, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTextureOffset", (PyCFunction)Pipeline_setTextureOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTextureOffset", (PyCFunction)Pipeline_getTextureOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTextureMask", (PyCFunction)Pipeline_setTextureMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTextureMask", (PyCFunction)Pipeline_getTextureMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTextureMasks", (PyCFunction)Pipeline_setTextureMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTextureMasks", (PyCFunction)Pipeline_getTextureMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTextureArray", (PyCFunction)Pipeline_setTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTextureArray", (PyCFunction)Pipeline_getTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addSurface", (PyCFunction)Pipeline_addSurface, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumSurfaces", (PyCFunction)Pipeline_getNumSurfaces, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSurfaceOffset", (PyCFunction)Pipeline_setSurfaceOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSurfaceOffset", (PyCFunction)Pipeline_getSurfaceOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSurfaceMask", (PyCFunction)Pipeline_setSurfaceMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSurfaceMask", (PyCFunction)Pipeline_getSurfaceMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSurfaceMasks", (PyCFunction)Pipeline_setSurfaceMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSurfaceMasks", (PyCFunction)Pipeline_getSurfaceMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSurfaceArray", (PyCFunction)Pipeline_setSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSurfaceArray", (PyCFunction)Pipeline_getSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addUniform", (PyCFunction)Pipeline_addUniform, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumUniforms", (PyCFunction)Pipeline_getNumUniforms, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Pipeline_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getUniformOffset", (PyCFunction)Pipeline_getUniformOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setUniformMask", (PyCFunction)Pipeline_setUniformMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getUniformMask", (PyCFunction)Pipeline_getUniformMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setUniformMasks", (PyCFunction)Pipeline_setUniformMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getUniformMasks", (PyCFunction)Pipeline_getUniformMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setUniformFlags", (PyCFunction)Pipeline_setUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getUniformFlags", (PyCFunction)Pipeline_getUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addStorage", (PyCFunction)Pipeline_addStorage, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumStorages", (PyCFunction)Pipeline_getNumStorages, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Pipeline_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStorageOffset", (PyCFunction)Pipeline_getStorageOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStorageMask", (PyCFunction)Pipeline_setStorageMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStorageMask", (PyCFunction)Pipeline_getStorageMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStorageMasks", (PyCFunction)Pipeline_setStorageMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStorageMasks", (PyCFunction)Pipeline_getStorageMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStorageFlags", (PyCFunction)Pipeline_setStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStorageFlags", (PyCFunction)Pipeline_getStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addTracing", (PyCFunction)Pipeline_addTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumTracings", (PyCFunction)Pipeline_getNumTracings, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTracingOffset", (PyCFunction)Pipeline_setTracingOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTracingOffset", (PyCFunction)Pipeline_getTracingOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTracingMask", (PyCFunction)Pipeline_setTracingMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTracingMask", (PyCFunction)Pipeline_getTracingMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTracingMasks", (PyCFunction)Pipeline_setTracingMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTracingMasks", (PyCFunction)Pipeline_getTracingMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addTexel", (PyCFunction)Pipeline_addTexel, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumTexels", (PyCFunction)Pipeline_getNumTexels, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTexelOffset", (PyCFunction)Pipeline_setTexelOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTexelOffset", (PyCFunction)Pipeline_getTexelOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTexelMask", (PyCFunction)Pipeline_setTexelMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTexelMask", (PyCFunction)Pipeline_getTexelMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTexelMasks", (PyCFunction)Pipeline_setTexelMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTexelMasks", (PyCFunction)Pipeline_getTexelMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addTable", (PyCFunction)Pipeline_addTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumTables", (PyCFunction)Pipeline_getNumTables, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTableOffset", (PyCFunction)Pipeline_setTableOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTableOffset", (PyCFunction)Pipeline_getTableOffset, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTableType", (PyCFunction)Pipeline_setTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTableType", (PyCFunction)Pipeline_getTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTableSize", (PyCFunction)Pipeline_getTableSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTableMask", (PyCFunction)Pipeline_setTableMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTableMask", (PyCFunction)Pipeline_getTableMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setTableFlags", (PyCFunction)Pipeline_setTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getTableFlags", (PyCFunction)Pipeline_getTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumVertices", (PyCFunction)Pipeline_getNumVertices, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getVertexStride", (PyCFunction)Pipeline_getVertexStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getVertexRate", (PyCFunction)Pipeline_getVertexRate, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "addAttribute", (PyCFunction)Pipeline_addAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttribute", (PyCFunction)Pipeline_setAttribute, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeType", (PyCFunction)Pipeline_setAttributeType, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeFormat", (PyCFunction)Pipeline_setAttributeFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeVertex", (PyCFunction)Pipeline_setAttributeVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeOffset", (PyCFunction)Pipeline_setAttributeOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeStride", (PyCFunction)Pipeline_setAttributeStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAttributeRate", (PyCFunction)Pipeline_setAttributeRate, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumAttributes", (PyCFunction)Pipeline_getNumAttributes, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeType", (PyCFunction)Pipeline_getAttributeType, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeFormat", (PyCFunction)Pipeline_getAttributeFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeVertex", (PyCFunction)Pipeline_getAttributeVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeOffset", (PyCFunction)Pipeline_getAttributeOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeStride", (PyCFunction)Pipeline_getAttributeStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAttributeRate", (PyCFunction)Pipeline_getAttributeRate, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setPrimitive", (PyCFunction)Pipeline_setPrimitive, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getPrimitive", (PyCFunction)Pipeline_getPrimitive, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setFillMode", (PyCFunction)Pipeline_setFillMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getFillMode", (PyCFunction)Pipeline_getFillMode, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setCullMode", (PyCFunction)Pipeline_setCullMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getCullMode", (PyCFunction)Pipeline_getCullMode, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setFrontMode", (PyCFunction)Pipeline_setFrontMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getFrontMode", (PyCFunction)Pipeline_getFrontMode, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthBias", (PyCFunction)Pipeline_setDepthBias, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthBias", (PyCFunction)Pipeline_getDepthBias, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthSlope", (PyCFunction)Pipeline_getDepthSlope, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthClamp", (PyCFunction)Pipeline_getDepthClamp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setMultisample", (PyCFunction)Pipeline_setMultisample, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Pipeline_getMultisample, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSampleMask", (PyCFunction)Pipeline_setSampleMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSampleMask", (PyCFunction)Pipeline_getSampleMask, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthClip", (PyCFunction)Pipeline_setDepthClip, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthClip", (PyCFunction)Pipeline_getDepthClip, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthReplace", (PyCFunction)Pipeline_setDepthReplace, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthReplace", (PyCFunction)Pipeline_getDepthReplace, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setScissorTest", (PyCFunction)Pipeline_setScissorTest, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getScissorTest", (PyCFunction)Pipeline_getScissorTest, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setRasterDiscard", (PyCFunction)Pipeline_setRasterDiscard, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getRasterDiscard", (PyCFunction)Pipeline_getRasterDiscard, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setSampleShading", (PyCFunction)Pipeline_setSampleShading, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getSampleShading", (PyCFunction)Pipeline_getSampleShading, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setAlphaToCoverage", (PyCFunction)Pipeline_setAlphaToCoverage, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getAlphaToCoverage", (PyCFunction)Pipeline_getAlphaToCoverage, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setMultisampleRaster", (PyCFunction)Pipeline_setMultisampleRaster, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getMultisampleRaster", (PyCFunction)Pipeline_getMultisampleRaster, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setConservativeRaster", (PyCFunction)Pipeline_setConservativeRaster, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getConservativeRaster", (PyCFunction)Pipeline_getConservativeRaster, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setNumViewports", (PyCFunction)Pipeline_setNumViewports, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumTargets", (PyCFunction)Pipeline_getNumTargets, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumViewports", (PyCFunction)Pipeline_getNumViewports, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setNumClipDistances", (PyCFunction)Pipeline_setNumClipDistances, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getNumClipDistances", (PyCFunction)Pipeline_getNumClipDistances, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setBlend", (PyCFunction)Pipeline_setBlend, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setBlendColor", (PyCFunction)Pipeline_setBlendColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setBlendAlpha", (PyCFunction)Pipeline_setBlendAlpha, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendColorOp", (PyCFunction)Pipeline_getBlendColorOp, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendAlphaOp", (PyCFunction)Pipeline_getBlendAlphaOp, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendSrcColorFunc", (PyCFunction)Pipeline_getBlendSrcColorFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendSrcAlphaFunc", (PyCFunction)Pipeline_getBlendSrcAlphaFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendDestColorFunc", (PyCFunction)Pipeline_getBlendDestColorFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getBlendDestAlphaFunc", (PyCFunction)Pipeline_getBlendDestAlphaFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setColorMask", (PyCFunction)Pipeline_setColorMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setColorFormat", (PyCFunction)Pipeline_setColorFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getColorMask", (PyCFunction)Pipeline_getColorMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getColorFormat", (PyCFunction)Pipeline_getColorFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthMask", (PyCFunction)Pipeline_setDepthMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthFunc", (PyCFunction)Pipeline_setDepthFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setDepthFormat", (PyCFunction)Pipeline_setDepthFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthMask", (PyCFunction)Pipeline_getDepthMask, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthFunc", (PyCFunction)Pipeline_getDepthFunc, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getDepthFormat", (PyCFunction)Pipeline_getDepthFormat, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilMask", (PyCFunction)Pipeline_setStencilMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilBackMask", (PyCFunction)Pipeline_setStencilBackMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilFrontMask", (PyCFunction)Pipeline_setStencilFrontMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilFunc", (PyCFunction)Pipeline_setStencilFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilBackFunc", (PyCFunction)Pipeline_setStencilBackFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "setStencilFrontFunc", (PyCFunction)Pipeline_setStencilFrontFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilBackMask", (PyCFunction)Pipeline_getStencilBackMask, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilBackFunc", (PyCFunction)Pipeline_getStencilBackFunc, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilBackFailOp", (PyCFunction)Pipeline_getStencilBackFailOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilBackDepthFailOp", (PyCFunction)Pipeline_getStencilBackDepthFailOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilBackDepthPassOp", (PyCFunction)Pipeline_getStencilBackDepthPassOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilFrontMask", (PyCFunction)Pipeline_getStencilFrontMask, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilFrontFunc", (PyCFunction)Pipeline_getStencilFrontFunc, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilFrontFailOp", (PyCFunction)Pipeline_getStencilFrontFailOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilFrontDepthFailOp", (PyCFunction)Pipeline_getStencilFrontDepthFailOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef { "getStencilFrontDepthPassOp", (PyCFunction)Pipeline_getStencilFrontDepthPassOp, METH_NOARGS, "" });
		PYPipeline_methods.append(PyMethodDef {});
		PYPipeline_getsets.reserve(PYPipeline_getsets.size() + 63);
		PYPipeline_getsets.append(PyGetSetDef { "platform", (getter)Pipeline_get_platform, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "platform_name", (getter)Pipeline_get_platform_name, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "index", (getter)Pipeline_get_index, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "name", (getter)Pipeline_get_name, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "vertex_shader", (getter)Pipeline_get_vertex_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "control_shader", (getter)Pipeline_get_control_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "evaluate_shader", (getter)Pipeline_get_evaluate_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "geometry_shader", (getter)Pipeline_get_geometry_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "fragment_shader", (getter)Pipeline_get_fragment_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "task_shader", (getter)Pipeline_get_task_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "mesh_shader", (getter)Pipeline_get_mesh_shader, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_samplers", (getter)Pipeline_get_num_samplers, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "sampler_offset", (getter)Pipeline_get_sampler_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_textures", (getter)Pipeline_get_num_textures, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "texture_offset", (getter)Pipeline_get_texture_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_surfaces", (getter)Pipeline_get_num_surfaces, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "surface_offset", (getter)Pipeline_get_surface_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_uniforms", (getter)Pipeline_get_num_uniforms, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "uniform_offset", (getter)Pipeline_get_uniform_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_storages", (getter)Pipeline_get_num_storages, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "storage_offset", (getter)Pipeline_get_storage_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_tracings", (getter)Pipeline_get_num_tracings, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "tracing_offset", (getter)Pipeline_get_tracing_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_texels", (getter)Pipeline_get_num_texels, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "texel_offset", (getter)Pipeline_get_texel_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_tables", (getter)Pipeline_get_num_tables, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "table_offset", (getter)Pipeline_get_table_offset, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_vertices", (getter)Pipeline_get_num_vertices, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_attributes", (getter)Pipeline_get_num_attributes, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "primitive", (getter)Pipeline_get_primitive, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "fill_mode", (getter)Pipeline_get_fill_mode, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "cull_mode", (getter)Pipeline_get_cull_mode, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "front_mode", (getter)Pipeline_get_front_mode, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_bias", (getter)Pipeline_get_depth_bias, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_slope", (getter)Pipeline_get_depth_slope, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_clamp", (getter)Pipeline_get_depth_clamp, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "multisample", (getter)Pipeline_get_multisample, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "sample_mask", (getter)Pipeline_get_sample_mask, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_clip", (getter)Pipeline_get_depth_clip, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_replace", (getter)Pipeline_get_depth_replace, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "scissor_test", (getter)Pipeline_get_scissor_test, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "raster_discard", (getter)Pipeline_get_raster_discard, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "sample_shading", (getter)Pipeline_get_sample_shading, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "alpha_to_coverage", (getter)Pipeline_get_alpha_to_coverage, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "multisample_raster", (getter)Pipeline_get_multisample_raster, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "conservative_raster", (getter)Pipeline_get_conservative_raster, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_targets", (getter)Pipeline_get_num_targets, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_viewports", (getter)Pipeline_get_num_viewports, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "num_clip_distances", (getter)Pipeline_get_num_clip_distances, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_mask", (getter)Pipeline_get_depth_mask, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_func", (getter)Pipeline_get_depth_func, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "depth_format", (getter)Pipeline_get_depth_format, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_back_mask", (getter)Pipeline_get_stencil_back_mask, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_back_func", (getter)Pipeline_get_stencil_back_func, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_back_fail_op", (getter)Pipeline_get_stencil_back_fail_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_back_depth_fail_op", (getter)Pipeline_get_stencil_back_depth_fail_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_back_depth_pass_op", (getter)Pipeline_get_stencil_back_depth_pass_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_front_mask", (getter)Pipeline_get_stencil_front_mask, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_front_func", (getter)Pipeline_get_stencil_front_func, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_front_fail_op", (getter)Pipeline_get_stencil_front_fail_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_front_depth_fail_op", (getter)Pipeline_get_stencil_front_depth_fail_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef { "stencil_front_depth_pass_op", (getter)Pipeline_get_stencil_front_depth_pass_op, nullptr, "", nullptr });
		PYPipeline_getsets.append(PyGetSetDef {});
		PYPipeline_Type.tp_dealloc = (destructor)pyPipeline_dealloc;
		PYPipeline_number.nb_bool = (inquiry)pyPipeline_bool;
		PYPipeline_Type.tp_name = "tellusim.Pipeline";
		PYPipeline_Type.tp_basicsize = sizeof(PYPipeline);
		PYPipeline_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYPipeline_Type.tp_doc = "";
		PYPipeline_Type.tp_str = (reprfunc)pyPipeline_str;
		PYPipeline_Type.tp_as_number = &PYPipeline_number;
		PYPipeline_Type.tp_methods = PYPipeline_methods.discard();
		PYPipeline_Type.tp_getset = PYPipeline_getsets.discard();
		PYPipeline_Type.tp_init = (initproc)pyPipeline_init;
		PYPipeline_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYPipeline_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Pipeline");
			return false;
		}
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitivePoint", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitivePointPatch", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveLine", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveLineAdj", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveLineStrip", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveLinePatch", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveTriangle", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveTriangleAdj", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveTriangleStrip", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveTrianglePatch", PyLong_FromLong(9));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "PrimitiveQuadrilateralPatch", PyLong_FromLong(10));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumPrimitiveTypes", PyLong_FromLong(11));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributePosition", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeBasis", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeNormal", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeTangent", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeBinormal", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeTexCoord", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeWeights", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeJoints", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "AttributeColor", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumAttributeTypes", PyLong_FromLong(9));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "FillModeLine", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "FillModeSolid", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumFillModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "CullModeNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "CullModeBack", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "CullModeFront", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumCullModes", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "FrontModeCCW", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "FrontModeCW", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumFrontModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendOpAdd", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendOpSub", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendOpMin", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendOpMax", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumBlendOperations", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncZero", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncOne", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncSrcColor", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncSrcAlpha", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncSrc1Color", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncSrc1Alpha", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncDestColor", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncDestAlpha", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncFactorColor", PyLong_FromLong(9));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncFactorAlpha", PyLong_FromLong(10));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvSrcColor", PyLong_FromLong(11));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvSrcAlpha", PyLong_FromLong(12));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvSrc1Color", PyLong_FromLong(13));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvSrc1Alpha", PyLong_FromLong(14));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvDestColor", PyLong_FromLong(15));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvDestAlpha", PyLong_FromLong(16));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvFactorColor", PyLong_FromLong(17));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "BlendFuncInvFactorAlpha", PyLong_FromLong(18));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumBlendFunctions", PyLong_FromLong(19));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskR", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskG", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskB", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskA", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskUnknown", PyLong_FromLong(16));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskRGB", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "ColorMaskAll", PyLong_FromLong(15));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthMaskNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthMaskRead", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthMaskWrite", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumDepthMasks", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncNever", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncAlways", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncEqual", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncLess", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncGreater", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncNotEqual", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncLessEqual", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "DepthFuncGreaterEqual", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumDepthFunctions", PyLong_FromLong(9));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpKeep", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpInvert", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpReplace", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpIncrWrap", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpDecrWrap", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpIncrSat", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilOpDecrSat", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumStencilOperations", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncNever", PyLong_FromLong(1));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncAlways", PyLong_FromLong(2));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncEqual", PyLong_FromLong(3));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncLess", PyLong_FromLong(4));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncGreater", PyLong_FromLong(5));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncNotEqual", PyLong_FromLong(6));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncLessEqual", PyLong_FromLong(7));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "StencilFuncGreaterEqual", PyLong_FromLong(8));
		PyDict_SetItemString(PYPipeline_Type.tp_dict, "NumStencilFunctions", PyLong_FromLong(9));
		PyType_Modified(&PYPipeline_Type);
		Py_INCREF(&PYPipeline_Type);
		
		// Tellusim::D3D12Pipeline
		PYD3D12Pipeline_methods.reserve(PYD3D12Pipeline_methods.size() + 14);
		PYD3D12Pipeline_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Pipeline_equalPtr, METH_VARARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Pipeline_clonePtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Pipeline_clearPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Pipeline_destroyPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Pipeline_acquirePtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Pipeline_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Pipeline_isValidPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Pipeline_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Pipeline_isConstPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Pipeline_getCountPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Pipeline_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "getPipeline", (PyCFunction)pyD3D12Pipeline_getPipeline, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef { "getRootSignature", (PyCFunction)D3D12Pipeline_getRootSignature, METH_NOARGS, "" });
		PYD3D12Pipeline_methods.append(PyMethodDef {});
		PYD3D12Pipeline_getsets.reserve(PYD3D12Pipeline_getsets.size() + 2);
		PYD3D12Pipeline_getsets.append(PyGetSetDef { "root_signature", (getter)D3D12Pipeline_get_root_signature, nullptr, "", nullptr });
		PYD3D12Pipeline_getsets.append(PyGetSetDef {});
		PYD3D12Pipeline_Type.tp_base = &PYPipeline_Type;
		PYD3D12Pipeline_Type.tp_dealloc = (destructor)pyD3D12Pipeline_dealloc;
		PYD3D12Pipeline_number.nb_bool = (inquiry)pyD3D12Pipeline_bool;
		PYD3D12Pipeline_Type.tp_name = "tellusim.D3D12Pipeline";
		PYD3D12Pipeline_Type.tp_basicsize = sizeof(PYD3D12Pipeline);
		PYD3D12Pipeline_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Pipeline_Type.tp_doc = "";
		PYD3D12Pipeline_Type.tp_str = (reprfunc)pyD3D12Pipeline_str;
		PYD3D12Pipeline_Type.tp_as_number = &PYD3D12Pipeline_number;
		PYD3D12Pipeline_Type.tp_methods = PYD3D12Pipeline_methods.discard();
		PYD3D12Pipeline_Type.tp_getset = PYD3D12Pipeline_getsets.discard();
		PYD3D12Pipeline_Type.tp_init = (initproc)pyD3D12Pipeline_init;
		PYD3D12Pipeline_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Pipeline_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Pipeline");
			return false;
		}
		Py_INCREF(&PYD3D12Pipeline_Type);
		
		// Tellusim::MTLPipeline
		PYMTLPipeline_methods.reserve(PYMTLPipeline_methods.size() + 17);
		PYMTLPipeline_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLPipeline_equalPtr, METH_VARARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLPipeline_clonePtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLPipeline_clearPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLPipeline_destroyPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLPipeline_acquirePtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLPipeline_unacquirePtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLPipeline_isValidPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLPipeline_isOwnerPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLPipeline_isConstPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLPipeline_getCountPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLPipeline_getInternalPtr, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "getPipeline", (PyCFunction)pyMTLPipeline_getPipeline, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "setIndirect", (PyCFunction)MTLPipeline_setIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "isIndirect", (PyCFunction)MTLPipeline_isIndirect, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "getVertexFunction", (PyCFunction)MTLPipeline_getVertexFunction, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef { "getFragmentFunction", (PyCFunction)MTLPipeline_getFragmentFunction, METH_NOARGS, "" });
		PYMTLPipeline_methods.append(PyMethodDef {});
		PYMTLPipeline_getsets.reserve(PYMTLPipeline_getsets.size() + 3);
		PYMTLPipeline_getsets.append(PyGetSetDef { "vertex_function", (getter)MTLPipeline_get_vertex_function, nullptr, "", nullptr });
		PYMTLPipeline_getsets.append(PyGetSetDef { "fragment_function", (getter)MTLPipeline_get_fragment_function, nullptr, "", nullptr });
		PYMTLPipeline_getsets.append(PyGetSetDef {});
		PYMTLPipeline_Type.tp_base = &PYPipeline_Type;
		PYMTLPipeline_Type.tp_dealloc = (destructor)pyMTLPipeline_dealloc;
		PYMTLPipeline_number.nb_bool = (inquiry)pyMTLPipeline_bool;
		PYMTLPipeline_Type.tp_name = "tellusim.MTLPipeline";
		PYMTLPipeline_Type.tp_basicsize = sizeof(PYMTLPipeline);
		PYMTLPipeline_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLPipeline_Type.tp_doc = "";
		PYMTLPipeline_Type.tp_str = (reprfunc)pyMTLPipeline_str;
		PYMTLPipeline_Type.tp_as_number = &PYMTLPipeline_number;
		PYMTLPipeline_Type.tp_methods = PYMTLPipeline_methods.discard();
		PYMTLPipeline_Type.tp_getset = PYMTLPipeline_getsets.discard();
		PYMTLPipeline_Type.tp_init = (initproc)pyMTLPipeline_init;
		PYMTLPipeline_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLPipeline_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLPipeline");
			return false;
		}
		Py_INCREF(&PYMTLPipeline_Type);
		
		// Tellusim::FUPipeline
		PYFUPipeline_methods.reserve(PYFUPipeline_methods.size() + 17);
		PYFUPipeline_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUPipeline_equalPtr, METH_VARARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUPipeline_clonePtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUPipeline_clearPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUPipeline_destroyPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUPipeline_acquirePtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUPipeline_unacquirePtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUPipeline_isValidPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUPipeline_isOwnerPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUPipeline_isConstPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUPipeline_getCountPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUPipeline_getInternalPtr, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getPipeline", (PyCFunction)pyFUPipeline_getPipeline, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "setMask", (PyCFunction)FUPipeline_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getMask", (PyCFunction)FUPipeline_getMask, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getNumPipelines", (PyCFunction)FUPipeline_getNumPipelines, METH_NOARGS, "" });
		PYFUPipeline_methods.append(PyMethodDef { "getPipeline", (PyCFunction)FUPipeline_getPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUPipeline_methods.append(PyMethodDef {});
		PYFUPipeline_getsets.reserve(PYFUPipeline_getsets.size() + 3);
		PYFUPipeline_getsets.append(PyGetSetDef { "mask", (getter)FUPipeline_get_mask, nullptr, "", nullptr });
		PYFUPipeline_getsets.append(PyGetSetDef { "num_pipelines", (getter)FUPipeline_get_num_pipelines, nullptr, "", nullptr });
		PYFUPipeline_getsets.append(PyGetSetDef {});
		PYFUPipeline_Type.tp_base = &PYPipeline_Type;
		PYFUPipeline_Type.tp_dealloc = (destructor)pyFUPipeline_dealloc;
		PYFUPipeline_number.nb_bool = (inquiry)pyFUPipeline_bool;
		PYFUPipeline_Type.tp_name = "tellusim.FUPipeline";
		PYFUPipeline_Type.tp_basicsize = sizeof(PYFUPipeline);
		PYFUPipeline_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUPipeline_Type.tp_doc = "";
		PYFUPipeline_Type.tp_str = (reprfunc)pyFUPipeline_str;
		PYFUPipeline_Type.tp_as_number = &PYFUPipeline_number;
		PYFUPipeline_Type.tp_methods = PYFUPipeline_methods.discard();
		PYFUPipeline_Type.tp_getset = PYFUPipeline_getsets.discard();
		PYFUPipeline_Type.tp_init = (initproc)pyFUPipeline_init;
		PYFUPipeline_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUPipeline_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUPipeline");
			return false;
		}
		Py_INCREF(&PYFUPipeline_Type);
		
		// Tellusim::Traversal
		PYTraversal_methods.reserve(PYTraversal_methods.size() + 109);
		PYTraversal_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTraversal_equalPtr, METH_VARARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTraversal_clonePtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTraversal_clearPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTraversal_destroyPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTraversal_acquirePtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTraversal_unacquirePtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTraversal_isValidPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTraversal_isOwnerPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTraversal_isConstPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTraversal_getCountPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTraversal_getInternalPtr, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Traversal_getPlatform, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Traversal_getPlatformName, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "getIndex", (PyCFunction)Traversal_getIndex, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "clear", (PyCFunction)Traversal_clear, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "isCreated", (PyCFunction)Traversal_isCreated, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setName", (PyCFunction)Traversal_setName, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getName", (PyCFunction)Traversal_getName, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "create", (PyCFunction)Traversal_create, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setParameters", (PyCFunction)Traversal_setParameters, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "saveState", (PyCFunction)Traversal_saveState, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addShader", (PyCFunction)Traversal_addShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getRayGenShader", (PyCFunction)Traversal_getRayGenShader, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "loadShader", (PyCFunction)Traversal_loadShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "loadShaderGLSL", (PyCFunction)Traversal_loadShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "loadShaderSPIRV", (PyCFunction)Traversal_loadShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "createShader", (PyCFunction)Traversal_createShader, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "createShaderGLSL", (PyCFunction)Traversal_createShaderGLSL, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "createShaderSPIRV", (PyCFunction)Traversal_createShaderSPIRV, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addSampler", (PyCFunction)Traversal_addSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumSamplers", (PyCFunction)Traversal_getNumSamplers, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSamplerOffset", (PyCFunction)Traversal_setSamplerOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSamplerOffset", (PyCFunction)Traversal_getSamplerOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSamplerMask", (PyCFunction)Traversal_setSamplerMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSamplerMask", (PyCFunction)Traversal_getSamplerMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSamplerMasks", (PyCFunction)Traversal_setSamplerMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSamplerMasks", (PyCFunction)Traversal_getSamplerMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSamplerArray", (PyCFunction)Traversal_setSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSamplerArray", (PyCFunction)Traversal_getSamplerArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addTexture", (PyCFunction)Traversal_addTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumTextures", (PyCFunction)Traversal_getNumTextures, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTextureOffset", (PyCFunction)Traversal_setTextureOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTextureOffset", (PyCFunction)Traversal_getTextureOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTextureMask", (PyCFunction)Traversal_setTextureMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTextureMask", (PyCFunction)Traversal_getTextureMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTextureMasks", (PyCFunction)Traversal_setTextureMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTextureMasks", (PyCFunction)Traversal_getTextureMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTextureArray", (PyCFunction)Traversal_setTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTextureArray", (PyCFunction)Traversal_getTextureArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addSurface", (PyCFunction)Traversal_addSurface, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumSurfaces", (PyCFunction)Traversal_getNumSurfaces, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSurfaceOffset", (PyCFunction)Traversal_setSurfaceOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSurfaceOffset", (PyCFunction)Traversal_getSurfaceOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSurfaceMask", (PyCFunction)Traversal_setSurfaceMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSurfaceMask", (PyCFunction)Traversal_getSurfaceMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSurfaceMasks", (PyCFunction)Traversal_setSurfaceMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSurfaceMasks", (PyCFunction)Traversal_getSurfaceMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setSurfaceArray", (PyCFunction)Traversal_setSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getSurfaceArray", (PyCFunction)Traversal_getSurfaceArray, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addUniform", (PyCFunction)Traversal_addUniform, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumUniforms", (PyCFunction)Traversal_getNumUniforms, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setUniformOffset", (PyCFunction)Traversal_setUniformOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getUniformOffset", (PyCFunction)Traversal_getUniformOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setUniformMask", (PyCFunction)Traversal_setUniformMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getUniformMask", (PyCFunction)Traversal_getUniformMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setUniformMasks", (PyCFunction)Traversal_setUniformMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getUniformMasks", (PyCFunction)Traversal_getUniformMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setUniformFlags", (PyCFunction)Traversal_setUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getUniformFlags", (PyCFunction)Traversal_getUniformFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addStorage", (PyCFunction)Traversal_addStorage, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumStorages", (PyCFunction)Traversal_getNumStorages, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setStorageOffset", (PyCFunction)Traversal_setStorageOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getStorageOffset", (PyCFunction)Traversal_getStorageOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setStorageMask", (PyCFunction)Traversal_setStorageMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getStorageMask", (PyCFunction)Traversal_getStorageMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setStorageMasks", (PyCFunction)Traversal_setStorageMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getStorageMasks", (PyCFunction)Traversal_getStorageMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setStorageFlags", (PyCFunction)Traversal_setStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getStorageFlags", (PyCFunction)Traversal_getStorageFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addTracing", (PyCFunction)Traversal_addTracing, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumTracings", (PyCFunction)Traversal_getNumTracings, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTracingOffset", (PyCFunction)Traversal_setTracingOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTracingOffset", (PyCFunction)Traversal_getTracingOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTracingMask", (PyCFunction)Traversal_setTracingMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTracingMask", (PyCFunction)Traversal_getTracingMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTracingMasks", (PyCFunction)Traversal_setTracingMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTracingMasks", (PyCFunction)Traversal_getTracingMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addTexel", (PyCFunction)Traversal_addTexel, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumTexels", (PyCFunction)Traversal_getNumTexels, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTexelOffset", (PyCFunction)Traversal_setTexelOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTexelOffset", (PyCFunction)Traversal_getTexelOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTexelMask", (PyCFunction)Traversal_setTexelMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTexelMask", (PyCFunction)Traversal_getTexelMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTexelMasks", (PyCFunction)Traversal_setTexelMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTexelMasks", (PyCFunction)Traversal_getTexelMasks, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "addTable", (PyCFunction)Traversal_addTable, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getNumTables", (PyCFunction)Traversal_getNumTables, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTableOffset", (PyCFunction)Traversal_setTableOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTableOffset", (PyCFunction)Traversal_getTableOffset, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTableType", (PyCFunction)Traversal_setTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTableType", (PyCFunction)Traversal_getTableType, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTableSize", (PyCFunction)Traversal_getTableSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTableMask", (PyCFunction)Traversal_setTableMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTableMask", (PyCFunction)Traversal_getTableMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setTableFlags", (PyCFunction)Traversal_setTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getTableFlags", (PyCFunction)Traversal_getTableFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "setRecursionDepth", (PyCFunction)Traversal_setRecursionDepth, METH_VARARGS | METH_KEYWORDS, "" });
		PYTraversal_methods.append(PyMethodDef { "getRecursionDepth", (PyCFunction)Traversal_getRecursionDepth, METH_NOARGS, "" });
		PYTraversal_methods.append(PyMethodDef {});
		PYTraversal_getsets.reserve(PYTraversal_getsets.size() + 23);
		PYTraversal_getsets.append(PyGetSetDef { "platform", (getter)Traversal_get_platform, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "platform_name", (getter)Traversal_get_platform_name, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "index", (getter)Traversal_get_index, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "name", (getter)Traversal_get_name, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "ray_gen_shader", (getter)Traversal_get_ray_gen_shader, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_samplers", (getter)Traversal_get_num_samplers, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "sampler_offset", (getter)Traversal_get_sampler_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_textures", (getter)Traversal_get_num_textures, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "texture_offset", (getter)Traversal_get_texture_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_surfaces", (getter)Traversal_get_num_surfaces, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "surface_offset", (getter)Traversal_get_surface_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_uniforms", (getter)Traversal_get_num_uniforms, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "uniform_offset", (getter)Traversal_get_uniform_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_storages", (getter)Traversal_get_num_storages, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "storage_offset", (getter)Traversal_get_storage_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_tracings", (getter)Traversal_get_num_tracings, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "tracing_offset", (getter)Traversal_get_tracing_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_texels", (getter)Traversal_get_num_texels, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "texel_offset", (getter)Traversal_get_texel_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "num_tables", (getter)Traversal_get_num_tables, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "table_offset", (getter)Traversal_get_table_offset, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef { "recursion_depth", (getter)Traversal_get_recursion_depth, nullptr, "", nullptr });
		PYTraversal_getsets.append(PyGetSetDef {});
		PYTraversal_Type.tp_dealloc = (destructor)pyTraversal_dealloc;
		PYTraversal_number.nb_bool = (inquiry)pyTraversal_bool;
		PYTraversal_Type.tp_name = "tellusim.Traversal";
		PYTraversal_Type.tp_basicsize = sizeof(PYTraversal);
		PYTraversal_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYTraversal_Type.tp_doc = "";
		PYTraversal_Type.tp_str = (reprfunc)pyTraversal_str;
		PYTraversal_Type.tp_as_number = &PYTraversal_number;
		PYTraversal_Type.tp_methods = PYTraversal_methods.discard();
		PYTraversal_Type.tp_getset = PYTraversal_getsets.discard();
		PYTraversal_Type.tp_init = (initproc)pyTraversal_init;
		PYTraversal_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTraversal_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Traversal");
			return false;
		}
		Py_INCREF(&PYTraversal_Type);
		
		// Tellusim::D3D12Traversal
		PYD3D12Traversal_methods.reserve(PYD3D12Traversal_methods.size() + 14);
		PYD3D12Traversal_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Traversal_equalPtr, METH_VARARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Traversal_clonePtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Traversal_clearPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Traversal_destroyPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Traversal_acquirePtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Traversal_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Traversal_isValidPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Traversal_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Traversal_isConstPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Traversal_getCountPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Traversal_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "getTraversal", (PyCFunction)pyD3D12Traversal_getTraversal, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef { "getRootSignature", (PyCFunction)D3D12Traversal_getRootSignature, METH_NOARGS, "" });
		PYD3D12Traversal_methods.append(PyMethodDef {});
		PYD3D12Traversal_getsets.reserve(PYD3D12Traversal_getsets.size() + 2);
		PYD3D12Traversal_getsets.append(PyGetSetDef { "root_signature", (getter)D3D12Traversal_get_root_signature, nullptr, "", nullptr });
		PYD3D12Traversal_getsets.append(PyGetSetDef {});
		PYD3D12Traversal_Type.tp_base = &PYTraversal_Type;
		PYD3D12Traversal_Type.tp_dealloc = (destructor)pyD3D12Traversal_dealloc;
		PYD3D12Traversal_number.nb_bool = (inquiry)pyD3D12Traversal_bool;
		PYD3D12Traversal_Type.tp_name = "tellusim.D3D12Traversal";
		PYD3D12Traversal_Type.tp_basicsize = sizeof(PYD3D12Traversal);
		PYD3D12Traversal_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Traversal_Type.tp_doc = "";
		PYD3D12Traversal_Type.tp_str = (reprfunc)pyD3D12Traversal_str;
		PYD3D12Traversal_Type.tp_as_number = &PYD3D12Traversal_number;
		PYD3D12Traversal_Type.tp_methods = PYD3D12Traversal_methods.discard();
		PYD3D12Traversal_Type.tp_getset = PYD3D12Traversal_getsets.discard();
		PYD3D12Traversal_Type.tp_init = (initproc)pyD3D12Traversal_init;
		PYD3D12Traversal_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Traversal_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Traversal");
			return false;
		}
		Py_INCREF(&PYD3D12Traversal_Type);
		
		// Tellusim::FUTraversal
		PYFUTraversal_methods.reserve(PYFUTraversal_methods.size() + 17);
		PYFUTraversal_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFUTraversal_equalPtr, METH_VARARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFUTraversal_clonePtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFUTraversal_clearPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFUTraversal_destroyPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFUTraversal_acquirePtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFUTraversal_unacquirePtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFUTraversal_isValidPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFUTraversal_isOwnerPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFUTraversal_isConstPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFUTraversal_getCountPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFUTraversal_getInternalPtr, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getTraversal", (PyCFunction)pyFUTraversal_getTraversal, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "setMask", (PyCFunction)FUTraversal_setMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getMask", (PyCFunction)FUTraversal_getMask, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getNumTraversals", (PyCFunction)FUTraversal_getNumTraversals, METH_NOARGS, "" });
		PYFUTraversal_methods.append(PyMethodDef { "getTraversal", (PyCFunction)FUTraversal_getTraversal, METH_VARARGS | METH_KEYWORDS, "" });
		PYFUTraversal_methods.append(PyMethodDef {});
		PYFUTraversal_getsets.reserve(PYFUTraversal_getsets.size() + 3);
		PYFUTraversal_getsets.append(PyGetSetDef { "mask", (getter)FUTraversal_get_mask, nullptr, "", nullptr });
		PYFUTraversal_getsets.append(PyGetSetDef { "num_traversals", (getter)FUTraversal_get_num_traversals, nullptr, "", nullptr });
		PYFUTraversal_getsets.append(PyGetSetDef {});
		PYFUTraversal_Type.tp_base = &PYTraversal_Type;
		PYFUTraversal_Type.tp_dealloc = (destructor)pyFUTraversal_dealloc;
		PYFUTraversal_number.nb_bool = (inquiry)pyFUTraversal_bool;
		PYFUTraversal_Type.tp_name = "tellusim.FUTraversal";
		PYFUTraversal_Type.tp_basicsize = sizeof(PYFUTraversal);
		PYFUTraversal_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFUTraversal_Type.tp_doc = "";
		PYFUTraversal_Type.tp_str = (reprfunc)pyFUTraversal_str;
		PYFUTraversal_Type.tp_as_number = &PYFUTraversal_number;
		PYFUTraversal_Type.tp_methods = PYFUTraversal_methods.discard();
		PYFUTraversal_Type.tp_getset = PYFUTraversal_getsets.discard();
		PYFUTraversal_Type.tp_init = (initproc)pyFUTraversal_init;
		PYFUTraversal_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFUTraversal_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FUTraversal");
			return false;
		}
		Py_INCREF(&PYFUTraversal_Type);
		
		// Tellusim::Surface
		PYSurface_methods.reserve(PYSurface_methods.size() + 33);
		PYSurface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySurface_equalPtr, METH_VARARGS, "" });
		PYSurface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySurface_clonePtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySurface_clearPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySurface_destroyPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySurface_acquirePtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySurface_unacquirePtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySurface_isValidPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySurface_isOwnerPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySurface_isConstPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySurface_getCountPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySurface_getInternalPtr, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Surface_getPlatform, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Surface_getPlatformName, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getIndex", (PyCFunction)Surface_getIndex, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "setSize", (PyCFunction)Surface_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "getWidth", (PyCFunction)Surface_getWidth, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getHeight", (PyCFunction)Surface_getHeight, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "setMultisample", (PyCFunction)Surface_setMultisample, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Surface_getMultisample, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "hasMultisample", (PyCFunction)Surface_hasMultisample, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "setColorLayer", (PyCFunction)Surface_setColorLayer, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "setDepthLayer", (PyCFunction)Surface_setDepthLayer, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "getColorLayer", (PyCFunction)Surface_getColorLayer, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getDepthLayer", (PyCFunction)Surface_getDepthLayer, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getColorLayers", (PyCFunction)Surface_getColorLayers, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getDepthLayers", (PyCFunction)Surface_getDepthLayers, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "hasColorLayers", (PyCFunction)Surface_hasColorLayers, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "hasDepthLayers", (PyCFunction)Surface_hasDepthLayers, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "setColorFormat", (PyCFunction)Surface_setColorFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "setDepthFormat", (PyCFunction)Surface_setDepthFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYSurface_methods.append(PyMethodDef { "getColorFormat", (PyCFunction)Surface_getColorFormat, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef { "getDepthFormat", (PyCFunction)Surface_getDepthFormat, METH_NOARGS, "" });
		PYSurface_methods.append(PyMethodDef {});
		PYSurface_getsets.reserve(PYSurface_getsets.size() + 13);
		PYSurface_getsets.append(PyGetSetDef { "platform", (getter)Surface_get_platform, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "platform_name", (getter)Surface_get_platform_name, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "index", (getter)Surface_get_index, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "width", (getter)Surface_get_width, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "height", (getter)Surface_get_height, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "multisample", (getter)Surface_get_multisample, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "color_layer", (getter)Surface_get_color_layer, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "depth_layer", (getter)Surface_get_depth_layer, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "color_layers", (getter)Surface_get_color_layers, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "depth_layers", (getter)Surface_get_depth_layers, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "color_format", (getter)Surface_get_color_format, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef { "depth_format", (getter)Surface_get_depth_format, nullptr, "", nullptr });
		PYSurface_getsets.append(PyGetSetDef {});
		PYSurface_Type.tp_dealloc = (destructor)pySurface_dealloc;
		PYSurface_number.nb_bool = (inquiry)pySurface_bool;
		PYSurface_Type.tp_name = "tellusim.Surface";
		PYSurface_Type.tp_basicsize = sizeof(PYSurface);
		PYSurface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYSurface_Type.tp_doc = "";
		PYSurface_Type.tp_str = (reprfunc)pySurface_str;
		PYSurface_Type.tp_as_number = &PYSurface_number;
		PYSurface_Type.tp_methods = PYSurface_methods.discard();
		PYSurface_Type.tp_getset = PYSurface_getsets.discard();
		PYSurface_Type.tp_init = (initproc)pySurface_init;
		PYSurface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSurface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Surface");
			return false;
		}
		Py_INCREF(&PYSurface_Type);
		
		// Tellusim::D3D12Surface
		PYD3D12Surface_methods.reserve(PYD3D12Surface_methods.size() + 29);
		PYD3D12Surface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D12Surface_equalPtr, METH_VARARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D12Surface_clonePtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D12Surface_clearPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D12Surface_destroyPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D12Surface_acquirePtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D12Surface_unacquirePtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D12Surface_isValidPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D12Surface_isOwnerPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D12Surface_isConstPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D12Surface_getCountPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D12Surface_getInternalPtr, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyD3D12Surface_getSurface, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getFactory", (PyCFunction)D3D12Surface_getFactory, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getDevice", (PyCFunction)D3D12Surface_getDevice, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getQueue", (PyCFunction)D3D12Surface_getQueue, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getCommand", (PyCFunction)D3D12Surface_getCommand, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "setSwapChain", (PyCFunction)D3D12Surface_setSwapChain, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getSwapChain", (PyCFunction)D3D12Surface_getSwapChain, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "setRenderTarget", (PyCFunction)D3D12Surface_setRenderTarget, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "setDepthStencil", (PyCFunction)D3D12Surface_setDepthStencil, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getRenderTarget", (PyCFunction)D3D12Surface_getRenderTarget, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getDepthStencil", (PyCFunction)D3D12Surface_getDepthStencil, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "setRenderTargetView", (PyCFunction)D3D12Surface_setRenderTargetView, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "setDepthStencilView", (PyCFunction)D3D12Surface_setDepthStencilView, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getRenderTargetView", (PyCFunction)D3D12Surface_getRenderTargetView, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D12Surface_getDepthStencilView, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getColorDXGIFormat", (PyCFunction)D3D12Surface_getColorDXGIFormat, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef { "getDepthDXGIFormat", (PyCFunction)D3D12Surface_getDepthDXGIFormat, METH_NOARGS, "" });
		PYD3D12Surface_methods.append(PyMethodDef {});
		PYD3D12Surface_getsets.reserve(PYD3D12Surface_getsets.size() + 12);
		PYD3D12Surface_getsets.append(PyGetSetDef { "factory", (getter)D3D12Surface_get_factory, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "device", (getter)D3D12Surface_get_device, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "queue", (getter)D3D12Surface_get_queue, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "command", (getter)D3D12Surface_get_command, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "swap_chain", (getter)D3D12Surface_get_swap_chain, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "render_target", (getter)D3D12Surface_get_render_target, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "depth_stencil", (getter)D3D12Surface_get_depth_stencil, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "render_target_view", (getter)D3D12Surface_get_render_target_view, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D12Surface_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "color_dxgi_format", (getter)D3D12Surface_get_color_dxgi_format, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef { "depth_dxgi_format", (getter)D3D12Surface_get_depth_dxgi_format, nullptr, "", nullptr });
		PYD3D12Surface_getsets.append(PyGetSetDef {});
		PYD3D12Surface_Type.tp_base = &PYSurface_Type;
		PYD3D12Surface_Type.tp_dealloc = (destructor)pyD3D12Surface_dealloc;
		PYD3D12Surface_number.nb_bool = (inquiry)pyD3D12Surface_bool;
		PYD3D12Surface_Type.tp_name = "tellusim.D3D12Surface";
		PYD3D12Surface_Type.tp_basicsize = sizeof(PYD3D12Surface);
		PYD3D12Surface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D12Surface_Type.tp_doc = "";
		PYD3D12Surface_Type.tp_str = (reprfunc)pyD3D12Surface_str;
		PYD3D12Surface_Type.tp_as_number = &PYD3D12Surface_number;
		PYD3D12Surface_Type.tp_methods = PYD3D12Surface_methods.discard();
		PYD3D12Surface_Type.tp_getset = PYD3D12Surface_getsets.discard();
		PYD3D12Surface_Type.tp_init = (initproc)pyD3D12Surface_init;
		PYD3D12Surface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D12Surface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D12Surface");
			return false;
		}
		Py_INCREF(&PYD3D12Surface_Type);
		
		// Tellusim::D3D11Surface
		PYD3D11Surface_methods.reserve(PYD3D11Surface_methods.size() + 28);
		PYD3D11Surface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyD3D11Surface_equalPtr, METH_VARARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyD3D11Surface_clonePtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyD3D11Surface_clearPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyD3D11Surface_destroyPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyD3D11Surface_acquirePtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyD3D11Surface_unacquirePtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyD3D11Surface_isValidPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyD3D11Surface_isOwnerPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyD3D11Surface_isConstPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyD3D11Surface_getCountPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyD3D11Surface_getInternalPtr, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyD3D11Surface_getSurface, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getFactory", (PyCFunction)D3D11Surface_getFactory, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getDevice", (PyCFunction)D3D11Surface_getDevice, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getContext", (PyCFunction)D3D11Surface_getContext, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "setSwapChain", (PyCFunction)D3D11Surface_setSwapChain, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getSwapChain", (PyCFunction)D3D11Surface_getSwapChain, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "setRenderTarget", (PyCFunction)D3D11Surface_setRenderTarget, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "setDepthStencil", (PyCFunction)D3D11Surface_setDepthStencil, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getRenderTarget", (PyCFunction)D3D11Surface_getRenderTarget, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getDepthStencil", (PyCFunction)D3D11Surface_getDepthStencil, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "setRenderTargetView", (PyCFunction)D3D11Surface_setRenderTargetView, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "setDepthStencilView", (PyCFunction)D3D11Surface_setDepthStencilView, METH_VARARGS | METH_KEYWORDS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getRenderTargetView", (PyCFunction)D3D11Surface_getRenderTargetView, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getDepthStencilView", (PyCFunction)D3D11Surface_getDepthStencilView, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getColorDXGIFormat", (PyCFunction)D3D11Surface_getColorDXGIFormat, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef { "getDepthDXGIFormat", (PyCFunction)D3D11Surface_getDepthDXGIFormat, METH_NOARGS, "" });
		PYD3D11Surface_methods.append(PyMethodDef {});
		PYD3D11Surface_getsets.reserve(PYD3D11Surface_getsets.size() + 11);
		PYD3D11Surface_getsets.append(PyGetSetDef { "factory", (getter)D3D11Surface_get_factory, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "device", (getter)D3D11Surface_get_device, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "context", (getter)D3D11Surface_get_context, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "swap_chain", (getter)D3D11Surface_get_swap_chain, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "render_target", (getter)D3D11Surface_get_render_target, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "depth_stencil", (getter)D3D11Surface_get_depth_stencil, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "render_target_view", (getter)D3D11Surface_get_render_target_view, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "depth_stencil_view", (getter)D3D11Surface_get_depth_stencil_view, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "color_dxgi_format", (getter)D3D11Surface_get_color_dxgi_format, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef { "depth_dxgi_format", (getter)D3D11Surface_get_depth_dxgi_format, nullptr, "", nullptr });
		PYD3D11Surface_getsets.append(PyGetSetDef {});
		PYD3D11Surface_Type.tp_base = &PYSurface_Type;
		PYD3D11Surface_Type.tp_dealloc = (destructor)pyD3D11Surface_dealloc;
		PYD3D11Surface_number.nb_bool = (inquiry)pyD3D11Surface_bool;
		PYD3D11Surface_Type.tp_name = "tellusim.D3D11Surface";
		PYD3D11Surface_Type.tp_basicsize = sizeof(PYD3D11Surface);
		PYD3D11Surface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYD3D11Surface_Type.tp_doc = "";
		PYD3D11Surface_Type.tp_str = (reprfunc)pyD3D11Surface_str;
		PYD3D11Surface_Type.tp_as_number = &PYD3D11Surface_number;
		PYD3D11Surface_Type.tp_methods = PYD3D11Surface_methods.discard();
		PYD3D11Surface_Type.tp_getset = PYD3D11Surface_getsets.discard();
		PYD3D11Surface_Type.tp_init = (initproc)pyD3D11Surface_init;
		PYD3D11Surface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYD3D11Surface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "D3D11Surface");
			return false;
		}
		Py_INCREF(&PYD3D11Surface_Type);
		
		// Tellusim::MTLSurface
		PYMTLSurface_methods.reserve(PYMTLSurface_methods.size() + 20);
		PYMTLSurface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyMTLSurface_equalPtr, METH_VARARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyMTLSurface_clonePtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyMTLSurface_clearPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyMTLSurface_destroyPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyMTLSurface_acquirePtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyMTLSurface_unacquirePtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyMTLSurface_isValidPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyMTLSurface_isOwnerPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyMTLSurface_isConstPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyMTLSurface_getCountPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyMTLSurface_getInternalPtr, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyMTLSurface_getSurface, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getDevice", (PyCFunction)MTLSurface_getDevice, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getQueue", (PyCFunction)MTLSurface_getQueue, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getCommand", (PyCFunction)MTLSurface_getCommand, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "setDescriptor", (PyCFunction)MTLSurface_setDescriptor, METH_VARARGS | METH_KEYWORDS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getDescriptor", (PyCFunction)MTLSurface_getDescriptor, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getColorPixelFormat", (PyCFunction)MTLSurface_getColorPixelFormat, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef { "getDepthPixelFormat", (PyCFunction)MTLSurface_getDepthPixelFormat, METH_NOARGS, "" });
		PYMTLSurface_methods.append(PyMethodDef {});
		PYMTLSurface_getsets.reserve(PYMTLSurface_getsets.size() + 7);
		PYMTLSurface_getsets.append(PyGetSetDef { "device", (getter)MTLSurface_get_device, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef { "queue", (getter)MTLSurface_get_queue, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef { "command", (getter)MTLSurface_get_command, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef { "descriptor", (getter)MTLSurface_get_descriptor, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef { "color_pixel_format", (getter)MTLSurface_get_color_pixel_format, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef { "depth_pixel_format", (getter)MTLSurface_get_depth_pixel_format, nullptr, "", nullptr });
		PYMTLSurface_getsets.append(PyGetSetDef {});
		PYMTLSurface_Type.tp_base = &PYSurface_Type;
		PYMTLSurface_Type.tp_dealloc = (destructor)pyMTLSurface_dealloc;
		PYMTLSurface_number.nb_bool = (inquiry)pyMTLSurface_bool;
		PYMTLSurface_Type.tp_name = "tellusim.MTLSurface";
		PYMTLSurface_Type.tp_basicsize = sizeof(PYMTLSurface);
		PYMTLSurface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMTLSurface_Type.tp_doc = "";
		PYMTLSurface_Type.tp_str = (reprfunc)pyMTLSurface_str;
		PYMTLSurface_Type.tp_as_number = &PYMTLSurface_number;
		PYMTLSurface_Type.tp_methods = PYMTLSurface_methods.discard();
		PYMTLSurface_Type.tp_getset = PYMTLSurface_getsets.discard();
		PYMTLSurface_Type.tp_init = (initproc)pyMTLSurface_init;
		PYMTLSurface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMTLSurface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MTLSurface");
			return false;
		}
		Py_INCREF(&PYMTLSurface_Type);
		
		// Tellusim::VKSurface
		PYVKSurface_methods.reserve(PYVKSurface_methods.size() + 33);
		PYVKSurface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyVKSurface_equalPtr, METH_VARARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyVKSurface_clonePtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyVKSurface_clearPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyVKSurface_destroyPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyVKSurface_acquirePtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyVKSurface_unacquirePtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyVKSurface_isValidPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyVKSurface_isOwnerPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyVKSurface_isConstPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyVKSurface_getCountPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyVKSurface_getInternalPtr, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyVKSurface_getSurface, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getInstance", (PyCFunction)VKSurface_getInstance, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getAdapter", (PyCFunction)VKSurface_getAdapter, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getDevice", (PyCFunction)VKSurface_getDevice, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getQueue", (PyCFunction)VKSurface_getQueue, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getCommand", (PyCFunction)VKSurface_getCommand, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getFamily", (PyCFunction)VKSurface_getFamily, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setColorImage", (PyCFunction)VKSurface_setColorImage, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setDepthImage", (PyCFunction)VKSurface_setDepthImage, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getColorImage", (PyCFunction)VKSurface_getColorImage, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getDepthImage", (PyCFunction)VKSurface_getDepthImage, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setColorImageView", (PyCFunction)VKSurface_setColorImageView, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setDepthImageView", (PyCFunction)VKSurface_setDepthImageView, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getColorImageView", (PyCFunction)VKSurface_getColorImageView, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getDepthImageView", (PyCFunction)VKSurface_getDepthImageView, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setRenderPass", (PyCFunction)VKSurface_setRenderPass, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "setFramebuffer", (PyCFunction)VKSurface_setFramebuffer, METH_VARARGS | METH_KEYWORDS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getRenderPass", (PyCFunction)VKSurface_getRenderPass, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getFramebuffer", (PyCFunction)VKSurface_getFramebuffer, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getColorPixelFormat", (PyCFunction)VKSurface_getColorPixelFormat, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef { "getDepthPixelFormat", (PyCFunction)VKSurface_getDepthPixelFormat, METH_NOARGS, "" });
		PYVKSurface_methods.append(PyMethodDef {});
		PYVKSurface_getsets.reserve(PYVKSurface_getsets.size() + 15);
		PYVKSurface_getsets.append(PyGetSetDef { "instance", (getter)VKSurface_get_instance, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "adapter", (getter)VKSurface_get_adapter, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "device", (getter)VKSurface_get_device, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "queue", (getter)VKSurface_get_queue, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "command", (getter)VKSurface_get_command, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "family", (getter)VKSurface_get_family, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "color_image", (getter)VKSurface_get_color_image, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "depth_image", (getter)VKSurface_get_depth_image, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "color_image_view", (getter)VKSurface_get_color_image_view, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "depth_image_view", (getter)VKSurface_get_depth_image_view, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "render_pass", (getter)VKSurface_get_render_pass, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "framebuffer", (getter)VKSurface_get_framebuffer, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "color_pixel_format", (getter)VKSurface_get_color_pixel_format, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef { "depth_pixel_format", (getter)VKSurface_get_depth_pixel_format, nullptr, "", nullptr });
		PYVKSurface_getsets.append(PyGetSetDef {});
		PYVKSurface_Type.tp_base = &PYSurface_Type;
		PYVKSurface_Type.tp_dealloc = (destructor)pyVKSurface_dealloc;
		PYVKSurface_number.nb_bool = (inquiry)pyVKSurface_bool;
		PYVKSurface_Type.tp_name = "tellusim.VKSurface";
		PYVKSurface_Type.tp_basicsize = sizeof(PYVKSurface);
		PYVKSurface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYVKSurface_Type.tp_doc = "";
		PYVKSurface_Type.tp_str = (reprfunc)pyVKSurface_str;
		PYVKSurface_Type.tp_as_number = &PYVKSurface_number;
		PYVKSurface_Type.tp_methods = PYVKSurface_methods.discard();
		PYVKSurface_Type.tp_getset = PYVKSurface_getsets.discard();
		PYVKSurface_Type.tp_init = (initproc)pyVKSurface_init;
		PYVKSurface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYVKSurface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "VKSurface");
			return false;
		}
		Py_INCREF(&PYVKSurface_Type);
		
		// Tellusim::GLSurface
		PYGLSurface_methods.reserve(PYGLSurface_methods.size() + 22);
		PYGLSurface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLSurface_equalPtr, METH_VARARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLSurface_clonePtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLSurface_clearPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLSurface_destroyPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLSurface_acquirePtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLSurface_unacquirePtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLSurface_isValidPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLSurface_isOwnerPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLSurface_isConstPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLSurface_getCountPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLSurface_getInternalPtr, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyGLSurface_getSurface, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getContext", (PyCFunction)GLSurface_getContext, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "setColorTextureID", (PyCFunction)GLSurface_setColorTextureID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLSurface_methods.append(PyMethodDef { "setDepthTextureID", (PyCFunction)GLSurface_setDepthTextureID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getColorTextureID", (PyCFunction)GLSurface_getColorTextureID, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getDepthTextureID", (PyCFunction)GLSurface_getDepthTextureID, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "setFramebufferID", (PyCFunction)GLSurface_setFramebufferID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getFramebufferID", (PyCFunction)GLSurface_getFramebufferID, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getColorInternalFormat", (PyCFunction)GLSurface_getColorInternalFormat, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef { "getDepthInternalFormat", (PyCFunction)GLSurface_getDepthInternalFormat, METH_NOARGS, "" });
		PYGLSurface_methods.append(PyMethodDef {});
		PYGLSurface_getsets.reserve(PYGLSurface_getsets.size() + 7);
		PYGLSurface_getsets.append(PyGetSetDef { "context", (getter)GLSurface_get_context, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef { "color_texture_id", (getter)GLSurface_get_color_texture_id, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef { "depth_texture_id", (getter)GLSurface_get_depth_texture_id, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef { "framebuffer_id", (getter)GLSurface_get_framebuffer_id, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef { "color_internal_format", (getter)GLSurface_get_color_internal_format, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef { "depth_internal_format", (getter)GLSurface_get_depth_internal_format, nullptr, "", nullptr });
		PYGLSurface_getsets.append(PyGetSetDef {});
		PYGLSurface_Type.tp_base = &PYSurface_Type;
		PYGLSurface_Type.tp_dealloc = (destructor)pyGLSurface_dealloc;
		PYGLSurface_number.nb_bool = (inquiry)pyGLSurface_bool;
		PYGLSurface_Type.tp_name = "tellusim.GLSurface";
		PYGLSurface_Type.tp_basicsize = sizeof(PYGLSurface);
		PYGLSurface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLSurface_Type.tp_doc = "";
		PYGLSurface_Type.tp_str = (reprfunc)pyGLSurface_str;
		PYGLSurface_Type.tp_as_number = &PYGLSurface_number;
		PYGLSurface_Type.tp_methods = PYGLSurface_methods.discard();
		PYGLSurface_Type.tp_getset = PYGLSurface_getsets.discard();
		PYGLSurface_Type.tp_init = (initproc)pyGLSurface_init;
		PYGLSurface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLSurface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLSurface");
			return false;
		}
		Py_INCREF(&PYGLSurface_Type);
		
		// Tellusim::GLESSurface
		PYGLESSurface_methods.reserve(PYGLESSurface_methods.size() + 22);
		PYGLESSurface_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyGLESSurface_equalPtr, METH_VARARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyGLESSurface_clonePtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyGLESSurface_clearPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyGLESSurface_destroyPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyGLESSurface_acquirePtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyGLESSurface_unacquirePtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyGLESSurface_isValidPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyGLESSurface_isOwnerPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyGLESSurface_isConstPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyGLESSurface_getCountPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyGLESSurface_getInternalPtr, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getSurface", (PyCFunction)pyGLESSurface_getSurface, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getContext", (PyCFunction)GLESSurface_getContext, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "setColorTextureID", (PyCFunction)GLESSurface_setColorTextureID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "setDepthTextureID", (PyCFunction)GLESSurface_setDepthTextureID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getColorTextureID", (PyCFunction)GLESSurface_getColorTextureID, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getDepthTextureID", (PyCFunction)GLESSurface_getDepthTextureID, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "setFramebufferID", (PyCFunction)GLESSurface_setFramebufferID, METH_VARARGS | METH_KEYWORDS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getFramebufferID", (PyCFunction)GLESSurface_getFramebufferID, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getColorInternalFormat", (PyCFunction)GLESSurface_getColorInternalFormat, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef { "getDepthInternalFormat", (PyCFunction)GLESSurface_getDepthInternalFormat, METH_NOARGS, "" });
		PYGLESSurface_methods.append(PyMethodDef {});
		PYGLESSurface_getsets.reserve(PYGLESSurface_getsets.size() + 7);
		PYGLESSurface_getsets.append(PyGetSetDef { "context", (getter)GLESSurface_get_context, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef { "color_texture_id", (getter)GLESSurface_get_color_texture_id, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef { "depth_texture_id", (getter)GLESSurface_get_depth_texture_id, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef { "framebuffer_id", (getter)GLESSurface_get_framebuffer_id, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef { "color_internal_format", (getter)GLESSurface_get_color_internal_format, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef { "depth_internal_format", (getter)GLESSurface_get_depth_internal_format, nullptr, "", nullptr });
		PYGLESSurface_getsets.append(PyGetSetDef {});
		PYGLESSurface_Type.tp_base = &PYSurface_Type;
		PYGLESSurface_Type.tp_dealloc = (destructor)pyGLESSurface_dealloc;
		PYGLESSurface_number.nb_bool = (inquiry)pyGLESSurface_bool;
		PYGLESSurface_Type.tp_name = "tellusim.GLESSurface";
		PYGLESSurface_Type.tp_basicsize = sizeof(PYGLESSurface);
		PYGLESSurface_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYGLESSurface_Type.tp_doc = "";
		PYGLESSurface_Type.tp_str = (reprfunc)pyGLESSurface_str;
		PYGLESSurface_Type.tp_as_number = &PYGLESSurface_number;
		PYGLESSurface_Type.tp_methods = PYGLESSurface_methods.discard();
		PYGLESSurface_Type.tp_getset = PYGLESSurface_getsets.discard();
		PYGLESSurface_Type.tp_init = (initproc)pyGLESSurface_init;
		PYGLESSurface_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYGLESSurface_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "GLESSurface");
			return false;
		}
		Py_INCREF(&PYGLESSurface_Type);
		
		// Tellusim::Window
		PYWindow_methods.reserve(PYWindow_methods.size() + 111);
		PYWindow_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyWindow_equalPtr, METH_VARARGS, "" });
		PYWindow_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyWindow_clonePtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyWindow_clearPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyWindow_destroyPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyWindow_acquirePtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyWindow_unacquirePtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyWindow_isValidPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyWindow_isOwnerPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyWindow_isConstPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyWindow_getCountPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyWindow_getInternalPtr, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getNumWindows", (PyCFunction)Window_getNumWindows, METH_NOARGS | METH_STATIC, "" });
		PYWindow_methods.append(PyMethodDef { "getWindow", (PyCFunction)Window_getWindow, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYWindow_methods.append(PyMethodDef { "update", (PyCFunction)Window_update, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYWindow_methods.append(PyMethodDef { "getPlatform", (PyCFunction)Window_getPlatform, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getPlatformName", (PyCFunction)Window_getPlatformName, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getIndex", (PyCFunction)Window_getIndex, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setSurface", (PyCFunction)Window_setSurface, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getSurface", (PyCFunction)Window_getSurface, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getHandle", (PyCFunction)Window_getHandle, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isCreated", (PyCFunction)Window_isCreated, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "create", (PyCFunction)Window_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "release", (PyCFunction)Window_release, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "clear", (PyCFunction)Window_clear, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "grab", (PyCFunction)Window_grab, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "render", (PyCFunction)Window_render, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "present", (PyCFunction)Window_present, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "finish", (PyCFunction)Window_finish, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getColorFormat", (PyCFunction)Window_getColorFormat, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getDepthFormat", (PyCFunction)Window_getDepthFormat, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Window_getMultisample, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "hasMultisample", (PyCFunction)Window_hasMultisample, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setFlags", (PyCFunction)Window_setFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getFlags", (PyCFunction)Window_getFlags, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "hasFlag", (PyCFunction)Window_hasFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "hasFlags", (PyCFunction)Window_hasFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setRefreshRate", (PyCFunction)Window_setRefreshRate, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getRefreshRate", (PyCFunction)Window_getRefreshRate, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setHidden", (PyCFunction)Window_setHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isHidden", (PyCFunction)Window_isHidden, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setFocused", (PyCFunction)Window_setFocused, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isFocused", (PyCFunction)Window_isFocused, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMinimized", (PyCFunction)Window_setMinimized, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isMinimized", (PyCFunction)Window_isMinimized, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setFullscreen", (PyCFunction)Window_setFullscreen, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isFullscreen", (PyCFunction)Window_isFullscreen, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isOccluded", (PyCFunction)Window_isOccluded, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setTitle", (PyCFunction)Window_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getTitle", (PyCFunction)Window_getTitle, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setIcon", (PyCFunction)Window_setIcon, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getIcon", (PyCFunction)Window_getIcon, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setGeometry", (PyCFunction)Window_setGeometry, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setPosition", (PyCFunction)Window_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getPositionX", (PyCFunction)Window_getPositionX, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getPositionY", (PyCFunction)Window_getPositionY, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setSize", (PyCFunction)Window_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getWidth", (PyCFunction)Window_getWidth, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getHeight", (PyCFunction)Window_getHeight, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getScale", (PyCFunction)Window_getScale, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getDpiX", (PyCFunction)Window_getDpiX, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getDpiY", (PyCFunction)Window_getDpiY, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouse", (PyCFunction)Window_setMouse, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseX", (PyCFunction)Window_getMouseX, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseY", (PyCFunction)Window_getMouseY, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseDelta", (PyCFunction)Window_setMouseDelta, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseDX", (PyCFunction)Window_getMouseDX, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseDY", (PyCFunction)Window_getMouseDY, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseHidden", (PyCFunction)Window_setMouseHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isMouseHidden", (PyCFunction)Window_isMouseHidden, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseClipped", (PyCFunction)Window_setMouseClipped, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isMouseClipped", (PyCFunction)Window_isMouseClipped, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "isMouseInside", (PyCFunction)Window_isMouseInside, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseCursor", (PyCFunction)Window_setMouseCursor, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseCursor", (PyCFunction)Window_getMouseCursor, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseButtons", (PyCFunction)Window_setMouseButtons, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseButtons", (PyCFunction)Window_getMouseButtons, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseButton", (PyCFunction)Window_setMouseButton, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseButton", (PyCFunction)Window_getMouseButton, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "releaseMouseButtons", (PyCFunction)Window_releaseMouseButtons, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "clearMouseButtons", (PyCFunction)Window_clearMouseButtons, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseAxis", (PyCFunction)Window_setMouseAxis, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getMouseAxis", (PyCFunction)Window_getMouseAxis, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "clearMouseAxis", (PyCFunction)Window_clearMouseAxis, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setMousePressedCallback", (PyCFunction)Window_setMousePressedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseReleasedCallback", (PyCFunction)Window_setMouseReleasedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseChangedCallback", (PyCFunction)Window_setMouseChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setMouseRotatedCallback", (PyCFunction)Window_setMouseRotatedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getNumTouches", (PyCFunction)Window_getNumTouches, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "addTouch", (PyCFunction)Window_addTouch, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getTouchX", (PyCFunction)Window_getTouchX, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getTouchY", (PyCFunction)Window_getTouchY, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "findTouch", (PyCFunction)Window_findTouch, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "clearTouches", (PyCFunction)Window_clearTouches, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setTouchChangedCallback", (PyCFunction)Window_setTouchChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setKeyboardKey", (PyCFunction)Window_setKeyboardKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getKeyboardKey", (PyCFunction)Window_getKeyboardKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setKeyboardPressedCallback", (PyCFunction)Window_setKeyboardPressedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setKeyboardReleasedCallback", (PyCFunction)Window_setKeyboardReleasedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setSizeChangedCallback", (PyCFunction)Window_setSizeChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setFocusChangedCallback", (PyCFunction)Window_setFocusChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setCloseClickedCallback", (PyCFunction)Window_setCloseClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setPauseChangedCallback", (PyCFunction)Window_setPauseChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setFileDroppedCallback", (PyCFunction)Window_setFileDroppedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)Window_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "setPresentCallback", (PyCFunction)Window_setPresentCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "run", (PyCFunction)Window_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "isRunning", (PyCFunction)Window_isRunning, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "stop", (PyCFunction)Window_stop, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef { "setCopyText", (PyCFunction)Window_setCopyText, METH_VARARGS | METH_KEYWORDS, "" });
		PYWindow_methods.append(PyMethodDef { "getPasteText", (PyCFunction)Window_getPasteText, METH_NOARGS, "" });
		PYWindow_methods.append(PyMethodDef {});
		PYWindow_getsets.reserve(PYWindow_getsets.size() + 29);
		PYWindow_getsets.append(PyGetSetDef { "num_windows", (getter)Window_get_num_windows, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "platform", (getter)Window_get_platform, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "platform_name", (getter)Window_get_platform_name, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "index", (getter)Window_get_index, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "surface", (getter)Window_get_surface, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "handle", (getter)Window_get_handle, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "color_format", (getter)Window_get_color_format, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "depth_format", (getter)Window_get_depth_format, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "multisample", (getter)Window_get_multisample, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "flags", (getter)Window_get_flags, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "refresh_rate", (getter)Window_get_refresh_rate, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "title", (getter)Window_get_title, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "icon", (getter)Window_get_icon, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "position_x", (getter)Window_get_position_x, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "position_y", (getter)Window_get_position_y, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "width", (getter)Window_get_width, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "height", (getter)Window_get_height, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "scale", (getter)Window_get_scale, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "dpi_x", (getter)Window_get_dpi_x, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "dpi_y", (getter)Window_get_dpi_y, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_x", (getter)Window_get_mouse_x, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_y", (getter)Window_get_mouse_y, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_dx", (getter)Window_get_mouse_dx, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_dy", (getter)Window_get_mouse_dy, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_cursor", (getter)Window_get_mouse_cursor, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "mouse_buttons", (getter)Window_get_mouse_buttons, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "num_touches", (getter)Window_get_num_touches, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef { "paste_text", (getter)Window_get_paste_text, nullptr, "", nullptr });
		PYWindow_getsets.append(PyGetSetDef {});
		PYWindow_Type.tp_dealloc = (destructor)pyWindow_dealloc;
		PYWindow_number.nb_bool = (inquiry)pyWindow_bool;
		PYWindow_Type.tp_name = "tellusim.Window";
		PYWindow_Type.tp_basicsize = sizeof(PYWindow);
		PYWindow_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYWindow_Type.tp_doc = "";
		PYWindow_Type.tp_str = (reprfunc)pyWindow_str;
		PYWindow_Type.tp_as_number = &PYWindow_number;
		PYWindow_Type.tp_methods = PYWindow_methods.discard();
		PYWindow_Type.tp_getset = PYWindow_getsets.discard();
		PYWindow_Type.tp_init = (initproc)pyWindow_init;
		PYWindow_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYWindow_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Window");
			return false;
		}
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagTitle", PyLong_FromLong(1));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagClose", PyLong_FromLong(2));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagFrame", PyLong_FromLong(4));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagResize", PyLong_FromLong(8));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMinimize", PyLong_FromLong(16));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMaximize", PyLong_FromLong(32));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagTransient", PyLong_FromLong(64));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagFullscreen", PyLong_FromLong(128));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagTransparent", PyLong_FromLong(256));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagFileDropped", PyLong_FromLong(512));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMultisample2", PyLong_FromLong(1024));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMultisample4", PyLong_FromLong(2048));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMultisample8", PyLong_FromLong(4096));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagVerticalSync", PyLong_FromLong(8192));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagRefreshSync", PyLong_FromLong(16384));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagColorRGBAu8ns", PyLong_FromLong(32768));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagColorRGBu10Au2n", PyLong_FromLong(65536));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagColorRGBAf16", PyLong_FromLong(131072));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "FlagMultisample", PyLong_FromLong(7168));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "DefaultFlags", PyLong_FromLong(59));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumFlags", PyLong_FromLong(18));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorArrow", PyLong_FromLong(0));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorInvalid", PyLong_FromLong(1));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorLeft", PyLong_FromLong(2));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorRight", PyLong_FromLong(3));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorBottom", PyLong_FromLong(4));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorTop", PyLong_FromLong(5));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorWidth", PyLong_FromLong(6));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorHeight", PyLong_FromLong(7));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorMajor", PyLong_FromLong(8));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorMinor", PyLong_FromLong(9));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "CursorAll", PyLong_FromLong(10));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumCursors", PyLong_FromLong(11));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonLeft", PyLong_FromLong(1));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonLeft2", PyLong_FromLong(2));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonRight", PyLong_FromLong(4));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonRight2", PyLong_FromLong(8));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonMiddle", PyLong_FromLong(16));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonMiddle2", PyLong_FromLong(32));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonAux", PyLong_FromLong(64));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "ButtonAux2", PyLong_FromLong(128));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumButtons", PyLong_FromLong(8));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "AxisX", PyLong_FromLong(0));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "AxisY", PyLong_FromLong(1));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "AxisZ", PyLong_FromLong(2));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "AxisW", PyLong_FromLong(3));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumAxes", PyLong_FromLong(4));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumTouches", PyLong_FromLong(16));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyNone", PyLong_FromLong(128));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyEsc", PyLong_FromLong(129));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyTab", PyLong_FromLong(130));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyBackspace", PyLong_FromLong(131));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyDelete", PyLong_FromLong(132));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyInsert", PyLong_FromLong(133));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyReturn", PyLong_FromLong(134));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyPause", PyLong_FromLong(135));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyPrior", PyLong_FromLong(136));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyNext", PyLong_FromLong(137));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyEnd", PyLong_FromLong(138));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyHome", PyLong_FromLong(139));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyUp", PyLong_FromLong(140));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyDown", PyLong_FromLong(141));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyLeft", PyLong_FromLong(142));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyRight", PyLong_FromLong(143));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyNum", PyLong_FromLong(144));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyCaps", PyLong_FromLong(145));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyScroll", PyLong_FromLong(146));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyShift", PyLong_FromLong(147));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyCtrl", PyLong_FromLong(148));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyAlt", PyLong_FromLong(149));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyWin", PyLong_FromLong(150));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyCmd", PyLong_FromLong(151));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyMenu", PyLong_FromLong(152));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF1", PyLong_FromLong(153));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF2", PyLong_FromLong(154));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF3", PyLong_FromLong(155));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF4", PyLong_FromLong(156));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF5", PyLong_FromLong(157));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF6", PyLong_FromLong(158));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF7", PyLong_FromLong(159));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF8", PyLong_FromLong(160));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF9", PyLong_FromLong(161));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF10", PyLong_FromLong(162));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF11", PyLong_FromLong(163));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "KeyF12", PyLong_FromLong(164));
		PyDict_SetItemString(PYWindow_Type.tp_dict, "NumKeys", PyLong_FromLong(165));
		PyType_Modified(&PYWindow_Type);
		Py_INCREF(&PYWindow_Type);
		
		// Tellusim::Font
		PYFont_methods.reserve(PYFont_methods.size() + 20);
		PYFont_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFont_equalPtr, METH_VARARGS, "" });
		PYFont_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFont_clonePtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFont_clearPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFont_destroyPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFont_acquirePtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFont_unacquirePtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFont_isValidPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFont_isOwnerPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFont_isConstPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFont_getCountPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFont_getInternalPtr, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "clear", (PyCFunction)Font_clear, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "isLoaded", (PyCFunction)Font_isLoaded, METH_NOARGS, "" });
		PYFont_methods.append(PyMethodDef { "load", (PyCFunction)Font_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef { "getAdvance", (PyCFunction)Font_getAdvance, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef { "getRect", (PyCFunction)Font_getRect, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef { "create", (PyCFunction)Font_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef { "draw", (PyCFunction)Font_draw, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef { "flush", (PyCFunction)Font_flush, METH_VARARGS | METH_KEYWORDS, "" });
		PYFont_methods.append(PyMethodDef {});
		PYFont_getsets.reserve(PYFont_getsets.size() + 1);
		PYFont_getsets.append(PyGetSetDef {});
		PYFont_Type.tp_dealloc = (destructor)pyFont_dealloc;
		PYFont_number.nb_bool = (inquiry)pyFont_bool;
		PYFont_Type.tp_name = "tellusim.Font";
		PYFont_Type.tp_basicsize = sizeof(PYFont);
		PYFont_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFont_Type.tp_doc = "";
		PYFont_Type.tp_str = (reprfunc)pyFont_str;
		PYFont_Type.tp_as_number = &PYFont_number;
		PYFont_Type.tp_methods = PYFont_methods.discard();
		PYFont_Type.tp_getset = PYFont_getsets.discard();
		PYFont_Type.tp_init = (initproc)pyFont_init;
		PYFont_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFont_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Font");
			return false;
		}
		Py_INCREF(&PYFont_Type);
		
		// Tellusim::CanvasElement
		PYCanvasElement_methods.reserve(PYCanvasElement_methods.size() + 85);
		PYCanvasElement_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasElement_equalPtr, METH_VARARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasElement_clonePtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasElement_clearPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasElement_destroyPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasElement_acquirePtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasElement_unacquirePtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasElement_isValidPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasElement_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasElement_isConstPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasElement_getCountPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasElement_getInternalPtr, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getType", (PyCFunction)CanvasElement_getType, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getTypeName", (PyCFunction)CanvasElement_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isText", (PyCFunction)CanvasElement_isText, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isMesh", (PyCFunction)CanvasElement_isMesh, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isRect", (PyCFunction)CanvasElement_isRect, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isTriangle", (PyCFunction)CanvasElement_isTriangle, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isEllipse", (PyCFunction)CanvasElement_isEllipse, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isShape", (PyCFunction)CanvasElement_isShape, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isStrip", (PyCFunction)CanvasElement_isStrip, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setCanvas", (PyCFunction)CanvasElement_setCanvas, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getCanvas", (PyCFunction)CanvasElement_getCanvas, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setMode", (PyCFunction)CanvasElement_setMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getMode", (PyCFunction)CanvasElement_getMode, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setAlign", (PyCFunction)CanvasElement_setAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getAlign", (PyCFunction)CanvasElement_getAlign, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "hasAlign", (PyCFunction)CanvasElement_hasAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "hasAligns", (PyCFunction)CanvasElement_hasAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setOrder", (PyCFunction)CanvasElement_setOrder, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getOrder", (PyCFunction)CanvasElement_getOrder, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setEnabled", (PyCFunction)CanvasElement_setEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "isEnabled", (PyCFunction)CanvasElement_isEnabled, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "clearColor", (PyCFunction)CanvasElement_clearColor, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setColor", (PyCFunction)CanvasElement_setColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getColor", (PyCFunction)CanvasElement_getColor, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getColorOp", (PyCFunction)CanvasElement_getColorOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "clearTransform", (PyCFunction)CanvasElement_clearTransform, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setTransform", (PyCFunction)CanvasElement_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getTransform", (PyCFunction)CanvasElement_getTransform, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getTransformOp", (PyCFunction)CanvasElement_getTransformOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "clearScissor", (PyCFunction)CanvasElement_clearScissor, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setScissor", (PyCFunction)CanvasElement_setScissor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getScissor", (PyCFunction)CanvasElement_getScissor, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getScissorOp", (PyCFunction)CanvasElement_getScissorOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setMipmap", (PyCFunction)CanvasElement_setMipmap, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getMipmap", (PyCFunction)CanvasElement_getMipmap, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setSampler", (PyCFunction)CanvasElement_setSampler, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getSampler", (PyCFunction)CanvasElement_getSampler, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setFilter", (PyCFunction)CanvasElement_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getFilter", (PyCFunction)CanvasElement_getFilter, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setAnisotropy", (PyCFunction)CanvasElement_setAnisotropy, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getAnisotropy", (PyCFunction)CanvasElement_getAnisotropy, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setWrapMode", (PyCFunction)CanvasElement_setWrapMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getWrapMode", (PyCFunction)CanvasElement_getWrapMode, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setTexture", (PyCFunction)CanvasElement_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getTexture", (PyCFunction)CanvasElement_getTexture, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getTextureLinear", (PyCFunction)CanvasElement_getTextureLinear, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setPipeline", (PyCFunction)CanvasElement_setPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getPipeline", (PyCFunction)CanvasElement_getPipeline, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setPrimitive", (PyCFunction)CanvasElement_setPrimitive, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getPrimitive", (PyCFunction)CanvasElement_getPrimitive, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setCullMode", (PyCFunction)CanvasElement_setCullMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getCullMode", (PyCFunction)CanvasElement_getCullMode, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setFrontMode", (PyCFunction)CanvasElement_setFrontMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getFrontMode", (PyCFunction)CanvasElement_getFrontMode, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setBlend", (PyCFunction)CanvasElement_setBlend, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getBlendOp", (PyCFunction)CanvasElement_getBlendOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getBlendSrcFunc", (PyCFunction)CanvasElement_getBlendSrcFunc, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getBlendDestFunc", (PyCFunction)CanvasElement_getBlendDestFunc, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setColorMask", (PyCFunction)CanvasElement_setColorMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getColorMask", (PyCFunction)CanvasElement_getColorMask, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setDepthMask", (PyCFunction)CanvasElement_setDepthMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getDepthMask", (PyCFunction)CanvasElement_getDepthMask, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setDepthFunc", (PyCFunction)CanvasElement_setDepthFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getDepthFunc", (PyCFunction)CanvasElement_getDepthFunc, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setStencilRef", (PyCFunction)CanvasElement_setStencilRef, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setStencilFunc", (PyCFunction)CanvasElement_setStencilFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getStencilRef", (PyCFunction)CanvasElement_getStencilRef, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getStencilFunc", (PyCFunction)CanvasElement_getStencilFunc, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getStencilFailOp", (PyCFunction)CanvasElement_getStencilFailOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getStencilDepthFailOp", (PyCFunction)CanvasElement_getStencilDepthFailOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getStencilDepthPassOp", (PyCFunction)CanvasElement_getStencilDepthPassOp, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "setDrawCallback", (PyCFunction)CanvasElement_setDrawCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasElement_methods.append(PyMethodDef { "getRect", (PyCFunction)CanvasElement_getRect, METH_NOARGS, "" });
		PYCanvasElement_methods.append(PyMethodDef {});
		PYCanvasElement_getsets.reserve(PYCanvasElement_getsets.size() + 35);
		PYCanvasElement_getsets.append(PyGetSetDef { "type", (getter)CanvasElement_get_type, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "canvas", (getter)CanvasElement_get_canvas, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "mode", (getter)CanvasElement_get_mode, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "align", (getter)CanvasElement_get_align, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "order", (getter)CanvasElement_get_order, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "color", (getter)CanvasElement_get_color, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "color_op", (getter)CanvasElement_get_color_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "transform", (getter)CanvasElement_get_transform, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "transform_op", (getter)CanvasElement_get_transform_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "scissor", (getter)CanvasElement_get_scissor, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "scissor_op", (getter)CanvasElement_get_scissor_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "mipmap", (getter)CanvasElement_get_mipmap, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "sampler", (getter)CanvasElement_get_sampler, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "filter", (getter)CanvasElement_get_filter, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "anisotropy", (getter)CanvasElement_get_anisotropy, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "wrap_mode", (getter)CanvasElement_get_wrap_mode, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "texture", (getter)CanvasElement_get_texture, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "texture_linear", (getter)CanvasElement_get_texture_linear, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "pipeline", (getter)CanvasElement_get_pipeline, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "primitive", (getter)CanvasElement_get_primitive, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "cull_mode", (getter)CanvasElement_get_cull_mode, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "front_mode", (getter)CanvasElement_get_front_mode, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "blend_op", (getter)CanvasElement_get_blend_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "blend_src_func", (getter)CanvasElement_get_blend_src_func, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "blend_dest_func", (getter)CanvasElement_get_blend_dest_func, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "color_mask", (getter)CanvasElement_get_color_mask, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "depth_mask", (getter)CanvasElement_get_depth_mask, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "depth_func", (getter)CanvasElement_get_depth_func, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "stencil_ref", (getter)CanvasElement_get_stencil_ref, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "stencil_func", (getter)CanvasElement_get_stencil_func, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "stencil_fail_op", (getter)CanvasElement_get_stencil_fail_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "stencil_depth_fail_op", (getter)CanvasElement_get_stencil_depth_fail_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "stencil_depth_pass_op", (getter)CanvasElement_get_stencil_depth_pass_op, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef { "rect", (getter)CanvasElement_get_rect, nullptr, "", nullptr });
		PYCanvasElement_getsets.append(PyGetSetDef {});
		PYCanvasElement_Type.tp_dealloc = (destructor)pyCanvasElement_dealloc;
		PYCanvasElement_number.nb_bool = (inquiry)pyCanvasElement_bool;
		PYCanvasElement_Type.tp_name = "tellusim.CanvasElement";
		PYCanvasElement_Type.tp_basicsize = sizeof(PYCanvasElement);
		PYCanvasElement_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYCanvasElement_Type.tp_doc = "";
		PYCanvasElement_Type.tp_str = (reprfunc)pyCanvasElement_str;
		PYCanvasElement_Type.tp_as_number = &PYCanvasElement_number;
		PYCanvasElement_Type.tp_methods = PYCanvasElement_methods.discard();
		PYCanvasElement_Type.tp_getset = PYCanvasElement_getsets.discard();
		PYCanvasElement_Type.tp_init = (initproc)pyCanvasElement_init;
		PYCanvasElement_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasElement_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasElement");
			return false;
		}
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeText", PyLong_FromLong(1));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeMesh", PyLong_FromLong(2));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeRect", PyLong_FromLong(3));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeTriangle", PyLong_FromLong(4));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeEllipse", PyLong_FromLong(5));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeShape", PyLong_FromLong(6));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "TypeStrip", PyLong_FromLong(7));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "NumTypes", PyLong_FromLong(8));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeSolid", PyLong_FromLong(0));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTexture", PyLong_FromLong(1));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureFetch", PyLong_FromLong(2));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureClamp", PyLong_FromLong(3));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureCubic", PyLong_FromLong(4));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureCubic3x3", PyLong_FromLong(5));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureCubic5x5", PyLong_FromLong(6));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureRed", PyLong_FromLong(7));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureGreen", PyLong_FromLong(8));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureBlue", PyLong_FromLong(9));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeTextureAlpha", PyLong_FromLong(10));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "ModeGradient", PyLong_FromLong(11));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "NumModes", PyLong_FromLong(12));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignLeft", PyLong_FromLong(1));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignRight", PyLong_FromLong(2));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignBottom", PyLong_FromLong(4));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignTop", PyLong_FromLong(8));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignCenterX", PyLong_FromLong(16));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignCenterY", PyLong_FromLong(32));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignLeftBottom", PyLong_FromLong(5));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignLeftTop", PyLong_FromLong(9));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignRightBottom", PyLong_FromLong(6));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignRightTop", PyLong_FromLong(10));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "AlignCenter", PyLong_FromLong(48));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "NumAligns", PyLong_FromLong(6));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackPush", PyLong_FromLong(1));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackPop", PyLong_FromLong(2));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackSet", PyLong_FromLong(4));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackMul", PyLong_FromLong(8));
		PyDict_SetItemString(PYCanvasElement_Type.tp_dict, "StackGet", PyLong_FromLong(16));
		PyType_Modified(&PYCanvasElement_Type);
		Py_INCREF(&PYCanvasElement_Type);
		
		// Tellusim::CanvasText
		PYCanvasText_methods.reserve(PYCanvasText_methods.size() + 29);
		PYCanvasText_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasText_equalPtr, METH_VARARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasText_clonePtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasText_clearPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasText_destroyPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasText_acquirePtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasText_unacquirePtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasText_isValidPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasText_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasText_isConstPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasText_getCountPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasText_getInternalPtr, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasText_getCanvasElement, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setFontName", (PyCFunction)CanvasText_setFontName, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontName", (PyCFunction)CanvasText_getFontName, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setFontColor", (PyCFunction)CanvasText_setFontColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontColor", (PyCFunction)CanvasText_getFontColor, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setFontSize", (PyCFunction)CanvasText_setFontSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontSize", (PyCFunction)CanvasText_getFontSize, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setFontScale", (PyCFunction)CanvasText_setFontScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontScale", (PyCFunction)CanvasText_getFontScale, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setFontStyle", (PyCFunction)CanvasText_setFontStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontStyleConst", (PyCFunction)CanvasText_getFontStyleConst, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getFontStyle", (PyCFunction)CanvasText_getFontStyle, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasText_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getPosition", (PyCFunction)CanvasText_getPosition, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "setText", (PyCFunction)CanvasText_setText, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasText_methods.append(PyMethodDef { "getText", (PyCFunction)CanvasText_getText, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef { "clearBatches", (PyCFunction)CanvasText_clearBatches, METH_NOARGS, "" });
		PYCanvasText_methods.append(PyMethodDef {});
		PYCanvasText_getsets.reserve(PYCanvasText_getsets.size() + 9);
		PYCanvasText_getsets.append(PyGetSetDef { "font_name", (getter)CanvasText_get_font_name, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "font_color", (getter)CanvasText_get_font_color, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "font_size", (getter)CanvasText_get_font_size, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "font_scale", (getter)CanvasText_get_font_scale, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "font_style_const", (getter)CanvasText_get_font_style_const, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "font_style", (getter)CanvasText_get_font_style, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "position", (getter)CanvasText_get_position, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef { "text", (getter)CanvasText_get_text, nullptr, "", nullptr });
		PYCanvasText_getsets.append(PyGetSetDef {});
		PYCanvasText_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasText_Type.tp_dealloc = (destructor)pyCanvasText_dealloc;
		PYCanvasText_number.nb_bool = (inquiry)pyCanvasText_bool;
		PYCanvasText_Type.tp_name = "tellusim.CanvasText";
		PYCanvasText_Type.tp_basicsize = sizeof(PYCanvasText);
		PYCanvasText_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasText_Type.tp_doc = "";
		PYCanvasText_Type.tp_str = (reprfunc)pyCanvasText_str;
		PYCanvasText_Type.tp_as_number = &PYCanvasText_number;
		PYCanvasText_Type.tp_methods = PYCanvasText_methods.discard();
		PYCanvasText_Type.tp_getset = PYCanvasText_getsets.discard();
		PYCanvasText_Type.tp_init = (initproc)pyCanvasText_init;
		PYCanvasText_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasText_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasText");
			return false;
		}
		Py_INCREF(&PYCanvasText_Type);
		
		// Tellusim::CanvasMesh
		PYCanvasMesh_methods.reserve(PYCanvasMesh_methods.size() + 45);
		PYCanvasMesh_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasMesh_equalPtr, METH_VARARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasMesh_clonePtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasMesh_clearPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasMesh_destroyPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasMesh_acquirePtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasMesh_unacquirePtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasMesh_isValidPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasMesh_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasMesh_isConstPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasMesh_getCountPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasMesh_getInternalPtr, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasMesh_getCanvasElement, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setTextureName", (PyCFunction)CanvasMesh_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getTextureName", (PyCFunction)CanvasMesh_getTextureName, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)CanvasMesh_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)CanvasMesh_getGradientStyleConst, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)CanvasMesh_getGradientStyle, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "clearVertices", (PyCFunction)CanvasMesh_clearVertices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setNumVertices", (PyCFunction)CanvasMesh_setNumVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "reserveVertices", (PyCFunction)CanvasMesh_reserveVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getNumVertices", (PyCFunction)CanvasMesh_getNumVertices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setVertices", (PyCFunction)CanvasMesh_setVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "addVertices", (PyCFunction)CanvasMesh_addVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getVertices", (PyCFunction)CanvasMesh_getVertices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setVertex", (PyCFunction)CanvasMesh_setVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getVertex", (PyCFunction)CanvasMesh_getVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setVertexPosition", (PyCFunction)CanvasMesh_setVertexPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getVertexPosition", (PyCFunction)CanvasMesh_getVertexPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setVertexTexCoord", (PyCFunction)CanvasMesh_setVertexTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getVertexTexCoord", (PyCFunction)CanvasMesh_getVertexTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setVertexColor", (PyCFunction)CanvasMesh_setVertexColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getVertexColor", (PyCFunction)CanvasMesh_getVertexColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "addVertex", (PyCFunction)CanvasMesh_addVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "clearIndices", (PyCFunction)CanvasMesh_clearIndices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setNumIndices", (PyCFunction)CanvasMesh_setNumIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "reserveIndices", (PyCFunction)CanvasMesh_reserveIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getNumIndices", (PyCFunction)CanvasMesh_getNumIndices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setIndices", (PyCFunction)CanvasMesh_setIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "addIndices", (PyCFunction)CanvasMesh_addIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getIndices", (PyCFunction)CanvasMesh_getIndices, METH_NOARGS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setIndex", (PyCFunction)CanvasMesh_setIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "getIndex", (PyCFunction)CanvasMesh_getIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "addIndex", (PyCFunction)CanvasMesh_addIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef { "setRect", (PyCFunction)CanvasMesh_setRect, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasMesh_methods.append(PyMethodDef {});
		PYCanvasMesh_getsets.reserve(PYCanvasMesh_getsets.size() + 8);
		PYCanvasMesh_getsets.append(PyGetSetDef { "texture_name", (getter)CanvasMesh_get_texture_name, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "gradient_style_const", (getter)CanvasMesh_get_gradient_style_const, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "gradient_style", (getter)CanvasMesh_get_gradient_style, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "num_vertices", (getter)CanvasMesh_get_num_vertices, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "vertices", (getter)CanvasMesh_get_vertices, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "num_indices", (getter)CanvasMesh_get_num_indices, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef { "indices", (getter)CanvasMesh_get_indices, nullptr, "", nullptr });
		PYCanvasMesh_getsets.append(PyGetSetDef {});
		PYCanvasMesh_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasMesh_Type.tp_dealloc = (destructor)pyCanvasMesh_dealloc;
		PYCanvasMesh_number.nb_bool = (inquiry)pyCanvasMesh_bool;
		PYCanvasMesh_Type.tp_name = "tellusim.CanvasMesh";
		PYCanvasMesh_Type.tp_basicsize = sizeof(PYCanvasMesh);
		PYCanvasMesh_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasMesh_Type.tp_doc = "";
		PYCanvasMesh_Type.tp_str = (reprfunc)pyCanvasMesh_str;
		PYCanvasMesh_Type.tp_as_number = &PYCanvasMesh_number;
		PYCanvasMesh_Type.tp_methods = PYCanvasMesh_methods.discard();
		PYCanvasMesh_Type.tp_getset = PYCanvasMesh_getsets.discard();
		PYCanvasMesh_Type.tp_init = (initproc)pyCanvasMesh_init;
		PYCanvasMesh_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasMesh_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasMesh");
			return false;
		}
		Py_INCREF(&PYCanvasMesh_Type);
		
		// Tellusim::CanvasRect
		PYCanvasRect_methods.reserve(PYCanvasRect_methods.size() + 33);
		PYCanvasRect_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasRect_equalPtr, METH_VARARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasRect_clonePtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasRect_clearPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasRect_destroyPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasRect_acquirePtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasRect_unacquirePtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasRect_isValidPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasRect_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasRect_isConstPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasRect_getCountPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasRect_getInternalPtr, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasRect_getCanvasElement, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setRadius", (PyCFunction)CanvasRect_setRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getRadius", (PyCFunction)CanvasRect_getRadius, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setTextureName", (PyCFunction)CanvasRect_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getTextureName", (PyCFunction)CanvasRect_getTextureName, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setStrokeColor", (PyCFunction)CanvasRect_setStrokeColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getStrokeColor", (PyCFunction)CanvasRect_getStrokeColor, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)CanvasRect_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)CanvasRect_getStrokeStyleConst, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)CanvasRect_getStrokeStyle, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)CanvasRect_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)CanvasRect_getGradientStyleConst, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)CanvasRect_getGradientStyle, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setSize", (PyCFunction)CanvasRect_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getSize", (PyCFunction)CanvasRect_getSize, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getWidth", (PyCFunction)CanvasRect_getWidth, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getHeight", (PyCFunction)CanvasRect_getHeight, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasRect_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getPosition", (PyCFunction)CanvasRect_getPosition, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "setTexCoord", (PyCFunction)CanvasRect_setTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasRect_methods.append(PyMethodDef { "getTexCoord", (PyCFunction)CanvasRect_getTexCoord, METH_NOARGS, "" });
		PYCanvasRect_methods.append(PyMethodDef {});
		PYCanvasRect_getsets.reserve(PYCanvasRect_getsets.size() + 13);
		PYCanvasRect_getsets.append(PyGetSetDef { "radius", (getter)CanvasRect_get_radius, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "texture_name", (getter)CanvasRect_get_texture_name, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "stroke_color", (getter)CanvasRect_get_stroke_color, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "stroke_style_const", (getter)CanvasRect_get_stroke_style_const, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "stroke_style", (getter)CanvasRect_get_stroke_style, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "gradient_style_const", (getter)CanvasRect_get_gradient_style_const, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "gradient_style", (getter)CanvasRect_get_gradient_style, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "size", (getter)CanvasRect_get_size, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "width", (getter)CanvasRect_get_width, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "height", (getter)CanvasRect_get_height, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "position", (getter)CanvasRect_get_position, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef { "tex_coord", (getter)CanvasRect_get_tex_coord, nullptr, "", nullptr });
		PYCanvasRect_getsets.append(PyGetSetDef {});
		PYCanvasRect_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasRect_Type.tp_dealloc = (destructor)pyCanvasRect_dealloc;
		PYCanvasRect_number.nb_bool = (inquiry)pyCanvasRect_bool;
		PYCanvasRect_Type.tp_name = "tellusim.CanvasRect";
		PYCanvasRect_Type.tp_basicsize = sizeof(PYCanvasRect);
		PYCanvasRect_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasRect_Type.tp_doc = "";
		PYCanvasRect_Type.tp_str = (reprfunc)pyCanvasRect_str;
		PYCanvasRect_Type.tp_as_number = &PYCanvasRect_number;
		PYCanvasRect_Type.tp_methods = PYCanvasRect_methods.discard();
		PYCanvasRect_Type.tp_getset = PYCanvasRect_getsets.discard();
		PYCanvasRect_Type.tp_init = (initproc)pyCanvasRect_init;
		PYCanvasRect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasRect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasRect");
			return false;
		}
		Py_INCREF(&PYCanvasRect_Type);
		
		// Tellusim::CanvasTriangle
		PYCanvasTriangle_methods.reserve(PYCanvasTriangle_methods.size() + 30);
		PYCanvasTriangle_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasTriangle_equalPtr, METH_VARARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasTriangle_clonePtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasTriangle_clearPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasTriangle_destroyPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasTriangle_acquirePtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasTriangle_unacquirePtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasTriangle_isValidPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasTriangle_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasTriangle_isConstPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasTriangle_getCountPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasTriangle_getInternalPtr, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasTriangle_getCanvasElement, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setRadius", (PyCFunction)CanvasTriangle_setRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getRadius", (PyCFunction)CanvasTriangle_getRadius, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setStrokeColor", (PyCFunction)CanvasTriangle_setStrokeColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getStrokeColor", (PyCFunction)CanvasTriangle_getStrokeColor, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)CanvasTriangle_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)CanvasTriangle_getStrokeStyleConst, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)CanvasTriangle_getStrokeStyle, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)CanvasTriangle_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)CanvasTriangle_getGradientStyleConst, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)CanvasTriangle_getGradientStyle, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setPosition0", (PyCFunction)CanvasTriangle_setPosition0, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setPosition1", (PyCFunction)CanvasTriangle_setPosition1, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setPosition2", (PyCFunction)CanvasTriangle_setPosition2, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasTriangle_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getPosition0", (PyCFunction)CanvasTriangle_getPosition0, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getPosition1", (PyCFunction)CanvasTriangle_getPosition1, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef { "getPosition2", (PyCFunction)CanvasTriangle_getPosition2, METH_NOARGS, "" });
		PYCanvasTriangle_methods.append(PyMethodDef {});
		PYCanvasTriangle_getsets.reserve(PYCanvasTriangle_getsets.size() + 10);
		PYCanvasTriangle_getsets.append(PyGetSetDef { "radius", (getter)CanvasTriangle_get_radius, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "stroke_color", (getter)CanvasTriangle_get_stroke_color, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "stroke_style_const", (getter)CanvasTriangle_get_stroke_style_const, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "stroke_style", (getter)CanvasTriangle_get_stroke_style, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "gradient_style_const", (getter)CanvasTriangle_get_gradient_style_const, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "gradient_style", (getter)CanvasTriangle_get_gradient_style, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "position0", (getter)CanvasTriangle_get_position0, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "position1", (getter)CanvasTriangle_get_position1, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef { "position2", (getter)CanvasTriangle_get_position2, nullptr, "", nullptr });
		PYCanvasTriangle_getsets.append(PyGetSetDef {});
		PYCanvasTriangle_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasTriangle_Type.tp_dealloc = (destructor)pyCanvasTriangle_dealloc;
		PYCanvasTriangle_number.nb_bool = (inquiry)pyCanvasTriangle_bool;
		PYCanvasTriangle_Type.tp_name = "tellusim.CanvasTriangle";
		PYCanvasTriangle_Type.tp_basicsize = sizeof(PYCanvasTriangle);
		PYCanvasTriangle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasTriangle_Type.tp_doc = "";
		PYCanvasTriangle_Type.tp_str = (reprfunc)pyCanvasTriangle_str;
		PYCanvasTriangle_Type.tp_as_number = &PYCanvasTriangle_number;
		PYCanvasTriangle_Type.tp_methods = PYCanvasTriangle_methods.discard();
		PYCanvasTriangle_Type.tp_getset = PYCanvasTriangle_getsets.discard();
		PYCanvasTriangle_Type.tp_init = (initproc)pyCanvasTriangle_init;
		PYCanvasTriangle_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasTriangle_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasTriangle");
			return false;
		}
		Py_INCREF(&PYCanvasTriangle_Type);
		
		// Tellusim::CanvasEllipse
		PYCanvasEllipse_methods.reserve(PYCanvasEllipse_methods.size() + 32);
		PYCanvasEllipse_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasEllipse_equalPtr, METH_VARARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasEllipse_clonePtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasEllipse_clearPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasEllipse_destroyPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasEllipse_acquirePtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasEllipse_unacquirePtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasEllipse_isValidPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasEllipse_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasEllipse_isConstPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasEllipse_getCountPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasEllipse_getInternalPtr, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasEllipse_getCanvasElement, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setRadius", (PyCFunction)CanvasEllipse_setRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getRadius", (PyCFunction)CanvasEllipse_getRadius, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setTextureName", (PyCFunction)CanvasEllipse_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getTextureName", (PyCFunction)CanvasEllipse_getTextureName, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setStrokeColor", (PyCFunction)CanvasEllipse_setStrokeColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getStrokeColor", (PyCFunction)CanvasEllipse_getStrokeColor, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)CanvasEllipse_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)CanvasEllipse_getStrokeStyleConst, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)CanvasEllipse_getStrokeStyle, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)CanvasEllipse_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)CanvasEllipse_getGradientStyleConst, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)CanvasEllipse_getGradientStyle, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasEllipse_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setPosition0", (PyCFunction)CanvasEllipse_setPosition0, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setPosition1", (PyCFunction)CanvasEllipse_setPosition1, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getPosition0", (PyCFunction)CanvasEllipse_getPosition0, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getPosition1", (PyCFunction)CanvasEllipse_getPosition1, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "setTexCoord", (PyCFunction)CanvasEllipse_setTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef { "getTexCoord", (PyCFunction)CanvasEllipse_getTexCoord, METH_NOARGS, "" });
		PYCanvasEllipse_methods.append(PyMethodDef {});
		PYCanvasEllipse_getsets.reserve(PYCanvasEllipse_getsets.size() + 11);
		PYCanvasEllipse_getsets.append(PyGetSetDef { "radius", (getter)CanvasEllipse_get_radius, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "texture_name", (getter)CanvasEllipse_get_texture_name, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "stroke_color", (getter)CanvasEllipse_get_stroke_color, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "stroke_style_const", (getter)CanvasEllipse_get_stroke_style_const, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "stroke_style", (getter)CanvasEllipse_get_stroke_style, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "gradient_style_const", (getter)CanvasEllipse_get_gradient_style_const, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "gradient_style", (getter)CanvasEllipse_get_gradient_style, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "position0", (getter)CanvasEllipse_get_position0, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "position1", (getter)CanvasEllipse_get_position1, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef { "tex_coord", (getter)CanvasEllipse_get_tex_coord, nullptr, "", nullptr });
		PYCanvasEllipse_getsets.append(PyGetSetDef {});
		PYCanvasEllipse_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasEllipse_Type.tp_dealloc = (destructor)pyCanvasEllipse_dealloc;
		PYCanvasEllipse_number.nb_bool = (inquiry)pyCanvasEllipse_bool;
		PYCanvasEllipse_Type.tp_name = "tellusim.CanvasEllipse";
		PYCanvasEllipse_Type.tp_basicsize = sizeof(PYCanvasEllipse);
		PYCanvasEllipse_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasEllipse_Type.tp_doc = "";
		PYCanvasEllipse_Type.tp_str = (reprfunc)pyCanvasEllipse_str;
		PYCanvasEllipse_Type.tp_as_number = &PYCanvasEllipse_number;
		PYCanvasEllipse_Type.tp_methods = PYCanvasEllipse_methods.discard();
		PYCanvasEllipse_Type.tp_getset = PYCanvasEllipse_getsets.discard();
		PYCanvasEllipse_Type.tp_init = (initproc)pyCanvasEllipse_init;
		PYCanvasEllipse_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasEllipse_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasEllipse");
			return false;
		}
		Py_INCREF(&PYCanvasEllipse_Type);
		
		// Tellusim::CanvasShape
		PYCanvasShape_methods.reserve(PYCanvasShape_methods.size() + 38);
		PYCanvasShape_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasShape_equalPtr, METH_VARARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasShape_clonePtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasShape_clearPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasShape_destroyPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasShape_acquirePtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasShape_unacquirePtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasShape_isValidPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasShape_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasShape_isConstPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasShape_getCountPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasShape_getInternalPtr, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasShape_getCanvasElement, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setCubic", (PyCFunction)CanvasShape_setCubic, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "isCubic", (PyCFunction)CanvasShape_isCubic, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setThreshold", (PyCFunction)CanvasShape_setThreshold, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getThreshold", (PyCFunction)CanvasShape_getThreshold, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setStrokeColor", (PyCFunction)CanvasShape_setStrokeColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getStrokeColor", (PyCFunction)CanvasShape_getStrokeColor, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)CanvasShape_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)CanvasShape_getStrokeStyleConst, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)CanvasShape_getStrokeStyle, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)CanvasShape_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)CanvasShape_getGradientStyleConst, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)CanvasShape_getGradientStyle, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "createSVG", (PyCFunction)CanvasShape_createSVG, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "clearPositions", (PyCFunction)CanvasShape_clearPositions, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setNumPositions", (PyCFunction)CanvasShape_setNumPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "reservePositions", (PyCFunction)CanvasShape_reservePositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getNumPositions", (PyCFunction)CanvasShape_getNumPositions, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setPositions", (PyCFunction)CanvasShape_setPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "addPositions", (PyCFunction)CanvasShape_addPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getPositions", (PyCFunction)CanvasShape_getPositions, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasShape_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getPosition", (PyCFunction)CanvasShape_getPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "addPosition", (PyCFunction)CanvasShape_addPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "setTexCoord", (PyCFunction)CanvasShape_setTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasShape_methods.append(PyMethodDef { "getTexCoord", (PyCFunction)CanvasShape_getTexCoord, METH_NOARGS, "" });
		PYCanvasShape_methods.append(PyMethodDef {});
		PYCanvasShape_getsets.reserve(PYCanvasShape_getsets.size() + 10);
		PYCanvasShape_getsets.append(PyGetSetDef { "threshold", (getter)CanvasShape_get_threshold, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "stroke_color", (getter)CanvasShape_get_stroke_color, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "stroke_style_const", (getter)CanvasShape_get_stroke_style_const, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "stroke_style", (getter)CanvasShape_get_stroke_style, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "gradient_style_const", (getter)CanvasShape_get_gradient_style_const, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "gradient_style", (getter)CanvasShape_get_gradient_style, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "num_positions", (getter)CanvasShape_get_num_positions, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "positions", (getter)CanvasShape_get_positions, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef { "tex_coord", (getter)CanvasShape_get_tex_coord, nullptr, "", nullptr });
		PYCanvasShape_getsets.append(PyGetSetDef {});
		PYCanvasShape_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasShape_Type.tp_dealloc = (destructor)pyCanvasShape_dealloc;
		PYCanvasShape_number.nb_bool = (inquiry)pyCanvasShape_bool;
		PYCanvasShape_Type.tp_name = "tellusim.CanvasShape";
		PYCanvasShape_Type.tp_basicsize = sizeof(PYCanvasShape);
		PYCanvasShape_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasShape_Type.tp_doc = "";
		PYCanvasShape_Type.tp_str = (reprfunc)pyCanvasShape_str;
		PYCanvasShape_Type.tp_as_number = &PYCanvasShape_number;
		PYCanvasShape_Type.tp_methods = PYCanvasShape_methods.discard();
		PYCanvasShape_Type.tp_getset = PYCanvasShape_getsets.discard();
		PYCanvasShape_Type.tp_init = (initproc)pyCanvasShape_init;
		PYCanvasShape_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasShape_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasShape");
			return false;
		}
		Py_INCREF(&PYCanvasShape_Type);
		
		// Tellusim::CanvasStrip
		PYCanvasStrip_methods.reserve(PYCanvasStrip_methods.size() + 34);
		PYCanvasStrip_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvasStrip_equalPtr, METH_VARARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvasStrip_clonePtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvasStrip_clearPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvasStrip_destroyPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvasStrip_acquirePtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvasStrip_unacquirePtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvasStrip_isValidPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvasStrip_isOwnerPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvasStrip_isConstPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvasStrip_getCountPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvasStrip_getInternalPtr, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getCanvasElement", (PyCFunction)pyCanvasStrip_getCanvasElement, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setWidth", (PyCFunction)CanvasStrip_setWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getWidth", (PyCFunction)CanvasStrip_getWidth, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setOffset", (PyCFunction)CanvasStrip_setOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getOffset", (PyCFunction)CanvasStrip_getOffset, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setStrokeColor", (PyCFunction)CanvasStrip_setStrokeColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getStrokeColor", (PyCFunction)CanvasStrip_getStrokeColor, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)CanvasStrip_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)CanvasStrip_getStrokeStyleConst, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)CanvasStrip_getStrokeStyle, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "createQuadratic", (PyCFunction)CanvasStrip_createQuadratic, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "createCubic", (PyCFunction)CanvasStrip_createCubic, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "clearPositions", (PyCFunction)CanvasStrip_clearPositions, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setNumPositions", (PyCFunction)CanvasStrip_setNumPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "reservePositions", (PyCFunction)CanvasStrip_reservePositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getNumPositions", (PyCFunction)CanvasStrip_getNumPositions, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setPositions", (PyCFunction)CanvasStrip_setPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "addPositions", (PyCFunction)CanvasStrip_addPositions, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getPositions", (PyCFunction)CanvasStrip_getPositions, METH_NOARGS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "setPosition", (PyCFunction)CanvasStrip_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "getPosition", (PyCFunction)CanvasStrip_getPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef { "addPosition", (PyCFunction)CanvasStrip_addPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvasStrip_methods.append(PyMethodDef {});
		PYCanvasStrip_getsets.reserve(PYCanvasStrip_getsets.size() + 8);
		PYCanvasStrip_getsets.append(PyGetSetDef { "width", (getter)CanvasStrip_get_width, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "offset", (getter)CanvasStrip_get_offset, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "stroke_color", (getter)CanvasStrip_get_stroke_color, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "stroke_style_const", (getter)CanvasStrip_get_stroke_style_const, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "stroke_style", (getter)CanvasStrip_get_stroke_style, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "num_positions", (getter)CanvasStrip_get_num_positions, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef { "positions", (getter)CanvasStrip_get_positions, nullptr, "", nullptr });
		PYCanvasStrip_getsets.append(PyGetSetDef {});
		PYCanvasStrip_Type.tp_base = &PYCanvasElement_Type;
		PYCanvasStrip_Type.tp_dealloc = (destructor)pyCanvasStrip_dealloc;
		PYCanvasStrip_number.nb_bool = (inquiry)pyCanvasStrip_bool;
		PYCanvasStrip_Type.tp_name = "tellusim.CanvasStrip";
		PYCanvasStrip_Type.tp_basicsize = sizeof(PYCanvasStrip);
		PYCanvasStrip_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvasStrip_Type.tp_doc = "";
		PYCanvasStrip_Type.tp_str = (reprfunc)pyCanvasStrip_str;
		PYCanvasStrip_Type.tp_as_number = &PYCanvasStrip_number;
		PYCanvasStrip_Type.tp_methods = PYCanvasStrip_methods.discard();
		PYCanvasStrip_Type.tp_getset = PYCanvasStrip_getsets.discard();
		PYCanvasStrip_Type.tp_init = (initproc)pyCanvasStrip_init;
		PYCanvasStrip_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvasStrip_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CanvasStrip");
			return false;
		}
		Py_INCREF(&PYCanvasStrip_Type);
		
		// Tellusim::Canvas
		PYCanvas_methods.reserve(PYCanvas_methods.size() + 80);
		PYCanvas_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCanvas_equalPtr, METH_VARARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCanvas_clonePtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCanvas_clearPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCanvas_destroyPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCanvas_acquirePtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCanvas_unacquirePtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCanvas_isValidPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCanvas_isOwnerPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCanvas_isConstPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCanvas_getCountPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCanvas_getInternalPtr, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clear", (PyCFunction)Canvas_clear, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "isCreated", (PyCFunction)Canvas_isCreated, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getScale", (PyCFunction)Canvas_getScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "create", (PyCFunction)Canvas_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setPipelineHash", (PyCFunction)Canvas_setPipelineHash, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getPipelineHash", (PyCFunction)Canvas_getPipelineHash, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getColorFormat", (PyCFunction)Canvas_getColorFormat, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getDepthFormat", (PyCFunction)Canvas_getDepthFormat, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getMultisample", (PyCFunction)Canvas_getMultisample, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setOrder", (PyCFunction)Canvas_setOrder, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getOrder", (PyCFunction)Canvas_getOrder, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setEnabled", (PyCFunction)Canvas_setEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "isEnabled", (PyCFunction)Canvas_isEnabled, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setViewport", (PyCFunction)Canvas_setViewport, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getViewport", (PyCFunction)Canvas_getViewport, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getWidth", (PyCFunction)Canvas_getWidth, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getHeight", (PyCFunction)Canvas_getHeight, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clearColor", (PyCFunction)Canvas_clearColor, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setColor", (PyCFunction)Canvas_setColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getColor", (PyCFunction)Canvas_getColor, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clearScissor", (PyCFunction)Canvas_clearScissor, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setScissor", (PyCFunction)Canvas_setScissor, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getScissor", (PyCFunction)Canvas_getScissor, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "clearTransform", (PyCFunction)Canvas_clearTransform, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setTransform", (PyCFunction)Canvas_setTransform, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getTransform", (PyCFunction)Canvas_getTransform, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setParent", (PyCFunction)Canvas_setParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getParent", (PyCFunction)Canvas_getParent, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "addChild", (PyCFunction)Canvas_addChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "removeChild", (PyCFunction)Canvas_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "raiseChild", (PyCFunction)Canvas_raiseChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "lowerChild", (PyCFunction)Canvas_lowerChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)Canvas_releaseChildren, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "findChild", (PyCFunction)Canvas_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "isChild", (PyCFunction)Canvas_isChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)Canvas_getNumChildren, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getChildren", (PyCFunction)Canvas_getChildren, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getChild", (PyCFunction)Canvas_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "addElement", (PyCFunction)Canvas_addElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "removeElement", (PyCFunction)Canvas_removeElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "raiseElement", (PyCFunction)Canvas_raiseElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "lowerElement", (PyCFunction)Canvas_lowerElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "findElement", (PyCFunction)Canvas_findElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "isElement", (PyCFunction)Canvas_isElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getNumElements", (PyCFunction)Canvas_getNumElements, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getElements", (PyCFunction)Canvas_getElements, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getElement", (PyCFunction)Canvas_getElement, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "isFont", (PyCFunction)Canvas_isFont, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "addFont", (PyCFunction)Canvas_addFont, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "removeFont", (PyCFunction)Canvas_removeFont, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getFont", (PyCFunction)Canvas_getFont, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "isTexture", (PyCFunction)Canvas_isTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "addTexture", (PyCFunction)Canvas_addTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "removeTexture", (PyCFunction)Canvas_removeTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getTexture", (PyCFunction)Canvas_getTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setDepthMask", (PyCFunction)Canvas_setDepthMask, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getDepthMask", (PyCFunction)Canvas_getDepthMask, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "setDepthFunc", (PyCFunction)Canvas_setDepthFunc, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getDepthFunc", (PyCFunction)Canvas_getDepthFunc, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "draw", (PyCFunction)Canvas_draw, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setCreateCallback", (PyCFunction)Canvas_setCreateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setPipelineCallback", (PyCFunction)Canvas_setPipelineCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setBeginCallback", (PyCFunction)Canvas_setBeginCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "setDrawCallback", (PyCFunction)Canvas_setDrawCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYCanvas_methods.append(PyMethodDef { "getNumDrawPipelines", (PyCFunction)Canvas_getNumDrawPipelines, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getNumDrawElements", (PyCFunction)Canvas_getNumDrawElements, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getNumDrawCommands", (PyCFunction)Canvas_getNumDrawCommands, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef { "getRect", (PyCFunction)Canvas_getRect, METH_NOARGS, "" });
		PYCanvas_methods.append(PyMethodDef {});
		PYCanvas_getsets.reserve(PYCanvas_getsets.size() + 21);
		PYCanvas_getsets.append(PyGetSetDef { "pipeline_hash", (getter)Canvas_get_pipeline_hash, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "color_format", (getter)Canvas_get_color_format, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "depth_format", (getter)Canvas_get_depth_format, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "multisample", (getter)Canvas_get_multisample, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "order", (getter)Canvas_get_order, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "viewport", (getter)Canvas_get_viewport, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "width", (getter)Canvas_get_width, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "height", (getter)Canvas_get_height, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "color", (getter)Canvas_get_color, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "scissor", (getter)Canvas_get_scissor, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "transform", (getter)Canvas_get_transform, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "parent", (getter)Canvas_get_parent, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "num_children", (getter)Canvas_get_num_children, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "num_elements", (getter)Canvas_get_num_elements, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "depth_mask", (getter)Canvas_get_depth_mask, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "depth_func", (getter)Canvas_get_depth_func, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "num_draw_pipelines", (getter)Canvas_get_num_draw_pipelines, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "num_draw_elements", (getter)Canvas_get_num_draw_elements, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "num_draw_commands", (getter)Canvas_get_num_draw_commands, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef { "rect", (getter)Canvas_get_rect, nullptr, "", nullptr });
		PYCanvas_getsets.append(PyGetSetDef {});
		PYCanvas_Type.tp_dealloc = (destructor)pyCanvas_dealloc;
		PYCanvas_number.nb_bool = (inquiry)pyCanvas_bool;
		PYCanvas_Type.tp_name = "tellusim.Canvas";
		PYCanvas_Type.tp_basicsize = sizeof(PYCanvas);
		PYCanvas_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCanvas_Type.tp_doc = "";
		PYCanvas_Type.tp_str = (reprfunc)pyCanvas_str;
		PYCanvas_Type.tp_as_number = &PYCanvas_number;
		PYCanvas_Type.tp_methods = PYCanvas_methods.discard();
		PYCanvas_Type.tp_getset = PYCanvas_getsets.discard();
		PYCanvas_Type.tp_init = (initproc)pyCanvas_init;
		PYCanvas_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCanvas_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Canvas");
			return false;
		}
		Py_INCREF(&PYCanvas_Type);
		
		// Tellusim::Control
		PYControl_methods.reserve(PYControl_methods.size() + 76);
		PYControl_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControl_equalPtr, METH_VARARGS, "" });
		PYControl_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControl_clonePtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControl_clearPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControl_destroyPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControl_acquirePtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControl_unacquirePtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControl_isValidPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControl_isOwnerPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControl_isConstPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControl_getCountPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControl_getInternalPtr, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getType", (PyCFunction)Control_getType, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getTypeName", (PyCFunction)Control_getTypeName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "isUnknown", (PyCFunction)Control_isUnknown, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isRoot", (PyCFunction)Control_isRoot, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isText", (PyCFunction)Control_isText, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isRect", (PyCFunction)Control_isRect, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isGrid", (PyCFunction)Control_isGrid, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isGroup", (PyCFunction)Control_isGroup, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isPanel", (PyCFunction)Control_isPanel, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isDialog", (PyCFunction)Control_isDialog, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isWindow", (PyCFunction)Control_isWindow, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isCheck", (PyCFunction)Control_isCheck, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isCombo", (PyCFunction)Control_isCombo, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isButton", (PyCFunction)Control_isButton, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isSlider", (PyCFunction)Control_isSlider, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isScroll", (PyCFunction)Control_isScroll, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isSplit", (PyCFunction)Control_isSplit, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isArea", (PyCFunction)Control_isArea, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isTree", (PyCFunction)Control_isTree, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isEdit", (PyCFunction)Control_isEdit, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setAlign", (PyCFunction)Control_setAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getAlign", (PyCFunction)Control_getAlign, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "hasAlign", (PyCFunction)Control_hasAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "hasAligns", (PyCFunction)Control_hasAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "isSpacer", (PyCFunction)Control_isSpacer, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setEnabled", (PyCFunction)Control_setEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "isEnabled", (PyCFunction)Control_isEnabled, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "wasEnabled", (PyCFunction)Control_wasEnabled, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "wasUpdated", (PyCFunction)Control_wasUpdated, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setDisabled", (PyCFunction)Control_setDisabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "isDisabled", (PyCFunction)Control_isDisabled, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getCanvas", (PyCFunction)Control_getCanvas, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getRoot", (PyCFunction)Control_getRoot, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getPanel", (PyCFunction)Control_getPanel, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setParent", (PyCFunction)Control_setParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getParent", (PyCFunction)Control_getParent, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isParentEnabled", (PyCFunction)Control_isParentEnabled, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "isParentDisabled", (PyCFunction)Control_isParentDisabled, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "addChild", (PyCFunction)Control_addChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "removeChild", (PyCFunction)Control_removeChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "raiseChild", (PyCFunction)Control_raiseChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "lowerChild", (PyCFunction)Control_lowerChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "releaseChildren", (PyCFunction)Control_releaseChildren, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "findChild", (PyCFunction)Control_findChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "isChild", (PyCFunction)Control_isChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getNumChildren", (PyCFunction)Control_getNumChildren, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getChildren", (PyCFunction)Control_getChildren, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getChild", (PyCFunction)Control_getChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "setSize", (PyCFunction)Control_setSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getSize", (PyCFunction)Control_getSize, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getWidth", (PyCFunction)Control_getWidth, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getHeight", (PyCFunction)Control_getHeight, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setPosition", (PyCFunction)Control_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getPosition", (PyCFunction)Control_getPosition, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getPositionX", (PyCFunction)Control_getPositionX, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getPositionY", (PyCFunction)Control_getPositionY, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setOffset", (PyCFunction)Control_setOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getOffset", (PyCFunction)Control_getOffset, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getOffsetX", (PyCFunction)Control_getOffsetX, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getOffsetY", (PyCFunction)Control_getOffsetY, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "setMargin", (PyCFunction)Control_setMargin, METH_VARARGS | METH_KEYWORDS, "" });
		PYControl_methods.append(PyMethodDef { "getMargin", (PyCFunction)Control_getMargin, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getRect", (PyCFunction)Control_getRect, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef { "getState", (PyCFunction)Control_getState, METH_NOARGS, "" });
		PYControl_methods.append(PyMethodDef {});
		PYControl_getsets.reserve(PYControl_getsets.size() + 20);
		PYControl_getsets.append(PyGetSetDef { "type", (getter)Control_get_type, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "align", (getter)Control_get_align, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "canvas", (getter)Control_get_canvas, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "root", (getter)Control_get_root, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "panel", (getter)Control_get_panel, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "parent", (getter)Control_get_parent, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "num_children", (getter)Control_get_num_children, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "size", (getter)Control_get_size, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "width", (getter)Control_get_width, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "height", (getter)Control_get_height, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "position", (getter)Control_get_position, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "position_x", (getter)Control_get_position_x, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "position_y", (getter)Control_get_position_y, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "offset", (getter)Control_get_offset, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "offset_x", (getter)Control_get_offset_x, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "offset_y", (getter)Control_get_offset_y, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "margin", (getter)Control_get_margin, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "rect", (getter)Control_get_rect, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef { "state", (getter)Control_get_state, nullptr, "", nullptr });
		PYControl_getsets.append(PyGetSetDef {});
		PYControl_Type.tp_dealloc = (destructor)pyControl_dealloc;
		PYControl_number.nb_bool = (inquiry)pyControl_bool;
		PYControl_Type.tp_name = "tellusim.Control";
		PYControl_Type.tp_basicsize = sizeof(PYControl);
		PYControl_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYControl_Type.tp_doc = "";
		PYControl_Type.tp_str = (reprfunc)pyControl_str;
		PYControl_Type.tp_as_number = &PYControl_number;
		PYControl_Type.tp_methods = PYControl_methods.discard();
		PYControl_Type.tp_getset = PYControl_getsets.discard();
		PYControl_Type.tp_init = (initproc)pyControl_init;
		PYControl_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControl_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Control");
			return false;
		}
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeRoot", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeText", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeRect", PyLong_FromLong(3));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeGrid", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeGroup", PyLong_FromLong(5));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypePanel", PyLong_FromLong(6));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeDialog", PyLong_FromLong(7));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeWindow", PyLong_FromLong(8));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeCheck", PyLong_FromLong(9));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeCombo", PyLong_FromLong(10));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeButton", PyLong_FromLong(11));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeSlider", PyLong_FromLong(12));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeScroll", PyLong_FromLong(13));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeSplit", PyLong_FromLong(14));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeArea", PyLong_FromLong(15));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeTree", PyLong_FromLong(16));
		PyDict_SetItemString(PYControl_Type.tp_dict, "TypeEdit", PyLong_FromLong(17));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumTypes", PyLong_FromLong(18));
		PyDict_SetItemString(PYControl_Type.tp_dict, "StateUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "StateNormal", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "StateFocused", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "StatePressed", PyLong_FromLong(3));
		PyDict_SetItemString(PYControl_Type.tp_dict, "StateDisabled", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumStates", PyLong_FromLong(5));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshCheck", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshButton", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshSliderLine", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshHScrollLine", PyLong_FromLong(3));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshVScrollLine", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshSliderHandle", PyLong_FromLong(5));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshHScrollHandle", PyLong_FromLong(6));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshVScrollHandle", PyLong_FromLong(7));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshBackground", PyLong_FromLong(8));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshSelection", PyLong_FromLong(9));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshBorder", PyLong_FromLong(10));
		PyDict_SetItemString(PYControl_Type.tp_dict, "MeshFrame", PyLong_FromLong(11));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumMeshes", PyLong_FromLong(12));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignLeft", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignRight", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignBottom", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignTop", PyLong_FromLong(8));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignCenterX", PyLong_FromLong(16));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignCenterY", PyLong_FromLong(32));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignExpandX", PyLong_FromLong(64));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignExpandY", PyLong_FromLong(128));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignOverlap", PyLong_FromLong(256));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignSpacer", PyLong_FromLong(512));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignAspect", PyLong_FromLong(1024));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignLeftBottom", PyLong_FromLong(5));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignLeftTop", PyLong_FromLong(9));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignRightBottom", PyLong_FromLong(6));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignRightTop", PyLong_FromLong(10));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignCenter", PyLong_FromLong(48));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AlignExpand", PyLong_FromLong(192));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumAligns", PyLong_FromLong(11));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonLeft", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonLeft2", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonRight", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonRight2", PyLong_FromLong(8));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonMiddle", PyLong_FromLong(16));
		PyDict_SetItemString(PYControl_Type.tp_dict, "ButtonMiddle2", PyLong_FromLong(32));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumButtons", PyLong_FromLong(6));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AxisUnknown", PyLong_FromLong(0));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AxisX", PyLong_FromLong(1));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AxisY", PyLong_FromLong(2));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AxisZ", PyLong_FromLong(3));
		PyDict_SetItemString(PYControl_Type.tp_dict, "AxisW", PyLong_FromLong(4));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumAxes", PyLong_FromLong(5));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyNone", PyLong_FromLong(128));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyTab", PyLong_FromLong(129));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyBackspace", PyLong_FromLong(130));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyDelete", PyLong_FromLong(131));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyInsert", PyLong_FromLong(132));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyReturn", PyLong_FromLong(133));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyPrior", PyLong_FromLong(134));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyNext", PyLong_FromLong(135));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyEnd", PyLong_FromLong(136));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyHome", PyLong_FromLong(137));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyUp", PyLong_FromLong(138));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyDown", PyLong_FromLong(139));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyLeft", PyLong_FromLong(140));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyRight", PyLong_FromLong(141));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyShift", PyLong_FromLong(142));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyCtrl", PyLong_FromLong(143));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyAlt", PyLong_FromLong(144));
		PyDict_SetItemString(PYControl_Type.tp_dict, "KeyCmd", PyLong_FromLong(145));
		PyDict_SetItemString(PYControl_Type.tp_dict, "NumKeys", PyLong_FromLong(146));
		PyType_Modified(&PYControl_Type);
		Py_INCREF(&PYControl_Type);
		
		// Tellusim::ControlRoot
		PYControlRoot_methods.reserve(PYControlRoot_methods.size() + 87);
		PYControlRoot_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlRoot_equalPtr, METH_VARARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlRoot_clonePtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlRoot_clearPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlRoot_destroyPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlRoot_acquirePtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlRoot_unacquirePtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlRoot_isValidPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlRoot_isOwnerPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlRoot_isConstPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlRoot_getCountPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlRoot_getInternalPtr, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlRoot_getControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setViewport", (PyCFunction)ControlRoot_setViewport, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getViewport", (PyCFunction)ControlRoot_getViewport, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getFontName", (PyCFunction)ControlRoot_getFontName, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFontName", (PyCFunction)ControlRoot_setFontName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFontBlob", (PyCFunction)ControlRoot_setFontBlob, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFontSize", (PyCFunction)ControlRoot_setFontSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getFontSize", (PyCFunction)ControlRoot_getFontSize, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFontScale", (PyCFunction)ControlRoot_setFontScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getFontScale", (PyCFunction)ControlRoot_getFontScale, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFontStyle", (PyCFunction)ControlRoot_setFontStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getFontStyle", (PyCFunction)ControlRoot_getFontStyle, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getTextureName", (PyCFunction)ControlRoot_getTextureName, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setTextureName", (PyCFunction)ControlRoot_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setTextureBlob", (PyCFunction)ControlRoot_setTextureBlob, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getTextureWidth", (PyCFunction)ControlRoot_getTextureWidth, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getTextureHeight", (PyCFunction)ControlRoot_getTextureHeight, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setTextColor", (PyCFunction)ControlRoot_setTextColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setTextOffset", (PyCFunction)ControlRoot_setTextOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getTextColor", (PyCFunction)ControlRoot_getTextColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getTextOffset", (PyCFunction)ControlRoot_getTextOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMeshColor", (PyCFunction)ControlRoot_setMeshColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMeshRegion", (PyCFunction)ControlRoot_setMeshRegion, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMeshRegions", (PyCFunction)ControlRoot_setMeshRegions, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMeshColor", (PyCFunction)ControlRoot_getMeshColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMeshGrid", (PyCFunction)ControlRoot_getMeshGrid, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMeshMargin", (PyCFunction)ControlRoot_getMeshMargin, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMeshRegion", (PyCFunction)ControlRoot_getMeshRegion, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setGroupRadius", (PyCFunction)ControlRoot_setGroupRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setGroupColor", (PyCFunction)ControlRoot_setGroupColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getGroupRadius", (PyCFunction)ControlRoot_getGroupRadius, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getGroupColor", (PyCFunction)ControlRoot_getGroupColor, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setPanelRadius", (PyCFunction)ControlRoot_setPanelRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setPanelColor", (PyCFunction)ControlRoot_setPanelColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getPanelRadius", (PyCFunction)ControlRoot_getPanelRadius, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getPanelColor", (PyCFunction)ControlRoot_getPanelColor, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setCheckedColor", (PyCFunction)ControlRoot_setCheckedColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getCheckedColor", (PyCFunction)ControlRoot_getCheckedColor, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMouse", (PyCFunction)ControlRoot_setMouse, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouse", (PyCFunction)ControlRoot_getMouse, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouseButtons", (PyCFunction)ControlRoot_getMouseButtons, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouseX", (PyCFunction)ControlRoot_getMouseX, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouseY", (PyCFunction)ControlRoot_getMouseY, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMouseAxis", (PyCFunction)ControlRoot_setMouseAxis, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMouseAlign", (PyCFunction)ControlRoot_setMouseAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouseAlign", (PyCFunction)ControlRoot_getMouseAlign, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "hasMouseAlign", (PyCFunction)ControlRoot_hasMouseAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "hasMouseAligns", (PyCFunction)ControlRoot_hasMouseAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setKeyboardKey", (PyCFunction)ControlRoot_setKeyboardKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getKeyboardKey", (PyCFunction)ControlRoot_getKeyboardKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearCurrentControl", (PyCFunction)ControlRoot_clearCurrentControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setCurrentControl", (PyCFunction)ControlRoot_setCurrentControl, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getCurrentControl", (PyCFunction)ControlRoot_getCurrentControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getControlGrab", (PyCFunction)ControlRoot_getControlGrab, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearFocusedControl", (PyCFunction)ControlRoot_clearFocusedControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setFocusedControl", (PyCFunction)ControlRoot_setFocusedControl, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getFocusedControl", (PyCFunction)ControlRoot_getFocusedControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isFocusedControl", (PyCFunction)ControlRoot_isFocusedControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearMouseControl", (PyCFunction)ControlRoot_clearMouseControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setMouseControl", (PyCFunction)ControlRoot_setMouseControl, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getMouseControl", (PyCFunction)ControlRoot_getMouseControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isMouseControl", (PyCFunction)ControlRoot_isMouseControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearInputControl", (PyCFunction)ControlRoot_clearInputControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setInputControl", (PyCFunction)ControlRoot_setInputControl, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getInputControl", (PyCFunction)ControlRoot_getInputControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isInputControl", (PyCFunction)ControlRoot_isInputControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "clearModalControl", (PyCFunction)ControlRoot_clearModalControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setModalControl", (PyCFunction)ControlRoot_setModalControl, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getModalControl", (PyCFunction)ControlRoot_getModalControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "isModalControl", (PyCFunction)ControlRoot_isModalControl, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "update", (PyCFunction)ControlRoot_update, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setCopyText", (PyCFunction)ControlRoot_setCopyText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "getPasteText", (PyCFunction)ControlRoot_getPasteText, METH_NOARGS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setCopyCallback", (PyCFunction)ControlRoot_setCopyCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef { "setPasteCallback", (PyCFunction)ControlRoot_setPasteCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRoot_methods.append(PyMethodDef {});
		PYControlRoot_getsets.reserve(PYControlRoot_getsets.size() + 26);
		PYControlRoot_getsets.append(PyGetSetDef { "viewport", (getter)ControlRoot_get_viewport, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "font_name", (getter)ControlRoot_get_font_name, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "font_size", (getter)ControlRoot_get_font_size, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "font_scale", (getter)ControlRoot_get_font_scale, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "font_style", (getter)ControlRoot_get_font_style, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "texture_name", (getter)ControlRoot_get_texture_name, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "texture_width", (getter)ControlRoot_get_texture_width, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "texture_height", (getter)ControlRoot_get_texture_height, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "group_radius", (getter)ControlRoot_get_group_radius, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "group_color", (getter)ControlRoot_get_group_color, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "panel_radius", (getter)ControlRoot_get_panel_radius, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "panel_color", (getter)ControlRoot_get_panel_color, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "checked_color", (getter)ControlRoot_get_checked_color, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse", (getter)ControlRoot_get_mouse, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse_buttons", (getter)ControlRoot_get_mouse_buttons, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse_x", (getter)ControlRoot_get_mouse_x, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse_y", (getter)ControlRoot_get_mouse_y, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse_align", (getter)ControlRoot_get_mouse_align, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "current_control", (getter)ControlRoot_get_current_control, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "control_grab", (getter)ControlRoot_get_control_grab, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "focused_control", (getter)ControlRoot_get_focused_control, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "mouse_control", (getter)ControlRoot_get_mouse_control, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "input_control", (getter)ControlRoot_get_input_control, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "modal_control", (getter)ControlRoot_get_modal_control, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef { "paste_text", (getter)ControlRoot_get_paste_text, nullptr, "", nullptr });
		PYControlRoot_getsets.append(PyGetSetDef {});
		PYControlRoot_Type.tp_base = &PYControl_Type;
		PYControlRoot_Type.tp_dealloc = (destructor)pyControlRoot_dealloc;
		PYControlRoot_number.nb_bool = (inquiry)pyControlRoot_bool;
		PYControlRoot_Type.tp_name = "tellusim.ControlRoot";
		PYControlRoot_Type.tp_basicsize = sizeof(PYControlRoot);
		PYControlRoot_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlRoot_Type.tp_doc = "";
		PYControlRoot_Type.tp_str = (reprfunc)pyControlRoot_str;
		PYControlRoot_Type.tp_as_number = &PYControlRoot_number;
		PYControlRoot_Type.tp_methods = PYControlRoot_methods.discard();
		PYControlRoot_Type.tp_getset = PYControlRoot_getsets.discard();
		PYControlRoot_Type.tp_init = (initproc)pyControlRoot_init;
		PYControlRoot_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlRoot_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlRoot");
			return false;
		}
		Py_INCREF(&PYControlRoot_Type);
		
		// Tellusim::ControlText
		PYControlText_methods.reserve(PYControlText_methods.size() + 43);
		PYControlText_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlText_equalPtr, METH_VARARGS, "" });
		PYControlText_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlText_clonePtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlText_clearPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlText_destroyPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlText_acquirePtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlText_unacquirePtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlText_isValidPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlText_isOwnerPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlText_isConstPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlText_getCountPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlText_getInternalPtr, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlText_getControl, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setMode", (PyCFunction)ControlText_setMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getMode", (PyCFunction)ControlText_getMode, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setPipeline", (PyCFunction)ControlText_setPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getPipeline", (PyCFunction)ControlText_getPipeline, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setColor", (PyCFunction)ControlText_setColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getColor", (PyCFunction)ControlText_getColor, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFilter", (PyCFunction)ControlText_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFilter", (PyCFunction)ControlText_getFilter, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setAnisotropy", (PyCFunction)ControlText_setAnisotropy, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getAnisotropy", (PyCFunction)ControlText_getAnisotropy, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setBlend", (PyCFunction)ControlText_setBlend, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getBlendOp", (PyCFunction)ControlText_getBlendOp, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getBlendSrcFunc", (PyCFunction)ControlText_getBlendSrcFunc, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getBlendDestFunc", (PyCFunction)ControlText_getBlendDestFunc, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFontName", (PyCFunction)ControlText_setFontName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontName", (PyCFunction)ControlText_getFontName, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFontColor", (PyCFunction)ControlText_setFontColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontColor", (PyCFunction)ControlText_getFontColor, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFontSize", (PyCFunction)ControlText_setFontSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontSize", (PyCFunction)ControlText_getFontSize, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFontStyle", (PyCFunction)ControlText_setFontStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontStyleConst", (PyCFunction)ControlText_getFontStyleConst, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontStyle", (PyCFunction)ControlText_getFontStyle, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "setFontAlign", (PyCFunction)ControlText_setFontAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getFontAlign", (PyCFunction)ControlText_getFontAlign, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "hasFontAlign", (PyCFunction)ControlText_hasFontAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "hasFontAligns", (PyCFunction)ControlText_hasFontAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "setText", (PyCFunction)ControlText_setText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlText_methods.append(PyMethodDef { "getText", (PyCFunction)ControlText_getText, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef { "getCanvasText", (PyCFunction)ControlText_getCanvasText, METH_NOARGS, "" });
		PYControlText_methods.append(PyMethodDef {});
		PYControlText_getsets.reserve(PYControlText_getsets.size() + 17);
		PYControlText_getsets.append(PyGetSetDef { "mode", (getter)ControlText_get_mode, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "pipeline", (getter)ControlText_get_pipeline, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "color", (getter)ControlText_get_color, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "filter", (getter)ControlText_get_filter, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "anisotropy", (getter)ControlText_get_anisotropy, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "blend_op", (getter)ControlText_get_blend_op, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "blend_src_func", (getter)ControlText_get_blend_src_func, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "blend_dest_func", (getter)ControlText_get_blend_dest_func, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_name", (getter)ControlText_get_font_name, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_color", (getter)ControlText_get_font_color, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_size", (getter)ControlText_get_font_size, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_style_const", (getter)ControlText_get_font_style_const, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_style", (getter)ControlText_get_font_style, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "font_align", (getter)ControlText_get_font_align, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "text", (getter)ControlText_get_text, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef { "canvas_text", (getter)ControlText_get_canvas_text, nullptr, "", nullptr });
		PYControlText_getsets.append(PyGetSetDef {});
		PYControlText_Type.tp_base = &PYControl_Type;
		PYControlText_Type.tp_dealloc = (destructor)pyControlText_dealloc;
		PYControlText_number.nb_bool = (inquiry)pyControlText_bool;
		PYControlText_Type.tp_name = "tellusim.ControlText";
		PYControlText_Type.tp_basicsize = sizeof(PYControlText);
		PYControlText_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYControlText_Type.tp_doc = "";
		PYControlText_Type.tp_str = (reprfunc)pyControlText_str;
		PYControlText_Type.tp_as_number = &PYControlText_number;
		PYControlText_Type.tp_methods = PYControlText_methods.discard();
		PYControlText_Type.tp_getset = PYControlText_getsets.discard();
		PYControlText_Type.tp_init = (initproc)pyControlText_init;
		PYControlText_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlText_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlText");
			return false;
		}
		Py_INCREF(&PYControlText_Type);
		
		// Tellusim::ControlRect
		PYControlRect_methods.reserve(PYControlRect_methods.size() + 65);
		PYControlRect_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlRect_equalPtr, METH_VARARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlRect_clonePtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlRect_clearPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlRect_destroyPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlRect_acquirePtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlRect_unacquirePtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlRect_isValidPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlRect_isOwnerPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlRect_isConstPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlRect_getCountPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlRect_getInternalPtr, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlRect_getControl, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setCallback", (PyCFunction)ControlRect_setCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getCallback", (PyCFunction)ControlRect_getCallback, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setFullscreen", (PyCFunction)ControlRect_setFullscreen, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "isFullscreen", (PyCFunction)ControlRect_isFullscreen, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setMode", (PyCFunction)ControlRect_setMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getMode", (PyCFunction)ControlRect_getMode, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setPipeline", (PyCFunction)ControlRect_setPipeline, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getPipeline", (PyCFunction)ControlRect_getPipeline, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setRadius", (PyCFunction)ControlRect_setRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getRadius", (PyCFunction)ControlRect_getRadius, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setColor", (PyCFunction)ControlRect_setColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getColor", (PyCFunction)ControlRect_getColor, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)ControlRect_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)ControlRect_getStrokeStyleConst, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)ControlRect_getStrokeStyle, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)ControlRect_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)ControlRect_getGradientStyleConst, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)ControlRect_getGradientStyle, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setMipmap", (PyCFunction)ControlRect_setMipmap, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getMipmap", (PyCFunction)ControlRect_getMipmap, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setFilter", (PyCFunction)ControlRect_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getFilter", (PyCFunction)ControlRect_getFilter, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setAnisotropy", (PyCFunction)ControlRect_setAnisotropy, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getAnisotropy", (PyCFunction)ControlRect_getAnisotropy, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setWrapMode", (PyCFunction)ControlRect_setWrapMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getWrapMode", (PyCFunction)ControlRect_getWrapMode, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setBlend", (PyCFunction)ControlRect_setBlend, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getBlendOp", (PyCFunction)ControlRect_getBlendOp, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getBlendSrcFunc", (PyCFunction)ControlRect_getBlendSrcFunc, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getBlendDestFunc", (PyCFunction)ControlRect_getBlendDestFunc, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTexture", (PyCFunction)ControlRect_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTexture", (PyCFunction)ControlRect_getTexture, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureLinear", (PyCFunction)ControlRect_getTextureLinear, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTextureName", (PyCFunction)ControlRect_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureName", (PyCFunction)ControlRect_getTextureName, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTextureScale", (PyCFunction)ControlRect_setTextureScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureScaleX", (PyCFunction)ControlRect_getTextureScaleX, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureScaleY", (PyCFunction)ControlRect_getTextureScaleY, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTextureFlip", (PyCFunction)ControlRect_setTextureFlip, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureFlipX", (PyCFunction)ControlRect_getTextureFlipX, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureFlipY", (PyCFunction)ControlRect_getTextureFlipY, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTextureProj", (PyCFunction)ControlRect_setTextureProj, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTextureProj", (PyCFunction)ControlRect_getTextureProj, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setTexCoord", (PyCFunction)ControlRect_setTexCoord, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getTexCoord", (PyCFunction)ControlRect_getTexCoord, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "setPressedCallback", (PyCFunction)ControlRect_setPressedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "setReleasedCallback", (PyCFunction)ControlRect_setReleasedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlRect_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "setClicked2Callback", (PyCFunction)ControlRect_setClicked2Callback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "setClickedRightCallback", (PyCFunction)ControlRect_setClickedRightCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlRect_methods.append(PyMethodDef { "getCanvasRect", (PyCFunction)ControlRect_getCanvasRect, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlRect_getCanvasMesh, METH_NOARGS, "" });
		PYControlRect_methods.append(PyMethodDef {});
		PYControlRect_getsets.reserve(PYControlRect_getsets.size() + 28);
		PYControlRect_getsets.append(PyGetSetDef { "callback", (getter)ControlRect_get_callback, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "mode", (getter)ControlRect_get_mode, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "pipeline", (getter)ControlRect_get_pipeline, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "radius", (getter)ControlRect_get_radius, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "color", (getter)ControlRect_get_color, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "stroke_style_const", (getter)ControlRect_get_stroke_style_const, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "stroke_style", (getter)ControlRect_get_stroke_style, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "gradient_style_const", (getter)ControlRect_get_gradient_style_const, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "gradient_style", (getter)ControlRect_get_gradient_style, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "mipmap", (getter)ControlRect_get_mipmap, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "filter", (getter)ControlRect_get_filter, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "anisotropy", (getter)ControlRect_get_anisotropy, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "wrap_mode", (getter)ControlRect_get_wrap_mode, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "blend_op", (getter)ControlRect_get_blend_op, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "blend_src_func", (getter)ControlRect_get_blend_src_func, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "blend_dest_func", (getter)ControlRect_get_blend_dest_func, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture", (getter)ControlRect_get_texture, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_linear", (getter)ControlRect_get_texture_linear, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_name", (getter)ControlRect_get_texture_name, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_scale_x", (getter)ControlRect_get_texture_scale_x, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_scale_y", (getter)ControlRect_get_texture_scale_y, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_flip_x", (getter)ControlRect_get_texture_flip_x, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_flip_y", (getter)ControlRect_get_texture_flip_y, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "texture_proj", (getter)ControlRect_get_texture_proj, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "tex_coord", (getter)ControlRect_get_tex_coord, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "canvas_rect", (getter)ControlRect_get_canvas_rect, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlRect_get_canvas_mesh, nullptr, "", nullptr });
		PYControlRect_getsets.append(PyGetSetDef {});
		PYControlRect_Type.tp_base = &PYControl_Type;
		PYControlRect_Type.tp_dealloc = (destructor)pyControlRect_dealloc;
		PYControlRect_number.nb_bool = (inquiry)pyControlRect_bool;
		PYControlRect_Type.tp_name = "tellusim.ControlRect";
		PYControlRect_Type.tp_basicsize = sizeof(PYControlRect);
		PYControlRect_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYControlRect_Type.tp_doc = "";
		PYControlRect_Type.tp_str = (reprfunc)pyControlRect_str;
		PYControlRect_Type.tp_as_number = &PYControlRect_number;
		PYControlRect_Type.tp_methods = PYControlRect_methods.discard();
		PYControlRect_Type.tp_getset = PYControlRect_getsets.discard();
		PYControlRect_Type.tp_init = (initproc)pyControlRect_init;
		PYControlRect_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlRect_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlRect");
			return false;
		}
		Py_INCREF(&PYControlRect_Type);
		
		// Tellusim::ControlGrid
		PYControlGrid_methods.reserve(PYControlGrid_methods.size() + 20);
		PYControlGrid_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlGrid_equalPtr, METH_VARARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlGrid_clonePtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlGrid_clearPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlGrid_destroyPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlGrid_acquirePtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlGrid_unacquirePtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlGrid_isValidPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlGrid_isOwnerPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlGrid_isConstPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlGrid_getCountPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlGrid_getInternalPtr, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlGrid_getControl, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "setColumns", (PyCFunction)ControlGrid_setColumns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getColumns", (PyCFunction)ControlGrid_getColumns, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "setSpacing", (PyCFunction)ControlGrid_setSpacing, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getSpacing", (PyCFunction)ControlGrid_getSpacing, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef { "setColumnRatio", (PyCFunction)ControlGrid_setColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getColumnRatio", (PyCFunction)ControlGrid_getColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGrid_methods.append(PyMethodDef { "getControlsSize", (PyCFunction)ControlGrid_getControlsSize, METH_NOARGS, "" });
		PYControlGrid_methods.append(PyMethodDef {});
		PYControlGrid_getsets.reserve(PYControlGrid_getsets.size() + 4);
		PYControlGrid_getsets.append(PyGetSetDef { "columns", (getter)ControlGrid_get_columns, nullptr, "", nullptr });
		PYControlGrid_getsets.append(PyGetSetDef { "spacing", (getter)ControlGrid_get_spacing, nullptr, "", nullptr });
		PYControlGrid_getsets.append(PyGetSetDef { "controls_size", (getter)ControlGrid_get_controls_size, nullptr, "", nullptr });
		PYControlGrid_getsets.append(PyGetSetDef {});
		PYControlGrid_Type.tp_base = &PYControl_Type;
		PYControlGrid_Type.tp_dealloc = (destructor)pyControlGrid_dealloc;
		PYControlGrid_number.nb_bool = (inquiry)pyControlGrid_bool;
		PYControlGrid_Type.tp_name = "tellusim.ControlGrid";
		PYControlGrid_Type.tp_basicsize = sizeof(PYControlGrid);
		PYControlGrid_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlGrid_Type.tp_doc = "";
		PYControlGrid_Type.tp_str = (reprfunc)pyControlGrid_str;
		PYControlGrid_Type.tp_as_number = &PYControlGrid_number;
		PYControlGrid_Type.tp_methods = PYControlGrid_methods.discard();
		PYControlGrid_Type.tp_getset = PYControlGrid_getsets.discard();
		PYControlGrid_Type.tp_init = (initproc)pyControlGrid_init;
		PYControlGrid_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlGrid_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlGrid");
			return false;
		}
		Py_INCREF(&PYControlGrid_Type);
		
		// Tellusim::ControlGroup
		PYControlGroup_methods.reserve(PYControlGroup_methods.size() + 46);
		PYControlGroup_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlGroup_equalPtr, METH_VARARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlGroup_clonePtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlGroup_clearPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlGroup_destroyPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlGroup_acquirePtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlGroup_unacquirePtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlGroup_isValidPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlGroup_isOwnerPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlGroup_isConstPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlGroup_getCountPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlGroup_getInternalPtr, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlGroup_getControlText, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setAbove", (PyCFunction)ControlGroup_setAbove, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isAbove", (PyCFunction)ControlGroup_isAbove, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isBelow", (PyCFunction)ControlGroup_isBelow, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setFoldable", (PyCFunction)ControlGroup_setFoldable, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isFoldable", (PyCFunction)ControlGroup_isFoldable, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setExpanded", (PyCFunction)ControlGroup_setExpanded, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isExpanded", (PyCFunction)ControlGroup_isExpanded, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setBackground", (PyCFunction)ControlGroup_setBackground, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getBackground", (PyCFunction)ControlGroup_getBackground, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setGroupRadius", (PyCFunction)ControlGroup_setGroupRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getGroupRadius", (PyCFunction)ControlGroup_getGroupRadius, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setGroupColor", (PyCFunction)ControlGroup_setGroupColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getGroupColor", (PyCFunction)ControlGroup_getGroupColor, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)ControlGroup_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)ControlGroup_getStrokeStyleConst, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)ControlGroup_getStrokeStyle, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)ControlGroup_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)ControlGroup_getGradientStyleConst, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)ControlGroup_getGradientStyle, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setFoldedText", (PyCFunction)ControlGroup_setFoldedText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getFoldedText", (PyCFunction)ControlGroup_getFoldedText, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setExpandedText", (PyCFunction)ControlGroup_setExpandedText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getExpandedText", (PyCFunction)ControlGroup_getExpandedText, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setColumns", (PyCFunction)ControlGroup_setColumns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getColumns", (PyCFunction)ControlGroup_getColumns, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setSpacing", (PyCFunction)ControlGroup_setSpacing, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getSpacing", (PyCFunction)ControlGroup_getSpacing, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setColumnRatio", (PyCFunction)ControlGroup_setColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getColumnRatio", (PyCFunction)ControlGroup_getColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getControlsSize", (PyCFunction)ControlGroup_getControlsSize, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlGroup_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlGroup_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlGroup_isClicked, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef { "getCanvasRect", (PyCFunction)ControlGroup_getCanvasRect, METH_NOARGS, "" });
		PYControlGroup_methods.append(PyMethodDef {});
		PYControlGroup_getsets.reserve(PYControlGroup_getsets.size() + 14);
		PYControlGroup_getsets.append(PyGetSetDef { "background", (getter)ControlGroup_get_background, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "group_radius", (getter)ControlGroup_get_group_radius, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "group_color", (getter)ControlGroup_get_group_color, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "stroke_style_const", (getter)ControlGroup_get_stroke_style_const, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "stroke_style", (getter)ControlGroup_get_stroke_style, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "gradient_style_const", (getter)ControlGroup_get_gradient_style_const, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "gradient_style", (getter)ControlGroup_get_gradient_style, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "folded_text", (getter)ControlGroup_get_folded_text, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "expanded_text", (getter)ControlGroup_get_expanded_text, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "columns", (getter)ControlGroup_get_columns, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "spacing", (getter)ControlGroup_get_spacing, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "controls_size", (getter)ControlGroup_get_controls_size, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef { "canvas_rect", (getter)ControlGroup_get_canvas_rect, nullptr, "", nullptr });
		PYControlGroup_getsets.append(PyGetSetDef {});
		PYControlGroup_Type.tp_base = &PYControlText_Type;
		PYControlGroup_Type.tp_dealloc = (destructor)pyControlGroup_dealloc;
		PYControlGroup_number.nb_bool = (inquiry)pyControlGroup_bool;
		PYControlGroup_Type.tp_name = "tellusim.ControlGroup";
		PYControlGroup_Type.tp_basicsize = sizeof(PYControlGroup);
		PYControlGroup_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlGroup_Type.tp_doc = "";
		PYControlGroup_Type.tp_str = (reprfunc)pyControlGroup_str;
		PYControlGroup_Type.tp_as_number = &PYControlGroup_number;
		PYControlGroup_Type.tp_methods = PYControlGroup_methods.discard();
		PYControlGroup_Type.tp_getset = PYControlGroup_getsets.discard();
		PYControlGroup_Type.tp_init = (initproc)pyControlGroup_init;
		PYControlGroup_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlGroup_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlGroup");
			return false;
		}
		Py_INCREF(&PYControlGroup_Type);
		
		// Tellusim::ControlPanel
		PYControlPanel_methods.reserve(PYControlPanel_methods.size() + 20);
		PYControlPanel_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlPanel_equalPtr, METH_VARARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlPanel_clonePtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlPanel_clearPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlPanel_destroyPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlPanel_acquirePtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlPanel_unacquirePtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlPanel_isValidPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlPanel_isOwnerPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlPanel_isConstPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlPanel_getCountPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlPanel_getInternalPtr, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getControlRect", (PyCFunction)pyControlPanel_getControlRect, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "setColumns", (PyCFunction)ControlPanel_setColumns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getColumns", (PyCFunction)ControlPanel_getColumns, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "setSpacing", (PyCFunction)ControlPanel_setSpacing, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getSpacing", (PyCFunction)ControlPanel_getSpacing, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef { "setColumnRatio", (PyCFunction)ControlPanel_setColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getColumnRatio", (PyCFunction)ControlPanel_getColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlPanel_methods.append(PyMethodDef { "getControlsSize", (PyCFunction)ControlPanel_getControlsSize, METH_NOARGS, "" });
		PYControlPanel_methods.append(PyMethodDef {});
		PYControlPanel_getsets.reserve(PYControlPanel_getsets.size() + 4);
		PYControlPanel_getsets.append(PyGetSetDef { "columns", (getter)ControlPanel_get_columns, nullptr, "", nullptr });
		PYControlPanel_getsets.append(PyGetSetDef { "spacing", (getter)ControlPanel_get_spacing, nullptr, "", nullptr });
		PYControlPanel_getsets.append(PyGetSetDef { "controls_size", (getter)ControlPanel_get_controls_size, nullptr, "", nullptr });
		PYControlPanel_getsets.append(PyGetSetDef {});
		PYControlPanel_Type.tp_base = &PYControlRect_Type;
		PYControlPanel_Type.tp_dealloc = (destructor)pyControlPanel_dealloc;
		PYControlPanel_number.nb_bool = (inquiry)pyControlPanel_bool;
		PYControlPanel_Type.tp_name = "tellusim.ControlPanel";
		PYControlPanel_Type.tp_basicsize = sizeof(PYControlPanel);
		PYControlPanel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYControlPanel_Type.tp_doc = "";
		PYControlPanel_Type.tp_str = (reprfunc)pyControlPanel_str;
		PYControlPanel_Type.tp_as_number = &PYControlPanel_number;
		PYControlPanel_Type.tp_methods = PYControlPanel_methods.discard();
		PYControlPanel_Type.tp_getset = PYControlPanel_getsets.discard();
		PYControlPanel_Type.tp_init = (initproc)pyControlPanel_init;
		PYControlPanel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlPanel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlPanel");
			return false;
		}
		Py_INCREF(&PYControlPanel_Type);
		
		// Tellusim::ControlDialog
		PYControlDialog_methods.reserve(PYControlDialog_methods.size() + 26);
		PYControlDialog_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlDialog_equalPtr, METH_VARARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlDialog_clonePtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlDialog_clearPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlDialog_destroyPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlDialog_acquirePtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlDialog_unacquirePtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlDialog_isValidPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlDialog_isOwnerPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlDialog_isConstPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlDialog_getCountPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlDialog_getInternalPtr, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getControlPanel", (PyCFunction)pyControlDialog_getControlPanel, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "setConstrained", (PyCFunction)ControlDialog_setConstrained, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isConstrained", (PyCFunction)ControlDialog_isConstrained, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "setResizable", (PyCFunction)ControlDialog_setResizable, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isResizable", (PyCFunction)ControlDialog_isResizable, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "setResizeArea", (PyCFunction)ControlDialog_setResizeArea, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getResizeArea", (PyCFunction)ControlDialog_getResizeArea, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getResizeAlign", (PyCFunction)ControlDialog_getResizeAlign, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "hasResizeAlign", (PyCFunction)ControlDialog_hasResizeAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "hasResizeAligns", (PyCFunction)ControlDialog_hasResizeAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "setMousePosition", (PyCFunction)ControlDialog_setMousePosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "getMousePosition", (PyCFunction)ControlDialog_getMousePosition, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef { "setUpdatedCallback", (PyCFunction)ControlDialog_setUpdatedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlDialog_methods.append(PyMethodDef { "isUpdated", (PyCFunction)ControlDialog_isUpdated, METH_NOARGS, "" });
		PYControlDialog_methods.append(PyMethodDef {});
		PYControlDialog_getsets.reserve(PYControlDialog_getsets.size() + 4);
		PYControlDialog_getsets.append(PyGetSetDef { "resize_area", (getter)ControlDialog_get_resize_area, nullptr, "", nullptr });
		PYControlDialog_getsets.append(PyGetSetDef { "resize_align", (getter)ControlDialog_get_resize_align, nullptr, "", nullptr });
		PYControlDialog_getsets.append(PyGetSetDef { "mouse_position", (getter)ControlDialog_get_mouse_position, nullptr, "", nullptr });
		PYControlDialog_getsets.append(PyGetSetDef {});
		PYControlDialog_Type.tp_base = &PYControlPanel_Type;
		PYControlDialog_Type.tp_dealloc = (destructor)pyControlDialog_dealloc;
		PYControlDialog_number.nb_bool = (inquiry)pyControlDialog_bool;
		PYControlDialog_Type.tp_name = "tellusim.ControlDialog";
		PYControlDialog_Type.tp_basicsize = sizeof(PYControlDialog);
		PYControlDialog_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_BASETYPE;
		PYControlDialog_Type.tp_doc = "";
		PYControlDialog_Type.tp_str = (reprfunc)pyControlDialog_str;
		PYControlDialog_Type.tp_as_number = &PYControlDialog_number;
		PYControlDialog_Type.tp_methods = PYControlDialog_methods.discard();
		PYControlDialog_Type.tp_getset = PYControlDialog_getsets.discard();
		PYControlDialog_Type.tp_init = (initproc)pyControlDialog_init;
		PYControlDialog_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlDialog_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlDialog");
			return false;
		}
		Py_INCREF(&PYControlDialog_Type);
		
		// Tellusim::ControlWindow
		PYControlWindow_methods.reserve(PYControlWindow_methods.size() + 15);
		PYControlWindow_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlWindow_equalPtr, METH_VARARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlWindow_clonePtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlWindow_clearPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlWindow_destroyPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlWindow_acquirePtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlWindow_unacquirePtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlWindow_isValidPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlWindow_isOwnerPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlWindow_isConstPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlWindow_getCountPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlWindow_getInternalPtr, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "getControlDialog", (PyCFunction)pyControlWindow_getControlDialog, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "getParentWindow", (PyCFunction)ControlWindow_getParentWindow, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef { "getDialogWindow", (PyCFunction)ControlWindow_getDialogWindow, METH_NOARGS, "" });
		PYControlWindow_methods.append(PyMethodDef {});
		PYControlWindow_getsets.reserve(PYControlWindow_getsets.size() + 3);
		PYControlWindow_getsets.append(PyGetSetDef { "parent_window", (getter)ControlWindow_get_parent_window, nullptr, "", nullptr });
		PYControlWindow_getsets.append(PyGetSetDef { "dialog_window", (getter)ControlWindow_get_dialog_window, nullptr, "", nullptr });
		PYControlWindow_getsets.append(PyGetSetDef {});
		PYControlWindow_Type.tp_base = &PYControlDialog_Type;
		PYControlWindow_Type.tp_dealloc = (destructor)pyControlWindow_dealloc;
		PYControlWindow_number.nb_bool = (inquiry)pyControlWindow_bool;
		PYControlWindow_Type.tp_name = "tellusim.ControlWindow";
		PYControlWindow_Type.tp_basicsize = sizeof(PYControlWindow);
		PYControlWindow_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlWindow_Type.tp_doc = "";
		PYControlWindow_Type.tp_str = (reprfunc)pyControlWindow_str;
		PYControlWindow_Type.tp_as_number = &PYControlWindow_number;
		PYControlWindow_Type.tp_methods = PYControlWindow_methods.discard();
		PYControlWindow_Type.tp_getset = PYControlWindow_getsets.discard();
		PYControlWindow_Type.tp_init = (initproc)pyControlWindow_init;
		PYControlWindow_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlWindow_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlWindow");
			return false;
		}
		Py_INCREF(&PYControlWindow_Type);
		
		// Tellusim::ControlCheck
		PYControlCheck_methods.reserve(PYControlCheck_methods.size() + 25);
		PYControlCheck_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlCheck_equalPtr, METH_VARARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlCheck_clonePtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlCheck_clearPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlCheck_destroyPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlCheck_acquirePtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlCheck_unacquirePtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlCheck_isValidPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlCheck_isOwnerPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlCheck_isConstPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlCheck_getCountPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlCheck_getInternalPtr, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlCheck_getControlText, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "setCheckText", (PyCFunction)ControlCheck_setCheckText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getCheckText", (PyCFunction)ControlCheck_getCheckText, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "setCheckColor", (PyCFunction)ControlCheck_setCheckColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getCheckColor", (PyCFunction)ControlCheck_getCheckColor, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "setCheckedColor", (PyCFunction)ControlCheck_setCheckedColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getCheckedColor", (PyCFunction)ControlCheck_getCheckedColor, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "switchChecked", (PyCFunction)ControlCheck_switchChecked, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "setChecked", (PyCFunction)ControlCheck_setChecked, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "isChecked", (PyCFunction)ControlCheck_isChecked, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlCheck_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCheck_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlCheck_isClicked, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlCheck_getCanvasMesh, METH_NOARGS, "" });
		PYControlCheck_methods.append(PyMethodDef {});
		PYControlCheck_getsets.reserve(PYControlCheck_getsets.size() + 5);
		PYControlCheck_getsets.append(PyGetSetDef { "check_text", (getter)ControlCheck_get_check_text, nullptr, "", nullptr });
		PYControlCheck_getsets.append(PyGetSetDef { "check_color", (getter)ControlCheck_get_check_color, nullptr, "", nullptr });
		PYControlCheck_getsets.append(PyGetSetDef { "checked_color", (getter)ControlCheck_get_checked_color, nullptr, "", nullptr });
		PYControlCheck_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlCheck_get_canvas_mesh, nullptr, "", nullptr });
		PYControlCheck_getsets.append(PyGetSetDef {});
		PYControlCheck_Type.tp_base = &PYControlText_Type;
		PYControlCheck_Type.tp_dealloc = (destructor)pyControlCheck_dealloc;
		PYControlCheck_number.nb_bool = (inquiry)pyControlCheck_bool;
		PYControlCheck_Type.tp_name = "tellusim.ControlCheck";
		PYControlCheck_Type.tp_basicsize = sizeof(PYControlCheck);
		PYControlCheck_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlCheck_Type.tp_doc = "";
		PYControlCheck_Type.tp_str = (reprfunc)pyControlCheck_str;
		PYControlCheck_Type.tp_as_number = &PYControlCheck_number;
		PYControlCheck_Type.tp_methods = PYControlCheck_methods.discard();
		PYControlCheck_Type.tp_getset = PYControlCheck_getsets.discard();
		PYControlCheck_Type.tp_init = (initproc)pyControlCheck_init;
		PYControlCheck_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlCheck_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlCheck");
			return false;
		}
		Py_INCREF(&PYControlCheck_Type);
		
		// Tellusim::ControlCombo
		PYControlCombo_methods.reserve(PYControlCombo_methods.size() + 42);
		PYControlCombo_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlCombo_equalPtr, METH_VARARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlCombo_clonePtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlCombo_clearPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlCombo_destroyPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlCombo_acquirePtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlCombo_unacquirePtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlCombo_isValidPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlCombo_isOwnerPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlCombo_isConstPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlCombo_getCountPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlCombo_getInternalPtr, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlCombo_getControlText, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setMultiSelection", (PyCFunction)ControlCombo_setMultiSelection, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isMultiSelection", (PyCFunction)ControlCombo_isMultiSelection, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setComboText", (PyCFunction)ControlCombo_setComboText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getComboText", (PyCFunction)ControlCombo_getComboText, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setComboColor", (PyCFunction)ControlCombo_setComboColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getComboColor", (PyCFunction)ControlCombo_getComboColor, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setItemsSpacing", (PyCFunction)ControlCombo_setItemsSpacing, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getItemsSpacing", (PyCFunction)ControlCombo_getItemsSpacing, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "clearItems", (PyCFunction)ControlCombo_clearItems, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "addItem", (PyCFunction)ControlCombo_addItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "removeItem", (PyCFunction)ControlCombo_removeItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getNumItems", (PyCFunction)ControlCombo_getNumItems, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "switchItemSelected", (PyCFunction)ControlCombo_switchItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setItemSelected", (PyCFunction)ControlCombo_setItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isItemSelected", (PyCFunction)ControlCombo_isItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setItemText", (PyCFunction)ControlCombo_setItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getItemText", (PyCFunction)ControlCombo_getItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "findItemText", (PyCFunction)ControlCombo_findItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setItemColor", (PyCFunction)ControlCombo_setItemColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getItemColor", (PyCFunction)ControlCombo_getItemColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setCurrentIndex", (PyCFunction)ControlCombo_setCurrentIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setCurrentText", (PyCFunction)ControlCombo_setCurrentText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getCurrentIndex", (PyCFunction)ControlCombo_getCurrentIndex, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getCurrentText", (PyCFunction)ControlCombo_getCurrentText, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlCombo_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlCombo_isClicked, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)ControlCombo_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlCombo_methods.append(PyMethodDef { "isChanged", (PyCFunction)ControlCombo_isChanged, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlCombo_getCanvasMesh, METH_NOARGS, "" });
		PYControlCombo_methods.append(PyMethodDef {});
		PYControlCombo_getsets.reserve(PYControlCombo_getsets.size() + 8);
		PYControlCombo_getsets.append(PyGetSetDef { "combo_text", (getter)ControlCombo_get_combo_text, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "combo_color", (getter)ControlCombo_get_combo_color, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "items_spacing", (getter)ControlCombo_get_items_spacing, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "num_items", (getter)ControlCombo_get_num_items, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "current_index", (getter)ControlCombo_get_current_index, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "current_text", (getter)ControlCombo_get_current_text, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlCombo_get_canvas_mesh, nullptr, "", nullptr });
		PYControlCombo_getsets.append(PyGetSetDef {});
		PYControlCombo_Type.tp_base = &PYControlText_Type;
		PYControlCombo_Type.tp_dealloc = (destructor)pyControlCombo_dealloc;
		PYControlCombo_number.nb_bool = (inquiry)pyControlCombo_bool;
		PYControlCombo_Type.tp_name = "tellusim.ControlCombo";
		PYControlCombo_Type.tp_basicsize = sizeof(PYControlCombo);
		PYControlCombo_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlCombo_Type.tp_doc = "";
		PYControlCombo_Type.tp_str = (reprfunc)pyControlCombo_str;
		PYControlCombo_Type.tp_as_number = &PYControlCombo_number;
		PYControlCombo_Type.tp_methods = PYControlCombo_methods.discard();
		PYControlCombo_Type.tp_getset = PYControlCombo_getsets.discard();
		PYControlCombo_Type.tp_init = (initproc)pyControlCombo_init;
		PYControlCombo_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlCombo_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlCombo");
			return false;
		}
		Py_INCREF(&PYControlCombo_Type);
		
		// Tellusim::ControlButton
		PYControlButton_methods.reserve(PYControlButton_methods.size() + 35);
		PYControlButton_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlButton_equalPtr, METH_VARARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlButton_clonePtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlButton_clearPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlButton_destroyPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlButton_acquirePtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlButton_unacquirePtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlButton_isValidPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlButton_isOwnerPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlButton_isConstPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlButton_getCountPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlButton_getInternalPtr, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlButton_getControlText, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setBackground", (PyCFunction)ControlButton_setBackground, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getBackground", (PyCFunction)ControlButton_getBackground, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setButtonMode", (PyCFunction)ControlButton_setButtonMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getButtonMode", (PyCFunction)ControlButton_getButtonMode, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setButtonRadius", (PyCFunction)ControlButton_setButtonRadius, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getButtonRadius", (PyCFunction)ControlButton_getButtonRadius, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setButtonColor", (PyCFunction)ControlButton_setButtonColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getButtonColor", (PyCFunction)ControlButton_getButtonColor, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setStrokeStyle", (PyCFunction)ControlButton_setStrokeStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getStrokeStyleConst", (PyCFunction)ControlButton_getStrokeStyleConst, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getStrokeStyle", (PyCFunction)ControlButton_getStrokeStyle, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setGradientStyle", (PyCFunction)ControlButton_setGradientStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "getGradientStyleConst", (PyCFunction)ControlButton_getGradientStyleConst, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getGradientStyle", (PyCFunction)ControlButton_getGradientStyle, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setPressedCallback", (PyCFunction)ControlButton_setPressedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "isPressed", (PyCFunction)ControlButton_isPressed, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setReleasedCallback", (PyCFunction)ControlButton_setReleasedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "isReleased", (PyCFunction)ControlButton_isReleased, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlButton_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlButton_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlButton_isClicked, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getCanvasRect", (PyCFunction)ControlButton_getCanvasRect, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlButton_getCanvasMesh, METH_NOARGS, "" });
		PYControlButton_methods.append(PyMethodDef {});
		PYControlButton_getsets.reserve(PYControlButton_getsets.size() + 11);
		PYControlButton_getsets.append(PyGetSetDef { "background", (getter)ControlButton_get_background, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "button_mode", (getter)ControlButton_get_button_mode, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "button_radius", (getter)ControlButton_get_button_radius, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "button_color", (getter)ControlButton_get_button_color, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "stroke_style_const", (getter)ControlButton_get_stroke_style_const, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "stroke_style", (getter)ControlButton_get_stroke_style, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "gradient_style_const", (getter)ControlButton_get_gradient_style_const, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "gradient_style", (getter)ControlButton_get_gradient_style, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "canvas_rect", (getter)ControlButton_get_canvas_rect, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlButton_get_canvas_mesh, nullptr, "", nullptr });
		PYControlButton_getsets.append(PyGetSetDef {});
		PYControlButton_Type.tp_base = &PYControlText_Type;
		PYControlButton_Type.tp_dealloc = (destructor)pyControlButton_dealloc;
		PYControlButton_number.nb_bool = (inquiry)pyControlButton_bool;
		PYControlButton_Type.tp_name = "tellusim.ControlButton";
		PYControlButton_Type.tp_basicsize = sizeof(PYControlButton);
		PYControlButton_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlButton_Type.tp_doc = "";
		PYControlButton_Type.tp_str = (reprfunc)pyControlButton_str;
		PYControlButton_Type.tp_as_number = &PYControlButton_number;
		PYControlButton_Type.tp_methods = PYControlButton_methods.discard();
		PYControlButton_Type.tp_getset = PYControlButton_getsets.discard();
		PYControlButton_Type.tp_init = (initproc)pyControlButton_init;
		PYControlButton_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlButton_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlButton");
			return false;
		}
		Py_INCREF(&PYControlButton_Type);
		
		// Tellusim::ControlSlider
		PYControlSlider_methods.reserve(PYControlSlider_methods.size() + 43);
		PYControlSlider_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlSlider_equalPtr, METH_VARARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlSlider_clonePtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlSlider_clearPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlSlider_destroyPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlSlider_acquirePtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlSlider_unacquirePtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlSlider_isValidPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlSlider_isOwnerPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlSlider_isConstPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlSlider_getCountPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlSlider_getInternalPtr, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlSlider_getControlText, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setSliderColor", (PyCFunction)ControlSlider_setSliderColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getSliderColor", (PyCFunction)ControlSlider_getSliderColor, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setDigits", (PyCFunction)ControlSlider_setDigits, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getDigits", (PyCFunction)ControlSlider_getDigits, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setTextEnabled", (PyCFunction)ControlSlider_setTextEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isTextEnabled", (PyCFunction)ControlSlider_isTextEnabled, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setStep", (PyCFunction)ControlSlider_setStep, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getStep", (PyCFunction)ControlSlider_getStep, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setBase", (PyCFunction)ControlSlider_setBase, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getBase", (PyCFunction)ControlSlider_getBase, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setFormat", (PyCFunction)ControlSlider_setFormat, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getFormat", (PyCFunction)ControlSlider_getFormat, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setValue", (PyCFunction)ControlSlider_setValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getValue", (PyCFunction)ControlSlider_getValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getValuef32", (PyCFunction)ControlSlider_getValuef32, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getValueu32", (PyCFunction)ControlSlider_getValueu32, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getValuei32", (PyCFunction)ControlSlider_getValuei32, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setRange", (PyCFunction)ControlSlider_setRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getMinRange", (PyCFunction)ControlSlider_getMinRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getMaxRange", (PyCFunction)ControlSlider_getMaxRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setHandleSize", (PyCFunction)ControlSlider_setHandleSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getHandleSize", (PyCFunction)ControlSlider_getHandleSize, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setFormatCallback", (PyCFunction)ControlSlider_setFormatCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setReleasedCallback", (PyCFunction)ControlSlider_setReleasedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isReleased", (PyCFunction)ControlSlider_isReleased, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlSlider_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlSlider_isClicked, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)ControlSlider_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "isChanged", (PyCFunction)ControlSlider_isChanged, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSlider_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlSlider_getCanvasMesh, METH_NOARGS, "" });
		PYControlSlider_methods.append(PyMethodDef {});
		PYControlSlider_getsets.reserve(PYControlSlider_getsets.size() + 14);
		PYControlSlider_getsets.append(PyGetSetDef { "slider_color", (getter)ControlSlider_get_slider_color, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "digits", (getter)ControlSlider_get_digits, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "step", (getter)ControlSlider_get_step, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "base", (getter)ControlSlider_get_base, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "format", (getter)ControlSlider_get_format, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "value", (getter)ControlSlider_get_value, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "valuef32", (getter)ControlSlider_get_valuef32, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "valueu32", (getter)ControlSlider_get_valueu32, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "valuei32", (getter)ControlSlider_get_valuei32, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "min_range", (getter)ControlSlider_get_min_range, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "max_range", (getter)ControlSlider_get_max_range, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "handle_size", (getter)ControlSlider_get_handle_size, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlSlider_get_canvas_mesh, nullptr, "", nullptr });
		PYControlSlider_getsets.append(PyGetSetDef {});
		PYControlSlider_Type.tp_base = &PYControlText_Type;
		PYControlSlider_Type.tp_dealloc = (destructor)pyControlSlider_dealloc;
		PYControlSlider_number.nb_bool = (inquiry)pyControlSlider_bool;
		PYControlSlider_Type.tp_name = "tellusim.ControlSlider";
		PYControlSlider_Type.tp_basicsize = sizeof(PYControlSlider);
		PYControlSlider_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlSlider_Type.tp_doc = "";
		PYControlSlider_Type.tp_str = (reprfunc)pyControlSlider_str;
		PYControlSlider_Type.tp_as_number = &PYControlSlider_number;
		PYControlSlider_Type.tp_methods = PYControlSlider_methods.discard();
		PYControlSlider_Type.tp_getset = PYControlSlider_getsets.discard();
		PYControlSlider_Type.tp_init = (initproc)pyControlSlider_init;
		PYControlSlider_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlSlider_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlSlider");
			return false;
		}
		Py_INCREF(&PYControlSlider_Type);
		
		// Tellusim::ControlScroll
		PYControlScroll_methods.reserve(PYControlScroll_methods.size() + 39);
		PYControlScroll_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlScroll_equalPtr, METH_VARARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlScroll_clonePtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlScroll_clearPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlScroll_destroyPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlScroll_acquirePtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlScroll_unacquirePtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlScroll_isValidPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlScroll_isOwnerPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlScroll_isConstPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlScroll_getCountPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlScroll_getInternalPtr, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlScroll_getControlText, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setVertical", (PyCFunction)ControlScroll_setVertical, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isHorizontal", (PyCFunction)ControlScroll_isHorizontal, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isVertical", (PyCFunction)ControlScroll_isVertical, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setPrevText", (PyCFunction)ControlScroll_setPrevText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getPrevText", (PyCFunction)ControlScroll_getPrevText, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setNextText", (PyCFunction)ControlScroll_setNextText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getNextText", (PyCFunction)ControlScroll_getNextText, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setScrollColor", (PyCFunction)ControlScroll_setScrollColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getScrollColor", (PyCFunction)ControlScroll_getScrollColor, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setStep", (PyCFunction)ControlScroll_setStep, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getStep", (PyCFunction)ControlScroll_getStep, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setValue", (PyCFunction)ControlScroll_setValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getValue", (PyCFunction)ControlScroll_getValue, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setFrame", (PyCFunction)ControlScroll_setFrame, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getFrame", (PyCFunction)ControlScroll_getFrame, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setRange", (PyCFunction)ControlScroll_setRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getRange", (PyCFunction)ControlScroll_getRange, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setFrameAlign", (PyCFunction)ControlScroll_setFrameAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getFrameAlign", (PyCFunction)ControlScroll_getFrameAlign, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "hasFrameAlign", (PyCFunction)ControlScroll_hasFrameAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "hasFrameAligns", (PyCFunction)ControlScroll_hasFrameAligns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlScroll_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlScroll_isClicked, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)ControlScroll_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "isChanged", (PyCFunction)ControlScroll_isChanged, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlScroll_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlScroll_getCanvasMesh, METH_NOARGS, "" });
		PYControlScroll_methods.append(PyMethodDef {});
		PYControlScroll_getsets.reserve(PYControlScroll_getsets.size() + 10);
		PYControlScroll_getsets.append(PyGetSetDef { "prev_text", (getter)ControlScroll_get_prev_text, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "next_text", (getter)ControlScroll_get_next_text, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "scroll_color", (getter)ControlScroll_get_scroll_color, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "step", (getter)ControlScroll_get_step, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "value", (getter)ControlScroll_get_value, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "frame", (getter)ControlScroll_get_frame, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "range", (getter)ControlScroll_get_range, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "frame_align", (getter)ControlScroll_get_frame_align, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlScroll_get_canvas_mesh, nullptr, "", nullptr });
		PYControlScroll_getsets.append(PyGetSetDef {});
		PYControlScroll_Type.tp_base = &PYControlText_Type;
		PYControlScroll_Type.tp_dealloc = (destructor)pyControlScroll_dealloc;
		PYControlScroll_number.nb_bool = (inquiry)pyControlScroll_bool;
		PYControlScroll_Type.tp_name = "tellusim.ControlScroll";
		PYControlScroll_Type.tp_basicsize = sizeof(PYControlScroll);
		PYControlScroll_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlScroll_Type.tp_doc = "";
		PYControlScroll_Type.tp_str = (reprfunc)pyControlScroll_str;
		PYControlScroll_Type.tp_as_number = &PYControlScroll_number;
		PYControlScroll_Type.tp_methods = PYControlScroll_methods.discard();
		PYControlScroll_Type.tp_getset = PYControlScroll_getsets.discard();
		PYControlScroll_Type.tp_init = (initproc)pyControlScroll_init;
		PYControlScroll_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlScroll_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlScroll");
			return false;
		}
		Py_INCREF(&PYControlScroll_Type);
		
		// Tellusim::ControlSplit
		PYControlSplit_methods.reserve(PYControlSplit_methods.size() + 23);
		PYControlSplit_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlSplit_equalPtr, METH_VARARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlSplit_clonePtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlSplit_clearPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlSplit_destroyPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlSplit_acquirePtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlSplit_unacquirePtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlSplit_isValidPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlSplit_isOwnerPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlSplit_isConstPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlSplit_getCountPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlSplit_getInternalPtr, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlSplit_getControl, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "setAbsolute", (PyCFunction)ControlSplit_setAbsolute, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isAbsolute", (PyCFunction)ControlSplit_isAbsolute, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "setVertical", (PyCFunction)ControlSplit_setVertical, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isHorizontal", (PyCFunction)ControlSplit_isHorizontal, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "isVertical", (PyCFunction)ControlSplit_isVertical, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "setValue", (PyCFunction)ControlSplit_setValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getValue", (PyCFunction)ControlSplit_getValue, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "setHandleSize", (PyCFunction)ControlSplit_setHandleSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getHandleSize", (PyCFunction)ControlSplit_getHandleSize, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef { "getControlsSize", (PyCFunction)ControlSplit_getControlsSize, METH_NOARGS, "" });
		PYControlSplit_methods.append(PyMethodDef {});
		PYControlSplit_getsets.reserve(PYControlSplit_getsets.size() + 4);
		PYControlSplit_getsets.append(PyGetSetDef { "value", (getter)ControlSplit_get_value, nullptr, "", nullptr });
		PYControlSplit_getsets.append(PyGetSetDef { "handle_size", (getter)ControlSplit_get_handle_size, nullptr, "", nullptr });
		PYControlSplit_getsets.append(PyGetSetDef { "controls_size", (getter)ControlSplit_get_controls_size, nullptr, "", nullptr });
		PYControlSplit_getsets.append(PyGetSetDef {});
		PYControlSplit_Type.tp_base = &PYControl_Type;
		PYControlSplit_Type.tp_dealloc = (destructor)pyControlSplit_dealloc;
		PYControlSplit_number.nb_bool = (inquiry)pyControlSplit_bool;
		PYControlSplit_Type.tp_name = "tellusim.ControlSplit";
		PYControlSplit_Type.tp_basicsize = sizeof(PYControlSplit);
		PYControlSplit_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlSplit_Type.tp_doc = "";
		PYControlSplit_Type.tp_str = (reprfunc)pyControlSplit_str;
		PYControlSplit_Type.tp_as_number = &PYControlSplit_number;
		PYControlSplit_Type.tp_methods = PYControlSplit_methods.discard();
		PYControlSplit_Type.tp_getset = PYControlSplit_getsets.discard();
		PYControlSplit_Type.tp_init = (initproc)pyControlSplit_init;
		PYControlSplit_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlSplit_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlSplit");
			return false;
		}
		Py_INCREF(&PYControlSplit_Type);
		
		// Tellusim::ControlArea
		PYControlArea_methods.reserve(PYControlArea_methods.size() + 64);
		PYControlArea_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlArea_equalPtr, METH_VARARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlArea_clonePtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlArea_clearPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlArea_destroyPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlArea_acquirePtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlArea_unacquirePtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlArea_isValidPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlArea_isOwnerPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlArea_isConstPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlArea_getCountPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlArea_getInternalPtr, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getControl", (PyCFunction)pyControlArea_getControl, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setAbsolute", (PyCFunction)ControlArea_setAbsolute, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "isAbsolute", (PyCFunction)ControlArea_isAbsolute, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setScalable", (PyCFunction)ControlArea_setScalable, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "isScalable", (PyCFunction)ControlArea_isScalable, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setScrollable", (PyCFunction)ControlArea_setScrollable, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "isScrollable", (PyCFunction)ControlArea_isScrollable, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setScale", (PyCFunction)ControlArea_setScale, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getScale", (PyCFunction)ControlArea_getScale, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setScaleRange", (PyCFunction)ControlArea_setScaleRange, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getMinScale", (PyCFunction)ControlArea_getMinScale, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getMaxScale", (PyCFunction)ControlArea_getMaxScale, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setHorizontalStep", (PyCFunction)ControlArea_setHorizontalStep, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "setVerticalStep", (PyCFunction)ControlArea_setVerticalStep, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "setStep", (PyCFunction)ControlArea_setStep, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getHorizontalStep", (PyCFunction)ControlArea_getHorizontalStep, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getVerticalStep", (PyCFunction)ControlArea_getVerticalStep, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setHorizontalValue", (PyCFunction)ControlArea_setHorizontalValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "setVerticalValue", (PyCFunction)ControlArea_setVerticalValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "setValue", (PyCFunction)ControlArea_setValue, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getHorizontalValue", (PyCFunction)ControlArea_getHorizontalValue, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getVerticalValue", (PyCFunction)ControlArea_getVerticalValue, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setFrameAlign", (PyCFunction)ControlArea_setFrameAlign, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getFrameAlign", (PyCFunction)ControlArea_getFrameAlign, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getHorizontalFrame", (PyCFunction)ControlArea_getHorizontalFrame, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getVerticalFrame", (PyCFunction)ControlArea_getVerticalFrame, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getHorizontalRange", (PyCFunction)ControlArea_getHorizontalRange, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getVerticalRange", (PyCFunction)ControlArea_getVerticalRange, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setHorizontalEnabled", (PyCFunction)ControlArea_setHorizontalEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "isHorizontalEnabled", (PyCFunction)ControlArea_isHorizontalEnabled, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isHorizontalDynamic", (PyCFunction)ControlArea_isHorizontalDynamic, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isHorizontalHidden", (PyCFunction)ControlArea_isHorizontalHidden, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getHorizontalScroll", (PyCFunction)ControlArea_getHorizontalScroll, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setVerticalEnabled", (PyCFunction)ControlArea_setVerticalEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "isVerticalEnabled", (PyCFunction)ControlArea_isVerticalEnabled, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isVerticalDynamic", (PyCFunction)ControlArea_isVerticalDynamic, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "isVerticalHidden", (PyCFunction)ControlArea_isVerticalHidden, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getVerticalScroll", (PyCFunction)ControlArea_getVerticalScroll, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setFontSize", (PyCFunction)ControlArea_setFontSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getFontSize", (PyCFunction)ControlArea_getFontSize, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setFontStyle", (PyCFunction)ControlArea_setFontStyle, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getFontStyleConst", (PyCFunction)ControlArea_getFontStyleConst, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getFontStyle", (PyCFunction)ControlArea_getFontStyle, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setColumns", (PyCFunction)ControlArea_setColumns, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getColumns", (PyCFunction)ControlArea_getColumns, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setSpacing", (PyCFunction)ControlArea_setSpacing, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getSpacing", (PyCFunction)ControlArea_getSpacing, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "setColumnRatio", (PyCFunction)ControlArea_setColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getColumnRatio", (PyCFunction)ControlArea_getColumnRatio, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlArea_methods.append(PyMethodDef { "getControlsSize", (PyCFunction)ControlArea_getControlsSize, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getControlsOffset", (PyCFunction)ControlArea_getControlsOffset, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef { "getViewRect", (PyCFunction)ControlArea_getViewRect, METH_NOARGS, "" });
		PYControlArea_methods.append(PyMethodDef {});
		PYControlArea_getsets.reserve(PYControlArea_getsets.size() + 23);
		PYControlArea_getsets.append(PyGetSetDef { "scale", (getter)ControlArea_get_scale, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "min_scale", (getter)ControlArea_get_min_scale, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "max_scale", (getter)ControlArea_get_max_scale, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "horizontal_step", (getter)ControlArea_get_horizontal_step, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "vertical_step", (getter)ControlArea_get_vertical_step, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "horizontal_value", (getter)ControlArea_get_horizontal_value, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "vertical_value", (getter)ControlArea_get_vertical_value, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "frame_align", (getter)ControlArea_get_frame_align, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "horizontal_frame", (getter)ControlArea_get_horizontal_frame, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "vertical_frame", (getter)ControlArea_get_vertical_frame, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "horizontal_range", (getter)ControlArea_get_horizontal_range, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "vertical_range", (getter)ControlArea_get_vertical_range, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "horizontal_scroll", (getter)ControlArea_get_horizontal_scroll, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "vertical_scroll", (getter)ControlArea_get_vertical_scroll, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "font_size", (getter)ControlArea_get_font_size, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "font_style_const", (getter)ControlArea_get_font_style_const, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "font_style", (getter)ControlArea_get_font_style, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "columns", (getter)ControlArea_get_columns, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "spacing", (getter)ControlArea_get_spacing, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "controls_size", (getter)ControlArea_get_controls_size, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "controls_offset", (getter)ControlArea_get_controls_offset, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef { "view_rect", (getter)ControlArea_get_view_rect, nullptr, "", nullptr });
		PYControlArea_getsets.append(PyGetSetDef {});
		PYControlArea_Type.tp_base = &PYControl_Type;
		PYControlArea_Type.tp_dealloc = (destructor)pyControlArea_dealloc;
		PYControlArea_number.nb_bool = (inquiry)pyControlArea_bool;
		PYControlArea_Type.tp_name = "tellusim.ControlArea";
		PYControlArea_Type.tp_basicsize = sizeof(PYControlArea);
		PYControlArea_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlArea_Type.tp_doc = "";
		PYControlArea_Type.tp_str = (reprfunc)pyControlArea_str;
		PYControlArea_Type.tp_as_number = &PYControlArea_number;
		PYControlArea_Type.tp_methods = PYControlArea_methods.discard();
		PYControlArea_Type.tp_getset = PYControlArea_getsets.discard();
		PYControlArea_Type.tp_init = (initproc)pyControlArea_init;
		PYControlArea_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlArea_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlArea");
			return false;
		}
		Py_INCREF(&PYControlArea_Type);
		
		// Tellusim::ControlTree
		PYControlTree_methods.reserve(PYControlTree_methods.size() + 82);
		PYControlTree_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlTree_equalPtr, METH_VARARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlTree_clonePtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlTree_clearPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlTree_destroyPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlTree_acquirePtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlTree_unacquirePtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlTree_isValidPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlTree_isOwnerPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlTree_isConstPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlTree_getCountPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlTree_getInternalPtr, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlTree_getControlText, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setSelectable", (PyCFunction)ControlTree_setSelectable, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isSelectable", (PyCFunction)ControlTree_isSelectable, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setMultiSelection", (PyCFunction)ControlTree_setMultiSelection, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isMultiSelection", (PyCFunction)ControlTree_isMultiSelection, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setFoldedText", (PyCFunction)ControlTree_setFoldedText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getFoldedText", (PyCFunction)ControlTree_getFoldedText, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setExpandedText", (PyCFunction)ControlTree_setExpandedText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getExpandedText", (PyCFunction)ControlTree_getExpandedText, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setTexture", (PyCFunction)ControlTree_setTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getTexture", (PyCFunction)ControlTree_getTexture, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setTextureName", (PyCFunction)ControlTree_setTextureName, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getTextureName", (PyCFunction)ControlTree_getTextureName, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setTextureGrid", (PyCFunction)ControlTree_setTextureGrid, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getTextureRows", (PyCFunction)ControlTree_getTextureRows, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getTextureColumns", (PyCFunction)ControlTree_getTextureColumns, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "clearItems", (PyCFunction)ControlTree_clearItems, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "addItem", (PyCFunction)ControlTree_addItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "removeItem", (PyCFunction)ControlTree_removeItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "viewItem", (PyCFunction)ControlTree_viewItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getNumItems", (PyCFunction)ControlTree_getNumItems, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItem", (PyCFunction)ControlTree_getItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "switchItemHidden", (PyCFunction)ControlTree_switchItemHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemHidden", (PyCFunction)ControlTree_setItemHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isItemHidden", (PyCFunction)ControlTree_isItemHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "switchItemExpanded", (PyCFunction)ControlTree_switchItemExpanded, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemExpanded", (PyCFunction)ControlTree_setItemExpanded, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isItemExpanded", (PyCFunction)ControlTree_isItemExpanded, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "switchItemSelected", (PyCFunction)ControlTree_switchItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemSelected", (PyCFunction)ControlTree_setItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isItemSelected", (PyCFunction)ControlTree_isItemSelected, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemParent", (PyCFunction)ControlTree_setItemParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemParent", (PyCFunction)ControlTree_getItemParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isItemParent", (PyCFunction)ControlTree_isItemParent, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "addItemChild", (PyCFunction)ControlTree_addItemChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "removeItemChild", (PyCFunction)ControlTree_removeItemChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "addItemChildren", (PyCFunction)ControlTree_addItemChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "removeItemChildren", (PyCFunction)ControlTree_removeItemChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "findItemChild", (PyCFunction)ControlTree_findItemChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "isItemChild", (PyCFunction)ControlTree_isItemChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getNumItemChildren", (PyCFunction)ControlTree_getNumItemChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemChild", (PyCFunction)ControlTree_getItemChild, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemChildren", (PyCFunction)ControlTree_getItemChildren, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemText", (PyCFunction)ControlTree_setItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemText", (PyCFunction)ControlTree_getItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "findItemText", (PyCFunction)ControlTree_findItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemColor", (PyCFunction)ControlTree_setItemColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemColor", (PyCFunction)ControlTree_getItemColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemTexture", (PyCFunction)ControlTree_setItemTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemTextureRow", (PyCFunction)ControlTree_getItemTextureRow, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemTextureColumn", (PyCFunction)ControlTree_getItemTextureColumn, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setItemUserData", (PyCFunction)ControlTree_setItemUserData, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getItemUserData", (PyCFunction)ControlTree_getItemUserData, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setCurrentItem", (PyCFunction)ControlTree_setCurrentItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getCurrentItem", (PyCFunction)ControlTree_getCurrentItem, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getCurrentText", (PyCFunction)ControlTree_getCurrentText, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setSelection", (PyCFunction)ControlTree_setSelection, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "clearSelection", (PyCFunction)ControlTree_clearSelection, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "inverseSelection", (PyCFunction)ControlTree_inverseSelection, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getNumSelectedItems", (PyCFunction)ControlTree_getNumSelectedItems, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "getSelectedItem", (PyCFunction)ControlTree_getSelectedItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "getSelectedItems", (PyCFunction)ControlTree_getSelectedItems, METH_NOARGS, "" });
		PYControlTree_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)ControlTree_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setDraggedCallback", (PyCFunction)ControlTree_setDraggedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setDroppedCallback", (PyCFunction)ControlTree_setDroppedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlTree_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setClicked2Callback", (PyCFunction)ControlTree_setClicked2Callback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setClickedRightCallback", (PyCFunction)ControlTree_setClickedRightCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setExpandedCallback", (PyCFunction)ControlTree_setExpandedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef { "setSelectedCallback", (PyCFunction)ControlTree_setSelectedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlTree_methods.append(PyMethodDef {});
		PYControlTree_getsets.reserve(PYControlTree_getsets.size() + 11);
		PYControlTree_getsets.append(PyGetSetDef { "folded_text", (getter)ControlTree_get_folded_text, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "expanded_text", (getter)ControlTree_get_expanded_text, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "texture", (getter)ControlTree_get_texture, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "texture_name", (getter)ControlTree_get_texture_name, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "texture_rows", (getter)ControlTree_get_texture_rows, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "texture_columns", (getter)ControlTree_get_texture_columns, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "num_items", (getter)ControlTree_get_num_items, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "current_item", (getter)ControlTree_get_current_item, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "current_text", (getter)ControlTree_get_current_text, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef { "num_selected_items", (getter)ControlTree_get_num_selected_items, nullptr, "", nullptr });
		PYControlTree_getsets.append(PyGetSetDef {});
		PYControlTree_Type.tp_base = &PYControlText_Type;
		PYControlTree_Type.tp_dealloc = (destructor)pyControlTree_dealloc;
		PYControlTree_number.nb_bool = (inquiry)pyControlTree_bool;
		PYControlTree_Type.tp_name = "tellusim.ControlTree";
		PYControlTree_Type.tp_basicsize = sizeof(PYControlTree);
		PYControlTree_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlTree_Type.tp_doc = "";
		PYControlTree_Type.tp_str = (reprfunc)pyControlTree_str;
		PYControlTree_Type.tp_as_number = &PYControlTree_number;
		PYControlTree_Type.tp_methods = PYControlTree_methods.discard();
		PYControlTree_Type.tp_getset = PYControlTree_getsets.discard();
		PYControlTree_Type.tp_init = (initproc)pyControlTree_init;
		PYControlTree_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlTree_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlTree");
			return false;
		}
		Py_INCREF(&PYControlTree_Type);
		
		// Tellusim::ControlEdit
		PYControlEdit_methods.reserve(PYControlEdit_methods.size() + 38);
		PYControlEdit_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyControlEdit_equalPtr, METH_VARARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyControlEdit_clonePtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyControlEdit_clearPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyControlEdit_destroyPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyControlEdit_acquirePtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyControlEdit_unacquirePtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyControlEdit_isValidPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyControlEdit_isOwnerPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyControlEdit_isConstPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyControlEdit_getCountPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyControlEdit_getInternalPtr, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getControlText", (PyCFunction)pyControlEdit_getControlText, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setFrame", (PyCFunction)ControlEdit_setFrame, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getFrame", (PyCFunction)ControlEdit_getFrame, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setBackground", (PyCFunction)ControlEdit_setBackground, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getBackground", (PyCFunction)ControlEdit_getBackground, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setEditColor", (PyCFunction)ControlEdit_setEditColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getEditColor", (PyCFunction)ControlEdit_getEditColor, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setEditMode", (PyCFunction)ControlEdit_setEditMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getEditMode", (PyCFunction)ControlEdit_getEditMode, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setPasswordCode", (PyCFunction)ControlEdit_setPasswordCode, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getPasswordCode", (PyCFunction)ControlEdit_getPasswordCode, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getNumCodes", (PyCFunction)ControlEdit_getNumCodes, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getCodes", (PyCFunction)ControlEdit_getCodes, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setCurrentIndex", (PyCFunction)ControlEdit_setCurrentIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getCurrentIndex", (PyCFunction)ControlEdit_getCurrentIndex, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getSelectionIndex", (PyCFunction)ControlEdit_getSelectionIndex, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setSelection", (PyCFunction)ControlEdit_setSelection, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "clearSelection", (PyCFunction)ControlEdit_clearSelection, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getSelectedText", (PyCFunction)ControlEdit_getSelectedText, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setClickedCallback", (PyCFunction)ControlEdit_setClickedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isClicked", (PyCFunction)ControlEdit_isClicked, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)ControlEdit_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isChanged", (PyCFunction)ControlEdit_isChanged, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "setReturnedCallback", (PyCFunction)ControlEdit_setReturnedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYControlEdit_methods.append(PyMethodDef { "isReturned", (PyCFunction)ControlEdit_isReturned, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef { "getCanvasMesh", (PyCFunction)ControlEdit_getCanvasMesh, METH_NOARGS, "" });
		PYControlEdit_methods.append(PyMethodDef {});
		PYControlEdit_getsets.reserve(PYControlEdit_getsets.size() + 12);
		PYControlEdit_getsets.append(PyGetSetDef { "frame", (getter)ControlEdit_get_frame, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "background", (getter)ControlEdit_get_background, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "edit_color", (getter)ControlEdit_get_edit_color, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "edit_mode", (getter)ControlEdit_get_edit_mode, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "password_code", (getter)ControlEdit_get_password_code, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "num_codes", (getter)ControlEdit_get_num_codes, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "codes", (getter)ControlEdit_get_codes, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "current_index", (getter)ControlEdit_get_current_index, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "selection_index", (getter)ControlEdit_get_selection_index, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "selected_text", (getter)ControlEdit_get_selected_text, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef { "canvas_mesh", (getter)ControlEdit_get_canvas_mesh, nullptr, "", nullptr });
		PYControlEdit_getsets.append(PyGetSetDef {});
		PYControlEdit_Type.tp_base = &PYControlText_Type;
		PYControlEdit_Type.tp_dealloc = (destructor)pyControlEdit_dealloc;
		PYControlEdit_number.nb_bool = (inquiry)pyControlEdit_bool;
		PYControlEdit_Type.tp_name = "tellusim.ControlEdit";
		PYControlEdit_Type.tp_basicsize = sizeof(PYControlEdit);
		PYControlEdit_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYControlEdit_Type.tp_doc = "";
		PYControlEdit_Type.tp_str = (reprfunc)pyControlEdit_str;
		PYControlEdit_Type.tp_as_number = &PYControlEdit_number;
		PYControlEdit_Type.tp_methods = PYControlEdit_methods.discard();
		PYControlEdit_Type.tp_getset = PYControlEdit_getsets.discard();
		PYControlEdit_Type.tp_init = (initproc)pyControlEdit_init;
		PYControlEdit_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYControlEdit_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "ControlEdit");
			return false;
		}
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModeText", PyLong_FromLong(0));
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModePassword", PyLong_FromLong(1));
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModeNumber", PyLong_FromLong(2));
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModeSigned", PyLong_FromLong(3));
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModeUnsigned", PyLong_FromLong(4));
		PyDict_SetItemString(PYControlEdit_Type.tp_dict, "EditModeHexadecimal", PyLong_FromLong(5));
		PyType_Modified(&PYControlEdit_Type);
		Py_INCREF(&PYControlEdit_Type);
		
		// Tellusim::DialogMessage
		PYDialogMessage_methods.reserve(PYDialogMessage_methods.size() + 21);
		PYDialogMessage_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogMessage_equalPtr, METH_VARARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogMessage_clonePtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogMessage_clearPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogMessage_destroyPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogMessage_acquirePtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogMessage_unacquirePtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogMessage_isValidPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogMessage_isOwnerPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogMessage_isConstPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogMessage_getCountPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogMessage_getInternalPtr, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogMessage_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogMessage_getPositionX, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogMessage_getPositionY, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogMessage_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogMessage_getTitle, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "setMessage", (PyCFunction)DialogMessage_setMessage, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "getMessage", (PyCFunction)DialogMessage_getMessage, METH_NOARGS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogMessage_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMessage_methods.append(PyMethodDef { "run", (PyCFunction)DialogMessage_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMessage_methods.append(PyMethodDef {});
		PYDialogMessage_getsets.reserve(PYDialogMessage_getsets.size() + 5);
		PYDialogMessage_getsets.append(PyGetSetDef { "position_x", (getter)DialogMessage_get_position_x, nullptr, "", nullptr });
		PYDialogMessage_getsets.append(PyGetSetDef { "position_y", (getter)DialogMessage_get_position_y, nullptr, "", nullptr });
		PYDialogMessage_getsets.append(PyGetSetDef { "title", (getter)DialogMessage_get_title, nullptr, "", nullptr });
		PYDialogMessage_getsets.append(PyGetSetDef { "message", (getter)DialogMessage_get_message, nullptr, "", nullptr });
		PYDialogMessage_getsets.append(PyGetSetDef {});
		PYDialogMessage_Type.tp_dealloc = (destructor)pyDialogMessage_dealloc;
		PYDialogMessage_number.nb_bool = (inquiry)pyDialogMessage_bool;
		PYDialogMessage_Type.tp_name = "tellusim.DialogMessage";
		PYDialogMessage_Type.tp_basicsize = sizeof(PYDialogMessage);
		PYDialogMessage_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogMessage_Type.tp_doc = "";
		PYDialogMessage_Type.tp_str = (reprfunc)pyDialogMessage_str;
		PYDialogMessage_Type.tp_as_number = &PYDialogMessage_number;
		PYDialogMessage_Type.tp_methods = PYDialogMessage_methods.discard();
		PYDialogMessage_Type.tp_getset = PYDialogMessage_getsets.discard();
		PYDialogMessage_Type.tp_init = (initproc)pyDialogMessage_init;
		PYDialogMessage_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogMessage_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogMessage");
			return false;
		}
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagYes", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagNo", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagOk", PyLong_FromLong(4));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagCancel", PyLong_FromLong(8));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagClose", PyLong_FromLong(16));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagMessage", PyLong_FromLong(32));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagWarning", PyLong_FromLong(64));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagQuestion", PyLong_FromLong(128));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagError", PyLong_FromLong(256));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagMouse", PyLong_FromLong(512));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagYesNo", PyLong_FromLong(3));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "FlagOkCancel", PyLong_FromLong(12));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "DefaultFlags", PyLong_FromLong(4));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "NumFlags", PyLong_FromLong(10));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "ResultClose", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "ResultCancel", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "ResultOk", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "ResultNo", PyLong_FromLong(3));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "ResultYes", PyLong_FromLong(4));
		PyDict_SetItemString(PYDialogMessage_Type.tp_dict, "NumResults", PyLong_FromLong(5));
		PyType_Modified(&PYDialogMessage_Type);
		Py_INCREF(&PYDialogMessage_Type);
		
		// Tellusim::DialogFileOpen
		PYDialogFileOpen_methods.reserve(PYDialogFileOpen_methods.size() + 23);
		PYDialogFileOpen_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogFileOpen_equalPtr, METH_VARARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogFileOpen_clonePtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogFileOpen_clearPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogFileOpen_destroyPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogFileOpen_acquirePtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogFileOpen_unacquirePtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogFileOpen_isValidPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogFileOpen_isOwnerPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogFileOpen_isConstPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogFileOpen_getCountPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogFileOpen_getInternalPtr, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogFileOpen_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogFileOpen_getPositionX, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogFileOpen_getPositionY, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogFileOpen_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogFileOpen_getTitle, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "setFilter", (PyCFunction)DialogFileOpen_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getFilter", (PyCFunction)DialogFileOpen_getFilter, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "setFile", (PyCFunction)DialogFileOpen_setFile, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "getFile", (PyCFunction)DialogFileOpen_getFile, METH_NOARGS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogFileOpen_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef { "run", (PyCFunction)DialogFileOpen_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileOpen_methods.append(PyMethodDef {});
		PYDialogFileOpen_getsets.reserve(PYDialogFileOpen_getsets.size() + 6);
		PYDialogFileOpen_getsets.append(PyGetSetDef { "position_x", (getter)DialogFileOpen_get_position_x, nullptr, "", nullptr });
		PYDialogFileOpen_getsets.append(PyGetSetDef { "position_y", (getter)DialogFileOpen_get_position_y, nullptr, "", nullptr });
		PYDialogFileOpen_getsets.append(PyGetSetDef { "title", (getter)DialogFileOpen_get_title, nullptr, "", nullptr });
		PYDialogFileOpen_getsets.append(PyGetSetDef { "filter", (getter)DialogFileOpen_get_filter, nullptr, "", nullptr });
		PYDialogFileOpen_getsets.append(PyGetSetDef { "file", (getter)DialogFileOpen_get_file, nullptr, "", nullptr });
		PYDialogFileOpen_getsets.append(PyGetSetDef {});
		PYDialogFileOpen_Type.tp_dealloc = (destructor)pyDialogFileOpen_dealloc;
		PYDialogFileOpen_number.nb_bool = (inquiry)pyDialogFileOpen_bool;
		PYDialogFileOpen_Type.tp_name = "tellusim.DialogFileOpen";
		PYDialogFileOpen_Type.tp_basicsize = sizeof(PYDialogFileOpen);
		PYDialogFileOpen_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogFileOpen_Type.tp_doc = "";
		PYDialogFileOpen_Type.tp_str = (reprfunc)pyDialogFileOpen_str;
		PYDialogFileOpen_Type.tp_as_number = &PYDialogFileOpen_number;
		PYDialogFileOpen_Type.tp_methods = PYDialogFileOpen_methods.discard();
		PYDialogFileOpen_Type.tp_getset = PYDialogFileOpen_getsets.discard();
		PYDialogFileOpen_Type.tp_init = (initproc)pyDialogFileOpen_init;
		PYDialogFileOpen_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogFileOpen_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogFileOpen");
			return false;
		}
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "FlagHidden", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "FlagMouse", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "NumFlags", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "ResultOk", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogFileOpen_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogFileOpen_Type);
		Py_INCREF(&PYDialogFileOpen_Type);
		
		// Tellusim::DialogFileSave
		PYDialogFileSave_methods.reserve(PYDialogFileSave_methods.size() + 23);
		PYDialogFileSave_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogFileSave_equalPtr, METH_VARARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogFileSave_clonePtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogFileSave_clearPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogFileSave_destroyPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogFileSave_acquirePtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogFileSave_unacquirePtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogFileSave_isValidPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogFileSave_isOwnerPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogFileSave_isConstPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogFileSave_getCountPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogFileSave_getInternalPtr, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogFileSave_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogFileSave_getPositionX, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogFileSave_getPositionY, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogFileSave_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogFileSave_getTitle, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "setFilter", (PyCFunction)DialogFileSave_setFilter, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getFilter", (PyCFunction)DialogFileSave_getFilter, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "setFile", (PyCFunction)DialogFileSave_setFile, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "getFile", (PyCFunction)DialogFileSave_getFile, METH_NOARGS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogFileSave_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef { "run", (PyCFunction)DialogFileSave_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogFileSave_methods.append(PyMethodDef {});
		PYDialogFileSave_getsets.reserve(PYDialogFileSave_getsets.size() + 6);
		PYDialogFileSave_getsets.append(PyGetSetDef { "position_x", (getter)DialogFileSave_get_position_x, nullptr, "", nullptr });
		PYDialogFileSave_getsets.append(PyGetSetDef { "position_y", (getter)DialogFileSave_get_position_y, nullptr, "", nullptr });
		PYDialogFileSave_getsets.append(PyGetSetDef { "title", (getter)DialogFileSave_get_title, nullptr, "", nullptr });
		PYDialogFileSave_getsets.append(PyGetSetDef { "filter", (getter)DialogFileSave_get_filter, nullptr, "", nullptr });
		PYDialogFileSave_getsets.append(PyGetSetDef { "file", (getter)DialogFileSave_get_file, nullptr, "", nullptr });
		PYDialogFileSave_getsets.append(PyGetSetDef {});
		PYDialogFileSave_Type.tp_dealloc = (destructor)pyDialogFileSave_dealloc;
		PYDialogFileSave_number.nb_bool = (inquiry)pyDialogFileSave_bool;
		PYDialogFileSave_Type.tp_name = "tellusim.DialogFileSave";
		PYDialogFileSave_Type.tp_basicsize = sizeof(PYDialogFileSave);
		PYDialogFileSave_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogFileSave_Type.tp_doc = "";
		PYDialogFileSave_Type.tp_str = (reprfunc)pyDialogFileSave_str;
		PYDialogFileSave_Type.tp_as_number = &PYDialogFileSave_number;
		PYDialogFileSave_Type.tp_methods = PYDialogFileSave_methods.discard();
		PYDialogFileSave_Type.tp_getset = PYDialogFileSave_getsets.discard();
		PYDialogFileSave_Type.tp_init = (initproc)pyDialogFileSave_init;
		PYDialogFileSave_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogFileSave_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogFileSave");
			return false;
		}
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "FlagHidden", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "FlagOverwrite", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "FlagMouse", PyLong_FromLong(4));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "DefaultFlags", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "NumFlags", PyLong_FromLong(3));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "ResultOk", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogFileSave_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogFileSave_Type);
		Py_INCREF(&PYDialogFileSave_Type);
		
		// Tellusim::DialogDirectory
		PYDialogDirectory_methods.reserve(PYDialogDirectory_methods.size() + 21);
		PYDialogDirectory_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogDirectory_equalPtr, METH_VARARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogDirectory_clonePtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogDirectory_clearPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogDirectory_destroyPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogDirectory_acquirePtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogDirectory_unacquirePtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogDirectory_isValidPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogDirectory_isOwnerPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogDirectory_isConstPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogDirectory_getCountPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogDirectory_getInternalPtr, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogDirectory_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogDirectory_getPositionX, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogDirectory_getPositionY, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogDirectory_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogDirectory_getTitle, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "setDirectory", (PyCFunction)DialogDirectory_setDirectory, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "getDirectory", (PyCFunction)DialogDirectory_getDirectory, METH_NOARGS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogDirectory_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogDirectory_methods.append(PyMethodDef { "run", (PyCFunction)DialogDirectory_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogDirectory_methods.append(PyMethodDef {});
		PYDialogDirectory_getsets.reserve(PYDialogDirectory_getsets.size() + 5);
		PYDialogDirectory_getsets.append(PyGetSetDef { "position_x", (getter)DialogDirectory_get_position_x, nullptr, "", nullptr });
		PYDialogDirectory_getsets.append(PyGetSetDef { "position_y", (getter)DialogDirectory_get_position_y, nullptr, "", nullptr });
		PYDialogDirectory_getsets.append(PyGetSetDef { "title", (getter)DialogDirectory_get_title, nullptr, "", nullptr });
		PYDialogDirectory_getsets.append(PyGetSetDef { "directory", (getter)DialogDirectory_get_directory, nullptr, "", nullptr });
		PYDialogDirectory_getsets.append(PyGetSetDef {});
		PYDialogDirectory_Type.tp_dealloc = (destructor)pyDialogDirectory_dealloc;
		PYDialogDirectory_number.nb_bool = (inquiry)pyDialogDirectory_bool;
		PYDialogDirectory_Type.tp_name = "tellusim.DialogDirectory";
		PYDialogDirectory_Type.tp_basicsize = sizeof(PYDialogDirectory);
		PYDialogDirectory_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogDirectory_Type.tp_doc = "";
		PYDialogDirectory_Type.tp_str = (reprfunc)pyDialogDirectory_str;
		PYDialogDirectory_Type.tp_as_number = &PYDialogDirectory_number;
		PYDialogDirectory_Type.tp_methods = PYDialogDirectory_methods.discard();
		PYDialogDirectory_Type.tp_getset = PYDialogDirectory_getsets.discard();
		PYDialogDirectory_Type.tp_init = (initproc)pyDialogDirectory_init;
		PYDialogDirectory_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogDirectory_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogDirectory");
			return false;
		}
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "FlagMouse", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "NumFlags", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "ResultOk", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogDirectory_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogDirectory_Type);
		Py_INCREF(&PYDialogDirectory_Type);
		
		// Tellusim::DialogProgress
		PYDialogProgress_methods.reserve(PYDialogProgress_methods.size() + 23);
		PYDialogProgress_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogProgress_equalPtr, METH_VARARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogProgress_clonePtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogProgress_clearPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogProgress_destroyPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogProgress_acquirePtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogProgress_unacquirePtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogProgress_isValidPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogProgress_isOwnerPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogProgress_isConstPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogProgress_getCountPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogProgress_getInternalPtr, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogProgress_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogProgress_getPositionX, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogProgress_getPositionY, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogProgress_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogProgress_getTitle, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "setMessage", (PyCFunction)DialogProgress_setMessage, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getMessage", (PyCFunction)DialogProgress_getMessage, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "setProgress", (PyCFunction)DialogProgress_setProgress, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "getProgress", (PyCFunction)DialogProgress_getProgress, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "run", (PyCFunction)DialogProgress_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogProgress_methods.append(PyMethodDef { "close", (PyCFunction)DialogProgress_close, METH_NOARGS, "" });
		PYDialogProgress_methods.append(PyMethodDef {});
		PYDialogProgress_getsets.reserve(PYDialogProgress_getsets.size() + 6);
		PYDialogProgress_getsets.append(PyGetSetDef { "position_x", (getter)DialogProgress_get_position_x, nullptr, "", nullptr });
		PYDialogProgress_getsets.append(PyGetSetDef { "position_y", (getter)DialogProgress_get_position_y, nullptr, "", nullptr });
		PYDialogProgress_getsets.append(PyGetSetDef { "title", (getter)DialogProgress_get_title, nullptr, "", nullptr });
		PYDialogProgress_getsets.append(PyGetSetDef { "message", (getter)DialogProgress_get_message, nullptr, "", nullptr });
		PYDialogProgress_getsets.append(PyGetSetDef { "progress", (getter)DialogProgress_get_progress, nullptr, "", nullptr });
		PYDialogProgress_getsets.append(PyGetSetDef {});
		PYDialogProgress_Type.tp_dealloc = (destructor)pyDialogProgress_dealloc;
		PYDialogProgress_number.nb_bool = (inquiry)pyDialogProgress_bool;
		PYDialogProgress_Type.tp_name = "tellusim.DialogProgress";
		PYDialogProgress_Type.tp_basicsize = sizeof(PYDialogProgress);
		PYDialogProgress_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogProgress_Type.tp_doc = "";
		PYDialogProgress_Type.tp_str = (reprfunc)pyDialogProgress_str;
		PYDialogProgress_Type.tp_as_number = &PYDialogProgress_number;
		PYDialogProgress_Type.tp_methods = PYDialogProgress_methods.discard();
		PYDialogProgress_Type.tp_getset = PYDialogProgress_getsets.discard();
		PYDialogProgress_Type.tp_init = (initproc)pyDialogProgress_init;
		PYDialogProgress_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogProgress_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogProgress");
			return false;
		}
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "FlagMouse", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "NumFlags", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "ResultOk", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogProgress_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogProgress_Type);
		Py_INCREF(&PYDialogProgress_Type);
		
		// Tellusim::DialogColor
		PYDialogColor_methods.reserve(PYDialogColor_methods.size() + 22);
		PYDialogColor_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogColor_equalPtr, METH_VARARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogColor_clonePtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogColor_clearPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogColor_destroyPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogColor_acquirePtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogColor_unacquirePtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogColor_isValidPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogColor_isOwnerPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogColor_isConstPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogColor_getCountPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogColor_getInternalPtr, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogColor_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogColor_getPositionX, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogColor_getPositionY, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "setTitle", (PyCFunction)DialogColor_setTitle, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getTitle", (PyCFunction)DialogColor_getTitle, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "setColor", (PyCFunction)DialogColor_setColor, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef { "getColor", (PyCFunction)DialogColor_getColor, METH_NOARGS, "" });
		PYDialogColor_methods.append(PyMethodDef { "setChangedCallback", (PyCFunction)DialogColor_setChangedCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogColor_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef { "run", (PyCFunction)DialogColor_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogColor_methods.append(PyMethodDef {});
		PYDialogColor_getsets.reserve(PYDialogColor_getsets.size() + 5);
		PYDialogColor_getsets.append(PyGetSetDef { "position_x", (getter)DialogColor_get_position_x, nullptr, "", nullptr });
		PYDialogColor_getsets.append(PyGetSetDef { "position_y", (getter)DialogColor_get_position_y, nullptr, "", nullptr });
		PYDialogColor_getsets.append(PyGetSetDef { "title", (getter)DialogColor_get_title, nullptr, "", nullptr });
		PYDialogColor_getsets.append(PyGetSetDef { "color", (getter)DialogColor_get_color, nullptr, "", nullptr });
		PYDialogColor_getsets.append(PyGetSetDef {});
		PYDialogColor_Type.tp_dealloc = (destructor)pyDialogColor_dealloc;
		PYDialogColor_number.nb_bool = (inquiry)pyDialogColor_bool;
		PYDialogColor_Type.tp_name = "tellusim.DialogColor";
		PYDialogColor_Type.tp_basicsize = sizeof(PYDialogColor);
		PYDialogColor_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogColor_Type.tp_doc = "";
		PYDialogColor_Type.tp_str = (reprfunc)pyDialogColor_str;
		PYDialogColor_Type.tp_as_number = &PYDialogColor_number;
		PYDialogColor_Type.tp_methods = PYDialogColor_methods.discard();
		PYDialogColor_Type.tp_getset = PYDialogColor_getsets.discard();
		PYDialogColor_Type.tp_init = (initproc)pyDialogColor_init;
		PYDialogColor_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogColor_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogColor");
			return false;
		}
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "FlagAlpha", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "FlagMouse", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "NumFlags", PyLong_FromLong(2));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "ResultOk", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogColor_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogColor_Type);
		Py_INCREF(&PYDialogColor_Type);
		
		// Tellusim::DialogMenu
		PYDialogMenu_methods.reserve(PYDialogMenu_methods.size() + 34);
		PYDialogMenu_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDialogMenu_equalPtr, METH_VARARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDialogMenu_clonePtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDialogMenu_clearPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDialogMenu_destroyPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDialogMenu_acquirePtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDialogMenu_unacquirePtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDialogMenu_isValidPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDialogMenu_isOwnerPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDialogMenu_isConstPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDialogMenu_getCountPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDialogMenu_getInternalPtr, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setPosition", (PyCFunction)DialogMenu_setPosition, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getPositionX", (PyCFunction)DialogMenu_getPositionX, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getPositionY", (PyCFunction)DialogMenu_getPositionY, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getNumItems", (PyCFunction)DialogMenu_getNumItems, METH_NOARGS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemText", (PyCFunction)DialogMenu_setItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getItemText", (PyCFunction)DialogMenu_getItemText, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemKey", (PyCFunction)DialogMenu_setItemKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getItemKey", (PyCFunction)DialogMenu_getItemKey, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemImage", (PyCFunction)DialogMenu_setItemImage, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getItemImage", (PyCFunction)DialogMenu_getItemImage, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemChecked", (PyCFunction)DialogMenu_setItemChecked, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isItemChecked", (PyCFunction)DialogMenu_isItemChecked, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemEnabled", (PyCFunction)DialogMenu_setItemEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isItemEnabled", (PyCFunction)DialogMenu_isItemEnabled, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemHidden", (PyCFunction)DialogMenu_setItemHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "isItemHidden", (PyCFunction)DialogMenu_isItemHidden, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setItemsGroup", (PyCFunction)DialogMenu_setItemsGroup, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getItemGroupIndex", (PyCFunction)DialogMenu_getItemGroupIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "getItemGroupSize", (PyCFunction)DialogMenu_getItemGroupSize, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "addItem", (PyCFunction)DialogMenu_addItem, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "setUpdateCallback", (PyCFunction)DialogMenu_setUpdateCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef { "run", (PyCFunction)DialogMenu_run, METH_VARARGS | METH_KEYWORDS, "" });
		PYDialogMenu_methods.append(PyMethodDef {});
		PYDialogMenu_getsets.reserve(PYDialogMenu_getsets.size() + 4);
		PYDialogMenu_getsets.append(PyGetSetDef { "position_x", (getter)DialogMenu_get_position_x, nullptr, "", nullptr });
		PYDialogMenu_getsets.append(PyGetSetDef { "position_y", (getter)DialogMenu_get_position_y, nullptr, "", nullptr });
		PYDialogMenu_getsets.append(PyGetSetDef { "num_items", (getter)DialogMenu_get_num_items, nullptr, "", nullptr });
		PYDialogMenu_getsets.append(PyGetSetDef {});
		PYDialogMenu_Type.tp_dealloc = (destructor)pyDialogMenu_dealloc;
		PYDialogMenu_number.nb_bool = (inquiry)pyDialogMenu_bool;
		PYDialogMenu_Type.tp_name = "tellusim.DialogMenu";
		PYDialogMenu_Type.tp_basicsize = sizeof(PYDialogMenu);
		PYDialogMenu_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDialogMenu_Type.tp_doc = "";
		PYDialogMenu_Type.tp_str = (reprfunc)pyDialogMenu_str;
		PYDialogMenu_Type.tp_as_number = &PYDialogMenu_number;
		PYDialogMenu_Type.tp_methods = PYDialogMenu_methods.discard();
		PYDialogMenu_Type.tp_getset = PYDialogMenu_getsets.discard();
		PYDialogMenu_Type.tp_init = (initproc)pyDialogMenu_init;
		PYDialogMenu_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDialogMenu_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DialogMenu");
			return false;
		}
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "FlagMouse", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "NumFlags", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "ResultCancel", PyLong_FromLong(0));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "ResultClick", PyLong_FromLong(1));
		PyDict_SetItemString(PYDialogMenu_Type.tp_dict, "NumResults", PyLong_FromLong(2));
		PyType_Modified(&PYDialogMenu_Type);
		Py_INCREF(&PYDialogMenu_Type);
		
		// Tellusim::CubeFilter
		PYCubeFilter_methods.reserve(PYCubeFilter_methods.size() + 20);
		PYCubeFilter_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyCubeFilter_equalPtr, METH_VARARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyCubeFilter_clonePtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyCubeFilter_clearPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyCubeFilter_destroyPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyCubeFilter_acquirePtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyCubeFilter_unacquirePtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyCubeFilter_isValidPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyCubeFilter_isOwnerPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyCubeFilter_isConstPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyCubeFilter_getCountPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyCubeFilter_getInternalPtr, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "clear", (PyCFunction)CubeFilter_clear, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "isCreated", (PyCFunction)CubeFilter_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)CubeFilter_getGroupSize, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getMaxOrder", (PyCFunction)CubeFilter_getMaxOrder, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getMaxSize", (PyCFunction)CubeFilter_getMaxSize, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "getHarmonics", (PyCFunction)CubeFilter_getHarmonics, METH_NOARGS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "create", (PyCFunction)CubeFilter_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYCubeFilter_methods.append(PyMethodDef { "dispatch", (PyCFunction)CubeFilter_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYCubeFilter_methods.append(PyMethodDef {});
		PYCubeFilter_getsets.reserve(PYCubeFilter_getsets.size() + 5);
		PYCubeFilter_getsets.append(PyGetSetDef { "group_size", (getter)CubeFilter_get_group_size, nullptr, "", nullptr });
		PYCubeFilter_getsets.append(PyGetSetDef { "max_order", (getter)CubeFilter_get_max_order, nullptr, "", nullptr });
		PYCubeFilter_getsets.append(PyGetSetDef { "max_size", (getter)CubeFilter_get_max_size, nullptr, "", nullptr });
		PYCubeFilter_getsets.append(PyGetSetDef { "harmonics", (getter)CubeFilter_get_harmonics, nullptr, "", nullptr });
		PYCubeFilter_getsets.append(PyGetSetDef {});
		PYCubeFilter_Type.tp_dealloc = (destructor)pyCubeFilter_dealloc;
		PYCubeFilter_number.nb_bool = (inquiry)pyCubeFilter_bool;
		PYCubeFilter_Type.tp_name = "tellusim.CubeFilter";
		PYCubeFilter_Type.tp_basicsize = sizeof(PYCubeFilter);
		PYCubeFilter_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYCubeFilter_Type.tp_doc = "";
		PYCubeFilter_Type.tp_str = (reprfunc)pyCubeFilter_str;
		PYCubeFilter_Type.tp_as_number = &PYCubeFilter_number;
		PYCubeFilter_Type.tp_methods = PYCubeFilter_methods.discard();
		PYCubeFilter_Type.tp_getset = PYCubeFilter_getsets.discard();
		PYCubeFilter_Type.tp_init = (initproc)pyCubeFilter_init;
		PYCubeFilter_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYCubeFilter_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "CubeFilter");
			return false;
		}
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "ModeCube", PyLong_FromLong(0));
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "ModePanorama", PyLong_FromLong(1));
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "FlagCube", PyLong_FromLong(1));
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "FlagPanorama", PyLong_FromLong(2));
		PyDict_SetItemString(PYCubeFilter_Type.tp_dict, "FlagsAll", PyLong_FromLong(3));
		PyType_Modified(&PYCubeFilter_Type);
		Py_INCREF(&PYCubeFilter_Type);
		
		// Tellusim::DecoderJPEG
		PYDecoderJPEG_methods.reserve(PYDecoderJPEG_methods.size() + 20);
		PYDecoderJPEG_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDecoderJPEG_equalPtr, METH_VARARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDecoderJPEG_clonePtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDecoderJPEG_clearPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDecoderJPEG_destroyPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDecoderJPEG_acquirePtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDecoderJPEG_unacquirePtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDecoderJPEG_isValidPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDecoderJPEG_isOwnerPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDecoderJPEG_isConstPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDecoderJPEG_getCountPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDecoderJPEG_getInternalPtr, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "clear", (PyCFunction)DecoderJPEG_clear, METH_NOARGS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "isCreated", (PyCFunction)DecoderJPEG_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "isYUV", (PyCFunction)DecoderJPEG_isYUV, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "create", (PyCFunction)DecoderJPEG_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "load", (PyCFunction)DecoderJPEG_load, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "loadTexture", (PyCFunction)DecoderJPEG_loadTexture, METH_VARARGS | METH_KEYWORDS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "dispatch", (PyCFunction)DecoderJPEG_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef { "dispatchYUV", (PyCFunction)DecoderJPEG_dispatchYUV, METH_VARARGS | METH_KEYWORDS, "" });
		PYDecoderJPEG_methods.append(PyMethodDef {});
		PYDecoderJPEG_getsets.reserve(PYDecoderJPEG_getsets.size() + 1);
		PYDecoderJPEG_getsets.append(PyGetSetDef {});
		PYDecoderJPEG_Type.tp_dealloc = (destructor)pyDecoderJPEG_dealloc;
		PYDecoderJPEG_number.nb_bool = (inquiry)pyDecoderJPEG_bool;
		PYDecoderJPEG_Type.tp_name = "tellusim.DecoderJPEG";
		PYDecoderJPEG_Type.tp_basicsize = sizeof(PYDecoderJPEG);
		PYDecoderJPEG_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDecoderJPEG_Type.tp_doc = "";
		PYDecoderJPEG_Type.tp_str = (reprfunc)pyDecoderJPEG_str;
		PYDecoderJPEG_Type.tp_as_number = &PYDecoderJPEG_number;
		PYDecoderJPEG_Type.tp_methods = PYDecoderJPEG_methods.discard();
		PYDecoderJPEG_Type.tp_getset = PYDecoderJPEG_getsets.discard();
		PYDecoderJPEG_Type.tp_init = (initproc)pyDecoderJPEG_init;
		PYDecoderJPEG_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDecoderJPEG_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "DecoderJPEG");
			return false;
		}
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeR", PyLong_FromLong(0));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeRG", PyLong_FromLong(1));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeRGBA", PyLong_FromLong(2));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeYUV444", PyLong_FromLong(3));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeYUV422H", PyLong_FromLong(4));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeYUV422V", PyLong_FromLong(5));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "ModeYUV420", PyLong_FromLong(6));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "NumModes", PyLong_FromLong(7));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagR", PyLong_FromLong(1));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagRG", PyLong_FromLong(2));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagRGBA", PyLong_FromLong(4));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagYUV444", PyLong_FromLong(8));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagYUV422H", PyLong_FromLong(16));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagYUV422V", PyLong_FromLong(32));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagYUV420", PyLong_FromLong(64));
		PyDict_SetItemString(PYDecoderJPEG_Type.tp_dict, "FlagsAll", PyLong_FromLong(127));
		PyType_Modified(&PYDecoderJPEG_Type);
		Py_INCREF(&PYDecoderJPEG_Type);
		
		// Tellusim::EncoderBC15
		PYEncoderBC15_methods.reserve(PYEncoderBC15_methods.size() + 16);
		PYEncoderBC15_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyEncoderBC15_equalPtr, METH_VARARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyEncoderBC15_clonePtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyEncoderBC15_clearPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyEncoderBC15_destroyPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyEncoderBC15_acquirePtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyEncoderBC15_unacquirePtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyEncoderBC15_isValidPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyEncoderBC15_isOwnerPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyEncoderBC15_isConstPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyEncoderBC15_getCountPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyEncoderBC15_getInternalPtr, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "clear", (PyCFunction)EncoderBC15_clear, METH_NOARGS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "isCreated", (PyCFunction)EncoderBC15_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "create", (PyCFunction)EncoderBC15_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC15_methods.append(PyMethodDef { "dispatch", (PyCFunction)EncoderBC15_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC15_methods.append(PyMethodDef {});
		PYEncoderBC15_getsets.reserve(PYEncoderBC15_getsets.size() + 1);
		PYEncoderBC15_getsets.append(PyGetSetDef {});
		PYEncoderBC15_Type.tp_dealloc = (destructor)pyEncoderBC15_dealloc;
		PYEncoderBC15_number.nb_bool = (inquiry)pyEncoderBC15_bool;
		PYEncoderBC15_Type.tp_name = "tellusim.EncoderBC15";
		PYEncoderBC15_Type.tp_basicsize = sizeof(PYEncoderBC15);
		PYEncoderBC15_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYEncoderBC15_Type.tp_doc = "";
		PYEncoderBC15_Type.tp_str = (reprfunc)pyEncoderBC15_str;
		PYEncoderBC15_Type.tp_as_number = &PYEncoderBC15_number;
		PYEncoderBC15_Type.tp_methods = PYEncoderBC15_methods.discard();
		PYEncoderBC15_Type.tp_getset = PYEncoderBC15_getsets.discard();
		PYEncoderBC15_Type.tp_init = (initproc)pyEncoderBC15_init;
		PYEncoderBC15_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYEncoderBC15_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "EncoderBC15");
			return false;
		}
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "ModeBC1RGBu8n", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "ModeBC2RGBAu8n", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "ModeBC3RGBAu8n", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "ModeBC4Ru8n", PyLong_FromLong(3));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "ModeBC5RGu8n", PyLong_FromLong(4));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "NumModes", PyLong_FromLong(5));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagBC1RGBu8n", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagBC2RGBAu8n", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagBC3RGBAu8n", PyLong_FromLong(4));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagBC4Ru8n", PyLong_FromLong(8));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagBC5RGu8n", PyLong_FromLong(16));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagCube", PyLong_FromLong(64));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagsBC13", PyLong_FromLong(7));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagsBC45", PyLong_FromLong(24));
		PyDict_SetItemString(PYEncoderBC15_Type.tp_dict, "FlagsAll", PyLong_FromLong(31));
		PyType_Modified(&PYEncoderBC15_Type);
		Py_INCREF(&PYEncoderBC15_Type);
		
		// Tellusim::EncoderBC67
		PYEncoderBC67_methods.reserve(PYEncoderBC67_methods.size() + 16);
		PYEncoderBC67_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyEncoderBC67_equalPtr, METH_VARARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyEncoderBC67_clonePtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyEncoderBC67_clearPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyEncoderBC67_destroyPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyEncoderBC67_acquirePtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyEncoderBC67_unacquirePtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyEncoderBC67_isValidPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyEncoderBC67_isOwnerPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyEncoderBC67_isConstPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyEncoderBC67_getCountPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyEncoderBC67_getInternalPtr, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "clear", (PyCFunction)EncoderBC67_clear, METH_NOARGS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "isCreated", (PyCFunction)EncoderBC67_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "create", (PyCFunction)EncoderBC67_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC67_methods.append(PyMethodDef { "dispatch", (PyCFunction)EncoderBC67_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderBC67_methods.append(PyMethodDef {});
		PYEncoderBC67_getsets.reserve(PYEncoderBC67_getsets.size() + 1);
		PYEncoderBC67_getsets.append(PyGetSetDef {});
		PYEncoderBC67_Type.tp_dealloc = (destructor)pyEncoderBC67_dealloc;
		PYEncoderBC67_number.nb_bool = (inquiry)pyEncoderBC67_bool;
		PYEncoderBC67_Type.tp_name = "tellusim.EncoderBC67";
		PYEncoderBC67_Type.tp_basicsize = sizeof(PYEncoderBC67);
		PYEncoderBC67_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYEncoderBC67_Type.tp_doc = "";
		PYEncoderBC67_Type.tp_str = (reprfunc)pyEncoderBC67_str;
		PYEncoderBC67_Type.tp_as_number = &PYEncoderBC67_number;
		PYEncoderBC67_Type.tp_methods = PYEncoderBC67_methods.discard();
		PYEncoderBC67_Type.tp_getset = PYEncoderBC67_getsets.discard();
		PYEncoderBC67_Type.tp_init = (initproc)pyEncoderBC67_init;
		PYEncoderBC67_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYEncoderBC67_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "EncoderBC67");
			return false;
		}
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "ModeBC6RGBf16s", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "ModeBC6RGBf16u", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "ModeBC7RGBAu8n", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "NumModes", PyLong_FromLong(3));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagBC6RGBf16s", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagBC6RGBf16u", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagBC7RGBAu8n", PyLong_FromLong(4));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagCube", PyLong_FromLong(16));
		PyDict_SetItemString(PYEncoderBC67_Type.tp_dict, "FlagsAll", PyLong_FromLong(7));
		PyType_Modified(&PYEncoderBC67_Type);
		Py_INCREF(&PYEncoderBC67_Type);
		
		// Tellusim::EncoderASTC
		PYEncoderASTC_methods.reserve(PYEncoderASTC_methods.size() + 16);
		PYEncoderASTC_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyEncoderASTC_equalPtr, METH_VARARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyEncoderASTC_clonePtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyEncoderASTC_clearPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyEncoderASTC_destroyPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyEncoderASTC_acquirePtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyEncoderASTC_unacquirePtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyEncoderASTC_isValidPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyEncoderASTC_isOwnerPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyEncoderASTC_isConstPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyEncoderASTC_getCountPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyEncoderASTC_getInternalPtr, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "clear", (PyCFunction)EncoderASTC_clear, METH_NOARGS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "isCreated", (PyCFunction)EncoderASTC_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "create", (PyCFunction)EncoderASTC_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderASTC_methods.append(PyMethodDef { "dispatch", (PyCFunction)EncoderASTC_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYEncoderASTC_methods.append(PyMethodDef {});
		PYEncoderASTC_getsets.reserve(PYEncoderASTC_getsets.size() + 1);
		PYEncoderASTC_getsets.append(PyGetSetDef {});
		PYEncoderASTC_Type.tp_dealloc = (destructor)pyEncoderASTC_dealloc;
		PYEncoderASTC_number.nb_bool = (inquiry)pyEncoderASTC_bool;
		PYEncoderASTC_Type.tp_name = "tellusim.EncoderASTC";
		PYEncoderASTC_Type.tp_basicsize = sizeof(PYEncoderASTC);
		PYEncoderASTC_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYEncoderASTC_Type.tp_doc = "";
		PYEncoderASTC_Type.tp_str = (reprfunc)pyEncoderASTC_str;
		PYEncoderASTC_Type.tp_as_number = &PYEncoderASTC_number;
		PYEncoderASTC_Type.tp_methods = PYEncoderASTC_methods.discard();
		PYEncoderASTC_Type.tp_getset = PYEncoderASTC_getsets.discard();
		PYEncoderASTC_Type.tp_init = (initproc)pyEncoderASTC_init;
		PYEncoderASTC_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYEncoderASTC_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "EncoderASTC");
			return false;
		}
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "ModeASTC44RGBAu8n", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "ModeASTC54RGBAu8n", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "ModeASTC55RGBAu8n", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "NumModes", PyLong_FromLong(3));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagASTC44RGBAu8n", PyLong_FromLong(1));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagASTC54RGBAu8n", PyLong_FromLong(2));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagASTC55RGBAu8n", PyLong_FromLong(4));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagCube", PyLong_FromLong(16));
		PyDict_SetItemString(PYEncoderASTC_Type.tp_dict, "FlagsAll", PyLong_FromLong(7));
		PyType_Modified(&PYEncoderASTC_Type);
		Py_INCREF(&PYEncoderASTC_Type);
		
		// Tellusim::MeshModel
		PYMeshModel_methods.reserve(PYMeshModel_methods.size() + 39);
		PYMeshModel_methods.append(PyMethodDef { "clear", (PyCFunction)MeshModel_clear, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "isCreated", (PyCFunction)MeshModel_isCreated, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getFlags", (PyCFunction)MeshModel_getFlags, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "hasFlag", (PyCFunction)MeshModel_hasFlag, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "hasFlags", (PyCFunction)MeshModel_hasFlags, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "load", (PyCFunction)MeshModel_load, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "create", (PyCFunction)MeshModel_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "setVertexBufferCallback", (PyCFunction)MeshModel_setVertexBufferCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "setIndexBufferCallback", (PyCFunction)MeshModel_setIndexBufferCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "setMeshBufferCallback", (PyCFunction)MeshModel_setMeshBufferCallback, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "setBuffers", (PyCFunction)MeshModel_setBuffers, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "draw", (PyCFunction)MeshModel_draw, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "drawInstanced", (PyCFunction)MeshModel_drawInstanced, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumVertices", (PyCFunction)MeshModel_getNumVertices, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumVertexBuffers", (PyCFunction)MeshModel_getNumVertexBuffers, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getVertexBufferStride", (PyCFunction)MeshModel_getVertexBufferStride, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getVertexBufferOffset", (PyCFunction)MeshModel_getVertexBufferOffset, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getVertexBuffer", (PyCFunction)MeshModel_getVertexBuffer, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumIndices", (PyCFunction)MeshModel_getNumIndices, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getIndexFormat", (PyCFunction)MeshModel_getIndexFormat, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getIndexBuffer", (PyCFunction)MeshModel_getIndexBuffer, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumMeshlets", (PyCFunction)MeshModel_getNumMeshlets, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getMeshletBuffer", (PyCFunction)MeshModel_getMeshletBuffer, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumGeometries", (PyCFunction)MeshModel_getNumGeometries, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumGeometryIndices", (PyCFunction)MeshModel_getNumGeometryIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumGeometryVertices", (PyCFunction)MeshModel_getNumGeometryVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumGeometryMeshlets", (PyCFunction)MeshModel_getNumGeometryMeshlets, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getGeometryBaseIndex", (PyCFunction)MeshModel_getGeometryBaseIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getGeometryBaseVertex", (PyCFunction)MeshModel_getGeometryBaseVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getGeometryBaseMeshlet", (PyCFunction)MeshModel_getGeometryBaseMeshlet, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumMaterials", (PyCFunction)MeshModel_getNumMaterials, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumMaterialIndices", (PyCFunction)MeshModel_getNumMaterialIndices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumMaterialVertices", (PyCFunction)MeshModel_getNumMaterialVertices, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getNumMaterialMeshlets", (PyCFunction)MeshModel_getNumMaterialMeshlets, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getMaterialBaseIndex", (PyCFunction)MeshModel_getMaterialBaseIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getMaterialBaseVertex", (PyCFunction)MeshModel_getMaterialBaseVertex, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getMaterialBaseMeshlet", (PyCFunction)MeshModel_getMaterialBaseMeshlet, METH_VARARGS | METH_KEYWORDS, "" });
		PYMeshModel_methods.append(PyMethodDef { "getMemory", (PyCFunction)MeshModel_getMemory, METH_NOARGS, "" });
		PYMeshModel_methods.append(PyMethodDef {});
		PYMeshModel_getsets.reserve(PYMeshModel_getsets.size() + 12);
		PYMeshModel_getsets.append(PyGetSetDef { "flags", (getter)MeshModel_get_flags, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "num_vertices", (getter)MeshModel_get_num_vertices, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "num_vertex_buffers", (getter)MeshModel_get_num_vertex_buffers, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "vertex_buffer", (getter)MeshModel_get_vertex_buffer, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "num_indices", (getter)MeshModel_get_num_indices, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "index_format", (getter)MeshModel_get_index_format, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "index_buffer", (getter)MeshModel_get_index_buffer, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "num_meshlets", (getter)MeshModel_get_num_meshlets, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "meshlet_buffer", (getter)MeshModel_get_meshlet_buffer, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "num_geometries", (getter)MeshModel_get_num_geometries, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef { "memory", (getter)MeshModel_get_memory, nullptr, "", nullptr });
		PYMeshModel_getsets.append(PyGetSetDef {});
		PYMeshModel_Type.tp_dealloc = (destructor)pyMeshModel_dealloc;
		PYMeshModel_number.nb_bool = (inquiry)pyMeshModel_bool;
		PYMeshModel_Type.tp_name = "tellusim.MeshModel";
		PYMeshModel_Type.tp_basicsize = sizeof(PYMeshModel);
		PYMeshModel_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshModel_Type.tp_doc = "";
		PYMeshModel_Type.tp_str = (reprfunc)pyMeshModel_str;
		PYMeshModel_Type.tp_as_number = &PYMeshModel_number;
		PYMeshModel_Type.tp_methods = PYMeshModel_methods.discard();
		PYMeshModel_Type.tp_getset = PYMeshModel_getsets.discard();
		PYMeshModel_Type.tp_init = (initproc)pyMeshModel_init;
		PYMeshModel_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshModel_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshModel");
			return false;
		}
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagDirect", PyLong_FromLong(1));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagVerbose", PyLong_FromLong(2));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagOptimize", PyLong_FromLong(4));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMaterials", PyLong_FromLong(8));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagIndices10", PyLong_FromLong(16));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagIndices16", PyLong_FromLong(32));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagIndices32", PyLong_FromLong(64));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMeshlet64x84", PyLong_FromLong(128));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMeshlet64x126", PyLong_FromLong(256));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMeshlet96x169", PyLong_FromLong(512));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMeshlet128x212", PyLong_FromLong(1024));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferWrite", PyLong_FromLong(2048));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferSource", PyLong_FromLong(4096));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferStorage", PyLong_FromLong(8192));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferTracing", PyLong_FromLong(16384));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferAddress", PyLong_FromLong(32768));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagBufferTexel", PyLong_FromLong(65536));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "FlagMeshlets", PyLong_FromLong(1920));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "DefaultFlags", PyLong_FromLong(10));
		PyDict_SetItemString(PYMeshModel_Type.tp_dict, "NumFlags", PyLong_FromLong(17));
		PyType_Modified(&PYMeshModel_Type);
		Py_INCREF(&PYMeshModel_Type);
		
		// Tellusim::SeparableFilter
		PYSeparableFilter_methods.reserve(PYSeparableFilter_methods.size() + 25);
		PYSeparableFilter_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySeparableFilter_equalPtr, METH_VARARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySeparableFilter_clonePtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySeparableFilter_clearPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySeparableFilter_destroyPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySeparableFilter_acquirePtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySeparableFilter_unacquirePtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySeparableFilter_isValidPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySeparableFilter_isOwnerPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySeparableFilter_isConstPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySeparableFilter_getCountPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySeparableFilter_getInternalPtr, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "clear", (PyCFunction)SeparableFilter_clear, METH_NOARGS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "isCreated", (PyCFunction)SeparableFilter_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setInputSource", (PyCFunction)SeparableFilter_setInputSource, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "getInputSource", (PyCFunction)SeparableFilter_getInputSource, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setOutputSource", (PyCFunction)SeparableFilter_setOutputSource, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "getOutputSource", (PyCFunction)SeparableFilter_getOutputSource, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "create", (PyCFunction)SeparableFilter_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setWeights", (PyCFunction)SeparableFilter_setWeights, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setGaussianWeights", (PyCFunction)SeparableFilter_setGaussianWeights, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setSobelXWeights", (PyCFunction)SeparableFilter_setSobelXWeights, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setSobelYWeights", (PyCFunction)SeparableFilter_setSobelYWeights, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "setBoxWeights", (PyCFunction)SeparableFilter_setBoxWeights, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef { "dispatch", (PyCFunction)SeparableFilter_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYSeparableFilter_methods.append(PyMethodDef {});
		PYSeparableFilter_getsets.reserve(PYSeparableFilter_getsets.size() + 1);
		PYSeparableFilter_getsets.append(PyGetSetDef {});
		PYSeparableFilter_Type.tp_dealloc = (destructor)pySeparableFilter_dealloc;
		PYSeparableFilter_number.nb_bool = (inquiry)pySeparableFilter_bool;
		PYSeparableFilter_Type.tp_name = "tellusim.SeparableFilter";
		PYSeparableFilter_Type.tp_basicsize = sizeof(PYSeparableFilter);
		PYSeparableFilter_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYSeparableFilter_Type.tp_doc = "";
		PYSeparableFilter_Type.tp_str = (reprfunc)pySeparableFilter_str;
		PYSeparableFilter_Type.tp_as_number = &PYSeparableFilter_number;
		PYSeparableFilter_Type.tp_methods = PYSeparableFilter_methods.discard();
		PYSeparableFilter_Type.tp_getset = PYSeparableFilter_getsets.discard();
		PYSeparableFilter_Type.tp_init = (initproc)pySeparableFilter_init;
		PYSeparableFilter_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSeparableFilter_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SeparableFilter");
			return false;
		}
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "ModeHorizontal", PyLong_FromLong(0));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "ModeVertical", PyLong_FromLong(1));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "FlagRepeat", PyLong_FromLong(1));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "FlagZero", PyLong_FromLong(2));
		PyDict_SetItemString(PYSeparableFilter_Type.tp_dict, "DefaultFlags", PyLong_FromLong(0));
		PyType_Modified(&PYSeparableFilter_Type);
		Py_INCREF(&PYSeparableFilter_Type);
		
		// Tellusim::PrefixScan
		PYPrefixScan_methods.reserve(PYPrefixScan_methods.size() + 21);
		PYPrefixScan_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyPrefixScan_equalPtr, METH_VARARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyPrefixScan_clonePtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyPrefixScan_clearPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyPrefixScan_destroyPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyPrefixScan_acquirePtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyPrefixScan_unacquirePtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyPrefixScan_isValidPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyPrefixScan_isOwnerPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyPrefixScan_isConstPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyPrefixScan_getCountPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyPrefixScan_getInternalPtr, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "clear", (PyCFunction)PrefixScan_clear, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "isCreated", (PyCFunction)PrefixScan_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)PrefixScan_getGroupSize, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getScanElements", (PyCFunction)PrefixScan_getScanElements, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getMaxElements", (PyCFunction)PrefixScan_getMaxElements, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "getMaxRegions", (PyCFunction)PrefixScan_getMaxRegions, METH_NOARGS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "create", (PyCFunction)PrefixScan_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "dispatch", (PyCFunction)PrefixScan_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYPrefixScan_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)PrefixScan_dispatchIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYPrefixScan_methods.append(PyMethodDef {});
		PYPrefixScan_getsets.reserve(PYPrefixScan_getsets.size() + 5);
		PYPrefixScan_getsets.append(PyGetSetDef { "group_size", (getter)PrefixScan_get_group_size, nullptr, "", nullptr });
		PYPrefixScan_getsets.append(PyGetSetDef { "scan_elements", (getter)PrefixScan_get_scan_elements, nullptr, "", nullptr });
		PYPrefixScan_getsets.append(PyGetSetDef { "max_elements", (getter)PrefixScan_get_max_elements, nullptr, "", nullptr });
		PYPrefixScan_getsets.append(PyGetSetDef { "max_regions", (getter)PrefixScan_get_max_regions, nullptr, "", nullptr });
		PYPrefixScan_getsets.append(PyGetSetDef {});
		PYPrefixScan_Type.tp_dealloc = (destructor)pyPrefixScan_dealloc;
		PYPrefixScan_number.nb_bool = (inquiry)pyPrefixScan_bool;
		PYPrefixScan_Type.tp_name = "tellusim.PrefixScan";
		PYPrefixScan_Type.tp_basicsize = sizeof(PYPrefixScan);
		PYPrefixScan_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYPrefixScan_Type.tp_doc = "";
		PYPrefixScan_Type.tp_str = (reprfunc)pyPrefixScan_str;
		PYPrefixScan_Type.tp_as_number = &PYPrefixScan_number;
		PYPrefixScan_Type.tp_methods = PYPrefixScan_methods.discard();
		PYPrefixScan_Type.tp_getset = PYPrefixScan_getsets.discard();
		PYPrefixScan_Type.tp_init = (initproc)pyPrefixScan_init;
		PYPrefixScan_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYPrefixScan_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "PrefixScan");
			return false;
		}
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "ModeSingle", PyLong_FromLong(0));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "ModeMultiple", PyLong_FromLong(1));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagSingle", PyLong_FromLong(1));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagMultiple", PyLong_FromLong(2));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagIndirect", PyLong_FromLong(4));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagRepeat", PyLong_FromLong(8));
		PyDict_SetItemString(PYPrefixScan_Type.tp_dict, "FlagsAll", PyLong_FromLong(7));
		PyType_Modified(&PYPrefixScan_Type);
		Py_INCREF(&PYPrefixScan_Type);
		
		// Tellusim::PrefixScan::DispatchParameters
		PYPrefixScanDispatchParameters_methods.append(PyMethodDef {});
		PYPrefixScanDispatchParameters_members.reserve(PYPrefixScanDispatchParameters_members.size() + 3);
		PYPrefixScanDispatchParameters_getsets.reserve(PYPrefixScanDispatchParameters_getsets.size() + 1);
		PYPrefixScanDispatchParameters_members.append(PyMemberDef { "offset", T_UINT, offsetof(PYPrefixScanDispatchParameters, ptr.offset), 0, "" });
		PYPrefixScanDispatchParameters_members.append(PyMemberDef { "size", T_UINT, offsetof(PYPrefixScanDispatchParameters, ptr.size), 0, "" });
		PYPrefixScanDispatchParameters_members.append(PyMemberDef {});
		PYPrefixScanDispatchParameters_getsets.append(PyGetSetDef {});
		PYPrefixScanDispatchParameters_buffer.bf_getbuffer = (getbufferproc)pyPrefixScanDispatchParameters_buffer;
		PYPrefixScanDispatchParameters_Type.tp_name = "tellusim.PrefixScanDispatchParameters";
		PYPrefixScanDispatchParameters_Type.tp_basicsize = sizeof(PYPrefixScanDispatchParameters);
		PYPrefixScanDispatchParameters_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYPrefixScanDispatchParameters_Type.tp_doc = "";
		PYPrefixScanDispatchParameters_Type.tp_as_number = &PYPrefixScanDispatchParameters_number;
		PYPrefixScanDispatchParameters_Type.tp_as_buffer = &PYPrefixScanDispatchParameters_buffer;
		PYPrefixScanDispatchParameters_Type.tp_methods = PYPrefixScanDispatchParameters_methods.discard();
		PYPrefixScanDispatchParameters_Type.tp_members = PYPrefixScanDispatchParameters_members.discard();
		PYPrefixScanDispatchParameters_Type.tp_getset = PYPrefixScanDispatchParameters_getsets.discard();
		PYPrefixScanDispatchParameters_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYPrefixScanDispatchParameters_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "PrefixScan::DispatchParameters");
			return false;
		}
		Py_INCREF(&PYPrefixScanDispatchParameters_Type);
		
		// Tellusim::RadixSort
		PYRadixSort_methods.reserve(PYRadixSort_methods.size() + 25);
		PYRadixSort_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyRadixSort_equalPtr, METH_VARARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyRadixSort_clonePtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyRadixSort_clearPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyRadixSort_destroyPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyRadixSort_acquirePtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyRadixSort_unacquirePtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyRadixSort_isValidPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyRadixSort_isOwnerPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyRadixSort_isConstPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyRadixSort_getCountPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyRadixSort_getInternalPtr, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "clear", (PyCFunction)RadixSort_clear, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "isCreated", (PyCFunction)RadixSort_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getDataSize", (PyCFunction)RadixSort_getDataSize, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)RadixSort_getGroupSize, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getSortElements", (PyCFunction)RadixSort_getSortElements, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getUpdateElements", (PyCFunction)RadixSort_getUpdateElements, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getMaxElements", (PyCFunction)RadixSort_getMaxElements, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getMaxRegions", (PyCFunction)RadixSort_getMaxRegions, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getPrefixScan", (PyCFunction)RadixSort_getPrefixScan, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "getDataBuffer", (PyCFunction)RadixSort_getDataBuffer, METH_NOARGS, "" });
		PYRadixSort_methods.append(PyMethodDef { "create", (PyCFunction)RadixSort_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYRadixSort_methods.append(PyMethodDef { "dispatch", (PyCFunction)RadixSort_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYRadixSort_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)RadixSort_dispatchIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYRadixSort_methods.append(PyMethodDef {});
		PYRadixSort_getsets.reserve(PYRadixSort_getsets.size() + 9);
		PYRadixSort_getsets.append(PyGetSetDef { "data_size", (getter)RadixSort_get_data_size, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "group_size", (getter)RadixSort_get_group_size, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "sort_elements", (getter)RadixSort_get_sort_elements, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "update_elements", (getter)RadixSort_get_update_elements, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "max_elements", (getter)RadixSort_get_max_elements, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "max_regions", (getter)RadixSort_get_max_regions, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "prefix_scan", (getter)RadixSort_get_prefix_scan, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef { "data_buffer", (getter)RadixSort_get_data_buffer, nullptr, "", nullptr });
		PYRadixSort_getsets.append(PyGetSetDef {});
		PYRadixSort_Type.tp_dealloc = (destructor)pyRadixSort_dealloc;
		PYRadixSort_number.nb_bool = (inquiry)pyRadixSort_bool;
		PYRadixSort_Type.tp_name = "tellusim.RadixSort";
		PYRadixSort_Type.tp_basicsize = sizeof(PYRadixSort);
		PYRadixSort_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYRadixSort_Type.tp_doc = "";
		PYRadixSort_Type.tp_str = (reprfunc)pyRadixSort_str;
		PYRadixSort_Type.tp_as_number = &PYRadixSort_number;
		PYRadixSort_Type.tp_methods = PYRadixSort_methods.discard();
		PYRadixSort_Type.tp_getset = PYRadixSort_getsets.discard();
		PYRadixSort_Type.tp_init = (initproc)pyRadixSort_init;
		PYRadixSort_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYRadixSort_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "RadixSort");
			return false;
		}
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "ModeSingle", PyLong_FromLong(0));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "ModeMultiple", PyLong_FromLong(1));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagSingle", PyLong_FromLong(1));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagMultiple", PyLong_FromLong(2));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagIndirect", PyLong_FromLong(4));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagOrder", PyLong_FromLong(8));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagTracing", PyLong_FromLong(16));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagScratch", PyLong_FromLong(32));
		PyDict_SetItemString(PYRadixSort_Type.tp_dict, "FlagsAll", PyLong_FromLong(15));
		PyType_Modified(&PYRadixSort_Type);
		Py_INCREF(&PYRadixSort_Type);
		
		// Tellusim::RadixSort::DispatchParameters
		PYRadixSortDispatchParameters_methods.append(PyMethodDef {});
		PYRadixSortDispatchParameters_members.reserve(PYRadixSortDispatchParameters_members.size() + 4);
		PYRadixSortDispatchParameters_getsets.reserve(PYRadixSortDispatchParameters_getsets.size() + 1);
		PYRadixSortDispatchParameters_members.append(PyMemberDef { "keys_offset", T_UINT, offsetof(PYRadixSortDispatchParameters, ptr.keys_offset), 0, "" });
		PYRadixSortDispatchParameters_members.append(PyMemberDef { "data_offset", T_UINT, offsetof(PYRadixSortDispatchParameters, ptr.data_offset), 0, "" });
		PYRadixSortDispatchParameters_members.append(PyMemberDef { "size", T_UINT, offsetof(PYRadixSortDispatchParameters, ptr.size), 0, "" });
		PYRadixSortDispatchParameters_members.append(PyMemberDef {});
		PYRadixSortDispatchParameters_getsets.append(PyGetSetDef {});
		PYRadixSortDispatchParameters_buffer.bf_getbuffer = (getbufferproc)pyRadixSortDispatchParameters_buffer;
		PYRadixSortDispatchParameters_Type.tp_name = "tellusim.RadixSortDispatchParameters";
		PYRadixSortDispatchParameters_Type.tp_basicsize = sizeof(PYRadixSortDispatchParameters);
		PYRadixSortDispatchParameters_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYRadixSortDispatchParameters_Type.tp_doc = "";
		PYRadixSortDispatchParameters_Type.tp_as_number = &PYRadixSortDispatchParameters_number;
		PYRadixSortDispatchParameters_Type.tp_as_buffer = &PYRadixSortDispatchParameters_buffer;
		PYRadixSortDispatchParameters_Type.tp_methods = PYRadixSortDispatchParameters_methods.discard();
		PYRadixSortDispatchParameters_Type.tp_members = PYRadixSortDispatchParameters_members.discard();
		PYRadixSortDispatchParameters_Type.tp_getset = PYRadixSortDispatchParameters_getsets.discard();
		PYRadixSortDispatchParameters_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYRadixSortDispatchParameters_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "RadixSort::DispatchParameters");
			return false;
		}
		Py_INCREF(&PYRadixSortDispatchParameters_Type);
		
		// Tellusim::BitonicSort
		PYBitonicSort_methods.reserve(PYBitonicSort_methods.size() + 21);
		PYBitonicSort_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyBitonicSort_equalPtr, METH_VARARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyBitonicSort_clonePtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyBitonicSort_clearPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyBitonicSort_destroyPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyBitonicSort_acquirePtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyBitonicSort_unacquirePtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyBitonicSort_isValidPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyBitonicSort_isOwnerPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyBitonicSort_isConstPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyBitonicSort_getCountPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyBitonicSort_getInternalPtr, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "clear", (PyCFunction)BitonicSort_clear, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "isCreated", (PyCFunction)BitonicSort_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getDataSize", (PyCFunction)BitonicSort_getDataSize, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)BitonicSort_getGroupSize, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getSortElements", (PyCFunction)BitonicSort_getSortElements, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "getMaxRegions", (PyCFunction)BitonicSort_getMaxRegions, METH_NOARGS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "create", (PyCFunction)BitonicSort_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "dispatch", (PyCFunction)BitonicSort_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYBitonicSort_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)BitonicSort_dispatchIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYBitonicSort_methods.append(PyMethodDef {});
		PYBitonicSort_getsets.reserve(PYBitonicSort_getsets.size() + 5);
		PYBitonicSort_getsets.append(PyGetSetDef { "data_size", (getter)BitonicSort_get_data_size, nullptr, "", nullptr });
		PYBitonicSort_getsets.append(PyGetSetDef { "group_size", (getter)BitonicSort_get_group_size, nullptr, "", nullptr });
		PYBitonicSort_getsets.append(PyGetSetDef { "sort_elements", (getter)BitonicSort_get_sort_elements, nullptr, "", nullptr });
		PYBitonicSort_getsets.append(PyGetSetDef { "max_regions", (getter)BitonicSort_get_max_regions, nullptr, "", nullptr });
		PYBitonicSort_getsets.append(PyGetSetDef {});
		PYBitonicSort_Type.tp_dealloc = (destructor)pyBitonicSort_dealloc;
		PYBitonicSort_number.nb_bool = (inquiry)pyBitonicSort_bool;
		PYBitonicSort_Type.tp_name = "tellusim.BitonicSort";
		PYBitonicSort_Type.tp_basicsize = sizeof(PYBitonicSort);
		PYBitonicSort_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYBitonicSort_Type.tp_doc = "";
		PYBitonicSort_Type.tp_str = (reprfunc)pyBitonicSort_str;
		PYBitonicSort_Type.tp_as_number = &PYBitonicSort_number;
		PYBitonicSort_Type.tp_methods = PYBitonicSort_methods.discard();
		PYBitonicSort_Type.tp_getset = PYBitonicSort_getsets.discard();
		PYBitonicSort_Type.tp_init = (initproc)pyBitonicSort_init;
		PYBitonicSort_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYBitonicSort_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "BitonicSort");
			return false;
		}
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "ModeSingle", PyLong_FromLong(0));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "ModeMultiple", PyLong_FromLong(1));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagSingle", PyLong_FromLong(1));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagMultiple", PyLong_FromLong(2));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagIndirect", PyLong_FromLong(4));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagOrder", PyLong_FromLong(8));
		PyDict_SetItemString(PYBitonicSort_Type.tp_dict, "FlagsAll", PyLong_FromLong(15));
		PyType_Modified(&PYBitonicSort_Type);
		Py_INCREF(&PYBitonicSort_Type);
		
		// Tellusim::BitonicSort::DispatchParameters
		PYBitonicSortDispatchParameters_methods.append(PyMethodDef {});
		PYBitonicSortDispatchParameters_members.reserve(PYBitonicSortDispatchParameters_members.size() + 4);
		PYBitonicSortDispatchParameters_getsets.reserve(PYBitonicSortDispatchParameters_getsets.size() + 1);
		PYBitonicSortDispatchParameters_members.append(PyMemberDef { "keys_offset", T_UINT, offsetof(PYBitonicSortDispatchParameters, ptr.keys_offset), 0, "" });
		PYBitonicSortDispatchParameters_members.append(PyMemberDef { "data_offset", T_UINT, offsetof(PYBitonicSortDispatchParameters, ptr.data_offset), 0, "" });
		PYBitonicSortDispatchParameters_members.append(PyMemberDef { "size", T_UINT, offsetof(PYBitonicSortDispatchParameters, ptr.size), 0, "" });
		PYBitonicSortDispatchParameters_members.append(PyMemberDef {});
		PYBitonicSortDispatchParameters_getsets.append(PyGetSetDef {});
		PYBitonicSortDispatchParameters_buffer.bf_getbuffer = (getbufferproc)pyBitonicSortDispatchParameters_buffer;
		PYBitonicSortDispatchParameters_Type.tp_name = "tellusim.BitonicSortDispatchParameters";
		PYBitonicSortDispatchParameters_Type.tp_basicsize = sizeof(PYBitonicSortDispatchParameters);
		PYBitonicSortDispatchParameters_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYBitonicSortDispatchParameters_Type.tp_doc = "";
		PYBitonicSortDispatchParameters_Type.tp_as_number = &PYBitonicSortDispatchParameters_number;
		PYBitonicSortDispatchParameters_Type.tp_as_buffer = &PYBitonicSortDispatchParameters_buffer;
		PYBitonicSortDispatchParameters_Type.tp_methods = PYBitonicSortDispatchParameters_methods.discard();
		PYBitonicSortDispatchParameters_Type.tp_members = PYBitonicSortDispatchParameters_members.discard();
		PYBitonicSortDispatchParameters_Type.tp_getset = PYBitonicSortDispatchParameters_getsets.discard();
		PYBitonicSortDispatchParameters_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYBitonicSortDispatchParameters_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "BitonicSort::DispatchParameters");
			return false;
		}
		Py_INCREF(&PYBitonicSortDispatchParameters_Type);
		
		// Tellusim::SpatialGrid
		PYSpatialGrid_methods.reserve(PYSpatialGrid_methods.size() + 19);
		PYSpatialGrid_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySpatialGrid_equalPtr, METH_VARARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySpatialGrid_clonePtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySpatialGrid_clearPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySpatialGrid_destroyPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySpatialGrid_acquirePtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySpatialGrid_unacquirePtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySpatialGrid_isValidPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySpatialGrid_isOwnerPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySpatialGrid_isConstPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySpatialGrid_getCountPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySpatialGrid_getInternalPtr, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "clear", (PyCFunction)SpatialGrid_clear, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "isCreated", (PyCFunction)SpatialGrid_isCreated, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)SpatialGrid_getGroupSize, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "getRadixSort", (PyCFunction)SpatialGrid_getRadixSort, METH_NOARGS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "create", (PyCFunction)SpatialGrid_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "dispatch", (PyCFunction)SpatialGrid_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialGrid_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)SpatialGrid_dispatchIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialGrid_methods.append(PyMethodDef {});
		PYSpatialGrid_getsets.reserve(PYSpatialGrid_getsets.size() + 3);
		PYSpatialGrid_getsets.append(PyGetSetDef { "group_size", (getter)SpatialGrid_get_group_size, nullptr, "", nullptr });
		PYSpatialGrid_getsets.append(PyGetSetDef { "radix_sort", (getter)SpatialGrid_get_radix_sort, nullptr, "", nullptr });
		PYSpatialGrid_getsets.append(PyGetSetDef {});
		PYSpatialGrid_Type.tp_dealloc = (destructor)pySpatialGrid_dealloc;
		PYSpatialGrid_number.nb_bool = (inquiry)pySpatialGrid_bool;
		PYSpatialGrid_Type.tp_name = "tellusim.SpatialGrid";
		PYSpatialGrid_Type.tp_basicsize = sizeof(PYSpatialGrid);
		PYSpatialGrid_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYSpatialGrid_Type.tp_doc = "";
		PYSpatialGrid_Type.tp_str = (reprfunc)pySpatialGrid_str;
		PYSpatialGrid_Type.tp_as_number = &PYSpatialGrid_number;
		PYSpatialGrid_Type.tp_methods = PYSpatialGrid_methods.discard();
		PYSpatialGrid_Type.tp_getset = PYSpatialGrid_getsets.discard();
		PYSpatialGrid_Type.tp_init = (initproc)pySpatialGrid_init;
		PYSpatialGrid_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSpatialGrid_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SpatialGrid");
			return false;
		}
		Py_INCREF(&PYSpatialGrid_Type);
		
		// Tellusim::SpatialGrid::DispatchParameters
		PYSpatialGridDispatchParameters_methods.append(PyMethodDef {});
		PYSpatialGridDispatchParameters_members.reserve(PYSpatialGridDispatchParameters_members.size() + 3);
		PYSpatialGridDispatchParameters_getsets.reserve(PYSpatialGridDispatchParameters_getsets.size() + 1);
		PYSpatialGridDispatchParameters_members.append(PyMemberDef { "offset", T_UINT, offsetof(PYSpatialGridDispatchParameters, ptr.offset), 0, "" });
		PYSpatialGridDispatchParameters_members.append(PyMemberDef { "size", T_UINT, offsetof(PYSpatialGridDispatchParameters, ptr.size), 0, "" });
		PYSpatialGridDispatchParameters_members.append(PyMemberDef {});
		PYSpatialGridDispatchParameters_getsets.append(PyGetSetDef {});
		PYSpatialGridDispatchParameters_buffer.bf_getbuffer = (getbufferproc)pySpatialGridDispatchParameters_buffer;
		PYSpatialGridDispatchParameters_Type.tp_name = "tellusim.SpatialGridDispatchParameters";
		PYSpatialGridDispatchParameters_Type.tp_basicsize = sizeof(PYSpatialGridDispatchParameters);
		PYSpatialGridDispatchParameters_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYSpatialGridDispatchParameters_Type.tp_doc = "";
		PYSpatialGridDispatchParameters_Type.tp_as_number = &PYSpatialGridDispatchParameters_number;
		PYSpatialGridDispatchParameters_Type.tp_as_buffer = &PYSpatialGridDispatchParameters_buffer;
		PYSpatialGridDispatchParameters_Type.tp_methods = PYSpatialGridDispatchParameters_methods.discard();
		PYSpatialGridDispatchParameters_Type.tp_members = PYSpatialGridDispatchParameters_members.discard();
		PYSpatialGridDispatchParameters_Type.tp_getset = PYSpatialGridDispatchParameters_getsets.discard();
		PYSpatialGridDispatchParameters_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSpatialGridDispatchParameters_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SpatialGrid::DispatchParameters");
			return false;
		}
		Py_INCREF(&PYSpatialGridDispatchParameters_Type);
		
		// Tellusim::SpatialTree
		PYSpatialTree_methods.reserve(PYSpatialTree_methods.size() + 25);
		PYSpatialTree_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pySpatialTree_equalPtr, METH_VARARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pySpatialTree_clonePtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pySpatialTree_clearPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pySpatialTree_destroyPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pySpatialTree_acquirePtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pySpatialTree_unacquirePtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pySpatialTree_isValidPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pySpatialTree_isOwnerPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pySpatialTree_isConstPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pySpatialTree_getCountPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pySpatialTree_getInternalPtr, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "clear", (PyCFunction)SpatialTree_clear, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "isCreated", (PyCFunction)SpatialTree_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getGroupSize", (PyCFunction)SpatialTree_getGroupSize, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getBoundsNodes", (PyCFunction)SpatialTree_getBoundsNodes, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getMaxNodes", (PyCFunction)SpatialTree_getMaxNodes, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getMaxRegions", (PyCFunction)SpatialTree_getMaxRegions, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getRadixSort", (PyCFunction)SpatialTree_getRadixSort, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getHashBuffer", (PyCFunction)SpatialTree_getHashBuffer, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getParentsBuffer", (PyCFunction)SpatialTree_getParentsBuffer, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "getCounterBuffer", (PyCFunction)SpatialTree_getCounterBuffer, METH_NOARGS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "create", (PyCFunction)SpatialTree_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "dispatch", (PyCFunction)SpatialTree_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialTree_methods.append(PyMethodDef { "dispatchIndirect", (PyCFunction)SpatialTree_dispatchIndirect, METH_VARARGS | METH_KEYWORDS, "" });
		PYSpatialTree_methods.append(PyMethodDef {});
		PYSpatialTree_getsets.reserve(PYSpatialTree_getsets.size() + 9);
		PYSpatialTree_getsets.append(PyGetSetDef { "group_size", (getter)SpatialTree_get_group_size, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "bounds_nodes", (getter)SpatialTree_get_bounds_nodes, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "max_nodes", (getter)SpatialTree_get_max_nodes, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "max_regions", (getter)SpatialTree_get_max_regions, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "radix_sort", (getter)SpatialTree_get_radix_sort, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "hash_buffer", (getter)SpatialTree_get_hash_buffer, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "parents_buffer", (getter)SpatialTree_get_parents_buffer, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef { "counter_buffer", (getter)SpatialTree_get_counter_buffer, nullptr, "", nullptr });
		PYSpatialTree_getsets.append(PyGetSetDef {});
		PYSpatialTree_Type.tp_dealloc = (destructor)pySpatialTree_dealloc;
		PYSpatialTree_number.nb_bool = (inquiry)pySpatialTree_bool;
		PYSpatialTree_Type.tp_name = "tellusim.SpatialTree";
		PYSpatialTree_Type.tp_basicsize = sizeof(PYSpatialTree);
		PYSpatialTree_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYSpatialTree_Type.tp_doc = "";
		PYSpatialTree_Type.tp_str = (reprfunc)pySpatialTree_str;
		PYSpatialTree_Type.tp_as_number = &PYSpatialTree_number;
		PYSpatialTree_Type.tp_methods = PYSpatialTree_methods.discard();
		PYSpatialTree_Type.tp_getset = PYSpatialTree_getsets.discard();
		PYSpatialTree_Type.tp_init = (initproc)pySpatialTree_init;
		PYSpatialTree_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSpatialTree_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SpatialTree");
			return false;
		}
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "ModeSingle", PyLong_FromLong(0));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "ModeMultiple", PyLong_FromLong(1));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "NumModes", PyLong_FromLong(2));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXYZ10", PyLong_FromLong(0));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXYZ9", PyLong_FromLong(1));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXYZ8", PyLong_FromLong(2));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXY15", PyLong_FromLong(3));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXY14", PyLong_FromLong(4));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXY12", PyLong_FromLong(5));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "HashXY10", PyLong_FromLong(6));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagSingle", PyLong_FromLong(1));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagMultiple", PyLong_FromLong(2));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagUpdate", PyLong_FromLong(4));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagOptimize", PyLong_FromLong(8));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagTracing", PyLong_FromLong(16));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagScratch", PyLong_FromLong(32));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagAtomic", PyLong_FromLong(64));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagSingleUpdate", PyLong_FromLong(5));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagMultipleUpdate", PyLong_FromLong(6));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagSingleOptimize", PyLong_FromLong(9));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagMultipleOptimize", PyLong_FromLong(10));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagsAll", PyLong_FromLong(3));
		PyDict_SetItemString(PYSpatialTree_Type.tp_dict, "FlagsAllOptimize", PyLong_FromLong(11));
		PyType_Modified(&PYSpatialTree_Type);
		Py_INCREF(&PYSpatialTree_Type);
		
		// Tellusim::SpatialTree::Node
		PYSpatialTreeNode_methods.append(PyMethodDef {});
		PYSpatialTreeNode_members.reserve(PYSpatialTreeNode_members.size() + 7);
		PYSpatialTreeNode_getsets.reserve(PYSpatialTreeNode_getsets.size() + 3);
		PYSpatialTreeNode_getsets.append(PyGetSetDef { "bound_min", pyVector3f_getter, pyVector3f_setter, "", (void*)offsetof(PYSpatialTreeNode, ptr.bound_min) });
		PYSpatialTreeNode_members.append(PyMemberDef { "is_enabled", T_FLOAT, offsetof(PYSpatialTreeNode, ptr.is_enabled), 0, "" });
		PYSpatialTreeNode_getsets.append(PyGetSetDef { "bound_max", pyVector3f_getter, pyVector3f_setter, "", (void*)offsetof(PYSpatialTreeNode, ptr.bound_max) });
		PYSpatialTreeNode_members.append(PyMemberDef { "data", T_UINT, offsetof(PYSpatialTreeNode, ptr.data), 0, "" });
		PYSpatialTreeNode_members.append(PyMemberDef { "left", T_UINT, offsetof(PYSpatialTreeNode, ptr.left), 0, "" });
		PYSpatialTreeNode_members.append(PyMemberDef { "right", T_UINT, offsetof(PYSpatialTreeNode, ptr.right), 0, "" });
		PYSpatialTreeNode_members.append(PyMemberDef { "parent", T_UINT, offsetof(PYSpatialTreeNode, ptr.parent), 0, "" });
		PYSpatialTreeNode_members.append(PyMemberDef { "spatial", T_UINT, offsetof(PYSpatialTreeNode, ptr.spatial), 0, "" });
		PYSpatialTreeNode_members.append(PyMemberDef {});
		PYSpatialTreeNode_getsets.append(PyGetSetDef {});
		PYSpatialTreeNode_buffer.bf_getbuffer = (getbufferproc)pySpatialTreeNode_buffer;
		PYSpatialTreeNode_Type.tp_name = "tellusim.SpatialTreeNode";
		PYSpatialTreeNode_Type.tp_basicsize = sizeof(PYSpatialTreeNode);
		PYSpatialTreeNode_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYSpatialTreeNode_Type.tp_doc = "";
		PYSpatialTreeNode_Type.tp_as_number = &PYSpatialTreeNode_number;
		PYSpatialTreeNode_Type.tp_as_buffer = &PYSpatialTreeNode_buffer;
		PYSpatialTreeNode_Type.tp_methods = PYSpatialTreeNode_methods.discard();
		PYSpatialTreeNode_Type.tp_members = PYSpatialTreeNode_members.discard();
		PYSpatialTreeNode_Type.tp_getset = PYSpatialTreeNode_getsets.discard();
		PYSpatialTreeNode_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSpatialTreeNode_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SpatialTree::Node");
			return false;
		}
		Py_INCREF(&PYSpatialTreeNode_Type);
		
		// Tellusim::SpatialTree::DispatchParameters
		PYSpatialTreeDispatchParameters_methods.append(PyMethodDef {});
		PYSpatialTreeDispatchParameters_members.reserve(PYSpatialTreeDispatchParameters_members.size() + 3);
		PYSpatialTreeDispatchParameters_getsets.reserve(PYSpatialTreeDispatchParameters_getsets.size() + 1);
		PYSpatialTreeDispatchParameters_members.append(PyMemberDef { "offset", T_UINT, offsetof(PYSpatialTreeDispatchParameters, ptr.offset), 0, "" });
		PYSpatialTreeDispatchParameters_members.append(PyMemberDef { "size", T_UINT, offsetof(PYSpatialTreeDispatchParameters, ptr.size), 0, "" });
		PYSpatialTreeDispatchParameters_members.append(PyMemberDef {});
		PYSpatialTreeDispatchParameters_getsets.append(PyGetSetDef {});
		PYSpatialTreeDispatchParameters_buffer.bf_getbuffer = (getbufferproc)pySpatialTreeDispatchParameters_buffer;
		PYSpatialTreeDispatchParameters_Type.tp_name = "tellusim.SpatialTreeDispatchParameters";
		PYSpatialTreeDispatchParameters_Type.tp_basicsize = sizeof(PYSpatialTreeDispatchParameters);
		PYSpatialTreeDispatchParameters_Type.tp_flags = Py_TPFLAGS_DEFAULT;
		PYSpatialTreeDispatchParameters_Type.tp_doc = "";
		PYSpatialTreeDispatchParameters_Type.tp_as_number = &PYSpatialTreeDispatchParameters_number;
		PYSpatialTreeDispatchParameters_Type.tp_as_buffer = &PYSpatialTreeDispatchParameters_buffer;
		PYSpatialTreeDispatchParameters_Type.tp_methods = PYSpatialTreeDispatchParameters_methods.discard();
		PYSpatialTreeDispatchParameters_Type.tp_members = PYSpatialTreeDispatchParameters_members.discard();
		PYSpatialTreeDispatchParameters_Type.tp_getset = PYSpatialTreeDispatchParameters_getsets.discard();
		PYSpatialTreeDispatchParameters_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSpatialTreeDispatchParameters_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "SpatialTree::DispatchParameters");
			return false;
		}
		Py_INCREF(&PYSpatialTreeDispatchParameters_Type);
		
		// Tellusim::FourierTransform
		PYFourierTransform_methods.reserve(PYFourierTransform_methods.size() + 18);
		PYFourierTransform_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyFourierTransform_equalPtr, METH_VARARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyFourierTransform_clonePtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyFourierTransform_clearPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyFourierTransform_destroyPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyFourierTransform_acquirePtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyFourierTransform_unacquirePtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyFourierTransform_isValidPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyFourierTransform_isOwnerPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyFourierTransform_isConstPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyFourierTransform_getCountPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyFourierTransform_getInternalPtr, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "clear", (PyCFunction)FourierTransform_clear, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "isCreated", (PyCFunction)FourierTransform_isCreated, METH_VARARGS | METH_KEYWORDS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "getMaxWidth", (PyCFunction)FourierTransform_getMaxWidth, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "getMaxHeight", (PyCFunction)FourierTransform_getMaxHeight, METH_NOARGS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "create", (PyCFunction)FourierTransform_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYFourierTransform_methods.append(PyMethodDef { "dispatch", (PyCFunction)FourierTransform_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYFourierTransform_methods.append(PyMethodDef {});
		PYFourierTransform_getsets.reserve(PYFourierTransform_getsets.size() + 3);
		PYFourierTransform_getsets.append(PyGetSetDef { "max_width", (getter)FourierTransform_get_max_width, nullptr, "", nullptr });
		PYFourierTransform_getsets.append(PyGetSetDef { "max_height", (getter)FourierTransform_get_max_height, nullptr, "", nullptr });
		PYFourierTransform_getsets.append(PyGetSetDef {});
		PYFourierTransform_Type.tp_dealloc = (destructor)pyFourierTransform_dealloc;
		PYFourierTransform_number.nb_bool = (inquiry)pyFourierTransform_bool;
		PYFourierTransform_Type.tp_name = "tellusim.FourierTransform";
		PYFourierTransform_Type.tp_basicsize = sizeof(PYFourierTransform);
		PYFourierTransform_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYFourierTransform_Type.tp_doc = "";
		PYFourierTransform_Type.tp_str = (reprfunc)pyFourierTransform_str;
		PYFourierTransform_Type.tp_as_number = &PYFourierTransform_number;
		PYFourierTransform_Type.tp_methods = PYFourierTransform_methods.discard();
		PYFourierTransform_Type.tp_getset = PYFourierTransform_getsets.discard();
		PYFourierTransform_Type.tp_init = (initproc)pyFourierTransform_init;
		PYFourierTransform_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYFourierTransform_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "FourierTransform");
			return false;
		}
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRf16i", PyLong_FromLong(0));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRf32i", PyLong_FromLong(1));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGf16i", PyLong_FromLong(2));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGf32i", PyLong_FromLong(3));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGBf16c", PyLong_FromLong(4));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGBf21c", PyLong_FromLong(5));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGBf16p", PyLong_FromLong(6));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ModeRGBf32p", PyLong_FromLong(7));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "NumModes", PyLong_FromLong(8));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRf16i", PyLong_FromLong(1));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRf32i", PyLong_FromLong(2));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGf16i", PyLong_FromLong(4));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGf32i", PyLong_FromLong(8));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGBf16c", PyLong_FromLong(16));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGBf21c", PyLong_FromLong(32));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGBf16p", PyLong_FromLong(64));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagRGBf32p", PyLong_FromLong(128));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagsInterleaved", PyLong_FromLong(15));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagsComplex", PyLong_FromLong(48));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagsPlanar", PyLong_FromLong(192));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "FlagsAll", PyLong_FromLong(255));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ForwardCtoC", PyLong_FromLong(0));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "BackwardCtoC", PyLong_FromLong(1));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "ForwardRtoC", PyLong_FromLong(2));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "BackwardCtoR", PyLong_FromLong(3));
		PyDict_SetItemString(PYFourierTransform_Type.tp_dict, "NumOperations", PyLong_FromLong(4));
		PyType_Modified(&PYFourierTransform_Type);
		Py_INCREF(&PYFourierTransform_Type);
		
		// Tellusim::TensorGraph
		PYTensorGraph_methods.reserve(PYTensorGraph_methods.size() + 16);
		PYTensorGraph_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyTensorGraph_equalPtr, METH_VARARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyTensorGraph_clonePtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyTensorGraph_clearPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyTensorGraph_destroyPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyTensorGraph_acquirePtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyTensorGraph_unacquirePtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyTensorGraph_isValidPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyTensorGraph_isOwnerPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyTensorGraph_isConstPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyTensorGraph_getCountPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyTensorGraph_getInternalPtr, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "clear", (PyCFunction)TensorGraph_clear, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "isCreated", (PyCFunction)TensorGraph_isCreated, METH_NOARGS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "create", (PyCFunction)TensorGraph_create, METH_VARARGS | METH_KEYWORDS, "" });
		PYTensorGraph_methods.append(PyMethodDef { "dispatch", (PyCFunction)TensorGraph_dispatch, METH_VARARGS | METH_KEYWORDS, "" });
		PYTensorGraph_methods.append(PyMethodDef {});
		PYTensorGraph_getsets.reserve(PYTensorGraph_getsets.size() + 1);
		PYTensorGraph_getsets.append(PyGetSetDef {});
		PYTensorGraph_Type.tp_dealloc = (destructor)pyTensorGraph_dealloc;
		PYTensorGraph_number.nb_bool = (inquiry)pyTensorGraph_bool;
		PYTensorGraph_Type.tp_name = "tellusim.TensorGraph";
		PYTensorGraph_Type.tp_basicsize = sizeof(PYTensorGraph);
		PYTensorGraph_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYTensorGraph_Type.tp_doc = "";
		PYTensorGraph_Type.tp_str = (reprfunc)pyTensorGraph_str;
		PYTensorGraph_Type.tp_as_number = &PYTensorGraph_number;
		PYTensorGraph_Type.tp_methods = PYTensorGraph_methods.discard();
		PYTensorGraph_Type.tp_getset = PYTensorGraph_getsets.discard();
		PYTensorGraph_Type.tp_init = (initproc)pyTensorGraph_init;
		PYTensorGraph_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTensorGraph_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "TensorGraph");
			return false;
		}
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Clear", PyLong_FromLong(0));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Range", PyLong_FromLong(1));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Copy", PyLong_FromLong(2));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Cat", PyLong_FromLong(3));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Transpose", PyLong_FromLong(4));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MatMul", PyLong_FromLong(5));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Mul", PyLong_FromLong(6));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Mad", PyLong_FromLong(7));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Div", PyLong_FromLong(8));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Add", PyLong_FromLong(9));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Conv", PyLong_FromLong(10));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "DeConv", PyLong_FromLong(11));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "BatchNorm", PyLong_FromLong(12));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "BatchMad", PyLong_FromLong(13));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "SoftMin", PyLong_FromLong(14));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "SoftMax", PyLong_FromLong(15));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaxPool", PyLong_FromLong(16));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "AvgPool", PyLong_FromLong(17));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "GELU", PyLong_FromLong(18));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "ReLU", PyLong_FromLong(19));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "SiLU", PyLong_FromLong(20));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Sigm", PyLong_FromLong(21));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Tanh", PyLong_FromLong(22));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Sin", PyLong_FromLong(23));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Cos", PyLong_FromLong(24));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "Exp", PyLong_FromLong(25));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "NumOperations", PyLong_FromLong(26));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagSizeQuery", PyLong_FromLong(1));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagFormatRf32", PyLong_FromLong(2));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagFormatRf16", PyLong_FromLong(4));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagTranspose", PyLong_FromLong(8));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagWrapClamp", PyLong_FromLong(16));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagWrapRepeat", PyLong_FromLong(32));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagReadScale", PyLong_FromLong(64));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagReadBias", PyLong_FromLong(128));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagConvert", PyLong_FromLong(256));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagKernel", PyLong_FromLong(512));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagGELU", PyLong_FromLong(1024));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagReLU", PyLong_FromLong(2048));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagSiLU", PyLong_FromLong(4096));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagSigm", PyLong_FromLong(8192));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagTanh", PyLong_FromLong(16384));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagSin", PyLong_FromLong(32768));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagCos", PyLong_FromLong(65536));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagExp", PyLong_FromLong(131072));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagFormat", PyLong_FromLong(6));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagWrap", PyLong_FromLong(48));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagRead", PyLong_FromLong(192));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagUnit", PyLong_FromLong(7168));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagMath", PyLong_FromLong(253952));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "FlagsAll", PyLong_FromLong(262142));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskNone", PyLong_FromLong(0));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskClear", PyLong_FromLong(1));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskRange", PyLong_FromLong(2));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskCopy", PyLong_FromLong(4));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskCat", PyLong_FromLong(8));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskTranspose", PyLong_FromLong(16));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskMatMul", PyLong_FromLong(32));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskMul", PyLong_FromLong(64));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskMad", PyLong_FromLong(128));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskDiv", PyLong_FromLong(256));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskAdd", PyLong_FromLong(512));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskConv", PyLong_FromLong(1024));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskDeConv", PyLong_FromLong(2048));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskBatchNorm", PyLong_FromLong(4096));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskBatchMad", PyLong_FromLong(8192));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskSoftMin", PyLong_FromLong(16384));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskSoftMax", PyLong_FromLong(32768));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskMaxPool", PyLong_FromLong(65536));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskAvgPool", PyLong_FromLong(131072));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskGELU", PyLong_FromLong(262144));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskReLU", PyLong_FromLong(524288));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskSiLU", PyLong_FromLong(1048576));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskSigm", PyLong_FromLong(2097152));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskTanh", PyLong_FromLong(4194304));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskSin", PyLong_FromLong(8388608));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskCos", PyLong_FromLong(16777216));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MaskExp", PyLong_FromLong(33554432));
		PyDict_SetItemString(PYTensorGraph_Type.tp_dict, "MasksAll", PyLong_FromLong(67108863));
		PyType_Modified(&PYTensorGraph_Type);
		Py_INCREF(&PYTensorGraph_Type);
		
		// Tellusim::Desktop
		PYDesktop_methods.reserve(PYDesktop_methods.size() + 35);
		PYDesktop_methods.append(PyMethodDef { "equalPtr", (PyCFunction)pyDesktop_equalPtr, METH_VARARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "clonePtr", (PyCFunction)pyDesktop_clonePtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "clearPtr", (PyCFunction)pyDesktop_clearPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "destroyPtr", (PyCFunction)pyDesktop_destroyPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "acquirePtr", (PyCFunction)pyDesktop_acquirePtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "unacquirePtr", (PyCFunction)pyDesktop_unacquirePtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "isValidPtr", (PyCFunction)pyDesktop_isValidPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "isOwnerPtr", (PyCFunction)pyDesktop_isOwnerPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "isConstPtr", (PyCFunction)pyDesktop_isConstPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "getCountPtr", (PyCFunction)pyDesktop_getCountPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "getInternalPtr", (PyCFunction)pyDesktop_getInternalPtr, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "update", (PyCFunction)Desktop_update, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "getWidth", (PyCFunction)Desktop_getWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getHeight", (PyCFunction)Desktop_getHeight, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getPositionX", (PyCFunction)Desktop_getPositionX, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getPositionY", (PyCFunction)Desktop_getPositionY, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScale", (PyCFunction)Desktop_getScale, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "getNumScreens", (PyCFunction)Desktop_getNumScreens, METH_NOARGS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenName", (PyCFunction)Desktop_getScreenName, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenDevice", (PyCFunction)Desktop_getScreenDevice, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenWidth", (PyCFunction)Desktop_getScreenWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenHeight", (PyCFunction)Desktop_getScreenHeight, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenPositionX", (PyCFunction)Desktop_getScreenPositionX, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenPositionY", (PyCFunction)Desktop_getScreenPositionY, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenFrequency", (PyCFunction)Desktop_getScreenFrequency, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getNumModes", (PyCFunction)Desktop_getNumModes, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getModeWidth", (PyCFunction)Desktop_getModeWidth, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getModeHeight", (PyCFunction)Desktop_getModeHeight, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getModeIndex", (PyCFunction)Desktop_getModeIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "setMode", (PyCFunction)Desktop_setMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "restoreMode", (PyCFunction)Desktop_restoreMode, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getScreenIndex", (PyCFunction)Desktop_getScreenIndex, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "setMouse", (PyCFunction)Desktop_setMouse, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef { "getMouse", (PyCFunction)Desktop_getMouse, METH_VARARGS | METH_KEYWORDS, "" });
		PYDesktop_methods.append(PyMethodDef {});
		PYDesktop_getsets.reserve(PYDesktop_getsets.size() + 7);
		PYDesktop_getsets.append(PyGetSetDef { "width", (getter)Desktop_get_width, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef { "height", (getter)Desktop_get_height, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef { "position_x", (getter)Desktop_get_position_x, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef { "position_y", (getter)Desktop_get_position_y, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef { "scale", (getter)Desktop_get_scale, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef { "num_screens", (getter)Desktop_get_num_screens, nullptr, "", nullptr });
		PYDesktop_getsets.append(PyGetSetDef {});
		PYDesktop_Type.tp_dealloc = (destructor)pyDesktop_dealloc;
		PYDesktop_number.nb_bool = (inquiry)pyDesktop_bool;
		PYDesktop_Type.tp_name = "tellusim.Desktop";
		PYDesktop_Type.tp_basicsize = sizeof(PYDesktop);
		PYDesktop_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE;
		PYDesktop_Type.tp_doc = "";
		PYDesktop_Type.tp_str = (reprfunc)pyDesktop_str;
		PYDesktop_Type.tp_as_number = &PYDesktop_number;
		PYDesktop_Type.tp_methods = PYDesktop_methods.discard();
		PYDesktop_Type.tp_getset = PYDesktop_getsets.discard();
		PYDesktop_Type.tp_init = (initproc)pyDesktop_init;
		PYDesktop_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYDesktop_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Desktop");
			return false;
		}
		Py_INCREF(&PYDesktop_Type);
		
		// Tellusim
		methods.reserve(methods.size() + 55);
		methods.append(PyMethodDef { "getPlatformName", (PyCFunction)PY_getPlatformName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "findPlatformName", (PyCFunction)PY_findPlatformName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isPlatformAvailable", (PyCFunction)PY_isPlatformAvailable, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatName", (PyCFunction)PY_getFormatName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "findFormatName", (PyCFunction)PY_findFormatName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getGLSLFormatName", (PyCFunction)PY_getGLSLFormatName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "findGLSLFormatName", (PyCFunction)PY_findGLSLFormatName, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isColorFormat", (PyCFunction)PY_isColorFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isDepthFormat", (PyCFunction)PY_isDepthFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isPixelFormat", (PyCFunction)PY_isPixelFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isPlainFormat", (PyCFunction)PY_isPlainFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isMixedFormat", (PyCFunction)PY_isMixedFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isBlockFormat", (PyCFunction)PY_isBlockFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isStencilFormat", (PyCFunction)PY_isStencilFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toPixelFormat", (PyCFunction)PY_toPixelFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isNormFormat", (PyCFunction)PY_isNormFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isSRGBFormat", (PyCFunction)PY_isSRGBFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isSignedFormat", (PyCFunction)PY_isSignedFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isUnsignedFormat", (PyCFunction)PY_isUnsignedFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isIntegerFormat", (PyCFunction)PY_isIntegerFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isFloatFormat", (PyCFunction)PY_isFloatFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toNormFormat", (PyCFunction)PY_toNormFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toSRGBFormat", (PyCFunction)PY_toSRGBFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toSignedFormat", (PyCFunction)PY_toSignedFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toUnsignedFormat", (PyCFunction)PY_toUnsignedFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toFloatFormat", (PyCFunction)PY_toFloatFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isi8Format", (PyCFunction)PY_isi8Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isu8Format", (PyCFunction)PY_isu8Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "is8BitFormat", (PyCFunction)PY_is8BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "to8BitFormat", (PyCFunction)PY_to8BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isi16Format", (PyCFunction)PY_isi16Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isu16Format", (PyCFunction)PY_isu16Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isf16Format", (PyCFunction)PY_isf16Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "is16BitFormat", (PyCFunction)PY_is16BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "to16BitFormat", (PyCFunction)PY_to16BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isi32Format", (PyCFunction)PY_isi32Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isu32Format", (PyCFunction)PY_isu32Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isf32Format", (PyCFunction)PY_isf32Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "is32BitFormat", (PyCFunction)PY_is32BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "to32BitFormat", (PyCFunction)PY_to32BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isi64Format", (PyCFunction)PY_isi64Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isu64Format", (PyCFunction)PY_isu64Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isf64Format", (PyCFunction)PY_isf64Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "is64BitFormat", (PyCFunction)PY_is64BitFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isBC15Format", (PyCFunction)PY_isBC15Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isBC67Format", (PyCFunction)PY_isBC67Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isETC2Format", (PyCFunction)PY_isETC2Format, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "isASTCFormat", (PyCFunction)PY_isASTCFormat, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatComponents", (PyCFunction)PY_getFormatComponents, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "toFormatComponents", (PyCFunction)PY_toFormatComponents, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatPixelSize", (PyCFunction)PY_getFormatPixelSize, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatBlockSize", (PyCFunction)PY_getFormatBlockSize, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatBlockWidth", (PyCFunction)PY_getFormatBlockWidth, METH_VARARGS | METH_KEYWORDS, "" });
		methods.append(PyMethodDef { "getFormatBlockHeight", (PyCFunction)PY_getFormatBlockHeight, METH_VARARGS | METH_KEYWORDS, "" });
		
		// Tellusim::Allocator
		PYAllocator_methods.reserve(PYAllocator_methods.size() + 6);
		PYAllocator_methods.append(PyMethodDef { "allocate", (PyCFunction)Allocator_allocate, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYAllocator_methods.append(PyMethodDef { "reallocate", (PyCFunction)Allocator_reallocate, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYAllocator_methods.append(PyMethodDef { "free", (PyCFunction)Allocator_free, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYAllocator_methods.append(PyMethodDef { "getMemory", (PyCFunction)Allocator_getMemory, METH_NOARGS | METH_STATIC, "" });
		PYAllocator_methods.append(PyMethodDef { "getAllocations", (PyCFunction)Allocator_getAllocations, METH_NOARGS | METH_STATIC, "" });
		PYAllocator_methods.append(PyMethodDef {});
		PYAllocator_Type.tp_name = "tellusim.Allocator";
		PYAllocator_Type.tp_basicsize = sizeof(PYAllocator);
		PYAllocator_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYAllocator_Type.tp_doc = "";
		PYAllocator_Type.tp_methods = PYAllocator_methods.discard();
		PYAllocator_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYAllocator_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Allocator");
			return false;
		}
		Py_INCREF(&PYAllocator_Type);
		
		// Tellusim::Log
		PYLog_methods.reserve(PYLog_methods.size() + 7);
		PYLog_methods.append(PyMethodDef { "setLevel", (PyCFunction)Log_setLevel, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef { "getLevel", (PyCFunction)Log_getLevel, METH_NOARGS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef { "unlockCallback", (PyCFunction)Log_unlockCallback, METH_NOARGS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef { "lockCallback", (PyCFunction)Log_lockCallback, METH_NOARGS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef { "print", (PyCFunction)Log_print, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef { "printe", (PyCFunction)Log_printe, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYLog_methods.append(PyMethodDef {});
		PYLog_Type.tp_name = "tellusim.Log";
		PYLog_Type.tp_basicsize = sizeof(PYLog);
		PYLog_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYLog_Type.tp_doc = "";
		PYLog_Type.tp_methods = PYLog_methods.discard();
		PYLog_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYLog_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Log");
			return false;
		}
		PyDict_SetItemString(PYLog_Type.tp_dict, "Fatal", PyLong_FromLong(0));
		PyDict_SetItemString(PYLog_Type.tp_dict, "Error", PyLong_FromLong(1));
		PyDict_SetItemString(PYLog_Type.tp_dict, "Warning", PyLong_FromLong(2));
		PyDict_SetItemString(PYLog_Type.tp_dict, "Message", PyLong_FromLong(3));
		PyDict_SetItemString(PYLog_Type.tp_dict, "Verbose", PyLong_FromLong(4));
		PyDict_SetItemString(PYLog_Type.tp_dict, "Unknown", PyLong_FromLong(5));
		PyDict_SetItemString(PYLog_Type.tp_dict, "NumLevels", PyLong_FromLong(6));
		PyType_Modified(&PYLog_Type);
		Py_INCREF(&PYLog_Type);
		
		// Tellusim::Time
		PYTime_methods.reserve(PYTime_methods.size() + 4);
		PYTime_methods.append(PyMethodDef { "current", (PyCFunction)Time_current, METH_NOARGS | METH_STATIC, "" });
		PYTime_methods.append(PyMethodDef { "seconds", (PyCFunction)Time_seconds, METH_NOARGS | METH_STATIC, "" });
		PYTime_methods.append(PyMethodDef { "sleep", (PyCFunction)Time_sleep, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYTime_methods.append(PyMethodDef {});
		PYTime_Type.tp_name = "tellusim.Time";
		PYTime_Type.tp_basicsize = sizeof(PYTime);
		PYTime_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYTime_Type.tp_doc = "";
		PYTime_Type.tp_methods = PYTime_methods.discard();
		PYTime_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYTime_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "Time");
			return false;
		}
		PyDict_SetItemString(PYTime_Type.tp_dict, "Seconds", PyLong_FromLong(1000000u));
		PyDict_SetItemString(PYTime_Type.tp_dict, "MSeconds", PyLong_FromLong(1000u));
		PyDict_SetItemString(PYTime_Type.tp_dict, "USeconds", PyLong_FromLong(1u));
		PyType_Modified(&PYTime_Type);
		Py_INCREF(&PYTime_Type);
		
		// Tellusim::System
		PYSystem_methods.reserve(PYSystem_methods.size() + 9);
		PYSystem_methods.append(PyMethodDef { "getThreadID", (PyCFunction)System_getThreadID, METH_NOARGS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "setEnvironment", (PyCFunction)System_setEnvironment, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "getEnvironment", (PyCFunction)System_getEnvironment, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "loadLibrary", (PyCFunction)System_loadLibrary, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "getFunction", (PyCFunction)System_getFunction, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "closeLibrary", (PyCFunction)System_closeLibrary, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "exec", (PyCFunction)System_exec, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef { "open", (PyCFunction)System_open, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYSystem_methods.append(PyMethodDef {});
		PYSystem_Type.tp_name = "tellusim.System";
		PYSystem_Type.tp_basicsize = sizeof(PYSystem);
		PYSystem_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYSystem_Type.tp_doc = "";
		PYSystem_Type.tp_methods = PYSystem_methods.discard();
		PYSystem_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYSystem_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "System");
			return false;
		}
		Py_INCREF(&PYSystem_Type);
		
		// Tellusim::MeshGraph
		PYMeshGraph_methods.reserve(PYMeshGraph_methods.size() + 2);
		PYMeshGraph_methods.append(PyMethodDef { "create", (PyCFunction)MeshGraph_create, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYMeshGraph_methods.append(PyMethodDef {});
		PYMeshGraph_Type.tp_name = "tellusim.MeshGraph";
		PYMeshGraph_Type.tp_basicsize = sizeof(PYMeshGraph);
		PYMeshGraph_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshGraph_Type.tp_doc = "";
		PYMeshGraph_Type.tp_methods = PYMeshGraph_methods.discard();
		PYMeshGraph_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshGraph_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshGraph");
			return false;
		}
		Py_INCREF(&PYMeshGraph_Type);
		
		// Tellusim::MeshReduce
		PYMeshReduce_methods.reserve(PYMeshReduce_methods.size() + 2);
		PYMeshReduce_methods.append(PyMethodDef { "collapse", (PyCFunction)MeshReduce_collapse, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYMeshReduce_methods.append(PyMethodDef {});
		PYMeshReduce_Type.tp_name = "tellusim.MeshReduce";
		PYMeshReduce_Type.tp_basicsize = sizeof(PYMeshReduce);
		PYMeshReduce_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshReduce_Type.tp_doc = "";
		PYMeshReduce_Type.tp_methods = PYMeshReduce_methods.discard();
		PYMeshReduce_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshReduce_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshReduce");
			return false;
		}
		Py_INCREF(&PYMeshReduce_Type);
		
		// Tellusim::MeshRefine
		PYMeshRefine_methods.reserve(PYMeshRefine_methods.size() + 2);
		PYMeshRefine_methods.append(PyMethodDef { "subdiv", (PyCFunction)MeshRefine_subdiv, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYMeshRefine_methods.append(PyMethodDef {});
		PYMeshRefine_Type.tp_name = "tellusim.MeshRefine";
		PYMeshRefine_Type.tp_basicsize = sizeof(PYMeshRefine);
		PYMeshRefine_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshRefine_Type.tp_doc = "";
		PYMeshRefine_Type.tp_methods = PYMeshRefine_methods.discard();
		PYMeshRefine_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshRefine_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshRefine");
			return false;
		}
		Py_INCREF(&PYMeshRefine_Type);
		
		// Tellusim::MeshSolid
		PYMeshSolid_methods.reserve(PYMeshSolid_methods.size() + 2);
		PYMeshSolid_methods.append(PyMethodDef { "create", (PyCFunction)MeshSolid_create, METH_VARARGS | METH_KEYWORDS | METH_STATIC, "" });
		PYMeshSolid_methods.append(PyMethodDef {});
		PYMeshSolid_Type.tp_name = "tellusim.MeshSolid";
		PYMeshSolid_Type.tp_basicsize = sizeof(PYMeshSolid);
		PYMeshSolid_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE;
		PYMeshSolid_Type.tp_doc = "";
		PYMeshSolid_Type.tp_methods = PYMeshSolid_methods.discard();
		PYMeshSolid_Type.tp_new = PyType_GenericNew;
		if(PyType_Ready(&PYMeshSolid_Type) < 0) {
			TS_LOGF(Error, "pyInitAPI(): can't init %s type\n", "MeshSolid");
			return false;
		}
		Py_INCREF(&PYMeshSolid_Type);
		
		return true;
	}
	
	// Create Tellusim API
	bool pyCreateAPI(PyObject *module) {
		if(PyModule_AddObject(module, "VendorARM", PyLong_FromLong(0x13b5)) < 0) return false;
		if(PyModule_AddObject(module, "VendorAMD", PyLong_FromLong(0x1002)) < 0) return false;
		if(PyModule_AddObject(module, "VendorApple", PyLong_FromLong(0x106b)) < 0) return false;
		if(PyModule_AddObject(module, "VendorIntel", PyLong_FromLong(0x8086)) < 0) return false;
		if(PyModule_AddObject(module, "VendorNvidia", PyLong_FromLong(0x10de)) < 0) return false;
		if(PyModule_AddObject(module, "VendorQualcomm", PyLong_FromLong(0x5143)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformUnknown", PyLong_FromLong(0)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformFusion", PyLong_FromLong(1)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformD3D12", PyLong_FromLong(2)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformD3D11", PyLong_FromLong(3)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformMTL", PyLong_FromLong(4)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformVK", PyLong_FromLong(5)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformGL", PyLong_FromLong(6)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformGLES", PyLong_FromLong(7)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformWG", PyLong_FromLong(8)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformCU", PyLong_FromLong(9)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformHIP", PyLong_FromLong(10)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformAny", PyLong_FromLong(11)) < 0) return false;
		if(PyModule_AddObject(module, "PlatformNumPlatforms", PyLong_FromLong(12)) < 0) return false;
		if(PyModule_AddObject(module, "BindBindFlagNone", PyLong_FromLong(0)) < 0) return false;
		if(PyModule_AddObject(module, "BindBindFlagFixed", PyLong_FromLong(1)) < 0) return false;
		if(PyModule_AddObject(module, "BindBindFlagRead", PyLong_FromLong(2)) < 0) return false;
		if(PyModule_AddObject(module, "TableTypeTexture", PyLong_FromLong(0)) < 0) return false;
		if(PyModule_AddObject(module, "TableTypeStorage", PyLong_FromLong(1)) < 0) return false;
		if(PyModule_AddObject(module, "TableTypeNumTableTypes", PyLong_FromLong(2)) < 0) return false;
		if(PyModule_AddObject(module, "FormatUnknown", PyLong_FromLong(0)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi8", PyLong_FromLong(1)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu8", PyLong_FromLong(2)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi8n", PyLong_FromLong(3)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu8n", PyLong_FromLong(4)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi8", PyLong_FromLong(5)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu8", PyLong_FromLong(6)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi8n", PyLong_FromLong(7)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu8n", PyLong_FromLong(8)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi8", PyLong_FromLong(9)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu8", PyLong_FromLong(10)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi8n", PyLong_FromLong(11)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu8n", PyLong_FromLong(12)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu8ns", PyLong_FromLong(13)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi8", PyLong_FromLong(14)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu8", PyLong_FromLong(15)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi8n", PyLong_FromLong(16)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu8n", PyLong_FromLong(17)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu8ns", PyLong_FromLong(18)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBGRAu8n", PyLong_FromLong(19)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBGRAu8ns", PyLong_FromLong(20)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi16", PyLong_FromLong(21)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu16", PyLong_FromLong(22)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi16n", PyLong_FromLong(23)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu16n", PyLong_FromLong(24)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRf16", PyLong_FromLong(25)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi16", PyLong_FromLong(26)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu16", PyLong_FromLong(27)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi16n", PyLong_FromLong(28)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu16n", PyLong_FromLong(29)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGf16", PyLong_FromLong(30)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi16", PyLong_FromLong(31)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu16", PyLong_FromLong(32)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi16n", PyLong_FromLong(33)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu16n", PyLong_FromLong(34)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBf16", PyLong_FromLong(35)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi16", PyLong_FromLong(36)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu16", PyLong_FromLong(37)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi16n", PyLong_FromLong(38)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu16n", PyLong_FromLong(39)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAf16", PyLong_FromLong(40)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi32", PyLong_FromLong(41)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu32", PyLong_FromLong(42)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRf32", PyLong_FromLong(43)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi32", PyLong_FromLong(44)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu32", PyLong_FromLong(45)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGf32", PyLong_FromLong(46)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi32", PyLong_FromLong(47)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu32", PyLong_FromLong(48)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBf32", PyLong_FromLong(49)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi32", PyLong_FromLong(50)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu32", PyLong_FromLong(51)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAf32", PyLong_FromLong(52)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRi64", PyLong_FromLong(53)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu64", PyLong_FromLong(54)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRf64", PyLong_FromLong(55)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGi64", PyLong_FromLong(56)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGu64", PyLong_FromLong(57)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGf64", PyLong_FromLong(58)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBi64", PyLong_FromLong(59)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu64", PyLong_FromLong(60)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBf64", PyLong_FromLong(61)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAi64", PyLong_FromLong(62)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu64", PyLong_FromLong(63)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAf64", PyLong_FromLong(64)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBAu4n", PyLong_FromLong(65)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu5Au1n", PyLong_FromLong(66)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRu5Gu6Bu5n", PyLong_FromLong(67)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu10Au2", PyLong_FromLong(68)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBu10Au2n", PyLong_FromLong(69)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGf11Bf10", PyLong_FromLong(70)) < 0) return false;
		if(PyModule_AddObject(module, "FormatRGBf21", PyLong_FromLong(71)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC1RGBu8n", PyLong_FromLong(72)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC1RGBu8ns", PyLong_FromLong(73)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC1RGBAu8n", PyLong_FromLong(74)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC1RGBAu8ns", PyLong_FromLong(75)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC2RGBAu8n", PyLong_FromLong(76)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC2RGBAu8ns", PyLong_FromLong(77)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC3RGBAu8n", PyLong_FromLong(78)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC3RGBAu8ns", PyLong_FromLong(79)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC4Ri8n", PyLong_FromLong(80)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC4Ru8n", PyLong_FromLong(81)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC5RGi8n", PyLong_FromLong(82)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC5RGu8n", PyLong_FromLong(83)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC6RGBf16s", PyLong_FromLong(84)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC6RGBf16u", PyLong_FromLong(85)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC7RGBAu8n", PyLong_FromLong(86)) < 0) return false;
		if(PyModule_AddObject(module, "FormatBC7RGBAu8ns", PyLong_FromLong(87)) < 0) return false;
		if(PyModule_AddObject(module, "FormatEACRi8n", PyLong_FromLong(88)) < 0) return false;
		if(PyModule_AddObject(module, "FormatEACRu8n", PyLong_FromLong(89)) < 0) return false;
		if(PyModule_AddObject(module, "FormatEACRGi8n", PyLong_FromLong(90)) < 0) return false;
		if(PyModule_AddObject(module, "FormatEACRGu8n", PyLong_FromLong(91)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBu8n", PyLong_FromLong(92)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBu8ns", PyLong_FromLong(93)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBAu8n", PyLong_FromLong(94)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBAu8ns", PyLong_FromLong(95)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBu8Au1n", PyLong_FromLong(96)) < 0) return false;
		if(PyModule_AddObject(module, "FormatETC2RGBu8Au1ns", PyLong_FromLong(97)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC44RGBAu8n", PyLong_FromLong(98)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC44RGBAu8ns", PyLong_FromLong(99)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC44RGBAf16", PyLong_FromLong(100)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC54RGBAu8n", PyLong_FromLong(101)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC54RGBAu8ns", PyLong_FromLong(102)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC54RGBAf16", PyLong_FromLong(103)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC55RGBAu8n", PyLong_FromLong(104)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC55RGBAu8ns", PyLong_FromLong(105)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC55RGBAf16", PyLong_FromLong(106)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC65RGBAu8n", PyLong_FromLong(107)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC65RGBAu8ns", PyLong_FromLong(108)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC65RGBAf16", PyLong_FromLong(109)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC66RGBAu8n", PyLong_FromLong(110)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC66RGBAu8ns", PyLong_FromLong(111)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC66RGBAf16", PyLong_FromLong(112)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC85RGBAu8n", PyLong_FromLong(113)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC85RGBAu8ns", PyLong_FromLong(114)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC85RGBAf16", PyLong_FromLong(115)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC86RGBAu8n", PyLong_FromLong(116)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC86RGBAu8ns", PyLong_FromLong(117)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC86RGBAf16", PyLong_FromLong(118)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC88RGBAu8n", PyLong_FromLong(119)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC88RGBAu8ns", PyLong_FromLong(120)) < 0) return false;
		if(PyModule_AddObject(module, "FormatASTC88RGBAf16", PyLong_FromLong(121)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDu16", PyLong_FromLong(122)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDu16Su8", PyLong_FromLong(123)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDu24", PyLong_FromLong(124)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDu24Su8", PyLong_FromLong(125)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDf32", PyLong_FromLong(126)) < 0) return false;
		if(PyModule_AddObject(module, "FormatDf32Su8", PyLong_FromLong(127)) < 0) return false;
		if(PyModule_AddObject(module, "FormatNumFormats", PyLong_FromLong(128)) < 0) return false;
		if(PyModule_AddObject(module, "String", (PyObject*)&PYString_Type) < 0) return false;
		if(PyModule_AddObject(module, "App", (PyObject*)&PYApp_Type) < 0) return false;
		if(PyModule_AddObject(module, "Async", (PyObject*)&PYAsync_Type) < 0) return false;
		if(PyModule_AddObject(module, "Stream", (PyObject*)&PYStream_Type) < 0) return false;
		if(PyModule_AddObject(module, "Blob", (PyObject*)&PYBlob_Type) < 0) return false;
		if(PyModule_AddObject(module, "File", (PyObject*)&PYFile_Type) < 0) return false;
		if(PyModule_AddObject(module, "Socket", (PyObject*)&PYSocket_Type) < 0) return false;
		if(PyModule_AddObject(module, "SocketSSL", (PyObject*)&PYSocketSSL_Type) < 0) return false;
		if(PyModule_AddObject(module, "Source", (PyObject*)&PYSource_Type) < 0) return false;
		if(PyModule_AddObject(module, "Date", (PyObject*)&PYDate_Type) < 0) return false;
		if(PyModule_AddObject(module, "Info", (PyObject*)&PYInfo_Type) < 0) return false;
		if(PyModule_AddObject(module, "Directory", (PyObject*)&PYDirectory_Type) < 0) return false;
		if(PyModule_AddObject(module, "Archive", (PyObject*)&PYArchive_Type) < 0) return false;
		if(PyModule_AddObject(module, "Image", (PyObject*)&PYImage_Type) < 0) return false;
		if(PyModule_AddObject(module, "ImageSampler", (PyObject*)&PYImageSampler_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshNode", (PyObject*)&PYMeshNode_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshIndices", (PyObject*)&PYMeshIndices_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshAttribute", (PyObject*)&PYMeshAttribute_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshJoint", (PyObject*)&PYMeshJoint_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshMaterial", (PyObject*)&PYMeshMaterial_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshGeometry", (PyObject*)&PYMeshGeometry_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshTransform", (PyObject*)&PYMeshTransform_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshAnimation", (PyObject*)&PYMeshAnimation_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshAttachment", (PyObject*)&PYMeshAttachment_Type) < 0) return false;
		if(PyModule_AddObject(module, "Mesh", (PyObject*)&PYMesh_Type) < 0) return false;
		if(PyModule_AddObject(module, "Json", (PyObject*)&PYJson_Type) < 0) return false;
		if(PyModule_AddObject(module, "Xml", (PyObject*)&PYXml_Type) < 0) return false;
		if(PyModule_AddObject(module, "Buffer", (PyObject*)&PYBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "BufferTable", (PyObject*)&PYBufferTable_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Buffer", (PyObject*)&PYD3D12Buffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Buffer", (PyObject*)&PYD3D11Buffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLBuffer", (PyObject*)&PYMTLBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKBuffer", (PyObject*)&PYVKBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLBuffer", (PyObject*)&PYGLBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESBuffer", (PyObject*)&PYGLESBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "CUBuffer", (PyObject*)&PYCUBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "HIPBuffer", (PyObject*)&PYHIPBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUBuffer", (PyObject*)&PYFUBuffer_Type) < 0) return false;
		if(PyModule_AddObject(module, "Command", (PyObject*)&PYCommand_Type) < 0) return false;
		if(PyModule_AddObject(module, "CommandDrawArraysIndirect", (PyObject*)&PYCommandDrawArraysIndirect_Type) < 0) return false;
		if(PyModule_AddObject(module, "CommandDrawElementsIndirect", (PyObject*)&PYCommandDrawElementsIndirect_Type) < 0) return false;
		if(PyModule_AddObject(module, "CommandDrawMeshIndirect", (PyObject*)&PYCommandDrawMeshIndirect_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Command", (PyObject*)&PYD3D12Command_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLCommand", (PyObject*)&PYMTLCommand_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKCommand", (PyObject*)&PYVKCommand_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUCommand", (PyObject*)&PYFUCommand_Type) < 0) return false;
		if(PyModule_AddObject(module, "Compute", (PyObject*)&PYCompute_Type) < 0) return false;
		if(PyModule_AddObject(module, "ComputeDispatchIndirect", (PyObject*)&PYComputeDispatchIndirect_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Compute", (PyObject*)&PYD3D12Compute_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLCompute", (PyObject*)&PYMTLCompute_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKCompute", (PyObject*)&PYVKCompute_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUCompute", (PyObject*)&PYFUCompute_Type) < 0) return false;
		if(PyModule_AddObject(module, "Context", (PyObject*)&PYContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Context", (PyObject*)&PYD3D12Context_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Context", (PyObject*)&PYD3D11Context_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLContext", (PyObject*)&PYMTLContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKContext", (PyObject*)&PYVKContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLContext", (PyObject*)&PYGLContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESContext", (PyObject*)&PYGLESContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "WGContext", (PyObject*)&PYWGContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "CUContext", (PyObject*)&PYCUContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "HIPContext", (PyObject*)&PYHIPContext_Type) < 0) return false;
		if(PyModule_AddObject(module, "Query", (PyObject*)&PYQuery_Type) < 0) return false;
		if(PyModule_AddObject(module, "QueryStatistics", (PyObject*)&PYQueryStatistics_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUQuery", (PyObject*)&PYFUQuery_Type) < 0) return false;
		if(PyModule_AddObject(module, "Fence", (PyObject*)&PYFence_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKFence", (PyObject*)&PYVKFence_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUFence", (PyObject*)&PYFUFence_Type) < 0) return false;
		if(PyModule_AddObject(module, "Shader", (PyObject*)&PYShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "ShaderCompiler", (PyObject*)&PYShaderCompiler_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Shader", (PyObject*)&PYD3D12Shader_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Shader", (PyObject*)&PYD3D11Shader_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLShader", (PyObject*)&PYMTLShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKShader", (PyObject*)&PYVKShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLShader", (PyObject*)&PYGLShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESShader", (PyObject*)&PYGLESShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "CUShader", (PyObject*)&PYCUShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "HIPShader", (PyObject*)&PYHIPShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUShader", (PyObject*)&PYFUShader_Type) < 0) return false;
		if(PyModule_AddObject(module, "Sampler", (PyObject*)&PYSampler_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLSampler", (PyObject*)&PYMTLSampler_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUSampler", (PyObject*)&PYFUSampler_Type) < 0) return false;
		if(PyModule_AddObject(module, "Texture", (PyObject*)&PYTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "TextureTable", (PyObject*)&PYTextureTable_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Texture", (PyObject*)&PYD3D12Texture_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Texture", (PyObject*)&PYD3D11Texture_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLTexture", (PyObject*)&PYMTLTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKTexture", (PyObject*)&PYVKTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLTexture", (PyObject*)&PYGLTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESTexture", (PyObject*)&PYGLESTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "CUTexture", (PyObject*)&PYCUTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "HIPTexture", (PyObject*)&PYHIPTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUTexture", (PyObject*)&PYFUTexture_Type) < 0) return false;
		if(PyModule_AddObject(module, "Tracing", (PyObject*)&PYTracing_Type) < 0) return false;
		if(PyModule_AddObject(module, "TracingInstance", (PyObject*)&PYTracingInstance_Type) < 0) return false;
		if(PyModule_AddObject(module, "TracingBuildIndirect", (PyObject*)&PYTracingBuildIndirect_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Tracing", (PyObject*)&PYD3D12Tracing_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLTracing", (PyObject*)&PYMTLTracing_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKTracing", (PyObject*)&PYVKTracing_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUTracing", (PyObject*)&PYFUTracing_Type) < 0) return false;
		if(PyModule_AddObject(module, "Target", (PyObject*)&PYTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Target", (PyObject*)&PYD3D12Target_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Target", (PyObject*)&PYD3D11Target_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLTarget", (PyObject*)&PYMTLTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKTarget", (PyObject*)&PYVKTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLTarget", (PyObject*)&PYGLTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESTarget", (PyObject*)&PYGLESTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUTarget", (PyObject*)&PYFUTarget_Type) < 0) return false;
		if(PyModule_AddObject(module, "Device", (PyObject*)&PYDevice_Type) < 0) return false;
		if(PyModule_AddObject(module, "DeviceFeatures", (PyObject*)&PYDeviceFeatures_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Device", (PyObject*)&PYD3D12Device_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Device", (PyObject*)&PYD3D11Device_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLDevice", (PyObject*)&PYMTLDevice_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKDevice", (PyObject*)&PYVKDevice_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUDevice", (PyObject*)&PYFUDevice_Type) < 0) return false;
		if(PyModule_AddObject(module, "Kernel", (PyObject*)&PYKernel_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Kernel", (PyObject*)&PYD3D12Kernel_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLKernel", (PyObject*)&PYMTLKernel_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUKernel", (PyObject*)&PYFUKernel_Type) < 0) return false;
		if(PyModule_AddObject(module, "Pipeline", (PyObject*)&PYPipeline_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Pipeline", (PyObject*)&PYD3D12Pipeline_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLPipeline", (PyObject*)&PYMTLPipeline_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUPipeline", (PyObject*)&PYFUPipeline_Type) < 0) return false;
		if(PyModule_AddObject(module, "Traversal", (PyObject*)&PYTraversal_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Traversal", (PyObject*)&PYD3D12Traversal_Type) < 0) return false;
		if(PyModule_AddObject(module, "FUTraversal", (PyObject*)&PYFUTraversal_Type) < 0) return false;
		if(PyModule_AddObject(module, "Surface", (PyObject*)&PYSurface_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D12Surface", (PyObject*)&PYD3D12Surface_Type) < 0) return false;
		if(PyModule_AddObject(module, "D3D11Surface", (PyObject*)&PYD3D11Surface_Type) < 0) return false;
		if(PyModule_AddObject(module, "MTLSurface", (PyObject*)&PYMTLSurface_Type) < 0) return false;
		if(PyModule_AddObject(module, "VKSurface", (PyObject*)&PYVKSurface_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLSurface", (PyObject*)&PYGLSurface_Type) < 0) return false;
		if(PyModule_AddObject(module, "GLESSurface", (PyObject*)&PYGLESSurface_Type) < 0) return false;
		if(PyModule_AddObject(module, "Window", (PyObject*)&PYWindow_Type) < 0) return false;
		if(PyModule_AddObject(module, "Font", (PyObject*)&PYFont_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasElement", (PyObject*)&PYCanvasElement_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasText", (PyObject*)&PYCanvasText_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasMesh", (PyObject*)&PYCanvasMesh_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasRect", (PyObject*)&PYCanvasRect_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasTriangle", (PyObject*)&PYCanvasTriangle_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasEllipse", (PyObject*)&PYCanvasEllipse_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasShape", (PyObject*)&PYCanvasShape_Type) < 0) return false;
		if(PyModule_AddObject(module, "CanvasStrip", (PyObject*)&PYCanvasStrip_Type) < 0) return false;
		if(PyModule_AddObject(module, "Canvas", (PyObject*)&PYCanvas_Type) < 0) return false;
		if(PyModule_AddObject(module, "Control", (PyObject*)&PYControl_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlRoot", (PyObject*)&PYControlRoot_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlText", (PyObject*)&PYControlText_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlRect", (PyObject*)&PYControlRect_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlGrid", (PyObject*)&PYControlGrid_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlGroup", (PyObject*)&PYControlGroup_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlPanel", (PyObject*)&PYControlPanel_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlDialog", (PyObject*)&PYControlDialog_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlWindow", (PyObject*)&PYControlWindow_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlCheck", (PyObject*)&PYControlCheck_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlCombo", (PyObject*)&PYControlCombo_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlButton", (PyObject*)&PYControlButton_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlSlider", (PyObject*)&PYControlSlider_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlScroll", (PyObject*)&PYControlScroll_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlSplit", (PyObject*)&PYControlSplit_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlArea", (PyObject*)&PYControlArea_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlTree", (PyObject*)&PYControlTree_Type) < 0) return false;
		if(PyModule_AddObject(module, "ControlEdit", (PyObject*)&PYControlEdit_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogMessage", (PyObject*)&PYDialogMessage_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogFileOpen", (PyObject*)&PYDialogFileOpen_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogFileSave", (PyObject*)&PYDialogFileSave_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogDirectory", (PyObject*)&PYDialogDirectory_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogProgress", (PyObject*)&PYDialogProgress_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogColor", (PyObject*)&PYDialogColor_Type) < 0) return false;
		if(PyModule_AddObject(module, "DialogMenu", (PyObject*)&PYDialogMenu_Type) < 0) return false;
		if(PyModule_AddObject(module, "CubeFilter", (PyObject*)&PYCubeFilter_Type) < 0) return false;
		if(PyModule_AddObject(module, "DecoderJPEG", (PyObject*)&PYDecoderJPEG_Type) < 0) return false;
		if(PyModule_AddObject(module, "EncoderBC15", (PyObject*)&PYEncoderBC15_Type) < 0) return false;
		if(PyModule_AddObject(module, "EncoderBC67", (PyObject*)&PYEncoderBC67_Type) < 0) return false;
		if(PyModule_AddObject(module, "EncoderASTC", (PyObject*)&PYEncoderASTC_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshModel", (PyObject*)&PYMeshModel_Type) < 0) return false;
		if(PyModule_AddObject(module, "SeparableFilter", (PyObject*)&PYSeparableFilter_Type) < 0) return false;
		if(PyModule_AddObject(module, "PrefixScan", (PyObject*)&PYPrefixScan_Type) < 0) return false;
		if(PyModule_AddObject(module, "PrefixScanDispatchParameters", (PyObject*)&PYPrefixScanDispatchParameters_Type) < 0) return false;
		if(PyModule_AddObject(module, "RadixSort", (PyObject*)&PYRadixSort_Type) < 0) return false;
		if(PyModule_AddObject(module, "RadixSortDispatchParameters", (PyObject*)&PYRadixSortDispatchParameters_Type) < 0) return false;
		if(PyModule_AddObject(module, "BitonicSort", (PyObject*)&PYBitonicSort_Type) < 0) return false;
		if(PyModule_AddObject(module, "BitonicSortDispatchParameters", (PyObject*)&PYBitonicSortDispatchParameters_Type) < 0) return false;
		if(PyModule_AddObject(module, "SpatialGrid", (PyObject*)&PYSpatialGrid_Type) < 0) return false;
		if(PyModule_AddObject(module, "SpatialGridDispatchParameters", (PyObject*)&PYSpatialGridDispatchParameters_Type) < 0) return false;
		if(PyModule_AddObject(module, "SpatialTree", (PyObject*)&PYSpatialTree_Type) < 0) return false;
		if(PyModule_AddObject(module, "SpatialTreeNode", (PyObject*)&PYSpatialTreeNode_Type) < 0) return false;
		if(PyModule_AddObject(module, "SpatialTreeDispatchParameters", (PyObject*)&PYSpatialTreeDispatchParameters_Type) < 0) return false;
		if(PyModule_AddObject(module, "FourierTransform", (PyObject*)&PYFourierTransform_Type) < 0) return false;
		if(PyModule_AddObject(module, "TensorGraph", (PyObject*)&PYTensorGraph_Type) < 0) return false;
		if(PyModule_AddObject(module, "Desktop", (PyObject*)&PYDesktop_Type) < 0) return false;
		if(PyModule_AddObject(module, "Allocator", (PyObject*)&PYAllocator_Type) < 0) return false;
		if(PyModule_AddObject(module, "Log", (PyObject*)&PYLog_Type) < 0) return false;
		if(PyModule_AddObject(module, "Time", (PyObject*)&PYTime_Type) < 0) return false;
		if(PyModule_AddObject(module, "System", (PyObject*)&PYSystem_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshGraph", (PyObject*)&PYMeshGraph_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshReduce", (PyObject*)&PYMeshReduce_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshRefine", (PyObject*)&PYMeshRefine_Type) < 0) return false;
		if(PyModule_AddObject(module, "MeshSolid", (PyObject*)&PYMeshSolid_Type) < 0) return false;
		return true;
	}
}
