diff --git a/src/java/com/threerings/jme/model/ModelNode.java b/src/java/com/threerings/jme/model/ModelNode.java index 7aed912ed..854cc7d95 100644 --- a/src/java/com/threerings/jme/model/ModelNode.java +++ b/src/java/com/threerings/jme/model/ModelNode.java @@ -64,6 +64,26 @@ public class ModelNode extends Node super(name); } + /** + * Recursively searches the scene graph rooted at this node for a + * node with the provided name. + */ + public Spatial getDescendant (String name) + { + for (int ii = 0, nn = getQuantity(); ii < nn; ii++) { + Spatial child = getChild(ii); + if (child.getName().equals(name)) { + return child; + } else if (child instanceof ModelNode) { + child = ((ModelNode)child).getDescendant(name); + if (child != null) { + return child; + } + } + } + return null; + } + /** * Returns a reference to the model space transform of the node. */ diff --git a/src/java/com/threerings/jme/model/SkinMesh.java b/src/java/com/threerings/jme/model/SkinMesh.java index 8f648fa09..469460d03 100644 --- a/src/java/com/threerings/jme/model/SkinMesh.java +++ b/src/java/com/threerings/jme/model/SkinMesh.java @@ -269,6 +269,7 @@ public class SkinMesh extends ModelMesh BufferUtils.setInBuffer(_normal, nbuf, idx); } } + updateModelBound(); } /** The groups of vertices influenced by different sets of bones. */ diff --git a/src/ms/TRAnimationExporter.mcr b/src/ms/TRAnimationExporter.mcr index ef420ae41..69416eac9 100644 --- a/src/ms/TRAnimationExporter.mcr +++ b/src/ms/TRAnimationExporter.mcr @@ -23,17 +23,17 @@ macroScript TRAnimationExporter category:"File" \ buttonText:"Export Animation as XML..." toolTip:"Export Animation as XML" ( -- Writes a point3-valued attribute to the file - fn writePoint3Attr attr p outFile = - ( - format "%=\"%, %, %\"" attr p.x p.y p.z to:outFile - ) - - -- Writes a quat-valued attribute to the file - fn writeQuatAttr attr q outFile = - ( - format "%=\"%, %, %, %\"" attr q.x q.y q.z q.w to:outFile - ) - + fn writePoint3Attr attr p outFile = + ( + format "%=\"%, %, %\"" attr p.x p.y p.z to:outFile + ) + + -- Writes a quat-valued attribute to the file + fn writeQuatAttr attr q outFile = + ( + format "%=\"%, %, %, %\"" attr q.x q.y q.z q.w to:outFile + ) + -- Writes a single node transform fn writeTransform node outFile = ( format " \n\n" to:outFile + format " \n\n" to:outFile ) -- Writes animation to the named file - fn writeAnimation fileName = - ( - outFile = createfile fileName - format "\n\n" to:outFile - format "\n\n" frameRate to:outFile - local nodes - if selection.count > 0 then ( - nodes = selection - ) else ( - nodes = objects - ) - for i = animationRange.start to animationRange.end do at time i ( - writeFrame nodes outFile - ) - format "\n" to:outFile - close outFile - ) - + fn writeAnimation fileName = + ( + outFile = createfile fileName + format "\n\n" to:outFile + format "\n\n" frameRate to:outFile + local nodes + if selection.count > 0 then ( + nodes = selection + ) else ( + nodes = objects + ) + for i = animationRange.start to animationRange.end do at time i ( + writeFrame nodes outFile + ) + format "\n" to:outFile + close outFile + ) + -- -- Main entry point -- -- Get the target filename persistent global xmlAnimFileName - local fileName - if (xmlAnimFileName == undefined) then ( - fileName = maxFilePath + (getFilenameFile maxFileName) + ".xml" - ) else ( - fileName = xmlAnimFileName - ) + local fileName + if (xmlAnimFileName == undefined) then ( + fileName = maxFilePath + (getFilenameFile maxFileName) + ".xml" + ) else ( + fileName = xmlAnimFileName + ) fileName = getSaveFileName caption:"Select File to Export" \ - filename:fileName types:"XML Animations (*.XML)|*.xml|All|*.*" + filename:fileName types:"XML Animations (*.XML)|*.xml|All|*.*" if fileName != undefined do ( - xmlAnimFileName = fileName - writeAnimation fileName - ) + xmlAnimFileName = fileName + writeAnimation fileName + ) ) diff --git a/src/ms/TRModelExporter.mcr b/src/ms/TRModelExporter.mcr index 35cc5650c..42cfa335e 100644 --- a/src/ms/TRModelExporter.mcr +++ b/src/ms/TRModelExporter.mcr @@ -21,33 +21,33 @@ macroScript TRModelExporter category:"File" \ buttonText:"Export Model as XML..." toolTip:"Export Model as XML" ( - - -- Writes a point3-valued attribute to the file - fn writePoint3Attr attr p outFile = - ( - format "%=\"%, %, %\"" attr p.x p.y p.z to:outFile - ) - - -- Writes a quat-valued attribute to the file - fn writeQuatAttr attr q outFile = - ( - format "%=\"%, %, %, %\"" attr q.x q.y q.z q.w to:outFile - ) - - -- Writes a skinned vertex's bone weights to the file - fn writeSkinBoneWeights skin vidx outFile = - ( - weightCount = skinOps.getVertexWeightCount skin vidx - for i = 1 to weightCount do ( + + -- Writes a point3-valued attribute to the file + fn writePoint3Attr attr p outFile = + ( + format "%=\"%, %, %\"" attr p.x p.y p.z to:outFile + ) + + -- Writes a quat-valued attribute to the file + fn writeQuatAttr attr q outFile = + ( + format "%=\"%, %, %, %\"" attr q.x q.y q.z q.w to:outFile + ) + + -- Writes a skinned vertex's bone weights to the file + fn writeSkinBoneWeights skin vidx outFile = + ( + weightCount = skinOps.getVertexWeightCount skin vidx + for i = 1 to weightCount do ( bone = skinOps.getBoneName skin (skinOps.getVertexWeightBoneID \ skin vidx i) 0 - weight = skinOps.getVertexWeight skin vidx i - format " \n" bone \ + weight = skinOps.getVertexWeight skin vidx i + format " \n" bone \ weight to:outFile - ) - ) - - -- Writes a physiqued vertex's bone weights to the file + ) + ) + + -- Writes a physiqued vertex's bone weights to the file fn writePhysiqueBoneWeights node vidx outFile = ( boneCount = physiqueOps.getVertexBoneCount node vidx @@ -57,40 +57,40 @@ macroScript TRModelExporter category:"File" \ format " \n" bone.name \ weight to:outFile ) - ) - - -- Writes a mesh's vertices to the file - fn writeVertices mesh outFile = - ( - for i = 1 to mesh.numfaces do ( - face = getFace mesh i - local tvface - if mesh.numtverts > 0 do ( - tvface = getTVFace mesh i - ) - for i = 1 to 3 do in coordsys local ( - format " \n" to:outFile - if isProperty mesh #skin then ( - writeSkinBoneWeights mesh.skin face[i] outFile - ) else ( - writePhysiqueBoneWeights mesh face[i] outFile - ) - format " \n" to:outFile - ) else ( - format "/>\n" to:outFile - ) - ) - ) - ) - + ) + + -- Writes a mesh's vertices to the file + fn writeVertices mesh outFile = + ( + for i = 1 to mesh.numfaces do ( + face = getFace mesh i + local tvface + if mesh.numtverts > 0 do ( + tvface = getTVFace mesh i + ) + for i = 1 to 3 do in coordsys local ( + format " \n" to:outFile + if isProperty mesh #skin then ( + writeSkinBoneWeights mesh.skin face[i] outFile + ) else ( + writePhysiqueBoneWeights mesh face[i] outFile + ) + format " \n" to:outFile + ) else ( + format "/>\n" to:outFile + ) + ) + ) + ) + -- Writes a node to the file fn writeNode node outFile = ( @@ -112,62 +112,67 @@ macroScript TRModelExporter category:"File" \ xform = xform * (inverse node.parent.transform) format " parent=\"%\"" node.parent.name to:outFile ) - writePoint3Attr " translation" xform.translationPart \ + if isMesh do ( + xform = preTranslate xform node.objectOffsetPos + xform = preRotate xform node.objectOffsetRot + xform = preScale xform node.objectOffsetScale + ) + writePoint3Attr " translation" xform.translationPart \ outFile writeQuatAttr " rotation" (inverse xform.rotationPart) \ outFile writePoint3Attr " scale" xform.scalePart outFile - if isMesh then ( - format ">\n" to:outFile - if isProperty node #skin do ( - setCommandPanelTaskMode mode:#modify - modPanel.setCurrentObject node.skin node:node - ) - writeVertices node outFile - format " \n\n" kind to:outFile - - ) else ( - format "/>\n\n" to:outFile - ) + if isMesh then ( + format ">\n" to:outFile + if isProperty node #skin do ( + setCommandPanelTaskMode mode:#modify + modPanel.setCurrentObject node.skin node:node + ) + writeVertices node outFile + format " \n\n" kind to:outFile + + ) else ( + format "/>\n\n" to:outFile + ) ) - -- Writes the model to the named file - fn writeModel fileName = - ( - outFile = createfile fileName - format "\n\n" to:outFile - format "\n\n" to:outFile - local nodes - oldsel = selection as array - if selection.count > 0 then ( - nodes = selection - ) else ( - nodes = objects - ) - for node in nodes do ( + -- Writes the model to the named file + fn writeModel fileName = + ( + outFile = createfile fileName + format "\n\n" to:outFile + format "\n\n" to:outFile + local nodes + oldsel = selection as array + if selection.count > 0 then ( + nodes = selection + ) else ( + nodes = objects + ) + for node in nodes do ( writeNode node outFile - ) - select oldsel - format "\n" to:outFile - close outFile - ) - + ) + select oldsel + format "\n" to:outFile + close outFile + ) + -- -- Main entry point -- -- Get the target filename persistent global xmlModelFileName - local fileName - if (xmlModelFileName == undefined) then ( - fileName = maxFilePath + (getFilenameFile maxFileName) + ".xml" - ) else ( - fileName = xmlModelFileName - ) + local fileName + if (xmlModelFileName == undefined) then ( + fileName = maxFilePath + (getFilenameFile maxFileName) + ".xml" + ) else ( + fileName = xmlModelFileName + ) fileName = getSaveFileName caption:"Select File to Export" \ - filename:fileName types:"XML Models (*.XML)|*.xml|All|*.*" + filename:fileName types:"XML Models (*.XML)|*.xml|All|*.*" if fileName != undefined do ( - xmlModelFileName = fileName - writeModel fileName - ) + xmlModelFileName = fileName + writeModel fileName + ) )