精選文章

SmallBurger Asset Home

  SmallBurger

2010年10月14日 星期四

從第一次不上手到上手經驗分享-Terrain Deform UnDo ReDo功能實作

  從來沒有做過編輯器UnDo、ReDo功能的我,最近在研究要如何實作相關功能,原本以為這是很簡單的東西,在研發的過程中,發現其實有一些細節要注意,尤其是在Terrain Rect Base Edit的部份,以下就是相關心得分享。

  1. Double Stack架構,請參考下圖:


    其中最上面一排,為將編輯過程中的結果依序放入UnDoContainer之中。第二排則是執行UnDo的狀況(將UnDoContainer的記錄取出來執行,並放入ReDoContainer中),最後一個結果是UnDoContainer已經沒有記錄了,不執行任何處理。第三排是執行ReDo的狀況(將ReDoContainer的記錄取出來執行,並放入UnDoContainer中),最後一個結果是ReDoContainer已經沒有記錄了,不執行任何處理。

  2. 在一般的情況下,UnDo(Pop from UnDo stack, Execute, Push to ReDo stack)、ReDo(Pop form ReDo stack, Excute, Push to UnDo stack)都可以用這種方式完成,但牽涉到Rect Base Edit就不行了,請參考下圖:

    由上圖得知每一次的Deform的操作是針對一個特定區塊做編輯,雖然First Deform的After Deform視覺結果和Second Deform的Beform Deform相同,但編輯的區塊卻不同,所以必需當成不同的資料做儲存。

  3. Pair Record Data實際運作狀況,請參考下圖:

    由上圖得知,BeforeData和AfterData都是存在同一筆記錄,當執行UnDo時,就取用BeforeData來執行,而ReDo時,就取用AfterData來執行。

  4. PS:在實作的過程中,發現其實用一個Vector也可以做到上述的功能,而且也可以滿足清單選擇記錄的需求,但Vector一直在增加記錄時,應該會造成效能上的問題,且清單選擇ReDo記錄這樣的功能,並不常見,因此還是決定採用Double Stack的做法。

革命尚未成功,同志仍需努力…

沒有留言:

張貼留言