Pythonista3 で、Metal Framework を呼び出し実行する
UI を作成。
Pythonista のui
module で呼び出せないものを呼び出す。
Metal の処理を呼ぶ。
ui で、ViewController
機能を作りそのView に背景色を設定。
Metal を表示させるView
class PyMetal(ui.View):
def __init__(self, *args, **kwargs):
ui.View.__init__(self, *args, **kwargs)
# `view` の背景
self.bg_color = 'slategray'
if __name__ == '__main__':
view = PyMetal()
view.present(style='fullscreen', orientations=['portrait'])
self.bg_color = 'slategray'
は、ViewController
の背景のため、今後この色が出ることはない
clearColor
を設定し、ui
の背景をMetal のView にさせる
いきなり裏技的な呼び出しとなる。
MTLCreateSystemDefaultDevice = c.MTLCreateSystemDefaultDevice
MTLCreateSystemDefaultDevice.argtypes = []
MTLCreateSystemDefaultDevice.restype = ctypes.c_void_p
MTLCreateSystemDefaultDevice は、Function なので、ctypes
を使い定義。インスタンス化することで、Pythonista で使えるようになる。
詳細は後述予定だが、objc_util.c
で引っ張ってこれる
Pythonistaの ui.View
をobjc_util
連動できるようにインスタンス化し、self.objc_instance.addSubview_(mtkView)
MTKView は、Class なのでMTKView = ObjCClass('MTKView')
objc_util
は、objc の書き方に近い
Metal 側は、毎フレームのループ処理をするのでdelegate
を作成
objc_util.create_objc_class
を使い生成。NSObject
をsuperclass
として、protocols
に、MTKViewDelegate
を指定
MTKViewDelegate にあるように、Required のインスタンスメソッドを関数定義し、methods
に、配列で格納
Swift のoverride
や、extension
での、イニシャライズ宣言が難しかったので
PyMetal(ui.View)
内のメソッドで事前に定義し、イニシャライズを代用
def delegate_init(self, delegate_cls, mtk_view):
renderer = delegate_cls.alloc().init()
device = mtk_view.device()
renderer.commandQueue = device.newCommandQueue()
return renderer
MTLClearColor のように、実態はPython でも表現できるような構造体は、(自分が判断できる程度で)直接指定
# red, green, blue, alpha
wenderlichGreen = ( 0.0, 0.4, 0.21, 1.0)
今後、Vertices 等のPython の型ではフォローアップが難しい場合には、ctypes
より型を指定する
ui
を継承して、コードを書いていく
ui.present()
でView が出せる
style='fullscreen'
- フルスクリーンで描画。iPhone の端末だと気がつかないが、iPad だと、小さなView になる
- document だと、
full_screen
だけど、fullscreen
が正っぽい
orientations=['portrait']
- 縦向きで固定
- 横向き(Landscape) レイアウトを考えるのが面倒なため