/*activate all routes in the order they where triggered*/ GF_EXPORT void gf_sg_activate_routes(GF_SceneGraph *sg) { GF_Route *r; GF_Node *targ; if (!sg) return; sg->simulation_tick++; while (gf_list_count(sg->routes_to_activate)) { r = (GF_Route *)gf_list_get(sg->routes_to_activate, 0); gf_list_rem(sg->routes_to_activate, 0); if (r) { targ = r->ToNode; if (gf_sg_route_activate(r)) { #ifdef GF_SELF_REPLACE_ENABLE if (sg->graph_has_been_reset) { sg->graph_has_been_reset = 0; return; } #endif if (r->is_setup) gf_node_changed(targ, &r->ToField); } } } gf_sg_destroy_routes(sg); }
static void SetValuatorOutput(M_Valuator *p, SFVec4f *inSFField, GenMFField *inMFField, u32 inType) { char str[500]; u32 i, j; GF_Route *r; SFVec4f output, sf_out; MFVec4f *mf_output = (MFVec4f *)gf_node_get_private((GF_Node*)p); u32 count, num_out; Bool do_sum; output.x = output.y = output.z = output.q = 0; sf_out.x = sf_out.y = sf_out.z = sf_out.q = 0; if (!p->sgprivate->interact || !mf_output) return; do_sum = p->Sum; num_out = 1; if (!inMFField) { count = 1; output.x = gf_mulfix(p->Factor1, inSFField->x) + p->Offset1; output.y = gf_mulfix(p->Factor2, inSFField->y) + p->Offset2; output.z = gf_mulfix(p->Factor3, inSFField->z) + p->Offset3; output.q = gf_mulfix(p->Factor4, inSFField->q) + p->Offset4; if (do_sum) { output.x = output.x + output.y + output.z + output.q; output.y = output.z = output.q = output.x; do_sum = 0; } switch (inType) { case GF_SG_VRML_SFVEC2F: num_out = 2; break; case GF_SG_VRML_SFVEC3F: case GF_SG_VRML_SFCOLOR: num_out = 3; break; case GF_SG_VRML_SFVEC4F: case GF_SG_VRML_SFROTATION: num_out = 4; break; } } else { count = inMFField->count; } /*allocate temp buffer and compute values*/ gf_sg_vrml_mf_alloc(mf_output, GF_SG_VRML_MFVEC4F, count); for (i=0; i<count; i++) { if (inType) { valuator_get_output(p, inMFField, inType, do_sum, i, &output, &num_out); mf_output->vals[i] = output; } else if (!i) { mf_output->vals[0] = output; } if (!i) sf_out = output; } gf_sg_vrml_mf_alloc(&p->outMFColor, GF_SG_VRML_MFCOLOR, count); gf_sg_vrml_mf_alloc(&p->outMFFloat, GF_SG_VRML_MFFLOAT, count); gf_sg_vrml_mf_alloc(&p->outMFInt32, GF_SG_VRML_MFINT32, count); gf_sg_vrml_mf_alloc(&p->outMFRotation, GF_SG_VRML_MFROTATION, count); gf_sg_vrml_mf_alloc(&p->outMFString, GF_SG_VRML_MFSTRING, count); gf_sg_vrml_mf_alloc(&p->outMFVec2f, GF_SG_VRML_MFVEC2F, count); gf_sg_vrml_mf_alloc(&p->outMFVec3f, GF_SG_VRML_MFVEC3F, count); /*valuator is a special case, all routes are triggered*/ j=0; while ((r = (GF_Route*)gf_list_enum(p->sgprivate->interact->routes, &j))) { if (r->FromNode != (GF_Node *)p) continue; if (!r->is_setup) gf_sg_route_setup(r); if (r->FromField.eventType != GF_SG_EVENT_OUT) continue; /*TODO we could optimize more and check if the field has been set or not ...*/ switch (r->FromField.fieldType) { case GF_SG_VRML_SFBOOL: p->outSFBool = (Bool) (sf_out.x ? 1 : 0); break; case GF_SG_VRML_SFFLOAT: p->outSFFloat = sf_out.x; break; case GF_SG_VRML_SFINT32: p->outSFInt32 = FIX2INT(sf_out.x); break; case GF_SG_VRML_SFTIME: p->outSFTime = (SFTime) FIX2FLT(sf_out.x); break; case GF_SG_VRML_SFROTATION: p->outSFRotation.x = sf_out.x; p->outSFRotation.y = sf_out.y; p->outSFRotation.z = sf_out.z; p->outSFRotation.q = sf_out.q; break; case GF_SG_VRML_SFCOLOR: p->outSFColor.red = sf_out.x; p->outSFColor.green = sf_out.y; p->outSFColor.blue = sf_out.z; break; case GF_SG_VRML_SFVEC2F: p->outSFVec2f.x = sf_out.x; p->outSFVec2f.y = sf_out.y; break; case GF_SG_VRML_SFVEC3F: p->outSFVec3f.x = sf_out.x; p->outSFVec3f.y = sf_out.y; p->outSFVec3f.z = sf_out.z; break; case GF_SG_VRML_SFSTRING: if (num_out==1) { if (inType==GF_SG_VRML_SFTIME) { format_sftime_string(output.x, str); } else { sprintf(str, "%.6f", FIX2FLT(sf_out.x)); } } else if (num_out==2) { sprintf(str, "%.4f %.4f", FIX2FLT(sf_out.x), FIX2FLT(sf_out.y)); } else if (num_out==3) { sprintf(str, "%.3f %.3f %.3f", FIX2FLT(sf_out.x), FIX2FLT(sf_out.y), FIX2FLT(sf_out.z)); } else if (num_out==4) { sprintf(str, "%.2f %.2f %.2f %.2f", FIX2FLT(sf_out.x), FIX2FLT(sf_out.y), FIX2FLT(sf_out.z), FIX2FLT(sf_out.q)); } if (p->outSFString.buffer ) gf_free(p->outSFString.buffer); p->outSFString.buffer = gf_strdup(str); break; case GF_SG_VRML_MFFLOAT: gf_sg_vrml_mf_alloc(&p->outMFFloat, GF_SG_VRML_MFFLOAT, count); for (i=0; i<count; i++) p->outMFFloat.vals[i] = mf_output->vals[i].x; break; case GF_SG_VRML_MFINT32: gf_sg_vrml_mf_alloc(&p->outMFInt32, GF_SG_VRML_MFINT32, count); for (i=0; i<count; i++) p->outMFInt32.vals[i] = FIX2INT(mf_output->vals[i].x); break; case GF_SG_VRML_MFCOLOR: gf_sg_vrml_mf_alloc(&p->outMFColor, GF_SG_VRML_MFCOLOR, count); for (i=0; i<count; i++) { p->outMFColor.vals[i].red = mf_output->vals[i].x; p->outMFColor.vals[i].green = mf_output->vals[i].y; p->outMFColor.vals[i].blue = mf_output->vals[i].z; } break; case GF_SG_VRML_MFVEC2F: gf_sg_vrml_mf_alloc(&p->outMFVec2f, GF_SG_VRML_MFVEC2F, count); for (i=0; i<count; i++) { p->outMFVec2f.vals[i].x = mf_output->vals[i].x; p->outMFVec2f.vals[i].y = mf_output->vals[i].y; } break; case GF_SG_VRML_MFVEC3F: gf_sg_vrml_mf_alloc(&p->outMFVec3f, GF_SG_VRML_MFVEC3F, count); for (i=0; i<count; i++) { p->outMFVec3f.vals[i].x = mf_output->vals[i].x; p->outMFVec3f.vals[i].y = mf_output->vals[i].y; p->outMFVec3f.vals[i].z = mf_output->vals[i].z; } break; case GF_SG_VRML_MFROTATION: gf_sg_vrml_mf_alloc(&p->outMFRotation, GF_SG_VRML_MFROTATION, count); for (i=0; i<count; i++) { p->outMFRotation.vals[i].x = mf_output->vals[i].x; p->outMFRotation.vals[i].y = mf_output->vals[i].y; p->outMFRotation.vals[i].z = mf_output->vals[i].z; p->outMFRotation.vals[i].q = mf_output->vals[i].q; } break; case GF_SG_VRML_MFSTRING: gf_sg_vrml_mf_alloc(&p->outMFString, GF_SG_VRML_MFSTRING, count); gf_sg_vrml_mf_alloc(&p->outMFVec2f, GF_SG_VRML_MFVEC2F, count); for (i=0; i<count; i++) { if (num_out==1) { if (inType==GF_SG_VRML_SFTIME) { format_sftime_string(mf_output->vals[i].x, str); } else { sprintf(str, "%g", FIX2FLT(mf_output->vals[i].x)); } } else if (num_out==2) { sprintf(str, "%g %g", FIX2FLT(mf_output->vals[i].x), FIX2FLT(mf_output->vals[i].y)); } else if (num_out==3) { sprintf(str, "%g %g %g", FIX2FLT(mf_output->vals[i].x), FIX2FLT(mf_output->vals[i].y), FIX2FLT(mf_output->vals[i].z)); } else if (num_out==4) { sprintf(str, "%g %g %g %g", FIX2FLT(mf_output->vals[i].x), FIX2FLT(mf_output->vals[i].y), FIX2FLT(mf_output->vals[i].z), FIX2FLT(mf_output->vals[i].q)); } if (p->outMFString.vals[i]) gf_free(p->outMFString.vals[i]); p->outMFString.vals[i] = gf_strdup(str); } break; } if (r->IS_route) { gf_sg_route_activate(r); } else { gf_sg_route_queue(p->sgprivate->scenegraph, r); } } }