Hi i'm having a problem using a script i used on 3Ds max 2013 on 2014 its a model exporter for a game when i export it using 2014 it ends up being broken in game any ideas on how i can fix this would be great thanks.
Forum topic · General Scripting
MAXScript Compatibility (3Ds Max 2013 - 2014)
By Luke · 2013-05-24
Description
Comments (4)
Luke · 2013-05-25
Sorry the file i export it is a SCM and the script uses multiply script files i would say it would be the exporter one.
/*
========================================
========================================
*/
fileIn "structs.ms" -- supremecommander structs
filein "supcom2write.ms" -- write to file functions
fn SetDebugHeader h=
(
h.boneoffset = 0
h.wbonecount = 0
h.vertoffset = 0
h.evertoffset = 0
h.vertcount = 0
h.indexoffset = 0
h.indexcount = 0
h.infooffset = 0
h.infocount = 0
h.totalbones = 0
h.xtraoffset = 0
--xtravalue,
h.materialoffset = 0
h.materialnum = 0
)
fn CalculatePadding offset=
(
padding = 16 - (mod offset 16)
if padding < 4 do padding += 16
newoffset = offset+padding
padding -=4
return #(padding, newoffset)
)
fn ExportSupCom2Format G path=
(
format "\t*************\nexporting supcom2 model\n\t*************\n"
--- check if gamemesh is multi surface.
format "numsurfaces: %\n" G.numSurfaces
if G.isAnimated == false do
(
messagebox "GMError: not animated"
return false
)
--- COLLECT DATA
Header = SC2_Header()
SetDebugHeader Header
Header.infocount = 43 --- fixed string "Exported with scmtool www.janvanderweg.com"
Bonelist = SC2_Bonelist()
gm_numbones = G.Hierarchy.bones.count
SKELOFFSET = undefined
VTXLOFFSET = undefined
TRISOFFSET = undefined
XTRAOFFSET = undefined
INFOOFFSET = undefined
MNAMOFFSET = undefined
MATSOFFSET = undefined
boneoffset = 64 -- bonelist offset is 64 bytes, the size of the header.
for i = 1 to gm_numbones do
(
name = G.Hierarchy.bones[i].name
append Bonelist.bones name
append Bonelist.offset boneoffset
boneoffset+= (name.count +1)
)
SKELOFFSET = CalculatePadding boneoffset
Bonelist.padding = SKELOFFSET[1]
Header.boneoffset = SKELOFFSET[2] --boneoffset
Header.wbonecount = G.Hierarchy.bones.count
Header.totalbones = G.Hierarchy.bones.count
-- Collect Bone Data
sc2bones=#()
for i = 1 to gm_numbones do
(
sc2bone = SC2_Bone()
format "bone: % parent: %\n" g.Hierarchy.bonename[i] g.hierarchy.parentindex[i]
sc2bone.name = g.Hierarchy.bonename[i]
sc2bone.nameoffset = Bonelist.offset[i]
node = g.hierarchy.bones[i]
parent = undefined
parentindex = g.hierarchy.parentindex[i] + 1
if parentindex != 0 do parent = g.hierarchy.bones[parentindex] \
transform = node.transform
parent = node.parent
if parent == undefined then
(
--local parentindex = -1
sc2bone.parentboneindex = -1
sc2bone.position = transform.row4
sc2bone.rotation = quat 0 0 0 1
)
else
(
sc2bone.parentboneindex = g.hierarchy.parentindex[i]
--relative position and rotation
sc2bone.position = ( in coordsys parent node.pos )
sc2bone.rotation = ( in coordsys parent node.rotation )
)
Transform.row1 = normalize Transform.row1
Transform.row2 = normalize Transform.row2
Transform.row3 = normalize Transform.row3
iTransform = inverse transform
sc2bone.RestPoseInverse1 = ( normalize [ iTransform.row1[1], iTransform.row2[1], iTransform.row3[1]] )
sc2bone.RestPoseInverse2 = ( normalize [ iTransform.row1[2], iTransform.row2[2], iTransform.row3[2]] )
sc2bone.RestPoseInverse3 = ( normalize [ iTransform.row1[3], iTransform.row2[3], iTransform.row3[3]] )
sc2bone.RestPoseInverse4 = iTransform.row4
append sc2bones sc2bone
)
--- Bonedata size = (108 * totalbones) bytes large
VTXLOFFSET = CalculatePadding (SKELOFFSET[2] + 108 * gm_numbones)
Header.vertoffset = VTXLOFFSET[2]
sc2Verts=#()
for s = 1 to G.numSurfaces do
(
SF = G.Surfaces[s]
for v = 1 to SF.numverts do
(
sc2vert = SC2_Vertex()
gmvert = SF.Vertex[v]
sc2vert.position = gmvert.position
sc2vert.normal = gmvert.normal
sc2vert.tangent = gmvert.tangent
sc2vert.bitangent = gmvert.bitangent
sc2vert.uv1 = gmvert.uvw
sc2vert.uv2 = gmvert.uvw
bl=#()
wl=#()
tw = 0
for j = 1 to 4 do
(
b = gmvert.boneindex[j]
w = gmvert.boneweight[j]
b = finditem G.Hierarchy.bonename b
b -= 1
if gmvert.boneindex[j] == undefined do b = 0
w = (w *255) as integer
tw += w
append bl b
append wl w
)
if tw < 255 do --ensure that all weights total 255
(
toadd = 255 - tw
wl[1] += toadd
)
sc2vert.boneindex = bl
sc2vert.boneweights = wl
append sc2verts sc2vert
)
)
Header.vertcount = sc2Verts.count
TRISOFFSET = CalculatePadding (VTXLOFFSET[2] + 68 * sc2Verts.count)
Header.indexoffset = TRISOFFSET[2]
MaterialData=#()
ioffset = 0
for s = 1 to G.numSurfaces do
(
SF = G.Surfaces[s]
indexref = (SF.tris[1][1] + ioffset - 2) as integer
--format "%\n" indexref
--indexref -= 1
append MaterialData #(SF.tris.count, ioffset, (SF.material.name.count + 1), indexref, SF.NumVerts)
Header.indexcount += SF.tris.count
ioffset += (SF.tris.count * 3)
)
MaterialData[1][4]=0
MaterialData[1][5]=sc2Verts.count
Header.indexcount *= 3
--format "ioffset: %\n" ioffset
XTRAOFFSET = CalculatePadding(TRISOFFSET[2] + ( ioffset *2))
Header.xtraoffset = XTRAOFFSET[2]
--format "xo: %\n" XTRAOFFSET[2]
INFOOFFSET = CalculatePadding(XTRAOFFSET[2] + 4 * sc2Verts.count)
Header.infooffset = INFOOFFSET[2]
MaterialStringSize = 0
for s = 1 to G.numSurfaces do
(
SF = G.Surfaces[s]
MaterialStringSize += SF.material.name.count + 1
)
--format "MaterialStringSize: %\n" MaterialStringSize
MATSOFFSET = CalculatePadding(INFOOFFSET[2] + 80 + MaterialStringSize)
--format "io: %\n" INFOOFFSET[2]
--format "mo: %\n" MATSOFFSET[2]
Header.materialoffset = MATSOFFSET[2]
Header.materialnum = G.numSurfaces
--- WRITE FILE
bstream = fopen path "wb"
SC2_WriteHeader bstream Header
SC2_WriteBonelist bstream Bonelist
SC2_WriteBones bstream sc2bones VTXLOFFSET[1]
SC2_WriteVerts bstream sc2Verts TRISOFFSET[1]
for s = 1 to G.numSurfaces do
(
SF = G.Surfaces[s]
SC2_WriteSurfaceTris bstream SF.tris MaterialData[s][2]
)
SC2_WriteTrisPadding bstream XTRAOFFSET[1]
SC2_WriteXtra bstream sc2verts INFOOFFSET[1]
WriteString bstream "Exported with scmtool www.janvanderweg.com"
for i = 1 to 33 do WriteByte bstream 187
WriteByte bstream 77 -- MNAM
WriteByte bstream 78
WriteByte bstream 65
WriteByte bstream 77
MaterialStringSize = 0
for s = 1 to G.numSurfaces do
(
SF = G.Surfaces[s]
WriteString bstream SF.material.name
)
for i = 1 to MATSOFFSET[1] do WriteByte bstream 187
WriteByte bstream 77 -- MATS
WriteByte bstream 65
WriteByte bstream 84
WriteByte bstream 83
SC2_WriteMATS bstream MaterialData (INFOOFFSET[2] +80) sc2Verts.count
fclose bstream
)
/*
--- Vertex Data
s = G.Surfaces[1] -- assume only one surface
sc2verts=#()
H.indexcount = s.numtris * 3
H.vertcount = s.numverts
for i = 1 to s.numverts do
(
sc2vert = SC2_Vertex()
gmvert = s.Vertex[i]
sc2vert.position = gmvert.position
sc2vert.normal = gmvert.normal
sc2vert.tangent = gmvert.tangent
sc2vert.bitangent = gmvert.bitangent
sc2vert.uv1 = gmvert.uvw
sc2vert.uv2 = gmvert.uvw
bl=#()
wl=#()
tw = 0
for j = 1 to 4 do
(
b = gmvert.boneindex[j]
w = gmvert.boneweight[j]
b = finditem G.Hierarchy.bonename b
b -= 1
if gmvert.boneindex[j] == undefined do b = 0
w = (w *255) as integer
tw += w
append bl b
append wl w
)
if tw < 255 do --ensure that all weights total 255
(
toadd = 255 - tw
wl[1] += toadd
)
sc2vert.boneindex = bl
sc2vert.boneweights = wl
append sc2verts sc2vert
)
--calculate vertexdata padding
--a single vertex entry is 68 bytes. 17*4
indexoffset = H.vertoffset + ( sc2verts.count * 68 )
vertdatapadding = 16 - ( mod indexoffset 16 )
if vertdatapadding < 4 then
(
vertdatapadding += 16
)
indexoffset = ( indexoffset + vertdatapadding )
vertdatapadding -= 4
H.indexoffset = indexoffset
VertexDataPadding = vertdatapadding
--calculate trisdata padding
--a single index entry is 6 bytes. 3*2
xtraoffset = H.indexoffset + ( s.numtris * 6 )
trispadding = 16 - ( mod xtraoffset 16 )
if trispadding < 4 then
(
trispadding += 16
)
xtraoffset += trispadding
trispadding -= 4
H.xtraoffset = xtraoffset
TrisDataPadding = trispadding
-- calculate xtra data padding
-- a single xtra data entry is 4 bytes
infooffset = H.xtraoffset + (sc2verts.count * 4)
xtrapadding = 16 - ( mod infooffset 16)
if xtrapadding < 4 then
(
xtrapadding += 16
)
infooffset += xtrapadding
xtrapadding -= 4
H.infooffset = infooffset
XtraDataPadding = xtrapadding
H.materialoffset = H.infooffset + 96
H.materialnum = 1
-- Write File
bstream = fopen path "wb"
SC2_WriteHeader bstream H
SC2_WriteBonelist bstream Bonelist
SC2_WriteBones bstream sc2bones BoneDataPadding
SC2_WriteVerts bstream sc2verts VertexDataPadding
SC2_WriteTris bstream s.tris TrisDataPadding
SC2_WriteXtra bstream sc2verts XtraDataPadding
WriteString bstream "Exported with scmtool www.janvanderweg.com"
for i = 1 to 33 do WriteByte bstream 187
WriteByte bstream 77 -- MNAM
WriteByte bstream 78
WriteByte bstream 65
WriteByte bstream 77
WriteString bstream "Diffuse"
for i = 1 to 4 do WriteByte bstream 187
WriteByte bstream 77 -- MATS
WriteByte bstream 65
WriteByte bstream 84
WriteByte bstream 83
WriteLong bstream (H.materialoffset - 16)
WriteLong bstream s.numtris
WriteLong bstream 0
WriteLong bstream 0
WriteLong bstream s.numverts
fclose bstream
)
*/
br0t · 2013-05-25
provide more information and maybe people can help you. post the script if you can, tell us about the format you export to.
tassel · 2013-05-26
I guess this is part of some Supreme Commander 2.
The rest of the files can be found here:
That doesnt help
Luke · 2013-05-30
That doesn't help it not supporting max 2014 or having any problem using version later than 2010.