Render.ru

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

Zmiy

Пользователь сайта
Рейтинг
2
#1
Вот написал утилиту для записи моделей в файл. С маленькими моделями всё происходит нормально, а с более большими (800 вершин) - нет. Модель частично записывается, а потом происходит ошибка. Видимо это связано с нехваткой памяти. Подскажите пожалуста, как можно решить эту проблему? Может надо как-то выделить функцию в отдельный поток?
 

Zmiy

Пользователь сайта
Рейтинг
2
#3
Я решил проблему тем, что напихал в функцию побольше вызовов gc(). То есть теперь ошибок нет, но на время проведения операций макс виснет. Нельзя ли, повторюсь, выделить функцию в отдельный поток (тут, думаю, не важен код самой функции), да ещё хотелось бы с прогресс-баром? Возможно ли такое в принципе? Чё-то в хелпе не нашёл...
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
>>Я решил проблему тем, что напихал в функцию побольше вызовов gc()
очень рад за тебя :)) не кувалдой так топором

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


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

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

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

Zmiy

Пользователь сайта
Рейтинг
2
#5
Нужно чтобы макс не зависал, а нормально реагировал на действия пользователя

Вот код

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
)
)

 

Zmiy

Пользователь сайта
Рейтинг
2
#6

format "END \n" To: TheFile
)

SetCommandPanelTaskMode mode: #utility
ClearSelection ()

Close TheFile
gc ()
)




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

)


 

Zmiy

Пользователь сайта
Рейтинг
2
#7
Только форматирование у форума стрёмное, могу выслать *.ms на мыло
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#8
Да к сожалению несмотря на новый дизайн сайта крепить файлы и давать вставки кода пока нельзя
Обычно достаточно привести только основный фрагменты кода
Да скинь пожайлуcта на мыло так удобней будет ответить потом.
denis_savin@mail.ru
Только не пойму какими действиями ты собрался заниматься во время записи ?
В любом случае пока идет запись нельзя чтобы пользоватеть умудрился изменить данные.
 

Zmiy

Пользователь сайта
Рейтинг
2
#9
Выслал, проверь почту

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

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

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#10
>Выслал, проверь почту
ок, правда уже сделал на этом куске кода
выкладываю здесь так как тема вывода часто подимаемая

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

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

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

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

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

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

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

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

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

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

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

 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#11
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()
)


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

)
 
Сверху