5171d38ecd769c1c8c95f58fa1d97ae4c68bf453
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_light_create.c
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  */
12
13 #include "gw_graphics.h"
14 #include "api_scilab.h"
15 #include "Scierror.h"
16 #include "localization.h"
17 #include "HandleManagement.h"
18 #include "Light.h"
19 #include "stricmp.h"
20
21
22
23 int sci_light_create(char *fname, unsigned long fname_len)
24 {
25     char * axes = NULL;
26     int type = -1;
27     BOOL visible = TRUE;
28     double * position = NULL;
29     double * direction = NULL;
30     double * ambient_color = NULL;
31     double * diffuse_color = NULL;
32     double * specular_color = NULL;
33
34     SciErr sciErr;
35     int* piAddr = NULL;
36     int nbRow, nbCol;
37     int * piBool;
38     int length = 0;
39     char str[16];
40     char * pStr = str;
41     char * light;
42     long long light_handle;
43     long long axes_hdl = -1;
44     long long* pAxesHandle = &axes_hdl;
45     BOOL result;
46
47
48     static rhs_opts opts[] =
49     {
50
51         { -1, "ambient_color", -1, 0, 0, NULL},
52         { -1, "diffuse_color", -1, 0, 0, NULL},
53         { -1, "direction", -1, 0, 0, NULL},
54         { -1, "position", -1, 0, 0, NULL},
55         { -1, "specular_color", -1, 0, 0, NULL},
56         { -1, "type", -1, 0, 0, NULL},
57         { -1, "visible", -1, 0, 0, NULL},
58         { -1, NULL, -1, 0, 0, NULL}
59     };
60
61
62     if (nbInputArgument(pvApiCtx) == 0)
63     {
64         result = createLight(-1, -1, TRUE, NULL, NULL, NULL, NULL, NULL, &light_handle);
65     }
66     else
67     {
68
69         CheckInputArgument(pvApiCtx, 1, 15);
70
71
72         if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
73         {
74             sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
75             if (sciErr.iErr)
76             {
77                 return 0;
78             }
79             getMatrixOfHandle(pvApiCtx, piAddr, &nbRow, &nbCol, &pAxesHandle);
80
81             if (pAxesHandle == NULL) return FALSE;
82
83             if (nbRow * nbCol != 1)
84             {
85                 Scierror(999, _("%s: Wrong size for input argument #%d: A graphic handle expected.\n"), fname, 1);
86                 return FALSE;
87             }
88         }
89
90         if (getOptionals(pvApiCtx, fname, opts) == 0)
91         {
92             ReturnArguments(pvApiCtx);
93             return 0;
94         }
95
96         if ((opts[6].iPos != -1) && (opts[6].iType == sci_strings) && (opts[6].iCols * opts[6].iRows == 1))
97         {
98             sciErr = getMatrixOfString(pvApiCtx, opts[6].piAddr, &nbRow, &nbCol, &length, NULL);
99             if (length < 15 && !sciErr.iErr)
100             {
101                 sciErr = getMatrixOfString(pvApiCtx, opts[6].piAddr, &nbRow, &nbCol, &length, &pStr);
102                 if (stricmp(str, "on") == 0)
103                 {
104                     visible = 1;
105                 }
106                 else if (stricmp(str, "off") == 0)
107                 {
108                     visible = 0;
109                 }
110             }
111         }
112
113         if ((opts[5].iPos != -1) && (opts[5].iType == sci_strings) && (opts[5].iCols * opts[5].iRows == 1))
114         {
115             sciErr = getMatrixOfString(pvApiCtx, opts[5].piAddr, &nbRow, &nbCol, &length, NULL);
116             if (length < 15 && !sciErr.iErr)
117             {
118                 sciErr = getMatrixOfString(pvApiCtx, opts[5].piAddr, &nbRow, &nbCol, &length, &pStr);
119                 if (stricmp(str, "directional") == 0)
120                 {
121                     type = 0;
122                 }
123                 else if (stricmp(str, "point") == 0)
124                 {
125                     type = 1;
126                 }
127             }
128         }
129
130         if ((opts[3].iPos != -1) && (opts[3].iType == sci_matrix) && (opts[3].iCols * opts[3].iRows == 3))
131         {
132             sciErr = getMatrixOfDouble(pvApiCtx, opts[3].piAddr, &nbRow, &nbCol, &position);
133         }
134
135         if ((opts[2].iPos != -1) && (opts[2].iType == sci_matrix) && (opts[2].iCols * opts[2].iRows == 3))
136         {
137             sciErr = getMatrixOfDouble(pvApiCtx, opts[2].piAddr, &nbRow, &nbCol, &direction);
138         }
139
140         if ((opts[0].iPos != -1) && (opts[0].iType == sci_matrix) && (opts[0].iCols * opts[0].iRows == 3))
141         {
142             sciErr = getMatrixOfDouble(pvApiCtx, opts[0].piAddr, &nbRow, &nbCol, &ambient_color);
143         }
144
145         if ((opts[1].iPos != -1) && (opts[1].iType == sci_matrix) && (opts[1].iCols * opts[1].iRows == 3))
146         {
147             sciErr = getMatrixOfDouble(pvApiCtx, opts[1].piAddr, &nbRow, &nbCol, &diffuse_color);
148         }
149
150         if ((opts[4].iPos != -1) && (opts[4].iType == sci_matrix) && (opts[4].iCols * opts[4].iRows == 3))
151         {
152             sciErr = getMatrixOfDouble(pvApiCtx, opts[4].piAddr, &nbRow, &nbCol, &specular_color);
153         }
154
155         result = createLight(*pAxesHandle, type, visible, position, direction, ambient_color, diffuse_color, specular_color, &light_handle);
156
157     }
158
159     if (result == FALSE) return FALSE;
160
161
162     nbRow = 1;
163     nbCol = 1;
164
165     sciErr = createMatrixOfHandle(pvApiCtx, nbInputArgument(pvApiCtx) + 1, nbRow, nbCol, &light_handle);
166     if (sciErr.iErr)
167     {
168         return FALSE;
169     }
170
171     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
172     ReturnArguments(pvApiCtx);
173     return TRUE;
174
175 }