コード例 #1
0
/*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);
}
コード例 #2
0
ファイル: mpeg4_valuator.c プロジェクト: erelh/gpac
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);
		}
	}
}