private void setTransformation(Matrix4f transformation) {
    // Compute the modelview matrix by multiplying the camera matrix and
    // the transformation matrix of the object
    Matrix4f modelview = new Matrix4f(sceneManager.getCamera().getCameraMatrix());
    modelview.mul(transformation);

    // Set modelview and projection matrices in shader
    gl.glUniformMatrix4fv(
        gl.glGetUniformLocation(activeShaderID, "modelview"),
        1,
        false,
        transformationToFloat16(modelview),
        0);
    gl.glUniformMatrix4fv(
        gl.glGetUniformLocation(activeShaderID, "projection"),
        1,
        false,
        transformationToFloat16(sceneManager.getFrustum().getProjectionMatrix()),
        0);

    int id = gl.glGetUniformLocation(activeShaderID, "camera");
    if (id != -1) {
      Vector3f cop = sceneManager.getCamera().getCenterOfProjection();
      gl.glUniform4f(id, cop.x, cop.y, cop.z, 0);
    }
    // } else
    // System.out.println("Could not get location of uniform variable camera");
  }
  /**
   * This method is called by the GLRenderPanel to redraw the 3D scene. The method traverses the
   * scene using the scene manager and passes each object to the rendering method.
   */
  public void display(GLAutoDrawable drawable) {

    // Get reference to the OpenGL rendering context
    gl = drawable.getGL().getGL3();
    gl.glPolygonMode(GL3.GL_FRONT_AND_BACK, GL3.GL_POINT);

    // Do some processing at the beginning of the frame
    beginFrame();

    // Traverse scene manager and draw everything
    SceneManagerIterator iterator = sceneManager.iterator();
    while (iterator.hasNext()) {
      RenderItem r = iterator.next();
      if (r.getShape() != null
          && r.getShape()
              .checkBoundingSphere(sceneManager.getFrustum(), sceneManager.getCamera(), r.getT())) {
        draw(r);
      }
    }

    // Do some processing at the end of the frame
    endFrame();
  }
  /**
   * Set up a material for rendering. Activate its shader, and pass the material properties,
   * textures, and light sources to the shader.
   *
   * @param m the material to be set up for rendering
   */
  private void setMaterial(Material m) {

    // Set up the shader for the material, if it has one
    if (m != null && m.shader != null) {
      // Identifier for shader variables
      int id;

      // Activate the shader
      useShader(m.shader);

      // Activate the texture, if the material has one
      if (m.texture != null) {
        // OpenGL calls to activate the texture
        gl.glActiveTexture(GL3.GL_TEXTURE0); // Work with texture unit 0
        gl.glEnable(GL3.GL_TEXTURE_2D);
        gl.glBindTexture(GL3.GL_TEXTURE_2D, ((GLTexture) m.texture).getId());
        gl.glTexParameteri(GL3.GL_TEXTURE_2D, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_LINEAR);
        gl.glTexParameteri(GL3.GL_TEXTURE_2D, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_LINEAR);
        // We assume the texture in the shader is called "myTexture"
        id = gl.glGetUniformLocation(activeShaderID, "myTexture");
        gl.glUniform1i(id, 0); // The variable in the shader needs to be
        // set to the desired texture unit, i.e.,
        // 0
      }

      // Pass a default light source to shader
      String lightString = "lightDirection[" + 0 + "]";
      // id = gl.glGetUniformLocation(activeShaderID, lightString);
      // if (id != -1)
      // gl.glUniform4f(id, 0, 0, 1, 0.f); // Set light direction
      // else
      // System.out.print("Could not get location of uniform variable " +
      // lightString + "\n");
      int nLights = 1;

      String lightColorString;

      // Iterate over all light sources in scene manager (overwriting the
      // default light source)
      Iterator<Light> iter = sceneManager.lightIterator();

      Light l;
      if (iter != null) {
        nLights = 0;
        while (iter.hasNext() && nLights < 8) {
          l = iter.next();

          // Pass light direction to shader, we assume the shader
          // stores it in an array "lightDirection[]"
          lightString = "lightPosition[" + nLights + "]";
          id = gl.glGetUniformLocation(activeShaderID, lightString);
          if (id != -1) gl.glUniform4f(id, l.position.x, l.position.y, l.position.z, 0.f); // Set
          // light
          // direction
          else System.out.print("Could not get location of uniform variable " + lightString + "\n");

          nLights++;
        }

        // Pass number of lights to shader, we assume this is in a
        // variable "nLights" in the shader
        id = gl.glGetUniformLocation(activeShaderID, "nLights");
        if (id != -1) gl.glUniform1i(id, nLights); // Set number of lightrs
        // Only for debugging
        // else
        // System.out.print("Could not get location of uniform variable nLights\n");
      }
    }
  }