Deformers struct in MDL7 abspeichern.

Posted By: tagimbul

Deformers struct in MDL7 abspeichern. - 08/20/17 15:41

hey leute ich bin am ende meiner latien.
ich würde gerne das deformer struct im mdl7 abspeichern

das mdl7 besteht aus:


Code:
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:
Code:
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:
Code:
//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

Code:
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:

Quote:

MDL7
____+bones
____+groups
____+deformer
_______+elements
___________+weights



ist das korrekt oder muss ich:


Quote:

MDL7
____+bones
____+groups
_______+deformer
__________+elements
______________+weights

?
wie genau werden die deformers binär abgespeichert? und was erwartet die group bei deformers und max_weights?
Posted By: tagimbul

Re: Deformers struct in MDL7 abspeichern. - 08/21/17 19:44

Keiner eine Ahnung?
lg tom
Posted By: tagimbul

Save "Deformer" in the MDL7 Binary file? - 08/24/17 08:01

Have anyone idea how to write the deformer struct correctly in binary?
Posted By: jcl

Re: Save "Deformer" in the MDL7 Binary file? - 08/27/17 16:13

Da muss auch ich passen. Das Deformer struct hat schon seit vielen Jahren keiner mehr angefasst.
Posted By: Ch40zzC0d3r

Re: Save "Deformer" in the MDL7 Binary file? - 08/27/17 16:33

Warum suchst / baust du dir nicht ein modell in MED was diese Daten nutzt und reverse engineerst das ganze?
Sollte doch nicht allzu schwer sein, einfach 010 Editor laden und die structs schreiben, der supported C syntax und Zusätze
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 08/27/17 21:16

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
Posted By: Ch40zzC0d3r

Re: Save "Deformer" in the MDL7 Binary file? - 08/27/17 21:51

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 laugh
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 08/28/17 17:58

ok.
ich hab mich in dieses Thema eingearbeitet und weis nun genau was ich zu tun habe =)
vielen dank für den Anstoss! grin
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/03/17 08:04

man ich bin so aufgeregt grin
hätte ich doch von anfang an das mdl7 versucht zu parsen grin
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 grin
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 ^^
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 12:23

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:
Code:
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....
Posted By: FBL

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 17:07

medlump? Also MED Klumpen?
Kann es sein, dass MED irgendwelche Metadaten in die MDLs ballert (bähhhhh)?

Dann kannst du das völlig ignorieren.
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 18:23

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.
Posted By: ventilator

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 18:36

ja, medlump kannst du ignorieren.

das mit dem schreiben in eine textdatei ist eine gute idee. ich habe es damals ähnlich gemacht. (später habe ich sogar einen kompletten mdl7 viewer geschrieben, weil ich es anders nicht schaffte die bone matrizen zu verstehen. :))
Posted By: FBL

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 20:36

Ich hatte mal ein Problem in Dark GDK (das ist son DarkBasic für C++, sehr schlimm), zu .x konvertierte MDL5 Modelle zu laden. Es war immer irgendwas falsch. Am Ende hab ich mir einfach direkt nen MDL5 Loader geschrieben. Der war binnen nem Tag fertig grin
Aber MDL5 ist auch deutlich einfacher gestrickt.
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/05/17 21:19

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 grin
Posted By: jcl

Re: Save "Deformer" in the MDL7 Binary file? - 09/07/17 12:02

Ich bin beeindruckt.
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/20/17 15:18

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
Posted By: jcl

Re: Save "Deformer" in the MDL7 Binary file? - 09/21/17 15:53

Ich glaube, dass die Weights auch mit der A8 Commercial Version unterstützt werden. Zumindest steht das so auf meiner Liste. Aber ich werde mal nachsehen.
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/22/17 14:57

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


Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/22/17 15:58

Engine screenshot:


das forderes mit und das hindere ohne deformer =)
Posted By: jumpman

Re: Save "Deformer" in the MDL7 Binary file? - 09/22/17 17:36

what are you trying to do Tagimbul? Are you making a blender exporter to MED, but trying to figure out what the extra data is in a MDL file?
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/23/17 09:04

i make a blender MDL7 file exporter.
i try that blender export a MDL7 that you dont need to edit in MED

blender -> SED

MED -> R.I.P ^^
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/23/17 19:37

.....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 grin wuuhuu grin

jetzt muss ich nurnoch ein paar hardcode elemente umgestalten dann mache ich mal ne beta version für euch
Posted By: Superku

Re: Save "Deformer" in the MDL7 Binary file? - 09/23/17 19:58

Gratulation und Respekt! wink
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/25/17 17:07

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
Posted By: tagimbul

Re: Save "Deformer" in the MDL7 Binary file? - 09/26/17 00:06

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 grin
© 2024 lite-C Forums