01-30-2024, 09:18 PM
(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.