Improve scirenderer light usage
[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-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.setShinines(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) return;
54         manager.setLightningEnable(status.booleanValue());
55         Light light = manager.getLight(0);
56         light.setEnable(status.booleanValue());
57     }
58
59
60     public static void setupLights(LightManager manager, org.scilab.modules.graphic_objects.axes.Axes axes) {
61
62         if (manager == null) return;
63         
64         boolean hasLight = false;
65         int index = 0;
66         
67         for (String child : axes.getChildren()) {
68             GraphicObject object = GraphicController.getController().getObjectFromId(child);
69             if (object instanceof org.scilab.modules.graphic_objects.lighting.Light) {
70                 //setup only visible lights
71                 if (((org.scilab.modules.graphic_objects.lighting.Light)object).getVisible()) {
72                     setLight(manager, (org.scilab.modules.graphic_objects.lighting.Light)object, index++);
73                     hasLight = true;
74                 }
75             }
76             if (index >= manager.getLightNumber()) break;
77         }
78         for (int i = index; i < manager.getLightNumber(); ++i) {
79             manager.getLight(i).setEnable(false);
80         }
81         manager.setLightningEnable(hasLight);
82     }
83
84     /**
85      * Setup the give light.
86      * @param manager the light manager.
87      * @param light the light.
88      * @param index the light index.
89      */
90     public static void setLight(LightManager manager, org.scilab.modules.graphic_objects.lighting.Light light, int index) {
91
92         Light sciLight = manager.getLight(index);
93
94         Double[] color = light.getAmbientColor();
95         sciLight.setAmbientColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
96         color = light.getDiffuseColor();
97         sciLight.setDiffuseColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
98         color = light.getSpecularColor();
99         sciLight.setSpecularColor(new Color(color[0].floatValue(), color[1].floatValue(), color[2].floatValue()));
100
101         switch (light.getLightTypeAsInteger()) {
102             case 0: //directional
103                 sciLight.setDirection(new Vector3d(light.getDirection()));
104                 break;
105             case 1: //point
106                 sciLight.setPosition(new Vector3d(light.getPosition()));
107                 break;
108             default:
109                 break;
110         }
111
112         sciLight.setEnable(true);
113     }
114 }