Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- global TRIEditor
- (
- if TRIEditor != undefined do ( closerolloutfloater TRIEditor )
- TRIEditor = newrolloutfloater "TRI Editor" 250 500
- struct TRIMorph
- (
- mname=0,
- multiplier=0,
- vertices=#()
- )
- struct TRIHeader
- (
- identifier="FR",
- filetype="TRI",
- version="003",
- vertices=0,
- polytris=0,
- polyquads=0,
- unknown2=0,
- unknown3=0,
- uvvertices=0,
- flags=0,
- nummorphs=0,
- nummodifiers=0,
- modvertices=0,
- unknown7=0,
- unknown8=0,
- unknown9=0,
- unknown10=0
- )
- struct TRIFile
- (
- header,
- vertices=#(),
- faces=#(),
- texCoords=#(),
- faceTex=#(),
- morphs=#()
- )
- struct MorphPair
- (
- morphMod,
- channelIndex
- )
- triArray = #()
- currentFile = undefined
- currentIndex = undefined
- fn readTRIFile filePath = ()
- fn writeTRIFile filePath = ()
- fn loadMorphsFromModifiers referenceNode fileInfo morpherName transferProgress = ()
- fn createMorpher referenceNode fileInfo morpherName transferProgress = ()
- fn createMeshFromTRI fileInfo objectName=()
- fn vertexDifferenceToMorph sourceNode targetNode targetMorph = ()
- fn findMorphByName fileInfo morphName = ()
- fn buildMorpherList referenceNode = ()
- fn replaceTRIReference referenceNode fileInfo = ()
- fn findMorpherByName referenceNode morphName = ()
- fn ReadFixedString bstream = ()
- fn WriteFixedString bstream str = ()
- global exportRollout
- global morphEditorRollout
- global triEditorRollout
- global importRollout
- global morphTransferRollout
- fn GetWorkingNode =
- (
- local object = undefined
- try
- (
- object = triEditorRollout.selectReference.object
- if isValidNode object == false then
- (
- triEditorRollout.selectReference.object = undefined
- object = $
- )
- )
- catch
- (
- object = $
- )
- if isValidNode object == false then
- throw "No object selected or referenced."
- return object
- )
- rollout exportRollout "Export"
- (
- editText exportFilePath "Export File Path" labelOnTop:true
- button openFileButton "Browse..."
- button exportButton "Export"
- on openFileButton pressed do
- (
- local exportPath = getSavePath caption:"Select Folder" initialDir:exportFilePath.text
- if exportPath != undefined do
- (
- exportFilePath.text = exportPath + "\\"
- )
- )
- on exportButton pressed do
- (
- local workingDirectory = pathConfig.getCurrentProjectFolder() + "\\"
- if exportFilePath.text != "" then
- workingDirectory = exportFilePath.text
- for i=1 to triArray.count do
- (
- local fileFullPath = workingDirectory + triEditorRollout.loadedTris.items[i]
- local filePath = getFilenamePath fileFullPath
- makeDir filePath all:true
- local fileInfo = triArray[i]
- if filePath != undefined then
- (
- try
- (
- writeTRIFile fileFullPath fileInfo
- )
- catch
- (
- MessageBox("Error writing file " + filePath + " - " + GetCurrentException())
- )
- )
- )
- MessageBox("Export finished.")
- )
- )
- rollout morphEditorRollout "Morph Editor"
- (
- ListBox selectedMorphs "Morphs" labelOnTop:true
- editText editMorphNameEdit "Name" labelOnTop:true
- spinner editMorphScaleEdit "Scale Multiplier" range:[0.0000000001,1000000,0.0000000001] type:#float scale:0.0000000001
- button morphRemoveButton "Remove Selected" tooltip:"Deletes the selected morph from the selected TRI file."
- button morphApplyButton "Apply Changes" tooltip:"Applies the scale and name changes to the selected morph."
- button morphCreateButton "Create" tooltip:"Creates a morph with the specified name and data, if no name is specified it will be given one"
- group "Vertex Data"
- (
- button loadFromSelection "Load From Selection" tooltip:"Loads the vertex data from the selectedobject onto the selected morph."
- button loadFromMorpher "Load From Morpher" tooltip:"Loads the vertex data from the Morpher of the selected object with the same Channel name as the selected morph."
- )
- fn updateMorphSelection tIndex mIndex =
- (
- try
- (
- local morphData = triArray[tIndex].morphs[mIndex]
- if morphData != undefined then
- (
- editMorphNameEdit.text = morphData.mname
- editMorphScaleEdit.value = morphData.multiplier
- )
- )
- catch
- (
- editMorphNameEdit.text = ""
- editMorphScaleEdit.value = 0.0000000001
- )
- )
- fn updateTRISelection tIndex =
- (
- free selectedMorphs.items
- selectedMorphs.items = #()
- try
- (
- for mData in triArray[tIndex].morphs do
- (
- selectedMorphs.items = append selectedMorphs.items mData.mname
- )
- updateMorphSelection tIndex selectedMorphs.selection
- )
- catch
- (
- updateMorphSelection undefined undefined
- )
- )
- on selectedMorphs selected i do
- (
- updateMorphSelection currentIndex i
- )
- on morphApplyButton pressed do
- (
- local mIndex = selectedMorphs.selection
- try
- (
- local newName = editMorphNameEdit.text
- if newName != "" then
- (
- local targetMorph = triArray[currentIndex].morphs[mIndex]
- if targetMorph != undefined then
- (
- targetMorph.mname = newName
- selectedMorphs.selected = newName
- )
- )
- updateMorphSelection currentIndex mIndex
- )
- catch
- MessageBox(GetCurrentException())
- )
- on morphRemoveButton pressed do
- (
- local mIndex = selectedMorphs.selection
- try
- (
- local fileInfo = triArray[currentIndex]
- local targetMorph = fileInfo.morphs[mIndex]
- if targetMorph != undefined then
- (
- fileInfo.morphs = deleteItem fileInfo.morphs mIndex
- selectedMorphs.items = deleteItem selectedMorphs.items mIndex
- fileInfo.nummorphs = fileInfo.morphs.count
- )
- updateMorphSelection currentIndex selectedMorphs.selection
- )
- catch
- MessageBox(GetCurrentException())
- )
- on morphCreateButton pressed do
- (
- try
- (
- local newName = editMorphNameEdit.text
- if newName != "" then
- (
- local fileInfo = triArray[currentIndex]
- local items = selectedMorphs.items
- if (appendIfUnique items newName) == true then
- (
- local newMorph = TRIMorph()
- newMorph.mname = newName
- newMorph.vertices = #()
- for i=0 to fileInfo.header.vertices do
- (
- vert=[0,0,0]
- append newMorph.vertices vert
- )
- append fileInfo.morphs newMorph
- fileInfo.nummorphs = fileInfo.morphs.count
- selectedMorphs.items = items
- )
- else
- (
- throw("Morph " + newName + " already exists.")
- )
- )
- )
- catch
- MessageBox(GetCurrentException())
- )
- on loadFromSelection pressed do
- (
- local mIndex = selectedMorphs.selection
- try
- (
- local targetMorph = triArray[currentIndex].morphs[mIndex]
- if targetMorph == undefined then
- throw "No morph selected."
- local referenceNode = GetWorkingNode()
- if referenceNode == $ then
- throw "Select a working reference in TRI selector, source and destination are the same."
- vertexDifferenceToMorph $ referenceNode targetMorph
- updateMorphSelection currentIndex mIndex
- messagebox("Loaded vertex data from selection onto " + targetMorph.mname)
- )
- catch
- MessageBox(GetCurrentException())
- )
- on loadFromMorpher pressed do
- (
- local mIndex = selectedMorphs.selection
- try
- (
- local targetMorph = triArray[currentIndex].morphs[mIndex]
- if targetMorph == undefined then
- throw "No morph selected."
- local referenceNode = GetWorkingNode()
- if referenceNode == $ then
- throw "Select a working reference in TRI selector, source and destination are the same."
- local morpherPair = findMorpherByName $ targetMorph.mname
- if morpherPair != undefined then
- (
- WM3_MC_SetValue morphPair.morphMod morphPair.channelIndex 100.0
- vertexDifferenceToMorph $ referenceNode targetMorph
- WM3_MC_SetValue morphPair.morphMod morphPair.channelIndex 0.0
- messagebox("Loaded vertex data from target morpher onto " + targetMorph.mname)
- )
- )
- catch
- MessageBox(GetCurrentException())
- )
- )
- rollout triEditorRollout "TRI Selector"
- (
- pickbutton selectReference "Select Reference" autoDisplay:true
- group "Batch"
- (
- progressBar transferProgress
- button applyTRIs "Create Modifiers From Files" tooltip:"Creates a Morph Modifier named after all of the loaded TRI files and adds all of their morphs to the Morph Channels, if the TRI has more than 100 morphs it will create a new Morph Modifier with an appended number. If a reference is selected, all Modifiers will be added to that object. If no reference is selected it will create a new mesh per file."
- button createTRIs "Create Files From Modifiers" tooltip:"(Not recommended) Creates new TRI files from a selected meshes Morph Modifiers. If a selected reference is chosen they will be taken from that object. If no selected reference is chosen, they will be taken from the currently selected object."
- button loadTRIMorphs "Load Morphs From Modifiers" tooltip:"Loads the vertex data from all Modifiers of the selected reference, or currently selected object to their associated TRI morphs if the associated file is loaded."
- )
- ListBox loadedTris "Files" labelOnTop:true
- button removeFile "Remove Selected" tooltip:"Removes the currently selected loaded TRI file."
- button clearFiles "Clear" tooltip:"Removes all loaded TRI files."
- editText renameEdit "Rename" labelOnTop:true
- button applyRename "Apply" tooltip:"Applies the rename to the selected tri file."
- /*dotNetControl tv "TreeView" height:290 align:#center
- fn addChild parent objName =
- (
- local child = parent.Nodes.add objName
- local fgColor = colorMan.getColor #text
- child.forecolor = (dotNetClass "System.Drawing.Color").fromARGB (fgColor.x * 255) (fgColor.y * 255) (fgColor.z * 255)
- return child
- )
- on triEditorRollout open do
- (
- local bgColor = colorMan.getColor #background
- tv.backcolor = (dotNetClass "System.Drawing.Color").fromARGB (bgColor.x * 255) (bgColor.y * 255) (bgColor.z * 255)
- root = addChild tv "Root"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- addChild root "Child1"
- )
- */
- group "Info"
- (
- editText flagsEdit "Flags" readOnly:true
- editText numVerticesEdit "Vertices" readOnly:true
- editText numTriangleEdit "Faces" readOnly:true
- editText numUVVerticesEdit "UV Vertices" readOnly:true
- editText numMorphsEdit "Morphs" readOnly:true
- )
- fn addFile fileName fileInfo =
- (
- loadedTris.items = append loadedTris.items fileName
- append triArray fileInfo
- )
- fn updateTRIInfo tIndex =
- (
- try
- (
- flagsEdit.text = triArray[tIndex].header.flags as string
- numVerticesEdit.text = triArray[tIndex].header.vertices as string
- numTriangleEdit.text = triArray[tIndex].header.polytris as string
- numUVVerticesEdit.text = triArray[tIndex].header.uvvertices as string
- numMorphsEdit.text = triArray[tIndex].header.nummorphs as string
- renameEdit.text = loadedTris.items[tIndex]
- )
- catch
- (
- flagsEdit.text = ""
- numVerticesEdit.text = ""
- numTriangleEdit.text = ""
- numUVVerticesEdit.text = ""
- numMorphsEdit.text = ""
- renameEdit.text = ""
- )
- )
- on loadedTris selected i do
- (
- currentIndex = i
- try
- currentFile = triArray[currentIndex]
- catch
- currentFile = undefined
- updateTRIInfo currentIndex
- morphEditorRollout.updateTRISelection currentIndex
- )
- on loadedTris doubleClicked i do
- (
- currentIndex = i
- try
- currentFile = triArray[currentIndex]
- catch
- currentFile = undefined
- updateTRIInfo currentIndex
- morphEditorRollout.updateTRISelection currentIndex
- try
- createMeshFromTRI currentFile loadedTris.items[currentIndex]
- catch
- MessageBox(GetCurrentException())
- )
- on removeFile pressed do
- (
- triArray = deleteItem triArray loadedTris.selection
- loadedTris.items = deleteItem loadedTris.items loadedTris.selection
- currentIndex = loadedTris.selection
- try
- currentFile = triArray[currentIndex]
- catch
- currentFile = undefined
- updateTRIInfo currentIndex
- morphEditorRollout.updateTRISelection currentIndex
- )
- on clearFiles pressed do
- (
- free triArray
- triArray = #()
- free loadedTris.items
- loadedTris.items = #()
- currentFile = undefined
- currentIndex = undefined
- updateTRIInfo currentIndex
- morphEditorRollout.updateTRISelection currentIndex
- )
- on applyTRIs pressed do
- (
- try
- (
- for i=1 to loadedTris.items.count do
- (
- local referenceNode = GetWorkingNode()
- createMorpher referenceNode triArray[i] loadedTris.items[i] transferProgress
- )
- MessageBox("Finished creating Morphers from TRI file(s).")
- )
- catch
- (
- MessageBox(GetCurrentException())
- )
- )
- on createTRIs pressed do
- (
- try
- (
- local referenceNode = GetWorkingNode()
- local morpherList = buildMorpherList referenceNode
- if morpherList.count == 0 then
- throw "Active node has no morphers attached, or none that match the following pattern: (*.tri)"
- for u in morpherList do
- (
- local newFile = TRIFile()
- newFile.header = TRIHeader()
- local morphList = #()
- for m in u do
- (
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- local morphName = WM3_MC_GetName m c
- local newMorph = TRIMorph()
- newMorph.mname = morphName
- multiplier = 0
- vertices = #()
- append morphList newMorph
- )
- )
- )
- newFile.header.nummorphs = morphList.count
- newFile.header.flags = 1
- newFile.morphs = morphList
- -- Add the reference to the new TRI file, inits remaining data
- replaceTRIReference referenceNode newFile
- local tempName = u[1].name + "_temp"
- snapshot referenceNode name:tempName isSelected:false
- local sourceNode = GetNodeByName tempName
- -- Copies the morpher data into the morph
- for m in u do
- (
- transferProgress.value = 0
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- local morphName = WM3_MC_GetName m c
- local targetMorph = findMorphByName newFile morphName
- if targetMorph != undefined then
- (
- WM3_MC_SetValue m c 100.0
- vertexDifferenceToMorph sourceNode referenceNode targetMorph
- WM3_MC_SetValue m c 0.0
- )
- )
- transferProgress.value = c
- if mod c 10 == 0 then
- windows.processPostedMessages()
- )
- transferProgress.value = 0
- )
- delete sourceNode
- select referenceNode
- -- Add the new TRI to the loaded TRI list
- addFile u[1].name newFile
- )
- MessageBox("Finished creating TRI file(s) from Morphers.")
- )
- catch
- (
- MessageBox(GetCurrentException())
- )
- )
- on loadTRIMorphs pressed do
- (
- try
- (
- for i=1 to loadedTris.items.count do
- (
- local referenceNode = GetWorkingNode()
- loadMorphsFromModifiers referenceNode triArray[i] loadedTris.items[i] transferProgress
- )
- MessageBox("Finished loading Morpher data.")
- )
- catch
- (
- MessageBox(GetCurrentException())
- )
- )
- on selectReference rightclick do
- (
- selectReference.object = undefined
- )
- on applyRename pressed do
- (
- try
- (
- if renameEdit.text != "" then
- loadedTris.selected = renameEdit.text
- )
- catch
- MessageBox("No tri selected.")
- )
- )
- rollout importRollout "Import"
- (
- editText importFilePath "Import File Path" labelOnTop:true
- button importFilePathButton "Browse..." tooltip:"Searches the specified path for TRI files."
- checkbox recursiveImport "Recursive" checked:true tooltip:"Searches all sub directories for TRI files."
- Multilistbox displayedFiles "Files" labelOnTop:true
- button loadSelectedButton "Load Selected" tooltip:"Loads the selected TRI files."
- button clearImport "Clear" tooltip:"Clears all displayed TRI files found in the import path."
- fn getFilesRecursive fileArray currentPath =
- (
- for f in getFiles (currentPath + "*.tri") do
- (
- appendIfUnique fileArray f
- )
- for d in getDirectories (currentPath + "\\*") do
- (
- getFilesRecursive fileArray d
- )
- )
- on importFilePathButton pressed do
- (
- importPath = getSavePath caption:"Select Folder" initialDir:importFilePath.text
- if importPath != undefined do
- (
- importFilePath.text = importPath + "\\"
- allFiles = getFiles (importPath + "\\*.tri")
- if recursiveImport.checked == true then
- (
- for d in getDirectories (importPath + "\\*") do
- (
- getFilesRecursive allFiles d
- )
- )
- sort allFiles
- for i=1 to allFiles.count do
- (
- allFiles[i] = substring allFiles[i] (importFilePath.text.count+1) -1
- )
- displayedFiles.items = allFiles
- )
- )
- on loadSelectedButton pressed do
- (
- if displayedFiles.items.count > 0 and displayedFiles.selection.count > 0 then
- (
- for i in displayedFiles.selection do
- (
- try
- (
- local filePath = importFilePath.text + displayedFiles.items[i]
- local newFile = TRIFile()
- newFile.header = TRIHeader()
- readTRIFile filePath newFile
- triEditorRollout.addFile displayedFiles.items[i] newFile
- currentFile = newFile
- currentIndex = triEditorRollout.loadedTris.selection
- )
- catch
- (
- MessageBox(GetCurrentException())
- )
- )
- MessageBox("Finished loading selected files.")
- )
- )
- on clearImport pressed do
- (
- free displayedFiles.items
- displayedFiles.items = #()
- )
- )
- fn replaceTRIReference referenceNode fileInfo =
- (
- fileInfo.header.vertices=meshop.getnumverts referenceNode
- fileInfo.header.uvvertices=fileInfo.header.vertices
- fileInfo.header.polytris=meshop.getnumfaces referenceNode
- fileInfo.vertices = #()
- fileInfo.faces = #()
- fileInfo.texCoords = #()
- fileInfo.faceTex = #()
- for v=1 to fileInfo.header.vertices do
- (
- mvert=meshop.getVert referenceNode v
- append fileInfo.vertices mvert
- )
- for f=1 to fileInfo.header.polytris do
- (
- mface=getFace referenceNode f
- x=mface.x
- y=mface.y
- z=mface.z
- ol=[x,y,z]
- append fileInfo.faces ol
- )
- --texture vertex
- for vt = 1 to fileInfo.header.vertices do
- (
- tv=getTVert referenceNode vt
- x=tv.x as float
- y=tv.y as float
- z=tv.z as float
- vers=[x,y,z]
- append fileInfo.texCoords vers
- )
- for vt = 1 to fileInfo.header.polytris do
- (
- tv=getTVFace referenceNode vt
- x=tv.x
- y=tv.y
- z=tv.z
- vers=[x,y,z]
- append fileInfo.faceTex vers
- )
- for m in fileInfo.morphs do
- (
- m.vertices = #()
- for i=1 to fileInfo.header.vertices do
- (
- vert=[0,0,0]
- append m.vertices vert
- )
- )
- )
- fn buildMorpherList referenceNode =
- (
- uniqueList = #()
- morpherList = #()
- for m in referenceNode.modifiers do
- if isKindOf m Morpher then
- morpherList = append morpherList m
- parentPattern = "*.tri"
- childPattern = "*.tri_*"
- for m in morpherList do
- (
- if matchPattern m.name pattern:parentPattern ignoreCase:true == true and matchPattern m.name pattern:childPattern ignoreCase:true == false then
- (
- childList = #()
- childList = append childList m
- uniqueList = append uniqueList childList
- )
- )
- for u in uniqueList do
- (
- for a=2 to 5 do
- (
- mName = (u[1].name + "_" + a as string)
- for m in morpherList do
- if m.name == mName then
- u = append u m
- )
- )
- return uniqueList
- )
- fn findMorphByName fileInfo morphName =
- (
- for m in fileInfo.morphs do
- (
- if m.mname == morphName then
- return m
- )
- return undefined
- )
- fn findMorpherByName referenceNode morphName =
- (
- for m in referenceNode.modifiers do
- (
- if isKindOf m Morpher then
- (
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- local localName = WM3_MC_GetName m c
- if localName == morphName then
- (
- local morpherPair = MorphPair()
- morpherPair.morphMod = m
- morpherPair.channelIndex = c
- return morpherPair
- )
- )
- )
- )
- )
- return undefined
- )
- fn vertexDifferenceToMorph sourceNode targetNode targetMorph =
- (
- local numVerts = meshop.getnumverts sourceNode
- local maxVertexDisplacement = 0
- for v=1 to numVerts do
- (
- local sVert = meshop.getVert sourceNode v
- local tVert = meshop.getVert targetNode v
- local mx = (tVert.x - sVert.x)
- local my = (tVert.y - sVert.y)
- local mz = (tVert.z - sVert.z)
- if abs(mx) > maxVertexDisplacement then
- maxVertexDisplacement = abs(mx)
- if abs(my) > maxVertexDisplacement then
- maxVertexDisplacement = abs(my)
- if abs(mz) > maxVertexDisplacement then
- maxVertexDisplacement = abs(mz)
- targetMorph.vertices[v] = [mx, my, mz]
- )
- local baseDifference = maxVertexDisplacement / 0x7FFF
- for v=1 to numVerts do
- (
- targetMorph.vertices[v].x /= baseDifference
- targetMorph.vertices[v].y /= baseDifference
- targetMorph.vertices[v].z /= baseDifference
- )
- targetMorph.multiplier = baseDifference
- )
- fn loadMorphsFromModifiers referenceNode fileInfo morpherName transferProgress =
- (
- if fileInfo.header.vertices != meshop.getnumverts referenceNode then
- (
- if QueryBox (morpherName + " has a different vertex count from the reference node (" + referenceNode.name + "), would you like to replace it?") title:"Vertex mismatch" then
- (
- replaceTRIReference referenceNode fileInfo
- )
- else
- return false
- )
- local tempName = (morpherName + "_" + (random 0x000000 0xFFFFFF) as string)
- snapshot referenceNode name:tempName isSelected:false
- local sourceNode = GetNodeByName tempName
- local matchingMorphers = buildMorpherList referenceNode
- for u in matchingMorphers do
- (
- for m in u do
- (
- transferProgress.value = 0
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- local morphName = WM3_MC_GetName m c
- local targetMorph = findMorphByName fileInfo morphName
- if targetMorph != undefined then
- (
- WM3_MC_SetValue m c 100.0
- vertexDifferenceToMorph sourceNode referenceNode targetMorph
- WM3_MC_SetValue m c 0.0
- )
- )
- transferProgress.value = c
- if mod c 10 == 0 then
- windows.processPostedMessages()
- )
- transferProgress.value = 0
- )
- )
- delete sourceNode
- select referenceNode
- return true
- )
- fn createMeshFromTRI fileInfo objectName=
- (
- o=mesh vertices:fileInfo.vertices faces:fileInfo.faces
- setNumTVerts o fileInfo.texCoords.count
- for i = 1 to fileInfo.header.uvvertices do
- (
- setTVert o i fileInfo.texCoords[i]--set texture vertice ID- to 3point array
- )
- buildTVFaces o--enable texture faces arrays
- for i = 1 to fileInfo.header.polytris do
- (
- setTVFace o i fileInfo.faceTex[i]
- )
- o.name=objectName
- obj = GetNodeByName objectName
- select obj
- modPanel.addModToSelection (UVW_Xform ()) ui:on
- obj.modifiers[#UVW_Xform].V_Flip = 1
- macros.run "Modifier Stack" "Convert_to_Mesh"
- )
- fn createMorpher referenceNode fileInfo morpherName transferProgress =
- (
- if fileInfo.morphs.count > 0 then
- (
- transferProgress.value = 0
- local iterations = 1
- if ((mod fileInfo.morphs.count 100) > 0) or ((fileInfo.morphs.count / 100) > 1) then
- (
- iterations = (fileInfo.morphs.count / 100) + 1
- )
- local start = referenceNode
- for iter=1 to iterations do
- (
- local newMorpher = Morpher()
- newMorpher.name = morpherName
- if iter > 1 then
- newMorpher.name += "_" + iter as string
- addModifier start newMorpher
- local begin = (((iter-1) * 100) + 1) as integer
- local end = (iter * 100) as integer
- if iter == iterations and (mod fileInfo.morphs.count 100) > 0 then -- Add the remaining entries
- (
- end = ((iter-1) * 100) + (mod fileInfo.morphs.count 100) as integer
- )
- for i=begin to end do
- (
- local modChannel = (mod i 100) as integer
- if (mod i 100) == 0 then
- modChannel = (iter * 100) as integer
- local tempName = fileInfo.morphs[i].mname
- snapshot start name:tempName isSelected:false
- local newMesh = GetNodeByName tempName
- for v=1 to fileInfo.vertices.count do
- (
- local mvert=meshop.getVert newMesh v
- local a=mvert.x + fileInfo.morphs[i].vertices[v].x * fileInfo.morphs[i].multiplier
- local b=mvert.y + fileInfo.morphs[i].vertices[v].y * fileInfo.morphs[i].multiplier
- local c=mvert.z + fileInfo.morphs[i].vertices[v].z * fileInfo.morphs[i].multiplier
- local morpi=[a,b,c]
- meshop.setVert newMesh v morpi
- )
- WM3_MC_BuildFromNode newMorpher modChannel newMesh
- delete newMesh
- select start
- transferProgress.value = ((i as float / fileInfo.morphs.count as float) * 100.0) as integer
- if mod i 10 == 0 then
- windows.processPostedMessages()
- )
- )
- transferProgress.value = 0
- select start
- )
- )
- fn writeTRIFile filePath fileInfo =
- (
- local f
- try
- (
- ascii_encoder = dotNetObject "System.Text.ASCIIEncoding"
- bytes = ascii_encoder.GetBytes ( "FRTRI003" )
- f=fopen filePath "wb"
- WriteByte f bytes[1] #unsigned
- WriteByte f bytes[2] #unsigned
- WriteByte f bytes[3] #unsigned
- WriteByte f bytes[4] #unsigned
- WriteByte f bytes[5] #unsigned
- WriteByte f bytes[6] #unsigned
- WriteByte f bytes[7] #unsigned
- WriteByte f bytes[8] #unsigned
- WriteLong f fileInfo.header.vertices #unsigned
- WriteLong f fileInfo.header.polytris #unsigned
- WriteLong f fileInfo.header.polyquads #unsigned
- WriteLong f fileInfo.header.unknown2 #unsigned
- WriteLong f fileInfo.header.unknown3 #unsigned
- WriteLong f fileInfo.header.uvvertices #unsigned
- WriteLong f fileInfo.header.flags #unsigned
- WriteLong f fileInfo.header.nummorphs #unsigned
- WriteLong f fileInfo.header.nummodifiers #unsigned
- WriteLong f fileInfo.header.modvertices #unsigned
- WriteLong f fileInfo.header.unknown7 #unsigned
- WriteLong f fileInfo.header.unknown8 #unsigned
- WriteLong f fileInfo.header.unknown9 #unsigned
- WriteLong f fileInfo.header.unknown10 #unsigned
- for a=1 to fileInfo.header.vertices do
- (
- WriteFloat f fileInfo.vertices[a].x
- WriteFloat f fileInfo.vertices[a].y
- WriteFloat f fileInfo.vertices[a].z
- )
- for b=1 to fileInfo.header.polytris do
- (
- x=fileInfo.faces[b].x
- y=fileInfo.faces[b].y
- z=fileInfo.faces[b].z
- ver = [x-1, y-1, z-1]
- WriteLong f ver.x #unsigned
- WriteLong f ver.y #unsigned
- WriteLong f ver.z #unsigned
- )
- if fileInfo.header.uvvertices > 0 then
- (
- for d=1 to fileInfo.header.uvvertices do
- (
- WriteFloat f fileInfo.texCoords[d].x
- WriteFloat f fileInfo.texCoords[d].y
- )
- )
- for el=1 to fileInfo.header.polytris do
- (
- x=fileInfo.faceTex[el].x
- y=fileInfo.faceTex[el].y
- z=fileInfo.faceTex[el].z
- ver = [x-1, y-1, z-1]
- WriteLong f ver.x #unsigned
- WriteLong f ver.y #unsigned
- WriteLong f ver.z #unsigned
- )
- for k=1 to fileInfo.header.nummorphs do
- (
- WriteFixedString f fileInfo.morphs[k].mname
- WriteFloat f fileInfo.morphs[k].multiplier
- for p=1 to fileInfo.header.vertices do
- (
- WriteShort f fileInfo.morphs[k].vertices[p].x #signed
- WriteShort f fileInfo.morphs[k].vertices[p].y #signed
- WriteShort f fileInfo.morphs[k].vertices[p].z #signed
- )
- )
- fclose f
- )
- catch
- (
- fclose f
- throw
- )
- )
- fn readTRIFile filePath fileInfo =
- (
- local f
- try
- (
- fileInfo.header = TRIHeader()
- f = fopen filePath "rb"
- fseek f 0x0008 #seek_cur
- fileInfo.header.vertices=ReadLong f #unsigned
- fileInfo.header.polytris=ReadLong f #unsigned--// number of tri faces
- fileInfo.header.polyquads=ReadLong f #unsigned--// number of quad faces
- fileInfo.header.unknown2=ReadLong f #unsigned
- fileInfo.header.unknown3=ReadLong f #unsigned
- fileInfo.header.uvvertices=ReadLong f #unsigned--// number of uv map vertices
- fileInfo.header.flags=ReadLong f #unsigned--// flags?
- --// bit 0 must be 1 or crashes
- --// bit 1 true=don't display face
- ---// bit 2 no effect?
- fileInfo.header.nummorphs=ReadLong f #unsigned--// number of morphs
- fileInfo.header.nummodifiers=ReadLong f #unsigned--// number of modifiers
- fileInfo.header.modvertices=ReadLong f #unsigned--// number of vertices to replace by modifiers
- fileInfo.header.unknown7=ReadLong f #unsigned
- fileInfo.header.unknown8=ReadLong f #unsigned
- fileInfo.header.unknown9=ReadLong f #unsigned
- fileInfo.header.unknown10=ReadLong f #unsigned
- for a=1 to fileInfo.header.vertices do
- (
- x=ReadFloat f
- y=ReadFloat f
- z=ReadFloat f
- ver = [x, y, z]
- append fileInfo.vertices ver
- )
- for b=1 to fileInfo.header.polytris do
- (
- x=ReadLong f #unsigned
- y=ReadLong f #unsigned
- z=ReadLong f #unsigned
- ver = [x+1, y+1, z+1]
- append fileInfo.faces ver
- )
- if fileInfo.header.uvvertices > 0 then
- (
- for c=1 to fileInfo.header.uvvertices do
- (
- u=ReadFloat f
- v=ReadFloat f
- ver = [u,v,0]
- append fileInfo.texCoords ver
- )
- )
- for d=1 to fileInfo.header.polytris do
- (
- x=ReadLong f #unsigned
- y=ReadLong f #unsigned
- z=ReadLong f #unsigned
- ver = [x+1, y+1, z+1]
- append fileInfo.faceTex ver
- )
- if fileInfo.header.nummorphs > 0 then
- (
- for i=1 to fileInfo.header.nummorphs do
- (
- morphData=TRIMorph()
- morphData.mname=ReadFixedString f
- morphData.multiplier=ReadFloat f
- for l=1 to fileInfo.header.vertices do
- (
- x=ReadShort f #signed
- y=ReadShort f #signed
- z=ReadShort f #signed
- vers=[x ,y ,z ]
- append morphData.vertices vers
- )
- append fileInfo.morphs morphData
- )
- )
- fclose f
- )
- catch
- (
- fclose f
- throw
- )
- )
- fn ReadFixedString bstream =
- (
- local str = ""
- local len =ReadLong bstream #unsigned
- for i = 1 to len do
- (
- str += bit.intAsChar (ReadByte bstream #unsigned)
- )
- return str
- )
- fn WriteFixedString bstream str =
- (
- if str.count == 0 then
- (
- WriteLong bstream 0 #unsigned
- )
- else
- (
- WriteLong bstream (str.count+1) #unsigned
- for i = 1 to str.count do
- (
- WriteByte bstream (bit.CharAsInt(str[i])) #unsigned
- )
- WriteByte bstream 0 #unsigned
- )
- )
- rollout morphTransferRollout "Morph Transfer"
- (
- pickbutton selectOriginal "Original head" autoDisplay:true
- pickbutton selectTransfer "Target Head" autoDisplay:true
- button bakeTransfer "Transfer"
- progressBar transferProgress
- on selectOriginal rightclick do
- (
- selectOriginal.object = undefined
- )
- on selectTransfer rightclick do
- (
- selectTransfer.object = undefined
- )
- fn GetOriginalHead =
- (
- local object = undefined
- try
- (
- object = selectOriginal.object
- if isValidNode object == false then
- selectOriginal.object = undefined
- )
- catch
- (
- object = undefined
- )
- if isValidNode object == false then
- throw "No original object selected."
- return object
- )
- fn GetTransferHead =
- (
- local object = undefined
- try
- (
- object = selectTransfer.object
- if isValidNode object == false then
- selectTransfer.object = undefined
- )
- catch
- (
- object = undefined
- )
- if isValidNode object == false then
- throw "No transfer object selected."
- return object
- )
- on bakeTransfer pressed do
- (
- try
- (
- local originalHead = GetOriginalHead()
- local transferHead = GetTransferHead()
- if originalHead == transferHead then
- throw "Original head is the same as the transfer head."
- local totalMorphers = 0
- local morphers = #()
- for i=originalHead.modifiers.count to 1 by -1 do
- (
- local m = originalHead.modifiers[i]
- if isKindOf m Morpher then
- (
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- totalMorphers += 1
- )
- )
- )
- )
- if totalMorphers == 0 then
- throw "Original head has no Morpher with data to transfer."
- local currentMorpher = 0
- transferProgress.value = 0
- for i=originalHead.modifiers.count to 1 by -1 do
- (
- m = originalHead.modifiers[i]
- if isKindOf m Morpher then
- (
- local newMorpher = Morpher()
- newMorpher.name = m.name
- addModifier transferHead newMorpher
- for c=1 to 100 do
- (
- if WM3_MC_HasData m c then
- (
- local morphName = WM3_MC_GetName m c
- WM3_MC_SetValue m c 100.0
- snapshot transferHead name:morphName
- local newMesh = GetNodeByName morphName
- WM3_MC_BuildFromNode newMorpher c newMesh
- WM3_MC_SetValue m c 0.0
- delete newMesh
- currentMorpher += 1
- transferProgress.value = ((currentMorpher as float / totalMorphers as float) * 100.0) as integer
- if mod currentMorpher 10 == 0 then
- windows.processPostedMessages()
- )
- )
- )
- )
- transferProgress.value = 0
- )
- catch
- (
- MessageBox(GetCurrentException())
- )
- )
- )
- addRollout importRollout TRIEditor
- addRollout exportRollout TRIEditor rolledup:true
- addRollout triEditorRollout TRIEditor rolledup:true
- addRollout morphEditorRollout TRIEditor rolledup:true
- addRollout morphTransferRollout TRIEditor rolledup:true
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement