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