[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
Форум » Моддинг » 4.3. Ваши идеи по моделированию » W4AnimEditor or W3DAnimEditor... Создадим? (Собираю всю информацию по анимации, для создания программы..)
W4AnimEditor or W3DAnimEditor... Создадим?
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Но что хранить в кэше?

Может создать что-то типа Xom объекта с кучей типов... но проблема в том что не все типы декодированы...
Когда я делал W3DMapEditor я создавал класс Xom объекта, и к нему лишь добавлял свойства для отображения, сохранения и т.п.

У меня и так кэш памяти как бы. Но нужно чтобы был Кэш раскодированной памяти. Которую нужно лишь обработать и вывести.


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Желательно создать класс Xom, который будет иметь кучу подклассов, и одну функцию сохранения, учитывающую индекс всех строк, это позволит менять названия объектов, и таблицу строк, при условии что все индексы раскодированы.

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Ты очень плохо формулируешь, что хочешь узнать =)

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Хочу узнать как организовать данные, которые считываются с Xom формата, чтобы удобно было ими пользоваться?

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Можно выстроить при считывании xom файла дерево из объектов, но данные оставлять в файле.
Каждый объект связывать со смещением в файле или ещё какой-нито инфой.
При изменении объекта в редакторе связь объекта дерева с точкой в файле рушится (то есть все данные подгружаются и ты начинаешь работать с ними в памяти). При добавлении нового объекта происходит создание отвязанного от файла объекта.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Вопрос по xom - контейнеры одного типа имеют один размер или могут иметь разный?

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
У меня так и есть... я загружаю файл в память и даю на него ссылки.... Только это не решает проблем

TConteiner = record
point: Pointer; // ссылка на точку в памяти
size: Integer; // размер контейнера
Update: Boolean; // обновлен
CTNR: Boolean; // имеет заголовок
Xtype: XTypes; // тип контейнера
end;

XConteiners = array of TConteiner;

Я создал классы:
TMesh = class
TAnimClip = class

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

Да и запутаться можно в этих классах, когда одно "почти" дерево из
XConteiners сплетается с деревом TMesh которое содержит в себе TAnimClip wacko

В общем надо порядок, и организация, но вот какая?


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)
Вопрос по xom - контейнеры одного типа имеют один размер или могут иметь разный?

Конечно разный... если бы все так просто было. Каждый контейнер может содержать в себе индекс строковой, а это полубайт... т.е. динамический размер.

Несколько контейнеров имеет статический размер, но их мало и они не несут информационной нагрузки...


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Немного не в тему 2 вопроса - что кроме паскаля знаешь и изучал ли шаблоны проектирования?

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
То есть процесс загрузки файла такой:
Загрузка заголовка - узнаём список и число типов, число контейнеров и смещения их начал.
Потом раскодируем каждый контейнер и с корневого контейнера собираем дерево.
Так?


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Вообще функция чтения контейнеров, Это что-то страшное biggrin

Вот людей попугаю

Code

procedure TXom.LoadXomFileName(FileName: string; var OutCaption: string);
var
   iFileHandle: Integer;
   NumType: array [XTypes] of Integer;
   s, s2, s1: string;
   //sTemp:string;
   i, j, types, MaxInx, LenSTR, k, k2, k3, L, sizecount, sizeoffset,
   ID, ij, x, x1, x2, px, inx, inx1, inx2 : Integer;
   P, p2: Pointer;
   XType,xi: XTypes;
   IDtest, Outpoint, IsCtnr, ExpAnim: Boolean;
   _byte, _byte2: Integer;
   HtimeHour, HtimeMin, HtimeSec: Byte;
   TreeNode: TTreeNode;
   iFileLength: Integer;

   function GetXType(_j: Integer): XTypes;
   var  
     _i: Integer;
   begin
     Result := XNone;
     for _i := 0 to Integer(XMax) do
       if NumType[XTypes(_i)] = _j then  
         Result := XTypes(_i);
   end;
begin
   saidx := 0;
   for i := 0 to Integer(XMax) do
     NumType[XTypes(i)] := -1;

   iFileHandle := FileOpen(FileName, fmOpenRead);
   iFileLength := FileSeek(iFileHandle, 0, 2);
   FileSeek(iFileHandle, 0, 0);
   FreeMem(Buf);
   Buf := AllocMem(iFileLength + 1);
   FileRead(iFileHandle, Buf^, iFileLength);
   //VirtualBufer:=TMemoryStream.Create;
   //    VBuf := AllocMem(2);
   //VirtualBufer.Size:=iFileLength*2;
   FileClose(iFileHandle);
   s := ExtractFileName(FileName);
   OutCaption := Format('XomView v2.6 by AlexBond - [%s]', [s]);
   //     Button3.Enabled:=false;
   But.ValueList.Strings.Clear;
   But.TreeViewM.Items.Clear;
   But.TreeViewM.Visible := false;
   types := Word(Pointer(Longword(Buf) + 24)^);
   Conteiners := Word(Pointer(Longword(Buf) + 28)^);
   BaseConteiner := Word(Pointer(Longword(Buf) + 32)^);
   SetLength(Treesize, types);
   SetLength(TreeN, types);
   for i := 0 to Length(StrArray) - 1 do
     if StrArray[i].Update then  
       FreeMem(StrArray[i].point);
   SetLength(StrArray, 0);
   SetLength(StrArray, Conteiners + 1);

   for i := 0 to types - 1 do  
   begin
     p           := Pointer(64 + i * 64 + 32 + Longword(Buf));
     Treesize[i] := Word(Pointer(Longword(Buf) + 64 + i * 64 + 8)^);
     //    if (Pchar(p)='XResourceDetails') and (i=0) then Treesize[i]:=1;
     for Xi:=Low(XTypes) to High(XTypes) do
      if AnsiStrComp(Pchar(p),PCharXTypes[Xi])=0 then
                 NumType[Xi]:=i;
     TreeN[i] := But.TreeViewM.Items.Add(nil,
       Format('%s(%d)', [PChar(p), Treesize[i]]));
   end;
   //p:=pointer(64+Types*64+16+4+integer(Buf));
   if Longword(Pointer(64 + Types * 64 + 16 + Longword(Buf))^) <> 1397904467 then
     p := Pointer(64 + Types * 64 + 16 + 16 + 4 + Longword(Buf))
   else
     p := Pointer(64 + Types * 64 + 16 + 4 + Longword(Buf));
   MaxInx := Longword(p^);
   But.Status.Text := Format('Strings: (%d)', [MaxInx]);
   Inc(Longword(p), 4);
   LenSTR := Longword(p^);
   Inc(Longword(p), 4);
   //<table str>
   k := Longword(p) + MaxInx * 4;

   for i := 0 to MaxInx - 2 do  
   begin
     L := Longword(Pointer(i * 4 + Longword(p) + 4)^);
     s := Format('%.2x', [byte128(i + 1)]);
     But.Valuelist.InsertRow(s, Utf8ToAnsi(PChar(Pointer(k + L))), true)
   end;
   k := LenSTR + MaxInx * 4;
   P := Pointer(Longword(p) + k);

   //   while (Longword(pointer(Longword(p))^)<>Ctnr) do inc(Longword(p));
   But.Status.Text := Format('Strings: (%d) - (%d)', [MaxInx, LenSTR]);
   //Tree adding
   StrArray[0].point := p;
   Outpoint := false;
   for j := 0 to types - 1 do  
   begin
     XType := GetXType(j);
     if Treesize[j] > 0 then
       for i := 1 to Treesize[j] do
         if not Outpoint then
         begin
           IsCtnr := true;
           p2 := Pointer(Longword(p) + 7);
           k := TestByte128(p2);
           if k >= But.ValueList.RowCount then  
           begin  
             s := '[OUT]';  
             s2 := '0';  
           end
           else  
           begin  
             s := But.ValueList.Cells[1, k];  
             s2 := But.ValueList.Keys[k];
           end;
           case XType of
             XGraphSet:
             begin
               p2 := p;
               s := '';
               k := TestByte128(p2);
               for x := 1 to k do  
               begin
                 Inc(Longword(p2), 16);
                 k3 := TestByte128(p2);
                 k2 := TestByte128(p2);
                 s := s + GetString(k2) + '; ';
               end;
               s := Format('(%d) Graph [%s]', [k, s]);
               IsCtnr := false;
             end;
             XOglTextureMap:
             begin
               p2 := Pointer(Longword(p) + 7);
               Inc(Longword(p2), 4);
               Inc(Longword(p2), 4 * 4);
               k3 := TestByte128(p2);
               Inc(Longword(p2), 4);
               k2 := Word(p2^);
               Inc(Longword(p2), 2);
               Inc(Longword(p2), 4 * 5);
               k := TestByte128(p2);
               //  dec(Longword(p2),4);
               // funit, float4,index,float,unit,funit5
               s := Format('OglMap [%d; %d]', [k3, k]);
               if k2 <> 1 then
                 Inc(Longword(p2), 68);
               IsCtnr := false;
             end;
             XBitmapDescriptor:  
             begin
               p2 := p;
               k3 := TestByte128(p2);
               s := GetString(k3);
               Inc(Longword(p2));
               k2 := TestByte128(p2);
               s := Format('"%s" [%d] [%dx%d]',
                 [s, k2, Word(p2^), Word(Pointer(Longword(p2) + 2)^)]);
               Inc(Longword(p2), 4);
               IsCtnr := false;
             end;
             W3DTemplateSet:
             begin
               for x := 1 to k do
                 TestByte128(p2);
               Inc(Longword(p2), 12);
               Inc(Longword(p2), 8);
               s := GetString(TestByte128(p2));
               IsCtnr := false;
             end;
             XCustomDescriptor:
             begin
               p2 := p;
               s := GetString(TestByte128(p2));
               Inc(Longword(p2), 3);
               IsCtnr := false;
             end;

     ... вырезано, т.к. не влезло в сообщение ...
             PC_LandChunk:  
             begin
               p2 := Pointer(Longword(p) + 7 + 4);
               Inc(Longword(p2), 4 * 4);
               Inc(Longword(p2), 5);
               IsCtnr := false;
               s := 'Data';
             end;
             PC_LandFrame:  
             begin
               p2 := Pointer(Longword(p) + 7);
               k3 := TestByte128(p2);
               Inc(Longword(p2), k3);
               k3 := TestByte128(p2);
               Inc(Longword(p2), k3);
               Inc(Longword(p2), 2);    //00 00
               Inc(Longword(p2), 4);    // 3d 00 6c 00
               Inc(Longword(p2), 368);  // pos?
               k3 := TestByte128(p2);   // layers 1
               Inc(Longword(p2), k3 * 2 * 4);
               k3 := TestByte128(p2); // layers 2
               Inc(Longword(p2), k3 * 2 * 4);
               k3 := TestByte128(p2); // ?
               Inc(Longword(p2), k3 * 4);
               Inc(Longword(p2), 4);
               k3 := TestByte128(p2); // ?
               Inc(Longword(p2), k3 * 4);
               k3 := TestByte128(p2); // ?
               Inc(Longword(p2), k3 * 4);
               // ?????
               k3 := TestByte128(p2); // ?
               Inc(Longword(p2), (k3 - 1) * 4);
               Inc(Longword(p2), 16); //???
               Inc(Longword(p2), 4);  // ff ff ff ff
               k3 := TestByte128(p2); // childs
               for x := 1 to k3 do  
                 TestByte128(p2);
               Inc(Longword(p2), 4 * 4); // coord4
               Inc(Longword(p2), 4);     // zero
               s := GetString(TestByte128(p2));
               IsCtnr := false;
             end;
             LandFrameStore:  
             begin
               s := Format('(%s)', [s]);
             end;
             DetailEntityStore:  
             begin
               s := Format('(%s)', [s]);
             end;
             XPositionData:  
             begin
               p2 := Pointer(Longword(p) + 12);
               s := 'Data';
               IsCtnr := false;
             end;
             XDetailObjectsData:  
             begin
               p2 := Pointer(Longword(p) + 7);
               k := TestByte128(p2);
               for x := 1 to k do  
                 k3 := TestByte128(p2);
               k := TestByte128(p2);
               for x := 1 to k do  
                 k3 := TestByte128(p2);

               k := TestByte128(p2);
               for x := 1 to k do  
                 Inc(Longword(p2), 3 * 4);
               k := TestByte128(p2);
               for x := 1 to k do  
                 Inc(Longword(p2), 3 * 4);
               k := TestByte128(p2);
               for x := 1 to k do  
                 Inc(Longword(p2), 3 * 4);

               s := 'Data';
               IsCtnr := false;
             end;
             XNone:
               s := Format('0x%x (%s)', [k, s]);
           end;
           Inc(saidx);
           TreeNode := But.TreeViewM.Items.AddChild(TreeN[j],
             Format('%d. %s', [saidx, s]));
           TreeNode.Data := Pointer(saidx);
           if saidx = BaseConteiner then
             BaseNode := TreeNode;

           if (Longword(p^) = Ctnr) then
             sizeoffset := 4  
           else   
             sizeoffset := 0;
           sizecount := sizeoffset;
           StrArray[saidx].point := Pointer(Longword(p) + sizeoffset);
           StrArray[saidx].XType := XType;
           StrArray[saidx].CTNR := (sizeoffset = 4);

           if not IsCtnr then   
             sizecount := Longword(p2) - Longword(p);

           But.XLabel.Caption := Format('%.1f %%', [saidx / Conteiners * 100]);
           But.XLabel.Repaint;
           {    if j <> types-1 then //XUintResourceDetails         }
           if (IsCtnr) then

             while (Longword(Pointer(Longword(p) + sizecount)^) <> Ctnr) do  
             begin
               if ((Longword(p) + sizecount - Longword(Buf)) > iFileLength) then
               begin
                 Outpoint := true;   
                 StrArray[saidx].size := sizecount - sizeoffset - 1;  
                 Exit;
               end;
               Inc(sizecount);
             end;

           StrArray[saidx].size := sizecount - sizeoffset;
           //    end
           //   else StrArray[saidx].size:=sizecount;

           But.StatusM.Text := Format('%d', [saidx]);

           // FormXom.TreeView1.Refresh;

           p := Pointer(Longword(p) + sizecount);
         end;
     //  inc(saidx);
   end
end;

P.S. Люди включите подсветку кодов!!! sad И увеличьте количество допустимых буковок =)
P.S.S. Кстати класный сайт для подсветки http://tohtml.com/


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)
Немного не в тему 2 вопроса - что кроме паскаля знаешь и изучал ли шаблоны проектирования?

Знаю php, С++, Asm, Си под Linux, Prolog, Lisp =), но люблю Delphi.
Шаблоны я не смог вкурить, хотя пытался очень долго понять их суть, по мне там слишком долгая компиляция, которая не упрощает, а усложняет жизнь прогерам.

Quote (Герыч)
То есть процесс загрузки файла такой:
Загрузка заголовка - узнаём список и число типов, число контейнеров и смещения их начал.
Потом раскодируем каждый контейнер и с корневого контейнера собираем дерево.
Так?

Число контейнеров но не смещения их начал, начала мы узнаем в процессе декодирования =)

Потом да, собираем дерево при этом одновременно декодируем <_<


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Quote (AlexBond)
Шаблоны я не смог вкурить, хотя пытался очень долго понять их суть, по мне там слишком долгая компиляция, которая не упрощает, а усложняет жизнь прогерам.

Я не про шаблоны в c++, а про шаблоны проектирования - хорошие уже давным давно продуманные решения для ООП разработки.

Quote (AlexBond)
Число контейнеров но не смещения их начал, начала мы узнаем в процессе декодирования =

Ага, то есть декодируем последовательно каждый контейнер, узнавая длину контейнера и начало следующего, так?


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)

Я не про шаблоны в c++, а про шаблоны проектирования - хорошие уже давным давно продуманные решения для ООП разработки.

Единственное с чем имел дело, это фабрика классов. И интерфейсы...

Quote (Герыч)
Ага, то есть декодируем последовательно каждый контейнер, узнавая длину контейнера и начало следующего, так?

Так.
В моем случае
Code
p := Pointer(Longword(p) + sizecount);

как раз и делает обход контейнеров.


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Ясно, то есть декодирование в тот же момент, что и определение начал контейнеров.
А если встречается нераскодированный контейнер - что делаешь?

Блин, так и хочется сделать утилитку для импорта - экспорта xom в xml. Тогда можно будет писать проги, хоть на пхп, чтобы работать с xom)


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Что ты привязался к этой xml, Лажовый формат =)

По поводу не раскодированных контейнеров, так их нет, по крайне мере размеры все я знаю, или перескакиваю до следующей CNTR шапки. И тестировано со всеми XOM. Открываются без проблем.


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Quote (AlexBond)
Что ты привязался к этой xml, Лажовый формат =)

Может и лажовый, но есть библиотеки для работы с ним. Можно конечно написать библиотеку для работы с xom на плюсах или c#...


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Короче приколы в следующем, анимация для "молнии" имеет не синусойду, а импульсойду, что не учитывалась ранее, т.к. я брал тупо прямыми переходами из Key1 в Key2. Поэтому хочешь не хочешь, а мне придется создавать График анимации для кривой... <_<

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Кое какой прогресс идёт...

Прикрепления: 8805201.png (72.0 Kb)


 
Саш
Проверенные
Сообщений: 341
Реп: 8
ты уже и хомвью 2.6 создал? Выложишь?

My Little Pony
 
Форум » Моддинг » 4.3. Ваши идеи по моделированию » W4AnimEditor or W3DAnimEditor... Создадим? (Собираю всю информацию по анимации, для создания программы..)
Поиск: