34#include <libFreeWRL.h>
38#include "../vrml_parser/Structs.h"
39#include "../main/headers.h"
40#include "../vrml_parser/CParseGeneral.h"
41#include "../vrml_parser/CFieldDecls.h"
42#include "../vrml_parser/CParseLexer.h"
43#include "../main/Snapshot.h"
44#include "../scenegraph/Vector.h"
45#include "../scenegraph/Collision.h"
46#include "../scenegraph/quaternion.h"
47#include "../scenegraph/Viewer.h"
48#include "../input/SensInterps.h"
49#include "../input/InputFunctions.h"
50#include "../x3d_parser/Bindable.h"
51#include "../opengl/OpenGL_Utils.h"
52#include "../opengl/Textures.h"
62const char* JS_PROTOCOLS[]={
78void *CScripts_constructor(){
79 void *v = MALLOCV(
sizeof(
struct pCScripts));
83void CScripts_init(
struct tCScripts *t){
86 t->prv = CScripts_constructor();
109 ASSERT(mod!=PKW_inputOutput);
112 ret->fieldDecl=newFieldDecl(mod, type, name,
113 JSparamIndex(lexer_stringUser_fieldName(me,name,mod),FIELDTYPES[type],mod)
115 ASSERT(ret->fieldDecl);
118 ret->ASCIIvalue=NULL;
127 ret->valueSet=(mod!=PKW_initializeOnly);
128 ret->eventInSet = FALSE;
131 #ifdef CPARSERVERBOSE
132 printf (
"newScriptFieldDecl, returning name %s, type %s, mode %s\n",fieldDecl_getShaderScriptName(ret->fieldDecl),
133 stringFieldtypeType( fieldDecl_getType(ret->fieldDecl))
134,PROTOKEYWORDS[ret->fieldDecl->mode]);
147 ret->script = script;
149 #ifdef CPARSERVERBOSE
150 printf(
"creating new scriptfieldinstanceinfo with decl %p script %p\n", dec, script);
160 #ifdef CPARSERVERBOSE
161 printf(
"copying instanceinfo %p (%p %p) to %p\n", me, me->decl, me->script, ret);
167 ret->decl = me->decl;
168 ret->script = me->script;
178 #ifdef CPARSERVERBOSE
179 printf(
"copying script field decl %p to %p\n", me, ret);
183 ret->fieldDecl = fieldDecl_copy(me->fieldDecl);
184 ASSERT(ret->fieldDecl);
186 ret->ASCIIvalue = me->ASCIIvalue;
188 ret->valueSet=(fieldDecl_getAccessType(ret->fieldDecl)!=PKW_initializeOnly);
194 deleteFieldDecl(me->fieldDecl);
206 ASSERT(me->fieldDecl->PKWmode==PKW_initializeOnly || me->fieldDecl->PKWmode==PKW_inputOutput)
211void scriptFieldDecl_setFieldASCIIValue(
struct ScriptFieldDecl *me,
const char *val)
213 me->ASCIIvalue=(
char *)val;
220 return fieldDecl_getAccessType(sfd->fieldDecl);
223 return fieldDecl_getType(sfd->fieldDecl);
227 return fieldDecl_getShaderScriptName(sfd->fieldDecl);
235int Shader_Script_getScriptFieldCount(
struct Shader_Script* script)
237 return script->fields->n;
249 ConsoleMessage (
"call to scriptFieldDecl_getRoutingOffset made with NULL input");
250 return INT_ID_UNDEFINED;
252 return fieldDecl_getShaderScriptIndex(me->fieldDecl);
262 #ifdef CPARSERVERBOSE
263 printf (
"scriptFieldDecl_jsFieldInit mode %d\n",me->fieldDecl->mode);
266 ASSERT(me->valueSet);
267 SaveScriptField(num, fieldDecl_getAccessType(me->fieldDecl),
268 fieldDecl_getType(me->fieldDecl), fieldDecl_getShaderScriptName(me->fieldDecl), me->value);
282int nextScriptHandle (
void) {
286 retval = p->handleCnt;
295 ret = createNewX3DNode(NODE_Script);
296 ret->_parentResource = me->_parentResource;
297 ret->directOutput = me->directOutput;
298 ret->mustEvaluate = me->mustEvaluate;
300 ret->__scriptObj = me->__scriptObj;
306void zeroScriptHandles (
void) {
321 ret->ShaderScriptNode = node;
335 ret = new_Shader_ScriptB(node);
340 if (node->_nodeType == NODE_Script) {
341 ret->num=nextScriptHandle();
342 #ifdef CPARSERVERBOSE
343 printf(
"newScript: created new script nodePtr %u with num %d\n", node, ret->num);
359 for(i=0; i!=vectorSize(me->fields); ++i)
360 deleteScriptFieldDecl(vector_get(
struct ScriptFieldDecl*, me->fields, i));
379 for(i=0; i!=vectorSize(me->fields); ++i) {
381 if(strcmp(name,fieldDecl_getShaderScriptName(curField->fieldDecl)) == 0)
394 for(i=0; i!=vectorSize(me->fields); ++i) {
396 if(scriptFieldDecl_isField(curField, n, mod))
407 #ifdef CPARSERVERBOSE
408 printf (
"script_addField: adding field %u to script %d (pointer %u)\n",field,me->num,me);
416 for(i=0; i!=vectorSize(me->fields); ++i) {
419 printf (
"script_addField, now have field %d of %d, ASCIIname %s:",i,vectorSize(me->fields),fieldDecl_getShaderScriptName(curField->fieldDecl));
429 if (me->ShaderScriptNode != NULL) {
430 if (me->ShaderScriptNode->_nodeType==NODE_Script) scriptFieldDecl_jsFieldInit(field, me->num);
436BOOL script_initCode(
struct Shader_Script* me,
const char* code)
440 SaveScriptText (me->num, (
char *)code);
450static bool script_initCodeFromBLOB(
struct Shader_Script* me,
const char* uri,
char** crv)
459 while ((*uri<=
' ') && (*uri>0)) uri++;
462 for(i=0; i!=ARR_SIZE(JS_PROTOCOLS); ++i)
465 const char* v=JS_PROTOCOLS[i];
467 while(*u && *v && *u==*v)
474 if((!*v && *u==
',') || (!*v && *u==
':')) {
478 return script_initCode(me, u+1);
494 DEBUG_CPARSER(
"script_initCodeFromUri, uri is %s\n", uri);
497 res = resource_create_multi(s);
499 parentres = ((
struct X3D_Script*)(me->ShaderScriptNode))->_parentResource;
501 resource_identify(parentres, res);
504 if (res->type != rest_invalid) {
505 res->status = ress_starts_good;
506 res->media_type = resm_script;
507 res->whereToPlaceData = me;
508 res->actions = resa_download | resa_load | resa_process;
509 resitem_enqueue(ml_new(res));
546 for(i=0; i!=s->n; ++i) {
549 if(script_initCodeFromBLOB(me, s->p[i]->strptr,&mfcrv)) {
555 script_initCodeFromMFUri_download(me, s);
562char *shader_initCodeFromMFUri(
const struct Multi_String* s) {
565 for(i=0; i!=s->n; ++i) {
567 if (s->p[i]->strptr != NULL) {
570 if(script_initCodeFromBLOB(NULL, s->p[i]->strptr,&mfcrv)) {
588int getFieldFromScript(
struct Shader_Script * sp,
char *fieldname,
int *type,
int *kind,
int *iifield,
union anyVrml **value,
int **valueChanged){
597 sfields = sp->fields;
598 for(k=0;k<sfields->n;k++)
603 fdecl = sfield->fieldDecl;
604 fieldName = fieldDecl_getShaderScriptName(fdecl);
605 if(!strcmp(fieldName,fieldname)){
606 *type = fdecl->fieldType;
607 *kind = fdecl->PKWmode;
608 *value = &(sfield->value);
609 *valueChanged = &(sfield->valueChanged);