Leveleditor, Objekt Markieren, beschleunigen
-
Hallo,
ich habe in meinem Leveleditor die Möglichkeiten Polygon Markieren und Objekt Markieren. Ersteres ist klar. Bei Objekt markieren will ich alle Polygone ebenfalls markieren, die an dem angeklickten Polygon anhängen. So kann ich zum Beispiel in einer Map eine Kiste ganz schnell markieren, da alle 12 Polygone miteinander zusammenhängen. Nur scheint mir mein Lösungsweg nicht der beste zu sein. Ich habe das bisher so gelöst:
Ich klicke auf ein Polygon und erfahre jeden Wert von seinen 3 Ecken im Indexbuffer. Dann habe ich eine Funktion geschrieben AddPolygonNeighbours. Diese erwartet diese 3 Werte aus dem Indexbuffer. Nun geht sie durch den kompletten Indexbuffer und schaut ob eines aller Polygone einen Eckpunkt hat, dessen Zuordnung im Indexbuffer den gleichen Wert von den 3 übergebenen hat. Wenn es eines gefunden hat, ruft es mit dem neuen Polygon nochmal AddPolygonNeighbours auf. Um eine Endlosschleife zu vermeiden (Nachbarpolygone würden logischerweise in einer Endlosschleife enden), habe ich noch einen vector erstellt, in dem alle schon vorhandenen Polygone gespeichert werden. Vielleicht mal Code zur Veranschaulichung:void MAIN::AddPolygonNeighbours(WORD Ind1, WORD Ind2, WORD Ind3) { m_select.AddPolygon(m_model.v[Ind1].position, m_model.v[Ind2].position, m_model.v[Ind3].position, D3DXVECTOR3(0.0f, 0.0f, 0.0f)); for(int i = 0; i < m_model._header.iPolygons*3; i+=3) { if(m_model.dwIndicies[i] == Ind1 || m_model.dwIndicies[i] == Ind2 || m_model.dwIndicies[i] == Ind3 || m_model.dwIndicies[i+1] == Ind1 || m_model.dwIndicies[i+1] == Ind2 || m_model.dwIndicies[i+1] == Ind3 || m_model.dwIndicies[i+2] == Ind1 || m_model.dwIndicies[i+2] == Ind2 || m_model.dwIndicies[i+2] == Ind3) { if(!(m_model.dwIndicies[i] == Ind1 && m_model.dwIndicies[i+1] == Ind2 && m_model.dwIndicies[i+2] == Ind3)) { BOOL bMay = TRUE; for(int y = 0; y < AlreadyInserted.size(); y++) { if(AlreadyInserted[y].w1 == m_model.dwIndicies[i] && AlreadyInserted[y].w2 == m_model.dwIndicies[i+1] && AlreadyInserted[y].w3 == m_model.dwIndicies[i+2]) { bMay = FALSE; break; } } if(bMay) { TRIANGLE t; t.w1 = m_model.dwIndicies[i]; t.w2 = m_model.dwIndicies[i+1]; t.w3 = m_model.dwIndicies[i+2]; AlreadyInserted.push_back(t); AddPolygonNeighbours(m_model.dwIndicies[i], m_model.dwIndicies[i+1], m_model.dwIndicies[i+2]); } } } } }
Kann man diesen Vorgang irgendwie beschleunigen? Ich muss den ganzen Code jetzt sowieso auf die Daten der Eckpunkte übertragen, da auch mal ein und der selbe Eckpunkt 2mal vorkommen können, und somit Polygone scheinbar nicht direkt aneinander liegen, weil sie zwar einen gleichen Eckpunkt haben, dieser aber 2mal im Vertexbuffer liegt und somit 2 Indexwerte auf ihn zeigen.
Ich hoffe das war jetzt nicht zu kompliziert, wäre nett, wenn jemand wüsste, wie man solch einen Vorgang beschleunigen könnte.Danke,
Gruß,
Kevin
-
Kann man nicht einfach für jedes Objekt eine Liste aller Polys speichern?
Bye, TGGC \-/
-
mh, ja aber angenommen ich lade ein vorgefertigtes Level, welches mit Milkshape gemacht wurde und einfach mehrere Boxes enthält, alle Boxen das gleiche Material haben und einer Gruppe angehören, dann werden alle Boxen als ein Objekt angesehen.
-
Surkevin schrieb:
mh, ja aber angenommen ich lade ein vorgefertigtes Level, welches mit Milkshape gemacht wurde und einfach mehrere Boxes enthält, alle Boxen das gleiche Material haben und einer Gruppe angehören, dann werden alle Boxen als ein Objekt angesehen.
Ob das Laden nun 1 oder 3 Sekunden dauert...
Bye, TGGC \-/
-
mh du hast mein Problem nicht so richtig verstanden...ich lade ein vorgefertigtes Level (aus Milkshape zB) in meinem Leveleditor (mit dem ich Partikelsysteme und Boundingboxes etc. hinzufügen kann). In diesem will ich zum Beispiel eine Kiste markieren, welche ich in Milkshape erzeugt habe, und ihr "sagen", dass sie bei Kollision zB einen bestimmten Sound abspielen soll. Nur können diese Objekte auch komplexer sein. Deshalb möchte ich solch eine Objektmarkierung! Deshalb wollte ich wissen, wie ich schneller herausfinden kann, welche Polygone aus dem kompletten "Model" an dem markierten anhängen.
Jetzt klarer?
-
aber was machst du, wenn ein vertex eines der polygone der kiste mit einem vom boden oder nem anderen objekt geteilt wird? dann haste plötzlich sachen drin die gar nich sein sollen. ich würd im ms3d einfach jedes objekt in ne eigene objektgruppe packen und dann halt alle polys die zu der objektgruppe gehören auswählen...
nur so'n gedanke
mfg
-
mh, ich denke ich werde dann einfach alle Polygone des gleichen "Subsets" markieren lassen.
-
Surkevin schrieb:
mh du hast mein Problem nicht so richtig verstanden.
Falsch, du die Lösung.
Bye, TGGC \-/
-
Surkevin schrieb:
...ich solch eine Objektmarkierung! Deshalb wollte ich wissen, wie ich schneller herausfinden kann, welche Polygone aus dem kompletten "Model" an dem markierten anhängen.
Jetzt klarer?Bau dir einfach eine Struktur die eine Gruppe beschreibt.
Könnte ungefähr so aussehen:struct PolyGroup { int nID; // GruppenID int nPolyCount; // Anzahl Polys Poly* pPolyBuffer; // Pointer auf Polygone };
Zusätzlich musst du dann noch deine Polygon-Daten anders organisieren.
In einer extra Struktur. So ungefähr:struct Poly { int nGroup; // ID der Gruppe int nVertices; // Anzahl Punkte Vertex* pVertices; // Pointer auf Vertex-Daten oder Index oder wie auch immer };
Jetzt musst du nur noch rauskriegen auf welches Poly du klickst, dann kannst du über deine Poly-Struktur die Gruppe feststellen und darüber, welche anderen Polys dazugehören. Is halt nur alles etwas frickel-Arbeit.
-
Ja, ich habe in meinem Modelformat ja schon eine Art Gruppenzusammenfassung. Also werde ich dann eben alle Polygone markieren, die in der gleichen Gruppe liegen, und nicht die, die direkt aneinander hängen.
@TGGC wo ist denn überhaupt eine Ladedauer? Es besteht lediglich eine Zeitspanne, bei meinem obigen Code, und diese ist nicht gerade unbeträchtlich. Beim Tinymodel dauert die Polygonzusammenfassung 5 Sekunden für alle aneinanderhängenden Polygone (und die sind meistens nicht besonders viele). Aber ist ja auch egal, mache ich es eben mit der Gruppenverwaltung.
Danke,
Gruß,
Kevin
-
Surkevin schrieb:
@TGGC wo ist denn überhaupt eine Ladedauer? Es besteht lediglich eine Zeitspanne, bei meinem obigen Code, und diese ist nicht gerade unbeträchtlich.
Eben, du hast die Lösung nicht verstanden: eine Liste aller Polys speichern. Dadurch dauert das Laden etwas länger, da alle neuen Polys noch in die Listen müssen.
Bye, TGGC \-/