FreeWRL/FreeX3D  3.0.0
jsVRML_SFClasses.c
1 /*
2 
3  A substantial amount of code has been adapted from js/src/js.c,
4  which is the sample application included with the javascript engine.
5 
6 */
7 
8 /****************************************************************************
9  This file is part of the FreeWRL/FreeX3D Distribution.
10 
11  Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
12 
13  FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
14  it under the terms of the GNU Lesser Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  FreeWRL/FreeX3D is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  GNU General Public License for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
25 ****************************************************************************/
26 
27 
28 #include <config.h>
29 #include <system.h>
30 #if !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK))
31 #include <system_threads.h>
32 #include <display.h>
33 #include <internal.h>
34 
35 #include <libFreeWRL.h>
36 #include <list.h>
37 
38 #include <io_files.h>
39 
40 #include "../vrml_parser/Structs.h"
41 #include "../main/headers.h"
42 #include "../main/ProdCon.h"
43 #include "../vrml_parser/CParseGeneral.h"
44 #include "../main/Snapshot.h"
45 #include "../scenegraph/LinearAlgebra.h"
46 #include "../scenegraph/Collision.h"
47 #include "../scenegraph/quaternion.h"
48 #include "../scenegraph/Viewer.h"
49 #include "../input/SensInterps.h"
50 #include "../x3d_parser/Bindable.h"
51 #include "../input/InputFunctions.h"
52 
53 #include <system_js.h>
54 #include "JScript.h"
55 #include "CScripts.h"
56 #include "jsUtils.h"
57 #include "jsNative.h"
58 #include "jsVRMLClasses.h"
59 //#include "JScript.h"
60 
61 
62 
63 /********************************************************/
64 /* */
65 /* Second part - SF classes */
66 /* */
67 /********************************************************/
68 
69 /* from http://www.cs.rit.edu/~ncs/color/t_convert.html */
70 double MIN(double a, double b, double c) {
71  double min;
72  if((a<b)&&(a<c))min=a; else if((b<a)&&(b<c))min=b; else min=c; return min;
73 }
74 
75 double MAX(double a, double b, double c) {
76  double max;
77  if((a>b)&&(a>c))max=a; else if((b>a)&&(b>c))max=b; else max=c; return max;
78 }
79 
80 void convertRGBtoHSV(double r, double g, double b, double *h, double *s, double *v) {
81  double my_min, my_max, delta;
82 
83  my_min = MIN( r, g, b );
84  my_max = MAX( r, g, b );
85  *v = my_max; /* v */
86  delta = my_max - my_min;
87  if( my_max != 0 )
88  *s = delta / my_max; /* s */
89  else {
90  /* r = g = b = 0 */ /* s = 0, v is undefined */
91  *s = 0;
92  *h = -1;
93  return;
94  }
95  if( r == my_max )
96  *h = ( g - b ) / delta; /* between yellow & magenta */
97  else if( g == my_max )
98  *h = 2 + ( b - r ) / delta; /* between cyan & yellow */
99  else
100  *h = 4 + ( r - g ) / delta; /* between magenta & cyan */
101  *h *= 60; /* degrees */
102  if( *h < 0 )
103  *h += 360;
104 }
105 void convertHSVtoRGB( double h, double s, double v ,double *r, double *g, double *b)
106 {
107  int i;
108  double f, p, q, t;
109  if( s == 0 ) {
110  /* achromatic (grey) */
111  *r = *g = *b = v;
112  return;
113  }
114  h /= 60; /* sector 0 to 5 */
115  i = (int) floor( h );
116  f = h - i; /* factorial part of h */
117  p = v * ( 1 - s );
118  q = v * ( 1 - s * f );
119  t = v * ( 1 - s * ( 1 - f ) );
120  switch( i ) {
121  case 0: *r = v; *g = t; *b = p; break;
122  case 1: *r = q; *g = v; *b = p; break;
123  case 2: *r = p; *g = v; *b = t; break;
124  case 3: *r = p; *g = q; *b = v; break;
125  case 4: *r = t; *g = p; *b = v; break;
126  default: *r = v; *g = p; *b = q; break;
127  }
128 }
129 
130 JSBool
131 #if JS_VERSION < 185
132 SFColorGetHSV(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
133 #else
134 SFColorGetHSV(JSContext *cx, uintN argc, jsval *vp) {
135  JSObject *obj = JS_THIS_OBJECT(cx,vp);
136  jsval *argv = JS_ARGV(cx,vp);
137 #endif
138  JSObject *result;
139  double xp[3];
140  jsval _v;
141  SFColorNative *ptr;
142  int i;
143 
144  UNUSED(argv);
145  if (argc != 0) {
146  printf ("SFColorGetHSV; arguments found but not expected\n");
147  return JS_FALSE;
148  }
149 
150  /* get the RGB values */
151  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
152  printf( "JS_GetPrivate failed in SFColorToString.\n");
153  return JS_FALSE;
154  }
155 
156  /* convert rgb to hsv */
157  convertRGBtoHSV((ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2],&xp[0],&xp[1],&xp[2]);
158 
159  #ifdef JSVRMLCLASSESVERBOSE
160  printf("hsv code, orig rgb is %.9g %.9g %.9g\n", (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
161  printf ("hsv conversion is %lf %lf %lf\n",xp[0],xp[1],xp[2]);
162  #endif
163 
164  result = JS_NewArrayObject(cx, 3, NULL);
165  ADD_ROOT(cx, result);
166  for(i=0; i<3; i++) {
167  if (JS_NewNumberValue(cx, xp[i],&_v) == JS_FALSE) {
168  printf( "JS_NewDouble failed for %f in SFColorGetHSV.\n", xp[i]);
169  return JS_FALSE;
170  }
171  JS_SetElement(cx, result, (jsint)i, &_v);
172  }
173 
174  /* JAS - should we remove this here, or on finalize? JS_RemoveRoot(cx, &result); */
175 #if JS_VERSION < 185
176  *rval = OBJECT_TO_JSVAL(result);
177 #else
178  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(result));
179 #endif
180  return JS_TRUE;
181 }
182 
183 JSBool
184 #if JS_VERSION < 185
185 SFColorSetHSV(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
186 #else
187 SFColorSetHSV(JSContext *cx, uintN argc, jsval *vp) {
188  JSObject *obj = JS_THIS_OBJECT(cx,vp);
189  jsval *argv = JS_ARGV(cx,vp);
190 #endif
191  SFColorNative *ptr;
192  double hue, saturation, value;
193  double red,green,blue;
194 
195  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
196  printf( "JS_GetPrivate failed in SFColorToString.\n");
197  return JS_FALSE;
198  }
199  if (!JS_ConvertArguments(cx, argc, argv, "d d d", &hue, &saturation, &value)) {
200  printf( "JS_ConvertArguments failed in SFColorSetHSV.\n");
201  return JS_FALSE;
202  }
203 
204  /* do conversion here!!! */
205  #ifdef JSCLASSESVERBOSE
206  printf("hsv code, orig rgb is %.9g %.9g %.9g\n", (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
207  printf ("SFColorSetHSV, have %lf %lf %lf\n",hue,saturation,value);
208  #endif
209 
210  convertHSVtoRGB(hue,saturation,value, &red, &green, &blue);
211  ptr->v.c[0] = (float) red;
212  ptr->v.c[1] = (float) green;
213  ptr->v.c[2] = (float) blue;
214  ptr->valueChanged ++;
215  #ifdef JSCLASSESVERBOSE
216  printf("hsv code, now rgb is %.9g %.9g %.9g\n", (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
217  #endif
218 
219 #if JS_VERSION < 185
220  *rval = OBJECT_TO_JSVAL(obj);
221 #else
222  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
223 #endif
224 
225  return JS_TRUE;
226 }
227 
228 JSBool
229 #if JS_VERSION < 185
230 SFColorToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
231 #else
232 SFColorToString(JSContext *cx, uintN argc, jsval *vp) {
233  JSObject *obj = JS_THIS_OBJECT(cx,vp);
234  jsval *argv = JS_ARGV(cx,vp);
235 #endif
236  SFColorNative *ptr;
237  JSString *_str;
238  char _buff[STRING];
239 
240  UNUSED(argc);
241  UNUSED(argv);
242  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
243  printf( "JS_GetPrivate failed in SFColorToString.\n");
244  return JS_FALSE;
245  }
246 
247  memset(_buff, 0, STRING);
248  sprintf(_buff, "%.9g %.9g %.9g",
249  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
250  _str = JS_NewStringCopyZ(cx, _buff);
251 #if JS_VERSION < 185
252  *rval = STRING_TO_JSVAL(_str);
253 #else
254  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
255 #endif
256  return JS_TRUE;
257 }
258 
259 JSBool
260 #if JS_VERSION < 185
261 SFColorAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
262 #else
263 SFColorAssign(JSContext *cx, uintN argc, jsval *vp) {
264  JSObject *obj = JS_THIS_OBJECT(cx,vp);
265  jsval *argv = JS_ARGV(cx,vp);
266  JSString *_id_jsstr;
267 #endif
268  JSObject *_from_obj;
269  SFColorNative *ptr, *fptr;
270  char *_id_str;
271 
272  UNUSED(_id_str); // compiler warning mitigation
273 
274 
275  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
276  printf( "JS_GetPrivate failed for obj in SFColorAssign.\n");
277  return JS_FALSE;
278  }
279 
280 
281  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFColorClass)
282 
283 #if JS_VERSION < 185
284  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
285 #else
286  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
287  _id_str = JS_EncodeString(cx,_id_jsstr);
288  } else {
289 #endif
290  printf( "JS_ConvertArguments failed in SFColorAssign.\n");
291  return JS_FALSE;
292  }
293 
294  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFColorClass)
295 
296  if ((fptr = (SFColorNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
297  printf( "JS_GetPrivate failed for _from_obj in SFColorAssign.\n");
298  return JS_FALSE;
299  }
300  #ifdef JSVRMLCLASSESVERBOSE
301  printf("SFColorAssign: obj = %p, id = \"%s\", from = %p\n", obj, _id_str, _from_obj);
302  #endif
303 
304  SFColorNativeAssign(ptr, fptr);
305 #if JS_VERSION < 185
306  *rval = OBJECT_TO_JSVAL(obj);
307 #else
308  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
309 #endif
310 
311  return JS_TRUE;
312 }
313 
314 JSBool
315 #if JS_VERSION < 185
316 SFColorConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
317 #else
318 SFColorConstr(JSContext *cx, uintN argc, jsval *vp) {
319  JSObject *obj = JS_NewObject(cx,&SFColorClass,NULL,NULL);
320  jsval *argv = JS_ARGV(cx,vp);
321 #endif
322  SFColorNative *ptr;
323  jsdouble pars[3];
324 
325  ADD_ROOT(cx,obj)
326 
327  if ((ptr = (SFColorNative *) SFColorNativeNew()) == NULL) {
328  printf( "SFColorNativeNew failed in SFColorConstr.\n");
329  return JS_FALSE;
330  }
331 
332  //if (!JS_DefineProperties(cx, obj, SFColorProperties)) {
333  // printf( "JS_DefineProperties failed in SFColorConstr.\n");
334  // return JS_FALSE;
335  //}
336 
337  if (!JS_SetPrivate(cx, obj, ptr)) {
338  printf( "JS_SetPrivate failed in SFColorConstr.\n");
339  return JS_FALSE;
340  }
341 
342  if (argc == 0) {
343  (ptr->v).c[0] = (float) 0.0;
344  (ptr->v).c[1] = (float) 0.0;
345  (ptr->v).c[2] = (float) 0.0;
346  } else if (JS_ConvertArguments(cx, argc, argv, "d d d", &(pars[0]), &(pars[1]), &(pars[2]))) {
347  (ptr->v).c[0] = (float) pars[0];
348  (ptr->v).c[1] = (float) pars[1];
349  (ptr->v).c[2] = (float) pars[2];
350  } else {
351  printf( "Invalid arguments for SFColorConstr.\n");
352  return JS_FALSE;
353  }
354  #ifdef JSVRMLCLASSESVERBOSE
355  printf("SFColorConstr: obj = %p args = %d, %f %f %f\n",
356  obj, argc,
357  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
358  #endif
359 
360  ptr->valueChanged = 1;
361 
362 #if JS_VERSION < 185
363  *rval = OBJECT_TO_JSVAL(obj);
364 #else
365  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
366 #endif
367 
368  return JS_TRUE;
369 }
370 
371 
372 JSBool
373 #if JS_VERSION < 185
374 SFColorGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
375 #else
376 SFColorGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
377 #endif
378 {
379  SFColorNative *ptr;
380  jsdouble d;
381 #if JS_VERSION >= 185
382  jsval id;
383  if (!JS_IdToValue(cx,iid,&id)) {
384  printf("JS_IdToValue failed in SFColorGetProperty.\n");
385  return JS_FALSE;
386  }
387 #endif
388 
389  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
390  printf( "JS_GetPrivate failed in SFColorGetProperty.\n");
391  return JS_FALSE;
392  }
393  if (JSVAL_IS_INT(id)) {
394  switch (JSVAL_TO_INT(id)) {
395  case 0:
396  d = (ptr->v).c[0];
397  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
398  printf(
399  "JS_NewDouble failed for %f in SFColorGetProperty.\n",
400  d);
401  return JS_FALSE;
402  }
403  break;
404  case 1:
405  d = (ptr->v).c[1];
406  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
407  printf(
408  "JS_NewDouble failed for %f in SFColorGetProperty.\n",
409  d);
410  return JS_FALSE;
411  }
412  break;
413  case 2:
414  d = (ptr->v).c[2];
415  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
416  printf(
417  "JS_NewDouble failed for %f in SFColorGetProperty.\n",
418  d);
419  return JS_FALSE;
420  }
421  break;
422  }
423  }
424  return JS_TRUE;
425 }
426 
427 JSBool
428 #if JS_VERSION < 185
429 SFColorSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
430 #else
431 SFColorSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
432 #endif
433 {
434  SFColorNative *ptr;
435  jsval _val;
436 #if JS_VERSION >= 185
437  jsval id;
438  if (!JS_IdToValue(cx,iid,&id)) {
439  printf("JS_IdToValue failed in SFColorSetProperty.\n");
440  return JS_FALSE;
441  }
442 #endif
443 
444  if ((ptr = (SFColorNative *)JS_GetPrivate(cx, obj)) == NULL) {
445  printf( "JS_GetPrivate failed in SFColorSetProperty.\n");
446  return JS_FALSE;
447  }
448  ptr->valueChanged++;
449  #ifdef JSVRMLCLASSESVERBOSE
450  printf("SFColorSetProperty: obj = %p, id = %d, valueChanged = %d\n",
451  obj, JSVAL_TO_INT(id), ptr->valueChanged);
452  #endif
453 
454  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &_val)) {
455  printf( "JS_ConvertValue failed in SFColorSetProperty.\n");
456  return JS_FALSE;
457  }
458 
459  if (JSVAL_IS_INT(id)) {
460  switch (JSVAL_TO_INT(id)) {
461  case 0:
462 #if JS_VERSION < 185
463  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(_val);
464 #else
465  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(_val);
466 #endif
467  break;
468  case 1:
469 #if JS_VERSION < 185
470  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(_val);
471 #else
472  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(_val);
473 #endif
474  break;
475  case 2:
476 #if JS_VERSION < 185
477  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(_val);
478 #else
479  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(_val);
480 #endif
481  break;
482 
483  }
484  }
485  return JS_TRUE;
486 }
487 
488 /* copy code from SFColorGetHSV if the spec ever decides to implement this. */
489 JSBool
490 #if JS_VERSION < 185
491 SFColorRGBAGetHSV(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
492 #else
493 SFColorRGBAGetHSV(JSContext *cx, uintN argc, jsval *vp) {
494  JSObject *obj = JS_THIS_OBJECT(cx,vp);
495  jsval *argv = JS_ARGV(cx,vp);
496 #endif
497 
498 
499  JSObject *_arrayObj;
500  jsdouble hue = 0, saturation = 0, value = 0;
501  jsval _v;
502 
503  UNUSED(obj);
504  UNUSED(argc);
505  UNUSED(argv);
506  /* do conversion here!!! */
507 
508  if ((_arrayObj = JS_NewArrayObject(cx, 0, NULL)) == NULL) {
509  printf( "JS_NewArrayObject failed in SFColorRGBAGetHSV.\n");
510  return JS_FALSE;
511  }
512 
513  /* construct new double before conversion? */
514  JS_NewNumberValue(cx,hue,&_v); /* was: _v = DOUBLE_TO_JSVAL(&hue); */
515  if (!JS_SetElement(cx, _arrayObj, 0, &_v)) {
516  printf( "JS_SetElement failed for hue in SFColorRGBAGetHSV.\n");
517  return JS_FALSE;
518  }
519  JS_NewNumberValue(cx,saturation,&_v); /* was: _v = DOUBLE_TO_JSVAL(&saturation); */
520  if (!JS_SetElement(cx, _arrayObj, 1, &_v)) {
521  printf( "JS_SetElement failed for saturation in SFColorRGBAGetHSV.\n");
522  return JS_FALSE;
523  }
524  JS_NewNumberValue(cx,value,&_v); /* was: _v = DOUBLE_TO_JSVAL(&value); */
525  if (!JS_SetElement(cx, _arrayObj, 2, &_v)) {
526  printf( "JS_SetElement failed for value in SFColorRGBAGetHSV.\n");
527  return JS_FALSE;
528  }
529 #if JS_VERSION < 185
530  *rval = OBJECT_TO_JSVAL(_arrayObj);
531 #else
532  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(_arrayObj));
533 #endif
534 
535  return JS_TRUE;
536 }
537 
538 /* implement later?? Copy most of code from SFColorSetHSV if we require this */
539 JSBool
540 #if JS_VERSION < 185
541 SFColorRGBASetHSV(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
542 #else
543 SFColorRGBASetHSV(JSContext *cx, uintN argc, jsval *vp) {
544  JSObject *obj = JS_THIS_OBJECT(cx,vp);
545  jsval *argv = JS_ARGV(cx,vp);
546 #endif
547 
548  SFColorRGBANative *ptr;
549  jsdouble hue, saturation, value;
550 
551  if ((ptr = (SFColorRGBANative *)JS_GetPrivate(cx, obj)) == NULL) {
552  printf( "JS_GetPrivate failed in SFColorRGBAToString.\n");
553  return JS_FALSE;
554  }
555  if (!JS_ConvertArguments(cx, argc, argv, "d d d",
556  &hue, &saturation, &value)) {
557  printf( "JS_ConvertArguments failed in SFColorRGBASetHSV.\n");
558  return JS_FALSE;
559  }
560 
561  /* do conversion here!!! */
562 
563 #if JS_VERSION < 185
564  *rval = OBJECT_TO_JSVAL(obj);
565 #else
566  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
567 #endif
568 
569  return JS_TRUE;
570 }
571 
572 JSBool
573 #if JS_VERSION < 185
574 SFColorRGBAToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
575 #else
576 SFColorRGBAToString(JSContext *cx, uintN argc, jsval *vp) {
577  JSObject *obj = JS_THIS_OBJECT(cx,vp);
578  jsval *argv = JS_ARGV(cx,vp);
579 #endif
580 
581  SFColorRGBANative *ptr;
582  JSString *_str;
583  char _buff[STRING];
584 
585  UNUSED(argc);
586  UNUSED(argv);
587  if ((ptr = (SFColorRGBANative *)JS_GetPrivate(cx, obj)) == NULL) {
588  printf( "JS_GetPrivate failed in SFColorRGBAToString.\n");
589  return JS_FALSE;
590  }
591 
592  memset(_buff, 0, STRING);
593  sprintf(_buff, "%.9g %.9g %.9g %.9g",
594  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2],(ptr->v).c[3]);
595  _str = JS_NewStringCopyZ(cx, _buff);
596 
597 #if JS_VERSION < 185
598  *rval = STRING_TO_JSVAL(_str);
599 #else
600  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
601 #endif
602 
603  return JS_TRUE;
604 }
605 
606 JSBool
607 #if JS_VERSION < 185
608 SFColorRGBAAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
609 #else
610 SFColorRGBAAssign(JSContext *cx, uintN argc, jsval *vp) {
611  JSObject *obj = JS_THIS_OBJECT(cx,vp);
612  jsval *argv = JS_ARGV(cx,vp);
613  JSString *_id_jsstr;
614 #endif
615 
616  JSObject *_from_obj;
617  SFColorRGBANative *ptr, *fptr;
618  char *_id_str;
619 
620  UNUSED(_id_str); // compiler warning mitigation
621 
622 
623  if ((ptr = (SFColorRGBANative *)JS_GetPrivate(cx, obj)) == NULL) {
624  printf( "JS_GetPrivate failed for obj in SFColorRGBAAssign.\n");
625  return JS_FALSE;
626  }
627 
628  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFColorRGBAClass)
629 
630 #if JS_VERSION < 185
631  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
632 #else
633  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
634  _id_str = JS_EncodeString(cx,_id_jsstr);
635  } else {
636 #endif
637  printf( "JS_ConvertArguments failed in SFColorRGBAAssign.\n");
638  return JS_FALSE;
639  }
640 
641  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFColorRGBAClass)
642 
643  if ((fptr = (SFColorRGBANative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
644  printf( "JS_GetPrivate failed for _from_obj in SFColorRGBAAssign.\n");
645  return JS_FALSE;
646  }
647  #ifdef JSVRMLCLASSESVERBOSE
648  printf("SFColorRGBAAssign: obj = %p, id = \"%s\", from = %p\n",
649  obj, _id_str, _from_obj);
650  #endif
651 
652  SFColorRGBANativeAssign(ptr, fptr);
653 
654 #if JS_VERSION < 185
655  *rval = OBJECT_TO_JSVAL(obj);
656 #else
657  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
658 #endif
659 
660  return JS_TRUE;
661 }
662 
663 JSBool
664 #if JS_VERSION < 185
665 SFColorRGBAConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
666 #else
667 SFColorRGBAConstr(JSContext *cx, uintN argc, jsval *vp) {
668  JSObject *obj = JS_NewObject(cx,&SFColorRGBAClass,NULL,NULL);
669  jsval *argv = JS_ARGV(cx,vp);
670 #endif
671 
672  SFColorRGBANative *ptr;
673  jsdouble pars[4];
674 
675  ADD_ROOT(cx,obj)
676 
677  if ((ptr = (SFColorRGBANative *) SFColorNativeNew()) == NULL) {
678  printf( "SFColorRGBANativeNew failed in SFColorConstr.\n");
679  return JS_FALSE;
680  }
681 
682  //if (!JS_DefineProperties(cx, obj, SFColorRGBAProperties)) {
683  // printf( "JS_DefineProperties failed in SFColorRGBAConstr.\n");
684  // return JS_FALSE;
685  //}
686 
687  if (!JS_SetPrivate(cx, obj, ptr)) {
688  printf( "JS_SetPrivate failed in SFColorRGBAConstr.\n");
689  return JS_FALSE;
690  }
691 
692  if (argc == 0) {
693  (ptr->v).c[0] = (float) 0.0;
694  (ptr->v).c[1] = (float) 0.0;
695  (ptr->v).c[2] = (float) 0.0;
696  (ptr->v).c[3] = (float) 0.0;
697  } else if (JS_ConvertArguments(cx, argc, argv, "d d d d",
698  &(pars[0]), &(pars[1]), &(pars[2]), &(pars[3]))) {
699  (ptr->v).c[0] = (float) pars[0];
700  (ptr->v).c[1] = (float) pars[1];
701  (ptr->v).c[2] = (float) pars[2];
702  (ptr->v).c[3] = (float) pars[3];
703  } else {
704  printf( "Invalid arguments for SFColorRGBAConstr.\n");
705  return JS_FALSE;
706  }
707 
708 
709  ptr->valueChanged = 1;
710 
711  #ifdef JSVRMLCLASSESVERBOSE
712  printf("SFColorRGBAConstr: obj = %p %u args, %f %f %f %f\n",
713  obj, argc,
714  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2],(ptr->v).c[3]);
715  #endif
716 #if JS_VERSION < 185
717  *rval = OBJECT_TO_JSVAL(obj);
718 #else
719  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
720 #endif
721 
722  return JS_TRUE;
723 }
724 
725 JSBool
726 #if JS_VERSION < 185
727 SFColorRGBAGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
728 #else
729 SFColorRGBAGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
730 #endif
731 {
732  SFColorRGBANative *ptr;
733  jsdouble d;
734 #if JS_VERSION >= 185
735  jsval id;
736  if (!JS_IdToValue(cx,iid,&id)) {
737  printf("JS_IdToValue failed in SFColorRGBAGetProperty.\n");
738  return JS_FALSE;
739  }
740 #endif
741 
742  if ((ptr = (SFColorRGBANative *)JS_GetPrivate(cx, obj)) == NULL) {
743  printf( "JS_GetPrivate failed in SFColorRGBAGetProperty.\n");
744  return JS_FALSE;
745  }
746  if (JSVAL_IS_INT(id)) {
747  switch (JSVAL_TO_INT(id)) {
748  case 0:
749  d = (ptr->v).c[0];
750  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
751  printf(
752  "JS_NewDouble failed for %f in SFColorRGBAGetProperty.\n",
753  d);
754  return JS_FALSE;
755  }
756  break;
757  case 1:
758  d = (ptr->v).c[1];
759  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
760  printf(
761  "JS_NewDouble failed for %f in SFColorRGBAGetProperty.\n",
762  d);
763  return JS_FALSE;
764  }
765  break;
766  case 2:
767  d = (ptr->v).c[2];
768  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
769  printf(
770  "JS_NewDouble failed for %f in SFColorRGBAGetProperty.\n",
771  d);
772  return JS_FALSE;
773  }
774  break;
775  case 3:
776  d = (ptr->v).c[3];
777  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
778  printf(
779  "JS_NewDouble failed for %f in SFColorRGBAGetProperty.\n",
780  d);
781  return JS_FALSE;
782  }
783  break;
784  }
785  }
786  return JS_TRUE;
787 }
788 
789 JSBool
790 #if JS_VERSION < 185
791 SFColorRGBASetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
792 #else
793 SFColorRGBASetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
794 #endif
795 {
796  SFColorRGBANative *ptr;
797  jsval _val;
798 #if JS_VERSION >= 185
799  jsval id;
800  if (!JS_IdToValue(cx,iid,&id)) {
801  printf("JS_IdToValue failed in SFColorRGBASetProperty.\n");
802  return JS_FALSE;
803  }
804 #endif
805 
806  if ((ptr = (SFColorRGBANative *)JS_GetPrivate(cx, obj)) == NULL) {
807  printf( "JS_GetPrivate failed in SFColorRGBASetProperty.\n");
808  return JS_FALSE;
809  }
810  ptr->valueChanged++;
811  #ifdef JSVRMLCLASSESVERBOSE
812  printf("SFColorRGBASetProperty: obj = %p, id = %d, valueChanged = %d\n",
813  obj, JSVAL_TO_INT(id), ptr->valueChanged);
814  #endif
815 
816  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &_val)) {
817  printf( "JS_ConvertValue failed in SFColorRGBASetProperty.\n");
818  return JS_FALSE;
819  }
820 
821  if (JSVAL_IS_INT(id)) {
822  switch (JSVAL_TO_INT(id)) {
823  case 0:
824 #if JS_VERSION < 185
825  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(_val);
826 #else
827  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(_val);
828 #endif
829  break;
830  case 1:
831 #if JS_VERSION < 185
832  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(_val);
833 #else
834  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(_val);
835 #endif
836  break;
837  case 2:
838 #if JS_VERSION < 185
839  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(_val);
840 #else
841  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(_val);
842 #endif
843  break;
844  case 3:
845 #if JS_VERSION < 185
846  (ptr->v).c[3] = (float) *JSVAL_TO_DOUBLE(_val);
847 #else
848  (ptr->v).c[3] = (float) JSVAL_TO_DOUBLE(_val);
849 #endif
850  break;
851 
852  }
853  }
854  return JS_TRUE;
855 }
856 
857 JSBool
858 #if JS_VERSION < 185
859 SFImageToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
860 #else
861 SFImageToString(JSContext *cx, uintN argc, jsval *vp) {
862  JSObject *obj = JS_THIS_OBJECT(cx,vp);
863  jsval *argv = JS_ARGV(cx,vp);
864  jsval rval;
865  JSBool retval;
866 #endif
867 
868  #ifdef JSVRMLCLASSESVERBOSE
869  printf("SFImageToString: obj = %p, %u args\n", obj, argc);
870  #endif
871 
872  UNUSED(argc);
873  UNUSED(argv);
874 
875 #if JS_VERSION < 185
876  return doMFToString(cx, obj, "SFImage", rval);
877 #else
878  retval = doMFToString(cx, obj, "SFImage", &rval);
879  JS_SET_RVAL(cx,vp,rval);
880  return retval;
881 #endif
882 }
883 
884 JSBool
885 #if JS_VERSION < 185
886 SFImageAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
887 #else
888 SFImageAssign(JSContext *cx, uintN argc, jsval *vp) {
889  JSObject *obj = JS_THIS_OBJECT(cx,vp);
890  jsval *argv = JS_ARGV(cx,vp);
891  jsval rval;
892  JSBool retval;
893 #endif
894 
895  #ifdef JSVRMLCLASSESVERBOSE
896  printf("SFImageAssign: obj = %p, %u args\n", obj, argc);
897  #endif
898 
899 #if JS_VERSION < 185
900  return _standardMFAssign (cx, obj, argc, argv, rval, &SFImageClass,FIELDTYPE_SFImage);
901 #else
902  retval = _standardMFAssign (cx, obj, argc, argv, &rval, &SFImageClass,FIELDTYPE_SFImage);
903  JS_SET_RVAL(cx,vp,rval);
904  return retval;
905 #endif
906 }
907 
908 JSBool
909 #if JS_VERSION < 185
910 SFImageConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
911 #else
912 SFImageConstr(JSContext *cx, uintN argc, jsval *vp) {
913  JSObject *obj = JS_NewObject(cx,&SFImageClass,NULL,NULL);
914  jsval *argv = JS_ARGV(cx,vp);
915 #endif
916  unsigned int i;
917  jsval mv;
918  int param[3];
919  int expectedSize;
920  SFImageNative *ptr;
921 
922 
923 
924  ADD_ROOT(cx,obj)
925 
926  #ifdef JSVRMLCLASSESVERBOSE
927  printf("SFImageConstr: obj = %p, %u args\n", obj, argc);
928  #endif
929 
930  /* SFImage really only has the valueChanged flag. */
931  if ((ptr = (SFImageNative *) SFImageNativeNew()) == NULL) {
932  printf( "SFImageNativeNew failed in SFImageConstr.\n");
933  return JS_FALSE;
934  }
935 
936  if (!JS_SetPrivate(cx, obj, ptr)) {
937  printf( "JS_SetPrivate failed in SFImageConstr.\n");
938  return JS_FALSE;
939  }
940 
941  ptr->valueChanged = 1;
942 
943  /* make this so that one can get the ".x", ".y", ".comp" and ".array" */
944  //if (!JS_DefineProperties(cx, obj, SFImageProperties)) {
945  // printf( "JS_DefineProperties failed in SFImageConstr.\n");
946  // return JS_FALSE;
947  //}
948 
949  /* null image. Make this [0, 0, 0] NOTE - there are only 3 elements now! */
950  if (!argc) {
951  /* expect arguments to be number, number, number, mfint32 */
952  mv = INT_TO_JSVAL(0);
953  for (i=0; i<4; i++) {
954  if (i==3) {
955 #if JS_VERSION < 185
956  MFInt32Constr(cx, obj, 0, NULL, &mv);
957 #else
958  /* note - old default constructor call allocates a new obj and assigns to mv,
959  * but calling fn directly may not actually do that. It seems illegal to call
960  * the constructor of another object directly on this object, and then feed it
961  * as a proprety of itself, but since that's what the old code did (and it seems
962  * to work), am keeping it as-is.
963  *
964  * I would -expect- that 'JS_NewObject(cx,&MFInt32Class,NULL,NULL)' should be
965  * used instead of 'obj' below.... */
966  MFInt32ConstrInternals(cx, obj, 0, NULL, &mv);
967 #endif
968  }
969  if (!JS_DefineElement(cx, obj, (jsint) i, mv, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB6, JSPROP_ENUMERATE)) {
970  printf( "JS_DefineElement failed for arg %d in SFImageConstr.\n", i);
971  return JS_FALSE;
972  }
973  }
974  DEFINE_LENGTH(cx,obj,4)
975 #if JS_VERSION >= 185
976  /* returning with success here, so must set rval to return the object we just finished creating */
977  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
978 #endif
979  return JS_TRUE;
980  }
981 
982  /* ok, ok. There are some parameters here. There had better be 4, or else... */
983  if ((argc != 4) && (argc != 3)) {
984  printf ("SFImageConstr, expect 4 parameters, got %d\n",argc);
985  return JS_FALSE;
986  }
987 
988 
989  DEFINE_LENGTH(cx,obj,argc)
990 
991  /* expect arguments to be number, number, number, mfint32 */
992  for (i=0; i<3; i++) {
993  /* printf ("looking at parameter %d\n",i); */
994  if (JSVAL_IS_INT(argv[i])) {
995  /* printf ("parameter is a number\n"); */
996  param[i] = JSVAL_TO_INT(argv[i]);
997  /* printf ("param is %d\n",param[i]); */
998  } else {
999  printf ("SFImageConstr: parameter %d is not a number\n",i);
1000  return JS_FALSE;
1001  }
1002  }
1003  /* now look at the MFInt32 array, and tack it on here */
1004  expectedSize = param[0] * param[1];
1005 
1006 
1007  /* the third number should be in the range of 0-4 inclusive (number of components in image) */
1008  if ((param[2]<0) || (param[2]>4)) {
1009 
1010  printf ("SFImageConstr: with size > 0, comp must be between 1 and 4 inclusive, got %d\n",param[2]);
1011  return JS_FALSE;
1012  }
1013 
1014  /* case 1 of null initializer */
1015  if ((expectedSize == 0) && (param[2] != 0)) {
1016  printf ("SFImageConstr: with x and y equal to zero, comp must be zero\n");
1017  return JS_FALSE;
1018  }
1019  /* case 2 of null initializer */
1020  if ((expectedSize != 0) && (param[2] == 0)) {
1021  printf ("SFImageConstr: with x and y not zero, comp must be non-zero\n");
1022  return JS_FALSE;
1023  }
1024 
1025  /* worry about the MFInt32 array. Note that we copy the object pointer here. Should
1026  we copy ALL of the elements, or just the object itself?? */
1027 
1028  if (argc == 4) {
1029  #ifdef JSVRMLCLASSESVERBOSE
1030  printJSNodeType(cx,JSVAL_TO_OBJECT(argv[3]));
1031  #endif
1032 
1033  CHECK_CLASS(cx,JSVAL_TO_OBJECT(argv[3]),NULL,__FUNCTION__,MFInt32Class)
1034  if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(argv[3]), MF_LENGTH_FIELD, &mv)) {
1035  printf( "JS_GetProperty failed for MFInt32 length in SFImageConstr\n");
1036  return JS_FALSE;
1037  }
1038  if (expectedSize != JSVAL_TO_INT(mv)) {
1039  printf ("SFImageConstr: expected %d elements in image data, got %d\n",expectedSize, JSVAL_TO_INT(mv));
1040  return JS_FALSE;
1041  }
1042  }
1043 
1044  /* parameters are ok - just save them now in the new object. */
1045  for (i=0; i<argc; i++) {
1046  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB6, JSPROP_ENUMERATE)) {
1047  printf( "JS_DefineElement failed for arg %d in SFImageConstr.\n", i);
1048  return JS_FALSE;
1049  }
1050  }
1051 
1052  /* if we are here, we must have had some success... */
1053 #if JS_VERSION < 185
1054  *rval = OBJECT_TO_JSVAL(obj);
1055 #else
1056  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
1057 #endif
1058  return JS_TRUE;
1059 }
1060 
1061 JSBool
1062 SFImageAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1063  return doMFAddProperty(cx, obj, id, vp, "SFImage"); //FIXME: is this ok ??? "SFImageAddProperty");
1064 }
1065 
1066 JSBool
1067 SFImageGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1068  return _standardMFGetProperty(cx, obj, id, vp, "_FreeWRL_Internal = 0", FIELDTYPE_SFImage); //FIXME: is this ok ??? "SFImage");
1069 }
1070 
1071 JSBool
1072 #if JS_VERSION < 185
1073 SFImageSetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1074 #else
1075 SFImageSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
1076 #endif
1077  return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_SFImage);
1078 }
1079 
1080 /**********************************************************************************/
1081 
1082 
1083 /* returns a string rep of the pointer to the node in memory */
1084 JSBool
1085 #if JS_VERSION < 185
1086 SFNodeToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1087 #else
1088 SFNodeToString(JSContext *cx, uintN argc, jsval *vp) {
1089  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1090  jsval *argv = JS_ARGV(cx,vp);
1091  jsval rvalinst;
1092  jsval *rval = &rvalinst;
1093 #endif
1094  SFNodeNative *ptr;
1095 
1096  UNUSED(argc);
1097  UNUSED(argv);
1098  #ifdef JSVRMLCLASSESVERBOSE
1099  printf ("SFNODETOSTRING\n");
1100  #endif
1101  if ((ptr = (SFNodeNative *)JS_GetPrivate(cx, obj)) == NULL) {
1102  printf( "JS_GetPrivate failed in SFNodeToString.\n");
1103  return JS_FALSE;
1104  }
1105 
1106  /* get the string from creation, and return it. */
1107 
1108  /* used to do:
1109  *rval = INT_TO_JSVAL(ptr->handle);
1110 
1111  but we have 64 bit pointers in OSX now, and ints are 32 bits. so...
1112  we convert to a double, and hope that it is still correct (seems to be ok
1113  32 and 64 bits - tests/46.wrl will use this path, btw */
1114 
1115  {
1116  jsdouble nv;
1117  char tmpline[100];
1118  sprintf (tmpline,"%ld",(long int) ptr->handle);
1119  /* sprintf (tmpline,"%ld",ptr->handle); */
1120 
1121  /* printf ("pointer to long int :%s:\n",tmpline); */
1122 
1123  nv = strtod(tmpline,NULL);
1124  /* printf ("double is %lf\n",nv); */
1125 
1126  /* printf ("nv %lf, handle %lu and %p\n",nv,ptr->handle,ptr->handle); */
1127  if (!JS_NewNumberValue(cx, nv, rval)) {
1128  ConsoleMessage ("Conversion issue in SFNodeToString");
1129  }
1130  }
1131 
1132 
1133  #ifdef JSVRMLCLASSESVERBOSE
1134  printf ("SFNodeToString, handle %p ",ptr->handle);
1135  printf ("SFNodeToString, handle as unsignned %u ",(unsigned int)ptr->handle);
1136  if (ptr->handle != NULL) {
1137  printf (" (%s) ", stringNodeType (((struct X3D_Node *)ptr->handle)->_nodeType));
1138  }
1139  printf ("string \"%s\"\n",ptr->X3DString);
1140  #endif
1141 
1142 #if JS_VERSION >= 185
1143  JS_SET_RVAL(cx,vp,*rval);
1144 #endif
1145  return JS_TRUE;
1146 }
1147 
1148 JSBool
1149 #if JS_VERSION < 185
1150 SFNodeAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1151 #else
1152 SFNodeAssign(JSContext *cx, uintN argc, jsval *vp) {
1153  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1154  jsval *argv = JS_ARGV(cx,vp);
1155  JSString *_id_jsstr;
1156 #endif
1157 
1158  JSObject *_from_obj;
1159  SFNodeNative *fptr, *ptr;
1160  char *_id_str;
1161 
1162  UNUSED(_id_str); // compiler warning mitigation
1163 
1164 
1165  /* unsigned int toptr; */
1166  #ifdef JSVRMLCLASSESVERBOSE
1167  printf ("start of SFNodeAssign argc %d\n",argc);
1168  #endif
1169 
1170  /* are we saving to a SFNode? */
1171  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFNodeClass)
1172 
1173  /* get the pointer to the internal stuff */
1174  if ((ptr = (SFNodeNative *)JS_GetPrivate(cx, obj)) == NULL) {
1175  printf( "JS_GetPrivate failed for obj in SFNodeAssign.\n");
1176  return JS_FALSE;
1177  }
1178 
1179  /* get the from, and the string */
1180  #ifdef JSVRMLCLASSESVERBOSE
1181  printf ("SFNodeAssign, we have %d and %d\n",(int)argv[0], (int)argv[1]);
1182  #endif
1183 
1184 #if JS_VERSION < 185
1185  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
1186 #else
1187  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
1188  _id_str = JS_EncodeString(cx,_id_jsstr);
1189  } else {
1190 #endif
1191  printf( "JS_ConvertArguments failed in SFNodeAssign.\n");
1192  return JS_FALSE;
1193  }
1194  if (_from_obj != NULL) {
1195  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFNodeClass)
1196 
1197  if ((fptr = (SFNodeNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
1198  printf( "JS_GetPrivate failed for _from_obj in SFNodeAssign.\n");
1199  return JS_FALSE;
1200  }
1201  #ifdef JSVRMLCLASSESVERBOSE
1202  printf("SFNodeAssign: obj = %p, id = \"%s\", from = %p\n",
1203  obj, _id_str, _from_obj);
1204  #endif
1205  } else { fptr = NULL; }
1206 
1207  /* assign this internally */
1208  if (!SFNodeNativeAssign(ptr, fptr)) {
1209  printf( "SFNodeNativeAssign failed in SFNodeAssign.\n");
1210  return JS_FALSE;
1211  }
1212 
1213 #if JS_VERSION < 185
1214  *rval = OBJECT_TO_JSVAL(obj);
1215 #else
1216  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
1217 #endif
1218 
1219  #ifdef JSVRMLCLASSESVERBOSE
1220  printf ("end of SFNodeAssign\n");
1221  #endif
1222  return JS_TRUE;
1223 }
1224 
1225 /* define JSVRMLCLASSESVERBOSE */
1226 
1227 JSBool
1228 #if JS_VERSION < 185
1229 SFNodeConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1230 #else
1231 SFNodeConstr(JSContext *cx, uintN argc, jsval *vp) {
1232  JSObject *obj = JS_NewObject(cx,&SFNodeClass,NULL,NULL);
1233  jsval *argv = JS_ARGV(cx,vp);
1234 #endif
1235  /*
1236  X3D ecmascript specs:
1237  http://www.web3d.org/files/specifications/19777-1/V3.0/Part1/functions.html#SFNodeInstanceCreationFunction
1238  "7.6.5.2 Instance creation function
1239  This object cannot be directly instantiated"
1240  That means there should never be myNode = new SFNode(); or SFNode('string') or SFNode('0x12345');
1241  X3DScene Browser.createX3DFromString(String x3dSyntax)
1242 
1243  VRML vrmlscript specs:
1244  http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/javascript.html#SFNode
1245  sfNodeObjectName = new SFNode(String vrmlstring);
1246  MFNode Browser.createVrmlFromString( String vrmlSyntax )
1247 
1248  The support below is for VRML specs SFNode(vrmlstring),
1249  plus 2 freewrl-specific techniques:
1250  sfn = new SFNode(oldSFNode)
1251  sfn = new SFNode('0x12345'); //ptr to another node
1252 
1253  - a char* ptr->X3Dstring holding vrmlstring from a previous new SFNode(string)
1254  is dragged around with an SFNode, and when new SFNode(old) it resends the
1255  string to the parser to create the new node.
1256  - this should fail when oldnode wasn't created with new SFNode(vrmlstring).
1257  (a future broto version would/could possibly deep copy the binary oldnode,
1258  elliminating the need for saving/holding the X3DString, and allowing it to
1259  work even when the oldNode wasn't created with a new SFNode(vrmlstring) constructor call)
1260 
1261  */
1262  SFNodeNative *newPtr;
1263  SFNodeNative *oldPtr;
1264 
1265  struct X3D_Node *newHandle;
1266  JSString *myStr;
1267  char *cString;
1268 
1269  /* unused struct X3D_Group *myGroup; */
1270 
1271  ADD_ROOT(cx,obj)
1272  newHandle = NULL;
1273  cString = NULL;
1274 
1275  #ifdef JSVRMLCLASSESVERBOSE
1276  printf ("Start of SFNodeConstr argc %d object %p\n",argc,obj);
1277  #endif
1278 
1279  /* verify the argc */
1280  if (argc == 0) {
1281  newHandle = NULL;
1282  cString = STRDUP("SFNodeConstr from argc eq 0");
1283  } else if (argc == 1) {
1284  /* is this a string, or a number indicating a node? */
1285  myStr = JS_ValueToString(cx, argv[0]);
1286 #if JS_VERSION < 185
1287  cString = JS_GetStringBytes(myStr);
1288 #else
1289  cString = JS_EncodeString(cx,myStr);
1290 #endif
1291  #ifdef JSVRMLCLASSESVERBOSE
1292  printf ("SFNodeConstr, argc =1l string %s\n",cString);
1293  #endif
1294 
1295  /* this is either a memory pointer, or it is actual X3D text, or it is junk */
1296  if (JSVAL_IS_OBJECT(argv[0])) {
1297  /* myNode2 = new SFNode(myNode1); not in specs*/
1298  #ifdef JSVRMLCLASSESVERBOSE
1299  printf ("SFNodeConstr, cstring was an object\n");
1300  #endif
1301 
1302  if ((oldPtr = (SFNodeNative *)JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[0]))) == NULL) {
1303  #ifdef JSVRMLCLASSESVERBOSE
1304  printf( "JS_GetPrivate failed in SFNodeConstr.\n");
1305  #endif
1306  return JS_FALSE;
1307  }
1308 
1309  newHandle = oldPtr->handle;
1310  cString = STRDUP(oldPtr->X3DString);
1311 
1312  } else {
1313  #ifdef JSVRMLCLASSESVERBOSE
1314  printf ("SFNodeConstr, cstring was NOT an object\n");
1315  #endif
1316 
1317  /* check if the first character is numeric, if it is then assume a pointer */
1318  if (!((cString[0] >= 'A' && cString [0] <= 'Z')||(cString[0] >= 'a' && cString [0] <= 'z'))) {
1319  /* lets hope this is an initializer, like "new SFNode("0x100675790") */
1320  if (sscanf (cString,"%p",&newHandle) != 1) {
1321  ConsoleMessage ("expected pointer for Javascript SFNode constr, got :%s:",cString);
1322  newHandle = NULL;
1323  #ifdef JSVRMLCLASSESVERBOSE
1324  printf ("SFNodeConstr, expected pointer for Javascript SFNode constr, got :%s:\n",cString);
1325  } else {
1326  printf ("SFNodeConstr, got pointer for Javascript SFNode constr, :%p:\n",newHandle);
1327  #endif
1328  }
1329  } else {
1330  /* cannot be an initializer, must parse the string */
1331  /* myNode = new SFNode('Group{...}'); */
1332  /* try compiling this X3D code... */
1333  struct X3D_Group *myGroup = (struct X3D_Group *) createNewX3DNode(NODE_Group);
1334  resource_item_t *res = resource_create_from_string(cString);
1335  res->whereToPlaceData = myGroup;
1336  res->ectx = myGroup;
1337  res->media_type = resm_vrml;
1338  res->parsed_request = "From the EAI bootcamp of life ";
1339  res->offsetFromWhereToPlaceData = (int) offsetof (struct X3D_Group, children);
1340  #ifdef JSVRMLCLASSESVERBOSE
1341  printf ("SFNodeConstr, sending resource to parser\n");
1342  #endif
1343  //send_resource_to_parser(res);
1344  #ifdef JSVRMLCLASSESVERBOSE
1345  printf ("SFNodeConstr, waiting on resource\n");
1346  #endif
1347  //resource_wait(res);
1348 
1349  #ifdef JSVRMLCLASSESVERBOSE
1350  printf ("SFNodeConstr we have created %d nodes\n",myGroup->children.n);
1351  #endif
1352 
1353  /* we MUST create 1 node here; if not, there is an error */
1354  //if ((myGroup->children.n) != 1) {
1355  // ConsoleMessage ("SFNativeNew - created %d nodes, expected 1 only\n",myGroup->children.n);
1356  // return JS_FALSE;
1357  //}
1358  parser_process_res_VRML_X3D(res);
1359  newHandle = X3D_NODE(myGroup->children.p[0]);
1360  }
1361 
1362  cString = STRDUP("node created in SFNodeConstr");
1363  }
1364 
1365  } else if (argc == 2) {
1366  /* eg, createVrmlFromString will send a bunch of SFNodes to a MFNode with text */
1367 
1368  #ifdef JSVRMLCLASSESVERBOSE
1369  printf ("SFNodeConstr - have 2 arguments\n");
1370  #endif
1371 
1372  if ((JSVAL_IS_STRING(argv[0])) && (JSVAL_IS_STRING(argv[1]))) {
1373  JSString *_idStr;
1374  char *_id_c;
1375 
1376  _idStr = JS_ValueToString(cx, argv[0]);
1377 #if JS_VERSION < 185
1378  _id_c = JS_GetStringBytes(_idStr);
1379 #else
1380  _id_c = JS_EncodeString(cx,_idStr);
1381 #endif
1382  /* printf ("first string :%s:\n",_id_c); */
1383 
1384  cString = STRDUP(_id_c);
1385 
1386  _idStr = JS_ValueToString(cx, argv[1]);
1387 #if JS_VERSION < 185
1388  _id_c = JS_GetStringBytes(_idStr);
1389 #else
1390  _id_c = JS_EncodeString(cx,_idStr);
1391 #endif
1392  /* printf ("second string :%s:\n",_id_c); */
1393 
1394  if (sscanf (_id_c,"%p",&newHandle) != 1) {
1395  printf ("SFNodeConstr - can not get handle from %s\n",_id_c);
1396  return JS_FALSE;
1397  }
1398 /* nope, need to do this as a pointer string.. newHandle = (struct X3D_Node *) JSVAL_TO_GCTHING(argv[1]); */
1399 
1400  #ifdef JSVRMLCLASSESVERBOSE
1401  printf ("string is :%s: new handle is %p\n",cString,newHandle);
1402  #endif
1403 
1404  } else {
1405  printf ("SFNodeConstr - 2 args, expected 2 strings\n");
1406  return JS_FALSE;
1407  }
1408 
1409 
1410  } else {
1411  printf( "SFNodeConstr requires at least 1 string arg.\n");
1412  return JS_FALSE;
1413  }
1414 
1415 
1416  /* ok, so far so good... */
1417  if ((newPtr = (SFNodeNative *) SFNodeNativeNew()) == NULL) {
1418  printf( "SFNodeNativeNew failed in SFNodeConstr.\n");
1419  return JS_FALSE;
1420  }
1421 
1422  //if (!JS_DefineProperties(cx, obj, SFNodeProperties)) {
1423  // printf( "JS_DefineProperties failed in SFNodeConstr.\n");
1424  // return JS_FALSE;
1425  //}
1426 
1427  if (!JS_SetPrivate(cx, obj, newPtr)) {
1428  printf( "JS_SetPrivate failed in SFNodeConstr.\n");
1429  return JS_FALSE;
1430  }
1431 
1432  newPtr->handle = newHandle;
1433  newPtr->X3DString = (char *)STRDUP(cString);
1434 
1435  if (!JS_DefineSFNodeSpecificProperties (cx, obj, newHandle)) {
1436  printf( "JS_DefineSFNodeSpecificProperties failed in SFNodeConstr.\n");
1437  return JS_FALSE;
1438 
1439  }
1440 
1441  newPtr->valueChanged = 1;
1442 
1443 
1444  #ifdef JSVRMLCLASSESVERBOSE
1445  {
1446  if (newHandle == NULL)
1447  printf("end of SFNodeConstr: created obj = %p, argc: %u mem ptr: %p (null pointer) text string: %s\n",
1448  obj, argc, newHandle, cString);
1449  else
1450  printf("end of SFNodeConstr: created obj = %p, argc: %u mem ptr: %p (%s) text string: %s\n",
1451  obj, argc, newHandle, stringNodeType(newHandle->_nodeType),cString);
1452  }
1453  #endif
1454 
1455 #if JS_VERSION < 185
1456  *rval = OBJECT_TO_JSVAL(obj);
1457 #else
1458  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
1459 #endif
1460 
1461  return JS_TRUE;
1462 }
1463 
1464 /* undef JSVRMLCLASSESVERBOSE */
1465 
1466 void
1467 SFNodeFinalize(JSContext *cx, JSObject *obj)
1468 {
1469  SFNodeNative *ptr;
1470 
1471  #ifdef JSVRMLCLASSESVERBOSE
1472  printf("SFNodeFinalize: obj = %p\n", obj);
1473  #endif
1474 
1475  REMOVE_ROOT(cx,obj)
1476 
1477  /*so, it appears that recent (2010) versions ofJavascript will give the following error when
1478  the interpreter is shutdown. It appears that sending in the url will cause a SFNode to
1479  be created, even though the normal constructor is not called, eg:
1480 
1481  DEF t Script {
1482  url "vrmlscript:
1483  function eventsProcessed () {}
1484  "
1485  }
1486 
1487  will cause the following JS_GetPrivate to fail. */
1488 
1489 
1490  if ((ptr = (SFNodeNative *)JS_GetPrivate(cx, obj)) == NULL) {
1491  /* see above printf( "JS_GetPrivate failed in SFNodeFinalize.\n"); */
1492  return;
1493  } else {
1494  FREE_IF_NZ (ptr->X3DString);
1495  FREE_IF_NZ (ptr);
1496  }
1497 }
1498 JSBool
1499 #if JS_VERSION < 185
1500 SFNodeGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1501 #else
1502 SFNodeGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
1503 #endif
1504 {
1505 
1506  /* We can't really get a property of a SFNode. There are no sub-indexes, etc...
1507  so we don't do anything. Check out SFVec3fGetProperty to see how it handles
1508  properties, should we need to have properties in the future. */
1509 
1510  SFNodeNative *ptr;
1511  JSString *_idStr;
1512  char *_id_c;
1513  jsval rval;
1514 #if JS_VERSION >= 185
1515  jsval id;
1516  if (!JS_IdToValue(cx,iid,&id)) {
1517  printf("JS_IdToValue failed in SFNodeGetProperty.\n");
1518  return JS_FALSE;
1519  }
1520 #endif
1521  if (JSVAL_IS_INT(id)) {
1522  printf("SFNode has no [index] property.\n");
1523  /* would be nice to say node type or node name */
1524  /* note the setter does seem to take [0 or 1] */
1525  return JS_FALSE;
1526  }
1527 
1528  _idStr = JS_ValueToString(cx, id);
1529 #if JS_VERSION < 185
1530  _id_c = JS_GetStringBytes(_idStr);
1531 #else
1532  _id_c = JS_EncodeString(cx,_idStr);
1533 #endif
1534  #ifdef JSVRMLCLASSESVERBOSE
1535  printf ("start of SFNodeGetProperty... id is %s\n",_id_c);
1536  #endif
1537 
1538  /* is this the string "undefined" ? */
1539  if (strcmp ("undefined",_id_c) == 0) return JS_TRUE;
1540 
1541  /* is this one of the SFNode standard functions? see JSFunctionSpec (SFNodeFunctions)[] */
1542  if (strcmp ("toString",_id_c) == 0) return JS_TRUE;
1543  if (strcmp ("assign",_id_c) == 0) return JS_TRUE;
1544 
1545  /* get the private pointer for this node */
1546  if ((ptr = (SFNodeNative *)JS_GetPrivate(cx, obj)) != NULL) {
1547  #ifdef JSVRMLCLASSESVERBOSE
1548  printf ("SFNodeGetProperty, working on node %p, field %s\n",ptr->handle,_id_c);
1549  #endif
1550 
1551  /* dug9 attempt to find read the field of another script */
1552  //if(!strcmp(stringNodeType(ptr->handle->_nodeType),"Script"))
1553  if( ptr->handle && ptr->handle->_nodeType== NODE_Script )
1554  {
1555  struct Shader_Script *myObj;
1556  JSContext *cx2;
1557  JSObject *obj2;
1558  struct CRscriptStruct *ScriptControl; // = getScriptControl();
1559  myObj = X3D_SCRIPT(ptr->handle)->__scriptObj;
1560  /* get context and global object for this script */
1561  ScriptControl = getScriptControlIndex(myObj->num);
1562  cx2 = (JSContext*)ScriptControl->cx;
1563  obj2 = (JSObject*)ScriptControl->glob;
1564  if (JS_GetProperty (cx2, obj2, _id_c, &rval)) {
1565  if (JSVAL_IS_NULL(rval)) {
1566  ConsoleMessage ("Script - field :%s: does not exist",_id_c);
1567  return JS_FALSE;
1568  }else{
1569  *vp = rval;
1570  return JS_TRUE;
1571  }
1572  }
1573  }
1574 
1575  JS_DefineSFNodeSpecificProperties (cx, obj, ptr->handle);
1576 
1577  /* does the property exist? */
1578  if (JS_LookupProperty (cx, obj, _id_c, &rval)) {
1579  if (JSVAL_IS_NULL(rval)) {
1580  /* if you mis-spell a builtin node field */
1581  /* like Cylinder.hight (sb height) you'll end up in here */
1582  ConsoleMessage ("SFNode - field :%s: does not exist",_id_c);
1583  return JS_FALSE;
1584  }
1585  }
1586  /* if your SFNode is type Script you'll end up here */
1587  #ifdef JSVRMLCLASSESVERBOSE
1588  printf ("wondering about rval.. %d. it is a\n",(int)rval);
1589  if (JSVAL_IS_INT(rval)) printf ("IS AN INT\n");
1590  if (JSVAL_IS_OBJECT(rval)) printf ("IS AN OBJECT\n");
1591  if (JSVAL_IS_STRING(rval)) printf ("IS AN STRING\n");
1592  if (rval == JSVAL_FALSE) printf ("FALSE\n");
1593  if (rval == JSVAL_NULL) printf ("NULL\n");
1594  if (rval == JSVAL_ONE) printf ("ONE\n");
1595  if (rval == JSVAL_ZERO) printf ("ZERO\n");
1596  if (rval == JSVAL_VOID) printf ("VOID\n");
1597  if (rval == JSVAL_TRUE) printf ("TRUE\n");
1598  #endif
1599 
1600 
1601  /*dug9 - I find the next line JS_GetProperty recursive*/
1602  /*when the sfnode we're trying to read is a Script node*/
1603  //if (JS_GetProperty (cx, obj, _id_c, &rval)) {
1604  if(false){
1605  #ifdef JSVRMLCLASSESVERBOSE
1606  printf ("SFNodeGetProperty, found field \"%s\" in node, returning property\n",_id_c);
1607  #endif
1608 
1609  *vp = rval;
1610  } else {
1611  #ifdef JSVRMLCLASSESVERBOSE
1612  printf ("SFNodeGetProperty, did not find field \"%s\" in node.\n",_id_c);
1613  #endif
1614  return JS_FALSE;
1615  }
1616  } else {
1617  printf ("could not get private for SFNodeGetProperty, field :%s:\n",_id_c);
1618  return JS_FALSE;
1619  }
1620 
1621  return JS_TRUE;
1622 }
1623 
1624 void Parser_scanStringValueToMem_B(union anyVrml* any, indexT ctype, const char *value, int isXML);
1625 
1626 JSBool
1627 #if JS_VERSION < 185
1628 SFNodeSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1629 #else
1630 SFNodeSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
1631 #endif
1632 {
1633  JSString *_idStr, *_valStr;
1634  char *_id_c, *_val_c;
1635  SFNodeNative *ptr;
1636  size_t val_len;
1637  size_t tmp;
1638 #if JS_VERSION >= 185
1639  jsval id;
1640  if (!JS_IdToValue(cx,iid,&id)) {
1641  printf("JS_IdToValue failed in SFNodeSetProperty.\n");
1642  return JS_FALSE;
1643  }
1644 #endif
1645  //if (JSVAL_IS_INT(id)) {
1646  // printf("SFNode has no [index] property.\n");
1647  // /* would be nice to say node type or node name */
1648  // return JS_FALSE;
1649  //}
1650 
1651  _idStr = JS_ValueToString(cx, id);
1652  _valStr = JS_ValueToString(cx, *vp);
1653 #if JS_VERSION < 185
1654  _id_c = JS_GetStringBytes(_idStr);
1655  _val_c = JS_GetStringBytes(_valStr);
1656 #else
1657  _id_c = JS_EncodeString(cx,_idStr); /* _id_c field name as a string ie "currX" */
1658  _val_c = JS_EncodeString(cx,_valStr); /* _val_c field value as a string ie "33" */
1659 #endif
1660 
1661 
1662  #ifdef JSVRMLCLASSESVERBOSE
1663  printf("SFNodeSetProperty: obj = %p, id = %s, vp = %s\n",
1664  obj, _id_c, _val_c);
1665  #endif
1666 
1667 
1668  if ((ptr = (SFNodeNative *)JS_GetPrivate(cx, obj)) == NULL) {
1669  printf( "JS_GetPrivate failed in SFNodeSetProperty.\n");
1670  return JS_FALSE;
1671  }
1672 
1673  if (JSVAL_IS_INT(id)) {
1674  /* dug9 Aug 2013: no Properties are defined on SFNode, so there shouldn't be
1675  any public SFNode[id] = ?. What are we doing here?
1676  Was it an experiment or test method? Or does some other internal
1677  function call this setter[id]? May we drop support for it?*/
1678  ptr->valueChanged++;
1679  val_len = (int) strlen(_val_c) + 1;
1680 
1681  #ifdef JSVRMLCLASSESVERBOSE
1682  printf ("switching on %d\n",JSVAL_TO_INT(id));
1683  #endif
1684 
1685  switch (JSVAL_TO_INT(id)) {
1686  case 0:
1687  if ((strlen(ptr->X3DString) + 1) > val_len) {
1688  ptr->X3DString =
1689  (char *) REALLOC (ptr->X3DString, val_len * sizeof(char));
1690  }
1691  memset(ptr->X3DString, 0, val_len);
1692  memmove(ptr->X3DString, _val_c, val_len);
1693  break;
1694  case 1:
1695  scanUnsignedIntoValue(_val_c,&tmp);
1696  ptr->handle = X3D_NODE(tmp);
1697  break;
1698  }
1699 
1700  } else {
1701  #ifdef JSVRMLCLASSESVERBOSE
1702  printf ("JS_IS_INT false\n");
1703 
1704  printf ("SFNodeSetProperty, setting node %p field %s to value %s\n", ptr->handle,_id_c,_val_c);
1705 
1706  {
1707  struct X3D_Node* ptx;
1708  ptx = X3D_NODE(ptr->handle);
1709  printf ("node is of type %s\n",stringNodeType(ptx->_nodeType));
1710  }
1711  #endif
1712 
1713  /* dug9 2012 attempt to find and write the field of another script */
1714  if( ptr->handle->_nodeType== NODE_Script )
1715  {
1716  /* code borrowed from fieldGet.c L.138 in set_one_ECMAtype() and reworked
1717  for cx2, obj2 - writes to a script eventIn with timestamp,
1718  and runs the script function, completing the event
1719  cascade (I think)
1720  */
1721  char scriptline[100];
1722  JSObject *eventInFunction;
1723  struct ScriptFieldDecl* myfield;
1724  struct CRjsnameStruct *JSparamnames; // = getJSparamnames();
1725  struct Shader_Script *myObj;
1726  JSContext *cx2;
1727  JSObject *obj2;
1728  jsval newval;
1729  //indexT myfieldType;
1730  //union anyVrml vrmlField;
1731  //bool deepcopy;
1732  struct CRscriptStruct *ScriptControl; // = getScriptControl();
1733  myObj = X3D_SCRIPT(ptr->handle)->__scriptObj;
1734  /* is the script ok and initialized? */
1735  ScriptControl = getScriptControlIndex(myObj->num);
1736  if ((!ScriptControl->_initialized) || (!ScriptControl->scriptOK)) {
1737  /* printf ("waiting for initializing script %d at %s:%d\n",(uintptr_t)to_ptr->routeToNode, __FILE__,__LINE__); */
1738  return JS_FALSE;;
1739  }
1740 
1741  /* get context and global object for this script */
1742  cx2 = (JSContext*)ScriptControl->cx;
1743  obj2 = (JSObject*)ScriptControl->glob;
1744  //it doesn't seem to matter which cx/obj we use.
1745  cx2 = cx;
1746  obj2 = obj;
1747 
1748  #if defined(JS_THREADSAFE)
1749  JS_BeginRequest(cx);
1750  #endif
1751  /* set the time for this script */
1752  //SET_JS_TICKTIME()
1753  {
1754  jsval zimbo;
1755  JS_NewNumberValue(cx2, TickTime(), &zimbo);
1756  if (!JS_DefineProperty(cx2,obj2, "__eventInTickTime", zimbo, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB2, JSPROP_PERMANENT)) {
1757  printf( "JS_DefineProperty failed for __eventInTickTime at %s:%d.\n",__FILE__,__LINE__);
1758  return JS_FALSE;
1759  }
1760  }
1761  //X3D_ECMA_TO_JS(cx, Data, datalen, dataType, &newval);
1762  //if( getSFNodeField(cx,obj, id, &newval) == JS_FALSE) //this is for getting fields from builtin node types, not Script nodes
1763  // return JS_FALSE;
1764  myfield = script_getField_viaCharName(myObj, _id_c);
1765 
1766  //Q. do I need to deepcopy the vp?
1767  // newval = deepcopy(vp);
1768  //a slight difference: pointer copy: bool=true, deep copy: bool=1
1769  //I'll stick with pointer copy
1770  /*
1771  deepcopy = false;
1772  if(deepcopy)
1773  {
1774  //step 1. get the target/output field's datatype
1775  myfieldType = myfield->fieldDecl->fieldType;
1776 
1777  //step 2. try and read the input *vp using that datatype
1778  // borrowed from jsUtils.c L.1247
1779  switch (myfieldType) {
1780  case FIELDTYPE_SFBool:
1781  case FIELDTYPE_SFFloat:
1782  case FIELDTYPE_SFTime:
1783  case FIELDTYPE_SFDouble:
1784  case FIELDTYPE_SFInt32:
1785  case FIELDTYPE_SFString:
1786  JS_ECMA_TO_X3D(cx2, &vrmlField, returnElementLength(myfieldType), myfieldType, vp);
1787  break;
1788  case FIELDTYPE_SFColor:
1789  case FIELDTYPE_SFNode:
1790  case FIELDTYPE_SFVec2f:
1791  case FIELDTYPE_SFVec3f:
1792  case FIELDTYPE_SFVec3d:
1793  case FIELDTYPE_SFRotation:
1794  JS_SF_TO_X3D(cx2,&vrmlField,returnElementLength(myfieldType) * returnElementRowSize(myfieldType) , myfieldType, vp);
1795  break;
1796  case FIELDTYPE_MFColor:
1797  case FIELDTYPE_MFVec3f:
1798  case FIELDTYPE_MFVec2f:
1799  case FIELDTYPE_MFFloat:
1800  case FIELDTYPE_MFTime:
1801  case FIELDTYPE_MFInt32:
1802  case FIELDTYPE_MFString:
1803  case FIELDTYPE_MFNode:
1804  case FIELDTYPE_MFRotation:
1805  case FIELDTYPE_SFImage:
1806  JS_MF_TO_X3D(cx2, obj2, &vrmlField, myfieldType, vp);
1807  break;
1808  default: printf ("unhandled type in setSFNodeField\n");
1809  return JS_FALSE;
1810  }
1811  //step 3. if successful, convert back to a second copy newval
1812  //int setField_FromEAI_ToScript(int tonode, int toname, int datatype, void *data, unsigned rowcount) {
1813  switch (myfieldType) {
1814  case FIELDTYPE_SFBool:
1815  case FIELDTYPE_SFFloat:
1816  case FIELDTYPE_SFTime:
1817  case FIELDTYPE_SFDouble:
1818  case FIELDTYPE_SFInt32:
1819  case FIELDTYPE_SFString:
1820  X3D_ECMA_TO_JS(cx2, &vrmlField, returnElementLength(myfieldType), myfieldType, &newval);
1821  break;
1822  case FIELDTYPE_SFColor:
1823  case FIELDTYPE_SFNode:
1824  case FIELDTYPE_SFVec2f:
1825  case FIELDTYPE_SFVec3f:
1826  case FIELDTYPE_SFVec3d:
1827  case FIELDTYPE_SFRotation:
1828  X3D_SF_TO_JS(cx2, obj2, &vrmlField, returnElementLength(myfieldType) * returnElementRowSize(myfieldType) , myfieldType, &newval);
1829  break;
1830  case FIELDTYPE_MFColor:
1831  case FIELDTYPE_MFVec3f:
1832  case FIELDTYPE_MFVec2f:
1833  case FIELDTYPE_MFFloat:
1834  case FIELDTYPE_MFTime:
1835  case FIELDTYPE_MFInt32:
1836  case FIELDTYPE_MFString:
1837  case FIELDTYPE_MFNode:
1838  case FIELDTYPE_MFRotation:
1839  case FIELDTYPE_SFImage:
1840  X3D_MF_TO_JS(cx2, obj2, &vrmlField, myfieldType, &newval, _id_c);
1841  break;
1842  default: printf ("unhandled type FIELDTYPE_ %d in getSFNodeField\n", myfieldType) ;
1843  return JS_FALSE;
1844  }
1845  }else{ //deepcopy
1846  */
1847  newval = *vp;
1848  //}
1849  /* get the variable name to hold the incoming value */
1850  sprintf (scriptline,"__eventIn_Value_%s", _id_c);
1851  #ifdef JSVRMLCLASSESVERBOSE
1852  printf ("set_one_ECMAtype, calling JS_DefineProperty on name %s obj %u, setting setECMANative, 0 \n",scriptline,obj2);
1853  #endif
1854 
1855  if (!JS_DefineProperty(cx2,obj2, scriptline, newval, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_PERMANENT)) {
1856  printf( "JS_DefineProperty failed for SFNodeSetProperty at %s:%d.\n",__FILE__,__LINE__);
1857  #if defined(JS_THREADSAFE)
1858  JS_EndRequest(cx);
1859  #endif
1860  return JS_FALSE;
1861  }
1862  /* is the function compiled yet? */
1863  //COMPILE_FUNCTION_IF_NEEDED(toname)
1864  JSparamnames = getJSparamnames();
1865  eventInFunction = JSparamnames[myfield->fieldDecl->JSparamNameIndex].eventInFunction;
1866  if ( eventInFunction == NULL) {
1867  sprintf (scriptline,"%s(__eventIn_Value_%s,__eventInTickTime)", _id_c, _id_c);
1868  /* printf ("compiling function %s\n",scriptline); */
1869  eventInFunction = JS_CompileScript(cx2, obj2, scriptline, strlen(scriptline), "compile eventIn",1);
1870  if(true){
1871  //if (!JS_AddObjectRoot(cx2,&eventInFunction)) {
1872  JSparamnames[myfield->fieldDecl->JSparamNameIndex].eventInFunction = eventInFunction;
1873  #if JS_VERSION >= 185
1874  if (!JS_AddObjectRoot(cx,(JSSCRIPT**)(&JSparamnames[myfield->fieldDecl->JSparamNameIndex].eventInFunction))) {
1875  printf( "JS_AddObjectRoot failed for compilation of script \"%s\" at %s:%d.\n",scriptline,__FILE__,__LINE__);
1876  return JS_FALSE;
1877  }
1878  #endif
1879  }
1880  }
1881  /* and run the function */
1882  //RUN_FUNCTION (toname)
1883  {
1884  jsval zimbo;
1885  if (!JS_ExecuteScript(cx2, obj2, eventInFunction, &zimbo))
1886  {
1887  printf ("failed to set parameter for eventIn %s in FreeWRL code %s:%d\n",_id_c,__FILE__,__LINE__); \
1888  /* printf ("myThread is %u\n",pthread_self());*/ \
1889  return JS_FALSE;
1890  }
1891  return JS_TRUE;
1892  }
1893  #if defined(JS_THREADSAFE)
1894  JS_EndRequest(cx);
1895  #endif
1896  }
1897  //dug9 July 9, 2014 - failed attempt to fix, see runQueuedDirectOutputs()
1898  // problem: 1) it's a lot of work to drill into the JS object for the other script to set the field value and valueChanged flag
1899  // 2) taking a shortcut in the routing loop would require refactoring: JSGlobal_object between get_valueChanged and js_setField_javascriptEventOut
1900  // would need to be generalized to do anyVrml or anyVrml passed directly up and down.
1901  if(0) if( ptr->handle->_nodeType== NODE_Script )
1902  {
1903  int itype, kind;
1904  //step 1. unconditionally write the script->field->value regardless of its kind/PKW
1905  struct ScriptFieldDecl* myfield;
1906  struct Shader_Script *script;
1907  struct CRscriptStruct *ScriptControl; // = getScriptControl();
1908  script = X3D_SCRIPT(ptr->handle)->__scriptObj;
1909  /* is the script ok and initialized? */
1910  ScriptControl = getScriptControlIndex(script->num);
1911  if ((!ScriptControl->_initialized) || (!ScriptControl->scriptOK)) {
1912  /* printf ("waiting for initializing script %d at %s:%d\n",(uintptr_t)to_ptr->routeToNode, __FILE__,__LINE__); */
1913  return JS_FALSE;;
1914  }
1915  myfield = script_getField_viaCharName(script, _id_c);
1916  if(!myfield) return JS_FALSE;
1917  itype = ScriptFieldDecl_getType(myfield);
1918  kind = ScriptFieldDecl_getMode(myfield);
1919  Parser_scanStringValueToMem_B(&myfield->value, itype, _val_c, FALSE);
1920  if(kind == PKW_inputOnly || kind == PKW_inputOutput)
1921  myfield->eventInSet = TRUE; //flag for runQueuedDirectOutputs() to run eventIn function on other script, feeding it the value we just set
1922  if(kind == PKW_inputOutput || kind == PKW_outputOnly)
1923  myfield->valueChanged = TRUE; //flag for eventOuts on other script to send what we are writing
1924  return JS_TRUE;
1925  }
1926 
1927  setField_fromJavascript (X3D_NODE(ptr->handle), _id_c, _val_c, FALSE);
1928  }
1929 
1930  return JS_TRUE;
1931 }
1932 
1933 
1934 /********************************************************************/
1935 
1936 JSBool
1937 #if JS_VERSION < 185
1938 SFRotationGetAxis(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1939 #else
1940 SFRotationGetAxis(JSContext *cx, uintN argc, jsval *vp) {
1941  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1942  jsval *argv = JS_ARGV(cx,vp);
1943 #endif
1944  JSObject *_retObj;
1945  SFRotationNative *_rot;
1946  SFVec3fNative *_retNative;
1947 
1948  UNUSED(argc);
1949  UNUSED(argv);
1950  #ifdef JSVRMLCLASSESVERBOSE
1951  printf ("start of SFRotationGetAxis\n");
1952  #endif
1953 
1954  if ((_retObj = JS_ConstructObject(cx, &SFVec3fClass, NULL, NULL)) == NULL) {
1955  printf( "JS_ConstructObject failed in SFRotationGetAxis.\n");
1956  return JS_FALSE;
1957  }
1958 
1959 #if JS_VERSION < 185
1960  *rval = OBJECT_TO_JSVAL(_retObj);
1961 #else
1962  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(_retObj));
1963 #endif
1964 
1965  if ((_rot = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
1966  printf( "JS_GetPrivate failed for obj in SFRotationGetAxis.\n");
1967  return JS_FALSE;
1968  }
1969 
1970  if ((_retNative = (SFVec3fNative *)JS_GetPrivate(cx, _retObj)) == NULL) {
1971  printf( "JS_GetPrivate failed for _retObj in SFRotationGetAxis.\n");
1972  return JS_FALSE;
1973  }
1974 
1975  (_retNative->v).c[0] = (_rot->v).c[0];
1976  (_retNative->v).c[1] = (_rot->v).c[1];
1977  (_retNative->v).c[2] = (_rot->v).c[2];
1978 
1979  #ifdef JSVRMLCLASSESVERBOSE
1980  printf("SFRotationGetAxis: obj = %p, result = [%.9g, %.9g, %.9g]\n",
1981  obj,
1982  (_retNative->v).c[0],
1983  (_retNative->v).c[1],
1984  (_retNative->v).c[2]);
1985  #endif
1986 
1987  return JS_TRUE;
1988 }
1989 
1990 JSBool
1991 #if JS_VERSION < 185
1992 SFRotationInverse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1993 #else
1994 SFRotationInverse(JSContext *cx, uintN argc, jsval *vp) {
1995  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1996  jsval *argv = JS_ARGV(cx,vp);
1997 #endif
1998  JSObject *_retObj, *_proto;
1999  SFRotationNative *_rot, *_retNative;
2000  Quaternion q1,qret;
2001  double a,b,c,d;
2002 
2003  UNUSED(argc);
2004  UNUSED(argv);
2005  #ifdef JSVRMLCLASSESVERBOSE
2006  printf ("start of SFRotationInverse\n");
2007  #endif
2008 
2009  if ((_proto = JS_GetPrototype(cx, obj)) == NULL) {
2010  printf( "JS_GetPrototype failed in SFRotationInverse.\n");
2011  return JS_FALSE;
2012  }
2013  if ((_retObj = JS_ConstructObject(cx, &SFRotationClass, _proto, NULL)) == NULL) {
2014  printf( "JS_ConstructObject failed in SFRotationInverse.\n");
2015  return JS_FALSE;
2016  }
2017 #if JS_VERSION < 185
2018  *rval = OBJECT_TO_JSVAL(_retObj);
2019 #else
2020  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(_retObj));
2021 #endif
2022 
2023  if ((_rot = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2024  printf( "JS_GetPrivate failed for obj in SFRotationInverse.\n");
2025  return JS_FALSE;
2026  }
2027 
2028  if ((_retNative = (SFRotationNative *)JS_GetPrivate(cx, _retObj)) == NULL) {
2029  printf( "JS_GetPrivate failed for _retObj in SFRotationInverse.\n");
2030  return JS_FALSE;
2031  }
2032 
2033  /* convert both rotation to quaternion */
2034  vrmlrot_to_quaternion(&q1, (double) _rot->v.c[0],
2035  (double) _rot->v.c[1], (double) _rot->v.c[2], (double) _rot->v.c[3]);
2036 
2037  /* invert it */
2038  quaternion_inverse(&qret,&q1);
2039 
2040 
2041  /* and return the resultant, as a vrml rotation */
2042  quaternion_to_vrmlrot(&qret, &a, &b, &c, &d);
2043  /* double to floats, can not use pointers... */
2044  _retNative->v.c[0] = (float) a;
2045  _retNative->v.c[1] = (float) b;
2046  _retNative->v.c[2] = (float) c;
2047  _retNative->v.c[3] = (float) d;
2048 
2049  /* and, we now have a new value */
2050  _retNative->valueChanged = 1;
2051 
2052  return JS_TRUE;
2053 }
2054 
2055 JSBool
2056 #if JS_VERSION < 185
2057 SFRotationMultiply(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2058 #else
2059 SFRotationMultiply(JSContext *cx, uintN argc, jsval *vp) {
2060  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2061  jsval *argv = JS_ARGV(cx,vp);
2062 #endif
2063  Quaternion q1,q2,qret;
2064  double a,b,c,d;
2065 
2066  JSObject *_multObj, *_proto, *_retObj;
2067  SFRotationNative *_rot1, *_rot2, *_retNative;
2068  #ifdef JSVRMLCLASSESVERBOSE
2069  printf ("start of SFRotationMultiply\n");
2070  #endif
2071 
2072  if (!JS_ConvertArguments(cx, argc, argv, "o", &_multObj)) {
2073  printf( "JS_ConvertArguments failed in SFRotationMultiply.\n");
2074  return JS_FALSE;
2075  }
2076  CHECK_CLASS(cx,_multObj,argv,__FUNCTION__,SFRotationClass)
2077 
2078  if ((_proto = JS_GetPrototype(cx, _multObj)) == NULL) {
2079  printf( "JS_GetPrototype failed in SFRotationMultiply.\n");
2080  return JS_FALSE;
2081  }
2082 
2083  if ((_retObj = JS_ConstructObject(cx, &SFRotationClass, _proto, NULL)) == NULL) {
2084  printf( "JS_ConstructObject failed in SFRotationMultiply.\n");
2085  return JS_FALSE;
2086  }
2087 
2088 
2089 #if JS_VERSION < 185
2090  *rval = OBJECT_TO_JSVAL(_retObj);
2091 #else
2092  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(_retObj));
2093 #endif
2094 
2095  if ((_rot1 = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2096  printf( "JS_GetPrivate failed for obj in SFRotationMultiply.\n");
2097  return JS_FALSE;
2098  }
2099 
2100  if ((_rot2 = (SFRotationNative *)JS_GetPrivate(cx, _multObj)) == NULL) {
2101  printf( "JS_GetPrivate failed for _multObj in SFRotationMultiply.\n");
2102  return JS_FALSE;
2103  }
2104 
2105  if ((_retNative = (SFRotationNative *)JS_GetPrivate(cx, _retObj)) == NULL) {
2106  printf( "JS_GetPrivate failed for _retObj in SFRotationMultiply.\n");
2107  return JS_FALSE;
2108  }
2109 
2110  /* convert both rotations into quaternions */
2111  vrmlrot_to_quaternion(&q1, (double) _rot1->v.c[0],
2112  (double) _rot1->v.c[1], (double) _rot1->v.c[2], (double) _rot1->v.c[3]);
2113  vrmlrot_to_quaternion(&q2, (double) _rot2->v.c[0],
2114  (double) _rot2->v.c[1], (double) _rot2->v.c[2], (double) _rot2->v.c[3]);
2115 
2116  /* multiply them */
2117  quaternion_multiply(&qret,&q1,&q2);
2118 
2119 
2120  /* and return the resultant, as a vrml rotation */
2121  quaternion_to_vrmlrot(&qret, &a, &b, &c, &d);
2122  /* double to floats, can not use pointers... */
2123  _retNative->v.c[0] = (float) a;
2124  _retNative->v.c[1] = (float) b;
2125  _retNative->v.c[2] = (float) c;
2126  _retNative->v.c[3] = (float) d;
2127 
2128  /* and, we now have a new value */
2129  _retNative->valueChanged = 1;
2130 
2131  return JS_TRUE;
2132 }
2133 
2134 JSBool
2135 #if JS_VERSION < 185
2136 SFRotationMultVec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2137 #else
2138 SFRotationMultVec(JSContext *cx, uintN argc, jsval *vp) {
2139  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2140  jsval *argv = JS_ARGV(cx,vp);
2141 #endif
2142  JSObject *_multObj, *_retObj, *_proto;
2143  SFRotationNative *_rot;
2144  SFVec3fNative *_vec, *_retNative;
2145  float rl;
2146  //float vl;
2147  //float rlpt;
2148  float s, c, angle;
2149  struct point_XYZ r, v, c1, c2;
2150 
2151  #ifdef JSVRMLCLASSESVERBOSE
2152  printf ("start of SFRotationMultiVec\n");
2153  #endif
2154 
2155  if (!JS_ConvertArguments(cx, argc, argv, "o", &_multObj)) {
2156  printf( "JS_ConvertArguments failed in SFRotationMultVec.\n");
2157  return JS_FALSE;
2158  }
2159 
2160  CHECK_CLASS(cx,_multObj,argv,__FUNCTION__,SFVec3fClass)
2161 
2162  if ((_proto = JS_GetPrototype(cx, _multObj)) == NULL) {
2163  printf( "JS_GetPrototype failed in SFRotationMultVec.\n");
2164  return JS_FALSE;
2165  }
2166 
2167  if ((_retObj = JS_ConstructObject(cx, &SFVec3fClass, _proto, NULL)) == NULL) {
2168  printf( "JS_ConstructObject failed in SFRotationMultVec.\n");
2169  return JS_FALSE;
2170  }
2171 
2172 #if JS_VERSION < 185
2173  *rval = OBJECT_TO_JSVAL(_retObj);
2174 #else
2175  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(_retObj));
2176 #endif
2177 
2178  if ((_rot = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2179  printf( "JS_GetPrivate failed for obj in SFRotationMultVec.\n");
2180  return JS_FALSE;
2181  }
2182  COPY_SFVEC3F_TO_POINT_XYZ(r,_rot->v.c);
2183  angle = _rot->v.c[3];
2184 
2185  if ((_vec = (SFVec3fNative *)JS_GetPrivate(cx, _multObj)) == NULL) {
2186  printf( "JS_GetPrivate failed for_multObjin SFRotationMultVec.\n");
2187  return JS_FALSE;
2188  }
2189  COPY_SFVEC3F_TO_POINT_XYZ(v,_vec->v.c);
2190  if ((_retNative = (SFVec3fNative *)JS_GetPrivate(cx, _retObj)) == NULL) {
2191  printf( "JS_GetPrivate failed for _retObj in SFRotationMultVec.\n");
2192  return JS_FALSE;
2193  }
2194 
2195  rl = veclength(r);
2196  //vl = veclength(v);
2197  // unused rlpt = (float) VECPT(r, v) / rl / vl;
2198  s = (float) sin(angle);
2199  c = (float) cos(angle);
2200  VECCP(r, v, c1);
2201  VECSCALE(c1, 1.0 / rl);
2202  VECCP(r, c1, c2);
2203  VECSCALE(c2, 1.0 / rl) ;
2204  _retNative->v.c[0] = (float) (v.x + s * c1.x + (1-c) * c2.x);
2205  _retNative->v.c[1] = (float) (v.y + s * c1.y + (1-c) * c2.y);
2206  _retNative->v.c[2] = (float) (v.z + s * c1.z + (1-c) * c2.z);
2207 
2208  return JS_TRUE;
2209 }
2210 
2211 JSBool
2212 #if JS_VERSION < 185
2213 SFRotationSetAxis(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2214 #else
2215 SFRotationSetAxis(JSContext *cx, uintN argc, jsval *vp) {
2216  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2217  jsval *argv = JS_ARGV(cx,vp);
2218 #endif
2219  JSObject *_setAxisObj;
2220  SFRotationNative *_rot;
2221  SFVec3fNative *_vec;
2222 
2223  #ifdef JSVRMLCLASSESVERBOSE
2224  printf ("start of SFRotationSetAxis\n");
2225  #endif
2226 
2227  if (!JS_ConvertArguments(cx, argc, argv, "o", &_setAxisObj)) {
2228  printf( "JS_ConvertArguments failed in SFRotationSetAxis.\n");
2229  return JS_FALSE;
2230  }
2231 
2232  CHECK_CLASS(cx,_setAxisObj,argv,__FUNCTION__,SFVec3fClass)
2233 
2234 
2235  if ((_rot = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2236  printf( "JS_GetPrivate failed for obj in SFRotationSetAxis.\n");
2237  return JS_FALSE;
2238  }
2239 
2240  if ((_vec = (SFVec3fNative *)JS_GetPrivate(cx, _setAxisObj)) == NULL) {
2241  printf( "JS_GetPrivate failed for _retObj in SFRotationSetAxis.\n");
2242  return JS_FALSE;
2243  }
2244 
2245  (_rot->v).c[0] = (_vec->v).c[0];
2246  (_rot->v).c[1] = (_vec->v).c[1];
2247  (_rot->v).c[2] = (_vec->v).c[2];
2248 
2249 #if JS_VERSION < 185
2250  *rval = OBJECT_TO_JSVAL(obj);
2251 #else
2252  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
2253 #endif
2254 
2255  #ifdef JSVRMLCLASSESVERBOSE
2256  printf("SFRotationSetAxis: obj = %p, result = [%.9g, %.9g, %.9g, %.9g]\n",
2257  obj,
2258  (_rot->v).c[0],
2259  (_rot->v).c[1],
2260  (_rot->v).c[2],
2261  (_rot->v).c[3]);
2262  #endif
2263 
2264  return JS_TRUE;
2265 }
2266 
2267 JSBool
2268 #if JS_VERSION < 185
2269 SFRotationSlerp(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2270 #else
2271 SFRotationSlerp(JSContext *cx, uintN argc, jsval *vp) {
2272  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2273  jsval *argv = JS_ARGV(cx,vp);
2274  jsval rvalinst;
2275  jsval *rval = &rvalinst;
2276 #endif
2277  JSObject *_destObj, *_retObj, *_proto;
2278  SFRotationNative *_rot, *_dest, *_ret;
2279  Quaternion _quat, _quat_dest, _quat_ret;
2280  jsdouble t;
2281 
2282  #ifdef JSVRMLCLASSESVERBOSE
2283  printf ("start of SFRotationSlerp\n");
2284  #endif
2285  if (!JS_ConvertArguments(cx, argc, argv, "o d", &_destObj, &t)) {
2286  printf( "JS_ConvertArguments failed in SFRotationSlerp.\n");
2287  return JS_FALSE;
2288  }
2289 
2290  CHECK_CLASS(cx,_destObj,argv,__FUNCTION__,SFRotationClass)
2291 
2292 
2293  /*
2294  * From Annex C, C.6.7.4:
2295  *
2296  * For t = 0, return object's rotation.
2297  * For t = 1, return 1st argument.
2298  * For 0 < t < 1, compute slerp.
2299  */
2300  if (APPROX(t, 0)) {
2301  *rval = OBJECT_TO_JSVAL(obj);
2302  } else if (APPROX(t, 1)) {
2303  *rval = OBJECT_TO_JSVAL(_destObj);
2304  } else {
2305  if ((_proto = JS_GetPrototype(cx, _destObj)) == NULL) {
2306  printf( "JS_GetPrototype failed in SFRotationSlerp.\n");
2307  return JS_FALSE;
2308  }
2309 
2310  if ((_retObj = JS_ConstructObject(cx, &SFRotationClass, _proto, NULL)) == NULL) {
2311  printf( "JS_ConstructObject failed in SFRotationSlerp.\n");
2312  return JS_FALSE;
2313  }
2314  /* root the object */
2315  *rval = OBJECT_TO_JSVAL(_retObj);
2316 
2317  if ((_rot = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2318  printf( "JS_GetPrivate failed for obj in SFRotationSlerp.\n");
2319  return JS_FALSE;
2320  }
2321 
2322  if ((_dest = (SFRotationNative *)JS_GetPrivate(cx, _destObj)) == NULL) {
2323  printf( "JS_GetPrivate failed for _destObj in SFRotationSlerp.\n");
2324  return JS_FALSE;
2325  }
2326 
2327  if ((_ret = (SFRotationNative *)JS_GetPrivate(cx, _retObj)) == NULL) {
2328  printf( "JS_GetPrivate failed for _retObj in SFRotationSlerp.\n");
2329  return JS_FALSE;
2330  }
2331 
2332  vrmlrot_to_quaternion(&_quat,
2333  (_rot->v).c[0],
2334  (_rot->v).c[1],
2335  (_rot->v).c[2],
2336  (_rot->v).c[3]);
2337 
2338  vrmlrot_to_quaternion(&_quat_dest,
2339  (_dest->v).c[0],
2340  (_dest->v).c[1],
2341  (_dest->v).c[2],
2342  (_dest->v).c[3]);
2343 
2344  quaternion_slerp(&_quat_ret, &_quat, &_quat_dest, t);
2345  quaternion_to_vrmlrot(&_quat_ret,
2346  (double *) &(_ret->v).c[0],
2347  (double *) &(_ret->v).c[1],
2348  (double *) &(_ret->v).c[2],
2349  (double *) &(_ret->v).c[3]);
2350  }
2351 
2352 #if JS_VERSION >= 185
2353  JS_SET_RVAL(cx,vp,*rval);
2354 #endif
2355  return JS_TRUE;
2356 }
2357 
2358 JSBool
2359 #if JS_VERSION < 185
2360 SFRotationToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2361 #else
2362 SFRotationToString(JSContext *cx, uintN argc, jsval *vp) {
2363  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2364  jsval *argv = JS_ARGV(cx,vp);
2365 #endif
2366  SFRotationNative *ptr;
2367  JSString *_str;
2368  char buff[STRING];
2369 
2370  UNUSED(argc);
2371  UNUSED(argv);
2372  #ifdef JSVRMLCLASSESVERBOSE
2373  printf ("start of SFRotationToString\n");
2374  #endif
2375 
2376  ADD_ROOT (cx,ptr)
2377  ADD_ROOT(cx,_str)
2378  if ((ptr = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2379  printf( "JS_GetPrivate failed in SFRotationToString.\n");
2380  return JS_FALSE;
2381  }
2382  memset(buff, 0, STRING);
2383  sprintf(buff, "%.9g %.9g %.9g %.9g",
2384  ptr->v.c[0], ptr->v.c[1], ptr->v.c[2], ptr->v.c[3]);
2385  _str = JS_NewStringCopyZ(cx, buff);
2386 
2387 #if JS_VERSION < 185
2388  *rval = STRING_TO_JSVAL(_str);
2389 #else
2390  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
2391 #endif
2392 
2393  REMOVE_ROOT (cx,ptr)
2394  REMOVE_ROOT (cx,_str)
2395  return JS_TRUE;
2396 }
2397 
2398 JSBool
2399 #if JS_VERSION < 185
2400 SFRotationAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2401 #else
2402 SFRotationAssign(JSContext *cx, uintN argc, jsval *vp) {
2403  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2404  jsval *argv = JS_ARGV(cx,vp);
2405  JSString *_id_jsstr;
2406 #endif
2407  JSObject *_from_obj;
2408  SFRotationNative *fptr, *ptr;
2409  char *_id_str;
2410 
2411  UNUSED(_id_str); // compiler warning mitigation
2412 
2413 
2414  #ifdef JSVRMLCLASSESVERBOSE
2415  printf ("start of SFRotationAssign\n");
2416  #endif
2417 
2418  if ((ptr = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2419  printf( "JS_GetPrivate failed for obj in SFRotationAssign.\n");
2420  return JS_FALSE;
2421  }
2422 
2423  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFRotationClass)
2424 
2425 #if JS_VERSION < 185
2426  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
2427 #else
2428  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
2429  _id_str = JS_EncodeString(cx,_id_jsstr);
2430  } else {
2431 #endif
2432  printf( "JS_ConvertArguments failed in SFRotationAssign.\n");
2433  return JS_FALSE;
2434  }
2435 
2436  /* is this an assignment of NULL? */
2437  if (_from_obj == NULL) {
2438  printf ("we have an assignment to null in SFRotationAssign\n");
2439 #if JS_VERSION < 185
2440  *rval = 0;
2441 #else
2442  JS_SET_RVAL(cx,vp,JSVAL_VOID);
2443 #endif
2444  } else {
2445 
2446 
2447  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFRotationClass)
2448 
2449  if ((fptr = (SFRotationNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
2450  printf( "JS_GetPrivate failed for _from_obj in SFRotationAssign.\n");
2451  return JS_FALSE;
2452  }
2453  #ifdef JSVRMLCLASSESVERBOSE
2454  printf("SFRotationAssign: obj = %p, id = \"%s\", from = %p\n",
2455  obj, _id_str, _from_obj);
2456  #endif
2457 
2458  SFRotationNativeAssign(ptr, fptr);
2459 #if JS_VERSION < 185
2460  *rval = OBJECT_TO_JSVAL(obj);
2461 #else
2462  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
2463 #endif
2464  }
2465  #ifdef JSVRMLCLASSESVERBOSE
2466  printf("SFRotationAssign: returning object as jsval\n");
2467  #endif
2468  return JS_TRUE;
2469 }
2470 
2471 JSBool
2472 #if JS_VERSION < 185
2473 SFRotationConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2474 #else
2475 SFRotationConstr(JSContext *cx, uintN argc, jsval *vp) {
2476  JSObject *obj = JS_NewObject(cx,&SFRotationClass,NULL,NULL);
2477  jsval *argv = JS_ARGV(cx,vp);
2478 #endif
2479 
2480  SFVec3fNative *_vec = NULL;
2481  SFVec3fNative *_vec2 = NULL;
2482  SFRotationNative *ptr;
2483  JSObject *_ob1, *_ob2;
2484  jsdouble pars[4];
2485  jsdouble doub;
2486  float v1len, v2len;
2487  double v12dp;
2488  struct point_XYZ v1, v2;
2489  int v3fv3f;
2490 
2491  #ifdef JSVRMLCLASSESVERBOSE
2492  printf ("start of SFRotationConstr\n");
2493  #endif
2494 
2495 /* ADD_ROOT(cx,obj) */
2496  if ((ptr = (SFRotationNative *)SFRotationNativeNew()) == NULL) {
2497  printf( "SFRotationNativeNew failed in SFRotationConstr.\n");
2498  return JS_FALSE;
2499  }
2500 
2501  //if (!JS_DefineProperties(cx, obj, SFRotationProperties)) {
2502  // printf( "JS_DefineProperties failed in SFRotationConstr.\n");
2503  // return JS_FALSE;
2504  //}
2505 
2506  if (!JS_SetPrivate(cx, obj, ptr)) {
2507  printf( "JS_SetPrivate failed in SFRotationConstr.\n");
2508  return JS_FALSE;
2509  }
2510 
2511  if (argc == 0) {
2512  (ptr->v).c[0] = (float) 0.0; (ptr->v).c[1] = (float) 0.0; (ptr->v).c[2] = (float) 1.0; (ptr->v).c[3] = (float) 0.0;
2513 
2514  } else if (argc == 2) {
2515  /* two possibilities - SFVec3f/numeric, or SFVec3f/SFVec3f */
2516  if (JSVAL_IS_OBJECT(argv[0])) {
2517 /* _ob1 = (JSObject *)argv[0]; */
2518  _ob1 = JSVAL_TO_OBJECT(argv[0]);
2519 
2520 
2521  CHECK_CLASS(cx,_ob1,argv,__FUNCTION__,SFVec3fClass)
2522 
2523  if ((_vec = (SFVec3fNative *)JS_GetPrivate(cx, _ob1)) == NULL) {
2524  printf( "JS_GetPrivate failed for arg format \"o d\" in SFRotationConstr.\n");
2525  return JS_FALSE;
2526  }
2527  }
2528  if (JSVAL_IS_OBJECT(argv[1])) {
2529 /* _ob2 = (JSObject *)argv[1]; */
2530  _ob2 = JSVAL_TO_OBJECT(argv[1]);
2531 
2532  v3fv3f = TRUE;
2533 
2534  CHECK_CLASS(cx,_ob2,argv,__FUNCTION__,SFVec3fClass)
2535 
2536  if ((_vec2 = (SFVec3fNative *)JS_GetPrivate(cx, _ob2)) == NULL) {
2537  printf( "JS_GetPrivate failed for _ob1 in SFRotationConstr.\n");
2538  return JS_FALSE;
2539  }
2540  } else {
2541  v3fv3f = FALSE;
2542  if (!JSVAL_IS_NUMBER(argv[1])) {
2543  printf ("SFRotationConstr param error - number expected\n");
2544  return JS_FALSE;
2545  }
2546  if (!JS_ValueToNumber(cx, argv[1], &doub)) {
2547  printf("JS_ValueToNumber failed in SFRotationConstr.\n");
2548  return JS_FALSE;
2549  }
2550  }
2551 
2552 
2553  if (!v3fv3f) {
2554  (ptr->v).c[0] = _vec->v.c[0];
2555  (ptr->v).c[1] = _vec->v.c[1];
2556  (ptr->v).c[2] = _vec->v.c[2];
2557  (ptr->v).c[3] = (float) doub;
2558  } else {
2559  v1.x = _vec->v.c[0];
2560  v1.y = _vec->v.c[1];
2561  v1.z = _vec->v.c[2];
2562  v2.x = _vec2->v.c[0];
2563  v2.y = _vec2->v.c[1];
2564  v2.z = _vec2->v.c[2];
2565 
2566  v1len = veclength(v1);
2567  v2len = veclength(v2);
2568  v12dp = vecdot(&v1, &v2);
2569  (ptr->v).c[0] = (float) (v1.y * v2.z - v2.y * v1.z);
2570  (ptr->v).c[1] = (float) (v1.z * v2.x - v2.z * v1.x);
2571  (ptr->v).c[2] = (float) (v1.x * v2.y - v2.x * v1.y);
2572  v12dp /= v1len * v2len;
2573  (ptr->v).c[3] = (float) atan2(sqrt(1 - v12dp * v12dp), v12dp);
2574  }
2575  } else if (argc == 4 && JS_ConvertArguments(cx, argc, argv, "d d d d",
2576  &(pars[0]), &(pars[1]), &(pars[2]), &(pars[3]))) {
2577  (ptr->v).c[0] = (float) pars[0];
2578  (ptr->v).c[1] = (float) pars[1];
2579  (ptr->v).c[2] = (float) pars[2];
2580  (ptr->v).c[3] = (float) pars[3];
2581  } else {
2582  printf( "Invalid arguments for SFRotationConstr.\n");
2583  return JS_FALSE;
2584  }
2585 
2586  #ifdef JSVRMLCLASSESVERBOSE
2587  printf("SFRotationConstr: obj = %p, %u args, %f %f %f %f\n",
2588  obj, argc,
2589  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2], (ptr->v).c[3]);
2590  #endif
2591 
2592  ptr->valueChanged = 1;
2593 
2594 #if JS_VERSION < 185
2595  *rval = OBJECT_TO_JSVAL(obj);
2596 #else
2597  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
2598 #endif
2599 
2600  return JS_TRUE;
2601 }
2602 
2603 JSBool
2604 #if JS_VERSION < 185
2605 SFRotationGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
2606 #else
2607 SFRotationGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
2608 #endif
2609 {
2610  SFRotationNative *ptr;
2611  jsdouble d;
2612 #if JS_VERSION >= 185
2613  jsval id;
2614  if (!JS_IdToValue(cx,iid,&id)) {
2615  printf("JS_IdToValue failed in SFRotationGetProperty.\n");
2616  return JS_FALSE;
2617  }
2618 #endif
2619 
2620  #ifdef JSVRMLCLASSESVERBOSE
2621  printf ("start of SFRotationGetProperty\n");
2622  #endif
2623 
2624  if ((ptr = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2625  printf( "JS_GetPrivate failed in SFRotationGetProperty.\n");
2626  return JS_FALSE;
2627  }
2628 
2629  if (JSVAL_IS_INT(id)) {
2630  switch (JSVAL_TO_INT(id)) {
2631  case 0:
2632  d = (ptr->v).c[0];
2633  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
2634  printf(
2635  "JS_NewDouble failed for %f in SFRotationGetProperty.\n",
2636  d);
2637  return JS_FALSE;
2638  }
2639  break;
2640  case 1:
2641  d = (ptr->v).c[1];
2642  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
2643  printf(
2644  "JS_NewDouble failed for %f in SFRotationGetProperty.\n",
2645  d);
2646  return JS_FALSE;
2647  }
2648  break;
2649  case 2:
2650  d = (ptr->v).c[2];
2651  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
2652  printf(
2653  "JS_NewDouble failed for %f in SFRotationGetProperty.\n",
2654  d);
2655  return JS_FALSE;
2656  }
2657  break;
2658  case 3:
2659  d = (ptr->v).c[3];
2660  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
2661  printf(
2662  "JS_NewDouble failed for %f in SFRotationGetProperty.\n",
2663  d);
2664  return JS_FALSE;
2665  }
2666  break;
2667  }
2668  }
2669  return JS_TRUE;
2670 }
2671 
2672 JSBool
2673 #if JS_VERSION < 185
2674 SFRotationSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
2675 #else
2676 SFRotationSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
2677 #endif
2678 {
2679  SFRotationNative *ptr;
2680  jsval myv;
2681 #if JS_VERSION >= 185
2682  jsval id;
2683  if (!JS_IdToValue(cx,iid,&id)) {
2684  printf("JS_IdToValue failed in SFRotationSetProperty.\n");
2685  return JS_FALSE;
2686  }
2687 #endif
2688 
2689  #ifdef JSVRMLCLASSESVERBOSE
2690  printf ("start of SFRotationSetProperty\n");
2691  #endif
2692 
2693  if ((ptr = (SFRotationNative *)JS_GetPrivate(cx, obj)) == NULL) {
2694  printf( "JS_GetPrivate failed in SFRotationSetProperty.\n");
2695  return JS_FALSE;
2696  }
2697  ptr->valueChanged++;
2698  #ifdef JSVRMLCLASSESVERBOSE
2699  printf("SFRotationSetProperty: obj = %p, id = %d, valueChanged = %d\n",
2700  obj, JSVAL_TO_INT(id), ptr->valueChanged);
2701  #endif
2702 
2703  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
2704  printf( "JS_ConvertValue failed in SFRotationSetProperty.\n");
2705  return JS_FALSE;
2706  }
2707 
2708  if (JSVAL_IS_INT(id)) {
2709  switch (JSVAL_TO_INT(id)) {
2710  case 0:
2711 #if JS_VERSION < 185
2712  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(myv);
2713 #else
2714  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(myv);
2715 #endif
2716  break;
2717  case 1:
2718 #if JS_VERSION < 185
2719  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(myv);
2720 #else
2721  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(myv);
2722 #endif
2723  break;
2724  case 2:
2725 #if JS_VERSION < 185
2726  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(myv);
2727 #else
2728  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(myv);
2729 #endif
2730  break;
2731  case 3:
2732 #if JS_VERSION < 185
2733  (ptr->v).c[3] = (float) *JSVAL_TO_DOUBLE(myv);
2734 #else
2735  (ptr->v).c[3] = (float) JSVAL_TO_DOUBLE(myv);
2736 #endif
2737  break;
2738  }
2739  }
2740  return JS_TRUE;
2741 }
2742 
2743 /********************************************************************/
2744 
2745 /* Generic SFVec2f routines that return a SFVec2f */
2746 #define __2FADD 1
2747 #define __2FDIVIDE 2
2748 #define __2FMULT 3
2749 #define __2FSUBT 4
2750 #define __2FDOT 5
2751 #define __2FLENGTH 6
2752 #define __2FNORMALIZE 8
2753 JSBool SFVec2fGeneric( JSContext *cx, JSObject *obj,
2754  uintN argc, jsval *argv, jsval *rval, int op) {
2755 
2756  JSObject *_paramObj, *_proto, *_retObj;
2757  SFVec2fNative *_vec1 = NULL;
2758  SFVec2fNative *_vec2 = NULL;
2759  SFVec2fNative *_retNative = NULL;
2760  jsdouble d=0.0;
2761  jsdouble d0=0.0;
2762  jsdouble d1=0.0;
2763  struct point_XYZ v1, v2;
2764 
2765 
2766  /* parameters */
2767  int SFParam = FALSE;
2768  int numParam = FALSE;
2769 
2770  /* return values */
2771  int retSFVec2f = FALSE;
2772  int retNumeric = FALSE;
2773 
2774  /* is the "argv" parameter a string? */
2775  int param_isString;
2776  char *charString;
2777  jsdouble pars[3];
2778  JSString *_str;
2779 
2780  /* determine what kind of parameter to get */
2781  if ((op==__2FADD)||(op==__2FDOT)||(op==__2FSUBT))SFParam=TRUE;
2782  if ((op==__2FDIVIDE)||(op==__2FMULT))numParam=TRUE;
2783 
2784  /* determine the return value, if it is NOT a SFVec2f */
2785  if ((op==__2FDOT)||(op==__2FLENGTH)) retNumeric = TRUE;
2786  retSFVec2f = (!retNumeric);
2787 
2788  /* is the parameter a string, possibly gotten from the VRML/X3d
2789  * side of things? */
2790  param_isString = JSVAL_IS_STRING (*argv);
2791 
2792  /* get the parameter */
2793  if ((SFParam) || (numParam)) {
2794  if (numParam) {
2795  if (!JSVAL_IS_NUMBER(argv[0])) {
2796  printf ("SFVec2f param error - number expected\n");
2797  return JS_FALSE;
2798  }
2799  if (!JS_ValueToNumber(cx, argv[0], &d)) {
2800  printf("JS_ValueToNumber failed in SFVec2f.\n");
2801  return JS_FALSE;
2802  }
2803  } else {
2804  /* did this come in from VRML as a string, or did
2805  * it get created in javascript? */
2806  if (param_isString) {
2807  _str = JS_ValueToString(cx, *argv);
2808 #if JS_VERSION < 185
2809  charString = JS_GetStringBytes(_str);
2810 #else
2811  charString = JS_EncodeString(cx,_str);
2812 #endif
2813 
2814  if (sscanf(charString, "%lf %lf",
2815  &(pars[0]), &(pars[1])) != 2) {
2816  printf ("conversion problem in SFVec2fGeneric\n");
2817  return JS_FALSE;
2818  }
2819  /* printf ("past scan, %f %f %f\n",pars[0], pars[1]);*/
2820  } else {
2821  if (!JS_ConvertArguments(cx, argc, argv, "o", &_paramObj)) {
2822  printf( "JS_ConvertArguments failed in SFVec2f.\n");
2823  return JS_FALSE;
2824  }
2825 
2826  CHECK_CLASS(cx,_paramObj,argv,__FUNCTION__,SFVec2fClass)
2827 
2828  if ((_vec2 = (SFVec2fNative*)JS_GetPrivate(cx, _paramObj)) == NULL) {
2829  printf( "JS_GetPrivate failed for _paramObj in SFVec2f.\n");
2830  return JS_FALSE;
2831  }
2832  pars[0]= (_vec2->v).c[0];
2833  pars[1] = (_vec2->v).c[1];
2834  }
2835  }
2836  }
2837 
2838  /* get our values */
2839  if ((_vec1 = (SFVec2fNative*)JS_GetPrivate(cx, obj)) == NULL) {
2840  printf( "JS_GetPrivate failed for obj in SFVec2fAdd.\n");
2841  return JS_FALSE;
2842  }
2843 
2844  /* do the operation */
2845  switch (op) {
2846  /* returning a SFVec2f */
2847  case __2FADD:
2848  d0 = (_vec1->v).c[0] + (_vec2->v).c[0];
2849  d1 = (_vec1->v).c[1] + (_vec2->v).c[1];
2850  break;
2851  case __2FDIVIDE:
2852  d0 = (_vec1->v).c[0] / d;
2853  d1 = (_vec1->v).c[1] / d;
2854  break;
2855  case __2FMULT:
2856  d0 = (_vec1->v).c[0] * d;
2857  d1 = (_vec1->v).c[1] * d;
2858  break;
2859  case __2FSUBT:
2860  d0 = (_vec1->v).c[0] - (_vec2->v).c[0];
2861  d1 = (_vec1->v).c[1] - (_vec2->v).c[1];
2862  break;
2863  case __2FDOT:
2864  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=0.0;
2865  v2.x = (_vec2->v).c[0]; v2.y=(_vec2->v).c[1];v2.z=0.0;
2866  d = vecdot (&v1, &v2);
2867  break;
2868  case __2FLENGTH:
2869  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=0.0;
2870  d = veclength(v1);
2871  break;
2872  case __2FNORMALIZE:
2873  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=0.0;
2874  vecnormal(&v1, &v1);
2875  d0 = v1.x; d1 = v1.y;
2876  break;
2877  default:
2878  return JS_FALSE;
2879  }
2880 
2881  /* set the return object */
2882  if (retSFVec2f) {
2883  if ((_proto = JS_GetPrototype(cx, obj)) == NULL) {
2884  printf( "JS_GetPrototype failed in SFVec2f.\n");
2885  return JS_FALSE;
2886  }
2887  if ((_retObj =
2888  JS_ConstructObject(cx, &SFVec2fClass, _proto, NULL)) == NULL) {
2889  printf( "JS_ConstructObject failed in SFVec2f.\n");
2890  return JS_FALSE;
2891  }
2892  *rval = OBJECT_TO_JSVAL(_retObj);
2893  if ((_retNative = (SFVec2fNative*)JS_GetPrivate(cx, _retObj)) == NULL) {
2894  printf( "JS_GetPrivate failed for _retObj in SFVec2f.\n");
2895  return JS_FALSE;
2896  }
2897  (_retNative->v).c[0] = (float) d0;
2898  (_retNative->v).c[1] = (float) d1;
2899  } else if (retNumeric) {
2900  if (JS_NewNumberValue(cx,d,rval) == JS_FALSE) {
2901  printf( "JS_NewDouble failed for %f in SFVec2f.\n",d);
2902  return JS_FALSE;
2903  }
2904  }
2905 
2906  #ifdef JSVRMLCLASSESVERBOSE
2907  if (retSFVec2f){
2908  printf("SFVec2fgeneric: obj = %p, result = [%.9g, %.9g]\n",
2909  obj,
2910  (_retNative->v).c[0], (_retNative->v).c[1]);
2911  }
2912  if (retNumeric){
2913  printf("SFVec2fgeneric: obj = %p, result = %.9g\n",
2914  obj, d);
2915  }
2916  #endif
2917 
2918  return JS_TRUE;
2919 }
2920 
2921 JSBool
2922 #if JS_VERSION < 185
2923 SFVec2fAdd(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2924  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FADD);
2925 #else
2926 SFVec2fAdd(JSContext *cx, uintN argc, jsval *vp) {
2927  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2928  jsval *argv = JS_ARGV(cx,vp);
2929  jsval rval;
2930  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FADD);
2931  JS_SET_RVAL(cx,vp,rval);
2932  return retval;
2933 #endif
2934 }
2935 
2936 JSBool
2937 #if JS_VERSION < 185
2938 SFVec2fDivide(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2939  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FDIVIDE);
2940 #else
2941 SFVec2fDivide(JSContext *cx, uintN argc, jsval *vp) {
2942  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2943  jsval *argv = JS_ARGV(cx,vp);
2944  jsval rval;
2945  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FDIVIDE);
2946  JS_SET_RVAL(cx,vp,rval);
2947  return retval;
2948 #endif
2949 }
2950 
2951 JSBool
2952 #if JS_VERSION < 185
2953 SFVec2fMultiply(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2954  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FMULT);
2955 #else
2956 SFVec2fMultiply(JSContext *cx, uintN argc, jsval *vp) {
2957  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2958  jsval *argv = JS_ARGV(cx,vp);
2959  jsval rval;
2960  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FMULT);
2961  JS_SET_RVAL(cx,vp,rval);
2962  return retval;
2963 #endif
2964 }
2965 
2966 JSBool
2967 #if JS_VERSION < 185
2968 SFVec2fSubtract(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2969  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FSUBT);
2970 #else
2971 SFVec2fSubtract(JSContext *cx, uintN argc, jsval *vp) {
2972  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2973  jsval *argv = JS_ARGV(cx,vp);
2974  jsval rval;
2975  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FSUBT);
2976  JS_SET_RVAL(cx,vp,rval);
2977  return retval;
2978 #endif
2979 }
2980 
2981 JSBool
2982 #if JS_VERSION < 185
2983 SFVec2fDot(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2984  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FDOT);
2985 #else
2986 SFVec2fDot(JSContext *cx, uintN argc, jsval *vp) {
2987  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2988  jsval *argv = JS_ARGV(cx,vp);
2989  jsval rval;
2990  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FDOT);
2991  JS_SET_RVAL(cx,vp,rval);
2992  return retval;
2993 #endif
2994 }
2995 
2996 JSBool
2997 #if JS_VERSION < 185
2998 SFVec2fLength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2999  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FLENGTH);
3000 #else
3001 SFVec2fLength(JSContext *cx, uintN argc, jsval *vp) {
3002  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3003  jsval *argv = JS_ARGV(cx,vp);
3004  jsval rval;
3005  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FLENGTH);
3006  JS_SET_RVAL(cx,vp,rval);
3007  return retval;
3008 #endif
3009 }
3010 
3011 JSBool
3012 #if JS_VERSION < 185
3013 SFVec2fNormalize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3014  return SFVec2fGeneric(cx, obj, argc, argv, rval, __2FNORMALIZE);
3015 #else
3016 SFVec2fNormalize(JSContext *cx, uintN argc, jsval *vp) {
3017  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3018  jsval *argv = JS_ARGV(cx,vp);
3019  jsval rval;
3020  JSBool retval = SFVec2fGeneric(cx, obj, argc, argv, &rval, __2FNORMALIZE);
3021  JS_SET_RVAL(cx,vp,rval);
3022  return retval;
3023 #endif
3024 }
3025 
3026 JSBool
3027 #if JS_VERSION < 185
3028 SFVec2fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3029 #else
3030 SFVec2fToString(JSContext *cx, uintN argc, jsval *vp) {
3031  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3032  jsval *argv = JS_ARGV(cx,vp);
3033 #endif
3034  SFVec2fNative *ptr;
3035  JSString *_str;
3036  char buff[STRING];
3037 
3038  UNUSED(argc);
3039  UNUSED(argv);
3040  if ((ptr = (SFVec2fNative*)JS_GetPrivate(cx, obj)) == NULL) {
3041  printf( "JS_GetPrivate failed in SFVec2fToString.\n");
3042  return JS_FALSE;
3043  }
3044 
3045  memset(buff, 0, STRING);
3046  sprintf(buff, "%.9g %.9g",
3047  (ptr->v).c[0], (ptr->v).c[1]);
3048  _str = JS_NewStringCopyZ(cx, buff);
3049 #if JS_VERSION < 185
3050  *rval = STRING_TO_JSVAL(_str);
3051 #else
3052  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
3053 #endif
3054 
3055  return JS_TRUE;
3056 }
3057 
3058 JSBool
3059 #if JS_VERSION < 185
3060 SFVec2fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3061 #else
3062 SFVec2fAssign(JSContext *cx, uintN argc, jsval *vp) {
3063  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3064  jsval *argv = JS_ARGV(cx,vp);
3065  JSString *_id_jsstr;
3066 #endif
3067  JSObject *_from_obj;
3068  SFVec2fNative *fptr, *ptr;
3069  char *_id_str;
3070 
3071  UNUSED(_id_str); // compiler warning mitigation
3072 
3073 
3074  if ((ptr = (SFVec2fNative *)JS_GetPrivate(cx, obj)) == NULL) {
3075  printf( "JS_GetPrivate failed for obj in SFVec2fAssign.\n");
3076  return JS_FALSE;
3077  }
3078 
3079  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFVec2fClass)
3080 
3081 #if JS_VERSION < 185
3082  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
3083 #else
3084  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
3085  _id_str = JS_EncodeString(cx,_id_jsstr);
3086  } else {
3087 #endif
3088  printf( "JS_ConvertArguments failed in SFVec2fAssign.\n");
3089  return JS_FALSE;
3090  }
3091 
3092  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFVec2fClass)
3093 
3094  if ((fptr = (SFVec2fNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
3095  printf( "JS_GetPrivate failed for _from_obj in SFVec2fAssign.\n");
3096  return JS_FALSE;
3097  }
3098  #ifdef JSVRMLCLASSESVERBOSE
3099  printf("SFVec2fAssign: obj = %p, id = \"%s\", from = %p\n",
3100  obj, _id_str, _from_obj);
3101  #endif
3102 
3103  SFVec2fNativeAssign(ptr, fptr);
3104 #if JS_VERSION < 185
3105  *rval = OBJECT_TO_JSVAL(obj);
3106 #else
3107  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
3108 #endif
3109 
3110  return JS_TRUE;
3111 }
3112 
3113 JSBool
3114 #if JS_VERSION < 185
3115 SFVec2fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3116 #else
3117 SFVec2fConstr(JSContext *cx, uintN argc, jsval *vp) {
3118  JSObject *obj = JS_NewObject(cx,&SFVec2fClass,NULL,NULL);
3119  jsval *argv = JS_ARGV(cx,vp);
3120 #endif
3121  SFVec2fNative *ptr;
3122  jsdouble pars[2];
3123 
3124  ADD_ROOT(cx,obj)
3125 
3126  if ((ptr = (SFVec2fNative *) SFVec2fNativeNew()) == NULL) {
3127  printf( "SFVec2fNativeNew failed in SFVec2fConstr.\n");
3128  return JS_FALSE;
3129  }
3130 
3131  //if (!JS_DefineProperties(cx, obj, SFVec2fProperties)) {
3132  // printf( "JS_DefineProperties failed in SFVec2fConstr.\n");
3133  // return JS_FALSE;
3134  //}
3135  if (!JS_SetPrivate(cx, obj, ptr)) {
3136  printf( "JS_SetPrivate failed in SFVec2fConstr.\n");
3137  return JS_FALSE;
3138  }
3139 
3140  if (argc == 0) {
3141  (ptr->v).c[0] = (float) 0.0;
3142  (ptr->v).c[1] = (float) 0.0;
3143  } else {
3144  if (!JS_ConvertArguments(cx, argc, argv, "d d", &(pars[0]), &(pars[1]))) {
3145  printf( "JS_ConvertArguments failed in SFVec2fConstr.\n");
3146  return JS_FALSE;
3147  }
3148  (ptr->v).c[0] = (float) pars[0];
3149  (ptr->v).c[1] = (float) pars[1];
3150  }
3151  #ifdef JSVRMLCLASSESVERBOSE
3152  printf("SFVec2fConstr: obj = %p, %u args, %f %f\n",
3153  obj, argc,
3154  (ptr->v).c[0], (ptr->v).c[1]);
3155  #endif
3156 
3157  ptr->valueChanged = 1;
3158 
3159 #if JS_VERSION < 185
3160  *rval = OBJECT_TO_JSVAL(obj);
3161 #else
3162  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
3163 #endif
3164  return JS_TRUE;
3165 }
3166 
3167 
3168 JSBool
3169 #if JS_VERSION < 185
3170 SFVec2fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
3171 #else
3172 SFVec2fGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
3173 #endif
3174 {
3175  SFVec2fNative *ptr;
3176  jsdouble d;
3177 #if JS_VERSION >= 185
3178  jsval id;
3179  if (!JS_IdToValue(cx,iid,&id)) {
3180  printf("JS_IdToValue failed in SFVec2fGetProperty.\n");
3181  return JS_FALSE;
3182  }
3183 #endif
3184 
3185  if ((ptr = (SFVec2fNative *)JS_GetPrivate(cx,obj)) == NULL) {
3186  printf( "JS_GetPrivate failed in SFVec2fGetProperty.\n");
3187  return JS_FALSE;
3188  }
3189 
3190  if (JSVAL_IS_INT(id)) {
3191  switch (JSVAL_TO_INT(id)) {
3192  case 0:
3193  d = (ptr->v).c[0];
3194  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
3195  printf(
3196  "JS_NewDouble failed for %f in SFVec2fGetProperty.\n",
3197  d);
3198  return JS_FALSE;
3199  }
3200  break;
3201  case 1:
3202  d = (ptr->v).c[1];
3203  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
3204  printf(
3205  "JS_NewDouble failed for %f in SFVec2fGetProperty.\n",
3206  d);
3207  return JS_FALSE;
3208  }
3209  break;
3210  }
3211  }
3212  return JS_TRUE;
3213 }
3214 
3215 JSBool
3216 #if JS_VERSION < 185
3217 SFVec2fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
3218 #else
3219 SFVec2fSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
3220 #endif
3221 {
3222  SFVec2fNative *ptr;
3223  jsval myv;
3224 #if JS_VERSION >= 185
3225  jsval id;
3226  if (!JS_IdToValue(cx,iid,&id)) {
3227  printf("JS_IdToValue failed in SFVec2fSetProperty.\n");
3228  return JS_FALSE;
3229  }
3230 #endif
3231 
3232  if ((ptr = (SFVec2fNative *)JS_GetPrivate(cx, obj)) == NULL) {
3233  printf( "JS_GetPrivate failed in SFVec2fSetProperty.\n");
3234  return JS_FALSE;
3235  }
3236  ptr->valueChanged++;
3237  #ifdef JSVRMLCLASSESVERBOSE
3238  printf("SFVec2fSetProperty: obj = %p, id = %d, valueChanged = %d\n",
3239  obj, JSVAL_TO_INT(id), ptr->valueChanged);
3240  #endif
3241 
3242  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
3243  printf( "JS_ConvertValue failed in SFVec2fSetProperty.\n");
3244  return JS_FALSE;
3245  }
3246 
3247  if (JSVAL_IS_INT(id)) {
3248  switch (JSVAL_TO_INT(id)) {
3249  case 0:
3250 #if JS_VERSION < 185
3251  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(myv);
3252 #else
3253  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(myv);
3254 #endif
3255  break;
3256  case 1:
3257 #if JS_VERSION < 185
3258  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(myv);
3259 #else
3260  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(myv);
3261 #endif
3262  break;
3263  case 2:
3264 #if JS_VERSION < 185
3265  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(myv);
3266 #else
3267  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(myv);
3268 #endif
3269  break;
3270  }
3271  }
3272  return JS_TRUE;
3273 }
3274 
3275 
3276 /********************************************************************/
3277 
3278 /* Generic SFVec3f routines that return a SFVec3f */
3279 #define __3FADD 1
3280 #define __3FDIVIDE 2
3281 #define __3FMULT 3
3282 #define __3FSUBT 4
3283 #define __3FDOT 5
3284 #define __3FLENGTH 6
3285 #define __3FNORMALIZE 8
3286 #define __3FNEGATE 7
3287 #define __3FCROSS 9
3288 
3289 JSBool SFVec3fGeneric( JSContext *cx, JSObject *obj,
3290  uintN argc, jsval *argv, jsval *rval, int op) {
3291  JSObject *_paramObj, *_proto, *_retObj;
3292  SFVec3fNative *_vec1, *_vec2, *_retNative;
3293  jsdouble d=0.0;
3294  jsdouble d0=0.0;
3295  jsdouble d1=0.0;
3296  jsdouble d2=0.0;
3297  struct point_XYZ v1, v2, ret;
3298 
3299 
3300  /* parameters */
3301  int SFParam = FALSE;
3302  int numParam = FALSE;
3303 
3304  /* return values */
3305  int retSFVec3f = FALSE;
3306  int retNumeric = FALSE;
3307 
3308  /* is the "argv" parameter a string? */
3309  int param_isString;
3310  char *charString;
3311  jsdouble pars[3];
3312  JSString *_str;
3313 
3314  #ifdef JSVRMLCLASSESVERBOSE
3315  printf ("SFVec3fGeneric\n");
3316  #endif
3317 
3318  /* determine what kind of parameter to get */
3319  if ((op==__3FADD)||(op==__3FDOT)||(op==__3FCROSS)||(op==__3FSUBT))SFParam=TRUE;
3320  if ((op==__3FDIVIDE)||(op==__3FMULT))numParam=TRUE;
3321 
3322  /* determine the return value, if it is NOT a SFVec3f */
3323  if ((op==__3FDOT)||(op==__3FLENGTH)) retNumeric = TRUE;
3324  retSFVec3f = (!retNumeric);
3325 
3326  /* is the parameter a string, possibly gotten from the VRML/X3d
3327  * side of things? */
3328  param_isString = JSVAL_IS_STRING (*argv);
3329 
3330  /* get the parameter */
3331  if ((SFParam) || (numParam)) {
3332  if (numParam) {
3333  if (!JSVAL_IS_NUMBER(argv[0])) {
3334  printf ("SFVec3f param error - number expected\n");
3335  return JS_FALSE;
3336  }
3337  if (!JS_ValueToNumber(cx, argv[0], &d)) {
3338  printf("JS_ValueToNumber failed in SFVec3f.\n");
3339  return JS_FALSE;
3340  }
3341  } else {
3342  /* did this come in from VRML as a string, or did
3343  * it get created in javascript? */
3344  if (param_isString) {
3345  _str = JS_ValueToString(cx, *argv);
3346 #if JS_VERSION < 185
3347  charString = JS_GetStringBytes(_str);
3348 #else
3349  charString = JS_EncodeString(cx,_str);
3350 #endif
3351 
3352  if (sscanf(charString, "%lf %lf %lf",
3353  &(pars[0]), &(pars[1]), &(pars[2])) != 3) {
3354  printf ("conversion problem in SFVec3fGeneric\n");
3355  return JS_FALSE;
3356  }
3357  /* printf ("past scan, %f %f %f\n",pars[0], pars[1],pars[2]);*/
3358  } else {
3359  if (!JS_ConvertArguments(cx, argc, argv, "o", &_paramObj)) {
3360  printf( "JS_ConvertArguments failed in SFVec3f.\n");
3361  return JS_FALSE;
3362  }
3363 
3364  CHECK_CLASS(cx,_paramObj,argv,__FUNCTION__,SFVec3fClass)
3365 
3366  /* get the second object's data */
3367  if ((_vec2 = (SFVec3fNative*)JS_GetPrivate(cx, _paramObj)) == NULL) {
3368  printf( "JS_GetPrivate failed for _paramObj in SFVec3f.\n");
3369  return JS_FALSE;
3370  }
3371  pars[0]= (_vec2->v).c[0];
3372  pars[1] = (_vec2->v).c[1];
3373  pars[2] = (_vec2->v).c[2];
3374  }
3375  }
3376  }
3377 
3378  /* get our values */
3379  if ((_vec1 = (SFVec3fNative*)JS_GetPrivate(cx, obj)) == NULL) {
3380  printf( "JS_GetPrivate failed for obj in SFVec3fAdd.\n");
3381  return JS_FALSE;
3382  }
3383 
3384  /* do the operation */
3385  #ifdef JSVRMLCLASSESVERBOSE
3386  printf ("SFVec3f generic, vec2 %f %f %f\n",pars[0],pars[1],pars[2]);
3387  #endif
3388 
3389  switch (op) {
3390  /* returning a SFVec3f */
3391  case __3FADD:
3392  d0 = (_vec1->v).c[0] + pars[0];
3393  d1 = (_vec1->v).c[1] + pars[1];
3394  d2 = (_vec1->v).c[2] + pars[2];
3395  break;
3396  case __3FDIVIDE:
3397  d0 = (_vec1->v).c[0] / d;
3398  d1 = (_vec1->v).c[1] / d;
3399  d2 = (_vec1->v).c[2] / d;
3400  break;
3401  case __3FMULT:
3402  d0 = (_vec1->v).c[0] * d;
3403  d1 = (_vec1->v).c[1] * d;
3404  d2 = (_vec1->v).c[2] * d;
3405  break;
3406  case __3FSUBT:
3407  d0 = (_vec1->v).c[0] - pars[0];
3408  d1 = (_vec1->v).c[1] - pars[1];
3409  d2 = (_vec1->v).c[2] - pars[2];
3410  break;
3411  case __3FDOT:
3412  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
3413  v2.x = (float) pars[0]; v2.y=(float) pars[1];v2.z=(float) pars[2];
3414  d = vecdot (&v1, &v2);
3415  break;
3416  case __3FCROSS:
3417  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
3418  v2.x = (float) pars[0]; v2.y=(float) pars[1];v2.z=(float) pars[2];
3419  veccross(&ret, v1, v2);
3420  d0 = ret.x;d1 = ret.y, d2 = ret.z;
3421  break;
3422  case __3FLENGTH:
3423  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
3424  d = veclength(v1);
3425  break;
3426  case __3FNORMALIZE:
3427  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
3428  vecnormal(&v1, &v1);
3429  d0 = v1.x; d1 = v1.y; d2 = v1.z;
3430  break;
3431  case __3FNEGATE:
3432  d0 = -(_vec1->v).c[0];
3433  d1 = -(_vec1->v).c[1];
3434  d2 = -(_vec1->v).c[2];
3435  break;
3436  default:
3437  printf ("woops... %d\n",op);
3438  return JS_FALSE;
3439  }
3440 
3441  #ifdef JSVRMLCLASSESVERBOSE
3442  printf ("past calcs\n");
3443  #endif
3444 
3445  /* set the return object */
3446  if (retSFVec3f) {
3447  #ifdef JSVRMLCLASSESVERBOSE
3448  printf ("returning SFVec3f\n");
3449  #endif
3450  if ((_proto = JS_GetPrototype(cx, obj)) == NULL) {
3451  printf( "JS_GetPrototype failed in SFVec3f.\n");
3452  return JS_FALSE;
3453  }
3454  if ((_retObj =
3455  JS_ConstructObject(cx, &SFVec3fClass, _proto, NULL)) == NULL) {
3456  printf( "JS_ConstructObject failed in SFVec3f.\n");
3457  return JS_FALSE;
3458  }
3459  *rval = OBJECT_TO_JSVAL(_retObj);
3460  if ((_retNative = (SFVec3fNative*)JS_GetPrivate(cx, _retObj)) == NULL) {
3461  printf( "JS_GetPrivate failed for _retObj in SFVec3f.\n");
3462  return JS_FALSE;
3463  }
3464  (_retNative->v).c[0] = (float) d0;
3465  (_retNative->v).c[1] = (float) d1;
3466  (_retNative->v).c[2] = (float) d2;
3467  } else if (retNumeric) {
3468  if (JS_NewNumberValue(cx,d,rval) == JS_FALSE) {
3469  printf( "JS_NewDouble failed for %f in SFVec3f.\n",d);
3470  return JS_FALSE;
3471  }
3472  }
3473  #ifdef JSVRMLCLASSESVERBOSE
3474  if (retSFVec3f){
3475  printf("SFVec3fgeneric: obj = %p, result = [%.9g, %.9g, %.9g]\n",
3476  obj,
3477  (_retNative->v).c[0], (_retNative->v).c[1],
3478  (_retNative->v).c[2]);
3479  }
3480  if (retNumeric){
3481  printf("SFVec2fgeneric: obj = %p, result = %.9g\n",
3482  obj, d);
3483  }
3484  #endif
3485 return JS_TRUE;
3486 }
3487 
3488 JSBool
3489 #if JS_VERSION < 185
3490 SFVec3fAdd(JSContext *cx, JSObject *obj,
3491  uintN argc, jsval *argv, jsval *rval) {
3492  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FADD);
3493 #else
3494 SFVec3fAdd(JSContext *cx, uintN argc, jsval *vp) {
3495  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3496  jsval *argv = JS_ARGV(cx,vp);
3497  jsval rval;
3498  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FADD);
3499  JS_SET_RVAL(cx,vp,rval);
3500  return retval;
3501 #endif
3502 }
3503 
3504 JSBool
3505 #if JS_VERSION < 185
3506 SFVec3fCross(JSContext *cx, JSObject *obj,
3507  uintN argc, jsval *argv, jsval *rval) {
3508  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FCROSS);
3509 #else
3510 SFVec3fCross(JSContext *cx, uintN argc, jsval *vp) {
3511  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3512  jsval *argv = JS_ARGV(cx,vp);
3513  jsval rval;
3514  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FCROSS);
3515  JS_SET_RVAL(cx,vp,rval);
3516  return retval;
3517 #endif
3518 }
3519 
3520 JSBool
3521 #if JS_VERSION < 185
3522 SFVec3fDivide(JSContext *cx, JSObject *obj,
3523  uintN argc, jsval *argv, jsval *rval) {
3524  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FDIVIDE);
3525 #else
3526 SFVec3fDivide(JSContext *cx, uintN argc, jsval *vp) {
3527  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3528  jsval *argv = JS_ARGV(cx,vp);
3529  jsval rval;
3530  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FDIVIDE);
3531  JS_SET_RVAL(cx,vp,rval);
3532  return retval;
3533 #endif
3534 }
3535 
3536 JSBool
3537 #if JS_VERSION < 185
3538 SFVec3fDot(JSContext *cx, JSObject *obj,
3539  uintN argc, jsval *argv, jsval *rval) {
3540  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FDOT);
3541 #else
3542 SFVec3fDot(JSContext *cx, uintN argc, jsval *vp) {
3543  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3544  jsval *argv = JS_ARGV(cx,vp);
3545  jsval rval;
3546  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FDOT);
3547  JS_SET_RVAL(cx,vp,rval);
3548  return retval;
3549 #endif
3550 }
3551 
3552 JSBool
3553 #if JS_VERSION < 185
3554 SFVec3fLength(JSContext *cx, JSObject *obj,
3555  uintN argc, jsval *argv, jsval *rval) {
3556  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FLENGTH);
3557 #else
3558 SFVec3fLength(JSContext *cx, uintN argc, jsval *vp) {
3559  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3560  jsval *argv = JS_ARGV(cx,vp);
3561  jsval rval;
3562  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FLENGTH);
3563  JS_SET_RVAL(cx,vp,rval);
3564  return retval;
3565 #endif
3566 }
3567 
3568 
3569 JSBool
3570 #if JS_VERSION < 185
3571 SFVec3fMultiply(JSContext *cx, JSObject *obj,
3572  uintN argc, jsval *argv, jsval *rval) {
3573  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FMULT);
3574 #else
3575 SFVec3fMultiply(JSContext *cx, uintN argc, jsval *vp) {
3576  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3577  jsval *argv = JS_ARGV(cx,vp);
3578  jsval rval;
3579  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FMULT);
3580  JS_SET_RVAL(cx,vp,rval);
3581  return retval;
3582 #endif
3583 }
3584 
3585 
3586 JSBool
3587 #if JS_VERSION < 185
3588 SFVec3fNegate(JSContext *cx, JSObject *obj,
3589  uintN argc, jsval *argv, jsval *rval) {
3590  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FNEGATE);
3591 #else
3592 SFVec3fNegate(JSContext *cx, uintN argc, jsval *vp) {
3593  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3594  jsval *argv = JS_ARGV(cx,vp);
3595  jsval rval;
3596  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FNEGATE);
3597  JS_SET_RVAL(cx,vp,rval);
3598  return retval;
3599 #endif
3600 }
3601 
3602 JSBool
3603 #if JS_VERSION < 185
3604 SFVec3fNormalize(JSContext *cx, JSObject *obj,
3605  uintN argc, jsval *argv, jsval *rval) {
3606  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FNORMALIZE);
3607 #else
3608 SFVec3fNormalize(JSContext *cx, uintN argc, jsval *vp) {
3609  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3610  jsval *argv = JS_ARGV(cx,vp);
3611  jsval rval;
3612  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FNORMALIZE);
3613  JS_SET_RVAL(cx,vp,rval);
3614  return retval;
3615 #endif
3616 }
3617 
3618 JSBool
3619 #if JS_VERSION < 185
3620 SFVec3fSubtract(JSContext *cx, JSObject *obj,
3621  uintN argc, jsval *argv, jsval *rval) {
3622  return SFVec3fGeneric(cx, obj, argc, argv, rval, __3FSUBT);
3623 #else
3624 SFVec3fSubtract(JSContext *cx, uintN argc, jsval *vp) {
3625  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3626  jsval *argv = JS_ARGV(cx,vp);
3627  jsval rval;
3628  JSBool retval = SFVec3fGeneric(cx, obj, argc, argv, &rval, __3FSUBT);
3629  JS_SET_RVAL(cx,vp,rval);
3630  return retval;
3631 #endif
3632 }
3633 
3634 JSBool
3635 #if JS_VERSION < 185
3636 SFVec3fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3637 #else
3638 SFVec3fToString(JSContext *cx, uintN argc, jsval *vp) {
3639  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3640  jsval *argv = JS_ARGV(cx,vp);
3641 #endif
3642  SFVec3fNative *ptr;
3643  JSString *_str;
3644  char buff[STRING];
3645 
3646  UNUSED(argc);
3647  UNUSED(argv);
3648  if ((ptr = (SFVec3fNative *)JS_GetPrivate(cx, obj)) == NULL) {
3649  printf( "JS_GetPrivate failed in SFVec3fToString.\n");
3650  return JS_FALSE;
3651  }
3652 
3653  memset(buff, 0, STRING);
3654  sprintf(buff, "%.9g %.9g %.9g",
3655  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
3656  _str = JS_NewStringCopyZ(cx, buff);
3657 
3658 #if JS_VERSION < 185
3659  *rval = STRING_TO_JSVAL(_str);
3660 #else
3661  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
3662 #endif
3663 
3664  #ifdef JSVRMLCLASSESVERBOSE
3665  printf ("SFVec3fToString, string is :%s:\n",buff);
3666  #endif
3667 
3668  return JS_TRUE;
3669 }
3670 
3671 
3672 JSBool
3673 #if JS_VERSION < 185
3674 SFVec3fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3675 #else
3676 SFVec3fAssign(JSContext *cx, uintN argc, jsval *vp) {
3677  JSObject *obj = JS_THIS_OBJECT(cx,vp);
3678  jsval *argv = JS_ARGV(cx,vp);
3679  JSString *_id_jsstr;
3680 #endif
3681  JSObject *_from_obj;
3682  SFVec3fNative *fptr, *ptr;
3683  char *_id_str;
3684 
3685 
3686  UNUSED(_id_str); // compiler warning mitigation
3687 
3688  #ifdef JSVRMLCLASSESVERBOSE
3689  printf ("start of SFVec3fAssign\n");
3690  #endif
3691 
3692  if ((ptr = (SFVec3fNative *)JS_GetPrivate(cx, obj)) == NULL) {
3693  printf( "JS_GetPrivate failed for obj in SFVec3fAssign.\n");
3694  return JS_FALSE;
3695  }
3696 
3697  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFVec3fClass)
3698 
3699 #if JS_VERSION < 185
3700  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
3701 #else
3702  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr)) {
3703  _id_str = JS_EncodeString(cx,_id_jsstr);
3704  } else {
3705 #endif
3706  printf( "JS_ConvertArguments failed in SFVec3fAssign.\n");
3707  return JS_FALSE;
3708  }
3709 
3710  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFVec3fClass)
3711 
3712  if ((fptr = (SFVec3fNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
3713  printf( "JS_GetPrivate failed for _from_obj in SFVec3fAssign.\n");
3714  return JS_FALSE;
3715  }
3716  #ifdef JSVRMLCLASSESVERBOSE
3717  printf("SFVec3fAssign: obj = %p, id = \"%s\", from = %p\n",
3718  obj, _id_str, _from_obj);
3719  #endif
3720 
3721  SFVec3fNativeAssign(ptr, fptr);
3722 #if JS_VERSION < 185
3723  *rval = OBJECT_TO_JSVAL(obj);
3724 #else
3725  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
3726 #endif
3727 
3728  #ifdef JSVRMLCLASSESVERBOSE
3729  printf ("end of SFVec3fAssign\n");
3730  #endif
3731 
3732  return JS_TRUE;
3733 }
3734 
3735 JSBool
3736 #if JS_VERSION < 185
3737 SFVec3fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3738 #else
3739 SFVec3fConstr(JSContext *cx, uintN argc, jsval *vp) {
3740  JSObject *obj = JS_NewObject(cx,&SFVec3fClass,NULL,NULL);
3741  jsval *argv = JS_ARGV(cx,vp);
3742 #endif
3743  SFVec3fNative *ptr;
3744  jsdouble pars[3];
3745 
3746  #ifdef JSVRMLCLASSESVERBOSE
3747  printf ("start of SFVec3fConstr\n");
3748  #endif
3749 
3750  ADD_ROOT(cx,obj)
3751 
3752  if ((ptr = (SFVec3fNative *) SFVec3fNativeNew()) == NULL) {
3753  printf( "SFVec3fNativeNew failed in SFVec3fConstr.\n");
3754  return JS_FALSE;
3755  }
3756 
3757  //if (!JS_DefineProperties(cx, obj, SFVec3fProperties)) {
3758  // printf( "JS_DefineProperties failed in SFVec3fConstr.\n");
3759  // return JS_FALSE;
3760  //}
3761  if (!JS_SetPrivate(cx, obj, ptr)) {
3762  printf( "JS_SetPrivate failed in SFVec3fConstr.\n");
3763  return JS_FALSE;
3764  }
3765 
3766  if (argc == 0) {
3767  (ptr->v).c[0] = (float) 0.0;
3768  (ptr->v).c[1] = (float) 0.0;
3769  (ptr->v).c[2] = (float) 0.0;
3770  } else {
3771  if (!JS_ConvertArguments(cx, argc, argv, "d d d",
3772  &(pars[0]), &(pars[1]), &(pars[2]))) {
3773  printf( "JS_ConvertArguments failed in SFVec3fConstr.\n");
3774  return JS_FALSE;
3775  }
3776  (ptr->v).c[0] = (float) pars[0];
3777  (ptr->v).c[1] = (float) pars[1];
3778  (ptr->v).c[2] = (float) pars[2];
3779  }
3780  #ifdef JSVRMLCLASSESVERBOSE
3781  printf("SFVec3fConstr: obj = %p, %u args, %f %f %f\n",
3782  obj, argc,
3783  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
3784  #endif
3785 
3786  ptr->valueChanged = 1;
3787 
3788 #if JS_VERSION < 185
3789  *rval = OBJECT_TO_JSVAL(obj);
3790 #else
3791  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
3792 #endif
3793  return JS_TRUE;
3794 }
3795 
3796 JSBool
3797 #if JS_VERSION < 185
3798 SFVec3fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
3799 #else
3800 SFVec3fGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
3801 #endif
3802 {
3803  SFVec3fNative *ptr;
3804  jsdouble d;
3805  #ifdef JSVRMLCLASSESVERBOSE
3806  JSString *_idStr;
3807  char *_id_c;
3808  #endif
3809 #if JS_VERSION >= 185
3810  jsval id;
3811  if (!JS_IdToValue(cx,iid,&id)) {
3812  printf("JS_IdToValue failed in SFVec3fGetProperty.\n");
3813  return JS_FALSE;
3814  }
3815 #endif
3816 
3817  #ifdef JSVRMLCLASSESVERBOSE
3818 
3819  //JSString *_idStr;
3820  //char *_id_c;
3821 
3822 /* note, since same variables are used, this first bit gets overwritten -- commenting out
3823  _idStr = JS_ValueToString(cx, id);
3824  _id_c = JS_GetStringBytes(_idStr);*/
3825  _idStr = JS_ValueToString(cx, *vp);
3826 #if JS_VERSION < 185
3827  _id_c = JS_GetStringBytes(_idStr);
3828 #else
3829  _id_c = JS_EncodeString(cx,_idStr);
3830 #endif
3831  #endif
3832 
3833  if ((ptr = (SFVec3fNative *)JS_GetPrivate(cx,obj)) == NULL) {
3834  printf( "JS_GetPrivate failed in SFVec3fGetProperty.\n");
3835  return JS_FALSE;
3836  }
3837 
3838  if (JSVAL_IS_INT(id)) {
3839  switch (JSVAL_TO_INT(id)) {
3840  case 0:
3841  d = (ptr->v).c[0];
3842  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
3843  printf(
3844  "JS_NewDouble failed for %f in SFVec3fGetProperty.\n",
3845  d);
3846  return JS_FALSE;
3847  }
3848  break;
3849  case 1:
3850  d = (ptr->v).c[1];
3851  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
3852  printf(
3853  "JS_NewDouble failed for %f in SFVec3fGetProperty.\n",
3854  d);
3855  return JS_FALSE;
3856  }
3857  break;
3858  case 2:
3859  d = (ptr->v).c[2];
3860  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
3861  printf(
3862  "JS_NewDouble failed for %f in SFVec3fGetProperty.\n",
3863  d);
3864  return JS_FALSE;
3865  }
3866  break;
3867  }
3868  } else {
3869  #ifdef JSVRMLCLASSESVERBOSE
3870  printf ("SFVec3fGetProperty, id is NOT an int...\n");
3871  #endif
3872  }
3873 
3874  return JS_TRUE;
3875 }
3876 
3877 JSBool
3878 #if JS_VERSION < 185
3879 SFVec3fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
3880 #else
3881 SFVec3fSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
3882 #endif
3883 {
3884  SFVec3fNative *ptr;
3885  jsval myv;
3886 #if JS_VERSION >= 185
3887  jsval id;
3888  if (!JS_IdToValue(cx,iid,&id)) {
3889  printf("JS_IdToValue failed in SFVec3fSetProperty.\n");
3890  return JS_FALSE;
3891  }
3892 #endif
3893 
3894  if ((ptr = (SFVec3fNative *)JS_GetPrivate(cx, obj)) == NULL) {
3895  printf( "JS_GetPrivate failed in SFVec3fSetProperty.\n");
3896  return JS_FALSE;
3897  }
3898  ptr->valueChanged++;
3899  #ifdef JSVRMLCLASSESVERBOSE
3900  printf("SFVec3fSetProperty: obj = %p, id = %d, valueChanged = %d\n",
3901  obj, JSVAL_TO_INT(id), ptr->valueChanged);
3902  #endif
3903 
3904  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
3905  printf( "JS_ConvertValue failed in SFVec3fSetProperty.\n");
3906  return JS_FALSE;
3907  }
3908 
3909  if (JSVAL_IS_INT(id)) {
3910  switch (JSVAL_TO_INT(id)) {
3911  case 0:
3912 #if JS_VERSION < 185
3913  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(myv);
3914 #else
3915  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(myv);
3916 #endif
3917  break;
3918  case 1:
3919 #if JS_VERSION < 185
3920  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(myv);
3921 #else
3922  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(myv);
3923 #endif
3924  break;
3925  case 2:
3926 #if JS_VERSION < 185
3927  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(myv);
3928 #else
3929  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(myv);
3930 #endif
3931  break;
3932  }
3933  }
3934  return JS_TRUE;
3935 }
3936 
3937 /********************************************************************/
3938 
3939 /* Generic SFVec3d routines that return a SFVec3d -- note, already defined above
3940 #define __3FADD 1
3941 #define __3FDIVIDE 2
3942 #define __3FMULT 3
3943 #define __3FSUBT 4
3944 #define __3FDOT 5
3945 #define __3FLENGTH 6
3946 #define __3FNORMALIZE 8
3947 #define __3FNEGATE 7
3948 #define __3FCROSS 9
3949 */
3950 
3951 JSBool SFVec3dGeneric( JSContext *cx, JSObject *obj,
3952  uintN argc, jsval *argv, jsval *rval, int op) {
3953  JSObject *_paramObj, *_proto, *_retObj;
3954  SFVec3dNative *_vec1, *_vec2, *_retNative;
3955  jsdouble d=0.0;
3956  jsdouble d0=0.0;
3957  jsdouble d1=0.0;
3958  jsdouble d2=0.0;
3959  struct point_XYZ v1, v2, ret;
3960 
3961 
3962  /* parameters */
3963  int SFParam = FALSE;
3964  int numParam = FALSE;
3965 
3966  /* return values */
3967  int retSFVec3d = FALSE;
3968  int retNumeric = FALSE;
3969 
3970  /* is the "argv" parameter a string? */
3971  int param_isString;
3972  char *charString;
3973  jsdouble pars[3];
3974  JSString *_str;
3975 
3976  /* determine what kind of parameter to get */
3977  if ((op==__3FADD)||(op==__3FDOT)||(op==__3FCROSS)||(op==__3FSUBT))SFParam=TRUE;
3978  if ((op==__3FDIVIDE)||(op==__3FMULT))numParam=TRUE;
3979 
3980  /* determine the return value, if it is NOT a SFVec3d */
3981  if ((op==__3FDOT)||(op==__3FLENGTH)) retNumeric = TRUE;
3982  retSFVec3d = (!retNumeric);
3983 
3984  /* is the parameter a string, possibly gotten from the VRML/X3d
3985  * side of things? */
3986  param_isString = JSVAL_IS_STRING (*argv);
3987 
3988  /* get the parameter */
3989  if ((SFParam) || (numParam)) {
3990  if (numParam) {
3991  if (!JSVAL_IS_NUMBER(argv[0])) {
3992  printf ("SFVec3d param error - number expected\n");
3993  return JS_FALSE;
3994  }
3995  if (!JS_ValueToNumber(cx, argv[0], &d)) {
3996  printf("JS_ValueToNumber failed in SFVec3d.\n");
3997  return JS_FALSE;
3998  }
3999  } else {
4000  /* did this come in from VRML as a string, or did
4001  * it get created in javascript? */
4002  if (param_isString) {
4003  _str = JS_ValueToString(cx, *argv);
4004 #if JS_VERSION < 185
4005  charString = JS_GetStringBytes(_str);
4006 #else
4007  charString = JS_EncodeString(cx,_str);
4008 #endif
4009 
4010  if (sscanf(charString, "%lf %lf %lf",
4011  &(pars[0]), &(pars[1]), &(pars[2])) != 3) {
4012  printf ("conversion problem in SFVec3dGeneric\n");
4013  return JS_FALSE;
4014  }
4015  /* printf ("past scan, %f %f %f\n",pars[0], pars[1],pars[2]);*/
4016  } else {
4017  if (!JS_ConvertArguments(cx, argc, argv, "o", &_paramObj)) {
4018  printf( "JS_ConvertArguments failed in SFVec3d.\n");
4019  return JS_FALSE;
4020  }
4021 
4022  CHECK_CLASS(cx,_paramObj,argv,__FUNCTION__,SFVec3dClass)
4023 
4024  /* get the second object's data */
4025  if ((_vec2 = (SFVec3dNative*)JS_GetPrivate(cx, _paramObj)) == NULL) {
4026  printf( "JS_GetPrivate failed for _paramObj in SFVec3d.\n");
4027  return JS_FALSE;
4028  }
4029  pars[0]= (_vec2->v).c[0];
4030  pars[1] = (_vec2->v).c[1];
4031  pars[2] = (_vec2->v).c[2];
4032  }
4033  }
4034  }
4035 
4036  /* get our values */
4037  if ((_vec1 = (SFVec3dNative*)JS_GetPrivate(cx, obj)) == NULL) {
4038  printf( "JS_GetPrivate failed for obj in SFVec3dAdd.\n");
4039  return JS_FALSE;
4040  }
4041 
4042  /* do the operation */
4043  #ifdef JSVRMLCLASSESVERBOSE
4044  printf ("SFVec3d generic, vec2 %f %f %f\n",pars[0],pars[1],pars[2]);
4045  #endif
4046 
4047  switch (op) {
4048  /* returning a SFVec3d */
4049  case __3FADD:
4050  d0 = (_vec1->v).c[0] + pars[0];
4051  d1 = (_vec1->v).c[1] + pars[1];
4052  d2 = (_vec1->v).c[2] + pars[2];
4053  break;
4054  case __3FDIVIDE:
4055  d0 = (_vec1->v).c[0] / d;
4056  d1 = (_vec1->v).c[1] / d;
4057  d2 = (_vec1->v).c[2] / d;
4058  break;
4059  case __3FMULT:
4060  d0 = (_vec1->v).c[0] * d;
4061  d1 = (_vec1->v).c[1] * d;
4062  d2 = (_vec1->v).c[2] * d;
4063  break;
4064  case __3FSUBT:
4065  d0 = (_vec1->v).c[0] - pars[0];
4066  d1 = (_vec1->v).c[1] - pars[1];
4067  d2 = (_vec1->v).c[2] - pars[2];
4068  break;
4069  case __3FDOT:
4070  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
4071  v2.x = (float) pars[0]; v2.y=(float) pars[1];v2.z=(float) pars[2];
4072  d = vecdot (&v1, &v2);
4073  break;
4074  case __3FCROSS:
4075  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
4076  v2.x = (float) pars[0]; v2.y=(float) pars[1];v2.z=(float) pars[2];
4077  veccross(&ret, v1, v2);
4078  d0 = ret.x;d1 = ret.y, d2 = ret.z;
4079  break;
4080  case __3FLENGTH:
4081  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
4082  d = veclength(v1);
4083  break;
4084  case __3FNORMALIZE:
4085  v1.x = (_vec1->v).c[0]; v1.y=(_vec1->v).c[1];v1.z=(_vec1->v).c[2];
4086  vecnormal(&v1, &v1);
4087  d0 = v1.x; d1 = v1.y; d2 = v1.z;
4088  break;
4089  case __3FNEGATE:
4090  d0 = -(_vec1->v).c[0];
4091  d1 = -(_vec1->v).c[1];
4092  d2 = -(_vec1->v).c[2];
4093  break;
4094  default:
4095  printf ("woops... %d\n",op);
4096  return JS_FALSE;
4097  }
4098 
4099  #ifdef JSVRMLCLASSESVERBOSE
4100  printf ("past calcs\n");
4101  #endif
4102 
4103  /* set the return object */
4104  if (retSFVec3d) {
4105  #ifdef JSVRMLCLASSESVERBOSE
4106  printf ("returning SFVec3d\n");
4107  #endif
4108  if ((_proto = JS_GetPrototype(cx, obj)) == NULL) {
4109  printf( "JS_GetPrototype failed in SFVec3d.\n");
4110  return JS_FALSE;
4111  }
4112  if ((_retObj =
4113  JS_ConstructObject(cx, &SFVec3dClass, _proto, NULL)) == NULL) {
4114  printf( "JS_ConstructObject failed in SFVec3d.\n");
4115  return JS_FALSE;
4116  }
4117  *rval = OBJECT_TO_JSVAL(_retObj);
4118  if ((_retNative = (SFVec3dNative*)JS_GetPrivate(cx, _retObj)) == NULL) {
4119  printf( "JS_GetPrivate failed for _retObj in SFVec3d.\n");
4120  return JS_FALSE;
4121  }
4122  (_retNative->v).c[0] = d0;
4123  (_retNative->v).c[1] = d1;
4124  (_retNative->v).c[2] = d2;
4125  } else if (retNumeric) {
4126  if (JS_NewNumberValue(cx,d,rval) == JS_FALSE) {
4127  printf( "JS_NewDouble failed for %f in SFVec3d.\n",d);
4128  return JS_FALSE;
4129  }
4130  }
4131  #ifdef JSVRMLCLASSESVERBOSE
4132  if (retSFVec3d){
4133  printf("SFVec3dgeneric: obj = %p, result = [%.9g, %.9g, %.9g]\n",
4134  obj,
4135  (_retNative->v).c[0], (_retNative->v).c[1],
4136  (_retNative->v).c[2]);
4137  }
4138  if (retNumeric){
4139  printf("SFVec2fgeneric: obj = %p, result = %.9g\n",
4140  obj, d);
4141  }
4142  #endif
4143 return JS_TRUE;
4144 }
4145 
4146 JSBool
4147 #if JS_VERSION < 185
4148 SFVec3dAdd(JSContext *cx, JSObject *obj,
4149  uintN argc, jsval *argv, jsval *rval) {
4150  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FADD);
4151 #else
4152 SFVec3dAdd(JSContext *cx, uintN argc, jsval *vp) {
4153  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4154  jsval *argv = JS_ARGV(cx,vp);
4155  jsval rval;
4156  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FADD);
4157  JS_SET_RVAL(cx,vp,rval);
4158  return retval;
4159 #endif
4160 }
4161 
4162 JSBool
4163 #if JS_VERSION < 185
4164 SFVec3dCross(JSContext *cx, JSObject *obj,
4165  uintN argc, jsval *argv, jsval *rval) {
4166  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FCROSS);
4167 #else
4168 SFVec3dCross(JSContext *cx, uintN argc, jsval *vp) {
4169  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4170  jsval *argv = JS_ARGV(cx,vp);
4171  jsval rval;
4172  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FCROSS);
4173  JS_SET_RVAL(cx,vp,rval);
4174  return retval;
4175 #endif
4176 }
4177 
4178 JSBool
4179 #if JS_VERSION < 185
4180 SFVec3dDivide(JSContext *cx, JSObject *obj,
4181  uintN argc, jsval *argv, jsval *rval) {
4182  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FDIVIDE);
4183 #else
4184 SFVec3dDivide(JSContext *cx, uintN argc, jsval *vp) {
4185  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4186  jsval *argv = JS_ARGV(cx,vp);
4187  jsval rval;
4188  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FDIVIDE);
4189  JS_SET_RVAL(cx,vp,rval);
4190  return retval;
4191 #endif
4192 }
4193 
4194 JSBool
4195 #if JS_VERSION < 185
4196 SFVec3dDot(JSContext *cx, JSObject *obj,
4197  uintN argc, jsval *argv, jsval *rval) {
4198  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FDOT);
4199 #else
4200 SFVec3dDot(JSContext *cx, uintN argc, jsval *vp) {
4201  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4202  jsval *argv = JS_ARGV(cx,vp);
4203  jsval rval;
4204  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FDOT);
4205  JS_SET_RVAL(cx,vp,rval);
4206  return retval;
4207 #endif
4208 }
4209 
4210 JSBool
4211 #if JS_VERSION < 185
4212 SFVec3dLength(JSContext *cx, JSObject *obj,
4213  uintN argc, jsval *argv, jsval *rval) {
4214  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FLENGTH);
4215 #else
4216 SFVec3dLength(JSContext *cx, uintN argc, jsval *vp) {
4217  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4218  jsval *argv = JS_ARGV(cx,vp);
4219  jsval rval;
4220  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FLENGTH);
4221  JS_SET_RVAL(cx,vp,rval);
4222  return retval;
4223 #endif
4224 }
4225 
4226 
4227 JSBool
4228 #if JS_VERSION < 185
4229 SFVec3dMultiply(JSContext *cx, JSObject *obj,
4230  uintN argc, jsval *argv, jsval *rval) {
4231  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FMULT);
4232 #else
4233 SFVec3dMultiply(JSContext *cx, uintN argc, jsval *vp) {
4234  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4235  jsval *argv = JS_ARGV(cx,vp);
4236  jsval rval;
4237  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FMULT);
4238  JS_SET_RVAL(cx,vp,rval);
4239  return retval;
4240 #endif
4241 }
4242 
4243 
4244 JSBool
4245 #if JS_VERSION < 185
4246 SFVec3dNegate(JSContext *cx, JSObject *obj,
4247  uintN argc, jsval *argv, jsval *rval) {
4248  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FNEGATE);
4249 #else
4250 SFVec3dNegate(JSContext *cx, uintN argc, jsval *vp) {
4251  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4252  jsval *argv = JS_ARGV(cx,vp);
4253  jsval rval;
4254  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FNEGATE);
4255  JS_SET_RVAL(cx,vp,rval);
4256  return retval;
4257 #endif
4258 }
4259 
4260 JSBool
4261 #if JS_VERSION < 185
4262 SFVec3dNormalize(JSContext *cx, JSObject *obj,
4263  uintN argc, jsval *argv, jsval *rval) {
4264  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FNORMALIZE);
4265 #else
4266 SFVec3dNormalize(JSContext *cx, uintN argc, jsval *vp) {
4267  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4268  jsval *argv = JS_ARGV(cx,vp);
4269  jsval rval;
4270  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FNORMALIZE);
4271  JS_SET_RVAL(cx,vp,rval);
4272  return retval;
4273 #endif
4274 }
4275 
4276 JSBool
4277 #if JS_VERSION < 185
4278 SFVec3dSubtract(JSContext *cx, JSObject *obj,
4279  uintN argc, jsval *argv, jsval *rval) {
4280  return SFVec3dGeneric(cx, obj, argc, argv, rval, __3FSUBT);
4281 #else
4282 SFVec3dSubtract(JSContext *cx, uintN argc, jsval *vp) {
4283  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4284  jsval *argv = JS_ARGV(cx,vp);
4285  jsval rval;
4286  JSBool retval = SFVec3dGeneric(cx, obj, argc, argv, &rval, __3FSUBT);
4287  JS_SET_RVAL(cx,vp,rval);
4288  return retval;
4289 #endif
4290 }
4291 
4292 JSBool
4293 #if JS_VERSION < 185
4294 SFVec3dToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4295 #else
4296 SFVec3dToString(JSContext *cx, uintN argc, jsval *vp) {
4297  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4298  jsval *argv = JS_ARGV(cx,vp);
4299 #endif
4300  SFVec3dNative *ptr;
4301  JSString *_str;
4302  char buff[STRING];
4303 
4304  UNUSED(argc);
4305  UNUSED(argv);
4306  if ((ptr = (SFVec3dNative *)JS_GetPrivate(cx, obj)) == NULL) {
4307  printf( "JS_GetPrivate failed in SFVec3dToString.\n");
4308  return JS_FALSE;
4309  }
4310 
4311  memset(buff, 0, STRING);
4312  sprintf(buff, "%.9g %.9g %.9g",
4313  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
4314  _str = JS_NewStringCopyZ(cx, buff);
4315 #if JS_VERSION < 185
4316  *rval = STRING_TO_JSVAL(_str);
4317 #else
4318  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
4319 #endif
4320 
4321  #ifdef JSVRMLCLASSESVERBOSE
4322  printf ("SFVec3dToString, string is :%s:\n",buff);
4323  #endif
4324 
4325  return JS_TRUE;
4326 }
4327 
4328 JSBool
4329 #if JS_VERSION < 185
4330 SFVec3dAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4331 #else
4332 SFVec3dAssign(JSContext *cx, uintN argc, jsval *vp) {
4333  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4334  jsval *argv = JS_ARGV(cx,vp);
4335  JSString *_id_jsstr;
4336 #endif
4337  JSObject *_from_obj;
4338  SFVec3dNative *fptr, *ptr;
4339  char *_id_str;
4340 
4341  UNUSED(_id_str); // compiler warning mitigation
4342 
4343 
4344  #ifdef JSVRMLCLASSESVERBOSE
4345  printf ("start of SFVec3dAssign\n");
4346  #endif
4347 
4348  if ((ptr = (SFVec3dNative *)JS_GetPrivate(cx, obj)) == NULL) {
4349  printf( "JS_GetPrivate failed for obj in SFVec3dAssign.\n");
4350  return JS_FALSE;
4351  }
4352 
4353  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFVec3dClass)
4354 
4355 #if JS_VERSION < 185
4356  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
4357 #else
4358  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
4359  _id_str = JS_EncodeString(cx,_id_jsstr);
4360  } else {
4361 #endif
4362  printf( "JS_ConvertArguments failed in SFVec3dAssign.\n");
4363  return JS_FALSE;
4364  }
4365 
4366  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFVec3dClass)
4367 
4368  if ((fptr = (SFVec3dNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
4369  printf( "JS_GetPrivate failed for _from_obj in SFVec3dAssign.\n");
4370  return JS_FALSE;
4371  }
4372  #ifdef JSVRMLCLASSESVERBOSE
4373  printf("SFVec3dAssign: obj = %p, id = \"%s\", from = %p\n",
4374  obj, _id_str, _from_obj);
4375  #endif
4376 
4377  SFVec3dNativeAssign(ptr, fptr);
4378 #if JS_VERSION < 185
4379  *rval = OBJECT_TO_JSVAL(obj);
4380 #else
4381  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
4382 #endif
4383 
4384  #ifdef JSVRMLCLASSESVERBOSE
4385  printf ("end of SFVec3dAssign\n");
4386  #endif
4387 
4388  return JS_TRUE;
4389 }
4390 
4391 JSBool
4392 #if JS_VERSION < 185
4393 SFVec3dConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4394 #else
4395 SFVec3dConstr(JSContext *cx, uintN argc, jsval *vp) {
4396  JSObject *obj = JS_NewObject(cx,&SFVec3dClass,NULL,NULL);
4397  jsval *argv = JS_ARGV(cx,vp);
4398 #endif
4399  SFVec3dNative *ptr;
4400  jsdouble pars[3];
4401 
4402  #ifdef JSVRMLCLASSESVERBOSE
4403  printf ("start of SFVec3dConstr\n");
4404  #endif
4405 
4406  ADD_ROOT(cx,obj)
4407 
4408  if ((ptr = (SFVec3dNative *) SFVec3dNativeNew()) == NULL) {
4409  printf( "SFVec3dNativeNew failed in SFVec3dConstr.\n");
4410  return JS_FALSE;
4411  }
4412 
4413  //if (!JS_DefineProperties(cx, obj, SFVec3dProperties)) {
4414  // printf( "JS_DefineProperties failed in SFVec3dConstr.\n");
4415  // return JS_FALSE;
4416  //}
4417  if (!JS_SetPrivate(cx, obj, ptr)) {
4418  printf( "JS_SetPrivate failed in SFVec3dConstr.\n");
4419  return JS_FALSE;
4420  }
4421 
4422  if (argc == 0) {
4423  (ptr->v).c[0] = (float) 0.0;
4424  (ptr->v).c[1] = (float) 0.0;
4425  (ptr->v).c[2] = (float) 0.0;
4426  } else {
4427  if (!JS_ConvertArguments(cx, argc, argv, "d d d",
4428  &(pars[0]), &(pars[1]), &(pars[2]))) {
4429  printf( "JS_ConvertArguments failed in SFVec3dConstr.\n");
4430  return JS_FALSE;
4431  }
4432  (ptr->v).c[0] = (float) pars[0];
4433  (ptr->v).c[1] = (float) pars[1];
4434  (ptr->v).c[2] = (float) pars[2];
4435  }
4436  #ifdef JSVRMLCLASSESVERBOSE
4437  printf("SFVec3dConstr: obj = %p, %u args, %f %f %f\n",
4438  obj, argc,
4439  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2]);
4440  #endif
4441 
4442  ptr->valueChanged = 1;
4443 
4444 #if JS_VERSION < 185
4445  *rval = OBJECT_TO_JSVAL(obj);
4446 #else
4447  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
4448 #endif
4449  return JS_TRUE;
4450 }
4451 
4452 JSBool
4453 #if JS_VERSION < 185
4454 SFVec3dGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
4455 #else
4456 SFVec3dGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
4457 #endif
4458 {
4459  SFVec3dNative *ptr;
4460  jsdouble d;
4461  #ifdef JSVRMLCLASSESVERBOSE
4462  JSString *_idStr;
4463  char *_id_c;
4464  #endif
4465 #if JS_VERSION >= 185
4466  jsval id;
4467  if (!JS_IdToValue(cx,iid,&id)) {
4468  printf("JS_IdToValue failed in SFVec3dGetProperty.\n");
4469  return JS_FALSE;
4470  }
4471 #endif
4472 
4473  #ifdef JSVRMLCLASSESVERBOSE
4474 
4475 
4476 /* same as earlier, these are never used
4477  _idStr = JS_ValueToString(cx, id);
4478  _id_c = JS_GetStringBytes(_idStr); */
4479  _idStr = JS_ValueToString(cx, *vp);
4480 #if JS_VERSION < 185
4481  _id_c = JS_GetStringBytes(_idStr);
4482 #else
4483  _id_c = JS_EncodeString(cx,_idStr);
4484 #endif
4485  #endif
4486 
4487  if ((ptr = (SFVec3dNative *)JS_GetPrivate(cx,obj)) == NULL) {
4488  printf( "JS_GetPrivate failed in SFVec3dGetProperty.\n");
4489  return JS_FALSE;
4490  }
4491 
4492  if (JSVAL_IS_INT(id)) {
4493  switch (JSVAL_TO_INT(id)) {
4494  case 0:
4495  d = (ptr->v).c[0];
4496  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4497  printf(
4498  "JS_NewDouble failed for %f in SFVec3dGetProperty.\n",
4499  d);
4500  return JS_FALSE;
4501  }
4502  break;
4503  case 1:
4504  d = (ptr->v).c[1];
4505  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4506  printf(
4507  "JS_NewDouble failed for %f in SFVec3dGetProperty.\n",
4508  d);
4509  return JS_FALSE;
4510  }
4511  break;
4512  case 2:
4513  d = (ptr->v).c[2];
4514  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4515  printf(
4516  "JS_NewDouble failed for %f in SFVec3dGetProperty.\n",
4517  d);
4518  return JS_FALSE;
4519  }
4520  break;
4521  }
4522  } else {
4523  #ifdef JSVRMLCLASSESVERBOSE
4524  printf ("SFVec3dGetProperty, id is NOT an int...\n");
4525  #endif
4526  }
4527 
4528  return JS_TRUE;
4529 }
4530 
4531 JSBool
4532 #if JS_VERSION < 185
4533 SFVec3dSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
4534 #else
4535 SFVec3dSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
4536 #endif
4537 {
4538  SFVec3dNative *ptr;
4539  jsval myv;
4540 #if JS_VERSION >= 185
4541  jsval id;
4542  if (!JS_IdToValue(cx,iid,&id)) {
4543  printf("JS_IdToValue failed in SFVec3dSetProperty.\n");
4544  return JS_FALSE;
4545  }
4546 #endif
4547 
4548  if ((ptr = (SFVec3dNative *)JS_GetPrivate(cx, obj)) == NULL) {
4549  printf( "JS_GetPrivate failed in SFVec3dSetProperty.\n");
4550  return JS_FALSE;
4551  }
4552  ptr->valueChanged++;
4553  #ifdef JSVRMLCLASSESVERBOSE
4554  printf("SFVec3dSetProperty: obj = %p, id = %d, valueChanged = %d\n",
4555  obj, JSVAL_TO_INT(id), ptr->valueChanged);
4556  #endif
4557 
4558  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
4559  printf( "JS_ConvertValue failed in SFVec3dSetProperty.\n");
4560  return JS_FALSE;
4561  }
4562 
4563  if (JSVAL_IS_INT(id)) {
4564  switch (JSVAL_TO_INT(id)) {
4565  case 0:
4566 #if JS_VERSION < 185
4567  (ptr->v).c[0] = *JSVAL_TO_DOUBLE(myv);
4568 #else
4569  (ptr->v).c[0] = JSVAL_TO_DOUBLE(myv);
4570 #endif
4571  break;
4572  case 1:
4573 #if JS_VERSION < 185
4574  (ptr->v).c[1] = *JSVAL_TO_DOUBLE(myv);
4575 #else
4576  (ptr->v).c[1] = JSVAL_TO_DOUBLE(myv);
4577 #endif
4578  break;
4579  case 2:
4580 #if JS_VERSION < 185
4581  (ptr->v).c[2] = *JSVAL_TO_DOUBLE(myv);
4582 #else
4583  (ptr->v).c[2] = JSVAL_TO_DOUBLE(myv);
4584 #endif
4585  break;
4586  }
4587  }
4588  return JS_TRUE;
4589 }
4590 
4591 
4592 JSBool
4593 #if JS_VERSION < 185
4594 SFVec4fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4595 #else
4596 SFVec4fToString(JSContext *cx, uintN argc, jsval *vp) {
4597  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4598  jsval *argv = JS_ARGV(cx,vp);
4599 #endif
4600  SFVec4fNative *ptr;
4601  JSString *_str;
4602  char buff[STRING];
4603 
4604  UNUSED(argc);
4605  UNUSED(argv);
4606  if ((ptr = (SFVec4fNative *)JS_GetPrivate(cx, obj)) == NULL) {
4607  printf( "JS_GetPrivate failed in SFVec4fToString.\n");
4608  return JS_FALSE;
4609  }
4610 
4611  memset(buff, 0, STRING);
4612  sprintf(buff, "%.9g %.9g %.9g %.9g",
4613  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2],ptr->v.c[3]);
4614  _str = JS_NewStringCopyZ(cx, buff);
4615 #if JS_VERSION < 185
4616  *rval = STRING_TO_JSVAL(_str);
4617 #else
4618  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
4619 #endif
4620 
4621  #ifdef JSVRMLCLASSESVERBOSE
4622  printf ("SFVec4fToString, string is :%s:\n",buff);
4623  #endif
4624 
4625  return JS_TRUE;
4626 }
4627 
4628 JSBool
4629 #if JS_VERSION < 185
4630 SFVec4fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4631 #else
4632 SFVec4fAssign(JSContext *cx, uintN argc, jsval *vp) {
4633  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4634  jsval *argv = JS_ARGV(cx,vp);
4635  JSString *_id_jsstr;
4636 #endif
4637  JSObject *_from_obj;
4638  SFVec4fNative *fptr, *ptr;
4639  char *_id_str;
4640 
4641  UNUSED(_id_str); // compiler warning mitigation
4642 
4643 
4644  #ifdef JSVRMLCLASSESVERBOSE
4645  printf ("start of SFVec4fAssign\n");
4646  #endif
4647 
4648  if ((ptr = (SFVec4fNative *)JS_GetPrivate(cx, obj)) == NULL) {
4649  printf( "JS_GetPrivate failed for obj in SFVec4fAssign.\n");
4650  return JS_FALSE;
4651  }
4652 
4653  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFVec4fClass)
4654 
4655 #if JS_VERSION < 185
4656  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
4657 #else
4658  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
4659  _id_str = JS_EncodeString(cx,_id_jsstr);
4660  } else {
4661 #endif
4662  printf( "JS_ConvertArguments failed in SFVec4fAssign.\n");
4663  return JS_FALSE;
4664  }
4665 
4666  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFVec4fClass)
4667 
4668  if ((fptr = (SFVec4fNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
4669  printf( "JS_GetPrivate failed for _from_obj in SFVec4fAssign.\n");
4670  return JS_FALSE;
4671  }
4672  #ifdef JSVRMLCLASSESVERBOSE
4673  printf("SFVec4fAssign: obj = %p, id = \"%s\", from = %p\n",
4674  obj, _id_str, _from_obj);
4675  #endif
4676 
4677  SFVec4fNativeAssign(ptr, fptr);
4678 #if JS_VERSION < 185
4679  *rval = OBJECT_TO_JSVAL(obj);
4680 #else
4681  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
4682 #endif
4683 
4684  #ifdef JSVRMLCLASSESVERBOSE
4685  printf ("end of SFVec4fAssign\n");
4686  #endif
4687 
4688  return JS_TRUE;
4689 }
4690 
4691 JSBool
4692 #if JS_VERSION < 185
4693 SFVec4fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4694 #else
4695 SFVec4fConstr(JSContext *cx, uintN argc, jsval *vp) {
4696  JSObject *obj = JS_NewObject(cx,&SFVec4fClass,NULL,NULL);
4697  jsval *argv = JS_ARGV(cx,vp);
4698 #endif
4699  SFVec4fNative *ptr;
4700  jsdouble pars[4];
4701 
4702  #ifdef JSVRMLCLASSESVERBOSE
4703  printf ("start of SFVec4fConstr\n");
4704  #endif
4705 
4706  ADD_ROOT(cx,obj)
4707 
4708  if ((ptr = (SFVec4fNative *) SFVec4fNativeNew()) == NULL) {
4709  printf( "SFVec4fNativeNew failed in SFVec4fConstr.\n");
4710  return JS_FALSE;
4711  }
4712 
4713  //if (!JS_DefineProperties(cx, obj, SFVec4fProperties)) {
4714  // printf( "JS_DefineProperties failed in SFVec4fConstr.\n");
4715  // return JS_FALSE;
4716  //}
4717  if (!JS_SetPrivate(cx, obj, ptr)) {
4718  printf( "JS_SetPrivate failed in SFVec4fConstr.\n");
4719  return JS_FALSE;
4720  }
4721 
4722  if (argc == 0) {
4723  (ptr->v).c[0] = (float) 0.0;
4724  (ptr->v).c[1] = (float) 0.0;
4725  (ptr->v).c[2] = (float) 0.0;
4726  (ptr->v).c[3] = (float) 0.0;
4727  } else {
4728  if (!JS_ConvertArguments(cx, argc, argv, "d d d d",
4729  &(pars[0]), &(pars[1]), &(pars[2]), &(pars[3]))) {
4730  printf( "JS_ConvertArguments failed in SFVec4fConstr.\n");
4731  return JS_FALSE;
4732  }
4733  (ptr->v).c[0] = (float) pars[0];
4734  (ptr->v).c[1] = (float) pars[1];
4735  (ptr->v).c[2] = (float) pars[2];
4736  (ptr->v).c[3] = (float) pars[3];
4737  }
4738  #ifdef JSVRMLCLASSESVERBOSE
4739  printf("SFVec4fConstr: obj = %p, %u args, %f %f %f %f\n",
4740  obj, argc,
4741  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2], ptr->v.c[3]);
4742  #endif
4743 
4744  ptr->valueChanged = 1;
4745 
4746 #if JS_VERSION < 185
4747  *rval = OBJECT_TO_JSVAL(obj);
4748 #else
4749  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
4750 #endif
4751  return JS_TRUE;
4752 }
4753 
4754 JSBool
4755 #if JS_VERSION < 185
4756 SFVec4fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
4757 #else
4758 SFVec4fGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
4759 #endif
4760 {
4761  SFVec4fNative *ptr;
4762  jsdouble d;
4763  #ifdef JSVRMLCLASSESVERBOSE
4764  JSString *_idStr;
4765  char *_id_c;
4766  #endif
4767 #if JS_VERSION >= 185
4768  jsval id;
4769  if (!JS_IdToValue(cx,iid,&id)) {
4770  printf("JS_IdToValue failed in SFVec4fGetProperty.\n");
4771  return JS_FALSE;
4772  }
4773 #endif
4774 
4775  #ifdef JSVRMLCLASSESVERBOSE
4776 
4777  //JSString *_idStr;
4778  //char *_id_c;
4779 
4780 /* same as above
4781  _idStr = JS_ValueToString(cx, id);
4782  _id_c = JS_GetStringBytes(_idStr); */
4783  _idStr = JS_ValueToString(cx, *vp);
4784 #if JS_VERSION < 185
4785  _id_c = JS_GetStringBytes(_idStr);
4786 #else
4787  _id_c = JS_EncodeString(cx,_idStr);
4788 #endif
4789  #endif
4790 
4791  if ((ptr = (SFVec4fNative *)JS_GetPrivate(cx,obj)) == NULL) {
4792  printf( "JS_GetPrivate failed in SFVec4fGetProperty.\n");
4793  return JS_FALSE;
4794  }
4795 
4796  if (JSVAL_IS_INT(id)) {
4797  switch (JSVAL_TO_INT(id)) {
4798  case 0:
4799  d = (ptr->v).c[0];
4800  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4801  printf(
4802  "JS_NewDouble failed for %f in SFVec4fGetProperty.\n",
4803  d);
4804  return JS_FALSE;
4805  }
4806  break;
4807  case 1:
4808  d = (ptr->v).c[1];
4809  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4810  printf(
4811  "JS_NewDouble failed for %f in SFVec4fGetProperty.\n",
4812  d);
4813  return JS_FALSE;
4814  }
4815  break;
4816  case 2:
4817  d = (ptr->v).c[2];
4818  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4819  printf(
4820  "JS_NewDouble failed for %f in SFVec4fGetProperty.\n",
4821  d);
4822  return JS_FALSE;
4823  }
4824  break;
4825  case 3:
4826  d = (ptr->v).c[3];
4827  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
4828  printf(
4829  "JS_NewDouble failed for %f in SFVec4fGetProperty.\n",
4830  d);
4831  return JS_FALSE;
4832  }
4833  break;
4834  }
4835  } else {
4836  #ifdef JSVRMLCLASSESVERBOSE
4837  printf ("SFVec4fGetProperty, id is NOT an int...\n");
4838  #endif
4839  }
4840 
4841  return JS_TRUE;
4842 }
4843 
4844 JSBool
4845 #if JS_VERSION < 185
4846 SFVec4fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
4847 #else
4848 SFVec4fSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
4849 #endif
4850 {
4851  SFVec4fNative *ptr;
4852  jsval myv;
4853 #if JS_VERSION >= 185
4854  jsval id;
4855  if (!JS_IdToValue(cx,iid,&id)) {
4856  printf("JS_IdToValue failed in SFVec4fSetProperty.\n");
4857  return JS_FALSE;
4858  }
4859 #endif
4860 
4861  if ((ptr = (SFVec4fNative *)JS_GetPrivate(cx, obj)) == NULL) {
4862  printf( "JS_GetPrivate failed in SFVec4fSetProperty.\n");
4863  return JS_FALSE;
4864  }
4865  ptr->valueChanged++;
4866  #ifdef JSVRMLCLASSESVERBOSE
4867  printf("SFVec4fSetProperty: obj = %p, id = %d, valueChanged = %d\n",
4868  obj, JSVAL_TO_INT(id), ptr->valueChanged);
4869  #endif
4870 
4871  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
4872  printf( "JS_ConvertValue failed in SFVec4fSetProperty.\n");
4873  return JS_FALSE;
4874  }
4875 
4876  if (JSVAL_IS_INT(id)) {
4877  switch (JSVAL_TO_INT(id)) {
4878  case 0:
4879 #if JS_VERSION < 185
4880  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(myv);
4881 #else
4882  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(myv);
4883 #endif
4884  break;
4885  case 1:
4886 #if JS_VERSION < 185
4887  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(myv);
4888 #else
4889  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(myv);
4890 #endif
4891  break;
4892  case 2:
4893 #if JS_VERSION < 185
4894  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(myv);
4895 #else
4896  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(myv);
4897 #endif
4898  break;
4899  case 3:
4900 #if JS_VERSION < 185
4901  (ptr->v).c[3] = (float) *JSVAL_TO_DOUBLE(myv);
4902 #else
4903  (ptr->v).c[3] = (float) JSVAL_TO_DOUBLE(myv);
4904 #endif
4905  break;
4906  }
4907  }
4908  return JS_TRUE;
4909 }
4910 
4911 
4912 
4913 JSBool
4914 #if JS_VERSION < 185
4915 SFVec4dToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4916 #else
4917 SFVec4dToString(JSContext *cx, uintN argc, jsval *vp) {
4918  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4919  jsval *argv = JS_ARGV(cx,vp);
4920 #endif
4921  SFVec4dNative *ptr;
4922  JSString *_str;
4923  char buff[STRING];
4924 
4925  UNUSED(argc);
4926  UNUSED(argv);
4927  if ((ptr = (SFVec4dNative *)JS_GetPrivate(cx, obj)) == NULL) {
4928  printf( "JS_GetPrivate failed in SFVec4dToString.\n");
4929  return JS_FALSE;
4930  }
4931 
4932  memset(buff, 0, STRING);
4933  sprintf(buff, "%.9g %.9g %.9g %.9g",
4934  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2],ptr->v.c[3]);
4935  _str = JS_NewStringCopyZ(cx, buff);
4936 
4937 #if JS_VERSION < 185
4938  *rval = STRING_TO_JSVAL(_str);
4939 #else
4940  JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(_str));
4941 #endif
4942 
4943  #ifdef JSVRMLCLASSESVERBOSE
4944  printf ("SFVec4dToString, string is :%s:\n",buff);
4945  #endif
4946 
4947  return JS_TRUE;
4948 }
4949 
4950 JSBool
4951 #if JS_VERSION < 185
4952 SFVec4dAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4953 #else
4954 SFVec4dAssign(JSContext *cx, uintN argc, jsval *vp) {
4955  JSObject *obj = JS_THIS_OBJECT(cx,vp);
4956  jsval *argv = JS_ARGV(cx,vp);
4957  JSString *_id_jsstr;
4958 #endif
4959  JSObject *_from_obj;
4960  SFVec4dNative *fptr, *ptr;
4961  char *_id_str;
4962 
4963  UNUSED(_id_str); // compiler warning mitigation
4964 
4965  #ifdef JSVRMLCLASSESVERBOSE
4966  printf ("start of SFVec4dAssign\n");
4967  #endif
4968 
4969  if ((ptr = (SFVec4dNative *)JS_GetPrivate(cx, obj)) == NULL) {
4970  printf( "JS_GetPrivate failed for obj in SFVec4dAssign.\n");
4971  return JS_FALSE;
4972  }
4973 
4974  CHECK_CLASS(cx,obj,argv,__FUNCTION__,SFVec4dClass)
4975 
4976 #if JS_VERSION < 185
4977  if (!JS_ConvertArguments(cx, argc, argv, "o s", &_from_obj, &_id_str)) {
4978 #else
4979  if (JS_ConvertArguments(cx, argc, argv, "oS", &_from_obj, &_id_jsstr) == JS_TRUE) {
4980  _id_str = JS_EncodeString(cx,_id_jsstr);
4981  } else {
4982 #endif
4983  printf( "JS_ConvertArguments failed in SFVec4dAssign.\n");
4984  return JS_FALSE;
4985  }
4986 
4987  CHECK_CLASS(cx,_from_obj,argv,__FUNCTION__,SFVec4dClass)
4988 
4989  if ((fptr = (SFVec4dNative *)JS_GetPrivate(cx, _from_obj)) == NULL) {
4990  printf( "JS_GetPrivate failed for _from_obj in SFVec4dAssign.\n");
4991  return JS_FALSE;
4992  }
4993  #ifdef JSVRMLCLASSESVERBOSE
4994  printf("SFVec4dAssign: obj = %p, id = \"%s\", from = %p\n",
4995  obj, _id_str, _from_obj);
4996  #endif
4997 
4998  SFVec4dNativeAssign(ptr, fptr);
4999 #if JS_VERSION < 185
5000  *rval = OBJECT_TO_JSVAL(obj);
5001 #else
5002  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
5003 #endif
5004 
5005  #ifdef JSVRMLCLASSESVERBOSE
5006  printf ("end of SFVec4dAssign\n");
5007  #endif
5008 
5009  return JS_TRUE;
5010 }
5011 
5012 JSBool
5013 #if JS_VERSION < 185
5014 SFVec4dConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
5015 #else
5016 SFVec4dConstr(JSContext *cx, uintN argc, jsval *vp) {
5017  JSObject *obj = JS_NewObject(cx,&SFVec4dClass,NULL,NULL);
5018  jsval *argv = JS_ARGV(cx,vp);
5019 #endif
5020  SFVec4dNative *ptr;
5021  jsdouble pars[4];
5022 
5023  #ifdef JSVRMLCLASSESVERBOSE
5024  printf ("start of SFVec4dConstr\n");
5025  #endif
5026 
5027  ADD_ROOT(cx,obj)
5028 
5029  if ((ptr = (SFVec4dNative *) SFVec4dNativeNew()) == NULL) {
5030  printf( "SFVec4dNativeNew failed in SFVec4dConstr.\n");
5031  return JS_FALSE;
5032  }
5033 
5034  //if (!JS_DefineProperties(cx, obj, SFVec4dProperties)) {
5035  // printf( "JS_DefineProperties failed in SFVec4dConstr.\n");
5036  // return JS_FALSE;
5037  //}
5038  if (!JS_SetPrivate(cx, obj, ptr)) {
5039  printf( "JS_SetPrivate failed in SFVec4dConstr.\n");
5040  return JS_FALSE;
5041  }
5042 
5043  if (argc == 0) {
5044  (ptr->v).c[0] = (float) 0.0;
5045  (ptr->v).c[1] = (float) 0.0;
5046  (ptr->v).c[2] = (float) 0.0;
5047  (ptr->v).c[3] = (float) 0.0;
5048  } else {
5049  if (!JS_ConvertArguments(cx, argc, argv, "d d d d",
5050  &(pars[0]), &(pars[1]), &(pars[2]), &(pars[3]))) {
5051  printf( "JS_ConvertArguments failed in SFVec4dConstr.\n");
5052  return JS_FALSE;
5053  }
5054  (ptr->v).c[0] = (float) pars[0];
5055  (ptr->v).c[1] = (float) pars[1];
5056  (ptr->v).c[2] = (float) pars[2];
5057  (ptr->v).c[3] = (float) pars[3];
5058  }
5059  #ifdef JSVRMLCLASSESVERBOSE
5060  printf("SFVec4dConstr: obj = %p, %u args, %f %f %f %f\n",
5061  obj, argc,
5062  (ptr->v).c[0], (ptr->v).c[1], (ptr->v).c[2], ptr->v.c[3]);
5063  #endif
5064 
5065  ptr->valueChanged = 1;
5066 
5067 #if JS_VERSION < 185
5068  *rval = OBJECT_TO_JSVAL(obj);
5069 #else
5070  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
5071 #endif
5072  return JS_TRUE;
5073 }
5074 
5075 JSBool
5076 #if JS_VERSION < 185
5077 SFVec4dGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
5078 #else
5079 SFVec4dGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
5080 #endif
5081 {
5082  SFVec4dNative *ptr;
5083  jsdouble d;
5084  #ifdef JSVRMLCLASSESVERBOSE
5085  JSString *_idStr;
5086  char *_id_c;
5087  #endif
5088 #if JS_VERSION >= 185
5089  jsval id;
5090  if (!JS_IdToValue(cx,iid,&id)) {
5091  printf("JS_IdToValue failed in SFVec4dGetProperty.\n");
5092  return JS_FALSE;
5093  }
5094 #endif
5095 
5096  #ifdef JSVRMLCLASSESVERBOSE
5097 
5098 /* _idStr = JS_ValueToString(cx, id);
5099  _id_c = JS_GetStringBytes(_idStr);*/
5100  _idStr = JS_ValueToString(cx, *vp);
5101 #if JS_VERSION < 185
5102  _id_c = JS_GetStringBytes(_idStr);
5103 #else
5104  _id_c = JS_EncodeString(cx,_idStr);
5105 #endif
5106  #endif
5107 
5108  if ((ptr = (SFVec4dNative *)JS_GetPrivate(cx,obj)) == NULL) {
5109  printf( "JS_GetPrivate failed in SFVec4dGetProperty.\n");
5110  return JS_FALSE;
5111  }
5112 
5113  if (JSVAL_IS_INT(id)) {
5114  switch (JSVAL_TO_INT(id)) {
5115  case 0:
5116  d = (ptr->v).c[0];
5117  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
5118  printf(
5119  "JS_NewDouble failed for %f in SFVec4dGetProperty.\n",
5120  d);
5121  return JS_FALSE;
5122  }
5123  break;
5124  case 1:
5125  d = (ptr->v).c[1];
5126  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
5127  printf(
5128  "JS_NewDouble failed for %f in SFVec4dGetProperty.\n",
5129  d);
5130  return JS_FALSE;
5131  }
5132  break;
5133  case 2:
5134  d = (ptr->v).c[2];
5135  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
5136  printf(
5137  "JS_NewDouble failed for %f in SFVec4dGetProperty.\n",
5138  d);
5139  return JS_FALSE;
5140  }
5141  break;
5142  case 3:
5143  d = (ptr->v).c[3];
5144  if (JS_NewNumberValue(cx, d, vp) == JS_FALSE) {
5145  printf(
5146  "JS_NewDouble failed for %f in SFVec4dGetProperty.\n",
5147  d);
5148  return JS_FALSE;
5149  }
5150  break;
5151  }
5152  } else {
5153  #ifdef JSVRMLCLASSESVERBOSE
5154  printf ("SFVec4dGetProperty, id is NOT an int...\n");
5155  #endif
5156  }
5157 
5158  return JS_TRUE;
5159 }
5160 
5161 JSBool
5162 #if JS_VERSION < 185
5163 SFVec4dSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
5164 #else
5165 SFVec4dSetProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp)
5166 #endif
5167 {
5168  SFVec4dNative *ptr;
5169  jsval myv;
5170 #if JS_VERSION >= 185
5171  jsval id;
5172  if (!JS_IdToValue(cx,iid,&id)) {
5173  printf("JS_IdToValue failed in SFVec4dSetProperty.\n");
5174  return JS_FALSE;
5175  }
5176 #endif
5177 
5178  if ((ptr = (SFVec4dNative *)JS_GetPrivate(cx, obj)) == NULL) {
5179  printf( "JS_GetPrivate failed in SFVec4dSetProperty.\n");
5180  return JS_FALSE;
5181  }
5182  ptr->valueChanged++;
5183  #ifdef JSVRMLCLASSESVERBOSE
5184  printf("SFVec4dSetProperty: obj = %p, id = %d, valueChanged = %d\n",
5185  obj, JSVAL_TO_INT(id), ptr->valueChanged);
5186  #endif
5187 
5188  if (!JS_ConvertValue(cx, *vp, JSTYPE_NUMBER, &myv)) {
5189  printf( "JS_ConvertValue failed in SFVec4dSetProperty.\n");
5190  return JS_FALSE;
5191  }
5192 
5193  if (JSVAL_IS_INT(id)) {
5194  switch (JSVAL_TO_INT(id)) {
5195  case 0:
5196 #if JS_VERSION < 185
5197  (ptr->v).c[0] = (float) *JSVAL_TO_DOUBLE(myv);
5198 #else
5199  (ptr->v).c[0] = (float) JSVAL_TO_DOUBLE(myv);
5200 #endif
5201  break;
5202  case 1:
5203 #if JS_VERSION < 185
5204  (ptr->v).c[1] = (float) *JSVAL_TO_DOUBLE(myv);
5205 #else
5206  (ptr->v).c[1] = (float) JSVAL_TO_DOUBLE(myv);
5207 #endif
5208  break;
5209  case 2:
5210 #if JS_VERSION < 185
5211  (ptr->v).c[2] = (float) *JSVAL_TO_DOUBLE(myv);
5212 #else
5213  (ptr->v).c[2] = (float) JSVAL_TO_DOUBLE(myv);
5214 #endif
5215  break;
5216  case 3:
5217 #if JS_VERSION < 185
5218  (ptr->v).c[3] = (float) *JSVAL_TO_DOUBLE(myv);
5219 #else
5220  (ptr->v).c[3] = (float) JSVAL_TO_DOUBLE(myv);
5221 #endif
5222  break;
5223  }
5224  }
5225  return JS_TRUE;
5226 }
5227 
5228 #endif /* !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK) */