Page 1 of 1
meshes in xml form
Posted: Thu Apr 10, 2014 2:17 am
by stiefelss
What I'm ultimately trying to do is port meshes and textures from another game into Pandora, but first, I need to know how to work with the .xml files in Video/Meshes/x. How would one go about using a 3d mesh editor such as Blender to import and export such files? I've tried converting the xml's to obj's but that didn't work.
Re: meshes in xml form
Posted: Fri Apr 11, 2014 9:19 pm
by stiefelss
I can just hear the wind carrying the tumbleweeds down the scorching, lifeless desert that is this forum.
Re: meshes in xml form
Posted: Sun Apr 13, 2014 12:49 am
by mrowka
SephiRok wrote:Meshes were made in 3ds Max, but we have a custom format.
As for getting xml meshes to blender you would need to use xmlconverter, its somewhere on blender forum
But it wont help since the custom format, you cant even preview them with.
Re: meshes in xml form
Posted: Mon Apr 14, 2014 12:49 pm
by void
Hi guys,
We indeed use a simple custom XML format for meshes and animations. Our artist works with 3D Studio Max, and runs those two Max scripts to export the data:
Mesh Exporter:
Code: Select all
--
-- Mesh Exporter 2.0
-- Copyright (C) 2013 by Proxy Studios.
-- All rights reserved.
--
selectedObjects = selection as array
exportedObjectsCount = 0
for obj in selectedObjects do (
-- Only export non-hiden meshes for non-bone geometry objects.
if not obj.isHidden and superClassOf obj == GeometryClass and not isKindOf obj BoneGeometry do (
msh = snapshotAsMesh obj
-- Collect influencing bones.
bones = #()
for skn in obj.modifiers do (
if iskindof skn Skin do (
SetCommandPanelTaskMode mode:#modify
ModPanel.SetCurrentObject skn
for v = 1 to msh.numVerts do (
numBones = skinOps.getVertexWeightCount skn v
for b = 1 to numBones do (
boneID = skinOps.getVertexWeightBoneId skn v b
boneName = skinOps.GetBoneName skn boneID 0
if (findItem bones boneName) == 0 do (
append bones boneName
)
)
)
)
)
sort bones
outputPath = obj.name + ".xml"
outputFile = createfile outputPath
format "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" to:outputFile
format "<mesh>\n" to:outputFile
-- Export vertices.
for v = 1 to msh.numVerts do (
vert = getVert msh v
format "\t<vertex id=\"%\" x=\"%\" y=\"%\" z=\"%\"/>\n" (v - 1) vert.x vert.y vert.z to:outputFile
)
-- Export texture coordinates.
for vt = 1 to msh.numTVerts do (
tVert = getTVert msh vt
format "\t<textureCoordinate id=\"%\" x=\"%\" y=\"%\"/>\n" (vt - 1) tVert.x tVert.y to:outputFile
)
-- Export normals.
for f = 1 to msh.numFaces do (
normals = meshop.getFaceRNormals msh f
format "\t<normal id=\"%\" x=\"%\" y=\"%\" z=\"%\"/>\n" ((f - 1) * 3 + 0) normals[1].x normals[1].y normals[1].z to:outputFile
format "\t<normal id=\"%\" x=\"%\" y=\"%\" z=\"%\"/>\n" ((f - 1) * 3 + 1) normals[2].x normals[2].y normals[2].z to:outputFile
format "\t<normal id=\"%\" x=\"%\" y=\"%\" z=\"%\"/>\n" ((f - 1) * 3 + 2) normals[3].x normals[3].y normals[3].z to:outputFile
)
-- Export bone weights and bones.
for skn in obj.modifiers do (
if iskindof skn Skin do (
SetCommandPanelTaskMode mode:#modify
ModPanel.SetCurrentObject skn
-- Export bone weights.
for v = 1 to msh.numVerts do (
numBones = skinOps.getVertexWeightCount skn v
format "\t<boneWeights id=\"%\">\n" (v - 1) to:outputFile
for b = 1 to numBones do (
boneID = skinOps.getVertexWeightBoneId skn v b
boneName = skinOps.GetBoneName skn boneID 0
boneWeight = skinOps.getVertexWeight skn v b
if boneWeight > 0.0 do (
index = (findItem bones boneName) - 1
format "\t\t<bone id=\"%\" weight=\"%\"/>\n" index boneWeight to:outputFile
)
)
format "\t</boneWeights>\n" to:outputFile
)
-- Export bones.
for b = 1 to bones.count do (
boneName = bones[b]
format "\t<bone id=\"%\" name=\"%\">\n" (b - 1) boneName to:outputFile
boneObject = getNodeByName boneName
p = in coordsys world boneObject.pivot
format "\t\t<position x=\"%\" y=\"%\" z=\"%\"/>\n" p.x p.y p.z to:outputFile
r = in coordsys world boneObject.rotation
format "\t\t<rotation x=\"%\" y=\"%\" z=\"%\" w=\"%\"/>\n" r.x r.y r.z r.w to:outputFile
s = boneObject.scale
format "\t\t<scale x=\"%\" y=\"%\" z=\"%\"/>\n" s.x s.y s.z to:outputFile
format "\t</bone>\n" (b - 1) to:outputFile
)
)
)
-- Export faces.
for f = 1 to msh.numFaces do (
face = getFace msh f
tvFace = getTVFace msh f
faceX = int(face.x) - 1
faceY = int(face.y) - 1
faceZ = int(face.z) - 1
tvFaceX = int(tvFace.x) - 1
tvFaceY = int(tvFace.y) - 1
tvFaceZ = int(tvFace.z) - 1
format "\t<face id=\"%\">\n" (f - 1) to:outputFile
format "\t\t<vertex id=\"%\"/>\n" faceX to:outputFile
format "\t\t<vertex id=\"%\"/>\n" faceY to:outputFile
format "\t\t<vertex id=\"%\"/>\n" faceZ to:outputFile
format "\t\t<textureCoordinate id=\"%\"/>\n" tvFaceX to:outputFile
format "\t\t<textureCoordinate id=\"%\"/>\n" tvFaceY to:outputFile
format "\t\t<textureCoordinate id=\"%\"/>\n" tvFaceZ to:outputFile
format "\t\t<normal id=\"%\"/>\n" ((f - 1) * 3 + 0) to:outputFile
format "\t\t<normal id=\"%\"/>\n" ((f - 1) * 3 + 1) to:outputFile
format "\t\t<normal id=\"%\"/>\n" ((f - 1) * 3 + 2) to:outputFile
format "\t</face>\n" to:outputFile
)
format "</mesh>\n" to:outputFile
delete msh
close outputFile
exportedObjectsCount = exportedObjectsCount + 1
)
)
message = "Exported " + exportedObjectsCount as string + " mesh(es)."
messageBox message title:"Mesh Exporter"
Animation Exporter:
Code: Select all
--
-- Animation Exporter 2.0
-- Copyright (C) 2013 by Proxy Studios.
-- All rights reserved.
--
selectedObjects = selection as array
exportedObjectsCount = 0
for obj in selectedObjects do (
-- Only export animations for non-bone geometry objects.
if superClassOf obj == GeometryClass and not isKindOf obj BoneGeometry do (
msh = snapshotAsMesh obj
-- Collect influencing bones.
bones = #()
for skn in obj.modifiers do (
if iskindof skn Skin do (
SetCommandPanelTaskMode mode:#modify
ModPanel.SetCurrentObject skn
for v = 1 to msh.numVerts do (
numBones = skinOps.getVertexWeightCount skn v
for b = 1 to numBones do (
boneID = skinOps.getVertexWeightBoneId skn v b
boneName = skinOps.GetBoneName skn boneID 0
boneWeight = skinOps.getVertexWeight skn v b
if (findItem bones boneName) == 0 do (
append bones boneName
)
)
)
)
)
sort bones
-- Only export animations for objects influenced by bones.
if (bones.count > 0) do (
outputPath = obj.name + ".xml"
outputFile = createfile outputPath
format "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" to:outputFile
frames = int(animationRange.end - animationRange.start + 1)
format "<animation frames=\"%\" frameRate=\"%\">\n" frames frameRate to:outputFile
-- Export bones.
for b = 1 to bones.count do (
format "\t<bone id=\"%\" name=\"%\">\n" (b - 1) bones[b] to:outputFile
boneObject = getNodeByName bones[b]
-- Export frames.
for f = animationRange.start to animationRange.end do (
at time f (
fCurrent = int(f)
format "\t\t<frame id=\"%\">\n" fCurrent to:outputFile
p = in coordsys world boneObject.pivot
format "\t\t\t<position x=\"%\" y=\"%\" z=\"%\"/>\n" p.x p.y p.z to:outputFile
r = in coordsys world boneObject.rotation
format "\t\t\t<rotation x=\"%\" y=\"%\" z=\"%\" w=\"%\"/>\n" r.x r.y r.z r.w to:outputFile
s = boneObject.scale
format "\t\t\t<scale x=\"%\" y=\"%\" z=\"%\"/>\n" s.x s.y s.z to:outputFile
format "\t\t</frame>\n" to:outputFile
)
)
format "\t</bone>\n" (b - 1) to:outputFile
)
format "</animation>\n" to:outputFile
close outputFile
exportedObjectsCount = exportedObjectsCount + 1
)
delete msh
)
)
message = "Exported " + exportedObjectsCount as string + " animation(s)."
messageBox message title:"Animation Exporter"
Note that the exported mesh file is outdated/verbose, the game will automatically convert it into a format that is faster to parse on load.
Re: meshes in xml form
Posted: Mon Apr 14, 2014 2:29 pm
by mrowka
Thanks void, its time to learn modeling

Re: meshes in xml form
Posted: Mon Apr 14, 2014 3:25 pm
by void
A bold endeavour, mrowka, but I have faith in you!
Re: meshes in xml form
Posted: Mon Apr 14, 2014 3:44 pm
by mrowka
Only question is that i need to use 3dmax or i can use that scripts somewhere in blender ?
Re: meshes in xml form
Posted: Tue Apr 29, 2014 2:58 pm
by stiefelss
Is there any way to import the meshes and animations? Being able to export things is pretty useless if I can't import things to make sure it's going to work as intended.
Re: meshes in xml form
Posted: Tue Apr 29, 2014 4:16 pm
by void
I'm afraid not at the moment, but our artist said he'll write a short tutorial / offer a sample 3D studio file over the next days to illustrate how it's done. With a bit of programming knowledge one can see fairly easily how the format works by examining the script files or the mesh/animation files (especially the simpler ones like Meshes/WorkshopGround.xml for the plane below units in the workshop view). Coordinate system wise we use X front, Y left, and Z up, just like the Source engine. Units are centered on X and Y, the ground they stand on being Z = 0. Weapons are attached to all bones named "Weapon0", "Weapon1", etc.
Re: meshes in xml form
Posted: Wed Apr 30, 2014 1:04 am
by stiefelss
Right, a tutorial is needed. I hate to sound like an idiot, but those 3dxml files are all Greek to me.
Re: meshes in xml form
Posted: Sat May 10, 2014 5:55 am
by stiefelss
Anyone have an update on that tutorial?
Re: meshes in xml form
Posted: Thu Jun 05, 2014 5:22 am
by stiefelss
stiefelss wrote:Anyone have an update on that tutorial?
