Graphics: fix light problems
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / JoGLView / util / LightingUtils.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2013 - Pedro SOUZA
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 package org.scilab.modules.renderer.JoGLView.util;
12
13 import org.scilab.forge.scirenderer.shapes.appearance.Material;
14 import org.scilab.forge.scirenderer.shapes.appearance.Color;
15 import org.scilab.forge.scirenderer.tranformations.Vector3d;
16 import org.scilab.forge.scirenderer.lightning.Light;
17 import org.scilab.forge.scirenderer.lightning.LightManager;
18
19 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
20 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
21
22 /**
23  * Utility functions to setup lighting.
24  * @author Pedro SOUZA
25  */
26 public class LightingUtils {
27
28     /**
29      * Convert the given material to a scirenderer material.
30      * @param m the material.
31      */
32     public static Material getMaterial(org.scilab.modules.graphic_objects.lighting.Material m) {
33         Material mtl = new Material();
34
35         Double[] color = m.getAmbientColor();
36         mtl.setAmbientColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
37         color = m.getDiffuseColor();
38         mtl.setDiffuseColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
39         color = m.getSpecularColor();
40         mtl.setSpecularColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
41         mtl.setColorMaterialEnable(m.getColorMaterialMode().booleanValue());
42         mtl.setShininess(m.getShininess().floatValue());
43
44         return mtl;
45     }
46
47     /**
48      * Enables/disables lighting.
49      * @param manager the light manager.
50      * @param status the status.
51      */
52     public static void setLightingEnable(LightManager manager, Boolean status) {
53         if (manager == null) {
54             return;
55         }
56         manager.setLightningEnable(status.booleanValue());
57         Light light = manager.getLight(0);
58         light.setEnable(status.booleanValue());
59     }
60
61
62     public static void setupLights(LightManager manager, org.scilab.modules.graphic_objects.axes.Axes axes) {
63
64         if (manager == null) {
65             return;
66         }
67
68         boolean hasLight = false;
69         int index = 0;
70
71         for (Integer child : axes.getChildren()) {
72             GraphicObject object = GraphicController.getController().getObjectFromId(child);
73             if (object instanceof org.scilab.modules.graphic_objects.lighting.Light) {
74                 //setup only visible lights
75                 if (((org.scilab.modules.graphic_objects.lighting.Light)object).getVisible()) {
76                     setLight(manager, (org.scilab.modules.graphic_objects.lighting.Light)object, index++, axes);
77                     hasLight = true;
78                 }
79             }
80             if (index >= manager.getLightNumber()) {
81                 break;
82             }
83         }
84         for (int i = index; i < manager.getLightNumber(); ++i) {
85             //manager.getLight(i).setEnable(false);
86         }
87         manager.setLightningEnable(hasLight);
88     }
89
90     /**
91      * Setup the give light.
92      * @param manager the light manager.
93      * @param light the light.
94      * @param index the light index.
95      */
96     public static void setLight(LightManager manager, org.scilab.modules.graphic_objects.lighting.Light light, int index, org.scilab.modules.graphic_objects.axes.Axes axes) {
97         Light sciLight = manager.getLight(index);
98         double[][] factors = axes.getScaleTranslateFactors();
99         Double[] coords = light.getLightTypeAsInteger() == 0 ? light.getDirection() : light.getPosition();
100         coords[0] = coords[0] * factors[0][0] + factors[1][0];
101         coords[1] = coords[1] * factors[0][1] + factors[1][1];
102         coords[2] = coords[2] * factors[0][2] + factors[1][2];
103
104         Double[] color = light.getAmbientColor();
105         sciLight.setAmbientColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
106         color = light.getDiffuseColor();
107         sciLight.setDiffuseColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
108         color = light.getSpecularColor();
109         sciLight.setSpecularColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
110
111         if (light.getLightTypeAsInteger() == 0) {
112             sciLight.setDirection(new Vector3d(coords));
113         } else {
114             sciLight.setPosition(new Vector3d(coords));
115         }
116
117         sciLight.setEnable(true);
118     }
119 }