Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
/*!
 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;
}