ScriptSpot

Forum topic · General Scripting

MAXScript Compatibility (3Ds Max 2013 - 2014)

By Luke · 2013-05-24

Description

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.

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.

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.