FreeWRL/FreeX3D  3.0.0
jsVRML_MFClasses.c
1 /*
2 
3 
4 ???
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 
29 #include <config.h>
30 #include <system.h>
31 #if !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK))
32 
33 #include <system_threads.h>
34 #include <display.h>
35 #include <internal.h>
36 
37 #include <libFreeWRL.h>
38 
39 #include "../vrml_parser/Structs.h"
40 #include "../main/headers.h"
41 #include "../vrml_parser/CParseGeneral.h"
42 #include "../main/Snapshot.h"
43 #include "../scenegraph/Collision.h"
44 #include "../scenegraph/quaternion.h"
45 #include "../scenegraph/Viewer.h"
46 #include "../input/SensInterps.h"
47 #include "../x3d_parser/Bindable.h"
48 #include "../scenegraph/LinearAlgebra.h"
49 
50 #include "JScript.h"
51 #include "CScripts.h"
52 #include "jsUtils.h"
53 #include "jsNative.h"
54 #include "jsVRMLClasses.h"
55 #include "JScript.h"
56 
57 
58 
59 /********************************************************/
60 /* */
61 /* Third part - MF classes */
62 /* */
63 /********************************************************/
64 
65 /* remove any private data from this datatype, and let the garbage collector handle the object */
66 
67 void
68 JS_MY_Finalize(JSContext *cx, JSObject *obj)
69 {
70  void *ptr;
71  #ifdef JSVRMLCLASSESVERBOSE
72  printf ("finalizing %p\n",obj);
73  printJSNodeType(cx,obj);
74  #endif
75 
76  REMOVE_ROOT(cx,obj)
77 
78  if ((ptr = (void *)JS_GetPrivate(cx, obj)) != NULL) {
79  FREE_IF_NZ(ptr);
80  #ifdef JSVRMLCLASSESVERBOSE
81  } else {
82  printf ("Finalize - no private data!\n");
83  #endif
84  }
85 }
86 
87 JSBool
88 #if JS_VERSION < 185
89 MFColorToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
90 #else
91 MFColorToString(JSContext *cx, uintN argc, jsval *vp) {
92  JSObject *obj = JS_THIS_OBJECT(cx,vp);
93  jsval *argv = JS_ARGV(cx,vp);
94  jsval rval;
95 #endif
96  UNUSED(argc);
97  UNUSED(argv);
98 #if JS_VERSION < 185
99  return doMFToString(cx, obj, "MFColor", rval);
100 #else
101  if (!doMFToString(cx, obj, "MFColor", &rval)) { return JS_FALSE; }
102  JS_SET_RVAL(cx,vp,rval);
103  return JS_TRUE;
104 #endif
105 }
106 
107 JSBool
108 #if JS_VERSION < 185
109 MFColorAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
110  return _standardMFAssign (cx, obj, argc, argv, rval, &MFColorClass,FIELDTYPE_SFColor);
111 #else
112 MFColorAssign(JSContext *cx, uintN argc, jsval *vp) {
113  JSObject *obj = JS_THIS_OBJECT(cx,vp);
114  jsval *argv = JS_ARGV(cx,vp);
115  jsval rval;
116  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFColorClass,FIELDTYPE_SFColor)) { return JS_FALSE; }
117  JS_SET_RVAL(cx,vp,rval);
118  return JS_TRUE;
119 #endif
120 }
121 
122 JSBool
123 #if JS_VERSION < 185
124 MFColorConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
125 #else
126 MFColorConstr(JSContext *cx, uintN argc, jsval *vp) {
127  JSObject *obj = JS_NewObject(cx,&MFColorClass,NULL,NULL);
128  jsval *argv = JS_ARGV(cx,vp);
129  jsval rval = OBJECT_TO_JSVAL(obj);
130  if (!MFColorConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
131  JS_SET_RVAL(cx,vp,rval);
132  return JS_TRUE;
133 }
134 JSBool MFColorConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
135 #endif
136  JSObject *_obj;
137  unsigned int i;
138 
139  ADD_ROOT(cx,obj)
140  DEFINE_LENGTH(cx,obj,argc)
141 
142  if (!argv) {
143  return JS_TRUE;
144  }
145 
146  #ifdef JSVRMLCLASSESVERBOSE
147  printf("MFColorConstr: obj = %p, %u args\n",
148  obj, argc);
149  #endif
150 
151  for (i = 0; i < argc; i++) {
152  if (!JS_ValueToObject(cx, argv[i], &_obj)) {
153  printf(
154  "JS_ValueToObject failed in MFColorConstr.\n");
155  return JS_FALSE;
156  }
157 
158  CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFColorClass)
159 
160  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
161  printf( "JS_DefineElement failed for arg %u in MFColorConstr.\n", i);
162  return JS_FALSE;
163  }
164  }
165  *rval = OBJECT_TO_JSVAL(obj);
166  return JS_TRUE;
167 }
168 
169 JSBool
170 #if JS_VERSION < 185
171 MFColorAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
172 #else
173 MFColorAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
174 #endif
175  return doMFAddProperty(cx, obj, id, vp,"MFColorAddProperty");
176 }
177 
178 JSBool
179 #if JS_VERSION < 185
180 MFColorGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
181 #else
182 MFColorGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
183 #endif
184  return _standardMFGetProperty(cx, obj, id, vp,
185  "_FreeWRL_Internal = new SFColor()", FIELDTYPE_MFColor);
186 }
187 
188 JSBool
189 #if JS_VERSION < 185
190 MFColorSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
191 #else
192 MFColorSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict,jsval *vp) {
193 #endif
194  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFColor);
195 }
196 
197 JSBool
198 #if JS_VERSION < 185
199 MFFloatToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
200 #else
201 MFFloatToString(JSContext *cx, uintN argc, jsval *vp) {
202  JSObject *obj = JS_THIS_OBJECT(cx,vp);
203  jsval *argv = JS_ARGV(cx,vp);
204  jsval rval;
205 #endif
206  UNUSED(argc);
207  UNUSED(argv);
208 #if JS_VERSION < 185
209  return doMFToString(cx, obj, "MFFloat", rval);
210 #else
211  if (!doMFToString(cx, obj, "MFFloat", &rval)) { return JS_FALSE; }
212  JS_SET_RVAL(cx,vp,rval);
213  return JS_TRUE;
214 #endif
215 }
216 
217 JSBool
218 #if JS_VERSION < 185
219 MFFloatAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
220 #else
221 MFFloatAssign(JSContext *cx, uintN argc, jsval *vp) {
222  JSObject *obj = JS_THIS_OBJECT(cx,vp);
223  jsval *argv = JS_ARGV(cx,vp);
224  jsval rval;
225 #endif
226  SET_MF_ECMA_HAS_CHANGED
227 
228 #if JS_VERSION < 185
229  return _standardMFAssign (cx, obj, argc, argv, rval, &MFFloatClass,FIELDTYPE_SFFloat);
230 #else
231  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFFloatClass,FIELDTYPE_SFFloat)) { return JS_FALSE; }
232  JS_SET_RVAL(cx,vp,rval);
233  return JS_TRUE;
234 #endif
235 }
236 
237 JSBool
238 #if JS_VERSION < 185
239 MFFloatConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
240 #else
241 MFFloatConstr(JSContext *cx, uintN argc, jsval *vp) {
242  JSObject *obj = JS_NewObject(cx,&MFFloatClass,NULL,NULL);
243  jsval *argv = JS_ARGV(cx,vp);
244  jsval rval = OBJECT_TO_JSVAL(obj);
245  if (!MFFloatConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
246  JS_SET_RVAL(cx,vp,rval);
247  return JS_TRUE;
248 }
249 JSBool MFFloatConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
250 #endif
251 
252  jsdouble _d;
253  unsigned int i;
254 
255  ADD_ROOT(cx,obj)
256  DEFINE_LENGTH(cx,obj,argc)
257  DEFINE_MF_ECMA_HAS_CHANGED
258 
259  if (!argv) {
260  return JS_TRUE;
261  }
262 
263  #ifdef JSVRMLCLASSESVERBOSE
264  printf("MFFloatConstr: obj = %p, %u args\n", obj, argc);
265  #endif
266  for (i = 0; i < argc; i++) {
267  if (!JS_ValueToNumber(cx, argv[i], &_d)) {
268  printf( "JS_ValueToNumber failed in MFFloatConstr.\n");
269  return JS_FALSE;
270  }
271 
272  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
273  printf( "JS_DefineElement failed for arg %u in MFFloatConstr.\n", i);
274  return JS_FALSE;
275  }
276  }
277  *rval = OBJECT_TO_JSVAL(obj);
278  return JS_TRUE;
279 }
280 
281 JSBool
282 #if JS_VERSION < 185
283 MFFloatAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
284 #else
285 MFFloatAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
286 #endif
287  return doMFAddProperty(cx, obj, id, vp,"MFFloatAddProperty");
288 }
289 
290 JSBool
291 #if JS_VERSION < 185
292 MFFloatGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
293 #else
294 MFFloatGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
295 #endif
296  return _standardMFGetProperty(cx, obj, id, vp,
297  "_FreeWRL_Internal = 0.0", FIELDTYPE_MFFloat);
298 }
299 
300 JSBool
301 #if JS_VERSION < 185
302 MFFloatSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
303 #else
304 MFFloatSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
305 #endif
306  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFFloat);
307 }
308 
309 
310 JSBool
311 #if JS_VERSION < 185
312 MFInt32ToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
313 #else
314 MFInt32ToString(JSContext *cx, uintN argc, jsval *vp) {
315  JSObject *obj = JS_THIS_OBJECT(cx,vp);
316  jsval *argv = JS_ARGV(cx,vp);
317  jsval rval;
318 #endif
319  UNUSED(argc);
320  UNUSED(argv);
321  #ifdef JSVRMLCLASSESVERBOSE
322  printf ("start of MFInt32ToString\n");
323  #endif
324 
325 #if JS_VERSION < 185
326  return doMFToString(cx, obj, "MFInt32", rval);
327 #else
328  if (!doMFToString(cx, obj, "MFInt32", &rval)) { return JS_FALSE; }
329  JS_SET_RVAL(cx,vp,rval);
330  return JS_TRUE;
331 #endif
332 }
333 
334 JSBool
335 #if JS_VERSION < 185
336 MFInt32Assign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
337 #else
338 MFInt32Assign(JSContext *cx, uintN argc, jsval *vp) {
339  JSObject *obj = JS_THIS_OBJECT(cx,vp);
340  jsval *argv = JS_ARGV(cx,vp);
341  jsval rval;
342 #endif
343  #ifdef JSVRMLCLASSESVERBOSE
344  printf ("start of MFInt32Assign\n");
345  #endif
346 
347  SET_MF_ECMA_HAS_CHANGED
348 
349 #if JS_VERSION < 185
350  return _standardMFAssign (cx, obj, argc, argv, rval, &MFInt32Class,FIELDTYPE_SFInt32);
351 #else
352  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFInt32Class,FIELDTYPE_SFInt32)) { return JS_FALSE; }
353  JS_SET_RVAL(cx,vp,rval);
354  return JS_TRUE;
355 #endif
356 }
357 
358 
359 JSBool
360 #if JS_VERSION < 185
361 MFInt32Constr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
362 #else
363 MFInt32Constr(JSContext *cx, uintN argc, jsval *vp) {
364  JSObject *obj = JS_NewObject(cx,&MFInt32Class,NULL,NULL);
365  jsval *argv = JS_ARGV(cx,vp);
366  jsval rval = OBJECT_TO_JSVAL(obj);
367  if (!MFInt32ConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
368  JS_SET_RVAL(cx,vp,rval);
369  return JS_TRUE;
370 }
371 JSBool MFInt32ConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
372 #endif
373  int32 _i;
374  unsigned int i;
375  #ifdef JSVRMLCLASSESVERBOSE
376  printf ("start of MFInt32Constr\n");
377  #endif
378 
379  ADD_ROOT(cx,obj)
380  DEFINE_LENGTH(cx,obj,argc)
381  DEFINE_MF_ECMA_HAS_CHANGED
382 
383  if (!argv) {
384  return JS_TRUE;
385  }
386 
387  #ifdef JSVRMLCLASSESVERBOSE
388  printf("MFInt32Constr: obj = %p, %u args\n", obj, argc);
389  #endif
390 
391  /* any values here that we should add in? */
392  for (i = 0; i < argc; i++) {
393  if (!JS_ValueToInt32(cx, argv[i], &_i)) {
394  printf( "JS_ValueToBoolean failed in MFInt32Constr.\n");
395  return JS_FALSE;
396  }
397  #ifdef JSVRMLCLASSESVERBOSE
398  printf ("value at %d is %d\n",i,_i);
399  #endif
400 
401  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
402  printf( "JS_DefineElement failed for arg %u in MFInt32Constr.\n", i);
403  return JS_FALSE;
404  }
405  }
406 
407  *rval = OBJECT_TO_JSVAL(obj);
408  return JS_TRUE;
409 }
410 
411 JSBool
412 #if JS_VERSION < 185
413 MFInt32AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
414 #else
415 MFInt32AddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
416 #endif
417  #ifdef JSVRMLCLASSESVERBOSE
418  printf ("start of MFInt32AddProperty\n");
419  #endif
420 
421  return doMFAddProperty(cx, obj, id, vp,"MFInt32AddProperty");
422 }
423 
424 JSBool
425 #if JS_VERSION < 185
426 MFInt32GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
427 #else
428 MFInt32GetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
429 #endif
430  #ifdef JSVRMLCLASSESVERBOSE
431  printf ("start of MFInt32GetProperty\n");
432  #endif
433 
434  return _standardMFGetProperty(cx, obj, id, vp,
435  "_FreeWRL_Internal = 0", FIELDTYPE_MFInt32);
436 }
437 
438 JSBool
439 #if JS_VERSION < 185
440 MFInt32SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
441 #else
442 MFInt32SetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
443 #endif
444  #ifdef JSVRMLCLASSESVERBOSE
445  printf ("start of MFInt32SetProperty\n");
446  #endif
447 
448  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFInt32);
449 }
450 
451 
452 JSBool
453 #if JS_VERSION < 185
454 MFNodeToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
455 #else
456 MFNodeToString(JSContext *cx, uintN argc, jsval *vp) {
457  JSObject *obj = JS_THIS_OBJECT(cx,vp);
458  jsval *argv = JS_ARGV(cx,vp);
459  jsval rval;
460 #endif
461  UNUSED(argc);
462  UNUSED(argv);
463 
464  #ifdef JSVRMLCLASSESVERBOSE
465  printf ("start of MFNODETOSTRING, obj %p\n",obj);
466  #endif
467 #if JS_VERSION < 185
468  return doMFToString(cx, obj, "MFNode", rval);
469 #else
470  if (!doMFToString(cx, obj, "MFNode", &rval)) { return JS_FALSE; }
471  JS_SET_RVAL(cx,vp,rval);
472  return JS_TRUE;
473 #endif
474 }
475 
476 JSBool
477 #if JS_VERSION < 185
478 MFNodeAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
479 #else
480 MFNodeAssign(JSContext *cx, uintN argc, jsval *vp) {
481  JSObject *obj = JS_THIS_OBJECT(cx,vp);
482  jsval *argv = JS_ARGV(cx,vp);
483  jsval rval;
484 #endif
485  #ifdef JSVRMLCLASSESVERBOSE
486  printf ("start of MFNODEASSIGN, obj %p\n",obj);
487  #endif
488 
489 #if JS_VERSION < 185
490  return _standardMFAssign (cx, obj, argc, argv, rval, &MFNodeClass,FIELDTYPE_SFNode);
491 #else
492  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFNodeClass,FIELDTYPE_SFNode)) { return JS_FALSE; }
493  JS_SET_RVAL(cx,vp,rval);
494  return JS_TRUE;
495 #endif
496 }
497 
498 JSBool
499 #if JS_VERSION < 185
500 MFNodeConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
501 #else
502 MFNodeConstr(JSContext *cx, uintN argc, jsval *vp) {
503  JSObject *obj = JS_NewObject(cx,&MFNodeClass,NULL,NULL);
504  jsval *argv = JS_ARGV(cx,vp);
505  jsval rval = OBJECT_TO_JSVAL(obj);
506  if (!MFNodeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
507  JS_SET_RVAL(cx,vp,rval);
508  return JS_TRUE;
509 }
510 JSBool MFNodeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
511 #endif
512  JSObject *_obj;
513  unsigned int i;
514 
515  ADD_ROOT(cx,obj)
516  DEFINE_LENGTH(cx,obj,argc)
517 
518  if (!argv) {
519  return JS_TRUE;
520  }
521 
522  #ifdef JSVRMLCLASSESVERBOSE
523  printf("MFNodeConstr: obj = %p, %u args\n", obj, argc);
524  #endif
525 
526  for (i = 0; i < argc; i++) {
527  if (JSVAL_IS_OBJECT(argv[i])) {
528 
529  if (!JS_ValueToObject(cx, argv[i], &_obj)) {
530  printf( "JS_ValueToObject failed in MFNodeConstr.\n");
531  return JS_FALSE;
532  }
533 
534  CHECK_CLASS(cx,_obj,argv,__FUNCTION__,SFNodeClass)
535 
536  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
537  printf( "JS_DefineElement failed for arg %d in MFNodeConstr.\n", i);
538  return JS_FALSE;
539  }
540  } else {
541  /* if a NULL is passed in, eg, we have a script with an MFNode eventOut, and
542  nothing sets it, we have a NULL here. Lets just ignore it */
543  /* hmmm - this is not an object - lets see... */
544  #ifdef JSVRMLCLASSESVERBOSE
545  if (JSVAL_IS_NULL(argv[i])) { printf ("MFNodeConstr - its a NULL\n");}
546  if (JSVAL_IS_INT(argv[i])) { printf ("MFNodeConstr - its a INT\n");}
547  if (JSVAL_IS_STRING(argv[i])) { printf ("MFNodeConstr - its a STRING\n");}
548  #endif
549  }
550  }
551  *rval = OBJECT_TO_JSVAL(obj);
552  return JS_TRUE;
553 }
554 
555 JSBool
556 #if JS_VERSION < 185
557 MFNodeAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
558 #else
559 MFNodeAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
560 #endif
561  #ifdef JSVRMLCLASSESVERBOSE
562  printf ("startof MFNODEADDPROPERTY\n");
563  #endif
564  return doMFAddProperty(cx, obj, id, vp,"MFNodeAddProperty");
565 }
566 
567 JSBool
568 #if JS_VERSION < 185
569 MFNodeGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
570 #else
571 MFNodeGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
572 #endif
573  #ifdef JSVRMLCLASSESVERBOSE
574  printf ("start of MFNODEGETPROPERTY obj %p\n",obj);
575  #endif
576  return _standardMFGetProperty(cx, obj, id, vp,
577  "_FreeWRL_Internal = 0",
578  FIELDTYPE_MFNode);
579 }
580 
581 JSBool
582 #if JS_VERSION < 185
583 MFNodeSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
584 #else
585 MFNodeSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
586 #endif
587  /* printf ("start of MFNODESETPROPERTY obj %d\n",obj); */
588  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFNode);
589 }
590 
591 
592 JSBool
593 #if JS_VERSION < 185
594 MFTimeAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
595 #else
596 MFTimeAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
597 #endif
598  return doMFAddProperty(cx, obj, id, vp,"MFTimeAddProperty");
599 }
600 
601 JSBool
602 MFTimeGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
603  return _standardMFGetProperty(cx, obj, id, vp,
604  "_FreeWRL_Internal = 0.0",
605  FIELDTYPE_MFTime);
606 }
607 
608 JSBool
609 #if JS_VERSION < 185
610 MFTimeSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
611 #else
612 MFTimeSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
613 #endif
614  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFTime);
615 }
616 
617 JSBool
618 #if JS_VERSION < 185
619 MFTimeToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
620 #else
621 MFTimeToString(JSContext *cx, uintN argc, jsval *vp) {
622  JSObject *obj = JS_THIS_OBJECT(cx,vp);
623  jsval *argv = JS_ARGV(cx,vp);
624  jsval rval;
625 #endif
626  UNUSED(argc);
627  UNUSED(argv);
628 #if JS_VERSION < 185
629  return doMFToString(cx, obj, "MFTime", rval);
630 #else
631  if (!doMFToString(cx, obj, "MFTime", &rval)) { return JS_FALSE; }
632  JS_SET_RVAL(cx,vp,rval);
633  return JS_TRUE;
634 #endif
635 }
636 
637 JSBool
638 #if JS_VERSION < 185
639 MFTimeConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
640 #else
641 MFTimeConstr(JSContext *cx, uintN argc, jsval *vp) {
642  JSObject *obj = JS_NewObject(cx,&MFTimeClass,NULL,NULL);
643  jsval *argv = JS_ARGV(cx,vp);
644  jsval rval = OBJECT_TO_JSVAL(obj);
645  if (!MFTimeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
646  JS_SET_RVAL(cx,vp,rval);
647  return JS_TRUE;
648 }
649 JSBool MFTimeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
650 #endif
651  jsdouble _d;
652  unsigned int i;
653 
654  ADD_ROOT(cx,obj)
655  DEFINE_LENGTH(cx,obj,argc)
656  DEFINE_MF_ECMA_HAS_CHANGED
657 
658  if (!argv) {
659  return JS_TRUE;
660  }
661 
662  #ifdef JSVRMLCLASSESVERBOSE
663  printf("MFTimeConstr: obj = %p, %u args\n", obj, argc);
664  #endif
665  for (i = 0; i < argc; i++) {
666  if (!JS_ValueToNumber(cx, argv[i], &_d)) {
667  printf(
668  "JS_ValueToNumber failed in MFTimeConstr.\n");
669  return JS_FALSE;
670  }
671 
672  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
673  printf( "JS_DefineElement failed for arg %u in MFTimeConstr.\n", i);
674  return JS_FALSE;
675  }
676  }
677  *rval = OBJECT_TO_JSVAL(obj);
678  return JS_TRUE;
679 }
680 
681 JSBool
682 #if JS_VERSION < 185
683 MFTimeAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
684 #else
685 MFTimeAssign(JSContext *cx, uintN argc, jsval *vp) {
686  JSObject *obj = JS_THIS_OBJECT(cx,vp);
687  jsval *argv = JS_ARGV(cx,vp);
688  jsval rval;
689 #endif
690  SET_MF_ECMA_HAS_CHANGED
691 
692 #if JS_VERSION < 185
693  return _standardMFAssign (cx, obj, argc, argv, rval, &MFTimeClass,FIELDTYPE_SFTime);
694 #else
695  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFTimeClass,FIELDTYPE_SFTime)) { return JS_FALSE; }
696  JS_SET_RVAL(cx,vp,rval);
697  return JS_TRUE;
698 #endif
699 }
700 
701 
702 
703 JSBool
704 #if JS_VERSION < 185
705 MFVec2fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
706 #else
707 MFVec2fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
708 #endif
709  return doMFAddProperty(cx, obj, id, vp,"MFVec2fAddProperty");
710 }
711 
712 JSBool
713 #if JS_VERSION < 185
714 MFVec2fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
715 #else
716 MFVec2fGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
717 #endif
718  return _standardMFGetProperty(cx, obj, id, vp,
719  "_FreeWRL_Internal = new SFVec2f()",FIELDTYPE_MFVec2f);
720 }
721 
722 JSBool
723 #if JS_VERSION < 185
724 MFVec2fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
725 #else
726 MFVec2fSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
727 #endif
728  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec2f);
729 }
730 
731 JSBool
732 #if JS_VERSION < 185
733 MFVec2fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
734 #else
735 MFVec2fToString(JSContext *cx, uintN argc, jsval *vp) {
736  JSObject *obj = JS_THIS_OBJECT(cx,vp);
737  jsval *argv = JS_ARGV(cx,vp);
738  jsval rval;
739 #endif
740  UNUSED(argc);
741  UNUSED(argv);
742 #if JS_VERSION < 185
743  return doMFToString(cx, obj, "MFVec2f", rval);
744 #else
745  if (!doMFToString(cx, obj, "MFVec2f", &rval)) { return JS_FALSE; }
746  JS_SET_RVAL(cx,vp,rval);
747  return JS_TRUE;
748 #endif
749 }
750 
751 JSBool
752 #if JS_VERSION < 185
753 MFVec2fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
754 #else
755 MFVec2fConstr(JSContext *cx, uintN argc, jsval *vp) {
756  JSObject *obj = JS_NewObject(cx,&MFVec2fClass,NULL,NULL);
757  jsval *argv = JS_ARGV(cx,vp);
758  jsval rval = OBJECT_TO_JSVAL(obj);
759  if (!MFVec2fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
760  JS_SET_RVAL(cx,vp,rval);
761  return JS_TRUE;
762 }
763 JSBool MFVec2fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
764 #endif
765  JSObject *_obj;
766  unsigned int i;
767 
768  ADD_ROOT(cx,obj)
769  DEFINE_LENGTH(cx,obj,argc)
770 
771  if (!argv) {
772  return JS_TRUE;
773  }
774 
775  #ifdef JSVRMLCLASSESVERBOSE
776  printf("MFVec2fConstr: obj = %p, %u args\n", obj, argc);
777  #endif
778 
779  for (i = 0; i < argc; i++) {
780  if (!JS_ValueToObject(cx, argv[i], &_obj)) {
781  printf( "JS_ValueToObject failed in MFVec2fConstr.\n");
782  return JS_FALSE;
783  }
784 
785  CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec2fClass)
786 
787  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
788  printf( "JS_DefineElement failed for arg %d in MFVec2fConstr.\n", i);
789  return JS_FALSE;
790  }
791  }
792  *rval = OBJECT_TO_JSVAL(obj);
793  return JS_TRUE;
794 }
795 
796 JSBool
797 #if JS_VERSION < 185
798 MFVec2fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
799  return _standardMFAssign (cx, obj, argc, argv, rval, &MFVec2fClass,FIELDTYPE_SFVec2f);
800 #else
801 MFVec2fAssign(JSContext *cx, uintN argc, jsval *vp) {
802  JSObject *obj = JS_THIS_OBJECT(cx,vp);
803  jsval *argv = JS_ARGV(cx,vp);
804  jsval rval;
805  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec2fClass,FIELDTYPE_SFVec2f)) { return JS_FALSE; }
806  JS_SET_RVAL(cx,vp,rval);
807  return JS_TRUE;
808 #endif
809 }
810 
811 /* MFVec3f */
812 JSBool
813 #if JS_VERSION < 185
814 MFVec3fAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
815 #else
816 MFVec3fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
817 #endif
818  return doMFAddProperty(cx, obj, id, vp,"MFVec3fAddProperty");
819 }
820 
821 JSBool
822 #if JS_VERSION < 185
823 MFVec3fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
824 #else
825 MFVec3fGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
826 #endif
827  return _standardMFGetProperty(cx, obj, id, vp,
828  "_FreeWRL_Internal = new SFVec3f()",FIELDTYPE_MFVec3f);
829 }
830 
831 JSBool
832 #if JS_VERSION < 185
833 MFVec3fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
834 #else
835 MFVec3fSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
836 #endif
837  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec3f);
838 }
839 
840 JSBool
841 #if JS_VERSION < 185
842 MFVec3fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
843 #else
844 MFVec3fToString(JSContext *cx, uintN argc, jsval *vp) {
845  JSObject *obj = JS_THIS_OBJECT(cx,vp);
846  jsval *argv = JS_ARGV(cx,vp);
847  jsval rval;
848 #endif
849  UNUSED(argc);
850  UNUSED(argv);
851  /* printf ("CALLED MFVec3fToString\n");*/
852 #if JS_VERSION < 185
853  return doMFToString(cx, obj, "MFVec3f", rval);
854 #else
855  if (!doMFToString(cx, obj, "MFVec3f", &rval)) { return JS_FALSE; }
856  JS_SET_RVAL(cx,vp,rval);
857  return JS_TRUE;
858 #endif
859 }
860 
861 JSBool
862 #if JS_VERSION < 185
863 MFVec3fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
864 #else
865 MFVec3fConstr(JSContext *cx, uintN argc, jsval *vp) {
866  JSObject *obj = JS_NewObject(cx,&MFVec3fClass,NULL,NULL);
867  jsval *argv = JS_ARGV(cx,vp);
868  jsval rval = OBJECT_TO_JSVAL(obj);
869  if (!MFVec3fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
870  JS_SET_RVAL(cx,vp,rval);
871  return JS_TRUE;
872 }
873 JSBool MFVec3fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
874 #endif
875  JSObject *_obj;
876  unsigned int i;
877 
878  ADD_ROOT(cx,obj)
879  DEFINE_LENGTH(cx,obj,argc)
880 
881  if (!argv) {
882  return JS_TRUE;
883  }
884 
885  #ifdef JSVRMLCLASSESVERBOSE
886  printf("MFVec3fConstr: obj = %p, %u args\n", obj, argc);
887  #endif
888  for (i = 0; i < argc; i++) {
889  if (!JS_ValueToObject(cx, argv[i], &_obj)) {
890  printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
891  return JS_FALSE;
892  }
893 
894  CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec3fClass)
895 
896  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
897  printf( "JS_DefineElement failed for arg %d in MFVec3fConstr.\n", i);
898  return JS_FALSE;
899  }
900  }
901  *rval = OBJECT_TO_JSVAL(obj);
902  return JS_TRUE;
903 }
904 
905 JSBool
906 #if JS_VERSION < 185
907 MFVec3fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
908  return _standardMFAssign (cx, obj, argc, argv, rval, &MFVec3fClass,FIELDTYPE_SFVec3f);
909 #else
910 MFVec3fAssign(JSContext *cx, uintN argc, jsval *vp) {
911  JSObject *obj = JS_THIS_OBJECT(cx,vp);
912  jsval *argv = JS_ARGV(cx,vp);
913  jsval rval;
914  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec3fClass,FIELDTYPE_SFVec3f)) { return JS_FALSE; }
915  JS_SET_RVAL(cx,vp,rval);
916  return JS_TRUE;
917 #endif
918 }
919 
920 /* VrmlMatrix */
921 
922 static void _setmatrix (JSContext *cx, JSObject *obj, double *matrix) {
923  jsval val;
924  int i;
925  for (i=0; i<16; i++) {
926 
927  if (JS_NewNumberValue(cx, matrix[i],&val) == JS_FALSE) {
928  printf ("problem creating id matrix\n");
929  return;
930  }
931 
932  if (!JS_SetElement(cx, obj, (jsint) i, &val)) {
933  printf( "JS_DefineElement failed for arg %u in VrmlMatrixSetTransform.\n", i);
934  return;
935  }
936  }
937 }
938 
939 /* get the matrix values into a double array */
940 static void _getmatrix (JSContext *cx, JSObject *obj, double *fl) {
941  int32 _length;
942  jsval _length_val;
943  jsval val;
944  int i;
945  double d;
946 
947  if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
948  printf( "JS_GetProperty failed for \"%s\" in _getmatrix.\n", MF_LENGTH_FIELD);
949  _length = 0;
950  } else {
951  _length = JSVAL_TO_INT(_length_val);
952  }
953 
954  #ifdef JSVRMLCLASSESVERBOSE
955  printf ("_getmatrix, length %d\n",_length);
956  #endif
957 
958 
959  if (_length>16) _length = 16;
960 
961  for (i = 0; i < _length; i++) {
962  if (!JS_GetElement(cx, obj, (jsint) i, &val)) {
963  printf( "failed in get of copyElements index %d.\n", i);
964  fl[i] = 0.0;
965  } else {
966  if (!JS_ValueToNumber(cx, val, &d)) {
967  printf ("this is not a mumber!\n");
968  fl[i]=0.0;
969  } else fl[i]=d;
970  }
971  }
972 
973  /* in case our matrix was short for some reason */
974  for (i=_length; i < 16; i++) {
975  fl[i]=0.0;
976  }
977 }
978 
979 
980 JSBool
981 #if JS_VERSION < 185
982 VrmlMatrixToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
983 #else
984 VrmlMatrixToString(JSContext *cx, uintN argc, jsval *vp) {
985  JSObject *obj = JS_THIS_OBJECT(cx,vp);
986  jsval *argv = JS_ARGV(cx,vp);
987  jsval rval;
988 #endif
989  UNUSED(argc);
990  UNUSED(argv);
991 
992 #if JS_VERSION < 185
993  return doMFToString(cx, obj, "MFFloat", rval);
994 #else
995  if (!doMFToString(cx, obj, "MFFloat", &rval)) { return JS_FALSE; }
996  JS_SET_RVAL(cx,vp,rval);
997  return JS_TRUE;
998 #endif
999 }
1000 
1001 /* get rows; used for scale and rot in getTransform */
1002 void _get4f(double *ret, double *mat, int row) {
1003  if (row == 0) {ret[0]=MAT00;ret[1]=MAT01;ret[2]=MAT02;ret[3]=MAT03;}
1004  if (row == 1) {ret[0]=MAT10;ret[1]=MAT11;ret[2]=MAT12;ret[3]=MAT13;}
1005  if (row == 2) {ret[0]=MAT20;ret[1]=MAT21;ret[2]=MAT22;ret[3]=MAT23;}
1006 }
1007 
1008 /* set rows; used for scale and rot in getTransform */
1009 void _set4f(double len, double *mat, int row) {
1010  if (row == 0) {MAT00=MAT00/len;MAT01=MAT01/len;MAT02=MAT02/len;MAT03=MAT03/len;}
1011  if (row == 1) {MAT10=MAT10/len;MAT11=MAT11/len;MAT12=MAT12/len;MAT13=MAT13/len;}
1012  if (row == 2) {MAT20=MAT20/len;MAT21=MAT21/len;MAT22=MAT22/len;MAT23=MAT23/len;}
1013 }
1014 
1015 JSBool
1016 #if JS_VERSION < 185
1017 VrmlMatrixgetTransform(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1018 #else
1019 VrmlMatrixgetTransform(JSContext *cx, uintN argc, jsval *vp) {
1020  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1021  jsval *argv = JS_ARGV(cx,vp);
1022 #endif
1023  int i;
1024  JSObject *transObj = NULL;
1025  JSObject *rotObj = NULL;
1026  JSObject *scaleObj = NULL;
1027  SFRotationNative *Rptr;
1028  SFVec3fNative *Vptr;
1029 
1030  Quaternion quat;
1031  double matrix[16];
1032  double qu[4];
1033  double r0[4], r1[4], r2[4];
1034  double l0,l1,l2;
1035 
1036  /* some intermediate calculations */
1037  _getmatrix(cx,obj,matrix);
1038  /* get each row */
1039  _get4f(r0,matrix,0);
1040  _get4f(r1,matrix,1);
1041  _get4f(r2,matrix,2);
1042  /* get the length of each row */
1043  l0 = sqrt(r0[0]*r0[0] + r0[1]*r0[1] + r0[2]*r0[2] +r0[3]*r0[3]);
1044  l1 = sqrt(r1[0]*r1[0] + r1[1]*r1[1] + r1[2]*r1[2] +r1[3]*r1[3]);
1045  l2 = sqrt(r2[0]*r2[0] + r2[1]*r2[1] + r2[2]*r2[2] +r2[3]*r2[3]);
1046 
1047  if (argc == 1) {
1048  if (!JS_ConvertArguments(cx, argc, argv, "o", &transObj)) {
1049  printf ("getTransform, invalid parameters\n");
1050  return JS_FALSE;
1051  }
1052  }
1053  if (argc == 2) {
1054  if (!JS_ConvertArguments(cx, argc, argv, "o o", &transObj, &rotObj)) {
1055  printf ("getTransform, invalid parameters\n");
1056  return JS_FALSE;
1057  }
1058  }
1059  if (argc == 3) {
1060  if (!JS_ConvertArguments(cx, argc, argv, "o o o",
1061  &transObj,&rotObj,&scaleObj)) {
1062  printf ("getTransform, invalid parameters\n");
1063  return JS_FALSE;
1064  }
1065  }
1066 
1067  /* translation */
1068  if (transObj!=NULL) {
1069  CHECK_CLASS(cx,transObj,NULL,__FUNCTION__,SFVec3fClass)
1070 
1071  if ((Vptr = (SFVec3fNative *)JS_GetPrivate(cx, transObj)) == NULL) {
1072  printf( "JS_GetPrivate failed.\n");
1073  return JS_FALSE;
1074  }
1075  (Vptr->v).c[0] = (float) matrix[12];
1076  (Vptr->v).c[1] = (float) matrix[13];
1077  (Vptr->v).c[2] = (float) matrix[14];
1078  Vptr->valueChanged++;
1079  }
1080 
1081  /* rotation */
1082  if (rotObj!=NULL) {
1083 
1084  CHECK_CLASS(cx,rotObj,NULL,__FUNCTION__,SFRotationClass)
1085 
1086  if ((Rptr = (SFRotationNative*)JS_GetPrivate(cx, rotObj)) == NULL) {
1087  printf( "JS_GetPrivate failed.\n");
1088  return JS_FALSE;
1089  }
1090 
1091  /* apply length to each row */
1092  _set4f(l0, matrix, 0);
1093  _set4f(l1, matrix, 1);
1094  _set4f(l2, matrix, 2);
1095 
1096  /* convert the matrix to a quaternion */
1097  matrix_to_quaternion (&quat, matrix);
1098  #ifdef JSVRMLCLASSESVERBOSE
1099  printf ("quaternion %f %f %f %f\n",quat.x,quat.y,quat.z,quat.w);
1100  #endif
1101 
1102  /* convert the quaternion to a VRML rotation */
1103  quaternion_to_vrmlrot(&quat, &qu[0],&qu[1],&qu[2],&qu[3]);
1104 
1105  /* now copy the values over */
1106  for (i=0; i<4; i++) (Rptr->v).c[i] = (float) qu[i];
1107  Rptr->valueChanged = 1;
1108  }
1109 
1110  /* scale */
1111  if (scaleObj != NULL) {
1112  CHECK_CLASS(cx,scaleObj,NULL,__FUNCTION__,SFVec3fClass)
1113 
1114  if ((Vptr = (SFVec3fNative*)JS_GetPrivate(cx, scaleObj)) == NULL) {
1115  printf( "JS_GetPrivate failed.\n");
1116  return JS_FALSE;
1117  }
1118  (Vptr->v).c[0] = (float) l0;
1119  (Vptr->v).c[1] = (float) l1;
1120  (Vptr->v).c[2] = (float) l2;
1121  Vptr->valueChanged = 1;
1122  }
1123 
1124 #if JS_VERSION < 185
1125  *rval = JSVAL_VOID;
1126 #else
1127  JS_SET_RVAL(cx,vp,JSVAL_VOID);
1128 #endif
1129  return JS_TRUE;
1130 }
1131 
1132 
1133 /* Sets the VrmlMatrix to the passed values. Any of the rightmost parameters may be omitted.
1134  The method has 0 to 5 parameters. For example, specifying 0 parameters results in an
1135  identity matrix while specifying 1 parameter results in a translation and specifying 2
1136  parameters results in a translation and a rotation. Any unspecified parameter is set to
1137  its default as specified for the Transform node. */
1138 
1139 JSBool
1140 #if JS_VERSION < 185
1141 VrmlMatrixsetTransform(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1142 #else
1143 VrmlMatrixsetTransform(JSContext *cx, uintN argc, jsval *vp) {
1144  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1145  jsval *argv = JS_ARGV(cx,vp);
1146 #endif
1147  JSObject *transObj = NULL;
1148  JSObject *rotObj = NULL;
1149  JSObject *scaleObj = NULL;
1150  JSObject *scaleOObj = NULL;
1151  JSObject *centerObj = NULL;
1152 
1153  double matrix[16];
1154 
1155  int error = FALSE;
1156 
1157 #undef TESTING
1158 #ifdef TESTING
1159  GLDOUBLE xxmat[16];
1160  FW_GL_MATRIX_MODE(GL_MODELVIEW);
1161  FW_GL_PUSH_MATRIX();
1162  FW_GL_LOAD_IDENTITY();
1163 #endif
1164 
1165 
1166  /* set the identity for this matrix. We work on this matrix, then assign it to the variable */
1167  loadIdentityMatrix(matrix);
1168 
1169  /* first, is this a VrmlMatrix object? The chances of this failing are slim to none... */
1170  if (!JS_InstanceOf(cx, obj, &VrmlMatrixClass, NULL)) {
1171  error = TRUE;
1172  } else {
1173  if (argc == 1) {
1174  error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1175  }
1176  if (argc == 2) {
1177  error = !JS_ConvertArguments(cx, argc, argv, "o o", &transObj,
1178  &rotObj);
1179  }
1180  if (argc == 3) {
1181  error = !JS_ConvertArguments(cx, argc, argv, "o o o",
1182  &transObj,&rotObj,&scaleObj);
1183  }
1184  if (argc == 4) {
1185  error = !JS_ConvertArguments(cx, argc, argv, "o o o o",
1186  &transObj,&rotObj,&scaleObj,&scaleOObj);
1187  }
1188  if (argc == 5) {
1189  error = !JS_ConvertArguments(cx, argc, argv, "o o o o o",
1190  &transObj,&rotObj,&scaleObj,&scaleOObj,&centerObj);
1191  }
1192  if (argc > 5) { error = TRUE; }
1193  }
1194 
1195  if (error) {
1196  ConsoleMessage ("setTransform: error in parameters");
1197  return JS_FALSE;
1198  }
1199 
1200  /* verify that we have the correct objects here */
1201  if (transObj != NULL)
1202  error = !JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL);
1203  if (!error && (rotObj != NULL))
1204  error = !JS_InstanceOf(cx, rotObj, &SFRotationClass, NULL);
1205  if (!error && (scaleObj != NULL))
1206  error = !JS_InstanceOf(cx, scaleObj, &SFVec3fClass, NULL);
1207  if (!error && (scaleOObj != NULL))
1208  error = !JS_InstanceOf(cx, scaleOObj, &SFRotationClass, NULL);
1209  if (!error && centerObj != NULL)
1210  error = !JS_InstanceOf(cx, centerObj, &SFVec3fClass, NULL);
1211 
1212  if (error) {
1213  ConsoleMessage ("setTransform: at least one parameter incorrect type");
1214  return JS_FALSE;
1215  }
1216 
1217  /* apply Transform, if requested */
1218  if (transObj) {
1219  SFVec3fNative * Vptr;
1220  Vptr = (SFVec3fNative *)JS_GetPrivate(cx, transObj);
1221  error = (Vptr == NULL);
1222 
1223  if (!error) {
1224  matrix[12]=Vptr->v.c[0];
1225  matrix[13]=Vptr->v.c[1];
1226  matrix[14]=Vptr->v.c[2];
1227  }
1228  }
1229 
1230  if (!error && (rotObj != NULL)) {
1231  SFRotationNative * Rptr;
1232  Rptr = (SFRotationNative *)JS_GetPrivate(cx, rotObj);
1233  error = (Rptr == NULL);
1234 
1235  if (!error) {
1236  Quaternion quat;
1237  vrmlrot_to_quaternion(&quat, Rptr->v.c[0], Rptr->v.c[1], Rptr->v.c[2], Rptr->v.c[3]);
1238  /* printf ("from rotation %f %f %f %f\n",Rptr->v.c[0], Rptr->v.c[1], Rptr->v.c[2], Rptr->v.c[3]);
1239  printf ("quaternion is %f %f %f %f\n",quat.x,quat.y,quat.x, quat.w); */
1240  quaternion_to_matrix (matrix, &quat);
1241  }
1242  }
1243 
1244  if (!error && (scaleObj != NULL)) {
1245  SFVec3fNative * Vptr;
1246  Vptr = (SFVec3fNative *)JS_GetPrivate(cx, scaleObj);
1247  error = (Vptr == NULL);
1248 
1249  if (!error) {
1250  struct point_XYZ myScale;
1251 
1252  COPY_SFVEC3F_TO_POINT_XYZ (myScale,Vptr->v.c);
1253  scale_to_matrix(matrix, &myScale);
1254  }
1255 
1256  }
1257 
1258  /* place the new values into the vrmlMatrix array */
1259  _setmatrix (cx, obj, matrix);
1260 
1261 #ifdef TESTING
1262  printf ("calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1263  matrix[0], matrix[4], matrix[ 8], matrix[12],
1264  matrix[1], matrix[5], matrix[ 9], matrix[13],
1265  matrix[2], matrix[6], matrix[10], matrix[14],
1266  matrix[3], matrix[7], matrix[11], matrix[15]);
1267  glGetDoublev(GL_MODELVIEW,xxmat);
1268  printf ("modelview Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1269  xxmat[0], xxmat[4], xxmat[ 8], xxmat[12],
1270  xxmat[1], xxmat[5], xxmat[ 9], xxmat[13],
1271  xxmat[2], xxmat[6], xxmat[10], xxmat[14],
1272  xxmat[3], xxmat[7], xxmat[11], xxmat[15]);
1273  FW_GL_POP_MATRIX();
1274 #endif
1275 
1276 #if JS_VERSION >= 185
1277 /* JS 185+ -requires- rval to be set on true return; assume we will return the 'this' object */
1278  JS_SET_RVAL(cx,vp,JSVAL_VOID);
1279 #endif
1280  return JS_TRUE;
1281 }
1282 
1283 
1284 JSBool
1285 #if JS_VERSION < 185
1286 VrmlMatrixinverse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1287 #else
1288 VrmlMatrixinverse(JSContext *cx, uintN argc, jsval *vp) {
1289  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1290  jsval *argv = JS_ARGV(cx,vp);
1291 #endif
1292  double src[16];
1293  double dest[16];
1294  JSObject *retObj;
1295  UNUSED (argv);
1296 
1297  if (argc != 0) {
1298  printf ("VrmlMatrix, expect 0 parameters\n");
1299  return JS_FALSE;
1300  }
1301  _getmatrix (cx, obj,src);
1302  matinverseFULL (dest,src);
1303 
1304  retObj = JS_ConstructObject(cx,&VrmlMatrixClass,NULL, NULL);
1305 
1306  _setmatrix(cx,retObj,dest);
1307 #if JS_VERSION < 185
1308  *rval = OBJECT_TO_JSVAL(retObj);
1309 #else
1310  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1311 #endif
1312  return JS_TRUE;
1313 }
1314 
1315 
1316 JSBool
1317 #if JS_VERSION < 185
1318 VrmlMatrixtranspose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1319 #else
1320 VrmlMatrixtranspose(JSContext *cx, uintN argc, jsval *vp) {
1321  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1322  jsval *argv = JS_ARGV(cx,vp);
1323 #endif
1324  double src[16];
1325  double dest[16];
1326  JSObject *retObj;
1327  UNUSED (argv);
1328 
1329  if (argc != 0) {
1330  printf ("VrmlMatrix, expect 0 parameters\n");
1331  return JS_FALSE;
1332  }
1333  _getmatrix (cx, obj,src);
1334  mattranspose (dest,src);
1335 
1336  retObj = JS_ConstructObject(cx,&VrmlMatrixClass,NULL, NULL);
1337 
1338  _setmatrix(cx,retObj,dest);
1339 #if JS_VERSION < 185
1340  *rval = OBJECT_TO_JSVAL(retObj);
1341 #else
1342  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1343 #endif
1344  return JS_TRUE;
1345 }
1346 
1347 
1348 
1349 JSBool
1350 #if JS_VERSION < 185
1351 VrmlMatrixmultLeft(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1352 #else
1353 VrmlMatrixmultLeft(JSContext *cx, uintN argc, jsval *vp) {
1354  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1355  jsval *argv = JS_ARGV(cx,vp);
1356 #endif
1357  JSObject *transObj = NULL;
1358  JSObject *retObj = NULL;
1359 
1360  double matrix1[16];
1361  double matrix2[16];
1362  int error = FALSE;
1363 
1364  if (argc == 1) {
1365  error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1366  } else error = TRUE;
1367 
1368  if (!error) if (!JS_InstanceOf(cx, transObj, &VrmlMatrixClass, NULL)) { error = TRUE;}
1369 
1370  if (error) {
1371  ConsoleMessage ("VrmlMatrixMultLeft, error in params");
1372  return JS_FALSE;
1373  }
1374 
1375  /* fill in the 2 matricies, multiply them, then return it */
1376  _getmatrix(cx,obj,matrix1);
1377  _getmatrix(cx,transObj,matrix2);
1378  matmultiplyFULL(matrix1,matrix1,matrix2);
1379 
1380  retObj = JS_ConstructObject(cx,&VrmlMatrixClass,NULL, NULL);
1381 
1382  /*
1383  printf ("multLeft calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1384  matrix1[0], matrix1[4], matrix1[ 8], matrix1[12],
1385  matrix1[1], matrix1[5], matrix1[ 9], matrix1[13],
1386  matrix1[2], matrix1[6], matrix1[10], matrix1[14],
1387  matrix1[3], matrix1[7], matrix1[11], matrix1[15]);
1388  */
1389  _setmatrix(cx,retObj,matrix1);
1390 #if JS_VERSION < 185
1391  *rval = OBJECT_TO_JSVAL(retObj);
1392 #else
1393  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1394 #endif
1395 
1396  return JS_TRUE;
1397 }
1398 
1399 JSBool
1400 #if JS_VERSION < 185
1401 VrmlMatrixmultRight(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1402 #else
1403 VrmlMatrixmultRight(JSContext *cx, uintN argc, jsval *vp) {
1404  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1405  jsval *argv = JS_ARGV(cx,vp);
1406 #endif
1407  JSObject *transObj = NULL;
1408  JSObject *retObj = NULL;
1409 
1410  double matrix1[16];
1411  double matrix2[16];
1412  int error = FALSE;
1413 
1414  if (argc == 1) {
1415  error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1416  } else error = TRUE;
1417 
1418  if (!error) if (!JS_InstanceOf(cx, transObj, &VrmlMatrixClass, NULL)) { error = TRUE;}
1419 
1420  if (error) {
1421  ConsoleMessage ("VrmlMatrixMultRight, error in params");
1422  return JS_FALSE;
1423  }
1424 
1425  /* fill in the 2 matricies, multiply them, then return it */
1426  _getmatrix(cx,obj,matrix1);
1427  _getmatrix(cx,transObj,matrix2);
1428  matmultiplyFULL(matrix1,matrix2,matrix1);
1429 
1430  retObj = JS_ConstructObject(cx,&VrmlMatrixClass,NULL, NULL);
1431 
1432  /*
1433  printf ("multRight calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1434  matrix1[0], matrix1[4], matrix1[ 8], matrix1[12],
1435  matrix1[1], matrix1[5], matrix1[ 9], matrix1[13],
1436  matrix1[2], matrix1[6], matrix1[10], matrix1[14],
1437  matrix1[3], matrix1[7], matrix1[11], matrix1[15]);
1438  */
1439  _setmatrix(cx,retObj,matrix1);
1440 #if JS_VERSION < 185
1441  *rval = OBJECT_TO_JSVAL(retObj);
1442 #else
1443  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1444 #endif
1445 
1446  return JS_TRUE;
1447 }
1448 
1449 
1450 JSBool
1451 #if JS_VERSION < 185
1452 VrmlMatrixmultVecMatrix(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1453 #else
1454 VrmlMatrixmultVecMatrix(JSContext *cx, uintN argc, jsval *vp) {
1455  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1456  jsval *argv = JS_ARGV(cx,vp);
1457 #endif
1458  JSObject *transObj = NULL;
1459  JSObject *retObj = NULL;
1460  SFVec3fNative *Vptr;
1461 
1462  double matrix1[16];
1463  int error = FALSE;
1464  struct point_XYZ inp, outp;
1465  outp.x = outp.y = outp.z = 0.0;
1466 
1467  if (argc == 1) {
1468  error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1469  } else error = TRUE;
1470 
1471  if (!error) if (!JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL)) { error = TRUE;}
1472 
1473  if ((Vptr = (SFVec3fNative *)JS_GetPrivate(cx, transObj)) == NULL) {
1474  error = TRUE;
1475  }
1476 
1477  if (error) {
1478  ConsoleMessage ("VrmlMatrixMultVec, error in params");
1479  return JS_FALSE;
1480  }
1481 
1482  COPY_SFVEC3F_TO_POINT_XYZ(inp,Vptr->v.c);
1483 
1484  /* fill in the 2 matricies, multiply them, then return it */
1485  _getmatrix(cx,obj,matrix1);
1486 
1487  /* is this the one we have to transpose? */
1488  /* mattranspose (matrix1, matrix1); */
1489 
1490  matrotate2v(matrix1, inp, outp);
1491 
1492  retObj = JS_ConstructObject(cx,&SFVec3fClass,NULL, NULL);
1493  if ((Vptr = (SFVec3fNative *)JS_GetPrivate(cx, retObj)) == NULL) {
1494  printf ("error in new VrmlMatrix\n");
1495  return JS_FALSE;
1496  }
1497 
1498  COPY_POINT_XYZ_TO_SFVEC3F(Vptr->v.c,outp);
1499 #if JS_VERSION < 185
1500  *rval = OBJECT_TO_JSVAL(retObj);
1501 #else
1502  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1503 #endif
1504 
1505  return JS_TRUE;
1506 }
1507 
1508 
1509 JSBool
1510 #if JS_VERSION < 185
1511 VrmlMatrixmultMatrixVec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1512 #else
1513 VrmlMatrixmultMatrixVec(JSContext *cx, uintN argc, jsval *vp) {
1514  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1515  jsval *argv = JS_ARGV(cx,vp);
1516 #endif
1517  JSObject *transObj = NULL;
1518  JSObject *retObj = NULL;
1519  SFVec3fNative *Vptr;
1520 
1521  double matrix1[16];
1522  int error = FALSE;
1523  struct point_XYZ inp, outp;
1524  outp.x = outp.y = outp.z = 0.0;
1525 
1526  if (argc == 1) {
1527  error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1528  } else error = TRUE;
1529 
1530  if (!error) if (!JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL)) { error = TRUE;}
1531 
1532  if ((Vptr = (SFVec3fNative *)JS_GetPrivate(cx, transObj)) == NULL) {
1533  error = TRUE;
1534  }
1535 
1536  if (error) {
1537  ConsoleMessage ("VrmlMatrixMultVec, error in params");
1538  return JS_FALSE;
1539  }
1540 
1541  COPY_SFVEC3F_TO_POINT_XYZ(inp,Vptr->v.c);
1542 
1543  /* fill in the 2 matricies, multiply them, then return it */
1544  _getmatrix(cx,obj,matrix1);
1545 
1546  /* is this the one we have to transpose? */
1547  mattranspose (matrix1, matrix1);
1548 
1549  matrotate2v(matrix1, inp, outp);
1550 
1551  retObj = JS_ConstructObject(cx,&SFVec3fClass,NULL, NULL);
1552  if ((Vptr = (SFVec3fNative *)JS_GetPrivate(cx, retObj)) == NULL) {
1553  printf ("error in new VrmlMatrix\n");
1554  return JS_FALSE;
1555  }
1556 
1557  COPY_POINT_XYZ_TO_SFVEC3F(Vptr->v.c,outp);
1558 #if JS_VERSION < 185
1559  *rval = OBJECT_TO_JSVAL(retObj);
1560 #else
1561  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1562 #endif
1563 
1564  return JS_TRUE;
1565 }
1566 
1567 
1568 JSBool
1569 #if JS_VERSION < 185
1570 VrmlMatrixAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1571  return _standardMFAssign (cx, obj, argc, argv, rval, &VrmlMatrixClass,FIELDTYPE_FreeWRLPTR/*does not matter*/);
1572 #else
1573 VrmlMatrixAssign(JSContext *cx, uintN argc, jsval *vp) {
1574  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1575  jsval *argv = JS_ARGV(cx,vp);
1576  jsval rval;
1577  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &VrmlMatrixClass,FIELDTYPE_FreeWRLPTR/*does not matter*/)) { return JS_FALSE; }
1578  JS_SET_RVAL(cx,vp,rval);
1579  return JS_TRUE;
1580 #endif
1581 }
1582 
1583 JSBool
1584 #if JS_VERSION < 185
1585 VrmlMatrixConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1586 #else
1587 VrmlMatrixConstr(JSContext *cx, uintN argc, jsval *vp) {
1588  JSObject *obj = JS_NewObject(cx,&VrmlMatrixClass,NULL,NULL);
1589  jsval *argv = JS_ARGV(cx,vp);
1590  jsval rval = OBJECT_TO_JSVAL(obj);
1591  if (!VrmlMatrixConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1592  JS_SET_RVAL(cx,vp,rval);
1593  return JS_TRUE;
1594 }
1595 JSBool VrmlMatrixConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1596 #endif
1597  jsdouble _d;
1598  unsigned int i;
1599 
1600  ADD_ROOT(cx,obj)
1601 
1602  if ((argc != 16) && (argc != 0)) {
1603  printf ("VrmlMatrixConstr - require either 16 or no values\n");
1604  return JS_FALSE;
1605  }
1606 
1607  DEFINE_LENGTH(cx,obj,16)
1608 
1609  if (argc == 16) {
1610  for (i = 0; i < 16; i++) {
1611  if (!JS_ValueToNumber(cx, argv[i], &_d)) {
1612  printf(
1613  "JS_ValueToNumber failed in VrmlMatrixConstr.\n");
1614  return JS_FALSE;
1615  }
1616 
1617  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1618  printf( "JS_DefineElement failed for arg %u in VrmlMatrixConstr.\n", i);
1619  return JS_FALSE;
1620  }
1621  }
1622  } else {
1623  /* make the identity matrix */
1624  double matrix[16];
1625  loadIdentityMatrix(matrix);
1626  _setmatrix (cx, obj, matrix);
1627  }
1628  *rval = OBJECT_TO_JSVAL(obj);
1629  return JS_TRUE;
1630 }
1631 
1632 JSBool
1633 #if JS_VERSION < 185
1634 VrmlMatrixAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1635 #else
1636 VrmlMatrixAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1637 #endif
1638  return doMFAddProperty(cx, obj, id, vp,"VrmlMatrixAddProperty");
1639 }
1640 
1641 JSBool
1642 #if JS_VERSION < 185
1643 VrmlMatrixGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1644 #else
1645 VrmlMatrixGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
1646 #endif
1647 {
1648  int32 _length, _index;
1649  jsval _length_val;
1650 
1651 #if JS_VERSION >= 185
1652  jsval id;
1653  if (!JS_IdToValue(cx,iid,&id)) {
1654  printf("JS_IdToValue failed in VrmlMatrixGetproperty.\n");
1655  return JS_FALSE;
1656  }
1657 #endif
1658 
1659  if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
1660  printf( "JS_GetProperty failed for \"%s\" in VrmlMatrixGetProperty.\n", MF_LENGTH_FIELD);
1661  return JS_FALSE;
1662  }
1663  _length = JSVAL_TO_INT(_length_val);
1664 
1665 /* -- note, code in here is not compliant to xulrunner-2
1666  if (JSVAL_IS_STRING(id)==TRUE) {
1667  printf(" is a common string :%s:\n",
1668  JS_GetStringBytes(JS_ValueToString(cx, id)));
1669  }
1670  if (JSVAL_IS_OBJECT(id)==TRUE) {
1671  printf (" parameter is an object\n");
1672  }
1673  if (JSVAL_IS_PRIMITIVE(id)==TRUE) {
1674  printf (" parameter is a primitive\n");
1675  }
1676  if (JSVAL_IS_NULL(id)) { printf (" - its a NULL\n");}
1677  if (JSVAL_IS_INT(id)) { printf (" - its a INT %d\n",JSVAL_TO_INT(id));}
1678 */
1679 
1680 
1681 
1682 
1683  if (JSVAL_IS_INT(id)) {
1684  _index = JSVAL_TO_INT(id);
1685 
1686  if (_index >= _length) {
1687  JS_NewNumberValue(cx,0.0,vp);
1688  if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1689  printf( "JS_DefineElement failed in VrmlMatrixGetProperty.\n");
1690  return JS_FALSE;
1691  }
1692  } else {
1693  if (!JS_LookupElement(cx, obj, _index, vp)) {
1694  printf(
1695  "JS_LookupElement failed in VrmlMatrixGetProperty.\n");
1696  return JS_FALSE;
1697  }
1698  if (JSVAL_IS_NULL(*vp)) {
1699  printf( "VrmlMatrixGetProperty: obj = %p, jsval = %d does not exist!\n",
1700  obj, (int) _index);
1701  return JS_FALSE;
1702  }
1703  }
1704  } else if (JSVAL_IS_OBJECT(id)) {
1705  }
1706 
1707  return JS_TRUE;
1708 }
1709 
1710 JSBool
1711 #if JS_VERSION < 185
1712 VrmlMatrixSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1713 #else
1714 VrmlMatrixSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
1715 #endif
1716  return doMFSetProperty(cx, obj, id, vp,1000); /* do not have a FIELDTYPE for this */
1717 }
1718 
1719 /* MFRotation */
1720 JSBool
1721 #if JS_VERSION < 185
1722 MFRotationAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1723 #else
1724 MFRotationAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1725 #endif
1726  return doMFAddProperty(cx, obj, id, vp,"MFRotationAddProperty");
1727 }
1728 
1729 JSBool
1730 #if JS_VERSION < 185
1731 MFRotationGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1732 #else
1733 MFRotationGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1734 #endif
1735  return _standardMFGetProperty(cx, obj, id, vp,
1736  "_FreeWRL_Internal = new SFRotation()",FIELDTYPE_MFRotation);
1737 }
1738 
1739 JSBool
1740 #if JS_VERSION < 185
1741 MFRotationSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1742 #else
1743 MFRotationSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) {
1744 #endif
1745  return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFRotation);
1746 }
1747 
1748 JSBool
1749 #if JS_VERSION < 185
1750 MFRotationToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1751 #else
1752 MFRotationToString(JSContext *cx, uintN argc, jsval *vp) {
1753  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1754  jsval *argv = JS_ARGV(cx,vp);
1755  jsval rval;
1756 #endif
1757  UNUSED(argc);
1758  UNUSED(argv);
1759 #if JS_VERSION < 185
1760  return doMFToString(cx, obj, "MFRotation", rval);
1761 #else
1762  if (!doMFToString(cx, obj, "MFRotation", &rval)) { return JS_FALSE; }
1763  JS_SET_RVAL(cx,vp,rval);
1764  return JS_TRUE;
1765 #endif
1766 }
1767 
1768 JSBool
1769 #if JS_VERSION < 185
1770 MFRotationConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1771 #else
1772 MFRotationConstr(JSContext *cx, uintN argc, jsval *vp) {
1773  JSObject *obj = JS_NewObject(cx,&MFRotationClass,NULL,NULL);
1774  jsval *argv = JS_ARGV(cx,vp);
1775  jsval rval = OBJECT_TO_JSVAL(obj);
1776  if (!MFRotationConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1777  JS_SET_RVAL(cx,vp,rval);
1778  return JS_TRUE;
1779 }
1780 JSBool MFRotationConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1781 #endif
1782  JSObject *_obj;
1783  unsigned int i;
1784 
1785  ADD_ROOT(cx,obj)
1786  DEFINE_LENGTH(cx,obj,argc)
1787 
1788  if (!argv) {
1789  return JS_TRUE;
1790  }
1791 
1792  #ifdef JSVRMLCLASSESVERBOSE
1793  printf("MFRotationConstr: obj = %p, %u args\n", obj, argc);
1794  #endif
1795  for (i = 0; i < argc; i++) {
1796  if (!JS_ValueToObject(cx, argv[i], &_obj)) {
1797  printf(
1798  "JS_ValueToObject failed in MFRotationConstr.\n");
1799  return JS_FALSE;
1800  }
1801 
1802  CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFRotationClass)
1803 
1804  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1805  printf( "JS_DefineElement failed for arg %d in MFRotationConstr.\n", i);
1806  return JS_FALSE;
1807  }
1808  }
1809  *rval = OBJECT_TO_JSVAL(obj);
1810  return JS_TRUE;
1811 }
1812 
1813 JSBool
1814 #if JS_VERSION < 185
1815 MFRotationAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1816  return _standardMFAssign (cx, obj, argc, argv, rval, &MFRotationClass,FIELDTYPE_SFRotation);
1817 #else
1818 MFRotationAssign(JSContext *cx, uintN argc, jsval *vp) {
1819  JSObject *obj = JS_THIS_OBJECT(cx,vp);
1820  jsval *argv = JS_ARGV(cx,vp);
1821  jsval rval;
1822 
1823  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFRotationClass,FIELDTYPE_SFRotation)) { return JS_FALSE; }
1824  JS_SET_RVAL(cx,vp,rval);
1825  return JS_TRUE;
1826 #endif
1827 }
1828 
1829 /* MFStrings */
1830 JSBool
1831 #if JS_VERSION < 185
1832 MFStringAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1833 #else
1834 MFStringAddProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp) {
1835  jsval id;
1836  if (!JS_IdToValue(cx,iid,&id)) {
1837  printf("JS_IdToValue failed in MFStringAddProperty\n");
1838  return JS_FALSE;
1839  }
1840 #endif
1841 
1842  #ifdef JSVRMLCLASSESVERBOSE
1843  printf("MFStringAddProperty: vp = %p\n", obj);
1844  if (JSVAL_IS_STRING(*vp)==TRUE) {
1845  printf(" is a common string :%s:\n",
1846 #if JS_VERSION < 185
1847  JS_GetStringBytes(JS_ValueToString(cx, *vp)));
1848 #else
1849  JS_EncodeString(cx,JS_ValueToString(cx, *vp)));
1850 #endif
1851  }
1852  if (JSVAL_IS_OBJECT(*vp)==TRUE) {
1853  printf (" parameter is an object\n");
1854  }
1855  if (JSVAL_IS_PRIMITIVE(*vp)==TRUE) {
1856  printf (" parameter is a primitive\n");
1857  }
1858  if (JSVAL_IS_NULL(*vp)) { printf (" - its a NULL\n");}
1859  if (JSVAL_IS_INT(*vp)) { printf (" - its a INT %d\n",JSVAL_TO_INT(*vp));}
1860 
1861  printf("MFStringAddProperty: id = %p\n", obj);
1862  if (JSVAL_IS_STRING(id)==TRUE) {
1863  printf(" is a common string :%s:\n",
1864 #if JS_VERSION < 185
1865  JS_GetStringBytes(JS_ValueToString(cx, id)));
1866 #else
1867  JS_EncodeString(cx,JS_ValueToString(cx, id)));
1868 #endif
1869  }
1870  if (JSVAL_IS_OBJECT(id)==TRUE) {
1871  printf (" parameter is an object\n");
1872  }
1873  if (JSVAL_IS_PRIMITIVE(id)==TRUE) {
1874  printf (" parameter is a primitive\n");
1875  }
1876  if (JSVAL_IS_NULL(id)) { printf (" - its a NULL\n");}
1877  if (JSVAL_IS_INT(id)) { printf (" - its a INT %d\n",JSVAL_TO_INT(id));}
1878 
1879  #endif
1880 
1881 
1882  /* unquote parts of vp string if necessary */
1883  if (JSVAL_IS_STRING(*vp)) {
1884  if (!doMFStringUnquote(cx, vp)) {
1885  printf(
1886  "doMFStringUnquote failed in MFStringAddProperty.\n");
1887  return JS_FALSE;
1888  }
1889  }
1890 #if JS_VERSION < 185
1891  return doMFAddProperty(cx, obj, id, vp,"MFStringAddProperty");
1892 #else
1893  return doMFAddProperty(cx, obj, iid, vp,"MFStringAddProperty");
1894 #endif
1895 }
1896 
1897 
1898 JSBool
1899 #if JS_VERSION < 185
1900 MFStringGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1901 #else
1902 MFStringGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp)
1903 #endif
1904 {
1905  JSString *_str;
1906  int32 _length, _index;
1907  jsval _length_val;
1908 #if JS_VERSION >= 185
1909  jsval id;
1910  if (!JS_IdToValue(cx,iid,&id)) {
1911  printf("JS_IdToValue failed in MFStringGetProperty\n");
1912  return JS_FALSE;
1913  }
1914 #endif
1915 
1916  #ifdef JSVRMLCLASSESVERBOSE
1917  printf("MFStringGetProperty: obj = %p\n", obj);
1918  #endif
1919 
1920  if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
1921  printf( "JS_GetProperty failed for \"%s\" in MFStringGetProperty.\n", MF_LENGTH_FIELD);
1922  return JS_FALSE;
1923  }
1924  _length = JSVAL_TO_INT(_length_val);
1925 
1926  if (JSVAL_IS_INT(id)) {
1927  _index = JSVAL_TO_INT(id);
1928 
1929  if (_index >= _length) {
1930  _str = JS_NewStringCopyZ(cx, "");
1931  *vp = STRING_TO_JSVAL(_str);
1932  if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1933  printf( "JS_DefineElement failed in MFStringGetProperty.\n");
1934  return JS_FALSE;
1935  }
1936  } else {
1937  if (!JS_LookupElement(cx, obj, _index, vp)) {
1938  printf( "JS_LookupElement failed in MFStringGetProperty.\n");
1939  return JS_FALSE;
1940  }
1941  if (JSVAL_IS_NULL(*vp)) {
1942  /* jut make up new strings, as above */
1943  /* printf ("MFStringGetProperty, element %d is JSVAL_VOID, making up string for it\n",_index); */
1944  _str = JS_NewStringCopyZ(cx, "NULL");
1945  *vp = STRING_TO_JSVAL(_str);
1946  if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1947  printf( "JS_DefineElement failed in MFStringGetProperty.\n");
1948  return JS_FALSE;
1949  }
1950  }
1951  }
1952  }
1953 
1954  return JS_TRUE;
1955 }
1956 
1957 JSBool
1958 #if JS_VERSION < 185
1959 MFStringSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1960 #else
1961 MFStringSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
1962 #endif
1963 {
1964  JSBool rv;
1965 
1966  #ifdef JSVRMLCLASSESVERBOSE
1967  printf("MFStringSetProperty: obj = %p id %d jsval %u\n", obj, id, (unsigned int)*vp);
1968 
1969 printf ("MFStringSetProperty, setting vp of type...\n");
1970  if (JSVAL_IS_OBJECT(*vp)) { printf (" - MFStringSetProperty, vp is a OBJECT\n");}
1971  if (JSVAL_IS_PRIMITIVE(*vp)) { printf (" - MFStringSetProperty, vp is a PRIMITIVE\n");}
1972  if (JSVAL_IS_NULL(*vp)) { printf (" - MFStringSetProperty, vp is a NULL\n");}
1973  if (JSVAL_IS_STRING(*vp)) { printf (" - MFStringSetProperty, vp is a STRING\n");}
1974  if (JSVAL_IS_INT(*vp)) { printf (" - MFStringSetProperty, vp is a INT %d\n",JSVAL_TO_INT(*vp));}
1975 
1976  #endif
1977 
1978 
1979  /* unquote parts of vp string if necessary */
1980  if (JSVAL_IS_STRING(*vp)) {
1981  if (!doMFStringUnquote(cx, vp)) {
1982  printf(
1983  "doMFStringUnquote failed in MFStringSetProperty.\n");
1984  return JS_FALSE;
1985  }
1986  }
1987  rv = doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFString);
1988  #ifdef JSVRMLCLASSESVERBOSE
1989  printf ("returning from MFStringSetProperty\n");
1990  #endif
1991 
1992  return rv;
1993 
1994 }
1995 
1996 JSBool
1997 #if JS_VERSION < 185
1998 MFStringToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1999 #else
2000 MFStringToString(JSContext *cx, uintN argc, jsval *vp) {
2001  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2002  jsval *argv = JS_ARGV(cx,vp);
2003  jsval rval;
2004 #endif
2005  UNUSED(argc);
2006  UNUSED(argv);
2007  #ifdef JSVRMLCLASSESVERBOSE
2008  printf("MFStringToString: obj = %p, %u args\n", obj, argc);
2009  #endif
2010 
2011 
2012 #if JS_VERSION < 185
2013  return doMFToString(cx, obj, "MFString", rval);
2014 #else
2015  if (!doMFToString(cx, obj, "MFString", &rval)) { return JS_FALSE; }
2016  JS_SET_RVAL(cx,vp,rval);
2017  return JS_TRUE;
2018 #endif
2019 }
2020 
2021 
2022 JSBool
2023 #if JS_VERSION < 185
2024 MFStringConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2025 #else
2026 MFStringConstr(JSContext *cx, uintN argc, jsval *vp) {
2027  JSObject *obj = JS_NewObject(cx,&MFStringClass,NULL,NULL);
2028  jsval *argv = JS_ARGV(cx,vp);
2029  jsval rval = OBJECT_TO_JSVAL(obj);
2030  if (!MFStringConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
2031  JS_SET_RVAL(cx,vp,rval);
2032  return JS_TRUE;
2033 }
2034 JSBool MFStringConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2035 #endif
2036 
2037  unsigned int i;
2038 
2039 
2040  #ifdef JSVRMLCLASSESVERBOSE
2041  JSString *_str;
2042  printf("MFStringConstr: cx %p, obj %p args %d rval %p parent %p... ", cx, obj, argc, rval, JS_GetParent(cx, obj));
2043  #endif
2044 
2045  ADD_ROOT(cx,obj)
2046  DEFINE_LENGTH(cx,obj,argc)
2047  DEFINE_MF_ECMA_HAS_CHANGED
2048 
2049  if (!argv) {
2050  return JS_TRUE;
2051  }
2052 
2053  for (i = 0; i < argc; i++) {
2054  #ifdef JSVRMLCLASSESVERBOSE
2055  printf ("argv %d is a ...",i);
2056 
2057  if (JSVAL_IS_STRING(argv[i])==TRUE) {
2058  printf (" Common String, is");
2059  _str = JS_ValueToString(cx, argv[i]);
2060 #if JS_VERSION < 185
2061  printf (" %s",JS_GetStringBytes(_str));
2062 #else
2063  printf (" %s",JS_EncodeString(cx,_str));
2064 #endif
2065  printf ("..");
2066 
2067  }
2068  if (JSVAL_IS_OBJECT(argv[i])==TRUE) {
2069  printf (" is an object");
2070  }
2071  if (JSVAL_IS_PRIMITIVE(argv[i])==TRUE) {
2072  printf (" is a primitive");
2073  }
2074 
2075  if ((_str = JS_ValueToString(cx, argv[i])) == NULL) {
2076  printf( "JS_ValueToString failed in MFStringConstr.");
2077  return JS_FALSE;
2078  }
2079  printf ("\n");
2080  #endif
2081 
2082 
2083  if (!JS_DefineElement(cx, obj, (jsint) i, argv[i], JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2084  printf( "JS_DefineElement failed for arg %d in MFStringConstr.\n", i);
2085  return JS_FALSE;
2086  }
2087  }
2088  *rval = OBJECT_TO_JSVAL(obj);
2089 
2090  #ifdef JSVRMLCLASSESVERBOSE
2091  printf ("finished MFStringConstr\n");
2092  #endif
2093 
2094  return JS_TRUE;
2095 }
2096 
2097 JSBool
2098 #if JS_VERSION < 185
2099 MFStringAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2100 #else
2101 MFStringAssign(JSContext *cx, uintN argc, jsval *vp) {
2102  JSObject *obj = JS_THIS_OBJECT(cx,vp);
2103  jsval *argv = JS_ARGV(cx,vp);
2104  jsval rval;
2105 #endif
2106 
2107  #ifdef JSVRMLCLASSESVERBOSE
2108  printf("MFStringAssign: obj = %p args %d... ", obj, argc);
2109  #endif
2110  SET_MF_ECMA_HAS_CHANGED
2111 
2112 #if JS_VERSION < 185
2113  return _standardMFAssign (cx, obj, argc, argv, rval, &MFStringClass,FIELDTYPE_SFString);
2114 #else
2115  if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFStringClass,FIELDTYPE_SFString)) { return JS_FALSE; }
2116  JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
2117  return JS_TRUE;
2118 #endif
2119 }
2120 
2121 /* testing.. */
2122 #if JS_VERSION < 185
2123 JSBool MFStringDeleteProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2124 #else
2125 JSBool MFStringDeleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
2126 #endif
2127  #ifdef JSVRMLCLASSESVERBOSE
2128  printf ("MFStringDeleteProperty\n");
2129  #endif
2130  return JS_TRUE;
2131 }
2132 JSBool MFStringEnumerateProperty(JSContext *cx, JSObject *obj) {
2133  #ifdef JSVRMLCLASSESVERBOSE
2134  printf ("MFStringEnumerateProperty\n");
2135  #endif
2136  return JS_TRUE;
2137 }
2138 
2139 #if JS_VERSION < 185
2140 JSBool MFStringResolveProperty(JSContext *cx, JSObject *obj, jsval id) {
2141 #else
2142 JSBool MFStringResolveProperty(JSContext *cx, JSObject *obj, jsid id) {
2143 #endif
2144  #ifdef JSVRMLCLASSESVERBOSE
2145  printf ("MFStringResolveProperty\n");
2146  #endif
2147  return JS_TRUE;
2148 }
2149 JSBool MFStringConvertProperty(JSContext *cx, JSObject *obj, JSType type, jsval *vp) {
2150  #ifdef JSVRMLCLASSESVERBOSE
2151  printf ("MFStringConvertProperty\n");
2152  #endif
2153  return JS_TRUE;
2154 }
2155 
2156 
2157 #endif /* !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK) */