Ich habe mein System aufgrund einiger Fehler komplett neu machen müssen, doch beim installieren aller Programme ist mir etwas aufgefallen was mich bis jetzt schon viele Stunden suchen und noch mehr nerfen gekostet hat. Ich habe mein Milkshape mit meinem cmp importer vergessen zu saven.
Nun ist es aber fast unmöglich ein altes Milkshape bzw ein neueren cmp importer zu finden, darum dachte ich eventuell könnte man soetwas selber schreiben? gibt es da möglichkeiten?
es haben schon viele Leute zu den unterschiedlichsten zwecken das Format aufgeschlüsselt, es ist meines wissens nach statisch und verwendete Texturen werden in .mat dateien gespeichert (sie müssen nicht mehr einzeln vorliegen).
es gibt nun 2 Möglichkeiten wie ich weiterkommen könnte
1. es geht das ich einen Loader schreibe für die cmp und mat dateien 2. ich kann einen importer für milkshape oder Blender schreiben
beides hab ich noch nicht gemacht aber das hat mich noch nie davon abgehalten euch zu fragen, alles zu lesen was ich irgendwoher bekomme und es dann zu versuchen
hat jemand eine ahnung wie man sowas anfängt bzw wie das gehen könnte?
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
With glmodel you can read and write milksape ascii files. (also .obj and read .3ds and. x files). It can also read .obj and write milkshape ascii. It is also possible to extend it with other formats e.g. binarie mikshape files, but you have to write code to do so extending base classes.
das bringt mich aber nicht wirklich weiter, da ich ja keine .obj dateien habe sondern nur *.cmp, *.sur, *.mat und *.3db dateien ich habe diese immer in *.obj dateien umgewandelt, andersherum bringt mir das leider nix, oder hab ich jetzt einfach was bei der übersetzung deines beitrages verhauen?
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
So those .cmp files are not milksape files? You know how these files are constructed? glmodel can load and save .obj. have a look how the sources look for .obj. Maybe that help you to make a reader for your .cmp files?
ernsthaft habe ich nicht wirkocub eine ahnung, andere aufschlüsselungen haben die .cmp dateien immer Baumartig dargestellt,
und zum laden von .obj dateien nutze ich derzeit den WFObjLoader, dieser funktionier sehr gut und vorallem einfach
aber ich habe gerade gesehen, ich hab den sourcecode für den importer bekommen, nun muss ich es nur noch hinbekommen das das auch mit der neuen milkshape version funktioniert
doch schon, meine quelltecte schreibe ich in Delphi aber milkshape plugins sind in c++ geschrieben und dafür brauchte ich Visual studio weil ich hab den source code für den importer aber leider kann ich es selber nicht debuggen (hab keine ahnung wie das geht^^)
also das cmp format, mal sehen ob ich dir genügend info´s dazu geben kann
-cmp dateien sind modell dateien( wie .obj zb) -zu jeder cmp datei gehört eine .mat datei in der die Texturen liegen -cmp dateien sind baumartig aufgebaut ähnlich den windows explorer Datei-Baum -es werden einfache Animationen unterstützt, wieviele weiß ich nicht aber es sind einige -genutzt wird es von Microsofts Freelancer
ich hab mir jetzt mal das plugin angesehen un herausgefunden welche procedure dafür zuständig ist die cmp daten zu öffnen und auszulesen aber ich versteh den code nicht ganz
ich setz ihn mal hier rein,
wie gesagt ich habe einen funktionsfähigen code, nur das plugin an sich ist nicht mehr kompatibel
Zitat:
//--------------------------------------------------------------------------- // TCMPImporter::OpenCMPFile() // // Try to open the CMP model. Will load and store the UTF file and then // go one to parse the LODs it contains. //--------------------------------------------------------------------------- void __fastcall TCMPImporter::OpenCMPFile(AnsiString FileName) { __ENTERFUNCTION__; try { if (FileExists(FileName)) { if (!CMPFile->LoadFromFile(FileName)) throw EFOpenError("File does not appear to be a Freelancer CMP model in UTF format.");
CMPFileName = OpenDialog->FileName; lbLOD->Items->Clear(); lbLOD->ItemIndex = -1; for (int n=0; n<CMPFile->Count; n++) { TUTFTreeNode *node = CMPFile->Items[n]; if (!CompareText(node->Name,"VMeshData")) lbLOD->Items->AddObject(CMPFile->Items[node->Parent]->Name,(TObject *)n); } // for (int n=0; n<CMPFile->Count; n++) if (!lbLOD->Items->Count) throw Exception("Freelancer UTF file contains no VMeshData nodes - no models present in file"); else if (lbLOD->Items->Count == 1) { lbLOD->ItemIndex = 0; lbLODClick(NULL); } } // if (OpenDialog->Execute() && FileExists(OpenDialog->FileName)) } // try catch (Exception &e) { MessageDlg(String(e.ClassName()) + " - " + String("Could not open model:\n") + e.Message, mtError, TMsgDlgButtons() << mbOK, 0); LOG(__FILE__, __LINE__, "Exception class " + e.ClassName() + " in function " + __FUNC__); __LEAVEFUNCTION__; } // catch UpdatePanels(); __LEAVEFUNCTION__; } // void __fastcall TCMPImporter::OpenCMPFile(AnsiString FileName) //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- // TCMPImporter::lbLODClick() // // lbLOD listbox OnClick event handler // Load and parse the VMesh LOD selected by the user, and display the // materials in that VMesh. //--------------------------------------------------------------------------- void __fastcall TCMPImporter::lbLODClick(TObject *Sender) { __ENTERFUNCTION__; if (lbLOD->ItemIndex != -1) { int CMPNodeNum = (int)lbLOD->Items->Objects[lbLOD->ItemIndex]; TUTFTreeNode *VMeshNode = CMPFile->Items[CMPNodeNum]; TBufferStream *VMeshStream; unsigned VMeshID = generate_crc(lbLOD->Items->Strings[lbLOD->ItemIndex].c_str());
VMesh->Clear(); lbMaterials->Clear();
VMeshStream = new TBufferStream(VMeshNode->Data, VMeshNode->AllocatedDataSize); VMesh->LoadFromStream(VMeshStream); delete VMeshStream;
for (int n = 0; n < VMesh->Materials->Count; n++) { TMaterial *Material = VMesh->Materials->Items[n]; lbMaterials->Items->AddObject(Material->Name, (TObject *)n); } // for (int n = 0; n < VMesh->Materials->Count; n++)
int CmpndIndex = CMPFile->IndexOf("\\Cmpnd");
if (CmpndIndex != -1) { TUTFTreeNode *Cmpnd = CMPFile->Items[CmpndIndex]; int CmpndSiblingIndex = Cmpnd->Child; AnsiString VMeshGroupName;
// Check out each VMeshRef node - it tells us what meshes are in each "mesh group". while (CmpndSiblingIndex) { int ObjectNameIndex, FileNameIndex; ObjectNameIndex = CMPFile->Items[CmpndSiblingIndex]->ChildByName("Object name"); FileNameIndex = CMPFile->Items[CmpndSiblingIndex]->ChildByName("File name"); if (ObjectNameIndex != -1 && FileNameIndex != -1) { AnsiString VMeshRefParentName = String("\\") + String((char *)CMPFile->Items[FileNameIndex]->Data) + String("\\MultiLevel"); AnsiString VMeshRefName; int VMeshRefParentIndex = CMPFile->IndexOf(VMeshRefParentName); int VMeshRefIndex;
if (VMeshRefParentIndex == -1) { CmpndSiblingIndex = CMPFile->Items[CmpndSiblingIndex]->Sibling; continue; } // if (VMeshRefParentIndex == -1) VMeshRefIndex = CMPFile->Items[VMeshRefParentIndex]->Child; while (VMeshRefIndex) { int Index = CMPFile->IndexOf(VMeshRefParentName + "\\" + CMPFile->Items[VMeshRefIndex]->Name + "\\VMeshPart\\VMeshRef"); if (Index != -1 && CMPFile->Items[Index]->AllocatedDataSize >= 60) { TRawVMeshRef *VMeshRef = (TRawVMeshRef *)CMPFile->Items[Index]->Data; if (VMeshRef->Signature1 == 0x0000003c) { if (VMeshRef->VMeshID == VMeshID) { VMesh->MeshGroups->Add((char *)CMPFile->Items[ObjectNameIndex]->Data, VMeshRef->StartMesh, VMeshRef->MeshCount, VMeshRef->StartVertex, VMeshRef->EndVertex, VMeshRef->StartVertexRef, VMeshRef->EndVertexRef); break; } // if (VMeshRef->VMeshID == VMeshID) } // if (VMeshRef->Signature1 == 0x0000003c) else throw Exception("Error: VMeshRef data has wrong signature. The model .cmp file\r\nmay have corrupted data in it."); } // if (Index != -1 && CMPFile->Items[Index]->AllocatedDataSize >= 60) VMeshRefIndex = CMPFile->Items[VMeshRefIndex]->Sibling; } // while (VMeshRefIndex) } // if (ObjectNameIndex != -1 && FileNameIndex != -1) CmpndSiblingIndex = CMPFile->Items[CmpndSiblingIndex]->Sibling; } // while (CmpndSiblingIndex)
// Look in the \Cmpnd\Cons\* nodes - they contain data that links // each mesh to the "root" mesh - tells us where the origin of // a mesh group is. int ConsIndex = Cmpnd->ChildByName("Cons"); if (ConsIndex != -1) { int ConsChildIndex = CMPFile->Items[ConsIndex]->Child; while (ConsChildIndex) { if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawFixedCons))) { for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawFixedCons); n++) { TRawFixedCons *Construct = (TRawFixedCons *)CMPFile->Items[ConsChildIndex]->Data + n; int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName); if (MeshGroupIndex != -1) { TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex]; MeshGroup->OriginX = Construct->OriginX; MeshGroup->OriginY = Construct->OriginY; MeshGroup->OriginZ = Construct->OriginZ; } // if (MeshGroupIndex != -1) } // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++) } // if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawFixedCons))) else if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawRevoluteCons))) { for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawRevoluteCons); n++) { TRawRevoluteCons *Construct = (TRawRevoluteCons *)CMPFile->Items[ConsChildIndex]->Data + n; int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName); if (MeshGroupIndex != -1) { TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex]; MeshGroup->OriginX = Construct->OriginX; MeshGroup->OriginY = Construct->OriginY; MeshGroup->OriginZ = Construct->OriginZ; } // if (MeshGroupIndex != -1) } // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++) } // else if (!(CMPFile->Items[ConsChildIndex]->DataSize % sizeof(TRawRevoluteCons))) else { for (unsigned n = 0; n < CMPFile->Items[ConsChildIndex]->DataSize / sizeof(TRawSphereCons); n++) { TRawSphereCons *Construct = (TRawSphereCons *)CMPFile->Items[ConsChildIndex]->Data + n; int MeshGroupIndex = VMesh->MeshGroups->IndexOf(Construct->PartName); if (MeshGroupIndex != -1) { TMeshGroup *MeshGroup = VMesh->MeshGroups->Items[MeshGroupIndex]; MeshGroup->OriginX = Construct->OriginX; MeshGroup->OriginY = Construct->OriginY; MeshGroup->OriginZ = Construct->OriginZ; } // if (MeshGroupIndex != -1) } // for (unsigned n = 0; n < CMPFile->Items[Index]->DataSize / sizeof(TRawConstruct); n++) } // else ConsChildIndex = CMPFile->Items[ConsChildIndex]->Sibling; } // while (ConsChildIndex) } // if (ConsIndex != -1) } // if (CmpndIndex != -1) } // if (lbLOD->ItemIndex != -1) ScanMaterials(ModelFileName); UpdatePanels(); __LEAVEFUNCTION__; } // void __fastcall TCMPImporter::lbLODClick(TObject *Sender) //---------------------------------------------------------------------------
nun ist eigentlich fast alles klar ich muss die ganze sache punkt für punkt einlesen und dann immer schön in dreiergrüppchen als dreieck rendern lassen
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.