|
Deformers struct in MDL7 abspeichern.
#467669
08/20/17 15:41
08/20/17 15:41
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
hey leute ich bin am ende meiner latien. ich würde gerne das deformer struct im mdl7 abspeichern das mdl7 besteht aus:
MD7_HEADER
char ident[4]; // "MDL7"
long version; // '0', 'sub'- version number;
long bones_num;
long groups_num;
long mdl7data_size; // this file size (head included), except entlump and medlump.
long entlump_size; // entity info size (not yet used, always 0)
long medlump_size; // size of data for MED in bytes
unsigned short md7_bone_stc_size;
unsigned short md7_skin_stc_size;
unsigned short md7_colorvalue_stc_size;
unsigned short md7_material_stc_size;
unsigned short md7_skinpoint_stc_size;
unsigned short md7_triangle_stc_size;
unsigned short md7_mainvertex_stc_size;
unsigned short md7_framevertex_stc_size;
unsigned short md7_bonetrans_stc_size;
unsigned short md7_frame_stc_size;
struct MD7_BONE
{
unsigned short parent_index;
BYTE _unused_[2]; //
float x,y,z;
//ws, 12.05.2003: bone name mitspeichern...
char name[MAX_BONENAMESIZE];
};
struct MD7_GROUP
{
unsigned char typ; // = '1' -> triangle based Mesh
//ws, 26.04.2006 max weights per vertex
// BYTE _unused_[3];
BYTE deformers;
BYTE max_weights;
BYTE _unused_;
long groupdata_size; // size of data for this group in bytes ( MD7_GROUP stc. included).
char name[MAX_GROUPNAMESIZE];
long numskins;
long num_stpts; // number of 2D skin vertices
long numtris;
long numverts;
long numframes;
};
struct MD7_DEFORMER
{
BYTE deformer_version; // 0
BYTE deformer_typ; // 0 - bones
BYTE _unused_[2];
long group_index;
long elements;
long deformerdata_size;
};
struct MD7_DEFORMERELEMENT
{
long element_index; // bei deformer_typ==0 (==bones) element_index == bone index
char element_name[MAX_BONENAMESIZE];
long weights;
};
struct MD7_DEFORMERWEIGHT
{
long index; // bei deformer_typ==0 (==bones) index == vertex index
float weight;
};
MD7_HEADER,MD7_BONE und MD7_GROUP kann ich abspeichern header bone und group speicher ich so ab:
file.write(struct.pack("<4sllllllHHHHHHHHHH",
b,
0,
len(self.bones),
len(self.groups),
self.getsize(), # 0 = subversion
0, # entlumpsize,
0, # medlumpsize
36,
28,
16,
68,
8,
16,
26,
26,
68,
24))
for bone in self.bones:
bone.write(file)
for group in self.groups:
group.write(file)
das bone write und group write sieht so aus:
//bone
file.write(struct.pack("<HHfff20s",
self.parentindex, 0,
self.x, self.y, self.z, b))
---------------------------------------------------------------
//group
file.write(struct.pack("<BBBBl16slllll",
1, # type 1 = triangle mesh
0, # deformers ??
0, # max_weights ??
0, #
self.getsize(),
b,
len(self.skins),
len(self.uvs),
len(self.triangles),
len(self.vertices),
len(self.frames)))
und jetzt das problem: bei groups wird ein deformer mit gegeben und ein max_weight. aber ich weis nicht in welcher reihenfolge und auch nicht genau welche formater also schreibe ich die deformer direkt nach dem group pack
if extension == "mdl":
file.write(struct.pack("<BBBlll",
deformer_version, # 0
deformer_typ, # 0 - bones
0, # _unused_[2] evtl ändern zu " 0,0, und ein B hinzufügen"
group_index,
len(deformer_elements),
deformerdata_size # <-- ?? XDD shit xD
))
for element in deformer_elements:
b = bytearray()
b.extend(map(ord, element[1]))
file.write(struct.pack("<l16sl",
element[0], # element[0] == bone index nummer evtl ändern auf " element[0] -1 " !!!
b, # element[1] == bone name || b == element[1]
len(element[2]) # länge von weights
))
for weight in element[2]:
file.write(struct.pack("<Hf",
weight[0], # weight[0] == vertex index
weight[1] # weight[1] == weight
))
ich gehe von folgender hierarchie aus: MDL7 ____+bones ____+groups ____+deformer _______+elements ___________+weights
ist das korrekt oder muss ich: MDL7 ____+bones ____+groups _______+deformer __________+elements ______________+weights
? wie genau werden die deformers binär abgespeichert? und was erwartet die group bei deformers und max_weights?
Last edited by tagimbul; 08/20/17 15:45.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: Ch40zzC0d3r]
#467760
08/27/17 21:16
08/27/17 21:16
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
hey =) freut mich das du bei sowas durchblickst! reverse engineering ist mir zwar ein begriff, wurde mich auch schon empfohlen bei meinem problem, aber ich weis zu wenig über binäre formate um diese technik anzuwenden.
kannst du mir das bitte genauer erklären?
also ich würde in Blender ein model mit weights machen und es dann zum MED exportieren mit der FBX import variante. dann hätte ich ein MDL model mit dem deformer struct bzw. mit weights.
dann wie weiter? kannst du mir das schritt für schritt erklären?
freundliche grüsse tom
Last edited by tagimbul; 08/27/17 21:17.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467761
08/27/17 21:51
08/27/17 21:51
|
Joined: Oct 2011
Posts: 1,082 Germany
Ch40zzC0d3r
Serious User
|
Serious User
Joined: Oct 2011
Posts: 1,082
Germany
|
Du benutzt einen hex editor wie 010 editor oder parst die datei mit deinem code. Entweder parst du es jetzt von hand und findest die deformer daten so, oder hat dein script findet daten die es nicht bearbeiten kann. Reverse engineering eines dateiformates braucht ein gewisses verständnis von dateisystemen und allgemeinen dateiformaten (speichern von daten auf einem begrenzten medium zum späteren parsen). Was man dann genau macht bzw. wie man genau rangeht ist jedes mal verschieden und basiert auf dem jeweiligen wissen welches man besitzt. In deinem fall würde ich das vorhanden wissen einfach mal nutzen, und bekannte daten aus der datei "schneiden" - also entfernen. Danach bleibt das übrig was du nicht kennst, dann markierst du dir die stellen und findest anhanf der daten heraus wie genau die struktur aussieht. Das ganze klingt relativ abstrakt, du solltest es einfach mal anwenden. Reverse engineering ist eigentlich nur logik kombiniert mit dem oben genannten wissen
Last edited by Ch40zzC0d3r; 08/27/17 21:51.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: Ch40zzC0d3r]
#467765
08/28/17 17:58
08/28/17 17:58
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ok. ich hab mich in dieses Thema eingearbeitet und weis nun genau was ich zu tun habe =) vielen dank für den Anstoss!
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467819
09/03/17 08:04
09/03/17 08:04
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
man ich bin so aufgeregt hätte ich doch von anfang an das mdl7 versucht zu parsen beim parsen vielen mir so viele details auf die ich bei meinem exporter noch garnicht berücksichtig hatte! und gleichzeitig ist es eine super lehrstunde in sachen binär und hex verarbeitung^^ bin nun etwa bei 50% und nähere mich dem deformer struct immer wie mehr ich mache es nun so das ist den parser nutze um das mdl 7 in ein text dokument zu verwandeln. den code werde ich dann auch zur verfügung stellen =) bisher habe ich ja nur versucht den alten exporter von thomas oppl zu updaten. aber wenn ich den parser fertig habe werde ich einen ganz neuen und eigenen exporter kreieren der wirklich alles berücksichtigt was das mdl7 file zu bieten hat. danke nochmal für den crashkurs Ch40zzC0d3r ^^
Last edited by tagimbul; 09/03/17 08:05.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467876
09/05/17 12:23
09/05/17 12:23
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ich peil's nicht.... ich kriege das ganze file geparst aber dann sind da, ohne deformer's, noch ein paar bytes übrig mit bone strings drin. die kommen nach dem parsen von den frame matrizen:
05 00 00 00 0C 00 00 00 4D 42 49 00 01 00 00 00
10 02 00 00 02 00 00 00 94 00 00 00 02 00 00 00
42 6F 6E 65 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 BC C1 00 00 00 BF 00 00 00 41 00 00 00 00
04 00 00 00 00 00 00 00 42 6F 6E 65 31 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
42 6F 6E 65 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 C0 41 00 00 00 00
00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
03 00 00 00 64 01 00 00 02 00 00 00 01 00 00 00
02 00 00 00 42 6F 6E 65 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 80 3F 00 00 00 00 00 00 00 00
DD 0F C9 BF 00 00 00 00 00 00 00 00 00 00 00 00
18 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 42 6F 6E 65 31 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 80 3F 00 00 00 00 00 00 00 00
35 05 AC 3F 00 00 00 00 00 00 00 00 00 00 00 00
18 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 02 00 00 00 01 00 00 00 42 6F 6E 65
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3F
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 18 00 00 00 01 00 00 00
00 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 01 00 00 00
00 00 00 00
was könnte das noch sein? es handelt sich hierbei um ein mdl7 file das im MED erzeugt wurde. kann das doch das deformer struct sein? weill in der group steht deformers = 0 also muss das ja was anderes sein... oder speichert MED deformers auch wenn sie garnicht benutzt werden? edit: ich habe auch beim parsen das mdl7data_size erreicht. dann hab ich noch das medlump_size übrig das ist genau der teil wo da steht. es hat eine anzahl von 548 hex und medlump_size hat eine grösse von 548 aber wieso sind dort strings drin? laut Mdl7.h sind das 2 +3 int's....
Last edited by tagimbul; 09/05/17 12:35.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: FBL]
#467883
09/05/17 18:23
09/05/17 18:23
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
jo denke ich auch. hab grad den teil auch binär rausgeschniten und MED ladet es trozdem ^^ naja fürs abspeichern kann ich dann dort einfach size auf 0 machen und ignorieren.
Last edited by tagimbul; 09/05/17 18:23.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: FBL]
#467888
09/05/17 21:19
09/05/17 21:19
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
sooo hab den code geknakt^^ muss nurnoch die verschiedenen skin typen machen dann hab ich's ^^ mir gehts vorallem um die deformers. hauptprojekt ist ja ein blender exporter. bin nun richtig nah dran
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467908
09/07/17 12:02
09/07/17 12:02
|
Joined: Jul 2000
Posts: 27,982 Frankfurt
jcl
Chief Engineer
|
Chief Engineer
Joined: Jul 2000
Posts: 27,982
Frankfurt
|
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: jcl]
#468149
09/20/17 15:18
09/20/17 15:18
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ich peil es nicht ... ich exportiere mein model mit meinem exporter, lese es aus mit meinem parser. der sagt alles wird korrekt geparst. er kann auch die deformers raus lesen... und doch nutzt es beim test mit einem lite c script nicht die deformer sondern den bone_index im MD7_MAINVERTEX struct
in der group ist der deformer auf 1 gesetzt max_weight auf 4
im c script hab ich max_bones auf 4 was übersehe ich? muss man in lite c noch etwas einstellen damit es die deformer nutzt?
edit: moment mal... im handbuch unter max_bones
A7 P (niedrigere Versionen verwenden nur den allerwichtigsten Bone per Vertex)
ich dachte com version kann weights nutzen? o.O
Last edited by tagimbul; 09/20/17 15:20.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: jcl]
#468178
09/22/17 14:57
09/22/17 14:57
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
JAAAA !!! ich habs hingekrigt xDDD und der fehler ist ja mal so bescheuert xD ich hab bisher alles richtig exportiert. deformer und alles wurden korekt exportiert. nur habe ich nie das model nach dem exportieren im MED nochmal abgespeichert.
aber dann ist da etwas wo ich nicht weiss was es ist. nachdem ich die mein model exportiere und das daraus entstandene model mit dem med abspeichere kommen da ein paar neue daten hinzu. aber das ist kein entlump oder medlump...
edit:
ich muss den parser neu anpassen nach dem speichern mit dem med verändern sich ein paar sachen
Last edited by tagimbul; 09/22/17 15:17.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#468179
09/22/17 15:58
09/22/17 15:58
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
Engine screenshot: das forderes mit und das hindere ohne deformer =)
Last edited by tagimbul; 09/22/17 15:58.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#468195
09/23/17 19:37
09/23/17 19:37
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
.....bin fertig der letzte fehler war: MED will ein erstes frame. und damit die deformer funktionieren muss bei diesem ersten frame die bonestransformations matrix für jedes bone abgespeichert werden. jetzt kann ich mit weights exportieren und das ganze direkt mit dem SED starten ohne einen zwischenschrit beim MED machen zu müssen. projekt erfolgreich wuuhuu jetzt muss ich nurnoch ein paar hardcode elemente umgestalten dann mache ich mal ne beta version für euch
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: Superku]
#468215
09/25/17 17:07
09/25/17 17:07
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
eine frage zu groups: werden die animationen in der ersten gruppe abgespeichert oder kann man die animationen in verschiedenen groups abspeichern? oder braucht jede group eine einziges leeres animations frame?
ich versuche gerade gruppen abzuspeichern. mit und ohne animationen
Last edited by tagimbul; 09/25/17 19:37.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#468219
09/26/17 00:06
09/26/17 00:06
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ah ich habs rausgefunden^^ ich doofi hab ja ein parser ^^ ich habe ein model mit einer gruppe das deformers hat im MED ein block hinzugefügt als einzelne gruppe und seperat gespeichert dann beide geparst und verglichen ^^ jede gruppe benötigt jedes frame aber ohne vertex oder bones transformationen einfach eine art platzhalter. das heisst glaubs das in die erste gruppe alle bones transformationen geschriben werden und die restlichen einfach einen string bekommen. edit: es geeeht ^^ wuupwuuup ^^ damit ist er nun glaub echt fertig
Last edited by tagimbul; 09/26/17 00:25.
|
|
|
|