W4AnimEditor or W3DAnimEditor... Создадим?
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 22:52:22
Но что хранить в кэше? Может создать что-то типа Xom объекта с кучей типов... но проблема в том что не все типы декодированы... Когда я делал W3DMapEditor я создавал класс Xom объекта, и к нему лишь добавлял свойства для отображения, сохранения и т.п. У меня и так кэш памяти как бы. Но нужно чтобы был Кэш раскодированной памяти. Которую нужно лишь обработать и вывести.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 23:28:58
Желательно создать класс Xom, который будет иметь кучу подклассов, и одну функцию сохранения, учитывающую индекс всех строк, это позволит менять названия объектов, и таблицу строк, при условии что все индексы раскодированы.
|
|
|
|
Сообщений: 1240
|
Опубликовано: 26.01.2011, 23:46:31
Ты очень плохо формулируешь, что хочешь узнать =)
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.01.2011, 23:51:49
Хочу узнать как организовать данные, которые считываются с Xom формата, чтобы удобно было ими пользоваться?
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 00:02:06
Можно выстроить при считывании xom файла дерево из объектов, но данные оставлять в файле. Каждый объект связывать со смещением в файле или ещё какой-нито инфой. При изменении объекта в редакторе связь объекта дерева с точкой в файле рушится (то есть все данные подгружаются и ты начинаешь работать с ними в памяти). При добавлении нового объекта происходит создание отвязанного от файла объекта.
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 00:10:43
Вопрос по xom - контейнеры одного типа имеют один размер или могут иметь разный?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 00:17:00
У меня так и есть... я загружаю файл в память и даю на него ссылки.... Только это не решает проблем TConteiner = record point: Pointer; // ссылка на точку в памяти size: Integer; // размер контейнера Update: Boolean; // обновлен CTNR: Boolean; // имеет заголовок Xtype: XTypes; // тип контейнера end; XConteiners = array of TConteiner; Я создал классы: TMesh = class TAnimClip = class Но они у меня не постоянны, а создаются при выделении определенного контейнера, что неудобно, т.к. приходится каждый раз преобразовывать инфу. Да и запутаться можно в этих классах, когда одно "почти" дерево из XConteiners сплетается с деревом TMesh которое содержит в себе TAnimClip В общем надо порядок, и организация, но вот какая?
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 00:19:21
Quote (Герыч) Вопрос по xom - контейнеры одного типа имеют один размер или могут иметь разный? Конечно разный... если бы все так просто было. Каждый контейнер может содержать в себе индекс строковой, а это полубайт... т.е. динамический размер. Несколько контейнеров имеет статический размер, но их мало и они не несут информационной нагрузки...
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 00:20:54
Немного не в тему 2 вопроса - что кроме паскаля знаешь и изучал ли шаблоны проектирования?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 00:25:43
То есть процесс загрузки файла такой: Загрузка заголовка - узнаём список и число типов, число контейнеров и смещения их начал. Потом раскодируем каждый контейнер и с корневого контейнера собираем дерево. Так?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 00:57:55
Вообще функция чтения контейнеров, Это что-то страшное Вот людей попугаю 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. Люди включите подсветку кодов!!! И увеличьте количество допустимых буковок =) P.S.S. Кстати класный сайт для подсветки http://tohtml.com/
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 00:59:59
Quote (Герыч) Немного не в тему 2 вопроса - что кроме паскаля знаешь и изучал ли шаблоны проектирования? Знаю php, С++, Asm, Си под Linux, Prolog, Lisp =), но люблю Delphi. Шаблоны я не смог вкурить, хотя пытался очень долго понять их суть, по мне там слишком долгая компиляция, которая не упрощает, а усложняет жизнь прогерам. Quote (Герыч) То есть процесс загрузки файла такой: Загрузка заголовка - узнаём список и число типов, число контейнеров и смещения их начал. Потом раскодируем каждый контейнер и с корневого контейнера собираем дерево. Так? Число контейнеров но не смещения их начал, начала мы узнаем в процессе декодирования =) Потом да, собираем дерево при этом одновременно декодируем <_<
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 09:33:04
Quote (AlexBond) Шаблоны я не смог вкурить, хотя пытался очень долго понять их суть, по мне там слишком долгая компиляция, которая не упрощает, а усложняет жизнь прогерам. Я не про шаблоны в c++, а про шаблоны проектирования - хорошие уже давным давно продуманные решения для ООП разработки. Quote (AlexBond) Число контейнеров но не смещения их начал, начала мы узнаем в процессе декодирования = Ага, то есть декодируем последовательно каждый контейнер, узнавая длину контейнера и начало следующего, так?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 12:39:45
Quote (Герыч) Я не про шаблоны в c++, а про шаблоны проектирования - хорошие уже давным давно продуманные решения для ООП разработки. Единственное с чем имел дело, это фабрика классов. И интерфейсы... Quote (Герыч) Ага, то есть декодируем последовательно каждый контейнер, узнавая длину контейнера и начало следующего, так? Так. В моем случае Code p := Pointer(Longword(p) + sizecount); как раз и делает обход контейнеров.
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 21:56:59
Ясно, то есть декодирование в тот же момент, что и определение начал контейнеров. А если встречается нераскодированный контейнер - что делаешь? Блин, так и хочется сделать утилитку для импорта - экспорта xom в xml. Тогда можно будет писать проги, хоть на пхп, чтобы работать с xom)
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 27.01.2011, 22:19:51
Что ты привязался к этой xml, Лажовый формат =) По поводу не раскодированных контейнеров, так их нет, по крайне мере размеры все я знаю, или перескакиваю до следующей CNTR шапки. И тестировано со всеми XOM. Открываются без проблем.
|
|
|
|
Сообщений: 1240
|
Опубликовано: 27.01.2011, 22:23:57
Quote (AlexBond) Что ты привязался к этой xml, Лажовый формат =) Может и лажовый, но есть библиотеки для работы с ним. Можно конечно написать библиотеку для работы с xom на плюсах или c#...
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 29.01.2011, 13:05:22
Короче приколы в следующем, анимация для "молнии" имеет не синусойду, а импульсойду, что не учитывалась ранее, т.к. я брал тупо прямыми переходами из Key1 в Key2. Поэтому хочешь не хочешь, а мне придется создавать График анимации для кривой... <_<
|
|
|
|
Сообщений: 1042
|
Опубликовано: 01.02.2011, 23:04:53
Кое какой прогресс идёт...
|
|
|
|
Сообщений: 341
|
Опубликовано: 02.02.2011, 18:31:58
ты уже и хомвью 2.6 создал? Выложишь?
My Little Pony
|
|
|
|