package org.jzy3d.plot3d.rendering.lights;

import java.util.ArrayList;
import java.util.List;

import org.jzy3d.maths.Coord3d;

import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES1;
import com.jogamp.opengl.fixedfunc.GLLightingFunc;

public class LightSet {
	public LightSet() {
		this.lights = new ArrayList();
	}

	public LightSet(List lights) {
		this.lights = lights;
	}

	public void init(GL gl) {
		gl.glEnable(GLLightingFunc.GL_COLOR_MATERIAL);
	}

	public void apply(GL gl, Coord3d scale) {
		if (lazyLightInit) {
			initLight(gl);
			for (Light light : lights)
				LightSwitch.enable(gl, light.getId());
			lazyLightInit = false;
		}
		for (Light light : lights)
			light.apply(gl, scale);
	}

	public void enableLightIfThereAreLights(GL gl) {
		enable(gl, true);
	}

	public void enable(GL gl, boolean onlyIfAtLeastOneLight) {
		if (onlyIfAtLeastOneLight) {
			if (lights.size() > 0)
				gl.glEnable(GLLightingFunc.GL_LIGHTING);
		} else
			gl.glEnable(GLLightingFunc.GL_LIGHTING);
	}

	public void disable(GL gl) {
		gl.glDisable(GLLightingFunc.GL_LIGHTING);
	}

	public Light get(int id) {
		return lights.get(id);
	}

	public void add(Light light) {
		if (lights.size() == 0)
			queryLazyLightInit();
		lights.add(light);
	}

	public void remove(Light light) {
		lights.remove(light);
	}

	/***********************************/

	protected void queryLazyLightInit() {
		lazyLightInit = true;
	}

	// http://www.sjbaker.org/steve/omniv/opengl_lighting.html
	protected void initLight(GL gl) {
		gl.glEnable(GLLightingFunc.GL_COLOR_MATERIAL);
		gl.glEnable(GLLightingFunc.GL_LIGHTING);

		// Light model
		if (gl.isGL2()) {
			gl.getGL2().glLightModeli(GL2ES1.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_TRUE);
		}
		// gl.glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL2.GL_TRUE);
		// gl.glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL2.GL_FALSE);
	}

	/***********************************/

	protected List lights;
	protected boolean lazyLightInit = false;
}

 

Ads help maintain this website.