Graphics: fix light problems
[scilab.git] / scilab / modules / scirenderer / src / org / scilab / forge / scirenderer / implementation / jogl / lightning / JoGLLight.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 javax.media.opengl.GL2;
15
16 import org.scilab.forge.scirenderer.implementation.jogl.utils.GLShortCuts;
17 import org.scilab.forge.scirenderer.lightning.Light;
18 import org.scilab.forge.scirenderer.shapes.appearance.Color;
19 import org.scilab.forge.scirenderer.tranformations.Vector3d;
20
21 /**
22  * @author Pierre Lando
23  */
24 public class JoGLLight implements Light {
25     private final int index;
26     private GL2 gl;
27     private boolean isEnable;
28     private Color ambientColor = new Color(0, 0, 0);
29     private Color diffuseColor = new Color(0, 0, 0);
30     private Color specularColor = new Color(0, 0, 0);
31     private Vector3d position = new Vector3d(0, 0, 0);
32     private Vector3d spotDirection = new Vector3d(0, 0, 1);
33     private Vector3d direction = new Vector3d(0, 0, 0);
34     private float spotAngle = 180;
35     private boolean isDirectional = false;
36
37     /**
38      * Default constructor.
39      * @param gl the gl context.
40      * @param index the light index.
41      */
42     public JoGLLight(GL2 gl, int index) {
43         this.gl = gl;
44         this.index = index;
45     }
46
47     /**
48      * Reload this light.
49      * @param gl the gl context.
50      */
51     public void reload(GL2 gl) {
52         this.gl = gl;
53
54         GLShortCuts.setEnable(gl, GL2.GL_LIGHT0 + index, isEnable);
55         gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_AMBIENT, ambientColor.getRGBComponents(null), 0);
56         gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_DIFFUSE, diffuseColor.getRGBComponents(null), 0);
57         gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_SPECULAR, specularColor.getRGBComponents(null), 0);
58         if (isDirectional) {
59             float[] pos = position.getDataAsFloatArray(4);
60             pos[3] = 0.0f;
61             pos[0] = -pos[0];
62             pos[1] = -pos[1];
63             pos[2] = -pos[2];
64             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_POSITION, pos, 0);
65         } else {
66             float[] pos = position.getDataAsFloatArray(4);
67             pos[3] = 1.0f;
68             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_POSITION, pos, 0);
69         }
70         gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_SPOT_DIRECTION, spotDirection.getDataAsFloatArray(4), 0);
71     }
72
73     @Override
74     public boolean isEnable() {
75         return isEnable;
76     }
77
78     @Override
79     public void setEnable(boolean enable) {
80         if (enable != isEnable) {
81             isEnable = enable;
82             GLShortCuts.setEnable(gl, GL2.GL_LIGHT0 + index, isEnable);
83         }
84     }
85
86     @Override
87     public Color getAmbientColor() {
88         return ambientColor;
89     }
90
91     @Override
92     public void setAmbientColor(Color color) {
93         if (color != null) {
94             ambientColor = color;
95             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_AMBIENT, ambientColor.getRGBComponents(null), 0);
96         }
97     }
98
99     @Override
100     public Color getDiffuseColor() {
101         return diffuseColor;
102     }
103
104     @Override
105     public void setDiffuseColor(Color color) {
106         if (color != null) {
107             diffuseColor = color;
108             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_DIFFUSE, diffuseColor.getRGBComponents(null), 0);
109         }
110     }
111
112     @Override
113     public Color getSpecularColor() {
114         return specularColor;
115     }
116
117     @Override
118     public void setSpecularColor(Color color) {
119         if (color != null) {
120             specularColor = color;
121             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_SPECULAR, specularColor.getRGBComponents(null), 0);
122         }
123     }
124
125     @Override
126     public Vector3d getPosition() {
127         return position;
128     }
129
130     @Override
131     public void setPosition(Vector3d position) {
132         if (position != null) {
133             isDirectional = false;
134             this.position = position;
135             float[] pos = position.getDataAsFloatArray(4);
136             pos[3] = 1.0f;
137             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_POSITION, pos, 0);
138         }
139     }
140
141     public Vector3d getDirection() {
142         return direction;
143     }
144
145     public void setDirection(Vector3d direction) {
146         if (direction != null) {
147             isDirectional = true;
148             this.direction = direction;
149             float[] dir = direction.getDataAsFloatArray(4);
150             dir[3] = 0.0f;
151             dir[0] = -dir[0];
152             dir[1] = -dir[1];
153             dir[2] = -dir[2];
154             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_POSITION, dir, 0);
155         }
156     }
157
158     @Override
159     public Vector3d getSpotDirection() {
160         return spotDirection;
161     }
162
163     @Override
164     public void setSpotDirection(Vector3d spotDirection) {
165         if (spotDirection != null) {
166             this.spotDirection = spotDirection;
167             gl.glLightfv(GL2.GL_LIGHT0 + index, GL2.GL_SPOT_DIRECTION, spotDirection.getNormalized().getDataAsFloatArray(4), 0);
168         }
169     }
170
171     @Override
172     public float getSpotAngle() {
173         return spotAngle;
174     }
175
176     @Override
177     public void setSpotAngle(float angle) {
178         if (angle != spotAngle) {
179             spotAngle = angle;
180             gl.glLightf(GL2.GL_LIGHT0 + index, GL2.GL_SPOT_CUTOFF, spotAngle);
181         }
182     }
183
184     @Override
185     public int getIndex() {
186         return index;
187     }
188 }