+ Antworten
Ergebnis 1 bis 10 von 10

Thema: GLSL Float positiv oder negativ?

  1. #1
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Hallo,
    diese Frage mag erst einmal komisch erscheinen, aber wie kann ich in GLSL sicher feststellen, ob ein Float positiv oder negativ ist? Manch einer kann sich vielleicht noch erinnern, ich möchte für die Weltgenerierung Dichtewerte in Bits umwandeln(positiv -> 1 und negativ -> 0). Ich habe 8 Dichtewerte, die testhalber alle negativ sein sollen, aber jetzt kommts: es kommt 10000000 raus!
    Denn beim ersten Schleifendurchlauf des Wert-Arrays wechselt der Dichtewert 0 seinen wert von negativ zu positiv!!!!! Das erkenne ich folgendermaßen(Ausgaben mache ich mit Transform Feedback):
    Code:
    int[8] bits;
    <Ausgabe1>
    for(int i = 0; i < 8; i++){
    	float value = densityValues[i];
            <Ausgabe2>
    	if(value > 0.0f){
                    <Ausgabe3>
    		bits[i] = 1;
    	}else{
    		bits[i] = 0;
    	}
    }
    Jetzt kommt der Brüller:
    Ausgabe1: Alle densityValues sind negativ.
    Ausgabe2: value ist plötzlich positiv, aber nur wenn i = 0 ist (WARUM!?)
    Ausgabe3: value ist wieder negativ
    Das ist eigentlich unmöglich oder?
    Es bringt mich echt zur Verzweiflung, weiß Irgendjemand entfernt, was es sein könnte? Alle Vorschläge erwünscht, bei diesem Problem können noch so absurde Lösungen funktionieren.

  2. #2
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.949
    Genannt
    323 Post(s)
    Hm. Mit transform feedback kenne ich mich nicht aus, aber ... wie genau läuft da die Ausgabe ab? Eine "Ausgabe" von etwas, was auf der GPU passiert, ist heikel. Da arbeiten ja tausende Threads parallel. (Wirklich erklären würde es das beobachtete Verhalten nicht direkt, ich meine nur, dass da viel schiefgehen kann).

  3. #3
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Ja, Du legst beim erstellen des Shaders Fest, welche Variable in den Transform Feedback Buffer geschrieben wird, ich habe gl_Position festgelegt. Dann zeichne ich so:
    Java Code:
    1.  
    2. glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
    3. glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, outputVBO);
    4.  
    5. glBeginTransformFeedback(GL_TRIANGLES);
    6. glBindVertexArray(vaoID);
    7. glDrawArrays(GL_TRIANGLES, 0, 3);
    8. glEndTransformFeedback();

    Letztendlich kann ich dann aus dem "ouputVBO" Die Werte auslesen, die ich im Shader gesetzt habe, das sieht dann folgendermaßen aus:
    Code:
    int[8] bits;
    gl_Position = vec4(densityValues[0], 0, 0, 0);
    EmitVertex();
    for(int i = 0; i < 8; i++){
    	float value = densityValues[i];
            gl_Position = vec4(value, 0, 0, 0);
            EmitVertex();
    	if(value > 0.0f){
                    gl_Position = vec4(value, 0, 0, 0);
                    EmitVertex();
    		bits[i] = 1;
    	}else{
    		bits[i] = 0;
    	}
    }
    EndPrimitive();
    Dann kommt da zum Beispiel sowas raus:
    Code:
    -5.0 0 0 0
     5.0 0 0 0
     5.0 0 0 0
    Wenn ich die oberste Ausgabe ganz nach unten, nach der for eben, setzte, kommt sowas:
    Code:
     5.0 0 0 0
     5.0 0 0 0
    -5.0 0 0 0

  4. #4
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.949
    Genannt
    323 Post(s)
    Nun, abgesehen vom obligatorischen @Fancy werde ich da nicht viel sagen können - nur dass "EmitVertex" ja etwas MACHT, und es (auf dieser Ebene) zumindest nicht verwunderlich ist, wenn es einen Zustand verändert (und ich nicht sicher bin, ob es für "Debug-Ausgaben" geeignet ist....)

  5. #5
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Das Problem ist, dass dieser Fehler auch ohne die Ausgaben auftritt, was sich durch völlig absurde und teilweise "Infinity" Werte in den generierten Dreiecken bemerkbar macht. Und ich persönlich weiß keine andere Methode, um irgendwie nen Shader zu debuggen.

  6. #6
    User Viertel Megabyte
    Registriert seit
    30.07.2013
    Fachbeiträge
    302
    Genannt
    74 Post(s)
    Moin,

    zu dem was bisher hier im Thread steht, kann ich auch nicht viel schreiben. if und > werden aber ziemlich sicher nicht den Fehler verursachen. Wo kommen denn die densityValues her, hast Du die mal probehalber als feste Werte im Shader definiert? Außerdem schreibt Dein Shader irgendwas zwischen 9 und 17 vec4 Werte in den Transform Feedback Buffer, wurde das berücksichtigt?

    Transform Feedback eignet sich schon um Werte kontrollieren zu können.

    Die Ausgabe im Geometrie Shader funktioniert als "function-based interface" dabei werden alle Ausgabevariablen mit Werten belegt und dann EmitVertex aufgerufen. Dadurch werden die Werte der Ausgabevariablen weitergereicht (hier in den TF Buffer geschrieben) und die Variablen selbst gehen in einen undefinierten Zustand über, müssen also vor dem nächsten EmitVertex neu beschrieben werden. Aber das passiert ja oben im Shader.

    Gruß
    Fancy

  7. #7
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Ups, Sorry! Die Ausgaben in der Schleife werden mit einer if(i==0) versehen, weil die Änderung des Wertes ja nur beim ersten passiert. Und ich hab grad getestet: Wenn man feste Werte alle negativ definiert, dann wird alles richtig durch die if gebracht. Aber wenn ich Werte aus der Funktion -y nehme(Die eindeutig negativ sind), dann ändert sich der Wert.

  8. #8
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Neue Erkenntnis: Wenn ich statt den vom Vertex Shader kommenden Positionen, feste Werte in die DichteFunktion eingebe, dann bleiben die Dichtewerte auch fest, und es kommt immer schön < 0 raus. Das ist aber wahrscheinlich eher verwirrend als hilfreich, aber interessant.

  9. #9
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Ok, spontan hat wohl keiner eine Idee. Hier mal der Shadercode, vielleicht fällt ja jemandem irgend ein rudimentärer Fehler auf, ich arbeite an einem KSKB, da hängt aber ein bisschen was dran, also ich reich es nach!
    Code:
    #version 330
    
    in vec4 positionvec[];
    
    layout(triangles) in;
    layout(triangle_strip, max_vertices = 18) out;
    
    struct EdgeCase {
    	int nr;
    	ivec3[5] polygons;
    };
    
    const EdgeCase[256] TRIANGLE_TABLE = EdgeCase[](
    	EdgeCase(0, ivec3[5](ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(0,1,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,8,3),ivec3(9,8,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,8,3),ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,2,10),ivec3(0,2,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(2,8,3),ivec3(2,10,8),ivec3(10,9,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,11,2),ivec3(8,11,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,9,0),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,11,2),ivec3(1,9,11),ivec3(9,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(3,10,1),ivec3(11,10,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,10,1),ivec3(0,8,10),ivec3(8,11,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,9,0),ivec3(3,11,9),ivec3(11,10,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,8,10),ivec3(10,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(4,3,0),ivec3(7,3,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,1,9),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,1,9),ivec3(4,7,1),ivec3(7,3,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,2,10),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,4,7),ivec3(3,0,4),ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,2,10),ivec3(9,0,2),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,10,9),ivec3(2,9,7),ivec3(2,7,3),ivec3(7,9,4),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(8,4,7),ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(11,4,7),ivec3(11,2,4),ivec3(2,0,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,0,1),ivec3(8,4,7),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(4,7,11),ivec3(9,4,11),ivec3(9,11,2),ivec3(9,2,1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,10,1),ivec3(3,11,10),ivec3(7,8,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,11,10),ivec3(1,4,11),ivec3(1,0,4),ivec3(7,11,4),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(4,7,8),ivec3(9,0,11),ivec3(9,11,10),ivec3(11,0,3),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,7,11),ivec3(4,11,9),ivec3(9,11,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,5,4),ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,5,4),ivec3(1,5,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(8,5,4),ivec3(8,3,5),ivec3(3,1,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,2,10),ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,0,8),ivec3(1,2,10),ivec3(4,9,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,2,10),ivec3(5,4,2),ivec3(4,0,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,10,5),ivec3(3,2,5),ivec3(3,5,4),ivec3(3,4,8),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,5,4),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,11,2),ivec3(0,8,11),ivec3(4,9,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,5,4),ivec3(0,1,5),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,1,5),ivec3(2,5,8),ivec3(2,8,11),ivec3(4,8,5),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,3,11),ivec3(10,1,3),ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(4,9,5),ivec3(0,8,1),ivec3(8,10,1),ivec3(8,11,10),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,4,0),ivec3(5,0,11),ivec3(5,11,10),ivec3(11,0,3),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,4,8),ivec3(5,8,10),ivec3(10,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,7,8),ivec3(5,7,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,3,0),ivec3(9,5,3),ivec3(5,7,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,7,8),ivec3(0,1,7),ivec3(1,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,5,3),ivec3(3,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,7,8),ivec3(9,5,7),ivec3(10,1,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(10,1,2),ivec3(9,5,0),ivec3(5,3,0),ivec3(5,7,3),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,0,2),ivec3(8,2,5),ivec3(8,5,7),ivec3(10,5,2),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(2,10,5),ivec3(2,5,3),ivec3(3,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(7,9,5),ivec3(7,8,9),ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,5,7),ivec3(9,7,2),ivec3(9,2,0),ivec3(2,7,11),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,3,11),ivec3(0,1,8),ivec3(1,7,8),ivec3(1,5,7),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(11,2,1),ivec3(11,1,7),ivec3(7,1,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,5,8),ivec3(8,5,7),ivec3(10,1,3),ivec3(10,3,11),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(5,7,0),ivec3(5,0,9),ivec3(7,11,0),ivec3(1,0,10),ivec3(11,10,0))),
        EdgeCase(5, ivec3[5](ivec3(11,10,0),ivec3(11,0,3),ivec3(10,5,0),ivec3(8,0,7),ivec3(5,7,0))),
        EdgeCase(2, ivec3[5](ivec3(11,10,5),ivec3(7,11,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,8,3),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,0,1),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,8,3),ivec3(1,9,8),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,6,5),ivec3(2,6,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,6,5),ivec3(1,2,6),ivec3(3,0,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,6,5),ivec3(9,0,6),ivec3(0,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,9,8),ivec3(5,8,2),ivec3(5,2,6),ivec3(3,2,8),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(2,3,11),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(11,0,8),ivec3(11,2,0),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,1,9),ivec3(2,3,11),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,10,6),ivec3(1,9,2),ivec3(9,11,2),ivec3(9,8,11),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,3,11),ivec3(6,5,3),ivec3(5,1,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,8,11),ivec3(0,11,5),ivec3(0,5,1),ivec3(5,11,6),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,11,6),ivec3(0,3,6),ivec3(0,6,5),ivec3(0,5,9),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,5,9),ivec3(6,9,11),ivec3(11,9,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(5,10,6),ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,3,0),ivec3(4,7,3),ivec3(6,5,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,9,0),ivec3(5,10,6),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(10,6,5),ivec3(1,9,7),ivec3(1,7,3),ivec3(7,9,4),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,1,2),ivec3(6,5,1),ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,2,5),ivec3(5,2,6),ivec3(3,0,4),ivec3(3,4,7),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,4,7),ivec3(9,0,5),ivec3(0,6,5),ivec3(0,2,6),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(7,3,9),ivec3(7,9,4),ivec3(3,2,9),ivec3(5,9,6),ivec3(2,6,9))),
        EdgeCase(3, ivec3[5](ivec3(3,11,2),ivec3(7,8,4),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,10,6),ivec3(4,7,2),ivec3(4,2,0),ivec3(2,7,11),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,1,9),ivec3(4,7,8),ivec3(2,3,11),ivec3(5,10,6),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(9,2,1),ivec3(9,11,2),ivec3(9,4,11),ivec3(7,11,4),ivec3(5,10,6))),
        EdgeCase(4, ivec3[5](ivec3(8,4,7),ivec3(3,11,5),ivec3(3,5,1),ivec3(5,11,6),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(5,1,11),ivec3(5,11,6),ivec3(1,0,11),ivec3(7,11,4),ivec3(0,4,11))),
        EdgeCase(5, ivec3[5](ivec3(0,5,9),ivec3(0,6,5),ivec3(0,3,6),ivec3(11,6,3),ivec3(8,4,7))),
        EdgeCase(4, ivec3[5](ivec3(6,5,9),ivec3(6,9,11),ivec3(4,7,9),ivec3(7,11,9),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(10,4,9),ivec3(6,4,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,10,6),ivec3(4,9,10),ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,0,1),ivec3(10,6,0),ivec3(6,4,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,3,1),ivec3(8,1,6),ivec3(8,6,4),ivec3(6,1,10),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,4,9),ivec3(1,2,4),ivec3(2,6,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,0,8),ivec3(1,2,9),ivec3(2,4,9),ivec3(2,6,4),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,2,4),ivec3(4,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(8,3,2),ivec3(8,2,4),ivec3(4,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,4,9),ivec3(10,6,4),ivec3(11,2,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,8,2),ivec3(2,8,11),ivec3(4,9,10),ivec3(4,10,6),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,11,2),ivec3(0,1,6),ivec3(0,6,4),ivec3(6,1,10),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(6,4,1),ivec3(6,1,10),ivec3(4,8,1),ivec3(2,1,11),ivec3(8,11,1))),
        EdgeCase(4, ivec3[5](ivec3(9,6,4),ivec3(9,3,6),ivec3(9,1,3),ivec3(11,6,3),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(8,11,1),ivec3(8,1,0),ivec3(11,6,1),ivec3(9,1,4),ivec3(6,4,1))),
        EdgeCase(3, ivec3[5](ivec3(3,11,6),ivec3(3,6,0),ivec3(0,6,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(6,4,8),ivec3(11,6,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(7,10,6),ivec3(7,8,10),ivec3(8,9,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,7,3),ivec3(0,10,7),ivec3(0,9,10),ivec3(6,7,10),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(10,6,7),ivec3(1,10,7),ivec3(1,7,8),ivec3(1,8,0),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,6,7),ivec3(10,7,1),ivec3(1,7,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,2,6),ivec3(1,6,8),ivec3(1,8,9),ivec3(8,6,7),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(2,6,9),ivec3(2,9,1),ivec3(6,7,9),ivec3(0,9,3),ivec3(7,3,9))),
        EdgeCase(3, ivec3[5](ivec3(7,8,0),ivec3(7,0,6),ivec3(6,0,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(7,3,2),ivec3(6,7,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,3,11),ivec3(10,6,8),ivec3(10,8,9),ivec3(8,6,7),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(2,0,7),ivec3(2,7,11),ivec3(0,9,7),ivec3(6,7,10),ivec3(9,10,7))),
        EdgeCase(5, ivec3[5](ivec3(1,8,0),ivec3(1,7,8),ivec3(1,10,7),ivec3(6,7,10),ivec3(2,3,11))),
        EdgeCase(4, ivec3[5](ivec3(11,2,1),ivec3(11,1,7),ivec3(10,6,1),ivec3(6,7,1),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(8,9,6),ivec3(8,6,7),ivec3(9,1,6),ivec3(11,6,3),ivec3(1,3,6))),
        EdgeCase(2, ivec3[5](ivec3(0,9,1),ivec3(11,6,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(7,8,0),ivec3(7,0,6),ivec3(3,11,0),ivec3(11,6,0),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(7,11,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(3,0,8),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,1,9),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(8,1,9),ivec3(8,3,1),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(10,1,2),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,2,10),ivec3(3,0,8),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(2,9,0),ivec3(2,10,9),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(6,11,7),ivec3(2,10,3),ivec3(10,8,3),ivec3(10,9,8),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(7,2,3),ivec3(6,2,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(7,0,8),ivec3(7,6,0),ivec3(6,2,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(2,7,6),ivec3(2,3,7),ivec3(0,1,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,6,2),ivec3(1,8,6),ivec3(1,9,8),ivec3(8,7,6),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,7,6),ivec3(10,1,7),ivec3(1,3,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(10,7,6),ivec3(1,7,10),ivec3(1,8,7),ivec3(1,0,8),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,3,7),ivec3(0,7,10),ivec3(0,10,9),ivec3(6,10,7),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(7,6,10),ivec3(7,10,8),ivec3(8,10,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(6,8,4),ivec3(11,8,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,6,11),ivec3(3,0,6),ivec3(0,4,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(8,6,11),ivec3(8,4,6),ivec3(9,0,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,4,6),ivec3(9,6,3),ivec3(9,3,1),ivec3(11,3,6),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,8,4),ivec3(6,11,8),ivec3(2,10,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,2,10),ivec3(3,0,11),ivec3(0,6,11),ivec3(0,4,6),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(4,11,8),ivec3(4,6,11),ivec3(0,2,9),ivec3(2,10,9),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(10,9,3),ivec3(10,3,2),ivec3(9,4,3),ivec3(11,3,6),ivec3(4,6,3))),
        EdgeCase(3, ivec3[5](ivec3(8,2,3),ivec3(8,4,2),ivec3(4,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,4,2),ivec3(4,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,9,0),ivec3(2,3,4),ivec3(2,4,6),ivec3(4,3,8),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,9,4),ivec3(1,4,2),ivec3(2,4,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,1,3),ivec3(8,6,1),ivec3(8,4,6),ivec3(6,10,1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(10,1,0),ivec3(10,0,6),ivec3(6,0,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(4,6,3),ivec3(4,3,8),ivec3(6,10,3),ivec3(0,3,9),ivec3(10,9,3))),
        EdgeCase(2, ivec3[5](ivec3(10,9,4),ivec3(6,10,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(4,9,5),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,8,3),ivec3(4,9,5),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,0,1),ivec3(5,4,0),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(11,7,6),ivec3(8,3,4),ivec3(3,5,4),ivec3(3,1,5),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,5,4),ivec3(10,1,2),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(6,11,7),ivec3(1,2,10),ivec3(0,8,3),ivec3(4,9,5),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(7,6,11),ivec3(5,4,10),ivec3(4,2,10),ivec3(4,0,2),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(3,4,8),ivec3(3,5,4),ivec3(3,2,5),ivec3(10,5,2),ivec3(11,7,6))),
        EdgeCase(3, ivec3[5](ivec3(7,2,3),ivec3(7,6,2),ivec3(5,4,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,5,4),ivec3(0,8,6),ivec3(0,6,2),ivec3(6,8,7),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,6,2),ivec3(3,7,6),ivec3(1,5,0),ivec3(5,4,0),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(6,2,8),ivec3(6,8,7),ivec3(2,1,8),ivec3(4,8,5),ivec3(1,5,8))),
        EdgeCase(4, ivec3[5](ivec3(9,5,4),ivec3(10,1,6),ivec3(1,7,6),ivec3(1,3,7),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(1,6,10),ivec3(1,7,6),ivec3(1,0,7),ivec3(8,7,0),ivec3(9,5,4))),
        EdgeCase(5, ivec3[5](ivec3(4,0,10),ivec3(4,10,5),ivec3(0,3,10),ivec3(6,10,7),ivec3(3,7,10))),
        EdgeCase(4, ivec3[5](ivec3(7,6,10),ivec3(7,10,8),ivec3(5,4,10),ivec3(4,8,10),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,9,5),ivec3(6,11,9),ivec3(11,8,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,6,11),ivec3(0,6,3),ivec3(0,5,6),ivec3(0,9,5),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,11,8),ivec3(0,5,11),ivec3(0,1,5),ivec3(5,6,11),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(6,11,3),ivec3(6,3,5),ivec3(5,3,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,2,10),ivec3(9,5,11),ivec3(9,11,8),ivec3(11,5,6),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(0,11,3),ivec3(0,6,11),ivec3(0,9,6),ivec3(5,6,9),ivec3(1,2,10))),
        EdgeCase(5, ivec3[5](ivec3(11,8,5),ivec3(11,5,6),ivec3(8,0,5),ivec3(10,5,2),ivec3(0,2,5))),
        EdgeCase(4, ivec3[5](ivec3(6,11,3),ivec3(6,3,5),ivec3(2,10,3),ivec3(10,5,3),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,8,9),ivec3(5,2,8),ivec3(5,6,2),ivec3(3,8,2),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,5,6),ivec3(9,6,0),ivec3(0,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(1,5,8),ivec3(1,8,0),ivec3(5,6,8),ivec3(3,8,2),ivec3(6,2,8))),
        EdgeCase(2, ivec3[5](ivec3(1,5,6),ivec3(2,1,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(1,3,6),ivec3(1,6,10),ivec3(3,8,6),ivec3(5,6,9),ivec3(8,9,6))),
        EdgeCase(4, ivec3[5](ivec3(10,1,0),ivec3(10,0,6),ivec3(9,5,0),ivec3(5,6,0),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,3,8),ivec3(5,6,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(10,5,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(11,5,10),ivec3(7,5,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(11,5,10),ivec3(11,7,5),ivec3(8,3,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,11,7),ivec3(5,10,11),ivec3(1,9,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(10,7,5),ivec3(10,11,7),ivec3(9,8,1),ivec3(8,3,1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(11,1,2),ivec3(11,7,1),ivec3(7,5,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,8,3),ivec3(1,2,7),ivec3(1,7,5),ivec3(7,2,11),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,7,5),ivec3(9,2,7),ivec3(9,0,2),ivec3(2,11,7),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(7,5,2),ivec3(7,2,11),ivec3(5,9,2),ivec3(3,2,8),ivec3(9,8,2))),
        EdgeCase(3, ivec3[5](ivec3(2,5,10),ivec3(2,3,5),ivec3(3,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,2,0),ivec3(8,5,2),ivec3(8,7,5),ivec3(10,2,5),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(9,0,1),ivec3(5,10,3),ivec3(5,3,7),ivec3(3,10,2),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(9,8,2),ivec3(9,2,1),ivec3(8,7,2),ivec3(10,2,5),ivec3(7,5,2))),
        EdgeCase(2, ivec3[5](ivec3(1,3,5),ivec3(3,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,8,7),ivec3(0,7,1),ivec3(1,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(9,0,3),ivec3(9,3,5),ivec3(5,3,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,8,7),ivec3(5,9,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,8,4),ivec3(5,10,8),ivec3(10,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(5,0,4),ivec3(5,11,0),ivec3(5,10,11),ivec3(11,3,0),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,1,9),ivec3(8,4,10),ivec3(8,10,11),ivec3(10,4,5),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(10,11,4),ivec3(10,4,5),ivec3(11,3,4),ivec3(9,4,1),ivec3(3,1,4))),
        EdgeCase(4, ivec3[5](ivec3(2,5,1),ivec3(2,8,5),ivec3(2,11,8),ivec3(4,5,8),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(0,4,11),ivec3(0,11,3),ivec3(4,5,11),ivec3(2,11,1),ivec3(5,1,11))),
        EdgeCase(5, ivec3[5](ivec3(0,2,5),ivec3(0,5,9),ivec3(2,11,5),ivec3(4,5,8),ivec3(11,8,5))),
        EdgeCase(2, ivec3[5](ivec3(9,4,5),ivec3(2,11,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,5,10),ivec3(3,5,2),ivec3(3,4,5),ivec3(3,8,4),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(5,10,2),ivec3(5,2,4),ivec3(4,2,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(3,10,2),ivec3(3,5,10),ivec3(3,8,5),ivec3(4,5,8),ivec3(0,1,9))),
        EdgeCase(4, ivec3[5](ivec3(5,10,2),ivec3(5,2,4),ivec3(1,9,2),ivec3(9,4,2),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(8,4,5),ivec3(8,5,3),ivec3(3,5,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,4,5),ivec3(1,0,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(8,4,5),ivec3(8,5,3),ivec3(9,0,5),ivec3(0,3,5),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(9,4,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,11,7),ivec3(4,9,11),ivec3(9,10,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(0,8,3),ivec3(4,9,7),ivec3(9,11,7),ivec3(9,10,11),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(1,10,11),ivec3(1,11,4),ivec3(1,4,0),ivec3(7,4,11),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(3,1,4),ivec3(3,4,8),ivec3(1,10,4),ivec3(7,4,11),ivec3(10,11,4))),
        EdgeCase(4, ivec3[5](ivec3(4,11,7),ivec3(9,11,4),ivec3(9,2,11),ivec3(9,1,2),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(9,7,4),ivec3(9,11,7),ivec3(9,1,11),ivec3(2,11,1),ivec3(0,8,3))),
        EdgeCase(3, ivec3[5](ivec3(11,7,4),ivec3(11,4,2),ivec3(2,4,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(11,7,4),ivec3(11,4,2),ivec3(8,3,4),ivec3(3,2,4),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,9,10),ivec3(2,7,9),ivec3(2,3,7),ivec3(7,4,9),ivec3(-1,-1,-1))),
        EdgeCase(5, ivec3[5](ivec3(9,10,7),ivec3(9,7,4),ivec3(10,2,7),ivec3(8,7,0),ivec3(2,0,7))),
        EdgeCase(5, ivec3[5](ivec3(3,7,10),ivec3(3,10,2),ivec3(7,4,10),ivec3(1,10,0),ivec3(4,0,10))),
        EdgeCase(2, ivec3[5](ivec3(1,10,2),ivec3(8,7,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(4,9,1),ivec3(4,1,7),ivec3(7,1,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(4,9,1),ivec3(4,1,7),ivec3(0,8,1),ivec3(8,7,1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(4,0,3),ivec3(7,4,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(4,8,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,10,8),ivec3(10,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(3,0,9),ivec3(3,9,11),ivec3(11,9,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(0,1,10),ivec3(0,10,8),ivec3(8,10,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(3,1,10),ivec3(11,3,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(1,2,11),ivec3(1,11,9),ivec3(9,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(3,0,9),ivec3(3,9,11),ivec3(1,2,9),ivec3(2,11,9),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(0,2,11),ivec3(8,0,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(3,2,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(3, ivec3[5](ivec3(2,3,8),ivec3(2,8,10),ivec3(10,8,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(9,10,2),ivec3(0,9,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(4, ivec3[5](ivec3(2,3,8),ivec3(2,8,10),ivec3(0,1,8),ivec3(1,10,8),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(1,10,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(2, ivec3[5](ivec3(1,3,8),ivec3(9,1,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(0,9,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(1, ivec3[5](ivec3(0,3,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
        EdgeCase(0, ivec3[5](ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1)))
    );
    
    void buildVertex(int edge, float[8] densityValues, vec3 cubePos, int caseNumber){
    		float x, y, z;
    		 
    		switch (edge) {
    		 
            case 0:
                float d01 = -densityValues[0] / (densityValues[1] - densityValues[0]);
                x = 0;
                y = d01;
                z = 0;
                break;
     
            case 1:
     
                float d12 = -densityValues[1] / (densityValues[2] - densityValues[1]);
                x = d12;
                y = 1;
                z = 0;
                break;
     
            case 2:
            	 
                float d23 = -densityValues[2] / (densityValues[3] - densityValues[2]);
                x = 1;
                    y = 1 - d23;
                    z = 0;
                break;
     
            case 3:
     
                float d03 = -densityValues[0] / (densityValues[3] - densityValues[0]);
                x = d03;
                y = 0;
                z = 0;
                break;
     
     
            case 4:
     
                float d45 = -densityValues[4] / (densityValues[5] - densityValues[4]);
                x = 0;
                y = d45;
                z = 1;
                break;
     
            case 5:
     
                float d56 = -densityValues[5] / (densityValues[6] - densityValues[5]);
                x = d56;
                y = 1;
                z = 1;
                break;
     
            case 6:
                float d67 = -densityValues[6] / (densityValues[7] - densityValues[6]);
                x = 1;
                    y = 1 - d67;
                    z = 1;
                break;
     
            case 7:
     
                float d47 = -densityValues[4] / (densityValues[7] - densityValues[4]);
                x = d47;
                y = 0;
                z = 1;
                break;
     
            case 8:
     
                float d04 = -densityValues[0] / (densityValues[4] - densityValues[0]);
                x = 0;
                y = 0;
                z = d04;
                break;
     
            case 9:
     
                float d15 = -densityValues[1] / (densityValues[5] - densityValues[1]);
                x = 0;
                y = 1;
                z = d15;
                break;
     
            case 10:
     
                float d26 = -densityValues[2] / (densityValues[6] - densityValues[2]);
                x = 1;
                y = 1;
                z = d26;
                break;
     
            case 11:
     
                float d37 = -densityValues[3] / (densityValues[7] - densityValues[3]);
                x = 1;
                y = 0;
                z = d37;
                break;
     
            default:
            	x = 0;
            	y = 0;
            	z = 0;
     			break;
            }
     
            gl_Position = vec4(x+cubePos.x, y+cubePos.y, z+cubePos.z, 0);
            EmitVertex();
    	}
    	
    float dichteFunktion(float x, float y, float z){
    		float wert = y*-1.0f;
    		return wert;
    }	
    
    void buildTriangle(float[8] densityValues, ivec3 edges, vec3 cubePos, int caseNumber){   
    	buildVertex(edges.x, densityValues, cubePos, caseNumber);
    	buildVertex(edges.y, densityValues, cubePos, caseNumber);
    	buildVertex(edges.z, densityValues, cubePos, caseNumber);
    	EndPrimitive();
    }
    
    int tabellenIndex(float[8] densityValues) {
        	int result = 0;
        	int[8] bits;
        	gl_Position = vec4(densityValues[0], 0, 0, 0);
    		EmitVertex();
    		for(int i = 0; i < 8; i++){
    			float value = densityValues[i];
    			if(i==0){
    				gl_Position = vec4(value, 0, 0, 0);
    				EmitVertex();
    			}
    			if(value > 0.0f){
    				if(i==0){
    					gl_Position = vec4(densityValues[0], 0, 0, 0);
    					EmitVertex();
    				}
    				bits[i] = 1;
    			}else{
    				bits[i] = 0;
    			}
    		}
    		EndPrimitive();
            for (int i = 0; i < 8; i++)
                result |= bits[i] << i;
            return result;
    }
    
    void buildTriangles(float[8] werte, vec3 cubePos){
    		int caseNumber = tabellenIndex(werte);
    		EdgeCase triangles = TRIANGLE_TABLE[caseNumber];
    		for (int i = 0; i < triangles.nr; i++)
    			buildTriangle(werte, triangles.polygons[i], cubePos, caseNumber);
    }
    
    void generateCube(vec4 pos){
    	float werte[] = float[8](
    		dichteFunktion(pos.x,   pos.y,   pos.z),
    		dichteFunktion(pos.x+1, pos.y+1, pos.z),
    		dichteFunktion(pos.x,   pos.y+1, pos.z),
    		dichteFunktion(pos.x+1, pos.y,   pos.z),
    		
    		dichteFunktion(pos.x,   pos.y,   pos.z+1),
    		dichteFunktion(pos.x,   pos.y+1, pos.z+1),
    		dichteFunktion(pos.x+1, pos.y+1, pos.z+1),
    		dichteFunktion(pos.x+1, pos.y,   pos.z+1)
    	);
    	buildTriangles(werte, vec3(pos));
    }
    
    void generate(){
    		generateCube(positionvec[0]);
    }
    
    void main() {
    	generate();
    }

  10. #10
    User Halbes Megabyte Themenstarter
    Avatar von Zombiepriester
    Registriert seit
    16.05.2013
    Fachbeiträge
    683
    Genannt
    18 Post(s)
    Ok, hier der KSKB-Code, ihr könnt ja mit den Ausgaben ein bisschen experimentieren. ich hoffe wirklich, es kommt was dabei raus, denn ich bin mit meinem Latein so was von am Ende:
    Java Code:
    1.  
    2. import static org.lwjgl.opengl.GL11.*;
    3. import static org.lwjgl.opengl.GL15.*;
    4. import static org.lwjgl.opengl.GL20.*;
    5. import static org.lwjgl.opengl.GL30.*;
    6. import static org.lwjgl.opengl.GL32.*;
    7. import static org.lwjgl.opengl.GL40.*;
    8.  
    9. import java.io.BufferedReader;
    10. import java.io.IOException;
    11. import java.io.InputStreamReader;
    12. import java.nio.FloatBuffer;
    13.  
    14. import org.lwjgl.BufferUtils;
    15. import org.lwjgl.LWJGLException;
    16. import org.lwjgl.opengl.ContextAttribs;
    17. import org.lwjgl.opengl.Display;
    18. import org.lwjgl.opengl.DisplayMode;
    19. import org.lwjgl.opengl.PixelFormat;
    20.  
    21. public class KSKB_TF {
    22.  
    23.     private int genShader;
    24.     private int outputVBO;
    25.     private int transformFeedback;
    26.     private int query;
    27.     private int vaoID;
    28.     private int trianglesNumber;
    29.     private int outputVAO;
    30.     private int vboID;
    31.     private String GEN_VERTEX = "#version 330 \n"+
    32.             "out vec4 positionvec; \n"+
    33.             "layout (location = 0) in vec3 in_Position; \n"+
    34.             "void main(){ \n"+
    35.             "positionvec = vec4(in_Position, 0); \n"+
    36.             "}";
    37.    
    38.     public KSKB_TF(){
    39.         try {
    40.             final int GL_MAJOR_VERSION = 3;
    41.             final int GL_MINOR_VERSION = 3;
    42.            
    43.             final DisplayMode displayMode = new DisplayMode(10, 10);
    44.             final PixelFormat pixelFormat = new PixelFormat();
    45.             final ContextAttribs contextAttribs = new ContextAttribs(GL_MAJOR_VERSION, GL_MINOR_VERSION);
    46.            
    47.             Display.setDisplayMode(displayMode);
    48.             Display.create(pixelFormat, contextAttribs);
    49.             Display.setTitle("KSKB");
    50.         } catch (LWJGLException e) {
    51.             e.printStackTrace();
    52.         }
    53.         init();
    54.         run();
    55.     }
    56.    
    57.     public static void main(String[] args){
    58.         new KSKB_TF();
    59.     }
    60.    
    61.     public void init(){
    62.         try{
    63.         genShader = initShader(GEN_VERTEX, readFile("worldGenTest.geometry"));
    64.         }catch(IOException e){
    65.             e.printStackTrace();
    66.         }
    67.         vaoID = glGenVertexArrays();
    68.         glBindVertexArray(vaoID);
    69.            
    70.         FloatBuffer data = BufferUtils.createFloatBuffer(9);
    71.         data.put(new float[]{0, 0, 0,  0, 0, 0,  0, 0, 0});
    72.         data.flip();
    73.         vboID = glGenBuffers();
    74.         glBindBuffer(GL_ARRAY_BUFFER, vboID);
    75.         glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW);
    76.            
    77.         glEnableVertexAttribArray(0);
    78.         glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    79.         glBindVertexArray(0);
    80.            
    81.         outputVBO = glGenBuffers();
    82.         transformFeedback = glGenTransformFeedbacks();
    83.         query = glGenQueries();
    84.     }
    85.    
    86.     public int initShader(String vertex, String geometry){
    87.         int prog = glCreateProgram();
    88.        
    89.         int vs = glCreateShader(GL_VERTEX_SHADER);
    90.  
    91.         glShaderSource(vs, vertex);
    92.         glCompileShader(vs);
    93.  
    94.         if (GL_FALSE == glGetShaderi(vs, GL_COMPILE_STATUS)) {
    95.  
    96.             final int length = glGetShaderi(vs, GL_INFO_LOG_LENGTH);
    97.             final String log = glGetShaderInfoLog(vs, length);
    98.  
    99.             throw new RuntimeException("Fehler beim Vertexshader: "+log);
    100.  
    101.         }
    102.        
    103.         int gs = glCreateShader(GL_GEOMETRY_SHADER);
    104.  
    105.         glShaderSource(gs, geometry);
    106.         glCompileShader(gs);
    107.  
    108.         if (GL_FALSE == glGetShaderi(gs, GL_COMPILE_STATUS)) {
    109.  
    110.             final int length = glGetShaderi(gs, GL_INFO_LOG_LENGTH);
    111.             final String log = glGetShaderInfoLog(gs, length);
    112.  
    113.             throw new RuntimeException("Fehler beim Geometryshader: "+log);
    114.  
    115.         }
    116.         glAttachShader(prog, vs);
    117.         glAttachShader(prog, gs);
    118.         glTransformFeedbackVaryings(prog, new String[]{"gl_Position"}, GL_INTERLEAVED_ATTRIBS);
    119.         glLinkProgram(prog);
    120.         String log = glGetProgramInfoLog(prog, 65536);
    121.         if(log.length() != 0){
    122.             System.out.println("Program link log:\n" + log);
    123.         }
    124.         glDeleteShader(vs);
    125.         glDeleteShader(gs);
    126.         return prog;
    127.     }
    128.    
    129.     public String readFile(String datei) throws IOException{
    130.         String text;
    131.         BufferedReader br = new BufferedReader(new InputStreamReader(KSKB_TF.class.getClassLoader().getResourceAsStream("worldGenTest.geometry")));
    132.         try {
    133.             StringBuilder sb = new StringBuilder();
    134.             String line = br.readLine();
    135.  
    136.             while (line != null) {
    137.                 sb.append(line);
    138.                 sb.append(System.lineSeparator());
    139.                 line = br.readLine();
    140.             }
    141.             text = sb.toString();
    142.         }finally {
    143.            br.close();
    144.         }
    145.         return text;
    146.     }
    147.    
    148.     public void run(){
    149.         glEnable(GL_RASTERIZER_DISCARD);
    150.           glUseProgram(genShader);
    151.             glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
    152.             glBufferData(GL_ARRAY_BUFFER, 5*4*12, GL_DYNAMIC_READ);
    153.             glBindBuffer(GL_ARRAY_BUFFER, 0);
    154.            
    155.             glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
    156.             glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, outputVBO);
    157.            
    158.             glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
    159.             glBeginTransformFeedback(GL_TRIANGLES);
    160.             glBindVertexArray(vaoID);
    161.             glDrawArrays(GL_TRIANGLES, 0, 3);
    162.             glEndTransformFeedback();
    163.             glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
    164.             System.out.println("Es wurden "+glGetQueryObjecti(query, GL_QUERY_RESULT)+" Dreiecke generiert");
    165.             trianglesNumber = glGetQueryObjecti(query, GL_QUERY_RESULT);
    166.             FloatBuffer feedback = BufferUtils.createFloatBuffer(glGetQueryObjecti(query, GL_QUERY_RESULT)*12);
    167.             glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
    168.             glGetBufferSubData(GL_ARRAY_BUFFER, 0, feedback);
    169.             for(int i = 0; i < glGetQueryObjecti(query, GL_QUERY_RESULT)*12; i+=4){
    170.                 System.out.println(feedback.get(i)+" "+feedback.get(i+1)+" "+feedback.get(i+2)+" "+feedback.get(i+3));
    171.             }
    172.             if(trianglesNumber > 0)
    173.             System.out.println();
    174.             outputVAO = glGenVertexArrays();
    175.             glBindVertexArray(outputVAO);
    176.            
    177.             glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
    178.             glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
    179.             glEnableVertexAttribArray(0);
    180.     }
    181. }

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Gib folgenden Captcha-Code ein: F9H5J2

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 19
    Letzter Beitrag: 05.10.2015, 22:51
  2. Antworten: 3
    Letzter Beitrag: 25.07.2015, 11:26
  3. Antworten: 1
    Letzter Beitrag: 08.04.2015, 13:13
  4. (Array) float Array deklarieren
    Von 1207 im Forum Java-Grundlagen
    Antworten: 8
    Letzter Beitrag: 22.11.2013, 21:38
  5. (Variablen) Frage zu float und double - Genauigkeit - Addition/Multiplikation
    Von Unregistriert im Forum Java-Grundlagen
    Antworten: 7
    Letzter Beitrag: 26.10.2013, 09:18

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •