骨骼動畫是去年打算寫的部分, 但是中間因為工作太忙, 已經拖了一年了. 期間也加了其他東西, 比如對ui做了部分完善.ui對toolbar
button添加了drop down 支援,
一種是dropdown menu,

一種是dropdown property sheet
實作這些控件不難, 但是要做抽象和複用, 接口設計稍微有點複雜. 現在可以把一個iconfig對象綁定到toolbar的button裡了.
這樣儲存這些配置的時候,直接使用iconfig接口就可以了.
貼一個編輯器的配置檔案, 包含了所有tool的配置, 還有界面的配置.
view code
最近的更新主要是添加了memory archive, 用于統一的記憶體cache.
之前已經有memory stream了, 而且是個公開的接口, 使用者可以直接拿來使用.
現在加上了對memory stream的管理. 以後可以使用istream做cache, 比如打開"memory:/xxx/myfile.txt"
并寫入内容, 再交給其他系統當作抽象流使用.
到目前為止, 系統内置了三個路徑, cwd:/, media:/, 和 memory:/
memory stream的管理, 思路也比較簡單, 使用類似prototype的共享模式, 打開相同路徑的stream, 雖然是不同的stream對象,
但是共享buffer. 即每個stream有不同的stream pointer/state,
但是有相同的buffer和size.
另外需要處理的是讀寫鎖. stream的讀寫是互斥的, 讀-讀共享. 目前簡單的使用一個lock
和一個referece count實作.
前幾天終于開始着手做骨骼動畫的導出了. 目前使用igameskin
(igameobject::getigameskin())來導出mehs的blend indices和blendweights.
igameskin是modifier的封裝, 内部是physque modifier或者skin modifier, 至少在導出blend
weights和blend indices的時候,不需要關心其内部細節.
()
另外簡單記錄一下導出的流程:
1.彈出配置視窗, 收集使用者指定的資訊, 比如動畫資訊: 名字,起始幀,結束幀等.
2.enumerate scene 收集到有用的node, 并用線性方式儲存:tab<inode*>,
使用額外的表,儲存所有骨骼節點;
3.使用收集到的node, 初始化igame, 這個時候igame有了一組對象, 這些對象是基于收集到的資訊建立出來的;
4.周遊igame中的對象, 導出mesh (igame_mesh) 和material. mesh中的bone
weights可以通過igameskin取得, bone indices需要使用步驟2中的額外骨骼節點表;
5.導出骨骼資訊和動畫. 骨骼的導出要使用步驟2中收集到的額外骨骼表. 動畫的導出要使用步驟1中的一個或者多個動畫定義.
對于步驟2中骨骼節點的判斷, cal3d ()
裡面使用的是搜尋modifier, 找到physque modifer或者skin modifer,就認為是骨骼節點. ogre
exporter使用的是判斷controller, 如果controller是biped或者biped
slave,就認為是骨骼節點.
個人也不知道哪種更好, 目前兩種都用了, 以後調試的時候再慢慢完善.
需要注意的是, 這裡會收集到所有的骨骼, 如果骨骼沒有用到, 也會被導出. 這是符合需求的. 因為角色的換裝系統中可能會有多餘的骨骼,
在切換mesh的時候才會真正綁定. 而無綁定骨骼的優化(不需要update transform), 以後在runtime再做.
記得gamebryo的無綁定的骨骼并沒有做優化, 所有骨骼會實時更新, 如果不使用bonelod,可能會有點浪費.
目前最大支援4個骨骼混合(一般這麼多夠了), 是以對于影響頂點的骨骼要按weight排序, 取前面最大的4個. 骨骼總量如果超了,
要拆分mesh, 這個還沒仔細想怎麼做, 或許可以參考别的代碼.
後面繼續做skeleton的導出, 主要是bone table和額外的parent-child關系, 然後再做動畫的導出.
一個動畫其實就是一序列的關鍵幀. 一個關鍵幀儲存了目前骨骼的所有骨頭的transform.
配置視窗可能需要添加一個新的控件, 用來定義/預覽(隻讀- 編輯器端) 動畫資訊.
另外, 現在的導出隻是收集中間資訊. 資料格式和壓縮等等這些再最後做,
也打算試下用x10y10z10w2來儲存quaternion, 不使用float32x4.