private void drawTriangles()
    {
        int cn = this.caseNumber();
        boolean directTable = !(isAmbigous(cn) && !this.amb);
        
        // address in the table
        int offset = (directTable)?cn*15:(255-cn)*15;
        for (int index = 0; index < 5; index++)
        {
            // if there's a triangle
            if (faces[offset] != -1)
            {
                // pick up vertexes of the current triangle
                MCVector3 e1 = this.e[faces[offset + 0]];
                MCVector3 e2 = this.e[faces[offset + 1]];
                MCVector3 e3 = this.e[faces[offset + 2]];
                
                // transforms the triangle using the matrix stack and the model view
                MCMatrix4 modelView = MCCanvas.matrixStack.peek();
                e1 = MCCanvas.matrixStack.peek().mult(e1);
                e2 = MCCanvas.matrixStack.peek().mult(e2);
                e3 = MCCanvas.matrixStack.peek().mult(e3);
                
                // computes normal (depending on the complementary case)
                MCVector3 v1 = (new MCVector3(e2)).sub(e1);
                MCVector3 v2 = (new MCVector3(e3)).sub(e1);
                MCVector3 n = directTable?v1.cross(v2).normalize():v2.cross(v1).normalize();
                
                // call the renderer and draws the triangle
                MCRenderer.drawTriangleFlat(e1, e2, e3, n);
                
                // draws the edges of the triangle
                MCRenderer.g.setColor(MCRenderer.EDGE_COLOR);
                if (MCApplet.wCube.isSelected())
                {
                    MCRenderer.drawLine(e1, e2);
                    MCRenderer.drawLine(e2, e3);
                    MCRenderer.drawLine(e1, e3);
                }
            }
            offset += 3;
        }
    }