Added object offsets to exporters, converted tabs to spaces, added

method to get model nodes anywhere in the hierarchy by name, update 
model bounds in SkinMesh after deforming mesh.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4038 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Andrzej Kapolka
2006-04-20 02:04:56 +00:00
parent 6bf2506f50
commit d544f127a4
4 changed files with 172 additions and 141 deletions
@@ -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.
*/
@@ -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. */
+45 -40
View File
@@ -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 " <transform name=\"%\"" node.name to:outFile
@@ -41,6 +41,11 @@ macroScript TRAnimationExporter category:"File" \
if node.parent != undefined do (
xform = xform * (inverse node.parent.transform)
)
if isKindOf node Editable_Mesh 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
@@ -53,44 +58,44 @@ macroScript TRAnimationExporter category:"File" \
for node in nodes do (
writeTransform node outFile
)
format " </frame>\n\n" to:outFile
format " </frame>\n\n" to:outFile
)
-- Writes animation to the named file
fn writeAnimation fileName =
(
outFile = createfile fileName
format "<?xml version=\"1.0\" standalone=\"yes\"?>\n\n" to:outFile
format "<animation frameRate=\"%\">\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 "</animation>\n" to:outFile
close outFile
)
fn writeAnimation fileName =
(
outFile = createfile fileName
format "<?xml version=\"1.0\" standalone=\"yes\"?>\n\n" to:outFile
format "<animation frameRate=\"%\">\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 "</animation>\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
)
)
+106 -101
View File
@@ -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 " <boneWeight bone=\"%\" weight=\"%\"/>\n" bone \
weight = skinOps.getVertexWeight skin vidx i
format " <boneWeight bone=\"%\" weight=\"%\"/>\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 " <boneWeight bone=\"%\" weight=\"%\"/>\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 " <vertex" to:outFile
writePoint3Attr " location" (getVert mesh face[i]) outFile
writePoint3Attr " normal" (getNormal mesh face[i]) outFile
if tvface != undefined do (
tvert = getTVert mesh tvface[i]
format " tcoords=\"%, %\"" tvert[1] tvert[2] to:outFile
)
if isProperty mesh #skin or isProperty mesh #physique then (
format ">\n" to:outFile
if isProperty mesh #skin then (
writeSkinBoneWeights mesh.skin face[i] outFile
) else (
writePhysiqueBoneWeights mesh face[i] outFile
)
format " </vertex>\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 " <vertex" to:outFile
writePoint3Attr " location" (getVert mesh face[i]) outFile
writePoint3Attr " normal" (getNormal mesh face[i]) outFile
if tvface != undefined do (
tvert = getTVert mesh tvface[i]
format " tcoords=\"%, %\"" tvert[1] tvert[2] to:outFile
)
if isProperty mesh #skin or isProperty mesh #physique then (
format ">\n" to:outFile
if isProperty mesh #skin then (
writeSkinBoneWeights mesh.skin face[i] outFile
) else (
writePhysiqueBoneWeights mesh face[i] outFile
)
format " </vertex>\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 "<?xml version=\"1.0\" standalone=\"yes\"?>\n\n" to:outFile
format "<model>\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 "<?xml version=\"1.0\" standalone=\"yes\"?>\n\n" to:outFile
format "<model>\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 "</model>\n" to:outFile
close outFile
)
)
select oldsel
format "</model>\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
)
)