1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Нехватка памяти

Тема в разделе "MAXScript", создана пользователем Zmiy, 23 дек 2005.

Модераторы: Savin Denis
  1. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Вот написал утилиту для записи моделей в файл. С маленькими моделями всё происходит нормально, а с более большими (800 вершин) - нет. Модель частично записывается, а потом происходит ошибка. Видимо это связано с нехваткой памяти. Подскажите пожалуста, как можно решить эту проблему? Может надо как-то выделить функцию в отдельный поток?
     
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Нужно разбираться, приводи код
     
  3. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Я решил проблему тем, что напихал в функцию побольше вызовов gc(). То есть теперь ошибок нет, но на время проведения операций макс виснет. Нельзя ли, повторюсь, выделить функцию в отдельный поток (тут, думаю, не важен код самой функции), да ещё хотелось бы с прогресс-баром? Возможно ли такое в принципе? Чё-то в хелпе не нашёл...
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    >>Я решил проблему тем, что напихал в функцию побольше вызовов gc()
    очень рад за тебя :)) не кувалдой так топором

    нет понятия потока в макс скрипте
    >>на время проведения операций макс виснет
    Какой нехороший :)))
    как рендер включиш - виснет,
    начнеш записывать большой файл - виснет
    а тронеш вобще упадет!


    >>ещё хотелось бы с прогресс-баром?
    в каком месте тебе хотелось прогресс барр ?

    (небольшое лирическое отступление сдобреное невербальными сигналоми пиии-и#$#$! )
    я не собираюсь угадавать что ты пишеш и хочеш
    буть добр если хочеш получить точный ответ
    подробно описать что делаеш,
    что хочеш получить
    что не получется
    Мне если чесно не доставляет удовольствие вытягивать по капле информацию клещями
    Кому это нужно мне или тебе ?

    >>Возможно ли такое в принципе?
    Да, впринципе
     
  5. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Нужно чтобы макс не зависал, а нормально реагировал на действия пользователя

    Вот код

    utility mmt "Max Models Taker"
    (

    -------------------------------------------------------

    local CreateOMF_File, CreateOLF_File
    global TheFile
    global Obj, NumObj, ObjClass, NumBones, BoneWeight, ModSkin, iMod, ModName, Type, Scl, Dist, i, j
    global ErrorString= "Error! The file don't created correct!"

    -------------------------------------------------------

    Rollout CreateOMF "Create an *.omf file"
    (
    label eSave "Save as:" align: #Left
    EditText eFile Text: "C:\\Model1.omf" FileName: "Model1.omf" align: #Left FieldWidth: 100 across: 2
    button eReview "..." align: #Right
    checkbox eTakeFrozen "Take frozen objects" checked: true
    label eScl "Scale, %:" align: #Left
    spinner eScale range: [1.0, 1000.0, 100.0] align: #Left FieldWidth: 100
    checkbox eBonePre "Use bones prefix:" checked: false
    EditText eBonePrefix Text: "Bone" align: #Left FieldWidth: 100 Enabled: false
    label eNote "Note: Registr has matter!!!" align: #Left
    button eCreate "Create File!"

    on eReview pressed do
    (
    try eFile.Text= GetSaveFileName Types: "*.omf files |*.omf" catch ()
    )

    on eBonePre changed true do eBonePrefix.Enabled= true
    on eBonePre changed false do eBonePrefix.Enabled= false

    on eCreate pressed do
    (
    try CreateOMF_File ()
    catch
    (
    SetCommandPanelTaskMode mode: #utility
    ClearSelection ()
    MessageBox ErrorString Beep: false
    Close TheFile
    gc ()
    )
    )
    )

    Rollout CreateOLF "Create an *.olf file"
    (
    label eSave "Save as:" align: #Left
    EditText eFile Text: "C:\\Level1.olf" FileName: "Level1.olf" align: #Left FieldWidth: 100 across: 2
    button eReview "..." align: #Right
    checkbox eTakeFrozen "Take frozen objects" checked: true
    checkbox eTakeAnim "Take animation and skins" checked: false
    checkbox eTakeLights "Take lights" checked: true
    label eScl "Scale, %:" align: #Left
    spinner eScale range: [1.0, 1000.0, 100.0] align: #Left FieldWidth: 100
    group ""
    (
    checkbox eMod "Level models prefix" checked: true
    EditText eModPre Text: "MODEL_" align: #Left FieldWidth: 100
    checkbox eObj "Level objects prefix" checked: true
    EditText eObjPre Text: "OBJ_" align: #Left FieldWidth: 100
    label eNone "Note: Registr have matter!"
    )
    button eCreate "Create File!"

    on eMod changed true do
    (
    eModPre.Enabled= true
    )

    on eMod changed false do
    (
    eModPre.Enabled= false
    )

    on eObj changed true do
    (
    eObjPre.Enabled= true
    )

    on eObj changed false do
    (
    eObjPre.Enabled= false
    )

    on eReview pressed do
    (
    try eFile.Text= GetSaveFileName Types: "*.olf files |*.olf" catch ()
    )

    on eCreate pressed do
    (
    try CreateOLF_File () catch MessageBox ErrorString Beep: false
    )
    )

    on mmt Open do
    (
    addRollout CreateOMF
    addRollout CreateOLF
    )

    on mmt Close do
    (
    RemoveRollout CreateOMF
    RemoveRollout CreateOLF
    )

    -------------------------------------------------------

    fn CreateOMF_File=
    (
    TheFile= CreateFile CreateOMF.eFile.Text
    NumObj= 0
    iMod= 0
    i= 0
    type= ""
    NumBones= 0
    BoneWeight= 0
    Scl= CreateOMF.eScale.Value/100

    format "Open Model File\n\n" To: TheFile

    for Obj in $* do
    if (Obj.isHidden==false) and (((CreateOMF.eTakeFrozen.Checked==false) and Obj.isFrozen)==false) then
    (
    NumObj+=1
    ObjClass= ClassOf Obj
    if ((ObjClass!=BoneGeometry) and (ObjClass!=Point)) \
    and not((CreateOMF.eBonePre.Checked==true) and ((SubString (Obj.Name as String) 1 CreateOMF.eBonePrefix.Text.Count)==CreateOMF.eBonePrefix.Text))
    then i+=Obj.Mesh.NumVerts
    )
    format "IN TOTAL % OBJECTS AND % VERTICES\n" NumObj i To: TheFile
    NumObj= 0
    i= 0

    SetCommandPanelTaskMode mode: #modify

    for Obj in $* do if (Obj.isHidden==false) and (((CreateOMF.eTakeFrozen.Checked==false) and Obj.isFrozen)==false) then
    (
    NumObj+=1
    format "OBJECT %\n" NumObj To: TheFile

    format "name:\n %\n" Obj.Name To: TheFile

    type= "Mesh"
    if ((classOf Obj)==BoneGeometry)or((CreateOMF.eBonePre.Checked==true) and ((SubString (Obj.Name as String) 1 CreateOMF.eBonePrefix.Text.Count)==CreateOMF.eBonePrefix.Text))
    then type= "Bone" else
    if (classOf Obj)==Point then type= "Point" else
    (for iMod in Obj.Modifiers do if (classOf iMod)==Skin then (type= "Skin"; ModSkin= iMod; ModName= iMod.Name; Exit))
    format "type:\n %\n" Type To: TheFile
    if Type=="Skin" then modPanel.SetCurrentObject Obj.Modifiers[ModName]

    format "animated:\n %\n" (if Obj.isAnimated then "Yes" else "No") To: TheFile

    format "parent:\n %\n" \
    (if Obj.Parent==undefined then "No" else Obj.Parent.Name) To: TheFile

    format "center:\n % % %\n" (Obj.Center.X*Scl) (Obj.Center.Y*Scl) (Obj.Center.Z*Scl) To: TheFile

    Dist= Obj.Pos-Obj.Center

    if (type!="Bone")and(type!="Point") then
    (
    format "num vertices:\n %\n" Obj.Mesh.NumVerts To: TheFile
    format "num faces:\n %\n" Obj.Mesh.NumFaces To: TheFile

    format "vertices:\n" To: TheFile
    for i= 1 to Obj.Mesh.NumVerts do
    (
    if (mod i 500)==0 then gc ()

    format " v % % % n % % % t % %\n" \
    (((GetVert Obj.Mesh i).X-Obj.Center.X-Dist.X)*Scl) (((GetVert Obj.Mesh i).Y-Obj.Center.Y-Dist.Y)*Scl) (((GetVert Obj.Mesh i).Z-Obj.Center.Z-Dist.Z)*Scl) \
    (GetNormal Obj.Mesh i).X (GetNormal Obj.Mesh i).Y (GetNormal Obj.Mesh i).Z \
    (GetTVert Obj.Mesh i).X (GetTVert Obj.Mesh i).Y \
    To: TheFile
    if Type=="Skin" then
    (
    NumBones= (skinOps.GetVertexWeightCount ModSkin i)
    if NumBones!=0 then
    (format " % bones" NumBones To: TheFile
    for j= 1 to NumBones do
    (
    BoneWeight= skinOps.GetVertexWeight ModSkin i j
    if BoneWeight!=0 then
    format " % %" (skinOps.GetBoneName ModSkin (skinOps.GetVertexWeightBoneID ModSkin i j) 0) BoneWeight To: TheFile
    )
    ) else format " No bones" To: TheFile
    format "\n" To: TheFile
    )
    )

    gc ()

    format "faces:\n" To: TheFile
    for j= 1 to Obj.Mesh.NumFaces do
    (
    if (mod i 500)==0 then gc ()

    format " % % %\n" \
    ((GetFace Obj.Mesh j).X as Integer) ((GetFace Obj.Mesh j).Y as Integer) ((GetFace Obj.Mesh j).Z as Integer) \
    To: TheFile
    )
    )

    if Obj.isAnimated==true then
    (
    format "key frames:\n" To: TheFile

    if Obj.Pos.X_Position.isAnimated==false then format " No pos x\n" To: TheFile else
    (
    format " % pos x" Obj.Pos.X_Position.Keys.Count To: TheFile
    for i= 1 to Obj.Pos.X_Position.Keys.Count do
    format " % %" (Obj.Pos.X_Position.Keys.Time as Integer) ((Obj.Pos.X_Position.Keys.Value-Obj.Center.X-Dist.X)*Scl) To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Pos.Y_Position.isAnimated==false then format " No pos y\n" To: TheFile else
    (
    format " % pos y" Obj.Pos.Y_Position.Keys.Count To: TheFile
    for i= 1 to Obj.Pos.Y_Position.Keys.Count do
    format " % %" (Obj.Pos.Y_Position.Keys.Time as Integer) ((Obj.Pos.Y_Position.Keys.Value-Obj.Center.Y-Dist.Y)*Scl) To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Pos.Z_Position.isAnimated==false then format " No pos z\n" To: TheFile else
    (
    format " % pos z" Obj.Pos.Z_Position.Keys.Count To: TheFile
    for i= 1 to Obj.Pos.Z_Position.Keys.Count do
    format " % %" (Obj.Pos.Z_Position.Keys.Time as Integer) ((Obj.Pos.Z_Position.Keys.Value-Obj.Center.Y-Dist.Z)*Scl) To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Rotation.X_Rotation.isAnimated==false then format " No rot x\n" To: TheFile else
    (
    format " % rot x" Obj.Rotation.X_Rotation.Keys.Count To: TheFile
    for i= 1 to Obj.Rotation.X_Rotation.Keys.Count do
    format " % %" (Obj.Rotation.X_Rotation.Keys.Time as Integer) Obj.Rotation.X_Rotation.Keys.Value To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Rotation.Y_Rotation.isAnimated==false then format " No rot y\n" To: TheFile else
    (
    format " % rot y" Obj.Rotation.Y_Rotation.Keys.Count To: TheFile
    for i= 1 to Obj.Rotation.Y_Rotation.Keys.Count do
    format " % %" (Obj.Rotation.Y_Rotation.Keys.Time as Integer) Obj.Rotation.Y_Rotation.Keys.Value To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Rotation.Z_Rotation.isAnimated==false then format " No rot z\n" To: TheFile else
    (
    format " % rot z" Obj.Rotation.Z_Rotation.Keys.Count To: TheFile
    for i= 1 to Obj.Rotation.Z_Rotation.Keys.Count do
    format " % %" (Obj.Rotation.Z_Rotation.Keys.Time as Integer) Obj.Rotation.Z_Rotation.Keys.Value To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Scale.X_Scale.isAnimated==false then format " No scl x\n" To: TheFile else
    (
    format " % scl x" Obj.Scale.Keys.Count To: TheFile
    for i= 1 to Obj.Scale.Keys.Count do
    format " % %" (Obj.Scale.Keys.Time as Integer) Obj.Scale.Keys.Value.X To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Scale.Y_Scale.isAnimated==false then format " No scl y\n" To: TheFile else
    (
    format " % scl y" Obj.Scale.Keys.Count To: TheFile
    for i= 1 to Obj.Scale.Keys.Count do
    format " % %" (Obj.Scale.Keys.Time as Integer) Obj.Scale.Keys.Value.Y To: TheFile
    format "\n" To: TheFile
    )

    if Obj.Scale.Z_Scale.isAnimated==false then format " No scl z\n" To: TheFile else
    (
    format " % scl z" Obj.Scale.Keys.Count To: TheFile
    for i= 1 to Obj.Scale.Keys.Count do
    format " % %" (Obj.Scale.Keys.Time as Integer) Obj.Scale.Keys.Value.Z To: TheFile
    format "\n" To: TheFile
    )
    )

     
  6. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2

    format "END \n" To: TheFile
    )

    SetCommandPanelTaskMode mode: #utility
    ClearSelection ()

    Close TheFile
    gc ()
    )




    -------------------------------------------------------

    )


     
  7. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Только форматирование у форума стрёмное, могу выслать *.ms на мыло
     
  8. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Да к сожалению несмотря на новый дизайн сайта крепить файлы и давать вставки кода пока нельзя
    Обычно достаточно привести только основный фрагменты кода
    Да скинь пожайлуcта на мыло так удобней будет ответить потом.
    denis_savin@mail.ru
    Только не пойму какими действиями ты собрался заниматься во время записи ?
    В любом случае пока идет запись нельзя чтобы пользоватеть умудрился изменить данные.
     
  9. Zmiy

    Zmiy Пользователь сайта

    С нами с:
    08.12.2005
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Выслал, проверь почту

    Программа записывает модели в файл (нужно для игр). Кстати, можешь пользоваться, только не удаляй верхнюю строчку.

    Проблема в том, что при нажатии на кнопку "Create File!" макс зависает, а хотелось бы, чтобы он не зависал.
     
  10. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    >Выслал, проверь почту
    ок, правда уже сделал на этом куске кода
    выкладываю здесь так как тема вывода часто подимаемая

    >Программа записывает модели в файл (нужно для игр). Кстати, можешь пользоваться, только не удаляй верхнюю строчку.
    Спасибо за доверие.

    >Проблема в том, что при нажатии на кнопку "Create File!" макс зависает, а хотелось бы, чтобы он не зависал.
    По просьбе приделал скролл бар, теперь не так скучно будет, можно отменить в любой момент.
    Правда бывает что и он не всегда обновляется, но тут ничего не сделать.

    Немного оптимизировал код.
    будет раз ~100 быстрей на объектах отличных от Mesh.

    Тепрерь немного о замечаниях и исправлениях:

    Не правильно организованна работа с текстурными координатами:
    Количество точек текстурных координат(тк) практически нигода не равно количеству вертексов
    зависит от того как порезан мапинг.
    На текстурные координаты делается отдельный массив
    далее каждая точка фейса имееи индекс на этот массив, точно также как и на обычные точки.

    Также тепрерь более корректно работает с контроллерами.

    Поменял вывод времени в ключах с тиков на кадры, не знаю ошбка это была или так и задумывалось.
    Таже если если используеттся ввыод ключей со стандартного в этом случе bezier котроллера
    то неплохо выводить хотябы тангенты.

    Стоит заметить обычно в игровых движках не парятся с сложными контроллерами,
    а просто снимают значени с каждого кадра и в игре линейно интерполируют между ними.
    Этот подход позволяет снять анимацию с любого типа контроллера в редакторе.
    Что не ограничивает аниматоров в инструметах.
    Хотя у каждого подхода свои плюсы.

    Теперь о памяти чесно говоря протестировав на достаточно больших сценах особых проблем не нашол
    у меня все отлично выводится, возможно проблему следует искать в настройках системы, софта,
    возможно установленны другие скрипты.

    Test Save
    -------------------------
    OBJECTS 179
    824210 Vertices
    1662000 Tringles
    134724 Kb
    245 Seconds

    PS
    В целом скрипт написан очень не плохо

     
  11. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    utility mmt "Max Models Taker"
    (

    -------------------------------------------------------

    local CreateOMF_File, CreateOLF_File
    global TheFile
    global Obj, NumObj, ObjClass, NumBones, BoneWeight, ModSkin, iMod, ModName, Type, Scl, Dist, i, j
    global ErrorString= "Error! The file don't created correct!"

    -------------------------------------------------------

    Rollout CreateOMF "Create an *.omf file"
    (
    label eSave "Save as:" align: #Left
    EditText eFile Text: "C:\\Model1.omf" FileName: "Model1.omf" align: #Left FieldWidth: 100 across: 2
    button eReview "..." align: #Right
    checkbox eTakeFrozen "Take frozen objects" checked: true
    label eScl "Scale, %:" align: #Left
    spinner eScale range: [1.0, 1000.0, 100.0] align: #Left FieldWidth: 100
    checkbox eBonePre "Use bones prefix:" checked: false
    EditText eBonePrefix Text: "Bone" align: #Left FieldWidth: 100 Enabled: false
    label eNote "Note: Registr has matter!!!" align: #Left
    button eCreate "Create File!"

    on eReview pressed do
    (
    try eFile.Text= GetSaveFileName Types: "*.omf files |*.omf" catch ()
    )

    on eBonePre changed true do eBonePrefix.Enabled= true
    on eBonePre changed false do eBonePrefix.Enabled= false

    on eCreate pressed do
    (
    CreateOMF_File ()
    )
    )

    Rollout CreateOLF "Create an *.olf file"
    (
    label eSave "Save as:" align: #Left
    EditText eFile Text: "C:\\Level1.olf" FileName: "Level1.olf" align: #Left FieldWidth: 100 across: 2
    button eReview "..." align: #Right
    checkbox eTakeFrozen "Take frozen objects" checked: true
    checkbox eTakeAnim "Take animation and skins" checked: false
    checkbox eTakeLights "Take lights" checked: true
    label eScl "Scale, %:" align: #Left
    spinner eScale range: [1.0, 1000.0, 100.0] align: #Left FieldWidth: 100
    group ""
    (
    checkbox eMod "Level models prefix" checked: true
    EditText eModPre Text: "MODEL_" align: #Left FieldWidth: 100
    checkbox eObj "Level objects prefix" checked: true
    EditText eObjPre Text: "OBJ_" align: #Left FieldWidth: 100
    label eNone "Note: Registr have matter!"
    )
    button eCreate "Create File!"

    on eMod changed true do
    (
    eModPre.Enabled= true
    )

    on eMod changed false do
    (
    eModPre.Enabled= false
    )

    on eObj changed true do
    (
    eObjPre.Enabled= true
    )

    on eObj changed false do
    (
    eObjPre.Enabled= false
    )

    on eReview pressed do
    (
    eFile.Text= GetSaveFileName Types: "*.olf files |*.olf"
    )

    on eCreate pressed do
    (
    CreateOLF_File ()
    )
    )

    on mmt Open do
    (
    addRollout CreateOMF
    addRollout CreateOLF
    )

    on mmt Close do
    (
    RemoveRollout CreateOMF
    RemoveRollout CreateOLF
    )

    -------------------------------------------------------

    fn CreateOMF_File=
    (
    --return false
    progressStart "Save ..."
    completeRedraw()

    progressUpdate 0.

    local typeTransformName = #(#position, #rotation, #scale)
    local contName = #("pos", "rot", "scl")
    local paramName = #("x", "y", "z")
    local axisName = #("XYZ", "XZY", "YZX", "YXZ", "ZXY", "ZYX", "XYX", "YZY", "ZXZ")
    local contXYZ = #(Color_RGB, Euler_XYZ, Local_Euler_XYZ, Point3_XYZ, Position_XYZ, ScaleXYZ)

    local TheFile= CreateFile CreateOMF.eFile.Text
    local AllNumObj= 0
    local NumObj= 0
    local iMod= 0
    local NumVerts = 0
    local progressNumVerts = 0
    local type= ""
    local NumBones= 0
    local BoneWeight= 0
    local Scl = CreateOMF.eScale.Value/100

    format "Open Model File\n\n" To: TheFile

    for Obj in $* where isValidNode Obj and not Obj.isTarget and not Obj.isHidden \
    and (((CreateOMF.eTakeFrozen.Checked==false) and Obj.isFrozen)==false) \
    do (
    AllNumObj+=1
    if superclassof Obj == GeometryClass \
    and not((CreateOMF.eBonePre.Checked==true) and ((SubString (Obj.Name as String) 1 CreateOMF.eBonePrefix.Text.Count)==CreateOMF.eBonePrefix.Text))
    then NumVerts += Obj.Mesh.NumVerts
    )

    format "IN TOTAL % OBJECTS AND % VERTICES\n" AllNumObj NumVerts To: TheFile
    NumObj= 0

    completeRedraw()
    progressUpdate 0.1


    for Obj in $* where isValidNode Obj and not Obj.isTarget and not Obj.isHidden \
    and (((CreateOMF.eTakeFrozen.Checked==false) and Obj.isFrozen)==false)\
    do (
    NumObj+=1
    format "OBJECT %\n" NumObj To: TheFile

    format "name:\n %\n" Obj.Name To: TheFile

    local objClass = classOf Obj
    local type= #Mesh

    if (objClass==BoneGeometry)or((CreateOMF.eBonePre.Checked==true) and ((SubString (Obj.Name as String) 1 CreateOMF.eBonePrefix.Text.Count)==CreateOMF.eBonePrefix.Text))
    then type= #Bone
    else if objClass==Point then type= #Point
    else for iMod in Obj.Modifiers while type != #Skin where (classOf iMod)==Skin do( type = #Skin; ModSkin= iMod)

    format "type:\n %\n" (Type as string) To: TheFile
    format "animated:\n %\n" (if Obj.isAnimated then "Yes" else "No") To: TheFile
    format "parent:\n %\n" \
    (if Obj.Parent == undefined then "No" else Obj.Parent.Name) To: TheFile

    format "center:\n % % %\n" (Obj.Center.X*Scl) (Obj.Center.Y*Scl) (Obj.Center.Z*Scl) To: TheFile

    local Dist = Obj.Pos-Obj.Center
    local Center = Obj.Center - Dist

    if superclassof Obj == GeometryClass and type!=#Bone then
    (

    local mObj = TriMesh()
    mObj.mesh = copy Obj.mesh
    local vnum = mObj.NumVerts
    local fnum = mObj.NumFaces
    local tvnum = mObj.numtverts
    progressNumVerts += vnum

    format "num vertices:\n %\n" vnum To: TheFile
    format "num texture vertices:\n %\n" tvnum To: TheFile
    format "num faces:\n %\n" fnum To: TheFile

    format "vertices:\n" To: TheFile



    for i= 1 to vnum do
    (

    -- Progress Cancel
    if (mod i 500)==0 and getProgressCancel() do( gc(); Close TheFile; progressEnd(); return false)

    local v = ((meshop.getVert mObj i) - Center ) * Scl
    local n = GetNormal mObj i
    format " v % % % n % % %\n" v.x v.y v.z n.x n.y n.z To: TheFile

    if Type=="Skin" then
    (
    local NumBones= (skinOps.GetVertexWeightCount ModSkin i)
    if NumBones!=0 then
    (format " % bones" NumBones To: TheFile
    for j= 1 to NumBones do
    (
    local BoneWeight= skinOps.GetVertexWeight ModSkin i j
    if BoneWeight!=0 then
    format " % %" (skinOps.GetBoneName ModSkin (skinOps.GetVertexWeightBoneID ModSkin i j) 0) BoneWeight To: TheFile
    )
    ) else format " No bones" To: TheFile
    format "\n" To: TheFile
    )

    )

    format "texture:\n" To: TheFile
    if tvnum == 0 then format " No\n" To: TheFile else
    for j= 1 to tvnum do
    (
    -- Progress Cancel
    if (mod j 500)==0 and getProgressCancel() do( gc(); Close TheFile; progressEnd(); return false)

    local t = getTVert mObj j
    format " t % %\n" t.x t.y To: TheFile
    )

    format "faces:\n" To: TheFile
    for j= 1 to fnum do
    (

    -- Progress Cancel
    if (mod j 500)==0 and getProgressCancel() do( gc(); Close TheFile; progressEnd(); return false)

    local face = getFace mObj j
    format " % % %" (face.X as Integer) (face.Y as Integer) (face.Z as Integer) To: TheFile

    -- Add Index to Texture Coordinat
    if tvnum > 0 do (
    local matid = getTVFace mObj j
    format " t % % %" (matid.X as Integer) (matid.Y as Integer) (matid.Z as Integer) To: TheFile
    )
    format "\n" To: TheFile
    )


    )

    local tc = Obj.transform.controller

    if Obj.isAnimated and classof tc == prs then
    (

    format "key frames:\n" To: TheFile
    local j = 0
    for tConName in typeTransformName do
    (
    j += 1
    local ts = getPropertyController tc tConName
    local classTs = classof ts

    if (finditem contXYZ classTs) != 0 then
    (
    local xyz = getXYZControllers ts
    for i = 1 to 3 do
    (
    local c = xyz
    local cnum = c.Keys.Count
    if cnum == 0 or classof c != bezier_float then format " No % %\n" contName[j] paramName To: TheFile else (
    format " % % %" cnum contName[j] paramName To: TheFile
    for t = 1 to cnum do
    (
    -- Progress Cancel
    if (mod t 500)==0 and getProgressCancel() do( gc(); Close TheFile; progressEnd(); return false)
    -- Save Key
    local k = c.Keys[t]
    local v = k.Value
    local vin = k.inTangent
    local vout = k.outTangent
    if classTs == Position_XYZ do v = (v - Center) * Scl
    format " % % % %" (c.Keys[t].Time.frame as Integer) v vin vout To: TheFile
    )
    format "\n" To: TheFile
    )
    )

    -- if Rotation Controller then Save AxisOrder
    if classTs == Euler_XYZ or classTs == Local_Euler_XYZ then
    format " axisOrder: %\n" axisName[ts.axisOrder] To: TheFile

    ) else (
    for i = 1 to 3 do format " No % %\n" contName[j] paramName To: TheFile
    if tConName == #rotation then format " axisOrder: %\n" axisName[1] To: TheFile
    )

    )


    -- Progress Cancel
    if getProgressCancel() do( gc(); Close TheFile; progressEnd(); return false)

    gc ()
    completeRedraw()
    progressUpdate (100.*NumObj/AllNumObj)

    )


    format "END \n" To: TheFile
    )

    progressUpdate 100.

    Close TheFile
    gc ()
    progressEnd()
    )


    -------------------------------------------------------

    )
     
Модераторы: Savin Denis

Поделиться этой страницей