English(Google Translate)
Merops は Apple Metal22
と Git
、PixarUSD
をベースにした、次世代DCCツールの実験プロジェクトです。
シンプル、早い、イテレーションの3軸が基本です。
- Metal2 ベースの Viewport と Modifier (OpenGL deprecate)
- 中ボタンを使わないウィジェットを極力排したジェスチャ、ゲーム画面に近い使用感
- Pixar USD と libgit2 によるアセットパイプラインとイテレーションを重視
- 3Dソフトの操作は難しく複雑です。中ボタンクリックの多用を回避してシンプルな操作感を実現します。
- macOS design や iOS に最適化されたDCCアプリケーションは数少ないのでそこを中心に据えます。
- 入出力フォーマットで USDZ に対応します。XR、モバイルのコンテンツ制作連携に特化したツールを目標に開発を進めます。
Contribute を一読ください。
BSD ライセンスです。
他のソフトのコンテクストを参考に実装を進めていますが統合ソフトは目指しません。
- point, line, face の DrawOverrideを選択オブジェクトから作る
- primitive選択の実現
- 背景とグリッドを描画 /カメラコントロールを同期 /設定画面を表示
- マウスイベントの両立
- libgit2でcommitとrevert
- TextField からオブジェクトの状態を変更
- subview 3Dコントローラー
bug SpriteKit で 透明 HUD の描画 - Blender like な imgui Slider の実装
-
PyRun_SimpleStringFlags と PyObjC の GIL 回避Swift SIL を ctypes から ios python - mouseEvent/TouchEvent と Float をマルチプラットフォーム化
-
WebKit View への書き込みと読み込みvscode や vim に外部化
- Rendererの分離
- arm64 USD を組み込む / USDKit
- interpolation を simdベースに
- Metal2 でモディファイヤ テッセレーションとリダクション + ml/noise/lattice/edit
- Model I/O で書き出せないgeometryとマテリアル以外を後変更
- Server から GET/POST
python build.py
carthage update --verbose --no-use-binaries --use-ssh
https://github.com/libgit2/objective-git/blob/master/README.md
-
break point 先に以下の設定が必要。
Build Settings > Produce Debuging Infomation > YES, include source code
- [Show Debug the navigator] タブの [FPS] をクリック
- dependency viewer
- [Show Debug the Navigator] タブ > [View Frame By Call] を選択
- geometry viewer
- [Capture GPU Frame] を押す
- shader debugger
- [Debug Shader] > [Debug] の順で押す
- enhanced shader profiler
- A11 を搭載した実機でのみ確認可能
- キャプチャ、ラベル、グループ
renderCommandEncoder.label = "hoge"
// capture
MTLCaptureManager.shared().startCapture(device: device)
// ~~
MTLCaptureManager.shared().stopCapture()
// group
renderCommandEncoder.pushDebugGroup("hoge")
// ~~
renderCommandEncoder.popDebugGroup()
metalLayer = self.layer as? CAMetalLayer
if let drawable = metalLayer.nextDrawable()
// https://developer.apple.com/documentation/scenekit/scnnode/1407998-hittestwithsegment
child.hitTestWithSegment(from: <#T##SCNVector3#>, to: <#T##SCNVector3#>, options: <#T##[String : Any]?#>)
func degreesToRadians(_ degrees: Float) -> Float {
return degrees * .pi / 180
}
let sceneKitVertices = vertices.map {
let cube = newNode.flattenedClone()
cube.simdPosition = SCNVector3(x: $0.x, y: $0.y, z: $0.z)
return cube
}
// scenekit で頂点作るパターン
1. ジオメトリから simd vertex position を取得する
2. cube を配置する
scene.rootNode.replaceChildNode(<#T##oldChild: SCNNode##SCNNode#>, with: <#T##SCNNode#>)
let vector:[Float] = [0,1,2,3,4,5,6,7,8,9]
let byteLength = arr1.count*MemoryLayout<Float>.size
let buffer = metalDevice.makeBuffer(bytes: &vector, length: byteLength, options: MTLResourceOptions())
let vector2:[Float] = [10,20,30,40,50,60,70,80,90]
buffer.contents().copyBytes(from: vector2, count: vector2.count * MemoryLayout<Float>.stride)
https://qiita.com/lumis/items/311b8c39d61312957195 https://qiita.com/mss634/items/170d3cb401eee4ec1253 https://stackoverflow.com/questions/15470367/pyeval-initthreads-in-python-3-how-when-to-call-it-the-saga-continues-ad-naus]
https://gist.github.com/rikner/2f2677c56d1adef277d03bdb322eca80