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