4
static int setlgt_ambient(Nv_data *, Tcl_Interp *, int, char **);
5
static int getlgt_bright(Nv_data *, Tcl_Interp *, int, char **);
6
static int getlgt_ambient(Nv_data *, Tcl_Interp *, int, char **);
7
static int getlgt_color(Nv_data *, Tcl_Interp *, int, char **);
8
static int getlgt_position(Nv_data *, Tcl_Interp *, int, char **);
9
static int setlgt_bright(Nv_data *, Tcl_Interp *, int, char **);
10
static int setlgt_color(Nv_data *, Tcl_Interp *, int, char **);
11
static int setlgt_position(Nv_data *, Tcl_Interp *, int, char **);
12
static int switchlight(int, char **);
13
static int get_light_num(char *);
14
static int init_new_light(Nv_data *, int);
16
int Nlight_obj_cmd(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
17
int argc, /* Number of arguments. */
18
char **argv /* Argument strings. */
21
if (!strcmp(argv[1], "set_ambient"))
22
return (setlgt_ambient(data, interp, argc, argv));
23
else if (!strcmp(argv[1], "get_ambient"))
24
return (getlgt_ambient(data, interp, argc, argv));
25
else if (!strcmp(argv[1], "set_bright"))
26
return (setlgt_bright(data, interp, argc, argv));
27
else if (!strcmp(argv[1], "get_bright"))
28
return (getlgt_bright(data, interp, argc, argv));
29
else if (!strcmp(argv[1], "set_color"))
30
return (setlgt_color(data, interp, argc, argv));
31
else if (!strcmp(argv[1], "get_color"))
32
return (getlgt_color(data, interp, argc, argv));
33
else if (!strcmp(argv[1], "set_position"))
34
return (setlgt_position(data, interp, argc, argv));
35
else if (!strcmp(argv[1], "get_position"))
36
return (getlgt_position(data, interp, argc, argv));
37
else if (!strcmp(argv[1], "switch"))
38
return (switchlight(argc, argv));
43
int Nnew_light_cmd(Nv_data * data, Tcl_Interp * interp /* Current interpreter. */
49
if (0 > (num = GS_new_light())) {
50
Tcl_SetResult(interp, "too many lights", TCL_VOLATILE);
53
sprintf(buf, "Nlight%d", num);
54
init_new_light(data, num);
55
Tcl_CreateCommand(interp, buf, (Tcl_CmdProc *) Nlight_obj_cmd, data,
57
Tcl_SetResult(interp, buf, TCL_VOLATILE);
61
int Nlights_cmd(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
62
int argc, /* Number of arguments. */
63
char **argv /* Argument strings. */
67
if (!strcmp(argv[1], "off")) {
75
static int setlgt_ambient(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
76
int argc, /* Number of arguments. */
77
char **argv /* Argument strings. */
85
num = get_light_num(argv[0]);
86
data->light[num].ar = r = (float)atof(argv[2]);
87
data->light[num].ag = g = (float)atof(argv[3]);
88
data->light[num].ab = b = (float)atof(argv[4]);
89
GS_setlight_ambient(num, r, g, b);
93
static int getlgt_bright(Nv_data * data, Tcl_Interp * interp, int argc, /* Number of arguments. */
94
char **argv /* Argument strings. */
100
num = get_light_num(argv[0]);
101
sprintf(bright, "%f", data->light[num].brt);
102
Tcl_SetResult(interp, bright, TCL_VOLATILE);
106
static int getlgt_ambient(Nv_data * data, Tcl_Interp * interp, int argc, /* Number of arguments. */
107
char **argv /* Argument strings. */
111
char r[32], g[32], b[32];
114
num = get_light_num(argv[0]);
115
sprintf(r, "%f", data->light[num].ar);
116
sprintf(g, "%f", data->light[num].ag);
117
sprintf(b, "%f", data->light[num].ab);
123
Tcl_SetResult(interp, Tcl_Merge(3, list), TCL_DYNAMIC);
127
static int getlgt_color(Nv_data * data, Tcl_Interp * interp, int argc, /* Number of arguments. */
128
char **argv /* Argument strings. */
132
char r[32], g[32], b[32];
135
num = get_light_num(argv[0]);
136
sprintf(r, "%f", data->light[num].r);
137
sprintf(g, "%f", data->light[num].g);
138
sprintf(b, "%f", data->light[num].b);
144
Tcl_SetResult(interp, Tcl_Merge(3, list), TCL_DYNAMIC);
148
static int getlgt_position(Nv_data * data, Tcl_Interp * interp, int argc, /* Number of arguments. */
149
char **argv /* Argument strings. */
153
char x[32], y[32], z[32], w[32];
156
num = get_light_num(argv[0]);
157
sprintf(x, "%f", data->light[num].x);
158
sprintf(y, "%f", data->light[num].y);
159
sprintf(z, "%f", data->light[num].z);
160
sprintf(w, "%f", data->light[num].w);
167
Tcl_SetResult(interp, Tcl_Merge(4, list), TCL_DYNAMIC);
172
static int setlgt_bright(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
173
int argc, /* Number of arguments. */
174
char **argv /* Argument strings. */
183
num = get_light_num(argv[0]);
185
data->light[num].brt = (float)atof(argv[2]);
187
r = data->light[num].r * data->light[num].brt;
188
g = data->light[num].g * data->light[num].brt;
189
b = data->light[num].b * data->light[num].brt;
191
GS_setlight_color(num, r, g, b);
195
static int setlgt_color(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
196
int argc, /* Number of arguments. */
197
char **argv /* Argument strings. */
206
num = get_light_num(argv[0]);
208
data->light[num].r = (float)atof(argv[2]);
209
data->light[num].g = (float)atof(argv[3]);
210
data->light[num].b = (float)atof(argv[4]);
212
r = data->light[num].r * data->light[num].brt;
213
g = data->light[num].g * data->light[num].brt;
214
b = data->light[num].b * data->light[num].brt;
216
GS_setlight_color(num, r, g, b);
220
static int setlgt_position(Nv_data * data, Tcl_Interp * interp, /* Current interpreter. */
221
int argc, /* Number of arguments. */
222
char **argv /* Argument strings. */
232
num = get_light_num(argv[0]);
234
data->light[num].x = x = (float)atof(argv[2]);
235
data->light[num].y = y = (float)atof(argv[3]);
236
data->light[num].z = z = (float)atof(argv[4]);
237
data->light[num].w = w = (float)atoi(argv[5]);
238
GS_setlight_position(num, x, y, z, w);
242
static int switchlight(int argc, /* Number of arguments. */
243
char **argv /* Argument strings. */
250
on = (strcmp(argv[0], "off"));
251
num = get_light_num(argv[3]);
252
GS_switchlight(num, on);
256
static int get_light_num(char *lgt)
260
sscanf(lgt, "Nlight%d", &num);
265
static int init_new_light(Nv_data * data, int n)
267
data->light[n].brt = 0.8;
268
data->light[n].ar = 0.3;
269
data->light[n].ag = 0.3;
270
data->light[n].ab = 0.3;
271
data->light[n].r = 1.0;
272
data->light[n].b = 1.0;
273
data->light[n].g = 1.0;
274
data->light[n].x = 1.0;
275
data->light[n].y = 1.0;
276
data->light[n].z = 1.0;
277
data->light[n].w = 1.0;