一樣是工作紀錄 Z_Z
try(destroyDialog allControls )catch() rollout allControls "Morpher to FaceShift" ( --global arr26 = # (0.0, "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n") global arr26frames = #() global arrframes = #() fn compareFN v1 v2 = ( case of ( (v1[1] < v2[1]) : -1 (v1[1] > v2[1]) : 1 default: 0 ) ) fn fnNextKeyFrame = ( try ( nextkeyframe = (trackbar.getNextKeyTime() as string) inextkeyframe = ((substring nextkeyframe 1 (nextkeyframe.count-1)) as integer) if inextkeyframe == undefined then return 0 else return inextkeyframe ) catch ( return 0 ) ) fn fnCurFrameNum = ( return ( ((substring (slidertime as string) 1 ((slidertime as string).count-1)) as Integer) ) ) fn fnFindInArr26Frames iIndex = ( ifoundIndex = -1 for i = 1 to arr26frames.count do ( if arr26frames[i][1] == iIndex then ( ifoundIndex = i return ifoundIndex ) ) return ifoundIndex ) fn fnFindNearestArr26Frames iIndex = ( ifoundIndex = -1 for i = 1 to arr26frames.count do ( if arr26frames[i][1] <= iIndex then ( ifoundIndex = i ) else ( break ) ) return ifoundIndex ) fn dump_arr26frames_data = ( print(arr26frames.count as string) for i = 1 to arr26frames.count do ( for j = 1 to arr26frames[i].count do ( print(arr26frames[i][j] as string) ) print("==========") ) ) fn fnCheckModel = ( animButtonState = true -- check model selected or not. arr = (selection as array) if arr.count == 0 do ( messageBox "Select Head Model !!" return false ) -- check contain Morphers or not try ( for i = 1 to 46 do ( strtmp = ($.morpher[i] as string) if ( substring strtmp (strtmp.count-6) 7) == "__empty" do ( messageBox "Select Model with Morpher!!" return false ) ) ) catch ( messageBox "Select Model with Morpher!!" return false ) return true ) fn fnChangeMorpherSum = ( /*省略*/ ) fn fnChangeMorpher bsid bsvalue = ( /*省略*/ ) fn fnNeutual = ( if fnCheckModel() == true do ( for i = 1 to 26 do ( execute ("allControls.slider" + i as string + ".value = 0.0") execute ("allControls.tb" + i as string + ".text = \"0.0\"") for j = 1 to 46 do ( $.morpher[j].value = 0 ) ) --------------------------------------------------------------- -- save facial motion data into array --------------------------------------------------------------- iIndex = fnCurFrameNum() bfound = false ifoundIndex = -1 for i = 1 to arr26frames.count do ( if arr26frames[i][1] == iIndex then ( bfound = true ifoundIndex = i ) ) if bfound == false then ( append arr26frames (#(iIndex, "N", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n")) qsort arr26frames compareFN ) else ( for i = 3 to arr26frames[ifoundIndex].count do ( arr26frames[ifoundIndex][i] = "n" ) arr26frames[ifoundIndex][2] = "N" ) ) ) fn save_arr26frames_data = ( strfile = getSaveFileName caption:"Save History File:" if strfile == undefined then return false if (getfiles strfile).count == 0 then createFile strfile fs = openFile strfile mode:"w" slidertime = 0 -- save data into file for i = 1 to arr26frames.count do ( -- frame 0 special case if arr26frames[i][1] == 0 then ( for j = 1 to arr26frames[i].count-1 do ( format "%," arr26frames[i][j] to:fs ) format "%\n" arr26frames[i][arr26frames[i].count] to:fs ) else ( while arr26frames[i][1] > fnNextKeyFrame() do ( --supposed this case never happen. if fnNextKeyFrame() <= 0 then exit slidertime = fnNextKeyFrame() ) if arr26frames[i][1] == fnNextKeyFrame() then ( -- save data for j = 1 to arr26frames[i].count-1 do ( format "%," arr26frames[i][j] to:fs ) format "%\n" arr26frames[i][arr26frames[i].count] to:fs ) else ( --do nothing, supposed the keyframe is deleted, so this frame data won't be saved ) ) ) flush fs close fs Messagebox "SAVED !!" ) fn load_arr26frames_data = ( if fnCheckModel() == false then return false strfile = getOpenFileName caption:"Open History File:" if strfile == undefined then return false if (getfiles strfile).count == 0 do ( Messagebox "File does not Exist !!" return false ) fs = openFile strfile mode:"r" -- load data from file iIndex = 1 while eof fs == false do ( strtmp = readline fs --print strtmp arrtmp = filterstring strtmp "," append arr26frames (#(0, "N", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n")) for i = 1 to arrtmp.count do ( if i > 2 then ( arr26frames[iIndex][i] = (arrtmp[i] as string) ) else ( if i == 1 then ( arr26frames[iIndex][i] = (arrtmp[i] as integer) ) else ( arr26frames[iIndex][i] = (arrtmp[i] as string) ) ) ) iIndex = iIndex+1 ) -- change morpher for i = 1 to arr26frames.count do ( slidertime = arr26frames[i][1] if arr26frames[i][2] == "N" then ( for k = 1 to 100 do ( try ( $.morpher[k].value = 0.0 ) catch ( ) ) ) for j = 3 to arr26frames[i].count do ( if arr26frames[i][j] == "n" then continue execute ("allControls.tb" + ( (j-2) as string ) + ".text = \"" + (arr26frames[i][j] as string) + "\"") execute ("allControls.slider" + ( (j-2) as string ) + ".value = " + (arr26frames[i][j] as string) ) fnChangeMorpher (j-2) (arr26frames[i][j] as string) ) ) close fs ) fn fnSumToCurrentFrameMorpher iFrame = ( arrtmp = #(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) for i = 1 to arr26frames.count do ( if arr26frames[i][1] <= iFrame then ( if arr26frames[i][2] == "N" then ( arrtmp = #(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ) for j = 1 to 26 do ( if arr26frames[i][j+2] != "n" then ( --print ((i as string) + "_" + (j as string)) arrtmp[j] = (arr26frames[i][j+2] as float) ) ) ) ) return arrtmp ) fn fn26FacialChange a b = ( iIndex = fnCurFrameNum() ifoundIndex = fnFindInArr26Frames(iIndex) arrtmp = fnSumToCurrentFrameMorpher iIndex if ifoundIndex == -1 then ( ifoundNearestIndex = fnFindNearestArr26Frames(iIndex) if ifoundNearestIndex == -1 then ( append arr26frames (#(iIndex, "T", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n")) arr26frames[arr26frames.count][a+2] = (b as string) qsort arr26frames compareFN ) else ( append arr26frames (#(iIndex, "T", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n", "n")) arr26frames[arr26frames.count][a+2] = (b as string) qsort arr26frames compareFN ) ) try ( if ifoundIndex >= 1 or ifoundNearestIndex >= 1 then itmp = b - arrtmp[a] else ( itmp = b ) ) catch ( itmp = b ) --print (itmp as string) fnChangeMorpher a (itmp as string) if ifoundIndex > 0 then ( arr26frames[ifoundIndex][a+2] = (b as string) ) ) fn fnTBValueChanged a b = ( try ( if trimleft(trimright(b)) == "" do ( return false ) itmp = (b as float) if itmp == undefined do ( return false ) ) catch ( return false ) if fnCheckModel() == true do ( execute ("allControls.slider" + a as string + ".value = " + b) fn26FacialChange a (b as float) ) ) fn fnSliderValueChanged a b = ( if fnCheckModel() == true do ( execute ("allControls.tb" + a as string + ".text = \"" + (b as string) + "\"") fn26FacialChange a b ) ) fn fnSliding = ( iIndex = fnCurFrameNum() arrtmp = fnSumToCurrentFrameMorpher iIndex for i = 1 to 26 do ( try ( execute ("allControls.slider" + i as string + ".value = " + (arrtmp[i] as string)) execute ("allControls.tb" + i as string + ".text = \"" + (arrtmp[i] as string) + "\"") ) catch ( ) ) ) fn fnResetTbSlider = ( fnSliding() ) -- UI button bNeutual "Neutual Head" width:90 align:#left across: 4 on bNeutual pressed do fnNeutual() label labNull "" button bSave "Save Facial Data" width:100 on bSave pressed do save_arr26frames_data() button bLoad "Load Facial Data" width:100 on bLoad pressed do load_arr26frames_data() button bdump "dump" width:100 on bdump pressed do dump_arr26frames_data() label lab1 "SmileClose:" across:6 align:#right edittext tb1 width:50 text:"0.0" on tb1 changed txt do fnTBValueChanged 1 tb1.text slider slider1 orient:#horizontal width:100 range:[-100,100,1] type:#float on slider1 changed v do fnSliderValueChanged 1 slider1.value label lab2 "SmileOpen:" align:#right edittext tb2 width:50 text:"0.0" on tb2 changed txt do fnTBValueChanged 2 tb2.text slider slider2 orient:#horizontal width:100 range:[-100,100,1] type:#float on slider2 changed v do fnSliderValueChanged 2 slider2.value /*省略*/ ) theNewFloater = newRolloutFloater "Morpher to FaceShift" 600 600 addRollout allControls theNewFloater registerTimeCallback allControls.fnResetTbSlider allControls.fnInitFacialFrames()