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

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

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


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

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

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


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)

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

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

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

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

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


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Анимация глаз червя из WF работает!!!
Видео прикреплено!

Теперь текстурная анимация мне подвластна =)))

Прикрепления: XomView_v2_6_20.rar (342.4 Kb)


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

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


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8

Анимация!!!


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
У Червя появились глазки wacko

Прикрепления: 8985198.png (79.8 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Игрок)
AlexBond, я обнаружил ошибки анимации в следующих файлах:

Data\Themes\ThemeArabian\A_Sky01.xom
Data\Themes\ThemeArabian\A_Sky02.xom
Data\Themes\ThemeArabian\A_Sky03.xom

Data\Themes\T hemeBuilding\B_Sky01.xom
Data\Themes\ThemeBuilding\B_Sky02.xom
Data\Themes\ThemeBuilding\B_Sky03.xom

Data\Themes\ThemeCamelot\B_Sky01.x om
Data\Themes\ThemeCamelot\B_Sky02.xom
Data\Themes\ThemeCamelot\B_Sky03.xom

Data\Themes\ThemePrehistoric\P_Sky01.xom
Data\Themes\Them ePrehistoric\P_Sky02.xom
Data\Themes\ThemePrehistoric\P_Sky03.xom

Data\Themes\ThemeWildwest\W_Sky01.xom
Data\Themes\ThemeWildwest\W_Sky 02.xom
Data\Themes\ThemeWildwest\W_Sky03.xom

Исправлены:

Прикрепления: 1490793.png (199.0 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
А что хочешь XomView 2.6? =) Рано еще!!!

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Кстати об исходнике Wormpot2.lua для W3D вот ссылка - http://w3d.wiki-site.com/index.php/Wormpot2 изучайте biggrin

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

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
А где моя любимая ДАЛФА =)

За что я люблю Делфи, так это за онлайн дебагинг. Всегда можно быстро найти ошибку, очень удобно лазить по памяти в дизассемблерной части, изменять ее, что не сказать о Си sad
Там с преобразованиями типов заколибёшся... идиотизм просто..
Я 4 часа сидел над лабой пока не понял, что функция не работает из-за того, что в часть a=x+y*d я не добавил a=(float)x+(float)y*(float)d. Или вместо 1.0 было написано 1
В Делфях такого гемора нету wink

Да и в Делфи очень просто бегать по типам, а вот в vc++ надо сначало все перекомпилить, причем всегда будет какая-та ошибка... которая задалбает.

Не знаю сколько бы я писал XomView и W3DMapEditor, если бы все делалось на Си++....


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

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


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Все кто хочет помочь, и знает программинг и английский, помогите разобраться.

Вот я нарыл статейку как устроена анимация в Maya - то бишь в Червях.

http://download.autodesk.com/us....ve.html

The Maya developer's kit ships with example code (animDemo) which demonstrates how to evaluate a Maya animation curve independent from Maya. The animation parameter curves in Maya are defined by a restricted set of cubic two-dimensional Bezier curves. It is defined by four points. P1 = (x1, y1) is the (key,value) pair for the first key. P2 = (x2, y2) is a point which defines the outgoing tangent direction at P1. P4 = (x4, y4) defines the second key and P3 = (x3, y3) is a point which defines the incoming tangent direction at P4. There are some basic restrictions for the x coordinates of these points: x1 <= x2 <= x3 <= x4.
The 2-dimensional Bezier curve is defined as

Code
  F(u) = [ u^3 u^2 u 1 ] * B * | P1 |   ,  0 <= u <= 1
                      | P2 |
                      | P3 |
                      | P4 |

          = [ B0(u) B1(u) B2(u) B3(u) ] * | x1 y1 |
                      | x2 y2 |
                      | x3 y3 |
                      | x4 y4 |

      where B is the Bezier Basis matrix  | -1  3  -3  1 |
                      |  3 -6   3  0 |
                      | -3  3   0  0 |
                      |  1  0   0  0 |

...

When evaluating an animation curve, a two stage process is used:

1. the evaluation time is examined to determine if it falls within the range of the animation curve, and if it does not evaluation is based upon the infinity settings for the animation curve.
2. if the evaluation time falls within the range of the animation curve, the bezier parameters of the curve are computed and used as described below.

Animation curves may have either weighted or non-weighted tangents. With non-weighted tangents, tangents are implemented as vectors and P2 and P3 are internally adjusted to account for the time difference between P1 and P4.

When evaluating a time within a segment, the following algortithms are used:

Code
For weighted tangents:
         where x is the start of the segment
         given the bezier x parameters a', b', c', d', find the parameter t
         which satisfies the formula:
                 (time - x) = (t^3 * a') + (t^2 + b') + (t * c') + d'
         with t (and the bezier y parameters a, b, c, d) compute the value as:
                 v = (t^3 * a) + (t^2 + b) + (t * c) + d

For non-weighted tangents:
         where x is the start of the segment
         compute the parameter t as time - x
         with t (and the bezier y parameters a, b, c, d) compute the value as:
                 v = (t^3 * a) + (t^2 + b) + (t * c) + d


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)
неплохо, но пытайся форматировать код.. отступы и всё такое... приучай писать не только хорошо, но и красиво)

Меня меня пручи =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
И еще одна ссылка по тому же разделу. но о формате записи анимации...
http://download.autodesk.com/us....mat.htm


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Пример данных из анимации WXP_Mesh_024.xom:

"WXM_DefSource" (4.50s)
joint1|joint2.pos.x.keys[10] (2)
0. [0.32; 0.95; 0.32; 0.95; 0.00; 3.13]
1. [0.48; -0.88; 0.48; -0.88; 0.42; 3.68]
2. [0.90; -0.43; 0.90; -0.43; 0.88; 1.53]
3. [0.94; 0.33; 0.94; 0.33; 1.42; 3.21]
4. [0.67; 0.74; 0.67; 0.74; 1.96; 1.91]
5. [0.90; 0.44; 0.90; 0.44; 2.38; 4.26]
6. [0.98; 0.20; 0.98; 0.20; 2.88; 2.36]
7. [0.98; -0.20; 0.98; -0.20; 3.42; 4.47]
8. [0.63; -0.78; 0.63; -0.78; 4.04; 2.13]
9. [0.31; 0.95; 0.31; 0.95; 4.50; 3.13]
joint1|joint2.pos.y.keys[9] (2)
0. [0.58; -0.81; 0.58; -0.81; 0.00; -0.41]
1. [0.73; -0.68; 0.73; -0.68; 0.42; 0.79]
2. [0.58; -0.82; 0.58; -0.82; 0.83; -1.18]
3. [0.98; -0.21; 0.98; -0.21; 1.54; -0.80]
4. [0.63; 0.77; 0.63; 0.77; 2.08; -1.44]
5. [0.66; 0.75; 0.66; 0.75; 2.88; 0.82]
6. [0.93; 0.36; 0.93; 0.36; 3.29; -0.07]
7. [0.96; -0.27; 0.96; -0.27; 3.92; 1.23]
8. [0.84; -0.55; 0.84; -0.55; 4.50; -0.41]
pPlaneShape1_lambert2.texpos.y.keys[73] (0)
0. [0.24; 0.97; 0.00; 0.00; 0.00; 0.00]
1. [0.24; 0.97; 0.00; 0.00; 0.06; 0.25]
2. [0.24; 0.97; 0.00; 0.00; 0.13; 0.50]
3. [0.24; -0.97; 0.00; 0.00; 0.19; 0.75]
4. [0.24; -0.97; 0.00; 0.00; 0.25; 0.00]
5. [0.24; 0.97; 0.00; 0.00; 0.31; 0.25]
6. [0.24; 0.97; 0.00; 0.00; 0.38; 0.50]
7. [0.24; -0.97; 0.00; 0.00; 0.44; 0.75]
8. [0.24; -0.97; 0.00; 0.00; 0.50; 0.00]

pPlaneShape1_lambert2.texpos.y.keys - должна быть импульсной... Какая же формула?

Прикрепления: 0344153.png (45.4 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
хорошо расшифрую:

2. [0.90; -0.43; 0.90; -0.43; 0.88; 1.53]

ключ третий N (расчет с нуля), анимации объекта joint1|joint2 для значения pos.x

tanIn (0.90;-0.43)
tainout(0.90;-0.43)
time (0.88)
value (1.53)

Итого структура keys имеет вид:

N. [tanin.X;tanin.Y;tanout.X;tanout.Y;time;value]

Я так понимаю, если брать два ключа:

0. [0.32; 0.95; 0.32; 0.95; 0.00; 3.13]
1. [0.48; -0.88; 0.48; -0.88; 0.42; 3.68]

То по выше принятому объяснению http://w4tweaks.ru/forum/105-1304-30907-16-1296677682 , для этого участка:
P1 = (0.00; 3.13)
P2 = (0.32; 0.95)
P3 = (0.48; -0.88)
P4 = (0.42; 3.68)

Проблема в том что P2 и P3 находятся в пределах (-1..1)
А P1 и P2 вообще в своей системе координат (time;value);

Как нарисовать кривую P1P4 ?


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Ничего не получается, попытался ввести в 3DSMAX координаты этой кривой, но импульсы нужной формы не получаются...

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

Прикрепления: 4101812.png (30.3 Kb)


 
Поиск: