a4af3dc164fd8b3266181da4210825ffc786f32e
[scilab.git] / scilab / modules / graphics / src / c / Light.c
1 /*\r
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
3  * Copyright (C) 2013 - Pedro SOUZA\r
4  *\r
5  * This file must be used under the terms of the CeCILL.\r
6  * This source file is licensed as described in the file COPYING, which\r
7  * you should have received as part of this distribution.  The terms\r
8  * are also available at\r
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
10  *\r
11  */\r
12 \r
13 #include "createGraphicObject.h"\r
14 #include "deleteGraphicObject.h"\r
15 #include "returnType.h"\r
16 #include "getGraphicObjectProperty.h"\r
17 #include "setGraphicObjectProperty.h"\r
18 #include "graphicObjectProperties.h"\r
19 #include "HandleManagement.h"\r
20 #include "CurrentSubwin.h"\r
21 \r
22 \r
23 BOOL isValidType(int type)\r
24 {\r
25     return type >= 0 && type <= 1;\r
26 }\r
27 \r
28 BOOL isValidColor(double * color)\r
29 {\r
30     if (color != NULL)\r
31     {\r
32         return (color[0] >= 0.0 && color[0] <= 1.0) &&\r
33             (color[1] >= 0.0 && color[1] <= 1.0) &&\r
34             (color[2] >= 0.0 && color[2] <= 1.0);\r
35     }\r
36     return FALSE;\r
37 }\r
38 \r
39 BOOL createLight(long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle)\r
40 {\r
41     const char * axes;\r
42     char * light;\r
43     int * piType = &type;\r
44     int * piVisible = &visible;\r
45 \r
46     if (pLightHandle == NULL) return FALSE;\r
47 \r
48     axes = getObjectFromHandle(axes_handle);\r
49     if (axes == NULL)\r
50     {\r
51         axes = getCurrentSubWin();\r
52         if (axes == NULL) return FALSE;\r
53     }\r
54 \r
55     light = createGraphicObject(__GO_LIGHT__);\r
56 \r
57     if (light == NULL) return FALSE;\r
58 \r
59     setGraphicObjectProperty(light, __GO_VISIBLE__, piVisible, jni_bool, 1);\r
60 \r
61     if (isValidType(type))\r
62     {\r
63         setGraphicObjectProperty(light, __GO_LIGHT_TYPE__, piType, jni_int, 1);\r
64     }\r
65 \r
66     if (position)\r
67     {\r
68         setGraphicObjectProperty(light, __GO_LIGHT_POSITION__, position, jni_double_vector, 3);\r
69     }\r
70 \r
71     if (direction)\r
72     {\r
73         setGraphicObjectProperty(light, __GO_LIGHT_DIRECTION__, direction, jni_double_vector, 3);\r
74     }\r
75 \r
76     if (isValidColor(ambient_color))\r
77     {\r
78         setGraphicObjectProperty(light, __GO_AMBIENTCOLOR__, ambient_color, jni_double_vector, 3);\r
79     }\r
80 \r
81     if (isValidColor(diffuse_color))\r
82     {\r
83         setGraphicObjectProperty(light, __GO_DIFFUSECOLOR__, diffuse_color, jni_double_vector, 3);\r
84     }\r
85 \r
86     if (isValidColor(specular_color))\r
87     {\r
88         setGraphicObjectProperty(light, __GO_SPECULARCOLOR__, specular_color, jni_double_vector, 3);\r
89     }\r
90     \r
91     *pLightHandle = getHandle(light);\r
92 \r
93     setGraphicObjectRelationship(axes, light);\r
94     releaseGraphicObjectProperty(__GO_PARENT__, light, jni_string, 1);\r
95 \r
96     return TRUE;\r
97 }\r
98 \r
99 \r
100 BOOL deleteLight(long long light_handle)\r
101 {\r
102     int iType;\r
103     int *piType = &iType;\r
104     const char * uid = NULL;\r
105 \r
106     uid = getObjectFromHandle(light_handle);\r
107     if (uid == NULL) return FALSE;\r
108 \r
109     getGraphicObjectProperty(uid, __GO_TYPE__, jni_int, (void **)&piType);\r
110 \r
111     if (iType != __GO_LIGHT__) return FALSE;\r
112 \r
113     deleteGraphicObject((char*)uid);\r
114 \r
115     return TRUE;\r
116 }\r