About this site
ScriptSpot is a diverse online community of artists and developers who come together to find and share scripts that empower their creativity with 3ds Max. Our users come from all parts of the world and work in everything from visual effects to gaming, architecture, students or hobbyists.
Comments
Sorry
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
)
*/
provide more information and
provide more information and maybe people can help you. post the script if you can, tell us about the format you export to.
Never get low & slow & out of ideas
I guess this is part of some
I guess this is part of some Supreme Commander 2.
The rest of the files can be found here:
http://www.janvanderweg.com/supcom2/
/ Raymond
That doesnt help
That doesn't help it not supporting max 2014 or having any problem using version later than 2010.