Graphics: fix light problems
[scilab.git] / scilab / modules / scirenderer / src / org / scilab / forge / scirenderer / implementation / jogl / lightning / JoGLLightManager.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2011 - DIGITEO - Pierre Lando
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  */
11
12 package org.scilab.forge.scirenderer.implementation.jogl.lightning;
13
14 import org.scilab.forge.scirenderer.implementation.jogl.JoGLDrawingTools;
15 import org.scilab.forge.scirenderer.implementation.jogl.utils.GLShortCuts;
16 import org.scilab.forge.scirenderer.lightning.Light;
17 import org.scilab.forge.scirenderer.lightning.LightManager;
18 import org.scilab.forge.scirenderer.shapes.appearance.Material;
19
20 import javax.media.opengl.GL2;
21
22 /**
23  * JoGL implementation of {@link LightManager}
24  *
25  * @author Pierre Lando
26  */
27 public class JoGLLightManager implements LightManager {
28
29     /**
30      * The drawing tools.
31      */
32     private final JoGLDrawingTools drawingTools;
33
34     /**
35      * The lights.
36      */
37     private final JoGLLight[] lights;
38
39     /**
40      * The current lightning status.
41      */
42     private boolean isLightningEnable = DEFAULT_LIGHTNING_STATUS;
43
44     /**
45      * Default constructor.
46      * @param drawingTools the drawing tools.
47      */
48     public JoGLLightManager(JoGLDrawingTools drawingTools) {
49         this.drawingTools = drawingTools;
50         lights = new JoGLLight[getLightNumber()];
51     }
52
53     @Override
54     public int getLightNumber() {
55         return drawingTools.getGLCapacity().getLightNumber();
56     }
57
58     @Override
59     public Light getLight(int i) {
60         if (i < 0 || i >= getLightNumber()) {
61             return null;
62         } else {
63             if (lights[i] == null) {
64                 lights[i] = new JoGLLight(drawingTools.getGl(), i);
65             }
66             return lights[i];
67         }
68     }
69
70     @Override
71     public void setLightningEnable(boolean isLightningEnable) {
72         this.isLightningEnable = isLightningEnable;
73         GLShortCuts.setEnable(drawingTools.getGl().getGL2(), GL2.GL_LIGHTING, isLightningEnable);
74     }
75
76     @Override
77     public boolean isLightningEnable() {
78         return isLightningEnable;
79     }
80
81     @Override
82     public void setMaterial(Material material) {
83         if (material != null) {
84             GLShortCuts.setEnable(drawingTools.getGl().getGL2(), GL2.GL_COLOR_MATERIAL, material.isColorMaterialEnable());
85             float[] black = new float[] {0.0f, 0.0f, 0.0f, 1.0f};
86             drawingTools.getGl().glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, black, 0);
87             drawingTools.getGl().glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL2.GL_FALSE);
88             drawingTools.getGl().glLightModeli(GL2.GL_LIGHT_MODEL_TWO_SIDE, GL2.GL_TRUE);
89
90             if (material.isColorMaterialEnable()) {
91                 drawingTools.getGl().glColorMaterial(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT_AND_DIFFUSE);
92             } else {
93                 drawingTools.getGl().glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, material.getAmbientColor().getComponents(null), 0);
94                 drawingTools.getGl().glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, material.getDiffuseColor().getComponents(null), 0);
95             }
96             drawingTools.getGl().glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, material.getSpecularColor().getComponents(null), 0);
97             drawingTools.getGl().glMaterialf(GL2.GL_FRONT_AND_BACK, GL2.GL_SHININESS, material.getShininess());
98             float[] f = {0.0f, 0.0f, 0.0f, 0.0f};
99             drawingTools.getGl().glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_EMISSION, f, 0);
100         }
101     }
102     /**
103      * Reload light.
104      */
105     public void reload() {
106         GL2 gl = drawingTools.getGl().getGL2();
107         GLShortCuts.setEnable(gl, GL2.GL_LIGHTING, isLightningEnable);
108         for (JoGLLight light : lights) {
109             if (light != null && light.isEnable()) {
110                 light.reload(gl);
111             }
112         }
113     }
114 }