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){
102//JSContext *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 ptr = (void*)JS_GetPrivate(obj);
115 if (ptr) {
116 if (SM_method() == 0)
117 FREE_IF_NZ(ptr);
118 if (SM_method() == 2) {
119 //AnyNativeNew mallocs ptr, v and elsewhere mf.p is malloced
120 AnyNative* any = (AnyNative*)ptr;
121 if (any->gc) {
122 if (any->type % 2 == 1) //is it MF
123 FREE_IF_NZ(any->v->mffloat.p);
124 FREE_IF_NZ(any->v);
125 }
126 //printf("finalize anygc = %d\n", any->gc);
127 FREE_IF_NZ(ptr);
128 }
129 }
130 //JS_SetPrivateFw(cx,obj,NULL);
131 //FREE_IF_NZ(ptr);
132
133 //}
134
135 #ifdef JSVRMLCLASSESVERBOSE
136 } else {
137 printf ("Finalize - no private data!\n");
138 }
139 #endif
140
141}
142
143// MFColor
144JSBool
145MFColorToString(JSContext *cx, uintN argc, jsval *vp) {
146 JSObject *obj = JS_THIS_OBJECT(cx,vp);
147 jsval *argv = JS_ARGV(cx,vp);
148 jsval rval;
149
150 UNUSED(argc);
151 UNUSED(argv);
152 if (!doMFToString(cx, obj, "MFColor", &rval)) { return JS_FALSE; }
153 JS_SET_RVAL(cx,vp,rval);
154 return JS_TRUE;
155
156}
157
158JSBool
159MFColorAssign(JSContext *cx, uintN argc, jsval *vp) {
160 JSObject *obj = JS_THIS_OBJECT(cx,vp);
161 jsval *argv = JS_ARGV(cx,vp);
162 jsval rval;
163 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFColorClass,FIELDTYPE_SFColor)) { return JS_FALSE; }
164 JS_SET_RVAL(cx,vp,rval);
165 return JS_TRUE;
166
167}
168
169JSBool
170MFColorConstr(JSContext *cx, uintN argc, jsval *vp) {
171 JSObject *obj = JS_NewObject(cx,&MFColorClass,NULL,NULL);
172 jsval *argv = JS_ARGV(cx,vp);
173 jsval rval = OBJECT_TO_JSVAL(obj);
174 if (!MFColorConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
175 JS_SET_RVAL(cx,vp,rval);
176 return JS_TRUE;
177}
178JSBool MFColorConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
179
180 JSObject *_arrayObj;
181 int isArray;
182 JSObject *_obj;
183 unsigned int i;
184 union anyVrml *anyv;
185
186 ADD_ROOT(cx,obj)
187
188 isArray = FALSE;
189 if(argc == 1 && argv){
190 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
191 // tests/JohnCarlson/Arc1A.x3d
192 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
193 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
194 return JS_FALSE;
195 }
196
197 if(JS_IsArrayObject(cx, _arrayObj)){
198 jsuint lengthp;
199 jsval vp;
200 //printf("its an array\n");
201 isArray = TRUE;
202 JS_GetArrayLength(cx,_arrayObj, &lengthp);
203 argc = lengthp;
204 }
205 }
206
207 if(SM_method() == 2){
208 AnyNative *any;
209 int newsize;
210 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFColor,NULL,NULL)) == NULL){
211 printf( "AnyfNativeNew failed in MFColorConstr.\n");
212 return JS_FALSE;
213 }
214 if (!JS_SetPrivateFw(cx, obj, any)) {
215 printf( "JS_SetPrivate failed in MFColorConstr.\n");
216 return JS_FALSE;
217 }
218 anyv = any->v;
219 newsize = sizeof(struct SFColor)*upper_power_of_two(argc);
220 if(argc > 0){
221 anyv->mfcolor.p = MALLOC(struct SFColor*,newsize);
222 memset(anyv->mfcolor.p,0,newsize);
223 }
224
225 }else{
226 DEFINE_LENGTH(cx,obj,argc)
227 }
228 if (!argv) {
229 return JS_TRUE;
230 }
231
232 #ifdef JSVRMLCLASSESVERBOSE
233 printf("MFColorConstr: obj = %p, %u args\n",
234 obj, argc);
235 #endif
236
237 for (i = 0; i < argc; i++) {
238 jsval vp;
239 if(isArray){
240 JS_GetElement(cx, _arrayObj, i, &vp);
241
242 }else{
243 vp = argv[i];
244 }
245 if (!JS_ValueToObject(cx, vp, &_obj)) {
246 printf(
247 "JS_ValueToObject failed in MFColorConstr.\n");
248 return JS_FALSE;
249 }
250
251 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFColorClass)
252 if(SM_method()==2){
253 AnyNative *any2;
254 if((any2 = (AnyNative *)JS_GetPrivateFw(cx,_obj)) != NULL){
255 //2018 I think as long as its 3+ contiguous floats, we can use it as a color,
256 // but in future internal types might change
257 if(any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColorRGBA){
258 shallow_copy_field(FIELDTYPE_SFColor,any2->v,(union anyVrml*)&anyv->mfcolor.p[i]);
259 anyv->mfcolor.n = i+1;
260 }
261 }
262 // else for now we'll leave zeros
263 }else{
264 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
265 printf( "JS_DefineElement failed for arg %u in MFColorConstr.\n", i);
266 return JS_FALSE;
267 }
268 }
269 }
270 *rval = OBJECT_TO_JSVAL(obj);
271 return JS_TRUE;
272}
273
274JSBool
275
276MFColorAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
277 JSObject *obj = *hobj.address();
278 jsid id = *hiid.address();
279 jsval *vp = hvp.address();
280
281 return doMFAddProperty(cx, obj, id, vp,"MFColorAddProperty");
282}
283
284JSBool
285MFColorGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
286 JSObject *obj = *hobj.address();
287 jsid id = *hiid.address();
288 jsval *vp = hvp.address();
289
290 return _standardMFGetProperty(cx, obj, id, vp,
291 "_FreeWRL_Internal = new SFColor()", FIELDTYPE_MFColor);
292}
293
294JSBool
295MFColorSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
296 JSObject *obj = *hobj.address();
297 jsid id = *hiid.address();
298 jsval *vp = hvp.address();
299
300 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFColor);
301}
302
303// MFColorRGBA
304JSBool
305MFColorRGBAToString(JSContext* cx, uintN argc, jsval* vp) {
306 JSObject* obj = JS_THIS_OBJECT(cx, vp);
307 jsval* argv = JS_ARGV(cx, vp);
308 jsval rval;
309
310 UNUSED(argc);
311 UNUSED(argv);
312 if (!doMFToString(cx, obj, "MFColorRGBA", &rval)) { return JS_FALSE; }
313 JS_SET_RVAL(cx, vp, rval);
314 return JS_TRUE;
315
316}
317
318JSBool
319MFColorRGBAAssign(JSContext* cx, uintN argc, jsval* vp) {
320 JSObject* obj = JS_THIS_OBJECT(cx, vp);
321 jsval* argv = JS_ARGV(cx, vp);
322 jsval rval;
323 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFColorRGBAClass, FIELDTYPE_SFColorRGBA)) { return JS_FALSE; }
324 JS_SET_RVAL(cx, vp, rval);
325 return JS_TRUE;
326
327}
328
329JSBool
330MFColorRGBAConstr(JSContext* cx, uintN argc, jsval* vp) {
331 JSObject* obj = JS_NewObject(cx, &MFColorRGBAClass, NULL, NULL);
332 jsval* argv = JS_ARGV(cx, vp);
333 jsval rval = OBJECT_TO_JSVAL(obj);
334 if (!MFColorRGBAConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
335 JS_SET_RVAL(cx, vp, rval);
336 return JS_TRUE;
337}
338JSBool MFColorRGBAConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
339
340 JSObject* _arrayObj;
341 int isArray;
342 JSObject* _obj;
343 unsigned int i;
344 union anyVrml* anyv;
345
346 ADD_ROOT(cx, obj)
347
348 isArray = FALSE;
349 if (argc == 1 && argv) {
350 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
351 // tests/JohnCarlson/Arc1A.x3d
352 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
353 printf("JS_ValueToObject failed in MFVec3fConstr.\n");
354 return JS_FALSE;
355 }
356
357 if (JS_IsArrayObject(cx, _arrayObj)) {
358 jsuint lengthp;
359 jsval vp;
360 //printf("its an array\n");
361 isArray = TRUE;
362 JS_GetArrayLength(cx, _arrayObj, &lengthp);
363 argc = lengthp;
364 }
365 }
366
367 if (SM_method() == 2) {
368 AnyNative* any;
369 int newsize;
370 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFColorRGBA, NULL, NULL)) == NULL) {
371 printf("AnyfNativeNew failed in MFColorRGBAConstr.\n");
372 return JS_FALSE;
373 }
374 if (!JS_SetPrivateFw(cx, obj, any)) {
375 printf("JS_SetPrivate failed in MFColorRGBAConstr.\n");
376 return JS_FALSE;
377 }
378 anyv = any->v;
379 newsize = sizeof(struct SFColorRGBA) * upper_power_of_two(argc);
380 if (argc > 0) {
381 anyv->mfcolorrgba.p = MALLOC(struct SFColorRGBA*, newsize);
382 memset(anyv->mfcolorrgba.p, 0, newsize);
383 }
384
385 }
386 else {
387 DEFINE_LENGTH(cx, obj, argc)
388 }
389 if (!argv) {
390 return JS_TRUE;
391 }
392
393#ifdef JSVRMLCLASSESVERBOSE
394 printf("MFColorRGBAConstr: obj = %p, %u args\n",
395 obj, argc);
396#endif
397
398 for (i = 0; i < argc; i++) {
399 jsval vp;
400 if (isArray) {
401 JS_GetElement(cx, _arrayObj, i, &vp);
402
403 }
404 else {
405 vp = argv[i];
406 }
407 if (!JS_ValueToObject(cx, vp, &_obj)) {
408 printf(
409 "JS_ValueToObject failed in MFColorRGBAConstr.\n");
410 return JS_FALSE;
411 }
412
413 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFColorRGBAClass)
414 if (SM_method() == 2) {
415 AnyNative* any2;
416 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
417 //2018 I think as long as its 4+ contiguous floats, we can use it as a colorrgba,
418 // but in future internal types might change
419 if (any2->type == FIELDTYPE_SFColorRGBA || any2->type == FIELDTYPE_SFVec4f) {
420 shallow_copy_field(FIELDTYPE_SFColorRGBA, any2->v, (union anyVrml*)&anyv->mfcolorrgba.p[i]);
421 anyv->mfcolorrgba.n = i + 1;
422 }
423 }
424 // else for now we'll leave zeros
425 }
426 else {
427 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
428 printf("JS_DefineElement failed for arg %u in MFColorRGBAConstr.\n", i);
429 return JS_FALSE;
430 }
431 }
432 }
433 *rval = OBJECT_TO_JSVAL(obj);
434 return JS_TRUE;
435}
436
437JSBool
438
439MFColorRGBAAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
440 JSObject* obj = *hobj.address();
441 jsid id = *hiid.address();
442 jsval* vp = hvp.address();
443
444 return doMFAddProperty(cx, obj, id, vp, "MFColorRGBAAddProperty");
445}
446
447JSBool
448MFColorRGBAGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
449 JSObject* obj = *hobj.address();
450 jsid id = *hiid.address();
451 jsval* vp = hvp.address();
452
453 return _standardMFGetProperty(cx, obj, id, vp,
454 "_FreeWRL_Internal = new SFColorRGBA()", FIELDTYPE_MFColorRGBA);
455}
456
457JSBool
458MFColorRGBASetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
459 JSObject* obj = *hobj.address();
460 jsid id = *hiid.address();
461 jsval* vp = hvp.address();
462
463 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFColorRGBA);
464}
465
466
467// MFFloat
468JSBool
469MFFloatToString(JSContext *cx, uintN argc, jsval *vp) {
470 JSObject *obj = JS_THIS_OBJECT(cx,vp);
471 jsval *argv = JS_ARGV(cx,vp);
472 jsval rval;
473
474 UNUSED(argc);
475 UNUSED(argv);
476 if (!doMFToString(cx, obj, "MFFloat", &rval)) {
477 return JS_FALSE; }
478 JS_SET_RVAL(cx,vp,rval);
479 return JS_TRUE;
480
481}
482
483JSBool
484MFFloatAssign(JSContext *cx, uintN argc, jsval *vp) {
485 JSObject *obj = JS_THIS_OBJECT(cx,vp);
486 jsval *argv = JS_ARGV(cx,vp);
487 jsval rval;
488 SET_MF_ECMA_HAS_CHANGED
489
490 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFFloatClass,FIELDTYPE_SFFloat)) { return JS_FALSE; }
491 JS_SET_RVAL(cx,vp,rval);
492 return JS_TRUE;
493}
494
495JSBool
496MFFloatConstr(JSContext *cx, uintN argc, jsval *vp) {
497 JSObject* obj = JS_NewObject(cx, &MFFloatClass, NULL, NULL);
498 jsval *argv = JS_ARGV(cx,vp);
499 jsval rval = OBJECT_TO_JSVAL(obj);
500 if (!MFFloatConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
501 JS_SET_RVAL(cx,vp,rval);
502 return JS_TRUE;
503}
504JSBool MFFloatConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
505
506 JSObject *_arrayObj;
507 int isArray;
508
509 jsdouble _d;
510 unsigned int i;
511 union anyVrml *anyv;
512
513// ADD_ROOT(cx,obj) only root non-stack variables
514
515 isArray = FALSE;
516 if(argc == 1 && argv){
517 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
518 // tests/JohnCarlson/Arc1A.x3d
519 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
520 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
521 return JS_FALSE;
522 }
523
524 if(JS_IsArrayObject(cx, _arrayObj)){
525 jsuint lengthp;
526 jsval vp;
527 //printf("its an array\n");
528 isArray = TRUE;
529 JS_GetArrayLength(cx,_arrayObj, &lengthp);
530 argc = lengthp;
531 }
532 }
533
534 if(SM_method() == 2){
535 AnyNative *any;
536 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFFloat,NULL,NULL)) == NULL){
537 printf( "AnyfNativeNew failed in MFFloatConstr.\n");
538 return JS_FALSE;
539 }
540 if (!JS_SetPrivateFw(cx, obj, any)) {
541 printf( "JS_SetPrivate failed in MFFloatConstr.\n");
542 return JS_FALSE;
543 }
544 anyv = any->v;
545 if(argc > 0)
546 anyv->mffloat.p = (float*)malloc(sizeof(float)*upper_power_of_two(argc));
547
548 }else{
549 DEFINE_LENGTH(cx,obj,argc)
550 DEFINE_MF_ECMA_HAS_CHANGED
551 }
552
553 if (!argv) {
554 return JS_TRUE;
555 }
556
557 #ifdef JSVRMLCLASSESVERBOSE
558 printf("MFFloatConstr: obj = %p, %u args\n", obj, argc);
559 #endif
560 for (i = 0; i < argc; i++) {
561 jsval vp;
562 if(isArray){
563 JS_GetElement(cx, _arrayObj, i, &vp);
564
565 }else{
566 vp = argv[i];
567 }
568 if (!JS_ValueToNumber(cx, vp, &_d)) {
569 printf( "JS_ValueToNumber failed in MFFloatConstr.\n");
570 return JS_FALSE;
571 }
572 if(SM_method()==2){
573 anyv->mffloat.p[i] = _d;
574 anyv->mffloat.n = i+1;
575 }else{
576 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
577 printf( "JS_DefineElement failed for arg %u in MFFloatConstr.\n", i);
578 return JS_FALSE;
579 }
580 }
581 }
582 *rval = OBJECT_TO_JSVAL(obj);
583 return JS_TRUE;
584}
585
586JSBool
587MFFloatAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
588 JSObject *obj = *hobj.address();
589 jsid id = *hiid.address();
590 jsval *vp = hvp.address();
591 return doMFAddProperty(cx, obj, id, vp,"MFFloatAddProperty");
592}
593
594JSBool
595MFFloatGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
596 JSObject *obj = *hobj.address();
597 jsid id = *hiid.address();
598 jsval *vp = hvp.address();
599
600 return _standardMFGetProperty(cx, obj, id, vp,
601 "_FreeWRL_Internal = 0.0", FIELDTYPE_MFFloat);
602}
603
604JSBool
605MFFloatSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
606 JSObject *obj = *hobj.address();
607 jsid id = *hiid.address();
608 jsval *vp = hvp.address();
609
610 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFFloat);
611}
612
613// MFInt32
614JSBool
615MFInt32ToString(JSContext *cx, uintN argc, jsval *vp) {
616 JSObject *obj = JS_THIS_OBJECT(cx,vp);
617 jsval *argv = JS_ARGV(cx,vp);
618 jsval rval;
619
620 UNUSED(argc);
621 UNUSED(argv);
622 #ifdef JSVRMLCLASSESVERBOSE
623 printf ("start of MFInt32ToString\n");
624 #endif
625
626 if (!doMFToString(cx, obj, "MFInt32", &rval)) { return JS_FALSE; }
627 JS_SET_RVAL(cx,vp,rval);
628 return JS_TRUE;
629
630}
631
632JSBool
633MFInt32Assign(JSContext *cx, uintN argc, jsval *vp) {
634 JSObject *obj = JS_THIS_OBJECT(cx,vp);
635 jsval *argv = JS_ARGV(cx,vp);
636 jsval rval;
637
638 #ifdef JSVRMLCLASSESVERBOSE
639 printf ("start of MFInt32Assign\n");
640 #endif
641
642 SET_MF_ECMA_HAS_CHANGED
643
644 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFInt32Class,FIELDTYPE_SFInt32)) { return JS_FALSE; }
645 JS_SET_RVAL(cx,vp,rval);
646 return JS_TRUE;
647
648}
649
650
651JSBool
652MFInt32Constr(JSContext *cx, uintN argc, jsval *vp) {
653 JSObject *obj = JS_NewObject(cx,&MFInt32Class,NULL,NULL);
654 jsval *argv = JS_ARGV(cx,vp);
655 jsval rval = OBJECT_TO_JSVAL(obj);
656 if (!MFInt32ConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
657 JS_SET_RVAL(cx,vp,rval);
658 return JS_TRUE;
659}
660JSBool MFInt32ConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
661
662 JSObject *_arrayObj;
663 int isArray;
664 int32 _i;
665 unsigned int i;
666 union anyVrml *anyv;
667 #ifdef JSVRMLCLASSESVERBOSE
668 printf ("start of MFInt32Constr\n");
669 #endif
670
671 ADD_ROOT(cx,obj)
672 isArray = FALSE;
673 if(argc == 1 && argv){
674 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
675 // tests/JohnCarlson/Arc1A.x3d
676 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
677 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
678 return JS_FALSE;
679 }
680
681 if(JS_IsArrayObject(cx, _arrayObj)){
682 jsuint lengthp;
683 jsval vp;
684 //printf("its an array\n");
685 isArray = TRUE;
686 JS_GetArrayLength(cx,_arrayObj, &lengthp);
687 argc = lengthp;
688 }
689 }
690
691 if(SM_method() == 2){
692 AnyNative *any;
693 int newsize;
694 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFInt32,NULL,NULL)) == NULL){
695 printf( "AnyfNativeNew failed in MFInt32Constr.\n");
696 return JS_FALSE;
697 }
698 if (!JS_SetPrivateFw(cx, obj, any)) {
699 printf( "JS_SetPrivate failed in MFInt32Constr.\n");
700 return JS_FALSE;
701 }
702 anyv = any->v;
703 newsize = sizeof(int) * upper_power_of_two(argc); //newsize in bytes
704 if(argc > 0){
705 anyv->mfint32.p = MALLOC(int*,newsize);
706 memset(anyv->mfint32.p,0,newsize);
707 }
708
709 }else{
710 DEFINE_LENGTH(cx,obj,argc)
711 DEFINE_MF_ECMA_HAS_CHANGED
712 }
713 if (!argv) {
714 return JS_TRUE;
715 }
716
717 #ifdef JSVRMLCLASSESVERBOSE
718 printf("MFInt32Constr: obj = %p, %u args\n", obj, argc);
719 #endif
720
721 /* any values here that we should add in? */
722 for (i = 0; i < argc; i++) {
723 jsval vp;
724 if(isArray){
725 JS_GetElement(cx, _arrayObj, i, &vp);
726
727 }else{
728 vp = argv[i];
729 }
730 //if (!JS::ToInt32(cx, vp, &_i)) {
731 //if (!JS::ToInt32(cx, vp, &_i)) {
732 if(!vp.isInt32()){
733 printf( "JS_ValueToInt32 failed in MFInt32Constr.\n");
734 return JS_FALSE;
735 }
736 _i = vp.toInt32();
737 #ifdef JSVRMLCLASSESVERBOSE
738 printf ("value at %d is %d\n",i,_i);
739 #endif
740 if(SM_method()==2){
741 anyv->mfint32.p[i] = _i;
742 anyv->mfint32.n = i+1;
743 }else{
744 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
745 printf( "JS_DefineElement failed for arg %u in MFInt32Constr.\n", i);
746 return JS_FALSE;
747 }
748 }
749 }
750
751 *rval = OBJECT_TO_JSVAL(obj);
752 return JS_TRUE;
753}
754
755JSBool
756MFInt32AddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
757 JSObject *obj = *hobj.address();
758 jsid id = *hiid.address();
759 jsval *vp = hvp.address();
760
761 #ifdef JSVRMLCLASSESVERBOSE
762 printf ("start of MFInt32AddProperty\n");
763 #endif
764
765 return doMFAddProperty(cx, obj, id, vp,"MFInt32AddProperty");
766}
767
768JSBool
769MFInt32GetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
770 JSObject *obj = *hobj.address();
771 jsid id = *hiid.address();
772 jsval *vp = hvp.address();
773
774 #ifdef JSVRMLCLASSESVERBOSE
775 printf ("start of MFInt32GetProperty\n");
776 #endif
777
778 return _standardMFGetProperty(cx, obj, id, vp,
779 "_FreeWRL_Internal = 0", FIELDTYPE_MFInt32);
780}
781
782JSBool
783MFInt32SetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, 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 MFInt32SetProperty\n");
790 #endif
791
792 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFInt32);
793}
794
795// MFBool
796JSBool
797MFBoolToString(JSContext* cx, uintN argc, jsval* vp) {
798 JSObject* obj = JS_THIS_OBJECT(cx, vp);
799 jsval* argv = JS_ARGV(cx, vp);
800 jsval rval;
801
802 UNUSED(argc);
803 UNUSED(argv);
804#ifdef JSVRMLCLASSESVERBOSE
805 printf("start of MFBoolToString\n");
806#endif
807
808 if (!doMFToString(cx, obj, "MFBool", &rval)) { return JS_FALSE; }
809 JS_SET_RVAL(cx, vp, rval);
810 return JS_TRUE;
811
812}
813
814JSBool
815MFBoolAssign(JSContext* cx, uintN argc, jsval* vp) {
816 JSObject* obj = JS_THIS_OBJECT(cx, vp);
817 jsval* argv = JS_ARGV(cx, vp);
818 jsval rval;
819
820#ifdef JSVRMLCLASSESVERBOSE
821 printf("start of MFBoolAssign\n");
822#endif
823
824 SET_MF_ECMA_HAS_CHANGED
825
826 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFBoolClass, FIELDTYPE_SFBool)) { return JS_FALSE; }
827 JS_SET_RVAL(cx, vp, rval);
828 return JS_TRUE;
829
830}
831
832
833JSBool
834MFBoolConstr(JSContext* cx, uintN argc, jsval* vp) {
835 JSObject* obj = JS_NewObject(cx, &MFBoolClass, NULL, NULL);
836 jsval* argv = JS_ARGV(cx, vp);
837 jsval rval = OBJECT_TO_JSVAL(obj);
838 if (!MFBoolConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
839 JS_SET_RVAL(cx, vp, rval);
840 return JS_TRUE;
841}
842JSBool MFBoolConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
843
844 JSObject* _arrayObj;
845 int isArray;
846 int32 _i;
847 unsigned int i;
848 union anyVrml* anyv;
849#ifdef JSVRMLCLASSESVERBOSE
850 printf("start of MFBoolConstr\n");
851#endif
852
853 ADD_ROOT(cx, obj)
854 isArray = FALSE;
855 if (argc == 1 && argv) {
856 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
857 // tests/JohnCarlson/Arc1A.x3d
858 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
859 printf("JS_ValueToObject failed in MFBoolConstr.\n");
860 return JS_FALSE;
861 }
862
863 if (JS_IsArrayObject(cx, _arrayObj)) {
864 jsuint lengthp;
865 jsval vp;
866 //printf("its an array\n");
867 isArray = TRUE;
868 JS_GetArrayLength(cx, _arrayObj, &lengthp);
869 argc = lengthp;
870 }
871 }
872
873 if (SM_method() == 2) {
874 AnyNative* any;
875 int newsize;
876 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFBool, NULL, NULL)) == NULL) {
877 printf("AnyfNativeNew failed in MFBoolConstr.\n");
878 return JS_FALSE;
879 }
880 if (!JS_SetPrivateFw(cx, obj, any)) {
881 printf("JS_SetPrivate failed in MFBoolConstr.\n");
882 return JS_FALSE;
883 }
884 anyv = any->v;
885 newsize = sizeof(int) * upper_power_of_two(argc); //newsize in bytes
886 if (argc > 0) {
887 anyv->mfbool.p = MALLOC(int*, newsize);
888 memset(anyv->mfbool.p, 0, newsize);
889 }
890
891 }
892 else {
893 DEFINE_LENGTH(cx, obj, argc)
894 DEFINE_MF_ECMA_HAS_CHANGED
895 }
896 if (!argv) {
897 return JS_TRUE;
898 }
899
900#ifdef JSVRMLCLASSESVERBOSE
901 printf("MFBoolConstr: obj = %p, %u args\n", obj, argc);
902#endif
903
904 /* any values here that we should add in? */
905 for (i = 0; i < argc; i++) {
906 jsval vp;
907 if (isArray) {
908 JS_GetElement(cx, _arrayObj, i, &vp);
909
910 }
911 else {
912 vp = argv[i];
913 }
914 //if (!JS::ToInt32(cx, vp, &_i)) {
915 //if (!JS::ToInt32(cx, vp, &_i)) {
916 if (!vp.isInt32()) {
917 printf("JS_ValueToInt32 failed in MFBoolConstr.\n");
918 return JS_FALSE;
919 }
920 _i = vp.toInt32();
921#ifdef JSVRMLCLASSESVERBOSE
922 printf("value at %d is %d\n", i, _i);
923#endif
924 if (SM_method() == 2) {
925 anyv->mfbool.p[i] = _i;
926 anyv->mfbool .n = i + 1;
927 }
928 else {
929 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
930 printf("JS_DefineElement failed for arg %u in MFBoolConstr.\n", i);
931 return JS_FALSE;
932 }
933 }
934 }
935
936 *rval = OBJECT_TO_JSVAL(obj);
937 return JS_TRUE;
938}
939
940JSBool
941MFBoolAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
942 JSObject* obj = *hobj.address();
943 jsid id = *hiid.address();
944 jsval* vp = hvp.address();
945
946#ifdef JSVRMLCLASSESVERBOSE
947 printf("start of MFBoolAddProperty\n");
948#endif
949
950 return doMFAddProperty(cx, obj, id, vp, "MFBoolAddProperty");
951}
952
953JSBool
954MFBoolGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
955 JSObject* obj = *hobj.address();
956 jsid id = *hiid.address();
957 jsval* vp = hvp.address();
958
959#ifdef JSVRMLCLASSESVERBOSE
960 printf("start of MFBoolGetProperty\n");
961#endif
962
963 return _standardMFGetProperty(cx, obj, id, vp,
964 "_FreeWRL_Internal = 0", FIELDTYPE_MFBool);
965}
966
967JSBool
968MFBoolSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
969 JSObject* obj = *hobj.address();
970 jsid id = *hiid.address();
971 jsval* vp = hvp.address();
972
973#ifdef JSVRMLCLASSESVERBOSE
974 printf("start of MFBoolSetProperty\n");
975#endif
976
977 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFBool);
978}
979
980
981// MFNode
982
983JSBool
984MFNodeToString(JSContext *cx, uintN argc, jsval *vp) {
985 JSObject *obj = JS_THIS_OBJECT(cx,vp);
986 jsval *argv = JS_ARGV(cx,vp);
987 jsval rval;
988
989 UNUSED(argc);
990 UNUSED(argv);
991
992 #ifdef JSVRMLCLASSESVERBOSE
993 printf ("start of MFNODETOSTRING, obj %p\n",obj);
994 #endif
995 if (!doMFToString(cx, obj, "MFNode", &rval)) { return JS_FALSE; }
996 JS_SET_RVAL(cx,vp,rval);
997 return JS_TRUE;
998
999}
1000
1001JSBool
1002MFNodeAssign(JSContext *cx, uintN argc, jsval *vp) {
1003 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1004 jsval *argv = JS_ARGV(cx,vp);
1005 jsval rval;
1006
1007 #ifdef JSVRMLCLASSESVERBOSE
1008 printf ("start of MFNODEASSIGN, obj %p\n",obj);
1009 #endif
1010
1011 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFNodeClass,FIELDTYPE_SFNode)) { return JS_FALSE; }
1012 JS_SET_RVAL(cx,vp,rval);
1013 return JS_TRUE;
1014
1015}
1016
1017JSBool
1018MFNodeConstr(JSContext *cx, uintN argc, jsval *vp) {
1019 JSObject *obj = JS_NewObject(cx,&MFNodeClass,NULL,NULL);
1020 jsval *argv = JS_ARGV(cx,vp);
1021 jsval rval = OBJECT_TO_JSVAL(obj);
1022 if (!MFNodeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1023 JS_SET_RVAL(cx,vp,rval);
1024 return JS_TRUE;
1025}
1026JSBool MFNodeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1027
1028 JSObject *_arrayObj;
1029 int isArray;
1030 JSObject *_obj;
1031 unsigned int i;
1032 union anyVrml *anyv;
1033
1034 ADD_ROOT(cx,obj)
1035 isArray = FALSE;
1036 if(argc == 1 && argv){
1037 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1038 // tests/JohnCarlson/Arc1A.x3d
1039 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1040 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1041 return JS_FALSE;
1042 }
1043
1044 if(JS_IsArrayObject(cx, _arrayObj)){
1045 jsuint lengthp;
1046 jsval vp;
1047 //printf("its an array\n");
1048 isArray = TRUE;
1049 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1050 argc = lengthp;
1051 }
1052 }
1053
1054 if(SM_method() == 2){
1055 AnyNative *any;
1056 int newsize;
1057 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFNode,NULL,NULL)) == NULL){
1058 printf( "AnyfNativeNew failed in MFNodeConstr.\n");
1059 return JS_FALSE;
1060 }
1061 if (!JS_SetPrivateFw(cx, obj, any)) {
1062 printf( "JS_SetPrivate failed in MFNodeConstr.\n");
1063 return JS_FALSE;
1064 }
1065 anyv = any->v;
1066 newsize = sizeof(struct X3D_Node *) * upper_power_of_two(argc); //newsize in bytes
1067 if(argc > 0){
1068 anyv->mfnode.p = MALLOC(struct X3D_Node**,newsize);
1069 memset(anyv->mfnode.p,0,newsize);
1070 }
1071
1072 }else{
1073 DEFINE_LENGTH(cx,obj,argc)
1074 }
1075 if (!argv) {
1076 return JS_TRUE;
1077 }
1078
1079 #ifdef JSVRMLCLASSESVERBOSE
1080 printf("MFNodeConstr: obj = %p, %u args\n", obj, argc);
1081 #endif
1082
1083 for (i = 0; i < argc; i++) {
1084 jsval vp;
1085 if(isArray){
1086 JS_GetElement(cx, _arrayObj, i, &vp);
1087
1088 }else{
1089 vp = argv[i];
1090 }
1091 //if (JSVAL_IS_OBJECT(vp)) {
1092 if ((vp).isObject()) {
1093
1094 if (!JS_ValueToObject(cx, vp, &_obj)) {
1095 printf( "JS_ValueToObject failed in MFNodeConstr.\n");
1096 return JS_FALSE;
1097 }
1098
1099 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFNodeClass)
1100 if(SM_method()==2){
1101 AnyNative *any2;
1102 if((any2 = (AnyNative *)JS_GetPrivateFw(cx,_obj)) != NULL){
1103 if(any2->type == FIELDTYPE_SFNode){
1104 shallow_copy_field(FIELDTYPE_SFNode,any2->v,(union anyVrml*)&anyv->mfnode.p[i]);
1105 anyv->mfnode.n = i+1;
1106 }
1107 }
1108 // else for now we'll leave zeros
1109 }else{
1110 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1111 printf( "JS_DefineElement failed for arg %d in MFNodeConstr.\n", i);
1112 return JS_FALSE;
1113 }
1114 }
1115 } else {
1116 /* if a NULL is passed in, eg, we have a script with an MFNode eventOut, and
1117 nothing sets it, we have a NULL here. Lets just ignore it */
1118 /* hmmm - this is not an object - lets see... */
1119 #ifdef JSVRMLCLASSESVERBOSE
1120 if (JSVAL_IS_NULL(argv[i])) { printf ("MFNodeConstr - its a NULL\n");}
1121 if (JSVAL_IS_INT(argv[i])) { printf ("MFNodeConstr - its a INT\n");}
1122 if (JSVAL_IS_STRING(argv[i])) { printf ("MFNodeConstr - its a STRING\n");}
1123 #endif
1124 }
1125 }
1126 *rval = OBJECT_TO_JSVAL(obj);
1127 return JS_TRUE;
1128}
1129
1130JSBool
1131MFNodeAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1132 JSObject *obj = *hobj.address();
1133 jsid id = *hiid.address();
1134 jsval *vp = hvp.address();
1135
1136 #ifdef JSVRMLCLASSESVERBOSE
1137 printf ("startof MFNODEADDPROPERTY\n");
1138 #endif
1139 return doMFAddProperty(cx, obj, id, vp,"MFNodeAddProperty");
1140}
1141
1142JSBool
1143MFNodeGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1144 JSObject *obj = *hobj.address();
1145 jsid id = *hiid.address();
1146 jsval *vp = hvp.address();
1147
1148 #ifdef JSVRMLCLASSESVERBOSE
1149 printf ("start of MFNODEGETPROPERTY obj %p\n",obj);
1150 #endif
1151 return _standardMFGetProperty(cx, obj, id, vp,
1152 "_FreeWRL_Internal = 0",
1153 FIELDTYPE_MFNode);
1154}
1155
1156JSBool
1157MFNodeSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
1158 JSObject *obj = *hobj.address();
1159 jsid id = *hiid.address();
1160 jsval *vp = hvp.address();
1161 /* printf ("start of MFNODESETPROPERTY obj %d\n",obj); */
1162 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFNode);
1163}
1164
1165// MFTime
1166
1167JSBool
1168MFTimeAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1169 JSObject *obj = *hobj.address();
1170 jsid id = *hiid.address();
1171 jsval *vp = hvp.address();
1172
1173 return doMFAddProperty(cx, obj, id, vp,"MFTimeAddProperty");
1174}
1175
1176JSBool
1177MFTimeGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1178 JSObject *obj = *hobj.address();
1179 jsid id = *hiid.address();
1180 jsval *vp = hvp.address();
1181
1182 return _standardMFGetProperty(cx, obj, id, vp,
1183 "_FreeWRL_Internal = 0.0",
1184 FIELDTYPE_MFTime);
1185}
1186
1187JSBool
1188MFTimeSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
1189 JSObject *obj = *hobj.address();
1190 jsid id = *hiid.address();
1191 jsval *vp = hvp.address();
1192
1193 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFTime);
1194}
1195
1196JSBool
1197MFTimeToString(JSContext *cx, uintN argc, jsval *vp) {
1198 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1199 jsval *argv = JS_ARGV(cx,vp);
1200 jsval rval;
1201
1202 UNUSED(argc);
1203 UNUSED(argv);
1204 if (!doMFToString(cx, obj, "MFTime", &rval)) { return JS_FALSE; }
1205 JS_SET_RVAL(cx,vp,rval);
1206 return JS_TRUE;
1207
1208}
1209
1210JSBool
1211MFTimeConstr(JSContext *cx, uintN argc, jsval *vp) {
1212 JSObject *obj = JS_NewObject(cx,&MFTimeClass,NULL,NULL);
1213 jsval *argv = JS_ARGV(cx,vp);
1214 jsval rval = OBJECT_TO_JSVAL(obj);
1215 if (!MFTimeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1216 JS_SET_RVAL(cx,vp,rval);
1217 return JS_TRUE;
1218}
1219JSBool MFTimeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1220
1221 JSObject *_arrayObj;
1222 int isArray;
1223 jsdouble _d;
1224 unsigned int i;
1225 union anyVrml *anyv;
1226
1227 ADD_ROOT(cx,obj)
1228 isArray = FALSE;
1229 if(argc == 1 && argv){
1230 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1231 // tests/JohnCarlson/Arc1A.x3d
1232 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1233 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1234 return JS_FALSE;
1235 }
1236
1237 if(JS_IsArrayObject(cx, _arrayObj)){
1238 jsuint lengthp;
1239 jsval vp;
1240 //printf("its an array\n");
1241 isArray = TRUE;
1242 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1243 argc = lengthp;
1244 }
1245 }
1246
1247 if(SM_method() == 2){
1248 AnyNative *any;
1249 int newsize;
1250 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFTime,NULL,NULL)) == NULL){
1251 printf( "AnyfNativeNew failed in MFTimeConstr.\n");
1252 return JS_FALSE;
1253 }
1254 if (!JS_SetPrivateFw(cx, obj, any)) {
1255 printf( "JS_SetPrivate failed in MFTimeConstr.\n");
1256 return JS_FALSE;
1257 }
1258 anyv = any->v;
1259 newsize = sizeof(double) * upper_power_of_two(argc); //newsize in bytes
1260 if(argc > 0){
1261 anyv->mftime.p = MALLOC(double*,newsize);
1262 memset(anyv->mftime.p,0,newsize);
1263 }
1264
1265 }else{
1266 DEFINE_LENGTH(cx,obj,argc)
1267 DEFINE_MF_ECMA_HAS_CHANGED
1268 }
1269 if (!argv) {
1270 return JS_TRUE;
1271 }
1272
1273 #ifdef JSVRMLCLASSESVERBOSE
1274 printf("MFTimeConstr: obj = %p, %u args\n", obj, argc);
1275 #endif
1276 for (i = 0; i < argc; i++) {
1277 jsval vp;
1278 if(isArray){
1279 JS_GetElement(cx, _arrayObj, i, &vp);
1280
1281 }else{
1282 vp = argv[i];
1283 }
1284 if (!JS_ValueToNumber(cx, vp, &_d)) {
1285 printf(
1286 "JS_ValueToNumber failed in MFTimeConstr.\n");
1287 return JS_FALSE;
1288 }
1289 if(SM_method()==2){
1290 anyv->mftime.p[i] = _d;
1291 anyv->mftime.n = i+1;
1292 }else{
1293 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1294 printf( "JS_DefineElement failed for arg %u in MFTimeConstr.\n", i);
1295 return JS_FALSE;
1296 }
1297 }
1298 }
1299 *rval = OBJECT_TO_JSVAL(obj);
1300 return JS_TRUE;
1301}
1302
1303JSBool
1304MFTimeAssign(JSContext *cx, uintN argc, jsval *vp) {
1305 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1306 jsval *argv = JS_ARGV(cx,vp);
1307 jsval rval;
1308
1309 SET_MF_ECMA_HAS_CHANGED
1310
1311 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFTimeClass,FIELDTYPE_SFTime)) { return JS_FALSE; }
1312 JS_SET_RVAL(cx,vp,rval);
1313 return JS_TRUE;
1314
1315}
1316
1317// MFDouble
1318
1319JSBool
1320MFDoubleAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1321 JSObject* obj = *hobj.address();
1322 jsid id = *hiid.address();
1323 jsval* vp = hvp.address();
1324
1325 return doMFAddProperty(cx, obj, id, vp, "MFDoubleAddProperty");
1326}
1327
1328JSBool
1329MFDoubleGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1330 JSObject* obj = *hobj.address();
1331 jsid id = *hiid.address();
1332 jsval* vp = hvp.address();
1333
1334 return _standardMFGetProperty(cx, obj, id, vp,
1335 "_FreeWRL_Internal = 0.0",
1336 FIELDTYPE_MFDouble);
1337}
1338
1339JSBool
1340MFDoubleSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
1341 JSObject* obj = *hobj.address();
1342 jsid id = *hiid.address();
1343 jsval* vp = hvp.address();
1344
1345 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFDouble);
1346}
1347
1348JSBool
1349MFDoubleToString(JSContext* cx, uintN argc, jsval* vp) {
1350 JSObject* obj = JS_THIS_OBJECT(cx, vp);
1351 jsval* argv = JS_ARGV(cx, vp);
1352 jsval rval;
1353
1354 UNUSED(argc);
1355 UNUSED(argv);
1356 if (!doMFToString(cx, obj, "MFDouble", &rval)) { return JS_FALSE; }
1357 JS_SET_RVAL(cx, vp, rval);
1358 return JS_TRUE;
1359
1360}
1361
1362JSBool
1363MFDoubleConstr(JSContext* cx, uintN argc, jsval* vp) {
1364 JSObject* obj = JS_NewObject(cx, &MFDoubleClass, NULL, NULL);
1365 jsval* argv = JS_ARGV(cx, vp);
1366 jsval rval = OBJECT_TO_JSVAL(obj);
1367 if (!MFDoubleConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
1368 JS_SET_RVAL(cx, vp, rval);
1369 return JS_TRUE;
1370}
1371JSBool MFDoubleConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
1372
1373 JSObject* _arrayObj;
1374 int isArray;
1375 jsdouble _d;
1376 unsigned int i;
1377 union anyVrml* anyv;
1378
1379 ADD_ROOT(cx, obj)
1380 isArray = FALSE;
1381 if (argc == 1 && argv) {
1382 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1383 // tests/JohnCarlson/Arc1A.x3d
1384 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1385 printf("JS_ValueToObject failed in MFVec3fConstr.\n");
1386 return JS_FALSE;
1387 }
1388
1389 if (JS_IsArrayObject(cx, _arrayObj)) {
1390 jsuint lengthp;
1391 jsval vp;
1392 //printf("its an array\n");
1393 isArray = TRUE;
1394 JS_GetArrayLength(cx, _arrayObj, &lengthp);
1395 argc = lengthp;
1396 }
1397 }
1398
1399 if (SM_method() == 2) {
1400 AnyNative* any;
1401 int newsize;
1402 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFDouble, NULL, NULL)) == NULL) {
1403 printf("AnyfNativeNew failed in MFTimeConstr.\n");
1404 return JS_FALSE;
1405 }
1406 if (!JS_SetPrivateFw(cx, obj, any)) {
1407 printf("JS_SetPrivate failed in MFDoubleConstr.\n");
1408 return JS_FALSE;
1409 }
1410 anyv = any->v;
1411 newsize = sizeof(double) * upper_power_of_two(argc); //newsize in bytes
1412 if (argc > 0) {
1413 anyv->mfdouble.p = MALLOC(double*, newsize);
1414 memset(anyv->mfdouble.p, 0, newsize);
1415 }
1416
1417 }
1418 else {
1419 DEFINE_LENGTH(cx, obj, argc)
1420 DEFINE_MF_ECMA_HAS_CHANGED
1421 }
1422 if (!argv) {
1423 return JS_TRUE;
1424 }
1425
1426#ifdef JSVRMLCLASSESVERBOSE
1427 printf("MFDoubleConstr: obj = %p, %u args\n", obj, argc);
1428#endif
1429 for (i = 0; i < argc; i++) {
1430 jsval vp;
1431 if (isArray) {
1432 JS_GetElement(cx, _arrayObj, i, &vp);
1433
1434 }
1435 else {
1436 vp = argv[i];
1437 }
1438 if (!JS_ValueToNumber(cx, vp, &_d)) {
1439 printf(
1440 "JS_ValueToNumber failed in MFDoubleConstr.\n");
1441 return JS_FALSE;
1442 }
1443 if (SM_method() == 2) {
1444 anyv->mfdouble.p[i] = _d;
1445 anyv->mfdouble.n = i + 1;
1446 }
1447 else {
1448 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1449 printf("JS_DefineElement failed for arg %u in MFTimeConstr.\n", i);
1450 return JS_FALSE;
1451 }
1452 }
1453 }
1454 *rval = OBJECT_TO_JSVAL(obj);
1455 return JS_TRUE;
1456}
1457
1458JSBool
1459MFDoubleAssign(JSContext* cx, uintN argc, jsval* vp) {
1460 JSObject* obj = JS_THIS_OBJECT(cx, vp);
1461 jsval* argv = JS_ARGV(cx, vp);
1462 jsval rval;
1463
1464 SET_MF_ECMA_HAS_CHANGED
1465
1466 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFDoubleClass, FIELDTYPE_SFDouble)) { return JS_FALSE; }
1467 JS_SET_RVAL(cx, vp, rval);
1468 return JS_TRUE;
1469
1470}
1471
1472// MFVec2f
1473
1474JSBool
1475MFVec2fAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1476 JSObject *obj = *hobj.address();
1477 jsid id = *hiid.address();
1478 jsval *vp = hvp.address();
1479
1480 return doMFAddProperty(cx, obj, id, vp,"MFVec2fAddProperty");
1481}
1482
1483JSBool
1484MFVec2fGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1485 JSObject *obj = *hobj.address();
1486 jsid id = *hiid.address();
1487 jsval *vp = hvp.address();
1488
1489 return _standardMFGetProperty(cx, obj, id, vp,
1490 "_FreeWRL_Internal = new SFVec2f()",FIELDTYPE_MFVec2f);
1491}
1492
1493JSBool
1494MFVec2fSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
1495 JSObject *obj = *hobj.address();
1496 jsid id = *hiid.address();
1497 jsval *vp = hvp.address();
1498
1499 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec2f);
1500}
1501
1502JSBool
1503MFVec2fToString(JSContext *cx, uintN argc, jsval *vp) {
1504 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1505 jsval *argv = JS_ARGV(cx,vp);
1506 jsval rval;
1507
1508 UNUSED(argc);
1509 UNUSED(argv);
1510 if (!doMFToString(cx, obj, "MFVec2f", &rval)) { return JS_FALSE; }
1511 JS_SET_RVAL(cx,vp,rval);
1512 return JS_TRUE;
1513
1514}
1515
1516JSBool
1517MFVec2fConstr(JSContext *cx, uintN argc, jsval *vp) {
1518 JSObject *obj = JS_NewObject(cx,&MFVec2fClass,NULL,NULL);
1519 jsval *argv = JS_ARGV(cx,vp);
1520 jsval rval = OBJECT_TO_JSVAL(obj);
1521 if (!MFVec2fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1522 JS_SET_RVAL(cx,vp,rval);
1523 return JS_TRUE;
1524}
1525JSBool MFVec2fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1526
1527 JSObject *_arrayObj;
1528 int isArray;
1529 JSObject *_obj;
1530 unsigned int i;
1531 union anyVrml *anyv;
1532
1533 ADD_ROOT(cx,obj)
1534 isArray = FALSE;
1535 if(argc == 1 && argv){
1536 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1537 // tests/JohnCarlson/Arc1A.x3d
1538 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1539 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1540 return JS_FALSE;
1541 }
1542
1543 if(JS_IsArrayObject(cx, _arrayObj)){
1544 jsuint lengthp;
1545 jsval vp;
1546 //printf("its an array\n");
1547 isArray = TRUE;
1548 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1549 argc = lengthp;
1550 }
1551 }
1552
1553 if(SM_method() == 2){
1554 AnyNative *any;
1555 int newsize;
1556 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec2f,NULL,NULL)) == NULL){
1557 printf( "AnyfNativeNew failed in MFVec2fConstr.\n");
1558 return JS_FALSE;
1559 }
1560 if (!JS_SetPrivateFw(cx, obj, any)) {
1561 printf( "JS_SetPrivate failed in MFVec2fConstr.\n");
1562 return JS_FALSE;
1563 }
1564 anyv = any->v;
1565 newsize = sizeof(struct SFVec2f)*upper_power_of_two(argc);
1566 if(argc > 0){
1567 anyv->mfvec2f.p = MALLOC(struct SFVec2f*,newsize);
1568 memset(anyv->mfvec2f.p,0,newsize);
1569 }
1570
1571 }else{
1572 DEFINE_LENGTH(cx,obj,argc)
1573 }
1574
1575 if (!argv) {
1576 return JS_TRUE;
1577 }
1578
1579 #ifdef JSVRMLCLASSESVERBOSE
1580 printf("MFVec2fConstr: obj = %p, %u args\n", obj, argc);
1581 #endif
1582
1583 for (i = 0; i < argc; i++) {
1584 jsval vp;
1585 if(isArray){
1586 JS_GetElement(cx, _arrayObj, i, &vp);
1587
1588 }else{
1589 vp = argv[i];
1590 }
1591 if (!JS_ValueToObject(cx, vp, &_obj)) {
1592 printf( "JS_ValueToObject failed in MFVec2fConstr.\n");
1593 return JS_FALSE;
1594 }
1595
1596 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec2fClass)
1597 if(SM_method()==2){
1598 AnyNative *any2;
1599 if((any2 = (AnyNative *)JS_GetPrivateFw(cx,_obj)) != NULL){
1600 //2018 I think as long as its 2+ contiguous floats, we can use it as a vec2f,
1601 // but in future internal types might change
1602 if(any2->type == FIELDTYPE_SFVec2f || any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColorRGBA){
1603 shallow_copy_field(FIELDTYPE_SFVec2f,any2->v,(union anyVrml*)&anyv->mfvec2f.p[i]);
1604 anyv->mfvec2f.n = i+1;
1605 }
1606 }
1607 // else for now we'll leave zeros
1608 }else{
1609 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1610 printf( "JS_DefineElement failed for arg %d in MFVec2fConstr.\n", i);
1611 return JS_FALSE;
1612 }
1613 }
1614 }
1615 *rval = OBJECT_TO_JSVAL(obj);
1616 return JS_TRUE;
1617}
1618
1619JSBool
1620MFVec2fAssign(JSContext *cx, uintN argc, jsval *vp) {
1621 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1622 jsval *argv = JS_ARGV(cx,vp);
1623 jsval rval;
1624 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec2fClass,FIELDTYPE_SFVec2f)) { return JS_FALSE; }
1625 JS_SET_RVAL(cx,vp,rval);
1626 return JS_TRUE;
1627
1628}
1629
1630// MFVec3f
1631JSBool
1632MFVec3fAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1633 JSObject *obj = *hobj.address();
1634 jsid id = *hiid.address();
1635 jsval *vp = hvp.address();
1636 return doMFAddProperty(cx, obj, id, vp,"MFVec3fAddProperty");
1637}
1638
1639JSBool
1640MFVec3fGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
1641 JSObject *obj = *hobj.address();
1642 jsid id = *hiid.address();
1643 jsval *vp = hvp.address();
1644
1645 return _standardMFGetProperty(cx, obj, id, vp,
1646 "_FreeWRL_Internal = new SFVec3f()",FIELDTYPE_MFVec3f);
1647}
1648
1649JSBool
1650MFVec3fSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
1651 JSObject *obj = *hobj.address();
1652 jsid id = *hiid.address();
1653 jsval *vp = hvp.address();
1654
1655 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec3f);
1656}
1657
1658JSBool
1659MFVec3fToString(JSContext *cx, uintN argc, jsval *vp) {
1660 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1661 jsval *argv = JS_ARGV(cx,vp);
1662 jsval rval;
1663
1664 UNUSED(argc);
1665 UNUSED(argv);
1666 /* printf ("CALLED MFVec3fToString\n");*/
1667 if (!doMFToString(cx, obj, "MFVec3f", &rval)) { return JS_FALSE; }
1668 JS_SET_RVAL(cx,vp,rval);
1669 return JS_TRUE;
1670
1671}
1672
1673JSBool
1674MFVec3fConstr(JSContext *cx, uintN argc, jsval *vp) {
1675 JSObject *obj = JS_NewObject(cx,&MFVec3fClass,NULL,NULL);
1676 jsval *argv = JS_ARGV(cx,vp);
1677 jsval rval = OBJECT_TO_JSVAL(obj);
1678 if (!MFVec3fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1679 JS_SET_RVAL(cx,vp,rval);
1680 return JS_TRUE;
1681}
1682JSBool MFVec3fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1683
1684 JSObject *_arrayObj;
1685 int isArray;
1686 JSObject *_obj;
1687 unsigned int i;
1688 union anyVrml *anyv;
1689
1690 ADD_ROOT(cx,obj)
1691
1692 isArray = FALSE;
1693 if(argc == 1 && argv){
1694 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1695 // tests/JohnCarlson/Arc1A.x3d
1696 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1697 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1698 return JS_FALSE;
1699 }
1700
1701 if(JS_IsArrayObject(cx, _arrayObj)){
1702 jsuint lengthp;
1703 jsval vp;
1704 //printf("its an array\n");
1705 isArray = TRUE;
1706 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1707 argc = lengthp;
1708 }
1709 }
1710
1711
1712
1713 if(SM_method() == 2){
1714 AnyNative *any;
1715 int newsize;
1716 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec3f,NULL,NULL)) == NULL){
1717 printf( "AnyfNativeNew failed in MFVec3fConstr.\n");
1718 return JS_FALSE;
1719 }
1720 if (!JS_SetPrivateFw(cx, obj, any)) {
1721 printf( "JS_SetPrivate failed in MFVec3fConstr.\n");
1722 return JS_FALSE;
1723 }
1724 anyv = any->v;
1725 newsize = sizeof(struct SFVec3f)*upper_power_of_two(argc);
1726 if(argc > 0){
1727 anyv->mfvec3f.p = MALLOC(struct SFVec3f*,newsize);
1728 memset(anyv->mfvec3f.p,0,newsize);
1729 }
1730
1731 }else{
1732 DEFINE_LENGTH(cx,obj,argc)
1733 }
1734 if (!argv) {
1735 return JS_TRUE;
1736 }
1737
1738 #ifdef JSVRMLCLASSESVERBOSE
1739 printf("MFVec3fConstr: obj = %p, %u args\n", obj, argc);
1740 #endif
1741 for (i = 0; i < argc; i++) {
1742 jsval vp;
1743 if(isArray){
1744 JS_GetElement(cx, _arrayObj, i, &vp);
1745
1746 }else{
1747 vp = argv[i];
1748 }
1749 if (!JS_ValueToObject(cx, vp, &_obj)) {
1750 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1751 return JS_FALSE;
1752 }
1753
1754 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec3fClass)
1755
1756 if(SM_method()==2){
1757 AnyNative *any2;
1758 if((any2 = (AnyNative *)JS_GetPrivateFw(cx,_obj)) != NULL){
1759 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
1760 // but in future internal types might change
1761 if(any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFColorRGBA){
1762 shallow_copy_field(FIELDTYPE_SFVec3f,any2->v,(union anyVrml*)&anyv->mfvec3f.p[i]);
1763 anyv->mfvec3f.n = i+1;
1764 }
1765 }
1766 // else for now we'll leave zeros
1767 }else{
1768
1769 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1770 printf( "JS_DefineElement failed for arg %d in MFVec3fConstr.\n", i);
1771 return JS_FALSE;
1772 }
1773 }
1774 }
1775 *rval = OBJECT_TO_JSVAL(obj);
1776 return JS_TRUE;
1777}
1778
1779JSBool
1780MFVec3fAssign(JSContext *cx, uintN argc, jsval *vp) {
1781 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1782 jsval *argv = JS_ARGV(cx,vp);
1783 jsval rval;
1784 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec3fClass,FIELDTYPE_SFVec3f)) { return JS_FALSE; }
1785 JS_SET_RVAL(cx,vp,rval);
1786 return JS_TRUE;
1787}
1788
1789
1790// MFVec4f
1791JSBool
1792MFVec4fAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1793 JSObject* obj = *hobj.address();
1794 jsid id = *hiid.address();
1795 jsval* vp = hvp.address();
1796 return doMFAddProperty(cx, obj, id, vp, "MFVec4fAddProperty");
1797}
1798
1799JSBool
1800MFVec4fGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1801 JSObject* obj = *hobj.address();
1802 jsid id = *hiid.address();
1803 jsval* vp = hvp.address();
1804
1805 return _standardMFGetProperty(cx, obj, id, vp,
1806 "_FreeWRL_Internal = new SFVec4f()", FIELDTYPE_MFVec4f);
1807}
1808
1809JSBool
1810MFVec4fSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
1811 JSObject* obj = *hobj.address();
1812 jsid id = *hiid.address();
1813 jsval* vp = hvp.address();
1814
1815 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFVec4f);
1816}
1817
1818JSBool
1819MFVec4fToString(JSContext* cx, uintN argc, jsval* vp) {
1820 JSObject* obj = JS_THIS_OBJECT(cx, vp);
1821 jsval* argv = JS_ARGV(cx, vp);
1822 jsval rval;
1823
1824 UNUSED(argc);
1825 UNUSED(argv);
1826 /* printf ("CALLED MFVec4fToString\n");*/
1827 if (!doMFToString(cx, obj, "MFVec4f", &rval)) { return JS_FALSE; }
1828 JS_SET_RVAL(cx, vp, rval);
1829 return JS_TRUE;
1830
1831}
1832
1833JSBool
1834MFVec4fConstr(JSContext* cx, uintN argc, jsval* vp) {
1835 JSObject* obj = JS_NewObject(cx, &MFVec4fClass, NULL, NULL);
1836 jsval* argv = JS_ARGV(cx, vp);
1837 jsval rval = OBJECT_TO_JSVAL(obj);
1838 if (!MFVec4fConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
1839 JS_SET_RVAL(cx, vp, rval);
1840 return JS_TRUE;
1841}
1842JSBool MFVec4fConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
1843
1844 JSObject* _arrayObj;
1845 int isArray;
1846 JSObject* _obj;
1847 unsigned int i;
1848 union anyVrml* anyv;
1849
1850 ADD_ROOT(cx, obj)
1851
1852 isArray = FALSE;
1853 if (argc == 1 && argv) {
1854 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1855 // tests/JohnCarlson/Arc1A.x3d
1856 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1857 printf("JS_ValueToObject failed in MFVec4fConstr.\n");
1858 return JS_FALSE;
1859 }
1860
1861 if (JS_IsArrayObject(cx, _arrayObj)) {
1862 jsuint lengthp;
1863 jsval vp;
1864 //printf("its an array\n");
1865 isArray = TRUE;
1866 JS_GetArrayLength(cx, _arrayObj, &lengthp);
1867 argc = lengthp;
1868 }
1869 }
1870
1871
1872
1873 if (SM_method() == 2) {
1874 AnyNative* any;
1875 int newsize;
1876 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec4f, NULL, NULL)) == NULL) {
1877 printf("AnyfNativeNew failed in MFVec4fConstr.\n");
1878 return JS_FALSE;
1879 }
1880 if (!JS_SetPrivateFw(cx, obj, any)) {
1881 printf("JS_SetPrivate failed in MFVec4fConstr.\n");
1882 return JS_FALSE;
1883 }
1884 anyv = any->v;
1885 newsize = sizeof(struct SFVec4f) * upper_power_of_two(argc);
1886 if (argc > 0) {
1887 anyv->mfvec4f.p = MALLOC(struct SFVec4f*, newsize);
1888 memset(anyv->mfvec4f.p, 0, newsize);
1889 }
1890
1891 }
1892 else {
1893 DEFINE_LENGTH(cx, obj, argc)
1894 }
1895 if (!argv) {
1896 return JS_TRUE;
1897 }
1898
1899#ifdef JSVRMLCLASSESVERBOSE
1900 printf("MFVec4fConstr: obj = %p, %u args\n", obj, argc);
1901#endif
1902 for (i = 0; i < argc; i++) {
1903 jsval vp;
1904 if (isArray) {
1905 JS_GetElement(cx, _arrayObj, i, &vp);
1906
1907 }
1908 else {
1909 vp = argv[i];
1910 }
1911 if (!JS_ValueToObject(cx, vp, &_obj)) {
1912 printf("JS_ValueToObject failed in MFVec4fConstr.\n");
1913 return JS_FALSE;
1914 }
1915
1916 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFVec4fClass)
1917
1918 if (SM_method() == 2) {
1919 AnyNative* any2;
1920 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
1921 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
1922 // but in future internal types might change
1923 if (any2->type == FIELDTYPE_SFVec4f || any2->type == FIELDTYPE_SFColorRGBA) {
1924 shallow_copy_field(FIELDTYPE_SFVec4f, any2->v, (union anyVrml*)&anyv->mfvec4f.p[i]);
1925 anyv->mfvec4f.n = i + 1;
1926 }
1927 }
1928 // else for now we'll leave zeros
1929 }
1930 else {
1931
1932 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1933 printf("JS_DefineElement failed for arg %d in MFVec4fConstr.\n", i);
1934 return JS_FALSE;
1935 }
1936 }
1937 }
1938 *rval = OBJECT_TO_JSVAL(obj);
1939 return JS_TRUE;
1940}
1941
1942JSBool
1943MFVec4fAssign(JSContext* cx, uintN argc, jsval* vp) {
1944 JSObject* obj = JS_THIS_OBJECT(cx, vp);
1945 jsval* argv = JS_ARGV(cx, vp);
1946 jsval rval;
1947 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFVec4fClass, FIELDTYPE_SFVec4f)) { return JS_FALSE; }
1948 JS_SET_RVAL(cx, vp, rval);
1949 return JS_TRUE;
1950}
1951
1952
1953
1954//MFVec2d
1955JSBool
1956MFVec2dAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1957 JSObject* obj = *hobj.address();
1958 jsid id = *hiid.address();
1959 jsval* vp = hvp.address();
1960 return doMFAddProperty(cx, obj, id, vp, "MFVec2dAddProperty");
1961}
1962
1963JSBool
1964MFVec2dGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
1965 JSObject* obj = *hobj.address();
1966 jsid id = *hiid.address();
1967 jsval* vp = hvp.address();
1968
1969 return _standardMFGetProperty(cx, obj, id, vp,
1970 "_FreeWRL_Internal = new SFVec2d()", FIELDTYPE_MFVec2d);
1971}
1972
1973JSBool
1974MFVec2dSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
1975 JSObject* obj = *hobj.address();
1976 jsid id = *hiid.address();
1977 jsval* vp = hvp.address();
1978
1979 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFVec2d);
1980}
1981
1982JSBool
1983MFVec2dToString(JSContext* cx, uintN argc, jsval* vp) {
1984 JSObject* obj = JS_THIS_OBJECT(cx, vp);
1985 jsval* argv = JS_ARGV(cx, vp);
1986 jsval rval;
1987
1988 UNUSED(argc);
1989 UNUSED(argv);
1990 /* printf ("CALLED MFVec2dToString\n");*/
1991 if (!doMFToString(cx, obj, "MFVec2d", &rval)) { return JS_FALSE; }
1992 JS_SET_RVAL(cx, vp, rval);
1993 return JS_TRUE;
1994
1995}
1996
1997JSBool
1998MFVec2dConstr(JSContext* cx, uintN argc, jsval* vp) {
1999 JSObject* obj = JS_NewObject(cx, &MFVec2dClass, NULL, NULL);
2000 jsval* argv = JS_ARGV(cx, vp);
2001 jsval rval = OBJECT_TO_JSVAL(obj);
2002 if (!MFVec2dConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
2003 JS_SET_RVAL(cx, vp, rval);
2004 return JS_TRUE;
2005}
2006JSBool MFVec2dConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
2007
2008 JSObject* _arrayObj;
2009 int isArray;
2010 JSObject* _obj;
2011 unsigned int i;
2012 union anyVrml* anyv;
2013
2014 ADD_ROOT(cx, obj)
2015
2016 isArray = FALSE;
2017 if (argc == 1 && argv) {
2018 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2019 // tests/JohnCarlson/Arc1A.x3d
2020 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2021 printf("JS_ValueToObject failed in MFVec2dConstr.\n");
2022 return JS_FALSE;
2023 }
2024
2025 if (JS_IsArrayObject(cx, _arrayObj)) {
2026 jsuint lengthp;
2027 jsval vp;
2028 //printf("its an array\n");
2029 isArray = TRUE;
2030 JS_GetArrayLength(cx, _arrayObj, &lengthp);
2031 argc = lengthp;
2032 }
2033 }
2034
2035
2036
2037 if (SM_method() == 2) {
2038 AnyNative* any;
2039 int newsize;
2040 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec2d, NULL, NULL)) == NULL) {
2041 printf("AnyfNativeNew failed in MFVec2dConstr.\n");
2042 return JS_FALSE;
2043 }
2044 if (!JS_SetPrivateFw(cx, obj, any)) {
2045 printf("JS_SetPrivate failed in MFVec2dConstr.\n");
2046 return JS_FALSE;
2047 }
2048 anyv = any->v;
2049 newsize = sizeof(struct SFVec2d) * upper_power_of_two(argc);
2050 if (argc > 0) {
2051 anyv->mfvec2d.p = MALLOC(struct SFVec2d*, newsize);
2052 memset(anyv->mfvec2d.p, 0, newsize);
2053 }
2054
2055 }
2056 else {
2057 DEFINE_LENGTH(cx, obj, argc)
2058 }
2059 if (!argv) {
2060 return JS_TRUE;
2061 }
2062
2063#ifdef JSVRMLCLASSESVERBOSE
2064 printf("MFVec2dConstr: obj = %p, %u args\n", obj, argc);
2065#endif
2066 for (i = 0; i < argc; i++) {
2067 jsval vp;
2068 if (isArray) {
2069 JS_GetElement(cx, _arrayObj, i, &vp);
2070
2071 }
2072 else {
2073 vp = argv[i];
2074 }
2075 if (!JS_ValueToObject(cx, vp, &_obj)) {
2076 printf("JS_ValueToObject failed in MFVec2dConstr.\n");
2077 return JS_FALSE;
2078 }
2079
2080 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFVec2dClass)
2081
2082 if (SM_method() == 2) {
2083 AnyNative* any2;
2084 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
2085 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
2086 // but in future internal types might change
2087 if (any2->type == FIELDTYPE_SFVec2d || any2->type == FIELDTYPE_SFVec3d || any2->type == FIELDTYPE_SFVec4d) {
2088 shallow_copy_field(FIELDTYPE_SFVec2d, any2->v, (union anyVrml*)&anyv->mfvec2d.p[i]);
2089 anyv->mfvec2d.n = i + 1;
2090 }
2091 }
2092 // else for now we'll leave zeros
2093 }
2094 else {
2095
2096 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2097 printf("JS_DefineElement failed for arg %d in MFVec2dConstr.\n", i);
2098 return JS_FALSE;
2099 }
2100 }
2101 }
2102 *rval = OBJECT_TO_JSVAL(obj);
2103 return JS_TRUE;
2104}
2105
2106JSBool
2107MFVec2dAssign(JSContext* cx, uintN argc, jsval* vp) {
2108 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2109 jsval* argv = JS_ARGV(cx, vp);
2110 jsval rval;
2111 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFVec2dClass, FIELDTYPE_SFVec2d)) { return JS_FALSE; }
2112 JS_SET_RVAL(cx, vp, rval);
2113 return JS_TRUE;
2114}
2115
2116
2117// MFVec3d
2118JSBool
2119MFVec3dAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2120 JSObject* obj = *hobj.address();
2121 jsid id = *hiid.address();
2122 jsval* vp = hvp.address();
2123 return doMFAddProperty(cx, obj, id, vp, "MFVec3dAddProperty");
2124}
2125
2126JSBool
2127MFVec3dGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2128 JSObject* obj = *hobj.address();
2129 jsid id = *hiid.address();
2130 jsval* vp = hvp.address();
2131
2132 return _standardMFGetProperty(cx, obj, id, vp,
2133 "_FreeWRL_Internal = new SFVec3d()", FIELDTYPE_MFVec3d);
2134}
2135
2136JSBool
2137MFVec3dSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
2138 JSObject* obj = *hobj.address();
2139 jsid id = *hiid.address();
2140 jsval* vp = hvp.address();
2141
2142 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFVec3d);
2143}
2144
2145JSBool
2146MFVec3dToString(JSContext* cx, uintN argc, jsval* vp) {
2147 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2148 jsval* argv = JS_ARGV(cx, vp);
2149 jsval rval;
2150
2151 UNUSED(argc);
2152 UNUSED(argv);
2153 /* printf ("CALLED MFVec3dToString\n");*/
2154 if (!doMFToString(cx, obj, "MFVec3d", &rval)) { return JS_FALSE; }
2155 JS_SET_RVAL(cx, vp, rval);
2156 return JS_TRUE;
2157
2158}
2159
2160JSBool
2161MFVec3dConstr(JSContext* cx, uintN argc, jsval* vp) {
2162 JSObject* obj = JS_NewObject(cx, &MFVec3dClass, NULL, NULL);
2163 jsval* argv = JS_ARGV(cx, vp);
2164 jsval rval = OBJECT_TO_JSVAL(obj);
2165 if (!MFVec3dConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
2166 JS_SET_RVAL(cx, vp, rval);
2167 return JS_TRUE;
2168}
2169JSBool MFVec3dConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
2170
2171 JSObject* _arrayObj;
2172 int isArray;
2173 JSObject* _obj;
2174 unsigned int i;
2175 union anyVrml* anyv;
2176
2177 ADD_ROOT(cx, obj)
2178
2179 isArray = FALSE;
2180 if (argc == 1 && argv) {
2181 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2182 // tests/JohnCarlson/Arc1A.x3d
2183 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2184 printf("JS_ValueToObject failed in MFVec3dConstr.\n");
2185 return JS_FALSE;
2186 }
2187
2188 if (JS_IsArrayObject(cx, _arrayObj)) {
2189 jsuint lengthp;
2190 jsval vp;
2191 //printf("its an array\n");
2192 isArray = TRUE;
2193 JS_GetArrayLength(cx, _arrayObj, &lengthp);
2194 argc = lengthp;
2195 }
2196 }
2197
2198
2199
2200 if (SM_method() == 2) {
2201 AnyNative* any;
2202 int newsize;
2203 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec3d, NULL, NULL)) == NULL) {
2204 printf("AnyfNativeNew failed in MFVec3dConstr.\n");
2205 return JS_FALSE;
2206 }
2207 if (!JS_SetPrivateFw(cx, obj, any)) {
2208 printf("JS_SetPrivate failed in MFVec3dConstr.\n");
2209 return JS_FALSE;
2210 }
2211 anyv = any->v;
2212 newsize = sizeof(struct SFVec3d) * upper_power_of_two(argc);
2213 if (argc > 0) {
2214 anyv->mfvec3d.p = MALLOC(struct SFVec3d*, newsize);
2215 memset(anyv->mfvec3d.p, 0, newsize);
2216 }
2217
2218 }
2219 else {
2220 DEFINE_LENGTH(cx, obj, argc)
2221 }
2222 if (!argv) {
2223 return JS_TRUE;
2224 }
2225
2226#ifdef JSVRMLCLASSESVERBOSE
2227 printf("MFVec3dConstr: obj = %p, %u args\n", obj, argc);
2228#endif
2229 for (i = 0; i < argc; i++) {
2230 jsval vp;
2231 if (isArray) {
2232 JS_GetElement(cx, _arrayObj, i, &vp);
2233
2234 }
2235 else {
2236 vp = argv[i];
2237 }
2238 if (!JS_ValueToObject(cx, vp, &_obj)) {
2239 printf("JS_ValueToObject failed in MFVec3dConstr.\n");
2240 return JS_FALSE;
2241 }
2242
2243 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFVec3dClass)
2244
2245 if (SM_method() == 2) {
2246 AnyNative* any2;
2247 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
2248 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
2249 // but in future internal types might change
2250 if (any2->type == FIELDTYPE_SFVec3d || any2->type == FIELDTYPE_SFVec4d) {
2251 shallow_copy_field(FIELDTYPE_SFVec3d, any2->v, (union anyVrml*)&anyv->mfvec3d.p[i]);
2252 anyv->mfvec3d.n = i + 1;
2253 }
2254 }
2255 // else for now we'll leave zeros
2256 }
2257 else {
2258
2259 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2260 printf("JS_DefineElement failed for arg %d in MFVec3dConstr.\n", i);
2261 return JS_FALSE;
2262 }
2263 }
2264 }
2265 *rval = OBJECT_TO_JSVAL(obj);
2266 return JS_TRUE;
2267}
2268
2269JSBool
2270MFVec3dAssign(JSContext* cx, uintN argc, jsval* vp) {
2271 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2272 jsval* argv = JS_ARGV(cx, vp);
2273 jsval rval;
2274 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFVec3dClass, FIELDTYPE_SFVec3d)) { return JS_FALSE; }
2275 JS_SET_RVAL(cx, vp, rval);
2276 return JS_TRUE;
2277}
2278
2279
2280
2281// MFVec4d
2282JSBool
2283MFVec4dAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2284 JSObject* obj = *hobj.address();
2285 jsid id = *hiid.address();
2286 jsval* vp = hvp.address();
2287 return doMFAddProperty(cx, obj, id, vp, "MFVec4dAddProperty");
2288}
2289
2290JSBool
2291MFVec4dGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2292 JSObject* obj = *hobj.address();
2293 jsid id = *hiid.address();
2294 jsval* vp = hvp.address();
2295
2296 return _standardMFGetProperty(cx, obj, id, vp,
2297 "_FreeWRL_Internal = new SFVec4d()", FIELDTYPE_MFVec4d);
2298}
2299
2300JSBool
2301MFVec4dSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
2302 JSObject* obj = *hobj.address();
2303 jsid id = *hiid.address();
2304 jsval* vp = hvp.address();
2305
2306 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFVec4d);
2307}
2308
2309JSBool
2310MFVec4dToString(JSContext* cx, uintN argc, jsval* vp) {
2311 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2312 jsval* argv = JS_ARGV(cx, vp);
2313 jsval rval;
2314
2315 UNUSED(argc);
2316 UNUSED(argv);
2317 /* printf ("CALLED MFVec4dToString\n");*/
2318 if (!doMFToString(cx, obj, "MFVec4d", &rval)) { return JS_FALSE; }
2319 JS_SET_RVAL(cx, vp, rval);
2320 return JS_TRUE;
2321
2322}
2323
2324JSBool
2325MFVec4dConstr(JSContext* cx, uintN argc, jsval* vp) {
2326 JSObject* obj = JS_NewObject(cx, &MFVec4dClass, NULL, NULL);
2327 jsval* argv = JS_ARGV(cx, vp);
2328 jsval rval = OBJECT_TO_JSVAL(obj);
2329 if (!MFVec4dConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
2330 JS_SET_RVAL(cx, vp, rval);
2331 return JS_TRUE;
2332}
2333JSBool MFVec4dConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
2334
2335 JSObject* _arrayObj;
2336 int isArray;
2337 JSObject* _obj;
2338 unsigned int i;
2339 union anyVrml* anyv;
2340
2341 ADD_ROOT(cx, obj)
2342
2343 isArray = FALSE;
2344 if (argc == 1 && argv) {
2345 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2346 // tests/JohnCarlson/Arc1A.x3d
2347 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2348 printf("JS_ValueToObject failed in MFVec4dConstr.\n");
2349 return JS_FALSE;
2350 }
2351
2352 if (JS_IsArrayObject(cx, _arrayObj)) {
2353 jsuint lengthp;
2354 jsval vp;
2355 //printf("its an array\n");
2356 isArray = TRUE;
2357 JS_GetArrayLength(cx, _arrayObj, &lengthp);
2358 argc = lengthp;
2359 }
2360 }
2361
2362
2363
2364 if (SM_method() == 2) {
2365 AnyNative* any;
2366 int newsize;
2367 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec4d, NULL, NULL)) == NULL) {
2368 printf("AnyfNativeNew failed in MFVec4dConstr.\n");
2369 return JS_FALSE;
2370 }
2371 if (!JS_SetPrivateFw(cx, obj, any)) {
2372 printf("JS_SetPrivate failed in MFVec4dConstr.\n");
2373 return JS_FALSE;
2374 }
2375 anyv = any->v;
2376 newsize = sizeof(struct SFVec4d) * upper_power_of_two(argc);
2377 if (argc > 0) {
2378 anyv->mfvec4d.p = MALLOC(struct SFVec4d*, newsize);
2379 memset(anyv->mfvec4d.p, 0, newsize);
2380 }
2381
2382 }
2383 else {
2384 DEFINE_LENGTH(cx, obj, argc)
2385 }
2386 if (!argv) {
2387 return JS_TRUE;
2388 }
2389
2390#ifdef JSVRMLCLASSESVERBOSE
2391 printf("MFVec4dConstr: obj = %p, %u args\n", obj, argc);
2392#endif
2393 for (i = 0; i < argc; i++) {
2394 jsval vp;
2395 if (isArray) {
2396 JS_GetElement(cx, _arrayObj, i, &vp);
2397
2398 }
2399 else {
2400 vp = argv[i];
2401 }
2402 if (!JS_ValueToObject(cx, vp, &_obj)) {
2403 printf("JS_ValueToObject failed in MFVec4dConstr.\n");
2404 return JS_FALSE;
2405 }
2406
2407 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFVec4dClass)
2408
2409 if (SM_method() == 2) {
2410 AnyNative* any2;
2411 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
2412 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
2413 // but in future internal types might change
2414 if (any2->type == FIELDTYPE_SFVec4d ) {
2415 shallow_copy_field(FIELDTYPE_SFVec4d, any2->v, (union anyVrml*)&anyv->mfvec4d.p[i]);
2416 anyv->mfvec4d.n = i + 1;
2417 }
2418 }
2419 // else for now we'll leave zeros
2420 }
2421 else {
2422
2423 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2424 printf("JS_DefineElement failed for arg %d in MFVec4dConstr.\n", i);
2425 return JS_FALSE;
2426 }
2427 }
2428 }
2429 *rval = OBJECT_TO_JSVAL(obj);
2430 return JS_TRUE;
2431}
2432
2433JSBool
2434MFVec4dAssign(JSContext* cx, uintN argc, jsval* vp) {
2435 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2436 jsval* argv = JS_ARGV(cx, vp);
2437 jsval rval;
2438 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFVec4dClass, FIELDTYPE_SFVec4d)) { return JS_FALSE; }
2439 JS_SET_RVAL(cx, vp, rval);
2440 return JS_TRUE;
2441}
2442
2443
2444
2445// MFImage
2446JSBool
2447MFImageAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2448 JSObject* obj = *hobj.address();
2449 jsid id = *hiid.address();
2450 jsval* vp = hvp.address();
2451 return doMFAddProperty(cx, obj, id, vp, "MFImageAddProperty");
2452}
2453
2454JSBool
2455MFImageGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
2456 JSObject* obj = *hobj.address();
2457 jsid id = *hiid.address();
2458 jsval* vp = hvp.address();
2459
2460 return _standardMFGetProperty(cx, obj, id, vp,
2461 "_FreeWRL_Internal = new SFImage()", FIELDTYPE_MFImage);
2462}
2463
2464JSBool
2465MFImageSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
2466 JSObject* obj = *hobj.address();
2467 jsid id = *hiid.address();
2468 jsval* vp = hvp.address();
2469
2470 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFImage);
2471}
2472
2473JSBool
2474MFImageToString(JSContext* cx, uintN argc, jsval* vp) {
2475 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2476 jsval* argv = JS_ARGV(cx, vp);
2477 jsval rval;
2478
2479 UNUSED(argc);
2480 UNUSED(argv);
2481 /* printf ("CALLED MFImageToString\n");*/
2482 if (!doMFToString(cx, obj, "MFImage", &rval)) { return JS_FALSE; }
2483 JS_SET_RVAL(cx, vp, rval);
2484 return JS_TRUE;
2485
2486}
2487
2488JSBool
2489MFImageConstr(JSContext* cx, uintN argc, jsval* vp) {
2490 JSObject* obj = JS_NewObject(cx, &MFImageClass, NULL, NULL);
2491 jsval* argv = JS_ARGV(cx, vp);
2492 jsval rval = OBJECT_TO_JSVAL(obj);
2493 if (!MFImageConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
2494 JS_SET_RVAL(cx, vp, rval);
2495 return JS_TRUE;
2496}
2497JSBool MFImageConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
2498
2499 JSObject* _arrayObj;
2500 int isArray;
2501 JSObject* _obj;
2502 unsigned int i;
2503 union anyVrml* anyv;
2504
2505 ADD_ROOT(cx, obj)
2506
2507 isArray = FALSE;
2508 if (argc == 1 && argv) {
2509 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2510 // tests/JohnCarlson/Arc1A.x3d
2511 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2512 printf("JS_ValueToObject failed in MFImageConstr.\n");
2513 return JS_FALSE;
2514 }
2515
2516 if (JS_IsArrayObject(cx, _arrayObj)) {
2517 jsuint lengthp;
2518 jsval vp;
2519 //printf("its an array\n");
2520 isArray = TRUE;
2521 JS_GetArrayLength(cx, _arrayObj, &lengthp);
2522 argc = lengthp;
2523 }
2524 }
2525
2526
2527
2528 if (SM_method() == 2) {
2529 AnyNative* any;
2530 int newsize;
2531 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFImage, NULL, NULL)) == NULL) {
2532 printf("AnyfNativeNew failed in MFImageConstr.\n");
2533 return JS_FALSE;
2534 }
2535 if (!JS_SetPrivateFw(cx, obj, any)) {
2536 printf("JS_SetPrivate failed in MFImageConstr.\n");
2537 return JS_FALSE;
2538 }
2539 anyv = any->v;
2540 newsize = sizeof(struct SFImage) * upper_power_of_two(argc);
2541 if (argc > 0) {
2542 anyv->mfimage.p = MALLOC(struct SFImage*, newsize);
2543 memset(anyv->mfimage.p, 0, newsize);
2544 }
2545
2546 }
2547 else {
2548 DEFINE_LENGTH(cx, obj, argc)
2549 }
2550 if (!argv) {
2551 return JS_TRUE;
2552 }
2553
2554#ifdef JSVRMLCLASSESVERBOSE
2555 printf("MFImageConstr: obj = %p, %u args\n", obj, argc);
2556#endif
2557 for (i = 0; i < argc; i++) {
2558 jsval vp;
2559 if (isArray) {
2560 JS_GetElement(cx, _arrayObj, i, &vp);
2561
2562 }
2563 else {
2564 vp = argv[i];
2565 }
2566 if (!JS_ValueToObject(cx, vp, &_obj)) {
2567 printf("JS_ValueToObject failed in MFImageConstr.\n");
2568 return JS_FALSE;
2569 }
2570
2571 CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFImageClass)
2572
2573 if (SM_method() == 2) {
2574 AnyNative* any2;
2575 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
2576 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
2577 // but in future internal types might change
2578 if (any2->type == FIELDTYPE_SFImage) {
2579 shallow_copy_field(FIELDTYPE_SFImage, any2->v, (union anyVrml*)&anyv->mfimage.p[i]);
2580 anyv->mfimage.n = i + 1;
2581 }
2582 }
2583 // else for now we'll leave zeros
2584 }
2585 else {
2586
2587 if (!JS_DefineElement(cx, obj, (jsint)i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2588 printf("JS_DefineElement failed for arg %d in MFImageConstr.\n", i);
2589 return JS_FALSE;
2590 }
2591 }
2592 }
2593 *rval = OBJECT_TO_JSVAL(obj);
2594 return JS_TRUE;
2595}
2596
2597JSBool
2598MFImageAssign(JSContext* cx, uintN argc, jsval* vp) {
2599 JSObject* obj = JS_THIS_OBJECT(cx, vp);
2600 jsval* argv = JS_ARGV(cx, vp);
2601 jsval rval;
2602 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFImageClass, FIELDTYPE_SFImage)) { return JS_FALSE; }
2603 JS_SET_RVAL(cx, vp, rval);
2604 return JS_TRUE;
2605}
2606
2607
2608
2609/*
2610static void _setmatrix (JSContext *cx, JSObject *obj, double *matrix) {
2611 jsval val;
2612 int i;
2613 for (i=0; i<16; i++) {
2614
2615 if (JS_NewNumberValue(cx, matrix[i],&val) == JS_FALSE) {
2616 printf ("problem creating id matrix\n");
2617 return;
2618 }
2619
2620 if (!JS_SetElement(cx, obj, (jsint) i, &val)) {
2621 printf( "JS_DefineElement failed for arg %u in VrmlMatrixSetTransform.\n", i);
2622 return;
2623 }
2624 }
2625}
2626
2627// get the matrix values into a double array
2628static void _getmatrix (JSContext *cx, JSObject *obj, double *fl) {
2629 int32 _length;
2630 jsval _length_val;
2631 jsval val;
2632 int i;
2633 double d;
2634
2635 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
2636 printf( "JS_GetProperty failed for \"%s\" in _getmatrix.\n", MF_LENGTH_FIELD);
2637 _length = 0;
2638 } else {
2639 _length = JSVAL_TO_INT(_length_val);
2640 }
2641
2642 #ifdef JSVRMLCLASSESVERBOSE
2643 printf ("_getmatrix, length %d\n",_length);
2644 #endif
2645
2646
2647 if (_length>16) _length = 16;
2648
2649 for (i = 0; i < _length; i++) {
2650 if (!JS_GetElement(cx, obj, (jsint) i, &val)) {
2651 printf( "failed in get of copyElements index %d.\n", i);
2652 fl[i] = 0.0;
2653 } else {
2654 if (!JS_ValueToNumber(cx, val, &d)) {
2655 printf ("this is not a mumber!\n");
2656 fl[i]=0.0;
2657 } else fl[i]=d;
2658 }
2659 }
2660
2661 // in case our matrix was short for some reason
2662 for (i=_length; i < 16; i++) {
2663 fl[i]=0.0;
2664 }
2665}
2666// get rows; used for scale and rot in getTransform
2667void _get4f(double* ret, double* mat, int row) {
2668 if (row == 0) { ret[0] = MAT00; ret[1] = MAT01; ret[2] = MAT02; ret[3] = MAT03; }
2669 if (row == 1) { ret[0] = MAT10; ret[1] = MAT11; ret[2] = MAT12; ret[3] = MAT13; }
2670 if (row == 2) { ret[0] = MAT20; ret[1] = MAT21; ret[2] = MAT22; ret[3] = MAT23; }
2671}
2672
2673// set rows; used for scale and rot in getTransform
2674void _set4f(double len, double* mat, int row) {
2675 if (row == 0) { MAT00 = MAT00 / len; MAT01 = MAT01 / len; MAT02 = MAT02 / len; MAT03 = MAT03 / len; }
2676 if (row == 1) { MAT10 = MAT10 / len; MAT11 = MAT11 / len; MAT12 = MAT12 / len; MAT13 = MAT13 / len; }
2677 if (row == 2) { MAT20 = MAT20 / len; MAT21 = MAT21 / len; MAT22 = MAT22 / len; MAT23 = MAT23 / len; }
2678}
2679*/
2680
2681
2682// VrmlMatrix
2683
2684JSBool
2685VrmlMatrixToString(JSContext *cx, uintN argc, jsval *vp) {
2686 return X3DMatrix4ToString(cx, argc, vp);
2687}
2688JSBool
2689VrmlMatrixgetTransform(JSContext *cx, uintN argc, jsval *vp) {
2690 return X3DMatrix4getTransform(cx, argc, vp);
2691}
2692JSBool
2693VrmlMatrixsetTransform(JSContext *cx, uintN argc, jsval *vp) {
2694 return X3DMatrix4setTransform(cx, argc, vp);
2695}
2696JSBool
2697VrmlMatrixinverse(JSContext *cx, uintN argc, jsval *vp) {
2698 return X3DMatrix4inverse(cx, argc, vp);
2699}
2700JSBool
2701VrmlMatrixtranspose(JSContext *cx, uintN argc, jsval *vp) {
2702 return X3DMatrix4transpose(cx, argc, vp);
2703}
2704JSBool
2705VrmlMatrixmultLeft(JSContext *cx, uintN argc, jsval *vp) {
2706 return X3DMatrix4multLeft(cx, argc, vp);
2707}
2708JSBool
2709VrmlMatrixmultRight(JSContext *cx, uintN argc, jsval *vp) {
2710 return X3DMatrix4multRight(cx, argc, vp);
2711}
2712JSBool
2713VrmlMatrixmultVecMatrix(JSContext *cx, uintN argc, jsval *vp) {
2714 return X3DMatrix4multVecMatrix(cx, argc, vp);
2715}
2716JSBool
2717VrmlMatrixmultMatrixVec(JSContext *cx, uintN argc, jsval *vp) {
2718 return X3DMatrix4multMatrixVec(cx, argc, vp);
2719}
2720JSBool
2721VrmlMatrixAssign(JSContext *cx, uintN argc, jsval *vp) {
2722 return X3DMatrix4Assign(cx, argc, vp);
2723 }
2724
2725JSBool
2726VrmlMatrixConstr(JSContext *cx, uintN argc, jsval *vp) {
2727 return X3DMatrix4Constr(cx, argc, vp);
2728}
2729JSBool
2730VrmlMatrixAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2731 return X3DMatrix4AddProperty(cx, hobj, hiid, hvp);
2732}
2733JSBool
2734VrmlMatrixGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2735 return X3DMatrix4GetProperty(cx, hobj, hiid, hvp);
2736}
2737JSBool
2738VrmlMatrixSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
2739 return X3DMatrix4SetProperty(cx, hobj, hiid, strict, hvp);
2740}
2741
2742// MFRotation
2743JSBool
2744MFRotationAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2745 JSObject *obj = *hobj.address();
2746 jsid id = *hiid.address();
2747 jsval *vp = hvp.address();
2748
2749 return doMFAddProperty(cx, obj, id, vp,"MFRotationAddProperty");
2750}
2751
2752JSBool
2753MFRotationGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2754 JSObject *obj = *hobj.address();
2755 jsid id = *hiid.address();
2756 jsval *vp = hvp.address();
2757
2758 return _standardMFGetProperty(cx, obj, id, vp,
2759 "_FreeWRL_Internal = new SFRotation()",FIELDTYPE_MFRotation);
2760}
2761
2762JSBool
2763MFRotationSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
2764 JSObject *obj = *hobj.address();
2765 jsid id = *hiid.address();
2766 jsval *vp = hvp.address();
2767
2768 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFRotation);
2769}
2770
2771JSBool
2772MFRotationToString(JSContext *cx, uintN argc, jsval *vp) {
2773 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2774 jsval *argv = JS_ARGV(cx,vp);
2775 jsval rval;
2776
2777 UNUSED(argc);
2778 UNUSED(argv);
2779 if (!doMFToString(cx, obj, "MFRotation", &rval)) { return JS_FALSE; }
2780 JS_SET_RVAL(cx,vp,rval);
2781 return JS_TRUE;
2782
2783}
2784
2785JSBool
2786MFRotationConstr(JSContext *cx, uintN argc, jsval *vp) {
2787 JSObject *obj = JS_NewObject(cx,&MFRotationClass,NULL,NULL);
2788 jsval *argv = JS_ARGV(cx,vp);
2789 jsval rval = OBJECT_TO_JSVAL(obj);
2790 if (!MFRotationConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
2791 JS_SET_RVAL(cx,vp,rval);
2792 return JS_TRUE;
2793}
2794JSBool MFRotationConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2795
2796 JSObject *_arrayObj;
2797 int isArray;
2798 JSObject *_obj;
2799 unsigned int i;
2800 union anyVrml *anyv;
2801
2802 ADD_ROOT(cx,obj)
2803
2804 isArray = FALSE;
2805 if(argc == 1 && argv){
2806 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2807 // tests/JohnCarlson/Arc1A.x3d
2808 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2809 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
2810 return JS_FALSE;
2811 }
2812
2813 if(JS_IsArrayObject(cx, _arrayObj)){
2814 jsuint lengthp;
2815 jsval vp;
2816 //printf("its an array\n");
2817 isArray = TRUE;
2818 JS_GetArrayLength(cx,_arrayObj, &lengthp);
2819 argc = lengthp;
2820 }
2821 }
2822
2823 if(SM_method() == 2){
2824 AnyNative *any;
2825 int newsize;
2826 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFRotation,NULL,NULL)) == NULL){
2827 printf( "AnyfNativeNew failed in MFRotationConstr.\n");
2828 return JS_FALSE;
2829 }
2830 if (!JS_SetPrivateFw(cx, obj, any)) {
2831 printf( "JS_SetPrivate failed in MFRotationConstr.\n");
2832 return JS_FALSE;
2833 }
2834 anyv = any->v;
2835 newsize = sizeof(struct SFRotation)*upper_power_of_two(argc);
2836 if(argc > 0){
2837 anyv->mfrotation.p = MALLOC(struct SFRotation*,newsize);
2838 memset(anyv->mfrotation.p,0,newsize);
2839 }
2840
2841 }else{
2842 DEFINE_LENGTH(cx,obj,argc)
2843 }
2844
2845 if (!argv) {
2846 return JS_TRUE;
2847 }
2848
2849 #ifdef JSVRMLCLASSESVERBOSE
2850 printf("MFRotationConstr: obj = %p, %u args\n", obj, argc);
2851 #endif
2852 for (i = 0; i < argc; i++) {
2853 jsval vp;
2854 if(isArray){
2855 JS_GetElement(cx, _arrayObj, i, &vp);
2856
2857 }else{
2858 vp = argv[i];
2859 }
2860 if (!JS_ValueToObject(cx, vp, &_obj)) {
2861 printf(
2862 "JS_ValueToObject failed in MFRotationConstr.\n");
2863 return JS_FALSE;
2864 }
2865
2866 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFRotationClass)
2867 if(SM_method()==2){
2868 AnyNative *any2;
2869 if((any2 = (AnyNative *)JS_GetPrivateFw(cx,_obj)) != NULL){
2870 if(any2->type == FIELDTYPE_SFRotation ){
2871 shallow_copy_field(FIELDTYPE_SFRotation,any2->v,(union anyVrml*)&anyv->mfrotation.p[i]);
2872 anyv->mfrotation.n = i+1;
2873 }
2874 }
2875 // else for now we'll leave zeros
2876 }else{
2877 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2878 printf( "JS_DefineElement failed for arg %d in MFRotationConstr.\n", i);
2879 return JS_FALSE;
2880 }
2881 }
2882 }
2883 *rval = OBJECT_TO_JSVAL(obj);
2884 return JS_TRUE;
2885}
2886
2887JSBool
2888MFRotationAssign(JSContext *cx, uintN argc, jsval *vp) {
2889 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2890 jsval *argv = JS_ARGV(cx,vp);
2891 jsval rval;
2892
2893 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFRotationClass,FIELDTYPE_SFRotation)) { return JS_FALSE; }
2894 JS_SET_RVAL(cx,vp,rval);
2895 return JS_TRUE;
2896
2897}
2898
2899// MFStrings
2900JSBool
2901MFStringAddProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2902 JSObject *obj = *hobj.address();
2903 jsid iid = *hiid.address();
2904 jsval *vp = hvp.address();
2905 jsval id;
2906 if (!JS_IdToValue(cx,iid,&id)) {
2907 printf("JS_IdToValue failed in MFStringAddProperty\n");
2908 return JS_FALSE;
2909 }
2910
2911
2912 #ifdef JSVRMLCLASSESVERBOSE
2913 printf("MFStringAddProperty: vp = %p\n", obj);
2914 if (JSVAL_IS_STRING(*vp)==TRUE) {
2915 printf(" is a common string :%s:\n",
2916#if JS_VERSION < 185
2917 JS_GetStringBytes(JS_ValueToString(cx, *vp)));
2918#else
2919 JS_EncodeString(cx,JS_ValueToString(cx, *vp)));
2920#endif
2921 }
2922 if (JSVAL_IS_OBJECT(*vp)==TRUE) {
2923 printf (" parameter is an object\n");
2924 }
2925 if (JSVAL_IS_PRIMITIVE(*vp)==TRUE) {
2926 printf (" parameter is a primitive\n");
2927 }
2928 if (JSVAL_IS_NULL(*vp)) { printf (" - its a NULL\n");}
2929 if (JSVAL_IS_INT(*vp)) { printf (" - its a INT %d\n",JSVAL_TO_INT(*vp));}
2930
2931 printf("MFStringAddProperty: id = %p\n", obj);
2932 if (JSVAL_IS_STRING(id)==TRUE) {
2933 printf(" is a common string :%s:\n",
2934#if JS_VERSION < 185
2935 JS_GetStringBytes(JS_ValueToString(cx, id)));
2936#else
2937 JS_EncodeString(cx,JS_ValueToString(cx, id)));
2938#endif
2939 }
2940 if (JSVAL_IS_OBJECT(id)==TRUE) {
2941 printf (" parameter is an object\n");
2942 }
2943 if (JSVAL_IS_PRIMITIVE(id)==TRUE) {
2944 printf (" parameter is a primitive\n");
2945 }
2946 if (JSVAL_IS_NULL(id)) { printf (" - its a NULL\n");}
2947 if (JSVAL_IS_INT(id)) { printf (" - its a INT %d\n",JSVAL_TO_INT(id));}
2948
2949 #endif
2950
2951
2952 /* unquote parts of vp string if necessary */
2953 if (JSVAL_IS_STRING(*vp)) {
2954 if (!doMFStringUnquote(cx, vp)) {
2955 printf(
2956 "doMFStringUnquote failed in MFStringAddProperty.\n");
2957 return JS_FALSE;
2958 }
2959 }
2960 return doMFAddProperty(cx, obj, iid, vp,"MFStringAddProperty");
2961
2962}
2963
2964
2965JSBool
2966MFStringGetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2967 JSObject *obj = *hobj.address();
2968 jsid iid = *hiid.address();
2969 jsval *vp = hvp.address();
2970
2971
2972 JSString *_str;
2973 int32 _length, _index;
2974 jsval _length_val;
2975
2976 jsval id;
2977 if (!JS_IdToValue(cx,iid,&id)) {
2978 printf("JS_IdToValue failed in MFStringGetProperty\n");
2979 return JS_FALSE;
2980 }
2981
2982 if(SM_method()==2){
2983 return _standardMFGetProperty(cx, obj, iid, vp,
2984 "_FreeWRL_Internal = new SFString()",FIELDTYPE_MFString);
2985
2986 }
2987
2988 #ifdef JSVRMLCLASSESVERBOSE
2989 printf("MFStringGetProperty: obj = %p\n", obj);
2990 #endif
2991
2992 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
2993 printf( "JS_GetProperty failed for \"%s\" in MFStringGetProperty.\n", MF_LENGTH_FIELD);
2994 return JS_FALSE;
2995 }
2996 _length = JSVAL_TO_INT(_length_val);
2997
2998 if (JSVAL_IS_INT(id)) {
2999 _index = JSVAL_TO_INT(id);
3000
3001 if (_index >= _length) {
3002 _str = JS_NewStringCopyZ(cx, "");
3003 *vp = STRING_TO_JSVAL(_str);
3004 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
3005 printf( "JS_DefineElement failed in MFStringGetProperty.\n");
3006 return JS_FALSE;
3007 }
3008 } else {
3009 if (!JS_LookupElement(cx, obj, _index, vp)) {
3010 printf( "JS_LookupElement failed in MFStringGetProperty.\n");
3011 return JS_FALSE;
3012 }
3013 if (JSVAL_IS_NULL(*vp)) {
3014 /* jut make up new strings, as above */
3015 /* printf ("MFStringGetProperty, element %d is JSVAL_VOID, making up string for it\n",_index); */
3016 _str = JS_NewStringCopyZ(cx, "NULL");
3017 *vp = STRING_TO_JSVAL(_str);
3018 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
3019 printf( "JS_DefineElement failed in MFStringGetProperty.\n");
3020 return JS_FALSE;
3021 }
3022 }
3023 }
3024 }
3025
3026 return JS_TRUE;
3027}
3028
3029JSBool
3030MFStringSetProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
3031 JSObject *obj = *hobj.address();
3032 jsid id = *hiid.address();
3033 jsval *vp = hvp.address();
3034
3035 JSBool rv;
3036
3037 #ifdef JSVRMLCLASSESVERBOSE
3038 printf("MFStringSetProperty: obj = %p id %d jsval %u\n", obj, id, (unsigned int)*vp);
3039
3040printf ("MFStringSetProperty, setting vp of type...\n");
3041 if (JSVAL_IS_OBJECT(*vp)) { printf (" - MFStringSetProperty, vp is a OBJECT\n");}
3042 if (JSVAL_IS_PRIMITIVE(*vp)) { printf (" - MFStringSetProperty, vp is a PRIMITIVE\n");}
3043 if (JSVAL_IS_NULL(*vp)) { printf (" - MFStringSetProperty, vp is a NULL\n");}
3044 if (JSVAL_IS_STRING(*vp)) { printf (" - MFStringSetProperty, vp is a STRING\n");}
3045 if (JSVAL_IS_INT(*vp)) { printf (" - MFStringSetProperty, vp is a INT %d\n",JSVAL_TO_INT(*vp));}
3046
3047 #endif
3048
3049
3050 /* unquote parts of vp string if necessary */
3051 if (JSVAL_IS_STRING(*vp)) {
3052 if (!doMFStringUnquote(cx, vp)) {
3053 printf(
3054 "doMFStringUnquote failed in MFStringSetProperty.\n");
3055 return JS_FALSE;
3056 }
3057 }
3058 rv = doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFString);
3059 #ifdef JSVRMLCLASSESVERBOSE
3060 printf ("returning from MFStringSetProperty\n");
3061 #endif
3062
3063 return rv;
3064
3065}
3066
3067JSBool
3068MFStringToString(JSContext *cx, uintN argc, jsval *vp) {
3069 JSObject *obj = JS_THIS_OBJECT(cx,vp);
3070 jsval *argv = JS_ARGV(cx,vp);
3071 jsval rval;
3072
3073 UNUSED(argc);
3074 UNUSED(argv);
3075 #ifdef JSVRMLCLASSESVERBOSE
3076 printf("MFStringToString: obj = %p, %u args\n", obj, argc);
3077 #endif
3078
3079
3080 if (!doMFToString(cx, obj, "MFString", &rval)) { return JS_FALSE; }
3081 JS_SET_RVAL(cx,vp,rval);
3082 return JS_TRUE;
3083
3084}
3085
3086
3087JSBool
3088MFStringConstr(JSContext *cx, uintN argc, jsval *vp) {
3089 JSObject *obj = JS_NewObject(cx,&MFStringClass,NULL,NULL);
3090 jsval *argv = JS_ARGV(cx,vp);
3091 jsval rval = OBJECT_TO_JSVAL(obj);
3092 if (!MFStringConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
3093 JS_SET_RVAL(cx,vp,rval);
3094 return JS_TRUE;
3095}
3096JSBool MFStringConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
3097
3098 JSObject *_arrayObj;
3099 int isArray;
3100
3101 unsigned int i;
3102 union anyVrml *anyv;
3103
3104 #ifdef JSVRMLCLASSESVERBOSE
3105 JSString *_str;
3106 printf("MFStringConstr: cx %p, obj %p args %d rval %p parent %p... ", cx, obj, argc, rval, JS_GetParent(cx, obj));
3107 #endif
3108
3109 ADD_ROOT(cx,obj)
3110
3111 isArray = FALSE;
3112 if(argc == 1 && argv){
3113 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
3114 // tests/JohnCarlson/Arc1A.x3d
3115 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
3116 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
3117 return JS_FALSE;
3118 }
3119
3120 if(JS_IsArrayObject(cx, _arrayObj)){
3121 jsuint lengthp;
3122 jsval vp;
3123 //printf("its an array\n");
3124 isArray = TRUE;
3125 JS_GetArrayLength(cx,_arrayObj, &lengthp);
3126 argc = lengthp;
3127 }
3128 }
3129
3130 if(SM_method() == 2){
3131 AnyNative *any;
3132 int newsize;
3133 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFString,NULL,NULL)) == NULL){
3134 printf( "AnyfNativeNew failed in MFStringConstr.\n");
3135 return JS_FALSE;
3136 }
3137 if (!JS_SetPrivateFw(cx, obj, any)) {
3138 printf( "JS_SetPrivate failed in MFStringConstr.\n");
3139 return JS_FALSE;
3140 }
3141 anyv = any->v;
3142 newsize = sizeof(struct Uni_String*)*upper_power_of_two(argc);
3143 if(argc > 0){
3144 anyv->mfstring.p = MALLOC(struct Uni_String**,newsize);
3145 memset(anyv->mfstring.p,0,newsize);
3146 }
3147
3148 }else{
3149 DEFINE_LENGTH(cx,obj,argc)
3150 DEFINE_MF_ECMA_HAS_CHANGED
3151 }
3152
3153 if (!argv) {
3154 return JS_TRUE;
3155 }
3156
3157 for (i = 0; i < argc; i++) {
3158 jsval vp;
3159 if(isArray){
3160 JS_GetElement(cx, _arrayObj, i, &vp);
3161
3162 }else{
3163 vp = argv[i];
3164 }
3165 #ifdef JSVRMLCLASSESVERBOSE
3166 printf ("argv %d is a ...",i);
3167
3168 if (JSVAL_IS_STRING(argv[i])==TRUE) {
3169 printf (" Common String, is");
3170 _str = JS_ValueToString(cx, argv[i]);
3171#if JS_VERSION < 185
3172 printf (" %s",JS_GetStringBytes(_str));
3173#else
3174 printf (" %s",JS_EncodeString(cx,_str));
3175#endif
3176 printf ("..");
3177
3178 }
3179 if (JSVAL_IS_OBJECT(argv[i])==TRUE) {
3180 printf (" is an object");
3181 }
3182 if (JSVAL_IS_PRIMITIVE(argv[i])==TRUE) {
3183 printf (" is a primitive");
3184 }
3185
3186 if ((_str = JS_ValueToString(cx, argv[i])) == NULL) {
3187 printf( "JS_ValueToString failed in MFStringConstr.");
3188 return JS_FALSE;
3189 }
3190 printf ("\n");
3191 #endif
3192
3193 if(SM_method()==2){
3194 char *cstring = NULL;
3195 if (JSVAL_IS_STRING(vp)==TRUE) {
3196 // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_EncodeString
3197 // cstring: we own it
3198 JSString *_str;
3199 _str = JS_ValueToString(cx, vp);
3200 cstring = JS_EncodeString(cx,_str); //if utf16: lossy - will drop first byte, garbage
3201 //JS_free(cx,_str); bombs if I do this
3202
3203 }else{
3204 //could try and convert object or ecma primitive to string via toString()
3205 }
3206 if(cstring){
3207 //newASCIIString does an extra malloc
3208 struct Uni_String *us;
3209 us = MALLOC(struct Uni_String*,sizeof(struct Uni_String));
3210 us->strptr = cstring;
3211 us->len = strlen(cstring);
3212 us->touched = 0;
3213 anyv->mfstring.p[i] = us;
3214 anyv->mfstring.n = i+1;
3215 }
3216 // else for now we'll leave zeros
3217 }else{
3218 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
3219 printf( "JS_DefineElement failed for arg %d in MFStringConstr.\n", i);
3220 return JS_FALSE;
3221 }
3222 }
3223 }
3224 *rval = OBJECT_TO_JSVAL(obj);
3225
3226 #ifdef JSVRMLCLASSESVERBOSE
3227 printf ("finished MFStringConstr\n");
3228 #endif
3229
3230 return JS_TRUE;
3231}
3232
3233JSBool
3234MFStringAssign(JSContext *cx, uintN argc, jsval *vp) {
3235 JSObject *obj = JS_THIS_OBJECT(cx,vp);
3236 jsval *argv = JS_ARGV(cx,vp);
3237 jsval rval;
3238
3239
3240 #ifdef JSVRMLCLASSESVERBOSE
3241 printf("MFStringAssign: obj = %p args %d... ", obj, argc);
3242 #endif
3243 if(SM_method() != 2){
3244 SET_MF_ECMA_HAS_CHANGED
3245 }
3246
3247 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFStringClass,FIELDTYPE_SFString)) { return JS_FALSE; }
3248 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
3249 return JS_TRUE;
3250
3251}
3252
3253/* testing.. */
3254JSBool MFStringDeleteProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool *succeeded){
3255 JSObject *obj = *hobj.address();
3256 jsid iid = *hiid.address();
3257
3258 #ifdef JSVRMLCLASSESVERBOSE
3259 printf ("MFStringDeleteProperty\n");
3260 #endif
3261 return JS_TRUE;
3262}
3263JSBool
3264MFStringEnumerateProperty(JSContext *cx, JS::Handle<JSObject*> hobj) {
3265 JSObject *obj = *hobj.address();
3266
3267 #ifdef JSVRMLCLASSESVERBOSE
3268 printf ("MFStringEnumerateProperty\n");
3269 #endif
3270 return JS_TRUE;
3271}
3272
3273JSBool MFStringResolveProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid){
3274 JSObject *obj = *hobj.address();
3275 jsid id = *hiid.address();
3276
3277 #ifdef JSVRMLCLASSESVERBOSE
3278 printf ("MFStringResolveProperty\n");
3279 #endif
3280 return JS_TRUE;
3281}
3282JSBool MFStringConvertProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JSType type, JS::MutableHandle<JS::Value> hvp) {
3283 JSObject *obj = *hobj.address();
3284 jsval *vp = hvp.address();
3285
3286
3287 #ifdef JSVRMLCLASSESVERBOSE
3288 printf ("MFStringConvertProperty\n");
3289 #endif
3290 return JS_TRUE;
3291}
3292
3293// MFMatrix3f
3294
3295JSBool
3296MFMatrix3fAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3297 JSObject* obj = *hobj.address();
3298 jsid id = *hiid.address();
3299 jsval* vp = hvp.address();
3300 return doMFAddProperty(cx, obj, id, vp, "MFMatrix3fAddProperty");
3301}
3302
3303JSBool
3304MFMatrix3fGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3305 JSObject* obj = *hobj.address();
3306 jsid id = *hiid.address();
3307 jsval* vp = hvp.address();
3308
3309 return _standardMFGetProperty(cx, obj, id, vp,
3310 "_FreeWRL_Internal = new SFMatrix3f()", FIELDTYPE_MFMatrix3f);
3311}
3312
3313JSBool
3314MFMatrix3fSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
3315 JSObject* obj = *hobj.address();
3316 jsid id = *hiid.address();
3317 jsval* vp = hvp.address();
3318
3319 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFMatrix3f);
3320}
3321
3322JSBool
3323MFMatrix3fToString(JSContext* cx, uintN argc, jsval* vp) {
3324 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3325 jsval* argv = JS_ARGV(cx, vp);
3326 jsval rval;
3327
3328 UNUSED(argc);
3329 UNUSED(argv);
3330 /* printf ("CALLED MFMatrix3fToString\n");*/
3331 if (!doMFToString(cx, obj, "MFMatrix3f", &rval)) { return JS_FALSE; }
3332 JS_SET_RVAL(cx, vp, rval);
3333 return JS_TRUE;
3334
3335}
3336
3337JSBool
3338MFMatrix3fConstr(JSContext* cx, uintN argc, jsval* vp) {
3339 JSObject* obj = JS_NewObject(cx, &MFMatrix3fClass, NULL, NULL);
3340 jsval* argv = JS_ARGV(cx, vp);
3341 jsval rval = OBJECT_TO_JSVAL(obj);
3342 if (!MFMatrix3fConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
3343 JS_SET_RVAL(cx, vp, rval);
3344 return JS_TRUE;
3345}
3346JSBool MFMatrix3fConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
3347
3348 JSObject* _arrayObj;
3349 int isArray;
3350 JSObject* _obj;
3351 unsigned int i;
3352 union anyVrml* anyv;
3353
3354 ADD_ROOT(cx, obj)
3355
3356 isArray = FALSE;
3357 if (argc == 1 && argv) {
3358 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
3359 // tests/JohnCarlson/Arc1A.x3d
3360 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
3361 printf("JS_ValueToObject failed in MFMatrix3fConstr.\n");
3362 return JS_FALSE;
3363 }
3364
3365 if (JS_IsArrayObject(cx, _arrayObj)) {
3366 jsuint lengthp;
3367 jsval vp;
3368 //printf("its an array\n");
3369 isArray = TRUE;
3370 JS_GetArrayLength(cx, _arrayObj, &lengthp);
3371 argc = lengthp;
3372 }
3373 }
3374
3375
3376
3377 if (SM_method() == 2) {
3378 AnyNative* any;
3379 int newsize;
3380 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFMatrix3f, NULL, NULL)) == NULL) {
3381 printf("AnyfNativeNew failed in MFMatrix3fConstr.\n");
3382 return JS_FALSE;
3383 }
3384 if (!JS_SetPrivateFw(cx, obj, any)) {
3385 printf("JS_SetPrivate failed in MFMatrix3fConstr.\n");
3386 return JS_FALSE;
3387 }
3388 anyv = any->v;
3389 newsize = sizeof(struct SFMatrix3f) * upper_power_of_two(argc);
3390 if (argc > 0) {
3391 anyv->mfmatrix3f.p = MALLOC(struct SFMatrix3f*, newsize);
3392 memset(anyv->mfmatrix3f.p, 0, newsize);
3393 }
3394
3395 }
3396 else {
3397 DEFINE_LENGTH(cx, obj, argc)
3398 }
3399 if (!argv) {
3400 return JS_TRUE;
3401 }
3402
3403#ifdef JSVRMLCLASSESVERBOSE
3404 printf("MFVec4dConstr: obj = %p, %u args\n", obj, argc);
3405#endif
3406 for (i = 0; i < argc; i++) {
3407 jsval vp;
3408 if (isArray) {
3409 JS_GetElement(cx, _arrayObj, i, &vp);
3410
3411 }
3412 else {
3413 vp = argv[i];
3414 }
3415 if (!JS_ValueToObject(cx, vp, &_obj)) {
3416 printf("JS_ValueToObject failed in MFMatrix3fConstr.\n");
3417 return JS_FALSE;
3418 }
3419
3420 //CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFMatrix3fClass)
3421
3422 if (SM_method() == 2) {
3423 AnyNative* any2;
3424 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
3425 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
3426 // but in future internal types might change
3427 if (any2->type == FIELDTYPE_SFMatrix3f) {
3428 shallow_copy_field(FIELDTYPE_SFMatrix3f, any2->v, (union anyVrml*)&anyv->mfmatrix3f.p[i]);
3429 anyv->mfmatrix3f.n = i + 1;
3430 }
3431 else {
3432 shallow_copy_field_precision(any2->type, FIELDTYPE_SFMatrix3f, any2->v, (union anyVrml*)&anyv->mfmatrix3f.p[i]);
3433 anyv->mfmatrix3f.n = i + 1;
3434 }
3435 }
3436 // else for now we'll leave zeros
3437 }
3438 }
3439 *rval = OBJECT_TO_JSVAL(obj);
3440 return JS_TRUE;
3441}
3442
3443JSBool
3444MFMatrix3fAssign(JSContext* cx, uintN argc, jsval* vp) {
3445 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3446 jsval* argv = JS_ARGV(cx, vp);
3447 jsval rval;
3448 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFMatrix3fClass, FIELDTYPE_SFMatrix3f)) { return JS_FALSE; }
3449 JS_SET_RVAL(cx, vp, rval);
3450 return JS_TRUE;
3451}
3452
3453// MFMatrix4f
3454
3455
3456JSBool
3457MFMatrix4fAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3458 JSObject* obj = *hobj.address();
3459 jsid id = *hiid.address();
3460 jsval* vp = hvp.address();
3461 return doMFAddProperty(cx, obj, id, vp, "MFMatrix4fAddProperty");
3462}
3463
3464JSBool
3465MFMatrix4fGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3466 JSObject* obj = *hobj.address();
3467 jsid id = *hiid.address();
3468 jsval* vp = hvp.address();
3469
3470 return _standardMFGetProperty(cx, obj, id, vp,
3471 "_FreeWRL_Internal = new SFMatrix4f()", FIELDTYPE_MFMatrix4f);
3472}
3473
3474JSBool
3475MFMatrix4fSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
3476 JSObject* obj = *hobj.address();
3477 jsid id = *hiid.address();
3478 jsval* vp = hvp.address();
3479
3480 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFMatrix4f);
3481}
3482
3483JSBool
3484MFMatrix4fToString(JSContext* cx, uintN argc, jsval* vp) {
3485 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3486 jsval* argv = JS_ARGV(cx, vp);
3487 jsval rval;
3488
3489 UNUSED(argc);
3490 UNUSED(argv);
3491 /* printf ("CALLED MFMatrix4fToString\n");*/
3492 if (!doMFToString(cx, obj, "MFMatrix4f", &rval)) { return JS_FALSE; }
3493 JS_SET_RVAL(cx, vp, rval);
3494 return JS_TRUE;
3495
3496}
3497
3498JSBool
3499MFMatrix4fConstr(JSContext* cx, uintN argc, jsval* vp) {
3500 JSObject* obj = JS_NewObject(cx, &MFMatrix4fClass, NULL, NULL);
3501 jsval* argv = JS_ARGV(cx, vp);
3502 jsval rval = OBJECT_TO_JSVAL(obj);
3503 if (!MFMatrix4fConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
3504 JS_SET_RVAL(cx, vp, rval);
3505 return JS_TRUE;
3506}
3507JSBool MFMatrix4fConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
3508
3509 JSObject* _arrayObj;
3510 int isArray;
3511 JSObject* _obj;
3512 unsigned int i;
3513 union anyVrml* anyv;
3514
3515 ADD_ROOT(cx, obj)
3516
3517 isArray = FALSE;
3518 if (argc == 1 && argv) {
3519 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
3520 // tests/JohnCarlson/Arc1A.x3d
3521 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
3522 printf("JS_ValueToObject failed in MFMatrix4fConstr.\n");
3523 return JS_FALSE;
3524 }
3525
3526 if (JS_IsArrayObject(cx, _arrayObj)) {
3527 jsuint lengthp;
3528 jsval vp;
3529 //printf("its an array\n");
3530 isArray = TRUE;
3531 JS_GetArrayLength(cx, _arrayObj, &lengthp);
3532 argc = lengthp;
3533 }
3534 }
3535
3536
3537
3538 if (SM_method() == 2) {
3539 AnyNative* any;
3540 int newsize;
3541 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFMatrix4f, NULL, NULL)) == NULL) {
3542 printf("AnyfNativeNew failed in MFMatrix4fConstr.\n");
3543 return JS_FALSE;
3544 }
3545 if (!JS_SetPrivateFw(cx, obj, any)) {
3546 printf("JS_SetPrivate failed in MFMatrix4fConstr.\n");
3547 return JS_FALSE;
3548 }
3549 anyv = any->v;
3550 newsize = sizeof(struct SFMatrix4f) * upper_power_of_two(argc);
3551 if (argc > 0) {
3552 anyv->mfmatrix4f.p = MALLOC(struct SFMatrix4f*, newsize);
3553 memset(anyv->mfmatrix4f.p, 0, newsize);
3554 }
3555
3556 }
3557 else {
3558 DEFINE_LENGTH(cx, obj, argc)
3559 }
3560 if (!argv) {
3561 return JS_TRUE;
3562 }
3563
3564#ifdef JSVRMLCLASSESVERBOSE
3565 printf("MFVec4dConstr: obj = %p, %u args\n", obj, argc);
3566#endif
3567 for (i = 0; i < argc; i++) {
3568 jsval vp;
3569 if (isArray) {
3570 JS_GetElement(cx, _arrayObj, i, &vp);
3571
3572 }
3573 else {
3574 vp = argv[i];
3575 }
3576 if (!JS_ValueToObject(cx, vp, &_obj)) {
3577 printf("JS_ValueToObject failed in MFMatrix4fConstr.\n");
3578 return JS_FALSE;
3579 }
3580
3581 //CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFMatrix4fClass)
3582
3583 if (SM_method() == 2) {
3584 AnyNative* any2;
3585 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
3586 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
3587 // but in future internal types might change
3588 if (any2->type == FIELDTYPE_SFMatrix4f) {
3589 shallow_copy_field(FIELDTYPE_SFMatrix4f, any2->v, (union anyVrml*)&anyv->mfmatrix4f.p[i]);
3590 anyv->mfmatrix4f.n = i + 1;
3591 }
3592 else {
3593 shallow_copy_field_precision(any2->type, FIELDTYPE_SFMatrix4f, any2->v, (union anyVrml*)&anyv->mfmatrix4f.p[i]);
3594 anyv->mfmatrix4f.n = i + 1;
3595 }
3596 }
3597 // else for now we'll leave zeros
3598 }
3599 }
3600 *rval = OBJECT_TO_JSVAL(obj);
3601 return JS_TRUE;
3602}
3603
3604JSBool
3605MFMatrix4fAssign(JSContext* cx, uintN argc, jsval* vp) {
3606 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3607 jsval* argv = JS_ARGV(cx, vp);
3608 jsval rval;
3609 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFMatrix4fClass, FIELDTYPE_SFMatrix4f)) { return JS_FALSE; }
3610 JS_SET_RVAL(cx, vp, rval);
3611 return JS_TRUE;
3612}
3613
3614// MFMatrix3d
3615
3616JSBool
3617MFMatrix3dAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3618 JSObject* obj = *hobj.address();
3619 jsid id = *hiid.address();
3620 jsval* vp = hvp.address();
3621 return doMFAddProperty(cx, obj, id, vp, "MFMatrix3dAddProperty");
3622}
3623
3624JSBool
3625MFMatrix3dGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3626 JSObject* obj = *hobj.address();
3627 jsid id = *hiid.address();
3628 jsval* vp = hvp.address();
3629
3630 return _standardMFGetProperty(cx, obj, id, vp,
3631 "_FreeWRL_Internal = new SFMatrix3d()", FIELDTYPE_MFMatrix3d);
3632}
3633
3634JSBool
3635MFMatrix3dSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
3636 JSObject* obj = *hobj.address();
3637 jsid id = *hiid.address();
3638 jsval* vp = hvp.address();
3639
3640 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFMatrix3d);
3641}
3642
3643JSBool
3644MFMatrix3dToString(JSContext* cx, uintN argc, jsval* vp) {
3645 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3646 jsval* argv = JS_ARGV(cx, vp);
3647 jsval rval;
3648
3649 UNUSED(argc);
3650 UNUSED(argv);
3651 /* printf ("CALLED MFMatrix3dToString\n");*/
3652 if (!doMFToString(cx, obj, "MFMatrix3d", &rval)) { return JS_FALSE; }
3653 JS_SET_RVAL(cx, vp, rval);
3654 return JS_TRUE;
3655
3656}
3657
3658JSBool
3659MFMatrix3dConstr(JSContext* cx, uintN argc, jsval* vp) {
3660 JSObject* obj = JS_NewObject(cx, &MFMatrix3dClass, NULL, NULL);
3661 jsval* argv = JS_ARGV(cx, vp);
3662 jsval rval = OBJECT_TO_JSVAL(obj);
3663 if (!MFMatrix3dConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
3664 JS_SET_RVAL(cx, vp, rval);
3665 return JS_TRUE;
3666}
3667JSBool MFMatrix3dConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
3668
3669 JSObject* _arrayObj;
3670 int isArray;
3671 JSObject* _obj;
3672 unsigned int i;
3673 union anyVrml* anyv;
3674
3675 ADD_ROOT(cx, obj)
3676
3677 isArray = FALSE;
3678 if (argc == 1 && argv) {
3679 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
3680 // tests/JohnCarlson/Arc1A.x3d
3681 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
3682 printf("JS_ValueToObject failed in MFMatrix3dConstr.\n");
3683 return JS_FALSE;
3684 }
3685
3686 if (JS_IsArrayObject(cx, _arrayObj)) {
3687 jsuint lengthp;
3688 jsval vp;
3689 //printf("its an array\n");
3690 isArray = TRUE;
3691 JS_GetArrayLength(cx, _arrayObj, &lengthp);
3692 argc = lengthp;
3693 }
3694 }
3695
3696
3697
3698 if (SM_method() == 2) {
3699 AnyNative* any;
3700 int newsize;
3701 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFMatrix3d, NULL, NULL)) == NULL) {
3702 printf("AnyfNativeNew failed in MFMatrix3dConstr.\n");
3703 return JS_FALSE;
3704 }
3705 if (!JS_SetPrivateFw(cx, obj, any)) {
3706 printf("JS_SetPrivate failed in MFMatrix3dConstr.\n");
3707 return JS_FALSE;
3708 }
3709 anyv = any->v;
3710 newsize = sizeof(struct SFMatrix3d) * upper_power_of_two(argc);
3711 if (argc > 0) {
3712 anyv->mfmatrix3d.p = MALLOC(struct SFMatrix3d*, newsize);
3713 memset(anyv->mfmatrix3d.p, 0, newsize);
3714 }
3715
3716 }
3717 else {
3718 DEFINE_LENGTH(cx, obj, argc)
3719 }
3720 if (!argv) {
3721 return JS_TRUE;
3722 }
3723
3724#ifdef JSVRMLCLASSESVERBOSE
3725 printf("MFVec4dConstr: obj = %p, %u args\n", obj, argc);
3726#endif
3727 for (i = 0; i < argc; i++) {
3728 jsval vp;
3729 if (isArray) {
3730 JS_GetElement(cx, _arrayObj, i, &vp);
3731
3732 }
3733 else {
3734 vp = argv[i];
3735 }
3736 if (!JS_ValueToObject(cx, vp, &_obj)) {
3737 printf("JS_ValueToObject failed in MFMatrix3dConstr.\n");
3738 return JS_FALSE;
3739 }
3740
3741 //CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFMatrix3dClass)
3742
3743 if (SM_method() == 2) {
3744 AnyNative* any2;
3745 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
3746 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
3747 // but in future internal types might change
3748 if (any2->type == FIELDTYPE_SFMatrix3d) {
3749 shallow_copy_field(FIELDTYPE_SFMatrix3d, any2->v, (union anyVrml*)&anyv->mfmatrix3d.p[i]);
3750 anyv->mfmatrix3d.n = i + 1;
3751 }
3752 else {
3753 shallow_copy_field_precision(any2->type, FIELDTYPE_SFMatrix3d, any2->v, (union anyVrml*)&anyv->mfmatrix3d.p[i]);
3754 anyv->mfmatrix3d.n = i + 1;
3755 }
3756 }
3757 // else for now we'll leave zeros
3758 }
3759 }
3760 *rval = OBJECT_TO_JSVAL(obj);
3761 return JS_TRUE;
3762}
3763
3764JSBool
3765MFMatrix3dAssign(JSContext* cx, uintN argc, jsval* vp) {
3766 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3767 jsval* argv = JS_ARGV(cx, vp);
3768 jsval rval;
3769 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFMatrix3dClass, FIELDTYPE_SFMatrix3d)) { return JS_FALSE; }
3770 JS_SET_RVAL(cx, vp, rval);
3771 return JS_TRUE;
3772}
3773
3774// MFMatrix4d
3775
3776
3777JSBool
3778MFMatrix4dAddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3779 JSObject* obj = *hobj.address();
3780 jsid id = *hiid.address();
3781 jsval* vp = hvp.address();
3782 return doMFAddProperty(cx, obj, id, vp, "MFMatrix4dAddProperty");
3783}
3784
3785JSBool
3786MFMatrix4dGetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
3787 JSObject* obj = *hobj.address();
3788 jsid id = *hiid.address();
3789 jsval* vp = hvp.address();
3790
3791 return _standardMFGetProperty(cx, obj, id, vp,
3792 "_FreeWRL_Internal = new SFMatrix4d()", FIELDTYPE_MFMatrix4d);
3793}
3794
3795JSBool
3796MFMatrix4dSetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
3797 JSObject* obj = *hobj.address();
3798 jsid id = *hiid.address();
3799 jsval* vp = hvp.address();
3800
3801 return doMFSetProperty(cx, obj, id, vp, FIELDTYPE_MFMatrix4d);
3802}
3803
3804JSBool
3805MFMatrix4dToString(JSContext* cx, uintN argc, jsval* vp) {
3806 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3807 jsval* argv = JS_ARGV(cx, vp);
3808 jsval rval;
3809
3810 UNUSED(argc);
3811 UNUSED(argv);
3812 /* printf ("CALLED MFMatrix4dToString\n");*/
3813 if (!doMFToString(cx, obj, "MFMatrix4d", &rval)) { return JS_FALSE; }
3814 JS_SET_RVAL(cx, vp, rval);
3815 return JS_TRUE;
3816
3817}
3818
3819JSBool
3820MFMatrix4dConstr(JSContext* cx, uintN argc, jsval* vp) {
3821 JSObject* obj = JS_NewObject(cx, &MFMatrix4dClass, NULL, NULL);
3822 jsval* argv = JS_ARGV(cx, vp);
3823 jsval rval = OBJECT_TO_JSVAL(obj);
3824 if (!MFMatrix4dConstrInternals(cx, obj, argc, argv, &rval)) { return JS_FALSE; }
3825 JS_SET_RVAL(cx, vp, rval);
3826 return JS_TRUE;
3827}
3828JSBool MFMatrix4dConstrInternals(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) {
3829
3830 JSObject* _arrayObj;
3831 int isArray;
3832 JSObject* _obj;
3833 unsigned int i;
3834 union anyVrml* anyv;
3835
3836 ADD_ROOT(cx, obj)
3837
3838 isArray = FALSE;
3839 if (argc == 1 && argv) {
3840 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
3841 // tests/JohnCarlson/Arc1A.x3d
3842 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
3843 printf("JS_ValueToObject failed in MFMatrix4dConstr.\n");
3844 return JS_FALSE;
3845 }
3846
3847 if (JS_IsArrayObject(cx, _arrayObj)) {
3848 jsuint lengthp;
3849 jsval vp;
3850 //printf("its an array\n");
3851 isArray = TRUE;
3852 JS_GetArrayLength(cx, _arrayObj, &lengthp);
3853 argc = lengthp;
3854 }
3855 }
3856
3857
3858
3859 if (SM_method() == 2) {
3860 AnyNative* any;
3861 int newsize;
3862 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFMatrix4d, NULL, NULL)) == NULL) {
3863 printf("AnyfNativeNew failed in MFMatrix4dConstr.\n");
3864 return JS_FALSE;
3865 }
3866 if (!JS_SetPrivateFw(cx, obj, any)) {
3867 printf("JS_SetPrivate failed in MFMatrix4dConstr.\n");
3868 return JS_FALSE;
3869 }
3870 anyv = any->v;
3871 newsize = sizeof(struct SFMatrix4d) * upper_power_of_two(argc);
3872 if (argc > 0) {
3873 anyv->mfmatrix4d.p = MALLOC(struct SFMatrix4d*, newsize);
3874 memset(anyv->mfmatrix4d.p, 0, newsize);
3875 }
3876
3877 }
3878 else {
3879 DEFINE_LENGTH(cx, obj, argc)
3880 }
3881 if (!argv) {
3882 return JS_TRUE;
3883 }
3884
3885#ifdef JSVRMLCLASSESVERBOSE
3886 printf("MFVec4dConstr: obj = %p, %u args\n", obj, argc);
3887#endif
3888 for (i = 0; i < argc; i++) {
3889 jsval vp;
3890 if (isArray) {
3891 JS_GetElement(cx, _arrayObj, i, &vp);
3892
3893 }
3894 else {
3895 vp = argv[i];
3896 }
3897 if (!JS_ValueToObject(cx, vp, &_obj)) {
3898 printf("JS_ValueToObject failed in MFMatrix4dConstr.\n");
3899 return JS_FALSE;
3900 }
3901
3902 //CHECK_CLASS(cx, _obj, NULL, __FUNCTION__, SFMatrix4dClass)
3903
3904 if (SM_method() == 2) {
3905 AnyNative* any2;
3906 if ((any2 = (AnyNative*)JS_GetPrivateFw(cx, _obj)) != NULL) {
3907 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
3908 // but in future internal types might change
3909 if (any2->type == FIELDTYPE_SFMatrix4d) {
3910 shallow_copy_field(FIELDTYPE_SFMatrix4d, any2->v, (union anyVrml*)&anyv->mfmatrix4d.p[i]);
3911 anyv->mfmatrix4d.n = i + 1;
3912 }
3913 else {
3914 shallow_copy_field_precision(any2->type, FIELDTYPE_SFMatrix4d, any2->v, (union anyVrml*)&anyv->mfmatrix4d.p[i]);
3915 anyv->mfmatrix4d.n = i + 1;
3916 }
3917 }
3918 // else for now we'll leave zeros
3919 }
3920 }
3921 *rval = OBJECT_TO_JSVAL(obj);
3922 return JS_TRUE;
3923}
3924
3925JSBool
3926MFMatrix4dAssign(JSContext* cx, uintN argc, jsval* vp) {
3927 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3928 jsval* argv = JS_ARGV(cx, vp);
3929 jsval rval;
3930 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &MFMatrix4dClass, FIELDTYPE_SFMatrix4d)) { return JS_FALSE; }
3931 JS_SET_RVAL(cx, vp, rval);
3932 return JS_TRUE;
3933}
3934
3935// X3DMatrix4 (same as VrmlMatrix)
3936
3937JSBool
3938X3DMatrix4ToString(JSContext* cx, uintN argc, jsval* vp) {
3939 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3940 jsval* argv = JS_ARGV(cx, vp);
3941
3942 JSString* _str;
3943 double* cc;
3944 char buff[STRING];
3945
3946 UNUSED(argc);
3947 UNUSED(argv);
3948 if (SM_method() == 2) {
3949 AnyNative* ptr;
3950 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
3951 printf("JS_GetPrivate failed in SFMatrix4dToString.\n");
3952 return JS_FALSE;
3953 }
3954 cc = ptr->v->sfmatrix4d.c;
3955 }
3956 memset(buff, 0, STRING);
3957 sprintf(buff, "%.9g %.9g %.9g %.9g, %.9g %.9g %.9g %.9g, %.9g %.9g %.9g %.9g, %.9g %.9g %.9g %.9g",
3958 cc[0], cc[1], cc[2], cc[3],
3959 cc[4], cc[5], cc[6], cc[7],
3960 cc[8], cc[9], cc[10], cc[11],
3961 cc[12], cc[13], cc[14], cc[15]
3962 );
3963 _str = JS_NewStringCopyZ(cx, buff);
3964
3965 JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(_str));
3966 return JS_TRUE;
3967}
3968
3969JSBool
3970X3DMatrix4getTransform(JSContext* cx, uintN argc, jsval* vp) {
3971 JSObject* obj = JS_THIS_OBJECT(cx, vp);
3972 jsval* argv = JS_ARGV(cx, vp);
3973 int i;
3974 JSObject* transObj = NULL;
3975 JSObject* rotObj = NULL;
3976 JSObject* scaleObj = NULL;
3977
3978 struct SFMatrix4d* cptr;
3979 struct SFVec3d translation;
3980 struct SFRotation rotation;
3981 struct SFVec3d scale;
3982 double* matrix[4], retscale[3];
3983 double matrixd[16];
3984 Quaternion quat;
3985 double qu[4];
3986
3987
3988 AnyNative* ptr;
3989 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
3990 printf("JS_GetPrivate failed in X3DMatrix4d.inverse.\n");
3991 return JS_FALSE;
3992 }
3993 cptr = &ptr->v->sfmatrix4d;
3994
3995 for (i = 0; i < 4; i++)
3996 matrix[i] = &cptr->c[i * 4];
3997
3998 //get row scales
3999 for (i = 0; i < 3; i++)
4000 retscale[i] = sqrt(vecdot4d(matrix[i], matrix[i]));
4001
4002 //if (translation) {
4003 veccopyd(translation.c, matrix[3]);
4004 //}
4005
4006 // rotation
4007 //if (rotation) {
4008 double m2[16], ff;
4009 for (i = 0; i < 3; i++) {
4010 ff = retscale[i];
4011 if (ff != 0.0) ff = 1.0 / ff;
4012 vecscale4d(&m2[i * 4], matrix[i], ff);
4013 }
4014 // convert the matrix to a quaternion
4015 //for(i=0;i<16;i++) matrixd[i] = (double) m2[i];
4016 matrix_to_quaternion(&quat, m2); // matrixd);
4017
4018 // convert the quaternion to a VRML rotation
4019 quaternion_to_vrmlrot(&quat, &qu[0], &qu[1], &qu[2], &qu[3]);
4020
4021 // now copy the values over
4022 for (i = 0; i < 4; i++)
4023 rotation.c[i] = (float)qu[i];
4024 //}
4025
4026 // scale
4027 //if (scale) {
4028 veccopyd(scale.c, retscale);
4029 //}
4030
4031 if (argc == 1) {
4032 if (!JS_ConvertArguments(cx, argc, argv, "o", &transObj)) {
4033 printf("getTransform, invalid parameters\n");
4034 return JS_FALSE;
4035 }
4036 }
4037 if (argc == 2) {
4038 if (!JS_ConvertArguments(cx, argc, argv, "o o", &transObj, &rotObj)) {
4039 printf("getTransform, invalid parameters\n");
4040 return JS_FALSE;
4041 }
4042 }
4043 if (argc == 3) {
4044 if (!JS_ConvertArguments(cx, argc, argv, "o o o",
4045 &transObj, &rotObj, &scaleObj)) {
4046 printf("getTransform, invalid parameters\n");
4047 return JS_FALSE;
4048 }
4049 }
4050
4051 if (transObj) {
4052 AnyNative* ptr;
4053 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, transObj)) == NULL) {
4054 printf("JS_GetPrivate failed in X3DMatrix4d.getTransform.\n");
4055 return JS_FALSE;
4056 }
4057 shallow_copy_field_precision(FIELDTYPE_SFVec3d, ptr->type, (union anyVrml*)&translation, ptr->v);
4058 }
4059 if (rotObj) {
4060 AnyNative* ptr;
4061 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
4062 printf("JS_GetPrivate failed in X3DMatrix4d.getTransform.\n");
4063 return JS_FALSE;
4064 }
4065 shallow_copy_field_precision(FIELDTYPE_SFRotation, ptr->type, (union anyVrml*)&rotation, ptr->v);
4066 }
4067 if (scaleObj) {
4068 AnyNative* ptr;
4069 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
4070 printf("JS_GetPrivate failed in X3DMatrix4d.getTransform.\n");
4071 return JS_FALSE;
4072 }
4073 shallow_copy_field_precision(FIELDTYPE_SFVec3d, ptr->type, (union anyVrml*)&scale, ptr->v);
4074 }
4075
4076 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
4077
4078 return JS_TRUE;
4079}
4080
4081
4082/* Sets the X3DMatrix4 to the passed values. Any of the rightmost parameters may be omitted.
4083 The method has 0 to 5 parameters. For example, specifying 0 parameters results in an
4084 identity matrix while specifying 1 parameter results in a translation and specifying 2
4085 parameters results in a translation and a rotation. Any unspecified parameter is set to
4086 its default as specified for the Transform node.
4087 //void setTransform(SFVec3f translation, SFRotation rotation, SFVec3f scale, SFRotation scaleOrientation, SFVec3f center)
4088 // http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#Transform
4089 // P' = T * C * R * SR * S * -SR * -C * P
4090*/
4091JSBool
4092X3DMatrix4setTransform(JSContext* cx, uintN argc, jsval* vp) {
4093 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4094 jsval* argv = JS_ARGV(cx, vp);
4095 JSObject* transObj = NULL;
4096 JSObject* rotObj = NULL;
4097 JSObject* scaleObj = NULL;
4098 JSObject* scaleOObj = NULL;
4099 JSObject* centerObj = NULL;
4100 int i;
4101 struct SFMatrix4d* cptr;
4102 struct SFVec3d translation; // = fwpars[0]._web3dval.native;
4103 struct SFRotation rotation; // = fwpars[1]._web3dval.native;
4104 struct SFVec3d scale; // = fwpars[2]._web3dval.native;
4105 struct SFRotation scaleOrientation; // = fwpars[3]._web3dval.native;
4106 struct SFVec3d center; // = fwpars[4]._web3dval.native;
4107 //set up some [][] helpers for clarity
4108 double* matrix[4], * mat[4], m2[16], dval;
4109
4110 memset(&translation, 0, sizeof(struct SFVec3d));
4111 memset(&rotation, 0, sizeof(struct SFRotation));
4112 memset(&scale, 0, sizeof(struct SFVec3d));
4113 memset(&scaleOrientation, 0, sizeof(struct SFRotation));
4114 memset(&center, 0, sizeof(struct SFVec3d));
4115 scale.c[0] = scale.c[1] = scale.c[2] = 1.0;
4116 rotation.c[0] = 1.0f;
4117
4118 AnyNative* anyret;
4119 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4120 printf("SFMatrix4dNativeNew failed in X3DMatrix4.multLeft.\n");
4121 return JS_FALSE;
4122 }
4123
4124 AnyNative* ptr;
4125 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4126 printf("JS_GetPrivate failed in X3DMatrix4d.inverse.\n");
4127 return JS_FALSE;
4128 }
4129 cptr = &ptr->v->sfmatrix4d;
4130
4131 int error = FALSE;
4132
4133
4134
4135 if (argc >= 1) {
4136 //translation - either a js array [] or SFVec3X
4137 if (argv[0].isObject()) {
4138 error = !JS_ValueToObject(cx, argv[0], &transObj);
4139 if (JS_IsArrayObject(cx, transObj)) {
4140 jsuint lengthp;
4141 jsval vp;
4142 JS_GetArrayLength(cx, transObj, &lengthp);
4143 int ncopy = lengthp > 3 ? 3 : lengthp;
4144 for (i = 0; i < ncopy; i++) {
4145 JS_GetElement(cx, transObj, i, &vp);
4146 if (JS_ValueToNumber(cx, vp, &dval))
4147 translation.c[i] = dval;
4148 }
4149 }
4150 else {
4151 AnyNative* ptr;
4152 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, transObj)) == NULL) {
4153 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
4154 return JS_FALSE;
4155 }
4156 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&translation);
4157 }
4158 }
4159 }
4160 if (argc >= 2) {
4161 //rotation - SFRotation
4162 if (argv[1].isObject()) {
4163 error = !JS_ValueToObject(cx, argv[1], &rotObj);
4164 if (!JS_IsArrayObject(cx, rotObj)) {
4165 AnyNative* ptr;
4166 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
4167 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
4168 return JS_FALSE;
4169 }
4170 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFRotation, ptr->v, (union anyVrml*)&rotation);
4171 }
4172 }
4173 }
4174 if (argc >= 3) {
4175 //scale - either a scalar, an SFVec3X or js array []
4176 if (argv[2].isNumber()) {
4177 JS_ValueToNumber(cx, argv[2], &dval);
4178 scale.c[0] = scale.c[1] = scale.c[2] = dval;
4179 }
4180 else if (argv[2].isObject()) {
4181 error = !JS_ValueToObject(cx, argv[2], &scaleObj);
4182 if (JS_IsArrayObject(cx, scaleObj)) {
4183 jsuint lengthp;
4184 jsval vp;
4185 JS_GetArrayLength(cx, scaleObj, &lengthp);
4186 int ncopy = lengthp > 3 ? 3 : lengthp;
4187 for (i = 0; i < ncopy; i++) {
4188 JS_GetElement(cx, scaleObj, i, &vp);
4189 if (JS_ValueToNumber(cx, vp, &dval))
4190 scale.c[i] = dval;
4191 }
4192 }
4193 else {
4194 AnyNative* ptr;
4195 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
4196 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
4197 return JS_FALSE;
4198 }
4199 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&scale);
4200 }
4201 }
4202 }
4203 if (argc >= 4) {
4204 //scaleOrientation SFRotation
4205 error = !JS_ConvertArguments(cx, argc, argv, "o o o o", &transObj, &rotObj, &scaleObj, &scaleOObj);
4206 if (argv[3].isObject()) {
4207 error = !JS_ValueToObject(cx, argv[3], &scaleOObj);
4208 if (!JS_IsArrayObject(cx, scaleOObj)) {
4209 AnyNative* ptr;
4210 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleOObj)) == NULL) {
4211 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
4212 return JS_FALSE;
4213 }
4214 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFRotation, ptr->v, (union anyVrml*)&scaleOrientation);
4215 }
4216 }
4217 }
4218 if (argc >= 5) {
4219 if (argv[4].isObject()) {
4220 error = !JS_ValueToObject(cx, argv[4], &centerObj);
4221 if (JS_IsArrayObject(cx, centerObj)) {
4222 jsuint lengthp;
4223 jsval vp;
4224 JS_GetArrayLength(cx, centerObj, &lengthp);
4225 int ncopy = lengthp > 3 ? 3 : lengthp;
4226 for (i = 0; i < ncopy; i++) {
4227 JS_GetElement(cx, centerObj, i, &vp);
4228 if (JS_ValueToNumber(cx, vp, &dval))
4229 translation.c[i] = dval;
4230 }
4231 }
4232 else {
4233 AnyNative* ptr;
4234 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, centerObj)) == NULL) {
4235 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
4236 return JS_FALSE;
4237 }
4238 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&center);
4239 }
4240 }
4241 }
4242
4243 if (error) {
4244 ConsoleMessage("setTransform: error in parameters");
4245 return JS_FALSE;
4246 }
4247
4248
4249 /* apply Transform, if requested */
4250 //if (transObj) {
4251 // AnyNative* ptr;
4252 // if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, transObj)) == NULL) {
4253 // printf("JS_GetPrivate failed in X3DMatrix4d.setTransform.\n");
4254 // return JS_FALSE;
4255 // }
4256 // shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&translation);
4257 //}
4258 //if (rotObj) {
4259 // AnyNative* ptr;
4260 // if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
4261 // printf("JS_GetPrivate failed in X3DMatrix4d.setTransform.\n");
4262 // return JS_FALSE;
4263 // }
4264 // shallow_copy_field_precision(ptr->type, FIELDTYPE_SFRotation, ptr->v, (union anyVrml*)&rotation);
4265 //}
4266 //if (scaleObj) {
4267 // AnyNative* ptr;
4268 // if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
4269 // printf("JS_GetPrivate failed in X3DMatrix4d.setTransform.\n");
4270 // return JS_FALSE;
4271 // }
4272 // shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&scale);
4273 //}
4274 //if (scaleOObj) {
4275 // AnyNative* ptr;
4276 // if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleOObj)) == NULL) {
4277 // printf("JS_GetPrivate failed in X3DMatrix4d.setTransform.\n");
4278 // return JS_FALSE;
4279 // }
4280 // shallow_copy_field_precision(ptr->type, FIELDTYPE_SFRotation, ptr->v, (union anyVrml*)&scaleOrientation);
4281 //}
4282 //if (centerObj) {
4283 // AnyNative* ptr;
4284 // if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, centerObj)) == NULL) {
4285 // printf("JS_GetPrivate failed in X3DMatrix4d.setTransform.\n");
4286 // return JS_FALSE;
4287 // }
4288 // shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&center);
4289 //}
4290
4291 for (i = 0; i < 4; i++) {
4292 matrix[i] = &cptr->c[i * 4]; //our current matrix3
4293 mat[i] = &m2[i * 4]; //scratch matrix
4294 }
4295 //initialize to Identity
4296 matidentity4d(matrix[0]);
4297
4298 //T
4299 //if(translation){
4300 matidentity4d(mat[0]);
4301 veccopyd(mat[3], translation.c);
4302 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4303 //}
4304 //C
4305 //if(center){
4306 matidentity4d(mat[0]);
4307 veccopyd(mat[3], center.c);
4308 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4309 //}
4310
4311 //R
4312 //if(rotation){
4313 matidentity4d(mat[0]);
4314 for (i = 0; i < 3; i++)
4315 axisangle_rotate3d(mat[i], mat[i], rotation.c);
4316 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4317 //}
4318
4319 //SR
4320 //if(scaleOrientation){
4321 matidentity4d(mat[0]);
4322 for (i = 0; i < 3; i++)
4323 axisangle_rotate3d(mat[i], mat[i], scaleOrientation.c);
4324 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4325 //}
4326
4327 //S
4328 //if(scale){
4329 matidentity4d(mat[0]);
4330 for (i = 0; i < 4; i++)
4331 vecmult3d(mat[i], mat[i], scale.c);
4332 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4333 //}
4334
4335 //
4336 //-SR
4337 //if(scaleOrientation){
4338 scaleOrientation.c[3] = -scaleOrientation.c[3];
4339 matidentity4d(mat[0]);
4340 for (i = 0; i < 3; i++)
4341 axisangle_rotate3d(mat[i], mat[i], scaleOrientation.c);
4342 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4343 scaleOrientation.c[3] = -scaleOrientation.c[3];
4344 //}
4345
4346 //-C
4347 //if(center){
4348 matidentity4d(mat[0]);
4349 veccopyd(mat[3], center.c);
4350 vecscaled(mat[3], mat[3], -1.0f);
4351 matmultiplyFULL(matrix[0], mat[0], matrix[0]);
4352 //}
4353
4354 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
4355
4356 return JS_TRUE;
4357}
4358
4359
4360JSBool
4361X3DMatrix4inverse(JSContext* cx, uintN argc, jsval* vp) {
4362 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4363 jsval* argv = JS_ARGV(cx, vp);
4364 struct SFMatrix4d* cptr;
4365 struct SFMatrix4d* ret;
4366 JSObject* retObj = NULL;
4367
4368 AnyNative* anyret;
4369 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4370 printf("SFMatrix4dNativeNew failed in X3DMatrix4.multLeft.\n");
4371 return JS_FALSE;
4372 }
4373
4374 AnyNative* ptr;
4375 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4376 printf("JS_GetPrivate failed in X3DMatrix4d.inverse.\n");
4377 return JS_FALSE;
4378 }
4379 cptr = &ptr->v->sfmatrix4d;
4380 ret = &anyret->v->sfmatrix4d;
4381 matidentity4d(ret->c);
4382
4383 matinverseFULL(ret->c, cptr->c);
4384
4385 retObj = JS_NewObject(cx, &X3DMatrix4Class, NULL, NULL);
4386 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4387 printf("JS_SetPrivate failed in X3DMatrix4.inverse.\n");
4388 return JS_FALSE;
4389 }
4390 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4391 return JS_TRUE;
4392}
4393
4394
4395JSBool
4396X3DMatrix4transpose(JSContext* cx, uintN argc, jsval* vp) {
4397 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4398 jsval* argv = JS_ARGV(cx, vp);
4399 struct SFMatrix4d* cptr;
4400 struct SFMatrix4d* ret;
4401 JSObject* retObj = NULL;
4402
4403 AnyNative* anyret;
4404 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4405 printf("SFMatrix4dNativeNew failed in X3DMatrix4.multLeft.\n");
4406 return JS_FALSE;
4407 }
4408
4409 AnyNative* ptr;
4410 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4411 printf("JS_GetPrivate failed in X3DMatrix4d.transpose.\n");
4412 return JS_FALSE;
4413 }
4414 cptr = &ptr->v->sfmatrix4d;
4415 ret = &anyret->v->sfmatrix4d;
4416 mattranspose(ret->c, cptr->c);
4417
4418 retObj = JS_NewObject(cx, &X3DMatrix4Class, NULL, NULL);
4419 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4420 printf("JS_SetPrivate failed in X3DMatrix4.inverse.\n");
4421 return JS_FALSE;
4422 }
4423 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4424 return JS_TRUE;
4425}
4426
4427
4428
4429JSBool
4430X3DMatrix4multLeft(JSContext* cx, uintN argc, jsval* vp) {
4431 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4432 jsval* argv = JS_ARGV(cx, vp);
4433 struct SFMatrix4d rhs;
4434 struct SFMatrix4d* cptr;
4435 struct SFMatrix4d* ret;
4436 JSObject* rhsObj = NULL;
4437 JSObject* retObj = NULL;
4438
4439 AnyNative* anyret;
4440 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4441 printf("SFMatrix4dNativeNew failed in X3DMatrix4.multLeft.\n");
4442 return JS_FALSE;
4443 }
4444
4445 AnyNative* ptr;
4446 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4447 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4448 return JS_FALSE;
4449 }
4450 cptr = &ptr->v->sfmatrix4d;
4451 ret = &anyret->v->sfmatrix4d;
4452 matidentity4d(ret->c);
4453 matidentity4d(rhs.c);
4454
4455 if (argc == 1) {
4456 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
4457 printf("JS_ConvertArgs failed in X3DMatrix4d.multLeft.\n");
4458 return JS_FALSE;
4459 }
4460 AnyNative* rhsptr;
4461 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
4462 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4463 return JS_FALSE;
4464 }
4465 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFMatrix4d, rhsptr->v, (union anyVrml*)&rhs);
4466 }
4467 matmultiplyFULL(ret->c, rhs.c, cptr->c);
4468
4469 retObj = JS_NewObject(cx, &X3DMatrix4Class, NULL, NULL);
4470 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4471 printf("JS_SetPrivate failed in SFMatrix3dConstr.\n");
4472 return JS_FALSE;
4473 }
4474 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4475 return JS_TRUE;
4476}
4477
4478JSBool
4479X3DMatrix4multRight(JSContext* cx, uintN argc, jsval* vp) {
4480 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4481 jsval* argv = JS_ARGV(cx, vp);
4482 struct SFMatrix4d rhs;
4483 struct SFMatrix4d* cptr;
4484 struct SFMatrix4d* ret;
4485 JSObject* rhsObj = NULL;
4486 JSObject* retObj = NULL;
4487
4488 AnyNative* anyret;
4489 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4490 printf("SFMatrix4dNativeNew failed in X3DMatrix4.multLeft.\n");
4491 return JS_FALSE;
4492 }
4493
4494 AnyNative* ptr;
4495 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4496 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4497 return JS_FALSE;
4498 }
4499 cptr = &ptr->v->sfmatrix4d;
4500 ret = &anyret->v->sfmatrix4d;
4501 matidentity4d(ret->c);
4502 matidentity4d(rhs.c);
4503
4504 if (argc == 1) {
4505 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
4506 printf("JS_ConvertArgs failed in X3DMatrix4d.multLeft.\n");
4507 return JS_FALSE;
4508 }
4509 AnyNative* rhsptr;
4510 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
4511 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4512 return JS_FALSE;
4513 }
4514 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFMatrix4d, rhsptr->v, (union anyVrml*)&rhs);
4515 }
4516 matmultiplyFULL(ret->c, cptr->c, rhs.c);
4517
4518 retObj = JS_NewObject(cx, &X3DMatrix4Class, NULL, NULL);
4519 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4520 printf("JS_SetPrivate failed in X3DMatrix4d.multLeft.\n");
4521 return JS_FALSE;
4522 }
4523 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4524 return JS_TRUE;
4525}
4526
4527
4528JSBool
4529X3DMatrix4multVecMatrix(JSContext* cx, uintN argc, jsval* vp) {
4530 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4531 jsval* argv = JS_ARGV(cx, vp);
4532 struct SFVec3d rhs;
4533 struct SFMatrix4d* cptr;
4534 struct SFVec3d* ret;
4535 JSObject* rhsObj = NULL;
4536 JSObject* retObj = NULL;
4537
4538 AnyNative* anyret;
4539 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec3d, NULL, NULL)) == NULL) {
4540 printf("SFVec3dNativeNew failed in X3DMatrix4.multVecMatrix.\n");
4541 return JS_FALSE;
4542 }
4543
4544 AnyNative* ptr;
4545 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4546 printf("JS_GetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4547 return JS_FALSE;
4548 }
4549 cptr = &ptr->v->sfmatrix4d;
4550 ret = &anyret->v->sfvec3d;
4551 vecsetd(ret->c,0.0,0.0,0.0);
4552 vecsetd(rhs.c, 0.0, 0.0, 0.0);
4553
4554 if (argc == 1) {
4555 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
4556 printf("JS_ConvertArgs failed in X3DMatrix4d.multVecMatrix.\n");
4557 return JS_FALSE;
4558 }
4559 AnyNative* rhsptr;
4560 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
4561 printf("JS_GetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4562 return JS_FALSE;
4563 }
4564 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFVec3d, rhsptr->v, (union anyVrml*)&rhs);
4565 }
4566 double a4[4], r4[4];
4567 veccopyd(a4, rhs.c);
4568 a4[3] = 1.0;
4569 vecmultmat4d(r4, a4, cptr->c);
4570 if (r4[3] != 0.0) {
4571 double wi = 1.0 / r4[3];
4572 vecscaled(ret->c, r4, wi);
4573 }
4574 else {
4575 veccopyd(ret->c, r4);
4576 }
4577
4578 retObj = JS_NewObject(cx, &SFVec3dClass, NULL, NULL);
4579 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4580 printf("JS_SetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4581 return JS_FALSE;
4582 }
4583 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4584 return JS_TRUE;
4585}
4586
4587
4588JSBool
4589X3DMatrix4multMatrixVec(JSContext* cx, uintN argc, jsval* vp) {
4590 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4591 jsval* argv = JS_ARGV(cx, vp);
4592 struct SFVec3d rhs;
4593 struct SFMatrix4d* cptr;
4594 struct SFVec3d* ret;
4595 JSObject* rhsObj = NULL;
4596 JSObject* retObj = NULL;
4597
4598 AnyNative* anyret;
4599 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec3d, NULL, NULL)) == NULL) {
4600 printf("SFVec3dNativeNew failed in X3DMatrix4.multVecMatrix.\n");
4601 return JS_FALSE;
4602 }
4603
4604 AnyNative* ptr;
4605 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4606 printf("JS_GetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4607 return JS_FALSE;
4608 }
4609 cptr = &ptr->v->sfmatrix4d;
4610 ret = &anyret->v->sfvec3d;
4611 vecsetd(ret->c, 0.0, 0.0, 0.0);
4612 vecsetd(rhs.c, 0.0, 0.0, 0.0);
4613
4614 if (argc == 1) {
4615 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
4616 printf("JS_ConvertArgs failed in X3DMatrix4d.multVecMatrix.\n");
4617 return JS_FALSE;
4618 }
4619 AnyNative* rhsptr;
4620 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
4621 printf("JS_GetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4622 return JS_FALSE;
4623 }
4624 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFVec3d, rhsptr->v, (union anyVrml*)&rhs);
4625 }
4626 double a4[4], r4[4];
4627 veccopyd(a4, rhs.c);
4628 a4[3] = 1.0;
4629 matmultvec4d(r4, cptr->c, a4);
4630 if (r4[3] != 0.0) {
4631 double wi = 1.0 / r4[3];
4632 vecscaled(ret->c, r4, wi);
4633 }
4634 else {
4635 veccopyd(ret->c, r4);
4636 }
4637
4638 retObj = JS_NewObject(cx, &SFVec3dClass, NULL, NULL);
4639 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4640 printf("JS_SetPrivate failed in X3DMatrix4d.multVecMatrix.\n");
4641 return JS_FALSE;
4642 }
4643 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4644 return JS_TRUE;
4645}
4646
4647
4648JSBool
4649X3DMatrix4Assign(JSContext* cx, uintN argc, jsval* vp) {
4650 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4651 jsval* argv = JS_ARGV(cx, vp);
4652 jsval rval;
4653 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &X3DMatrix4Class, FIELDTYPE_FreeWRLPTR/*does not matter*/)) { return JS_FALSE; }
4654 JS_SET_RVAL(cx, vp, rval);
4655 return JS_TRUE;
4656}
4657
4658
4659JSBool
4660X3DMatrix4Constr(JSContext* cx, uintN argc, jsval* vp) {
4661 JSObject* obj = JS_NewObject(cx, &X3DMatrix4Class, NULL, NULL);
4662 jsval* argv = JS_ARGV(cx, vp);
4663 jsdouble pars[16];
4664 double* cc;
4665
4666 ADD_ROOT(cx, obj)
4667 AnyNative* any;
4668 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix4d, NULL, NULL)) == NULL) {
4669 printf("SFMatrix4dNativeNew failed in X3DMatrix4Constr.\n");
4670 return JS_FALSE;
4671 }
4672
4673 if (!JS_SetPrivateFw(cx, obj, any)) {
4674 printf("JS_SetPrivate failed in SFMatrix4dConstr.\n");
4675 return JS_FALSE;
4676 }
4677 cc = any->v->sfmatrix4d.c;
4678
4679 matidentity4d(cc);
4680
4681 int ncopy = 0;
4682 if (argc == 1) {
4683 JSObject* paramObj;
4684 int isArray;
4685
4686 if (!JS_ValueToObject(cx, argv[0], &paramObj)) {
4687 printf("JS_ValueToObject failed in SFMatrix4dConstr.\n");
4688 return JS_FALSE;
4689 }
4690
4691 if (JS_IsArrayObject(cx, paramObj)) {
4692 jsuint lengthp;
4693 jsval vp;
4694 double _d;
4695 //printf("its an array\n");
4696 isArray = TRUE;
4697 JS_GetArrayLength(cx, paramObj, &lengthp);
4698 ncopy = lengthp > 16 ? 16 : lengthp;
4699 for (int i = 0; i < ncopy; i++) {
4700 JS_GetElement(cx, paramObj, i, &vp);
4701 if (JS_ValueToNumber(cx, vp, &_d))
4702 cc[i] = _d;
4703 }
4704 }
4705 else {
4706
4707 AnyNative* pptr;
4708 if ((pptr = (AnyNative*)JS_GetPrivateFw(cx, paramObj)) == NULL) {
4709 printf("JS_GetPrivate failed in X3DMatrix4Constr.\n");
4710 return JS_FALSE;
4711 }
4712 shallow_copy_field_precision(pptr->type, FIELDTYPE_SFMatrix4d, pptr->v, (union anyVrml*)cc);
4713 }
4714 }
4715 else if (argc == 16) {
4716 if (!JS_ConvertArguments(cx, argc, argv, "d d d d d d d d d d d d d d d d",
4717 &(pars[0]), &(pars[1]), &(pars[2]), &(pars[3]),
4718 &(pars[4]), &(pars[5]), &(pars[6]), &(pars[7]),
4719 &(pars[8]), &(pars[9]), &(pars[10]), &(pars[11]),
4720 &(pars[12]), &(pars[13]), &(pars[14]), &(pars[15])
4721 ))
4722 {
4723 printf("JS_ConvertArguments failed in X3DMatrix4Constr.\n");
4724 return JS_FALSE;
4725 }
4726 for (int i = 0; i < 16; i++)
4727 cc[i] = (double)pars[i];
4728 }
4729 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
4730 return JS_TRUE;
4731}
4732
4733JSBool
4734X3DMatrix4AddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
4735 JSObject* obj = *hobj.address();
4736 jsid id = *hiid.address();
4737 jsval* vp = hvp.address();
4738 return doMFAddProperty(cx, obj, id, vp, "X3DMatrix4AddProperty");
4739}
4740
4741JSBool
4742X3DMatrix4GetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
4743 JSObject* obj = *hobj.address();
4744 jsid iid = *hiid.address();
4745 jsval* vp = hvp.address();
4746 int index;
4747
4748 jsval id;
4749 if (!JS_IdToValue(cx, iid, &id)) {
4750 printf("JS_IdToValue failed in X3DMatrix4.GetProperty.\n");
4751 return JS_FALSE;
4752 }
4753
4754 if (JSVAL_IS_INT(id)) {
4755 index = JSVAL_TO_INT(id);
4756 if (index > -1 && index < 4) {
4757 struct SFMatrix4d* cptr;
4758
4759 AnyNative* ptr;
4760 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4761 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4762 return JS_FALSE;
4763 }
4764 cptr = &ptr->v->sfmatrix4d;
4765 double* row = &cptr->c[index * 4];
4766
4767 AnyNative* anyret;
4768 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec4d, NULL, NULL)) == NULL) {
4769 printf("SFVec4dNativeNew failed in X3DMatrix4.GetProperty.\n");
4770 return JS_FALSE;
4771 }
4772 anyret->gc = 0;
4773 anyret->type = FIELDTYPE_SFVec4d;
4774 anyret->v = (union anyVrml*)row;
4775 JSObject *retObj = JS_NewObject(cx, &SFVec4dClass, NULL, NULL);
4776 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
4777 printf("JS_SetPrivate failed in SFMatrix3dConstr.\n");
4778 return JS_FALSE;
4779 }
4780 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
4781 return JS_TRUE;
4782
4783 }
4784 }
4785 else if (id.isObject()) {
4786 }
4787
4788 return JS_TRUE;
4789}
4790
4791JSBool
4792X3DMatrix4SetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
4793 JSObject* obj = *hobj.address();
4794 jsid iid = *hiid.address();
4795 jsval* vp = hvp.address();
4796
4797 int index;
4798
4799 jsval id;
4800 if (!JS_IdToValue(cx, iid, &id)) {
4801 printf("JS_IdToValue failed in X3DMatrix4.GetProperty.\n");
4802 return JS_FALSE;
4803 }
4804
4805 if (JSVAL_IS_INT(id)) {
4806 index = JSVAL_TO_INT(id);
4807 if (index > -1 && index < 4) {
4808 struct SFMatrix4d* cptr;
4809 double rhs;
4810 if (!JS_ValueToNumber(cx, *vp, &rhs)) {
4811 printf("problems converting Javascript val to number in X3DMatrix.SetProperty\n");
4812 return JS_FALSE;
4813 }
4814
4815 AnyNative* ptr;
4816 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4817 printf("JS_GetPrivate failed in X3DMatrix4d.multLeft.\n");
4818 return JS_FALSE;
4819 }
4820 cptr = &ptr->v->sfmatrix4d;
4821 double* row = &cptr->c[index * 4];
4822 row[index] = 100.0; //****
4823 return JS_TRUE;
4824
4825 }
4826 }
4827 else if (id.isObject()) {
4828 }
4829
4830 return JS_TRUE;
4831}
4832
4833// X3DMatrix3
4834
4835JSBool
4836X3DMatrix3ToString(JSContext* cx, uintN argc, jsval* vp) {
4837 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4838 jsval* argv = JS_ARGV(cx, vp);
4839
4840 JSString* _str;
4841 double* cc;
4842 char buff[STRING];
4843
4844 UNUSED(argc);
4845 UNUSED(argv);
4846 if (SM_method() == 2) {
4847 AnyNative* ptr;
4848 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4849 printf("JS_GetPrivate failed in SFMatrix3dToString.\n");
4850 return JS_FALSE;
4851 }
4852 cc = ptr->v->sfmatrix3d.c;
4853 }
4854 memset(buff, 0, STRING);
4855 sprintf(buff, "%.9g %.9g %.9g, %.9g %.9g %.9g, %.9g %.9g %.9g",
4856 cc[0], cc[1], cc[2],
4857 cc[3], cc[4], cc[5],
4858 cc[6], cc[7], cc[8]
4859 );
4860 _str = JS_NewStringCopyZ(cx, buff);
4861
4862 JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(_str));
4863 return JS_TRUE;
4864}
4865
4866JSBool
4867X3DMatrix3getTransform(JSContext* cx, uintN argc, jsval* vp) {
4868 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4869 jsval* argv = JS_ARGV(cx, vp);
4870 int i;
4871 JSObject* transObj = NULL;
4872 JSObject* rotObj = NULL;
4873 JSObject* scaleObj = NULL;
4874
4875 struct SFMatrix3d* cptr;
4876 struct SFVec2d translation;
4877 struct SFVec3d rotation;
4878 struct SFVec2d scale;
4879 double* matrix[3], retscale[2];
4880 double matrixd[9], angle;
4881
4882
4883 AnyNative* ptr;
4884 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
4885 printf("JS_GetPrivate failed in X3DMatrix3d.inverse.\n");
4886 return JS_FALSE;
4887 }
4888 cptr = &ptr->v->sfmatrix3d;
4889
4890 for (i = 0; i < 3; i++)
4891 matrix[i] = &cptr->c[i * 3];
4892
4893 //get row scales
4894 for (i = 0; i < 2; i++)
4895 retscale[i] = sqrt(vecdotd(matrix[i], matrix[i]));
4896 veccopy2d(scale.c, retscale);
4897 //if (translation) {
4898 veccopy2d(translation.c, matrix[2]);
4899
4900 //}
4901
4902 /* rotation */
4903 if (1) {
4904 /* apply length to each row to normalize upperleft 3x3 to rotations and shears*/
4905 double m2[9], ff;
4906 for (i = 0; i < 2; i++) {
4907 ff = retscale[i];
4908 if (ff != 0.0f) ff = 1 / ff;
4909 vecscaled(&m2[i * 3], matrix[i], ff);
4910 }
4911 angle = atan2(m2[1], m2[2]); //right indexes? should be 0 and 1?
4912 /* now copy the values over */
4913 //if(rotation)
4914 memset(&rotation, 0, sizeof(struct SFVec3d));
4915 rotation.c[0] = cos(angle);
4916 rotation.c[1] = sin(angle);
4917 rotation.c[2] = angle;
4918 }
4919
4920 if (argc == 1) {
4921 if (!JS_ConvertArguments(cx, argc, argv, "o", &transObj)) {
4922 printf("getTransform, invalid parameters\n");
4923 return JS_FALSE;
4924 }
4925 }
4926 if (argc == 2) {
4927 if (!JS_ConvertArguments(cx, argc, argv, "o o", &transObj, &rotObj)) {
4928 printf("getTransform, invalid parameters\n");
4929 return JS_FALSE;
4930 }
4931 }
4932 if (argc == 3) {
4933 if (!JS_ConvertArguments(cx, argc, argv, "o o o",
4934 &transObj, &rotObj, &scaleObj)) {
4935 printf("getTransform, invalid parameters\n");
4936 return JS_FALSE;
4937 }
4938 }
4939
4940 if (transObj) {
4941 AnyNative* ptr;
4942 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, transObj)) == NULL) {
4943 printf("JS_GetPrivate failed in X3DMatrix3d.getTransform.\n");
4944 return JS_FALSE;
4945 }
4946 shallow_copy_field_precision(FIELDTYPE_SFVec2d, ptr->type, (union anyVrml*)&translation, ptr->v);
4947 }
4948 if (rotObj) {
4949 AnyNative* ptr;
4950 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
4951 printf("JS_GetPrivate failed in X3DMatrix3d.getTransform.\n");
4952 return JS_FALSE;
4953 }
4954 shallow_copy_field_precision(FIELDTYPE_SFVec3d, ptr->type, (union anyVrml*)&rotation, ptr->v);
4955 }
4956 if (scaleObj) {
4957 AnyNative* ptr;
4958 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
4959 printf("JS_GetPrivate failed in X3DMatrix3d.getTransform.\n");
4960 return JS_FALSE;
4961 }
4962 shallow_copy_field_precision(FIELDTYPE_SFVec2d, ptr->type, (union anyVrml*)&scale, ptr->v);
4963 }
4964
4965 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
4966
4967 return JS_TRUE;
4968}
4969
4970
4971/* Sets the X3DMatrix3 to the passed values. Any of the rightmost parameters may be omitted.
4972 The method has 0 to 5 parameters. For example, specifying 0 parameters results in an
4973 identity matrix while specifying 1 parameter results in a translation and specifying 2
4974 parameters results in a translation and a rotation. Any unspecified parameter is set to
4975 its default as specified for the Transform node.
4976 //void setTransform(SFVec3f translation, SFVec3f rotation, SFVec3f scale, SFVec3f scaleOrientation, SFVec3f center)
4977 // http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#Transform
4978 // P' = T * C * R * SR * S * -SR * -C * P
4979*/
4980JSBool
4981X3DMatrix3setTransform(JSContext* cx, uintN argc, jsval* vp) {
4982 JSObject* obj = JS_THIS_OBJECT(cx, vp);
4983 jsval* argv = JS_ARGV(cx, vp);
4984 JSObject* transObj = NULL;
4985 JSObject* rotObj = NULL;
4986 JSObject* scaleObj = NULL;
4987 JSObject* scaleOObj = NULL;
4988 JSObject* centerObj = NULL;
4989 int i;
4990 struct SFMatrix3d* cptr;
4991 struct SFVec2d translation; // = fwpars[0]._web3dval.native;
4992 struct SFVec3d rotation; // = fwpars[1]._web3dval.native;
4993 struct SFVec2d scale; // = fwpars[2]._web3dval.native;
4994 struct SFVec3d scaleOrientation; // = fwpars[3]._web3dval.native;
4995 struct SFVec2d center; // = fwpars[4]._web3dval.native;
4996 //set up some [][] helpers for clarity
4997 double* matrix[3], * mat[3], m2[9], angle, scaleangle, dval;
4998
4999 memset(&translation, 0, sizeof(struct SFVec2d));
5000 memset(&rotation, 0, sizeof(struct SFVec3d));
5001 memset(&scale, 0, sizeof(struct SFVec2d));
5002 memset(&scaleOrientation, 0, sizeof(struct SFVec3d));
5003 memset(&center, 0, sizeof(struct SFVec2d));
5004 scale.c[0] = scale.c[1] = 1.0;
5005 angle = scaleangle = 0.0;
5006
5007 AnyNative* anyret;
5008 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5009 printf("SFMatrix3dNativeNew failed in X3DMatrix3.multLeft.\n");
5010 return JS_FALSE;
5011 }
5012
5013 AnyNative* ptr;
5014 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5015 printf("JS_GetPrivate failed in X3DMatrix3d.inverse.\n");
5016 return JS_FALSE;
5017 }
5018 cptr = &ptr->v->sfmatrix3d;
5019
5020 int error = FALSE;
5021
5022 if (argc >= 1) {
5023 //Translation, either SFVecXX or js [] array
5024 error = !JS_ValueToObject(cx, argv[0], &transObj);
5025 if (JS_IsArrayObject(cx, transObj)) {
5026 jsuint lengthp;
5027 jsval vp;
5028 JS_GetArrayLength(cx, transObj, &lengthp);
5029 int ncopy = lengthp > 2 ? 2 : lengthp;
5030 for (i = 0; i < 2; i++) {
5031 JS_GetElement(cx, transObj, i, &vp);
5032 if (JS_ValueToNumber(cx, vp, &dval))
5033 translation.c[i] = dval;
5034 }
5035 }
5036 else {
5037 AnyNative* ptr;
5038 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, transObj)) == NULL) {
5039 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
5040 return JS_FALSE;
5041 }
5042 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec2d, ptr->v, (union anyVrml*)&translation);
5043 }
5044 }
5045 if (argc >= 2) {
5046 // rotation either scalar or SFVec3X
5047 if (argv[1].isNumber()) {
5048 double val;
5049 JS_ValueToNumber(cx, argv[1], &val);
5050 angle = val;
5051 }
5052 else {
5053 error = !JS_ValueToObject(cx, argv[1], &rotObj);
5054 AnyNative* ptr;
5055 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
5056 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
5057 return JS_FALSE;
5058 }
5059 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&rotation);
5060 angle = rotation.c[2];
5061 }
5062 }
5063 if (argc >= 3) {
5064 //scale - either a scalar or js array [] or SFVec2X
5065 if (argv[2].isNumber()) {
5066 double val;
5067 JS_ValueToNumber(cx, argv[2], &val);
5068 scale.c[0] = scale.c[1] = val;
5069 }
5070 else if (argv[2].isObject()) {
5071 error = !JS_ValueToObject(cx, argv[2], &scaleObj);
5072 if (JS_IsArrayObject(cx, scaleObj)) {
5073 jsuint lengthp;
5074 jsval vp;
5075 JS_GetArrayLength(cx, scaleObj, &lengthp);
5076 int ncopy = lengthp > 2 ? 2 : lengthp;
5077 for (i = 0; i < 2; i++) {
5078 JS_GetElement(cx, scaleObj, i, &vp);
5079 if (JS_ValueToNumber(cx, vp, &dval))
5080 scale.c[i] = dval;
5081 }
5082 }
5083 else {
5084 AnyNative* ptr;
5085 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
5086 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
5087 return JS_FALSE;
5088 }
5089 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec2d, ptr->v, (union anyVrml*)&scale);
5090 }
5091 }
5092 }
5093 if (argc >= 4) {
5094 //scaleOrientation either a scalar or SFVec3X
5095 if (argv[3].isNumber()) {
5096 double val;
5097 JS_ValueToNumber(cx, argv[3], &val);
5098 scaleangle = val;
5099 }
5100 else {
5101 error = !JS_ValueToObject(cx, argv[3], &scaleOObj);
5102 AnyNative* ptr;
5103 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, scaleOObj)) == NULL) {
5104 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
5105 return JS_FALSE;
5106 }
5107 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec3d, ptr->v, (union anyVrml*)&rotation);
5108 scaleangle = rotation.c[2];
5109 }
5110 }
5111 if (argc >= 5) {
5112 //center either an SFVec2X or js array[]
5113 if (argv[4].isObject()) {
5114 error = !JS_ValueToObject(cx, argv[4], &centerObj);
5115 if (JS_IsArrayObject(cx, centerObj)) {
5116 jsuint lengthp;
5117 jsval vp;
5118 JS_GetArrayLength(cx, centerObj, &lengthp);
5119 int ncopy = lengthp > 2 ? 2 : lengthp;
5120 for (i = 0; i < 2; i++) {
5121 JS_GetElement(cx, centerObj, i, &vp);
5122 if (JS_ValueToNumber(cx, vp, &dval))
5123 center.c[i] = dval;
5124 }
5125 }
5126 else {
5127 AnyNative* ptr;
5128 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, centerObj)) == NULL) {
5129 printf("JS_GetPrivate failed in X3DMatrix3d.setTransform.\n");
5130 return JS_FALSE;
5131 }
5132 shallow_copy_field_precision(ptr->type, FIELDTYPE_SFVec2d, ptr->v, (union anyVrml*)&center);
5133 }
5134 }
5135 }
5136
5137 if (error) {
5138 ConsoleMessage("setTransform: error in parameters");
5139 return JS_FALSE;
5140 }
5141
5142 for (i = 0; i < 3; i++) {
5143 matrix[i] = &cptr->c[i * 3];
5144 mat[i] = &m2[i * 3];
5145 }
5146 //initialize to Identity
5147 matidentity3d(matrix[0]);
5148
5149 //T
5150 //if(translation){
5151 matidentity3d(mat[0]);
5152 veccopy2d(mat[2], translation.c);
5153 matmultiply3d(matrix[0], mat[0], matrix[0]);
5154 //}
5155 //C
5156 //if(center){
5157 matidentity3d(mat[0]);
5158 veccopy2d(mat[2], center.c);
5159 matmultiply3d(matrix[0], mat[0], matrix[0]);
5160 //}
5161 //R
5162 if (angle != 0.0f) {
5163 matidentity3d(mat[0]);
5164 mat[0][0] = mat[1][1] = cos(angle);
5165 mat[0][1] = mat[1][0] = sin(angle);
5166 mat[1][0] = -mat[1][0];
5167 matmultiply3d(matrix[0], mat[0], matrix[0]);
5168 }
5169 //SR
5170 if (scaleangle != 0.0f) {
5171 matidentity3d(mat[0]);
5172 mat[0][0] = mat[1][1] = cos(scaleangle);
5173 mat[0][1] = mat[1][0] = sin(scaleangle);
5174 mat[1][0] = -mat[1][0];
5175 matmultiply3d(matrix[0], mat[0], matrix[0]);
5176 }
5177 //S
5178 //if(scale){
5179 matidentity3d(mat[0]);
5180 for (i = 0; i < 3; i++)
5181 vecmult2d(mat[i], mat[i], scale.c);
5182 matmultiply3d(matrix[0], mat[0], matrix[0]);
5183 //}
5184
5185 //-SR
5186 if (scaleangle != 0.0) {
5187 matidentity3d(mat[0]);
5188 mat[0][0] = mat[1][1] = cos(-scaleangle);
5189 mat[0][1] = mat[1][0] = sin(-scaleangle);
5190 mat[1][0] = -mat[1][0];
5191 matmultiply3d(matrix[0], mat[0], matrix[0]);
5192 }
5193
5194 //-C
5195 //if(center){
5196 matidentity3d(mat[0]);
5197 veccopy2d(mat[2], center.c);
5198 vecscale2d(mat[2], mat[2], -1.0);
5199 matmultiply3d(matrix[0], mat[0], matrix[0]);
5200 //}
5201
5202 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
5203
5204 return JS_TRUE;
5205}
5206
5207
5208JSBool
5209X3DMatrix3inverse(JSContext* cx, uintN argc, jsval* vp) {
5210 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5211 jsval* argv = JS_ARGV(cx, vp);
5212 struct SFMatrix3d* cptr;
5213 struct SFMatrix3d* ret;
5214 JSObject* retObj = NULL;
5215
5216 AnyNative* anyret;
5217 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5218 printf("SFMatrix3dNativeNew failed in X3DMatrix3.multLeft.\n");
5219 return JS_FALSE;
5220 }
5221
5222 AnyNative* ptr;
5223 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5224 printf("JS_GetPrivate failed in X3DMatrix3d.inverse.\n");
5225 return JS_FALSE;
5226 }
5227 cptr = &ptr->v->sfmatrix3d;
5228 ret = &anyret->v->sfmatrix3d;
5229
5230 matinverse3d(ret->c, cptr->c);
5231
5232 retObj = JS_NewObject(cx, &X3DMatrix3Class, NULL, NULL);
5233 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5234 printf("JS_SetPrivate failed in X3DMatrix3.inverse.\n");
5235 return JS_FALSE;
5236 }
5237 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5238 return JS_TRUE;
5239}
5240
5241
5242JSBool
5243X3DMatrix3transpose(JSContext* cx, uintN argc, jsval* vp) {
5244 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5245 jsval* argv = JS_ARGV(cx, vp);
5246 struct SFMatrix3d* cptr;
5247 struct SFMatrix3d* ret;
5248 JSObject* retObj = NULL;
5249
5250 AnyNative* anyret;
5251 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5252 printf("SFMatrix3dNativeNew failed in X3DMatrix3.multLeft.\n");
5253 return JS_FALSE;
5254 }
5255
5256 AnyNative* ptr;
5257 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5258 printf("JS_GetPrivate failed in X3DMatrix3d.transpose.\n");
5259 return JS_FALSE;
5260 }
5261 cptr = &ptr->v->sfmatrix3d;
5262 ret = &anyret->v->sfmatrix3d;
5263 mattranspose3d(ret->c, cptr->c);
5264
5265 retObj = JS_NewObject(cx, &X3DMatrix3Class, NULL, NULL);
5266 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5267 printf("JS_SetPrivate failed in X3DMatrix3.inverse.\n");
5268 return JS_FALSE;
5269 }
5270 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5271 return JS_TRUE;
5272}
5273
5274
5275JSBool
5276X3DMatrix3multLeft(JSContext* cx, uintN argc, jsval* vp) {
5277 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5278 jsval* argv = JS_ARGV(cx, vp);
5279 struct SFMatrix3d rhs;
5280 struct SFMatrix3d* cptr;
5281 struct SFMatrix3d* ret;
5282 JSObject* rhsObj = NULL;
5283 JSObject* retObj = NULL;
5284
5285 AnyNative* anyret;
5286 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5287 printf("SFMatrix3dNativeNew failed in X3DMatrix3.multLeft.\n");
5288 return JS_FALSE;
5289 }
5290
5291 AnyNative* ptr;
5292 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5293 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5294 return JS_FALSE;
5295 }
5296 cptr = &ptr->v->sfmatrix3d;
5297 ret = &anyret->v->sfmatrix3d;
5298 matidentity3d(ret->c);
5299 matidentity3d(rhs.c);
5300
5301 if (argc == 1) {
5302 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
5303 printf("JS_ConvertArgs failed in X3DMatrix3d.multLeft.\n");
5304 return JS_FALSE;
5305 }
5306 AnyNative* rhsptr;
5307 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
5308 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5309 return JS_FALSE;
5310 }
5311 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFMatrix3d, rhsptr->v, (union anyVrml*)&rhs);
5312 }
5313 matmultiply3d(ret->c, rhs.c, cptr->c);
5314
5315
5316 retObj = JS_NewObject(cx, &X3DMatrix3Class, NULL, NULL);
5317 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5318 printf("JS_SetPrivate failed in SFMatrix3dConstr.\n");
5319 return JS_FALSE;
5320 }
5321 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5322 return JS_TRUE;
5323}
5324
5325JSBool
5326X3DMatrix3multRight(JSContext* cx, uintN argc, jsval* vp) {
5327 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5328 jsval* argv = JS_ARGV(cx, vp);
5329 struct SFMatrix3d rhs;
5330 struct SFMatrix3d* cptr;
5331 struct SFMatrix3d* ret;
5332 JSObject* rhsObj = NULL;
5333 JSObject* retObj = NULL;
5334
5335 AnyNative* anyret;
5336 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5337 printf("SFMatrix3dNativeNew failed in X3DMatrix3.multLeft.\n");
5338 return JS_FALSE;
5339 }
5340
5341 AnyNative* ptr;
5342 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5343 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5344 return JS_FALSE;
5345 }
5346 cptr = &ptr->v->sfmatrix3d;
5347 ret = &anyret->v->sfmatrix3d;
5348 matidentity3d(ret->c);
5349 matidentity3d(rhs.c);
5350
5351 if (argc == 1) {
5352 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
5353 printf("JS_ConvertArgs failed in X3DMatrix3d.multLeft.\n");
5354 return JS_FALSE;
5355 }
5356 AnyNative* rhsptr;
5357 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
5358 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5359 return JS_FALSE;
5360 }
5361 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFMatrix3d, rhsptr->v, (union anyVrml*)&rhs);
5362 }
5363 matmultiply3d(ret->c, cptr->c, rhs.c);
5364
5365 retObj = JS_NewObject(cx, &X3DMatrix3Class, NULL, NULL);
5366 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5367 printf("JS_SetPrivate failed in X3DMatrix3d.multLeft.\n");
5368 return JS_FALSE;
5369 }
5370 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5371 return JS_TRUE;
5372}
5373
5374
5375JSBool
5376X3DMatrix3multVecMatrix(JSContext* cx, uintN argc, jsval* vp) {
5377 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5378 jsval* argv = JS_ARGV(cx, vp);
5379 struct SFVec2d rhs;
5380 struct SFMatrix3d* cptr;
5381 struct SFVec2d* ret;
5382 JSObject* rhsObj = NULL;
5383 JSObject* retObj = NULL;
5384
5385 AnyNative* anyret;
5386 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec2d, NULL, NULL)) == NULL) {
5387 printf("SFVec2dNativeNew failed in X3DMatrix3.multVecMatrix.\n");
5388 return JS_FALSE;
5389 }
5390
5391 AnyNative* ptr;
5392 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5393 printf("JS_GetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5394 return JS_FALSE;
5395 }
5396 cptr = &ptr->v->sfmatrix3d;
5397 ret = &anyret->v->sfvec2d;
5398 vecset2d(ret->c, 0.0, 0.0);
5399 vecset2d(rhs.c, 0.0, 0.0);
5400
5401 if (argc == 1) {
5402 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
5403 printf("JS_ConvertArgs failed in X3DMatrix3d.multVecMatrix.\n");
5404 return JS_FALSE;
5405 }
5406 AnyNative* rhsptr;
5407 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
5408 printf("JS_GetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5409 return JS_FALSE;
5410 }
5411 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFVec2d, rhsptr->v, (union anyVrml*)&rhs);
5412 }
5413 double a3[3], r3[3];
5414 veccopy2d(a3, rhs.c);
5415 a3[2] = 1.0;
5416 vecmultmat3d(r3, a3, cptr->c);
5417 if (r3[2] != 0.0) {
5418 double wi = 1.0 / r3[2];
5419 vecscale2d(ret->c, r3, wi);
5420 }
5421 else {
5422 veccopy2d(ret->c, r3);
5423 }
5424
5425 retObj = JS_NewObject(cx, &SFVec2dClass, NULL, NULL);
5426 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5427 printf("JS_SetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5428 return JS_FALSE;
5429 }
5430 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5431 return JS_TRUE;
5432}
5433
5434
5435JSBool
5436X3DMatrix3multMatrixVec(JSContext* cx, uintN argc, jsval* vp) {
5437 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5438 jsval* argv = JS_ARGV(cx, vp);
5439 struct SFVec2d rhs;
5440 struct SFMatrix3d* cptr;
5441 struct SFVec2d* ret;
5442 JSObject* rhsObj = NULL;
5443 JSObject* retObj = NULL;
5444
5445 AnyNative* anyret;
5446 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec2d, NULL, NULL)) == NULL) {
5447 printf("SFVec2dNativeNew failed in X3DMatrix3.multVecMatrix.\n");
5448 return JS_FALSE;
5449 }
5450
5451 AnyNative* ptr;
5452 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5453 printf("JS_GetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5454 return JS_FALSE;
5455 }
5456 cptr = &ptr->v->sfmatrix3d;
5457 ret = &anyret->v->sfvec2d;
5458 vecset2d(ret->c, 0.0, 0.0);
5459 vecset2d(rhs.c, 0.0, 0.0);
5460
5461 if (argc == 1) {
5462 if (!JS_ConvertArguments(cx, argc, argv, "o", &rhsObj)) {
5463 printf("JS_ConvertArgs failed in X3DMatrix3d.multVecMatrix.\n");
5464 return JS_FALSE;
5465 }
5466 AnyNative* rhsptr;
5467 if ((rhsptr = (AnyNative*)JS_GetPrivateFw(cx, rhsObj)) == NULL) {
5468 printf("JS_GetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5469 return JS_FALSE;
5470 }
5471 shallow_copy_field_precision(rhsptr->type, FIELDTYPE_SFVec2d, rhsptr->v, (union anyVrml*)&rhs);
5472 }
5473 double a3[3], r3[3];
5474 veccopy2d(a3, rhs.c);
5475 a3[2] = 1.0f;
5476 matmultvec3d(r3, cptr->c, a3);
5477 if (r3[2] != 0.0f) {
5478 double wi = 1.0 / r3[2];
5479 vecscale2d(ret->c, r3, wi);
5480 }
5481 else {
5482 veccopy2d(ret->c, r3);
5483 }
5484
5485 retObj = JS_NewObject(cx, &SFVec2dClass, NULL, NULL);
5486 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5487 printf("JS_SetPrivate failed in X3DMatrix3d.multVecMatrix.\n");
5488 return JS_FALSE;
5489 }
5490 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5491 return JS_TRUE;
5492}
5493
5494
5495JSBool
5496X3DMatrix3Assign(JSContext* cx, uintN argc, jsval* vp) {
5497 JSObject* obj = JS_THIS_OBJECT(cx, vp);
5498 jsval* argv = JS_ARGV(cx, vp);
5499 jsval rval;
5500 if (!_standardMFAssign(cx, obj, argc, argv, &rval, &X3DMatrix3Class, FIELDTYPE_FreeWRLPTR/*does not matter*/)) { return JS_FALSE; }
5501 JS_SET_RVAL(cx, vp, rval);
5502 return JS_TRUE;
5503}
5504
5505
5506JSBool
5507X3DMatrix3Constr(JSContext* cx, uintN argc, jsval* vp) {
5508 JSObject* obj = JS_NewObject(cx, &X3DMatrix3Class, NULL, NULL);
5509 jsval* argv = JS_ARGV(cx, vp);
5510 jsdouble pars[9];
5511 double* cc;
5512
5513 ADD_ROOT(cx, obj)
5514 AnyNative* any;
5515 if ((any = (AnyNative*)AnyNativeNew(FIELDTYPE_SFMatrix3d, NULL, NULL)) == NULL) {
5516 printf("SFMatrix3dNativeNew failed in X3DMatrix3Constr.\n");
5517 return JS_FALSE;
5518 }
5519
5520 if (!JS_SetPrivateFw(cx, obj, any)) {
5521 printf("JS_SetPrivate failed in SFMatrix3dConstr.\n");
5522 return JS_FALSE;
5523 }
5524 cc = any->v->sfmatrix3d.c;
5525
5526 matidentity3d(cc);
5527
5528 int ncopy = 0;
5529 if (argc == 1) {
5530 JSObject* paramObj;
5531 int isArray;
5532
5533 if (!JS_ValueToObject(cx, argv[0], &paramObj)) {
5534 printf("JS_ValueToObject failed in SFMatrix3dConstr.\n");
5535 return JS_FALSE;
5536 }
5537
5538 if (JS_IsArrayObject(cx, paramObj)) {
5539 jsuint lengthp;
5540 jsval vp;
5541 double _d;
5542 //printf("its an array\n");
5543 isArray = TRUE;
5544 JS_GetArrayLength(cx, paramObj, &lengthp);
5545 ncopy = lengthp > 9 ? 9 : lengthp;
5546 for (int i = 0; i < ncopy; i++) {
5547 JS_GetElement(cx, paramObj, i, &vp);
5548 if (JS_ValueToNumber(cx, vp, &_d))
5549 cc[i] = _d;
5550 }
5551 }
5552 else {
5553
5554 AnyNative* pptr;
5555 if ((pptr = (AnyNative*)JS_GetPrivateFw(cx, paramObj)) == NULL) {
5556 printf("JS_GetPrivate failed in X3DMatrix3Constr.\n");
5557 return JS_FALSE;
5558 }
5559 shallow_copy_field_precision(pptr->type, FIELDTYPE_SFMatrix3d, pptr->v, (union anyVrml*)cc);
5560 }
5561 }
5562 else if (argc == 9) {
5563 if (!JS_ConvertArguments(cx, argc, argv, "d d d d d d d d d",
5564 &(pars[0]), &(pars[1]), &(pars[2]),
5565 &(pars[3]), &(pars[4]), &(pars[5]),
5566 &(pars[6]), &(pars[7]), &(pars[8])
5567 ))
5568 {
5569 printf("JS_ConvertArguments failed in X3DMatrix3Constr.\n");
5570 return JS_FALSE;
5571 }
5572 for (int i = 0; i < 9; i++)
5573 cc[i] = (double)pars[i];
5574 }
5575 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
5576 return JS_TRUE;
5577}
5578
5579JSBool
5580X3DMatrix3AddProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
5581 JSObject* obj = *hobj.address();
5582 jsid id = *hiid.address();
5583 jsval* vp = hvp.address();
5584 return doMFAddProperty(cx, obj, id, vp, "X3DMatrix3AddProperty");
5585}
5586
5587JSBool
5588X3DMatrix3GetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp) {
5589 JSObject* obj = *hobj.address();
5590 jsid iid = *hiid.address();
5591 jsval* vp = hvp.address();
5592 int index;
5593
5594 jsval id;
5595 if (!JS_IdToValue(cx, iid, &id)) {
5596 printf("JS_IdToValue failed in X3DMatrix3.GetProperty.\n");
5597 return JS_FALSE;
5598 }
5599
5600 if (JSVAL_IS_INT(id)) {
5601 index = JSVAL_TO_INT(id);
5602 if (index > -1 && index < 3) {
5603 struct SFMatrix3d* cptr;
5604
5605 AnyNative* ptr;
5606 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5607 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5608 return JS_FALSE;
5609 }
5610 cptr = &ptr->v->sfmatrix3d;
5611 double* row = &cptr->c[index * 3];
5612
5613 AnyNative* anyret;
5614 if ((anyret = (AnyNative*)AnyNativeNew(FIELDTYPE_SFVec3d, NULL, NULL)) == NULL) {
5615 printf("SFVec4dNativeNew failed in X3DMatrix3.GetProperty.\n");
5616 return JS_FALSE;
5617 }
5618 anyret->gc = 0;
5619 anyret->type = FIELDTYPE_SFVec3d;
5620 anyret->v = (union anyVrml*)row;
5621 JSObject* retObj = JS_NewObject(cx, &SFVec3dClass, NULL, NULL);
5622 if (!JS_SetPrivateFw(cx, retObj, anyret)) {
5623 printf("JS_SetPrivate failed in SFMatrix3dConstr.\n");
5624 return JS_FALSE;
5625 }
5626 JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(retObj));
5627 return JS_TRUE;
5628
5629 }
5630 }
5631 else if (id.isObject()) {
5632 }
5633
5634 return JS_TRUE;
5635}
5636
5637JSBool
5638X3DMatrix3SetProperty(JSContext* cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp) {
5639 JSObject* obj = *hobj.address();
5640 jsid iid = *hiid.address();
5641 jsval* vp = hvp.address();
5642
5643 int index;
5644
5645 jsval id;
5646 if (!JS_IdToValue(cx, iid, &id)) {
5647 printf("JS_IdToValue failed in X3DMatrix3.GetProperty.\n");
5648 return JS_FALSE;
5649 }
5650
5651 if (JSVAL_IS_INT(id)) {
5652 index = JSVAL_TO_INT(id);
5653 if (index > -1 && index < 3) {
5654 struct SFMatrix3d* cptr;
5655 double rhs;
5656 if (!JS_ValueToNumber(cx, *vp, &rhs)) {
5657 printf("problems converting Javascript val to number in X3DMatrix.SetProperty\n");
5658 return JS_FALSE;
5659 }
5660
5661 AnyNative* ptr;
5662 if ((ptr = (AnyNative*)JS_GetPrivateFw(cx, obj)) == NULL) {
5663 printf("JS_GetPrivate failed in X3DMatrix3d.multLeft.\n");
5664 return JS_FALSE;
5665 }
5666 cptr = &ptr->v->sfmatrix3d;
5667 double* row = &cptr->c[index * 3];
5668 row[index] = 100.0; //**** we don't set here. We set in SFVec3d [][]
5669 return JS_TRUE;
5670
5671 }
5672 }
5673 else if (id.isObject()) {
5674 }
5675
5676 return JS_TRUE;
5677}
5678
5679
5680
5681#endif //defined(JS_SMCPP)
5682
5683#endif //JAVASCRIPT_SM
5684