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"
62 const char* JS_PROTOCOLS[]={
78 void *CScripts_constructor(){
79 void *v = MALLOCV(
sizeof(
struct pCScripts));
83 void 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])
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)
211 void 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);
235 int 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);
259 void scriptFieldDecl_jsFieldInit(
struct ScriptFieldDecl* me,
int num) {
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);
282 int 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;
306 void 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);
413 #ifdef CPARSERVERBOSE
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);
436 BOOL script_initCode(
struct Shader_Script* me,
const char* code)
440 SaveScriptText (me->num, (
char *)code);
450 static 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);
562 char *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)) {