#include "include.h" #include "globals.h" #include "geom.h" #include "geom_menu.h" #include "disp_menu.h" #include "params.h" int SaveParams(char *file) { FILE *fp; if (!(fp = fopen(file, "w"))) { return 0; } fprintf(fp, "SCHERK-COLLINS SCULPTURE\n"); fprintf(fp, "branches = %d\n", scherk_branches); fprintf(fp, "storeys = %d\n", scherk_storeys); fprintf(fp, "height = %.1f\n", scherk_height); fprintf(fp, "flange = %.1f\n", scherk_flange); fprintf(fp, "thickness = %.2f\n", scherk_thickness); fprintf(fp, "rim_bulge = %.2f\n", scherk_rim_bulge); fprintf(fp, "warp = %.0f\n", scherk_warp); fprintf(fp, "twist = %.0f\n", scherk_twist); fprintf(fp, "azimuth = %.0f\n", scherk_azimuth); fprintf(fp, "texture_tiles = %d\n", scherk_tex_tiles); fprintf(fp, "detail = %d\n", scherk_detail); fprintf(fp, "texture_file = %s\n", gstate.tex_file); fprintf(fp, "texture_on = %d\n", gstate.texmap); fprintf(fp, "environment_map_on = %d\n", gstate.envmap); fprintf(fp, "background_file = %s\n", gstate.bg_file); fprintf(fp, "background_on = %d\n", gstate.bg_on); fprintf(fp, "background_color = %d %d %d\n", gstate.bg_r, gstate.bg_g, gstate.bg_b); fprintf(fp, "face1_color = %d %d %d\n", scherk_mat[SCHERK_FACE1_MATERIAL][R], scherk_mat[SCHERK_FACE1_MATERIAL][G], scherk_mat[SCHERK_FACE1_MATERIAL][B]); fprintf(fp, "face2_color = %d %d %d\n", scherk_mat[SCHERK_FACE2_MATERIAL][R], scherk_mat[SCHERK_FACE2_MATERIAL][G], scherk_mat[SCHERK_FACE2_MATERIAL][B]); fprintf(fp, "rim1_color = %d %d %d\n", scherk_mat[SCHERK_RIM1_MATERIAL][R], scherk_mat[SCHERK_RIM1_MATERIAL][G], scherk_mat[SCHERK_RIM1_MATERIAL][B]); fprintf(fp, "rim2_color = %d %d %d\n", scherk_mat[SCHERK_RIM2_MATERIAL][R], scherk_mat[SCHERK_RIM2_MATERIAL][G], scherk_mat[SCHERK_RIM2_MATERIAL][B]); fprintf(fp, "rim3_color = %d %d %d\n", scherk_mat[SCHERK_RIM3_MATERIAL][R], scherk_mat[SCHERK_RIM3_MATERIAL][G], scherk_mat[SCHERK_RIM3_MATERIAL][B]); fprintf(fp, "auto_rotate_on = %d\n", gstate.auto_rotate); fprintf(fp, "auto_wobble_on = %d\n", gstate.auto_wobble); fprintf(fp, "x_rotation = %.3f\n", gstate.xrot); fprintf(fp, "y_rotation = %.3f\n", gstate.yrot); fprintf(fp, "scale_factor = %.3f\n", gstate.scale_factor); fprintf(fp, "x_translate = %.3f\n", gstate.dx); fprintf(fp, "y_translate = %.3f\n", gstate.dy); fprintf(fp, "modelview_matrix = %.5f %.5f %.5f %.5f\n", cm[0], cm[1], cm[2], cm[3]); fprintf(fp, " %.5f %.5f %.5f %.5f\n", cm[4], cm[5], cm[6], cm[7]); fprintf(fp, " %.5f %.5f %.5f %.5f\n", cm[8], cm[9], cm[10], cm[11]); fprintf(fp, " %.5f %.5f %.5f %.5f\n", cm[12], cm[13], cm[14], cm[15]); if (fclose(fp)) { return -1; } return 1; } int LoadParams(char *file) { FILE *fp; char str[256], s1[256], s2[256]; int i; float f; int r, g, b; float f1, f2, f3, f4; if (!(fp = fopen(file, "r"))) { return 0; } // header fgets(str, 255, fp); if (sscanf(str, "%s %s", s1, s2) != 2 || strcmp(s1, "SCHERK-COLLINS") || strcmp(s2, "SCULPTURE")) { fclose(fp); return -1; } // scherk geometry fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "branches")) { fclose(fp); return -1; } scherk_branches = i; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "storeys")) { fclose(fp); return -1; } scherk_storeys = i; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "height")) { fclose(fp); return -1; } scherk_height = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "flange")) { fclose(fp); return -1; } scherk_flange = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "thickness")) { fclose(fp); return -1; } scherk_thickness = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "rim_bulge")) { fclose(fp); return -1; } scherk_rim_bulge = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "warp")) { fclose(fp); return -1; } scherk_warp = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "twist")) { fclose(fp); return -1; } scherk_twist = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "azimuth")) { fclose(fp); return -1; } scherk_azimuth = f; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "texture_tiles")) { fclose(fp); return -1; } scherk_tex_tiles = i; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "detail")) { fclose(fp); return -1; } scherk_detail = i; // texture, background, material colors fgets(str,255, fp); if (sscanf(str, "%s = %s", s1, s2) != 2 || strcmp(s1, "texture_file")) { fclose(fp); return -1; } delete[] gstate.tex_file; gstate.tex_file = new char[strlen(s2) + 1]; strcpy(gstate.tex_file, s2); fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "texture_on")) { fclose(fp); return -1; } gstate.texmap = i; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i)!=2 || strcmp(s1, "environment_map_on")) { fclose(fp); return -1; } gstate.envmap = i; fgets(str,255, fp); if (sscanf(str, "%s = %s", s1, s2) != 2 || strcmp(s1, "background_file")) { fclose(fp); return -1; } delete[] gstate.bg_file; gstate.bg_file = new char[strlen(s2) + 1]; strcpy(gstate.bg_file, s2); fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "background_on")) { fclose(fp); return -1; } gstate.bg_on = i; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "background_color")) { fclose(fp); return -1; } gstate.bg_r = r; gstate.bg_g = g; gstate.bg_b = b; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "face1_color")) { fclose(fp); return -1; } scherk_mat[SCHERK_FACE1_MATERIAL][R] = r; scherk_mat[SCHERK_FACE1_MATERIAL][G] = g; scherk_mat[SCHERK_FACE1_MATERIAL][B] = b; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "face2_color")) { fclose(fp); return -1; } scherk_mat[SCHERK_FACE2_MATERIAL][R] = r; scherk_mat[SCHERK_FACE2_MATERIAL][G] = g; scherk_mat[SCHERK_FACE2_MATERIAL][B] = b; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "rim1_color")) { fclose(fp); return -1; } scherk_mat[SCHERK_RIM1_MATERIAL][R] = r; scherk_mat[SCHERK_RIM1_MATERIAL][G] = g; scherk_mat[SCHERK_RIM1_MATERIAL][B] = b; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "rim2_color")) { fclose(fp); return -1; } scherk_mat[SCHERK_RIM2_MATERIAL][R] = r; scherk_mat[SCHERK_RIM2_MATERIAL][G] = g; scherk_mat[SCHERK_RIM2_MATERIAL][B] = b; fgets(str,255, fp); if (sscanf(str, "%s = %d %d %d", s1, &r, &g, &b) != 4 || strcmp(s1, "rim3_color")) { fclose(fp); return -1; } scherk_mat[SCHERK_RIM3_MATERIAL][R] = r; scherk_mat[SCHERK_RIM3_MATERIAL][G] = g; scherk_mat[SCHERK_RIM3_MATERIAL][B] = b; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "auto_rotate_on")) { fclose(fp); return -1; } gstate.auto_rotate = i; fgets(str,255, fp); if (sscanf(str, "%s = %d", s1, &i) != 2 || strcmp(s1, "auto_wobble_on")) { fclose(fp); return -1; } gstate.auto_wobble = i; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "x_rotation")) { fclose(fp); return -1; } gstate.xrot = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "y_rotation")) { fclose(fp); return -1; } gstate.yrot = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "scale_factor")) { fclose(fp); return -1; } gstate.scale_factor = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "x_translate")) { fclose(fp); return -1; } gstate.dx = f; fgets(str,255, fp); if (sscanf(str, "%s = %f", s1, &f) != 2 || strcmp(s1, "y_translate")) { fclose(fp); return -1; } gstate.dy = f; fgets(str,255, fp); if (sscanf(str, "%s = %f %f %f %f", s1, &f1, &f2, &f3, &f4) != 5 || strcmp(s1, "modelview_matrix")) { fclose(fp); return -1; } cm[0] = f1; cm[1] = f2; cm[2] = f3; cm[3] = f4; fgets(str,255, fp); if (sscanf(str, "%f %f %f %f", &f1, &f2, &f3, &f4) != 4) { fclose(fp); return -1; } cm[4] = f1; cm[5] = f2; cm[6] = f3; cm[7] = f4; fgets(str,255, fp); if (sscanf(str, "%f %f %f %f", &f1, &f2, &f3, &f4) != 4) { fclose(fp); return -1; } cm[8] = f1; cm[9] = f2; cm[10] = f3; cm[11] = f4; fgets(str,255, fp); if (sscanf(str, "%f %f %f %f", &f1, &f2, &f3, &f4) != 4) { fclose(fp); return -1; } cm[12] = f1; cm[13] = f2; cm[14] = f3; cm[15] = f4; if (fclose(fp)) { return 0; } return 1; } void ProccessParams(struct Togl *togl) { Tcl_Interp *interp = Togl_Interp(togl); char str[256]; int i; sprintf(str, "%d", scherk_branches); Tcl_SetVar(interp, "scherk_branches", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", scherk_storeys); Tcl_SetVar(interp, "scherk_storeys", str, TCL_GLOBAL_ONLY); sprintf(str, "%.1f", scherk_height); Tcl_SetVar(interp, "scherk_height", str, TCL_GLOBAL_ONLY); sprintf(str, "%.1f", scherk_flange); Tcl_SetVar(interp, "scherk_flange", str, TCL_GLOBAL_ONLY); sprintf(str, "%.2f", scherk_thickness); Tcl_SetVar(interp, "scherk_thickness", str, TCL_GLOBAL_ONLY); sprintf(str, "%.2f", scherk_rim_bulge); Tcl_SetVar(interp, "scherk_rim_bulge", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", (int)scherk_azimuth); Tcl_SetVar(interp, "scherk_azimuth", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", (int)scherk_twist); Tcl_SetVar(interp, "scherk_twist", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", (int)scherk_warp); Tcl_SetVar(interp, "scherk_warp", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", scherk_tex_tiles); Tcl_SetVar(interp, "scherk_tex_tiles", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", scherk_detail); Tcl_SetVar(interp, "scherk_detail", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", gstate.texmap); Tcl_SetVar(interp, "tex_map", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", gstate.envmap); Tcl_SetVar(interp, "env_map", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", gstate.bg_on); Tcl_SetVar(interp, "background", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", gstate.auto_rotate); Tcl_SetVar(interp, "rotate", str, TCL_GLOBAL_ONLY); sprintf(str, "%d", gstate.auto_wobble); Tcl_SetVar(interp, "wobble", str, TCL_GLOBAL_ONLY); for (i=SCHERK_FIRST_MATERIAL; i