14 from pyfbsdk_additions
import *
21 self.lSysOnUIIdle = self.lSystem.OnUIIdle
26 self.SelectedList = []
27 self.CacheStopTime = self.lSysPlayer.ZoomWindowStop
28 self.DuplicatedModel =
False
29 self.DisableEvaluationAfterCache =
True
30 self.EnableInPlaceCacheDeformer =
True
32 self.TabTypes = (
'Characters',
'Story Tracks')
35 def getDefaultPath(self):
37 get default path from loaded file. If path is None, use
38 the current working directory
41 self.DefaultPath = os.getcwd()
43 self.DefaultPath = os.path.dirname(
FBApplication().FBXFileName)
45 def resetButtons(self):
47 Restore the default state of the cache and deformer buttons
50 self.bDeformer.State = 0
53 def update_EditInfo(self, text):
54 self.Edit_Info.Caption = repr(text)
57 def refresh_All(self):
59 Refresh gui elements. Have GUI elements retreive values from variables
61 self.refresh_CharacterList()
62 self.refresh_StoryTrackList()
63 self.refresh_DefaultPath()
64 self.update_EditInfo(
"Refresh Complete")
67 def refresh_CharacterList(self):
69 Refresh character list
71 self.CharacterListWidget.Items.removeAll()
72 for lCh
in self.lScene.Characters:
73 self.CharacterListWidget.Items.append(lCh.LongName)
76 def refresh_StoryTrackList(self):
78 Refresh story track list, limited to character tracks for simplicity
80 self.StoryTrackListWidget.Items.removeAll()
81 for lTrack
in self.lSysStory.RootFolder.Tracks:
82 if lTrack.Type == FBStoryTrackType.kFBStoryTrackCharacter:
83 self.StoryTrackListWidget.Items.append(
"%s (%s)" %(lTrack.Name,lTrack.Character.LongName))
86 def refresh_DefaultPath(self):
88 Refresh the default cache save to path
90 self.Edit_DefaultPath.Text = self.DefaultPath
93 def getSelectedList(self):
95 collect selected from active tab
97 self.SelectedList = []
99 currentTab = self.tab.TabPanel.Items[self.tab.TabPanel.ItemIndex]
100 if currentTab ==
'Characters':
101 for lCharacter
in self.lScene.Characters:
102 lName = lCharacter.LongName
103 for lItemIndex
in range(len(self.CharacterListWidget.Items)):
104 if self.CharacterListWidget.IsSelected(lItemIndex)
and self.CharacterListWidget.Items[lItemIndex] == lName:
105 self.SelectedList.append(lCharacter)
107 for lTrack
in self.lSysStory.RootFolder.Tracks:
108 if lTrack.Type == FBStoryTrackType.kFBStoryTrackCharacter:
109 lName = lTrack.Character.LongName
110 for lIndex, lItem
in enumerate(self.StoryTrackListWidget.Items):
111 if self.StoryTrackListWidget.IsSelected(lIndex)
and lTrack.Character.LongName == lName:
112 self.SelectedList.append(lTrack.Character)
115 def activeCharacterEvaluation(self, pCharacterList, pEnable):
117 function to enable/disable the character evaluation (control rig, or story track)
119 for pCharacter
in pCharacterList:
120 pCharacter.Active = pEnable
121 for lTrack
in self.lSysStory.RootFolder.Tracks:
122 if lTrack.Type == FBStoryTrackType.kFBStoryTrackCharacter
and lTrack.Character == pCharacter:
123 lTrack.Mute = (
not pEnable)
126 def activeCharacterInPlaceCacheDeformer(self, pEnable):
128 Active Character Skin Model In place cache deformer
130 self.getSelectedList()
131 if len(self.SelectedList) == 0:
132 self.update_EditInfo(
"Nothing selected for caching!")
136 for lCh
in self.SelectedList:
138 lCh.GetSkinModelList(lSkinModelList)
140 for lSkinModel
in lSkinModelList:
141 self.update_EditInfo(lSkinModel.LongName)
142 lSkinModel.PointCacheDeformable = pEnable
145 self.lSysPlayer.GotoStart()
146 self.activeCharacterEvaluation(self.SelectedList, (
not pEnable));
149 def recordIdleCallback(self, pObject, pEventName):
151 Record Idle Callback to control the record period
153 if self.lSysPlayer.IsPlaying:
154 if self.lSystem.LocalTime.GetSecondDouble() >= self.CacheStopTime.GetSecondDouble() :
155 self.lSysOnUIIdle.Remove(self.recordIdleCallback)
156 self.lSysPlayer.GotoStart()
157 if self.DisableEvaluationAfterCache ==
True:
158 self.activeCharacterEvaluation(self.SelectedList,
False)
161 def configurePointCacheManager(self):
163 Configure the Point Cache Manager
165 self.lSysPcMgr.ApplyGlobalTransform =
True
166 self.lSysPcMgr.AlwaysAskForPath =
False
167 self.lSysPcMgr.DefaultPath = self.DefaultPath
171 def list_OnChange(self, pList, event):
175 for lItemIndex
in range(len(pList.Items)):
176 if pList.IsSelected(lItemIndex):
177 self.update_EditInfo(pList.Items[lItemIndex] +
" has been selected!")
180 def refreshAll_OnClick(self,control=None, event=None):
187 def duplicateCheckBox_OnClick(self, pCheckBox, event):
191 self.DuplicatedModel = (pCheckBox.State != 0)
192 self.update_EditInfo(self.DuplicatedModel)
195 def disableEvalBtn_OnClick(self, pCheckBox, event):
199 self.DisableEvaluationAfterCache = (pCheckBox.State != 0)
200 self.update_EditInfo(self.DisableEvaluationAfterCache)
203 def cacheStartTime_OnChange(self, pTimeCode, event):
207 self.CacheStopTime = pTimeCode.Value
208 self.update_EditInfo(self.CacheStopTime)
211 def defaultPathEdit_OnChange(self, pEdit, event):
215 self.DefaultPath = pEdit.Text
218 def defaultPath_OnClick(self, control, event):
223 lFp.Caption =
"Choose save location for Point Cache files"
224 lFp.Path = self.DefaultPath
228 self.DefaultPath = lFp.Path
230 self.refresh_DefaultPath()
233 def cache_OnClick(self, control, event):
239 self.getSelectedList()
241 if len(self.SelectedList) == 0:
242 self.update_EditInfo(
"No Character selected for caching!")
246 self.update_EditInfo(
"Create point cache for Characters:")
247 for l
in self.SelectedList:
248 self.update_EditInfo(l.LongName)
249 l.GetSkinModelList(lSkinModelList)
251 if len(lSkinModelList) == 0:
252 self.update_EditInfo(
"No Recordable Skin Models Selected")
255 self.update_EditInfo(
"Create point cache for skin models:")
256 for lSkinModel
in lSkinModelList:
257 self.update_EditInfo(lSkinModel.LongName)
259 self.configurePointCacheManager()
261 self.lSysPcMgr.Models.removeAll()
262 for lSkinModel
in lSkinModelList:
263 self.update_EditInfo(lSkinModel.LongName)
264 self.lSysPcMgr.Models.append(lSkinModel)
266 self.lSysPlayer.GotoStart()
267 self.lSysPlayer.Record(
True,
False)
268 self.lScene.Evaluate()
270 if not self.lSysPlayer.IsRecording:
273 if self.DuplicatedModel:
274 self.lSysPcMgr.ApplyCacheOnNewModel =
True
276 self.update_EditInfo(
"Cache No Duplication")
277 self.lSysPcMgr.ApplyCacheOnNewModel =
False
279 self.activeCharacterEvaluation(self.SelectedList,
False)
280 self.lScene.Evaluate()
281 self.lSysPcMgr.SetTransformReference()
283 self.activeCharacterEvaluation(self.SelectedList,
True)
284 self.lScene.Evaluate()
286 self.lSysOnUIIdle.Add(self.recordIdleCallback)
288 self.lSysPlayer.Play()
291 def enableCache_OnClick(self, control, event):
295 self.activeCharacterInPlaceCacheDeformer(
True)
298 def disableCache_OnClick(self, control, event):
302 self.activeCharacterInPlaceCacheDeformer(
False)
308 def populateLayout(self, mainLyt):
310 Layout management & callback hookup
316 mainLyt.AddRegion(
"main",
"main", x,y,w,h)
319 mainLyt.SetControl(
"main", grid)
322 label.Caption =
"Choose from a list of characters or a list of character story tracks"
323 grid.AddRange(label, 0, 0, 0, 4)
326 bRefresh.Caption =
"Refresh"
327 bRefresh.Justify = FBTextJustify.kFBTextJustifyCenter
328 grid.Add(bRefresh, 0, 4)
329 bRefresh.OnClick.Add(self.refreshAll_OnClick)
333 for name
in self.TabTypes:
340 l.AddRegion(name,
'', x, y, w, h)
344 l.SetControl(
'test',scroll)
347 lLabel.Caption =
"Choose %s(s) for operation:" % name
350 if name ==
'Characters':
351 self.CharacterListWidget =
FBList()
352 self.CharacterListWidget.OnChange.Add(self. list_OnChange)
353 self.CharacterListWidget.Style = FBListStyle.kFBVerticalList
354 self.CharacterListWidget.MultiSelect =
True
355 l.Add(self.CharacterListWidget, 141)
357 self.StoryTrackListWidget =
FBList()
358 self.StoryTrackListWidget.OnChange.Add(self. list_OnChange)
359 self.StoryTrackListWidget.Style = FBListStyle.kFBVerticalList
360 self.StoryTrackListWidget.MultiSelect =
True
361 l.Add(self.StoryTrackListWidget, 141)
365 self.tab.SetContent(0)
366 self.tab.TabPanel.TabStyle = 0
367 grid.AddRange(self.tab, 1, 7, 0, 4)
370 grid.AddRange(lPCOptionsLayout,8, 8, 0, 4)
373 bDupMod.Caption =
"Duplicate Model"
374 bDupMod.Style = FBButtonStyle.kFBCheckbox
375 bDupMod.Justify = FBTextJustify.kFBTextJustifyCenter
376 bDupMod.State = self.DuplicatedModel
377 lPCOptionsLayout.Add(bDupMod,105)
378 bDupMod.OnClick.Add(self.duplicateCheckBox_OnClick)
381 bDeactivate.Caption =
"Deactive Eval After Cache"
382 bDeactivate.Style = FBButtonStyle.kFBCheckbox
383 bDeactivate.Justify = FBTextJustify.kFBTextJustifyCenter
384 bDeactivate.State = self.DisableEvaluationAfterCache
385 lPCOptionsLayout.Add(bDeactivate,160)
386 bDeactivate.OnClick.Add(self.disableEvalBtn_OnClick)
389 lLabel.Caption =
"Cache End Time:"
390 lLabel.Justify = FBTextJustify.kFBTextJustifyRight
391 lPCOptionsLayout.Add(lLabel, 90)
394 eCacheEndTime.Caption =
"Cache End Time"
395 eCacheEndTime.Value = self.CacheStopTime
396 eCacheEndTime.OnChange.Add(self.cacheStartTime_OnChange)
397 lPCOptionsLayout.Add(eCacheEndTime,60)
400 grid.AddRange(lPCPathLayout,9, 9, 0, 4)
402 lLabel.Caption =
"Cache file path"
403 lLabel.Justify = FBTextJustify.kFBTextJustifyRight
404 lPCPathLayout.Add(lLabel,75)
406 self.Edit_DefaultPath =
FBEdit()
407 self.Edit_DefaultPath.OnChange.Add(self.defaultPathEdit_OnChange)
408 lPCPathLayout.AddRelative(self.Edit_DefaultPath, 1)
411 bFileDialog.Caption =
"..."
412 bFileDialog.Justify = FBTextJustify.kFBTextJustifyCenter
413 lPCPathLayout.Add(bFileDialog,22)
414 bFileDialog.OnClick.Add(self.defaultPath_OnClick)
417 bProcessCache.Caption =
"Process Cache"
418 bProcessCache.Justify = FBTextJustify.kFBTextJustifyCenter
419 grid.AddRange(bProcessCache,10, 10, 0, 4)
420 bProcessCache.OnClick.Add(self.cache_OnClick)
423 lLabel.Caption =
"View as:"
424 lLabel.Justify = FBTextJustify.kFBTextJustifyRight
425 grid.Add(lLabel,11, 0)
430 self.bCache.Caption =
"Cache"
431 self.bCache.Style = FBButtonStyle.kFB2States
432 self.bCache.Look = FBButtonLook.kFBLookPush
433 self.bCache.Justify = FBTextJustify.kFBTextJustifyCenter
434 grid.AddRange (self.bCache,11, 11, 1, 2)
435 self.bCache.OnClick.Add(self.enableCache_OnClick)
440 self.bDeformer.Caption =
"Deformer"
441 self.bDeformer.Style = FBButtonStyle.kFB2States
442 self.bDeformer.Look = FBButtonLook.kFBLookPush
443 self.bDeformer.Justify = FBTextJustify.kFBTextJustifyCenter
444 grid.AddRange(self.bDeformer,11, 11, 3, 4)
445 self.bDeformer.OnClick.Add(self.disableCache_OnClick)
449 group.Add(self.bCache)
450 group.Add(self.bDeformer)
453 self.Edit_Info.Caption =
''
454 grid.AddRange(self.Edit_Info,12, 12, 0, 4)
464 Tool creation will serve as the hub for all other controls