June 30, 2009

Basic 3DS exporter

Posted in Computer Graphics tagged , , , , , , at 11:51 pm by sagito

Yesterday I began my learning journey in the realm of MaxScript. Today, I have finished my basic exporter! Although this scripting language is vastly documented, this documentation is quite confusing at first. But with some patience and thanks to this post (http://forum.hardware.fr/hfr/Graphisme/Divers-5/maxscript-getfacematid-sujet_17077_1.htm) from Nico5779 I have managed to get my exporter working.

So, if anyone needs to look at this script for reference or use it, be my guest… If you want some explanation about what is being done in the code below, I will be most happy to help you. Please note that texture coordinates are still not being considered. I will do that in a later version of this exporter and I shall post it here again afterwards. 😉

Here is the code:

–Start by selecting every thing
select $*

out_name = ((GetDir #export) + “/test.cmf”)
out_file = createfile out_name

–For every one of them
for obj in $ do
(
actualMesh = snapshotAsMesh obj as TriMesh

–Get the number of faces
format “Name: %\n” obj.name to:out_file

numFaces = actualMesh.numfaces
numVerts = actualMesh.numverts

format “Faces: %\n” numFaces to:out_file

format “<vertices %>\n” numVerts to:out_file
for v = 1 to numVerts do
(
vert = getVert actualMesh v
normal = getNormal actualMesh v
format “% % % % % %\n” vert.x vert.y vert.z normal.x normal.y normal.z to:out_file
)
format “</vertices>\n” to:out_file

print “>>> Obtaining face information!\n”

midold = -1
objMaterials = #()

for f = 1 to numFaces do
(
face = getFace actualMesh f
materialClass = classof obj.material

if(materialClass == Standardmaterial) then
(
matname = obj.material
objMaterial = obj.material

if (findItem(objMaterials objMaterial) == 0) then
(
append objMaterials objMaterial
)
)
else if (materialClass != UndefinedClass) then
(
matid = getFaceMatId actualMesh f
matname = obj.material[matid]
objMaterial = obj.material[matid]

if (findItem(objMaterials objMaterial) == 0) then
(
append objMaterials objMaterial
)
)

if(midold != matname) then
(
format “<material %>\n” matname to:out_file
format “% % % % % % % % %\n” objMaterial.ambient.r objMaterial.ambient.g objMaterial.ambient.b objMaterial.diffuse.r objMaterial.diffuse.g objMaterial.diffuse.b objMaterial.specular.r objMaterial.specular.g objMaterial.specular.b to:out_file

format “<ambientmap> % </ambientmap>\n” objMaterial.ambientMap
format “<diffusemap> % </diffusemap>\n” objMaterial.diffuseMap
format “<specularmap> % </specularmap>\n” objMaterial.specularMap

format “</material>\n” to:out_file
midold = matname
)

face3 = getFaceNormal actualMesh f

x = face.x as integer
y = face.y as integer
z = face.z as integer

x2 = face3.x as integer
y2 = face3.y as integer
z2 = face3.z as integer

format “<face>% % % % % %</face>\n” x y z x2 y2 z2 to:out_file
)

for om = 1 to objMaterials.count do
(
for m = 1 to objMaterials[om].maps.count do
(
if (objMaterials[om].maps[m] != undefined) then
(
format “<map %>\n” objMaterials[om].maps[m] to:out_file
format “Filename: %\n” objMaterials[om].maps[m].filename to:out_file
format “</map>\n” to:out_file
)
)
)
)
close out_file

Leave a comment