Users browsing this thread: 1 Guest(s)
Ripping from My Om Nom Models
#19
(12-26-2015, 03:43 PM)TGE Wrote: Okay, I guess the script works for those files too
Code:
-- 3ds max maxscript
-- My Om Nom .msh importer
-- By TGE, contact me in case there's any issues ;p

gc()
clearlistener()
fn ReadUShort fstream =
(
    return (ReadShort fstream #unsigned)
)

fn ReadULong fstream =
(
    return (ReadLong fstream #unsigned)
)

fn ReadUByte fstream =
(
    return (ReadByte fstream #unsigned)
)

fn ReadVector2 fstream =
(
    return [(ReadFloat fstream), ((ReadFloat fstream) * -1)+1, 0]
)

fn ReadVector3 fstream =
(
    return [(ReadFloat fstream), (ReadFloat fstream), (ReadFloat fstream)]
)

fn GetOpenFile =
(
    clearlistener()
    local fname = getOpenFileName \
    caption:"Open Model" \
    types:"My Om Nom Model (*.msh)|*.msh" \
    historyCategory:"MYOMNOM Object Presets"
    if (fname == undefined) then
    (
        return undefined
    )
    else
    (
        local f = fopen fname "rb"
        return f
    )
)

fn ReadArrayInfo fstream =
(
    struct ArrayInfoStruct
    (
        type,
        elementCount,
        arrayLength
    )
    
    local a = ArrayInfoStruct()
    a.type = ReadUShort fstream
    fseek fstream 0x5 #seek_cur
    a.elementCount = ReadULong fstream
    a.arrayLength = ReadULong fstream
    return a
)

positionArray = #()
texCoordArray = #()
normalArray = #()
faceArray = #()

file = GetOpenFile()

if (file != undefined) then
(
    info = ReadArrayInfo file
    for i = 1 to info.elementCount do
    (
        positionArray[i] = ReadVector3 file
    )

    info = ReadArrayInfo file
    for i = 1 to info.elementCount do
    (
        texCoordArray[i] = ReadVector2 file
    )

    info = ReadArrayInfo file
    for i = 1 to info.elementCount do
    (
        normalArray[i] = ReadVector3 file
    )

    info = ReadArrayInfo file
    fseek file info.arrayLength #seek_cur

    info = ReadArrayInfo file
    fseek file info.arrayLength #seek_cur

    subMeshCount = ReadUShort file
    fseek file 0x01 #seek_cur

    for i = 1 to subMeshCount do
    (
        info = ReadArrayInfo file
        
        for j = 1 to (info.elementCount / 3) do
        (
            faces = [(ReadUShort file) + 1, (ReadUShort file) + 1, (ReadUShort file) + 1]
            append faceArray [faces[3], faces[2], faces[1]]
        )
        
        fseek file 0x07 #seek_cur
    )

    msh = mesh vertices:positionArray faces:faceArray
    msh.numTVerts = positionArray.count
    buildTVFaces msh
    for j = 1 to texCoordArray.count do setTVert msh j texCoordArray[j]
    for j = 1 to faceArray.count do setTVFace msh j faceArray[j]
    for j = 1 to msh.numfaces do setFaceSmoothGroup msh j 1
        
    max modify mode
    select msh
    addmodifier msh (Edit_Normals ()) ui:off
    msh.Edit_Normals.MakeExplicit selection:#{1..normalArray.count}
    EN_convertVS = msh.Edit_Normals.ConvertVertexSelection
    EN_setNormal = msh.Edit_Normals.SetNormal
    normID = #{}

    for v = 1 to normalArray.count do(
        free normID
        EN_convertVS #{v} &normID
        for id in normID do EN_setNormal id normalArray[v]
    )
    maxOps.CollapseNodeTo msh 1 true -- Collapse the Edit Normals modifier
)
gc()

Can you make a msh converter for blender too please.
There's models from an animation which is considered lost media in the game.
Reply
Thanked by:


Messages In This Thread
RE: Ripping from My Om Nom Models - by OS-PRIME - 12-10-2015, 06:22 PM
RE: Ripping from My Om Nom Models - by eureka - 12-17-2015, 02:18 PM
RE: Ripping from My Om Nom Models - by OS-PRIME - 12-25-2015, 01:14 PM
RE: Ripping from My Om Nom Models - by TGE - 12-25-2015, 06:57 PM
RE: Ripping from My Om Nom Models - by TGE - 12-26-2015, 05:08 AM
RE: Ripping from My Om Nom Models - by TGE - 12-26-2015, 03:43 PM
RE: Ripping from My Om Nom Models - by Korkeus - 01-30-2024, 09:18 PM
RE: Ripping from My Om Nom Models - by Luiluix - 12-25-2019, 12:47 AM
RE: Ripping from My Om Nom Models - by Korkeus - 02-09-2024, 06:39 PM

Forum Jump: