afie9329
05-15-2009, 02:11 PM
I'm trying to write a little export tool for a game framework me and my friend are building. So far so good. Everything works except for determining the normals. I've Googled around and searched these forums but couldn't find an answer to my question. To be honest, this is my first Maxscript attempt. Comments on my code are also welcome.
--Export Animated Lego Mesh v0.3.0
macroscript ExportAnimatedLegoMesh buttontext:"Export *.alm" tooltip:"Export selected as Animated Lego Mesh" category:"Alles Kan Beter" (
file = undefined
legoMesh = undefined
mountHead = $MountHead
start = undefined
end = undefined
function SerializeMesh = (
numberOfFaces = polyop.getnumfaces LegoMesh
for face = 1 to numberOfFaces do (
format "<Face>\n" to:file
verticesFace = polyop.getfaceverts legoMesh face
faceNormal = polyop.getfacenormal legoMesh face
faceMap = polyop.getmapface legoMesh 1 face
numberOfVerticesFace = verticesFace.count
for vertex = 1 to numberOfVerticesFace do (
position = polyop.getvert legoMesh verticesFace[vertex]
uv = polyop.getmapvert legoMesh 1 faceMap[vertex]
format "<VertexPNT px=\"%\" py=\"%\" pz=\"%\" nx=\"%\" ny=\"%\" nz=\"%\" u=\"%\" v=\"%\"/>\n" position.x position.z position.y faceNormal.x faceNormal.z faceNormal.y uv.x (1 - uv.y) to:file
)
format "</Face>\n" to:file
)
)
function SerializeAnimation = (
startFrame = slidertime
for frame = start to end do (
format "<Frame>\n" to:file
slidertime = frame
SerializeMesh()
if mountHead != undefined then (
format "<MountHead>\n" to:file
position = mountHead.position
rot = mountHead.rotation as eulerangles
format "<VertexPR px=\"%\" py=\"%\" pz=\"%\" rx=\"%\" ry=\"%\" rz=\"%\"/>\n" position.x position.z position.y rot.x rot.y rot.z to:file
format "</MountHead>\n" to:file
)
format "</Frame>\n" to:file
)
slidertime = startFrame
)
rollout TimelineRangePicker "Timeline Range Picker" (
spinner snrStart "Start:" type:#integer range:[-1000, 1000, 0]
spinner snrEnd "End:" type:#integer range:[-1000, 1000, 100]
button btnOk "Ok"
on btnOk pressed do (
start = snrStart.value
end = snrEnd.value
if end - start >= 0 then (
format "<?xml version=\"1.0\"?>\n" to:file
format "<AnimatedLegoMesh>\n" to:file
SerializeAnimation()
format "</AnimatedLegoMesh>" to:file
close file
destroydialog TimelineRangePicker
messagebox "Export complete." title:"Info"
) else (
messagebox "No frames to export." title:"Error"
)
)
)
if selection.count == 1 then (
legoMesh = selection[1]
if classof legoMesh == editable_poly or classof legoMesh == polymeshobject then (
filePath = getsavefilename caption:"Save as" types:"Animated Lego mesh (*.alm)|*.alm"
if filePath != undefined then (
file = createfile filePath
if file != undefined then (
createdialog TimelineRangePicker
) else (
messagebox "Unable to create file." title:"Error"
)
) else (
messagebox "Unable to create file." title:"Error"
)
) else (
messagebox "Incompatible data type." title:"Error"
)
) else (
if selection.count < 1 then (
messagebox "Nothing to export." title:"Error"
) else (
messagebox "Can not export more then one object at a time." title:"Error"
)
)
)
Thanks in advance.
--Export Animated Lego Mesh v0.3.0
macroscript ExportAnimatedLegoMesh buttontext:"Export *.alm" tooltip:"Export selected as Animated Lego Mesh" category:"Alles Kan Beter" (
file = undefined
legoMesh = undefined
mountHead = $MountHead
start = undefined
end = undefined
function SerializeMesh = (
numberOfFaces = polyop.getnumfaces LegoMesh
for face = 1 to numberOfFaces do (
format "<Face>\n" to:file
verticesFace = polyop.getfaceverts legoMesh face
faceNormal = polyop.getfacenormal legoMesh face
faceMap = polyop.getmapface legoMesh 1 face
numberOfVerticesFace = verticesFace.count
for vertex = 1 to numberOfVerticesFace do (
position = polyop.getvert legoMesh verticesFace[vertex]
uv = polyop.getmapvert legoMesh 1 faceMap[vertex]
format "<VertexPNT px=\"%\" py=\"%\" pz=\"%\" nx=\"%\" ny=\"%\" nz=\"%\" u=\"%\" v=\"%\"/>\n" position.x position.z position.y faceNormal.x faceNormal.z faceNormal.y uv.x (1 - uv.y) to:file
)
format "</Face>\n" to:file
)
)
function SerializeAnimation = (
startFrame = slidertime
for frame = start to end do (
format "<Frame>\n" to:file
slidertime = frame
SerializeMesh()
if mountHead != undefined then (
format "<MountHead>\n" to:file
position = mountHead.position
rot = mountHead.rotation as eulerangles
format "<VertexPR px=\"%\" py=\"%\" pz=\"%\" rx=\"%\" ry=\"%\" rz=\"%\"/>\n" position.x position.z position.y rot.x rot.y rot.z to:file
format "</MountHead>\n" to:file
)
format "</Frame>\n" to:file
)
slidertime = startFrame
)
rollout TimelineRangePicker "Timeline Range Picker" (
spinner snrStart "Start:" type:#integer range:[-1000, 1000, 0]
spinner snrEnd "End:" type:#integer range:[-1000, 1000, 100]
button btnOk "Ok"
on btnOk pressed do (
start = snrStart.value
end = snrEnd.value
if end - start >= 0 then (
format "<?xml version=\"1.0\"?>\n" to:file
format "<AnimatedLegoMesh>\n" to:file
SerializeAnimation()
format "</AnimatedLegoMesh>" to:file
close file
destroydialog TimelineRangePicker
messagebox "Export complete." title:"Info"
) else (
messagebox "No frames to export." title:"Error"
)
)
)
if selection.count == 1 then (
legoMesh = selection[1]
if classof legoMesh == editable_poly or classof legoMesh == polymeshobject then (
filePath = getsavefilename caption:"Save as" types:"Animated Lego mesh (*.alm)|*.alm"
if filePath != undefined then (
file = createfile filePath
if file != undefined then (
createdialog TimelineRangePicker
) else (
messagebox "Unable to create file." title:"Error"
)
) else (
messagebox "Unable to create file." title:"Error"
)
) else (
messagebox "Incompatible data type." title:"Error"
)
) else (
if selection.count < 1 then (
messagebox "Nothing to export." title:"Error"
) else (
messagebox "Can not export more then one object at a time." title:"Error"
)
)
)
Thanks in advance.
