/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.visualization.opengl; import java.util.ArrayList; import java.util.List; import javax.media.opengl.GL; import org.gephi.ui.utils.PrefsUtils; import org.openide.util.NbPreferences; public class Lighting { //Const preferences public static final String AMBIANT_ENABLED = "Lighting.ambiant.enabled"; public static final String AMBIANT_AMBIANT = "Lighting.ambiant.ambiant"; public static final String AMBIANT_SPECULAR = "Lighting.ambiant.specular"; public static final String AMBIANT_DIFFUSE = "Lighting.ambiant.diffuse"; public static final String LIGHT1_ENABLED = "Lighting.light1.enabled"; public static final String LIGHT1_AMBIANT = "Lighting.light1.ambiant"; public static final String LIGHT1_SPECULAR = "Lighting.light1.specular"; public static final String LIGHT1_DIFFUSE = "Lighting.light1.diffuse"; public static final String LIGHT1_POSITION = "Lighting.light1.position"; public static final String LIGHT2_ENABLED = "Lighting.light2.enabled"; public static final String LIGHT2_AMBIANT = "Lighting.light2.ambiant"; public static final String LIGHT2_SPECULAR = "Lighting.light2.specular"; public static final String LIGHT2_DIFFUSE = "Lighting.light2.diffuse"; public static final String LIGHT2_POSITION = "Lighting.light2.position"; public static final String LIGHT3_ENABLED = "Lighting.light3.enabled"; public static final String LIGHT3_AMBIANT = "Lighting.light3.ambiant"; public static final String LIGHT3_SPECULAR = "Lighting.light3.specular"; public static final String LIGHT3_DIFFUSE = "Lighting.light3.diffuse"; public static final String LIGHT3_POSITION = "Lighting.light3.position"; //Data private List<Light> lights; public Lighting() { createLights(); } private void createLights() { lights = new ArrayList<Light>(); Light ambiant = new Light(GL.GL_LIGHT0); ambiant.setEnabled(NbPreferences.forModule(Lighting.class).getBoolean(AMBIANT_ENABLED, true)); ambiant.setAmbiant(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(AMBIANT_AMBIANT, "0.30, 0.33, 0.33, 1.0"))); ambiant.setDiffuse(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(AMBIANT_DIFFUSE, "0.15, 0.10, 0.39, 1.0"))); ambiant.setSpecular(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(AMBIANT_SPECULAR, "0, 0, 0, 1"))); Light light1 = new Light(GL.GL_LIGHT1); light1.setEnabled(NbPreferences.forModule(Lighting.class).getBoolean(LIGHT1_ENABLED, true)); light1.setAmbiant(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT1_AMBIANT, "0.0, 0.0, 0.0, 1.0"))); light1.setSpecular(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT1_SPECULAR, "0.91, 0.31, 0.31, 1.0"))); light1.setDiffuse(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT1_DIFFUSE, "0.61, 0.28, 0.20, 1.0"))); light1.setDirection(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT1_POSITION, "-1.0, -1.2, -0.5, 0.0"))); Light light2 = new Light(GL.GL_LIGHT2); light2.setEnabled(NbPreferences.forModule(Lighting.class).getBoolean(LIGHT2_ENABLED, true)); light2.setAmbiant(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT2_AMBIANT, "0.0, 0.0, 0.0, 1.0"))); light2.setSpecular(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT2_SPECULAR, "0.96, 0.89, 0.22, 1.0"))); light2.setDiffuse(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT2_DIFFUSE, "0.40, 0.39, 0.18, 1.0"))); light2.setDirection(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT2_POSITION, "2.0, 0.0, 1.0, 0.0"))); Light light3 = new Light(GL.GL_LIGHT3); light3.setEnabled(NbPreferences.forModule(Lighting.class).getBoolean(LIGHT3_ENABLED, true)); light3.setAmbiant(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT3_AMBIANT, "0.0, 0.0, 0.0, 1.0"))); light3.setSpecular(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT3_SPECULAR, "0.37, 0.37, 0.94, 1.0"))); light3.setDiffuse(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT3_DIFFUSE, "0.31, 0.44, 0.54, 1.0"))); light3.setDirection(PrefsUtils.stringToFloatArray(NbPreferences.forModule(Lighting.class).get(LIGHT3_POSITION, "0.0, 2.0, 0.0, 0.0f"))); lights.add(ambiant); lights.add(light1); lights.add(light2); lights.add(light3); } public List<Light> getLights() { return lights; } public void glInit(GL gl) { for (int i = 0; i < lights.size(); i++) { Light l = lights.get(i); l.glInit(gl); } } public static class Light { private int id; private float[] direction; private float[] ambiant; private float[] specular; private float[] diffuse; private boolean enabled; public Light(int id) { this.id = id; } public void glInit(GL gl) { if (enabled) { gl.glEnable(id); if (ambiant != null) { gl.glLightfv(id, GL.GL_AMBIENT, ambiant, 0); // color of the reflected light } if (diffuse != null) { gl.glLightfv(id, GL.GL_DIFFUSE, diffuse, 0); // color of the direct illumination } if (specular != null) { gl.glLightfv(id, GL.GL_SPECULAR, specular, 0); // color of the highlight } if (direction != null) { gl.glLightfv(id, GL.GL_POSITION, direction, 0); } } else { gl.glDisable(id); } } public float[] getAmbiant() { return ambiant; } public void setAmbiant(float[] ambiant) { this.ambiant = ambiant; } public float[] getDiffuse() { return diffuse; } public void setDiffuse(float[] diffuse) { this.diffuse = diffuse; } public float[] getDirection() { return direction; } public void setDirection(float[] direction) { this.direction = direction; } public float[] getSpecular() { return specular; } public void setSpecular(float[] specular) { this.specular = specular; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } }