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;
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;
Немного не в тему 2 вопроса - что кроме паскаля знаешь и изучал ли шаблоны проектирования?
Знаю php, С++, Asm, Си под Linux, Prolog, Lisp =), но люблю Delphi. Шаблоны я не смог вкурить, хотя пытался очень долго понять их суть, по мне там слишком долгая компиляция, которая не упрощает, а усложняет жизнь прогерам.
Quote (Герыч)
То есть процесс загрузки файла такой: Загрузка заголовка - узнаём список и число типов, число контейнеров и смещения их начал. Потом раскодируем каждый контейнер и с корневого контейнера собираем дерево. Так?
Число контейнеров но не смещения их начал, начала мы узнаем в процессе декодирования =)
Потом да, собираем дерево при этом одновременно декодируем <_<
По поводу не раскодированных контейнеров, так их нет, по крайне мере размеры все я знаю, или перескакиваю до следующей CNTR шапки. И тестировано со всеми XOM. Открываются без проблем.
Короче приколы в следующем, анимация для "молнии" имеет не синусойду, а импульсойду, что не учитывалась ранее, т.к. я брал тупо прямыми переходами из Key1 в Key2. Поэтому хочешь не хочешь, а мне придется создавать График анимации для кривой... <_<
За что я люблю Делфи, так это за онлайн дебагинг. Всегда можно быстро найти ошибку, очень удобно лазить по памяти в дизассемблерной части, изменять ее, что не сказать о Си Там с преобразованиями типов заколибёшся... идиотизм просто.. Я 4 часа сидел над лабой пока не понял, что функция не работает из-за того, что в часть a=x+y*d я не добавил a=(float)x+(float)y*(float)d. Или вместо 1.0 было написано 1 В Делфях такого гемора нету
Да и в Делфи очень просто бегать по типам, а вот в vc++ надо сначало все перекомпилить, причем всегда будет какая-та ошибка... которая задалбает.
Не знаю сколько бы я писал XomView и W3DMapEditor, если бы все делалось на Си++....
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 |
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