int tux_material( ClientData cd, Tcl_Interp *ip, int argc, const char *argv[] ) { const char *errmsg; const char *mat_name; scalar_t diffuse[3]; scalar_t specular[3]; double spec_exp; if (5 != argc) { Tcl_AppendResult(ip, argv[0], ": invalid number of arguments\n", "Usage: ", argv[0], " <name> { <ambient colour> } " "{ <specular colour> } <specular exponent", (char *)0 ); return TCL_ERROR; } /* obtain material name */ mat_name = argv[1]; /* obtain diffuse colour */ if (TCL_OK != get_tcl_tuple(ip,argv[2],diffuse,3)) { Tcl_AppendResult(ip, argv[0], ": invalid diffuse colour", (char *)0 ); return TCL_ERROR; } /* obtain specular colour */ if (TCL_OK != get_tcl_tuple(ip,argv[3],specular,3)) { Tcl_AppendResult(ip, argv[0], ": invalid specular colour", (char *)0 ); return TCL_ERROR; } /* obtain specular exponent */ if (TCL_OK != Tcl_GetDouble(ip,argv[4],&spec_exp)) { Tcl_AppendResult(ip, argv[0], ": invalid specular exponent", (char *)0 ); return TCL_ERROR; } errmsg = create_material(mat_name,make_colour_from_array(diffuse), make_colour_from_array(specular), spec_exp); /* report error, if any */ if (errmsg) { Tcl_AppendResult(ip, argv[0], ": ", errmsg, (char *)0 ); return TCL_ERROR; } return TCL_OK; }
int tux_translate( ClientData cd, Tcl_Interp *ip, int argc, const char *argv[] ) { const char *errmsg; const char *nodename; scalar_t vec[3]; if (3 != argc) { Tcl_AppendResult(ip, argv[0], ": invalid number of arguments\n", "Usage: ", argv[0], " <node> { <x> <y> <z> }", (char *)0 ); return TCL_ERROR; } /* obtain the nodename */ nodename = argv[1]; /* obtain the translation vector */ if (TCL_OK != get_tcl_tuple(ip,argv[2],vec,3)) { Tcl_AppendResult(ip, argv[0], ": invalid translation vector", (char *)0 ); return TCL_ERROR; } errmsg = translate_scene_node(nodename,make_vector_from_array(vec)); /* report error, if any */ if (errmsg) { Tcl_AppendResult(ip, argv[0], ": ", errmsg, (char *)0 ); return TCL_ERROR; } return TCL_OK; }
int tux_scale( ClientData cd, Tcl_Interp *ip, int argc, const char *argv[] ) { const char *errmsg; const char *nodename; scalar_t origin[3]; scalar_t factors[3]; if (4 != argc) { Tcl_AppendResult(ip, argv[0], ": invalid number of arguments\n", "Usage: ", argv[0], " <node> { <origin> } " "{ <translation vector> }", (char *)0 ); return TCL_ERROR; } /* obtain the nodename */ nodename = argv[1]; /* obtain the origin point */ if (TCL_OK != get_tcl_tuple(ip,argv[2],origin,3)) { Tcl_AppendResult(ip, argv[0], ": invalid origin point", (char *)0 ); return TCL_ERROR; } /* obtain the scale factors */ if (TCL_OK != get_tcl_tuple(ip,argv[3],factors,3)) { Tcl_AppendResult(ip, argv[0], ": invalid scale factors", (char *)0 ); return TCL_ERROR; } errmsg = scale_scene_node(nodename,make_point_from_array(origin),factors); /* report error, if any */ if (errmsg) { Tcl_AppendResult(ip, argv[0], ": ", errmsg, (char *)0 ); return TCL_ERROR; } return TCL_OK; }
static int fog_cb (ClientData cd, Tcl_Interp *ip, int argc, CONST84 char *argv[]) { double tmp_arr[4]; double tmp_dbl; bool error = false; if (argc < 2) { error = true; } NEXT_ARG; while ( !error && argc > 0 ) { if ( strcmp( "-on", *argv ) == 0 ) { fogPlane.setEnabled(); } else if ( strcmp( "-off", *argv ) == 0 ) { fogPlane.setEnabled(false); } else if ( strcmp( "-mode", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = true; break; } if ( strcmp( "exp", *argv ) == 0 ) { fogPlane.setMode(GL_EXP); } else if ( strcmp( "exp2", *argv ) == 0 ) { fogPlane.setMode(GL_EXP2); } else if ( strcmp( "linear", *argv ) == 0 ) { fogPlane.setMode(GL_LINEAR); } else { print_warning( TCL_WARNING, "tux_fog: mode must be one of " "`exp', `exp2', or `linear'" ); error = true; } } else if ( strcmp( "-density", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = true; break; } if ( Tcl_GetDouble ( ip, *argv, &tmp_dbl ) == TCL_ERROR ) { error = true; break; } fogPlane.setDensity(tmp_dbl); } else if ( strcmp( "-start", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = true; break; } if ( Tcl_GetDouble ( ip, *argv, &tmp_dbl ) == TCL_ERROR ) { error = true; break; } fogPlane.setStart(tmp_dbl); } else if ( strcmp( "-end", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = true; break; } if ( Tcl_GetDouble ( ip, *argv, &tmp_dbl ) == TCL_ERROR ) { error = true; break; } fogPlane.setEnd(tmp_dbl); } else if ( strcmp( "-color", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = true; break; } if ( get_tcl_tuple ( ip, *argv, tmp_arr, 4 ) == TCL_ERROR ) { error = true; break; } copy_to_glfloat_array( fogPlane.getColor(), tmp_arr, 4 ); } else { print_warning( TCL_WARNING, "tux_fog: unrecognized " "parameter `%s'", *argv ); } NEXT_ARG; } if ( error ) { print_warning( TCL_WARNING, "error in call to tux_fog" ); Tcl_AppendResult( ip, "\nUsage: tux_fog [-on|-off] " "[-mode [exp|exp2|linear]] " "[-density <value>] " "[-start <value>] " "[-end <value>] " "[-color { r g b a }] ", (char *) 0 ); return TCL_ERROR; } return TCL_OK; }
static int bind_font_cb (ClientData cd, Tcl_Interp *ip, int argc, char *argv[]) { double tmp_dbl; bool_t error = False; char *binding = NULL; char *fontname = NULL; colour_t colour = white; int size = 30; if (argc < 2) { error = True; } NEXT_ARG; while ( !error && argc > 0 ) { if ( strcmp( "-binding", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = True; break; } binding = *argv; } else if ( strcmp( "-font", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = True; break; } fontname = *argv; } else if ( strcmp( "-size", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = True; break; } if ( Tcl_GetDouble ( ip, *argv, &tmp_dbl ) == TCL_ERROR ) { error = True; break; } size = tmp_dbl; } else if ( strcmp( "-colour", *argv ) == 0 || strcmp( "-color", *argv ) == 0 ) { NEXT_ARG; if ( argc == 0 ) { error = True; break; } if ( get_tcl_tuple( ip, *argv, (scalar_t*)&colour, 4 ) == TCL_ERROR ) { error = True; break; } } else { print_warning( TCL_WARNING, "tux_bind_font: unrecognized " "parameter `%s'", *argv ); } NEXT_ARG; } /* Sanity check on values */ if ( binding == NULL || fontname == NULL || size < 0 ) { error = True; } if ( error ) { print_warning( TCL_WARNING, "error in call to tux_bind_font" ); Tcl_AppendResult( ip, "\nUsage: tux_bind_font -binding <name> -font <name> " "[-size <height>] ", (char *) 0 ); return TCL_ERROR; } if (!bind_font( binding, fontname, size, colour )) { print_warning( TCL_WARNING, "Could not bind font %s", binding ); return TCL_ERROR; } return TCL_OK; }
/*! Creates a race_data_t object from a Tcl string. \return New race_data_t object if successful, or NULL if error \author jfpatry \date Created: 2000-09-19 \date Modified: 2000-09-19 */ static race_data_t* create_race_data ( Tcl_Interp *ip, const char *string, char **err_msg ) { const char **argv = NULL; const char **orig_argv = NULL; int argc = 0; char *course = NULL; char *name = NULL; char *description = NULL; int herring_req[DIFFICULTY_NUM_LEVELS]; bool_t herring_req_init = False; scalar_t time_req[DIFFICULTY_NUM_LEVELS]; bool_t time_req_init = False; int score_req[DIFFICULTY_NUM_LEVELS]; bool_t score_req_init = False; bool_t mirrored = False; race_conditions_t conditions = RACE_CONDITIONS_SUNNY; bool_t windy = False; bool_t snowing = False; race_data_t *race_data = NULL; if ( Tcl_SplitList( ip, string, &argc, &argv ) == TCL_ERROR ) { *err_msg = "race data is not a list"; goto bail_race_data; } orig_argv = argv; while ( *argv != NULL ) { if ( strcmp( *argv, "-course" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -course in race data"; goto bail_race_data; } course = string_copy( *argv ); } else if ( strcmp( *argv, "-name" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -name in race data"; goto bail_race_data; } name = string_copy( *argv ); } else if ( strcmp( *argv, "-description" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -description in race data"; goto bail_race_data; } description = string_copy( *argv ); } else if ( strcmp( *argv, "-herring" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -herring in race data"; goto bail_race_data; } if ( get_tcl_int_tuple( ip, *argv, herring_req, sizeof(herring_req)/sizeof(herring_req[0]) ) == TCL_ERROR ) { *err_msg = "Value for -herring is not a list or has " "the wrong number of elements"; goto bail_race_data; } herring_req_init = True; } else if ( strcmp( *argv, "-time" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -time in race data" ; goto bail_race_data; } if ( get_tcl_tuple( ip, *argv, time_req, sizeof(time_req)/sizeof(time_req[0]) ) == TCL_ERROR ) { *err_msg = "Value for -time is not a list or hsa the " "wrong number of elements"; goto bail_race_data; } time_req_init = True; } else if ( strcmp( *argv, "-score" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -score in race data"; goto bail_race_data; } if ( get_tcl_int_tuple( ip, *argv, score_req, sizeof(score_req)/sizeof(score_req[0]) ) == TCL_ERROR ) { *err_msg = "Value for -score is not a list or has the " "wrong number of elements"; goto bail_race_data; } score_req_init = True; } else if ( strcmp( *argv, "-mirrored" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -mirrored in race data"; goto bail_race_data; } if ( string_cmp_no_case( *argv, "yes" ) == 0 ) { mirrored = True; } else { mirrored = False; } } else if ( strcmp( *argv, "-conditions" ) == 0 ) { int i; NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -conditions in race data"; goto bail_race_data; } for ( i=0; i<RACE_CONDITIONS_NUM_CONDITIONS; i++ ) { if ( string_cmp_no_case( race_condition_names[i], *argv ) == 0 ) { break; } } if ( i == RACE_CONDITIONS_NUM_CONDITIONS ) { *err_msg = "Invalid value for -conditions in race data"; goto bail_race_data; } conditions = (race_conditions_t)i; } else if ( strcmp( *argv, "-windy" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -windy in race data"; goto bail_race_data; } if ( string_cmp_no_case( *argv, "yes" ) == 0 ) { windy = True; } else { windy = False; } } else if ( strcmp( *argv, "-snowing" ) == 0 ) { NEXT_ARG; if ( *argv == NULL ) { *err_msg = "No data supplied for -snowing in race data"; goto bail_race_data; } if ( string_cmp_no_case( *argv, "yes" ) == 0 ) { snowing = True; } else { snowing = False; } } else { sprintf( err_buff, "unrecognized option `%s' in race data", *argv ); *err_msg = err_buff; goto bail_race_data; } NEXT_ARG; } /* Check mandatory arguments */ if ( course == NULL ) { *err_msg = "No course specified in race data"; goto bail_race_data; } if ( !herring_req_init || !time_req_init || !score_req_init ) { *err_msg = "Must specify requirement for herring, time, and score."; goto bail_race_data; } /* Create new race_data_t object */ race_data = (race_data_t*) malloc( sizeof(race_data_t) ); check_assertion( race_data != NULL, "out of memory" ); race_data->course = course; race_data->name = name; race_data->description = description; memcpy( race_data->herring_req, herring_req, sizeof(herring_req) ); memcpy( race_data->time_req, time_req, sizeof(time_req) ); memcpy( race_data->score_req, score_req, sizeof(score_req) ); race_data->mirrored = mirrored; race_data->conditions = conditions; race_data->windy = windy; race_data->snowing = snowing; Tcl_Free( (char*) orig_argv ); return race_data; bail_race_data: if ( orig_argv ) { Tcl_Free( (char*) orig_argv ); } if ( course ) { free( course ); } if ( name ) { free( name ); } if ( description ) { free( description ); } if ( race_data ) { free( race_data ); } return NULL; }