ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/bin/flythrough/main.c

This is main.c in view mode; [Download] [Up]

#include <stdlib.h>
#include <stdio.h>
#include "forms.h"

#define LOOP 	0
#define QUARTER	1
#define DIRECT	2
#define EQUI	3	

#define EUC 0
#define HYP 1

float dodecscale;
char path[24];
FILE *f;
int go;
int speed;
int whichpath;
int helpwinid = 0;
int mainwinid = 0;

#include "panel.c"

char flyhelpstr[] =
#include "flyhelp.h"
;

static char *getline(char *s);

init()
{

  foreground();
  create_the_forms();

  printf("(progn \n");
  printf("(geometry notknot.vect { INST transforms : tile geom {");
  printf("    INST geom < dodec.vect transform : scale}})\n");
  printf(" (space hyperbolic) (bbox-draw allgeoms off)\n");
  printf(" (backcolor c0 0 0 0)\n");
  printf(" (merge camera c0 {fov 100})\n");
  printf(" (merge-ap notknot.vect {linewidth 2})\n");
  printf(" (load-path (. $GEOMDATA $GEOMDATA/geom $GEOMDATA/groups))\n");
  printf(" (echo 'caughtup\n')\n");
  printf(")\n");
  fflush(stdout);

  go = 1;
  fl_set_button(Go, 1);
  dodecscale = .99;  		/* scale dodecahedron */
  fl_set_slider_bounds(DodecScale, 0.01, 1.0);
  fl_set_slider_value(DodecScale, dodecscale); 
  ScaleProc(DodecScale, dodecscale);
  speed = 2;			/* speed */
  fl_set_button(Speed2, 1); 
  SpeedProc(Speed2,2);
  fl_set_button(Loop, 1); 	/* path */
  PathProc(Loop, LOOP);
  fl_set_button(Level2, 1); 	/* tile depth */
  TilingProc(Level2, 2);

  fl_set_form_position(MainForm,8,8);
  mainwinid = fl_show_form(MainForm, FL_PLACE_POSITION, TRUE, "Flythrough");
}

void TilingProc(FL_OBJECT *obj, long val) 
{
  printf("(read geometry {define tile { < br4.%1d.tlist}})\n",val);
  fflush(stdout);
}

void SpeedProc(FL_OBJECT *obj, long val) 
{
  speed = val;
  PathProc(NULL, whichpath);
}

void GoProc(FL_OBJECT *obj, long val) 
{
  go = val;
}

void ScaleProc(FL_OBJECT *obj, long val)
{
  float scale = fl_get_slider_value(obj);
  printf("(read transform {define scale {1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 %f}})\n", 1.0/scale);
  fflush(stdout);
}


void PathProc(FL_OBJECT *obj, long val)
{
  char *first;
  char *name;

  whichpath = val;

  switch(whichpath) {
  case LOOP: 
    first = "loop"; break; 
  case QUARTER:
    first = "quart"; break;
  case DIRECT:
    first = "dir"; break;
  case EQUI:
    first = "equi"; break;
  }
  
  fclose(f);  
  /* GEOMDATA environment variable is supposed to be set by geomview. 
     We'll assume it's correct and just whine if we can't find anything.
     Note the setenv hint for the user.
   */
  if ((name = getenv("GEOMDATA")) == NULL) 
    sprintf(path,"%s.%1d.gv", first, speed);
  else 
    sprintf(path,"%s/groups/%s.%1d.gv", name, first, speed);
  f = fopen(path, "r");
  if (!f) {
    fprintf(stderr, "Can't find path file %s.\nTry setting environment variable GEOMDATA.\n", path);
    exit(0);
  } else 
    rewind(f);

  /* Just in case someone recentered the camera and the fov got reset to 40 */
  printf(" (merge camera c0 {fov 100})\n");
  fflush(stdout);
}



void InfoProc(FL_OBJECT *obj, long val) 
{
  FILE *hf = fopen("flyhelp", "r");
  int winid;
  char gvstr[256];

  if (hf == NULL) {
    char *line, *delims = "\n";
    line = getline(flyhelpstr);
    while (line) {
      fl_add_browser_line( HelpBrowser, line );
      line = getline(NULL);
    }
    fl_set_browser_topline( HelpBrowser, 1 );
  } else {
    fl_load_browser(HelpBrowser, "flyhelp");
  }
  fclose(hf);
  fl_set_button(Info, 1);
  fl_set_button(EucDiag, 1);
  fl_set_button(HypDiag, 0);
  fl_set_form_position(HelpForm,8, 393);
  helpwinid = fl_show_form(HelpForm, FL_PLACE_POSITION, TRUE, "Flythrough Help");
  if (helpwinid) winset(helpwinid);
  winpop();
  winset(mainwinid);
  /* OK, so this is probably not the most elegant way to do this.
     It does work though...
   */
  sprintf(gvstr,"rm -f /tmp/flythrough; /etc/mknod /tmp/flythrough p; geomview -c '(progn (ui-panel main 0) (ui-panel tools 0) (window default { size 200 200 position 559 758 535 734 }))' -c /tmp/flythrough flythrough_diagram.gv &");
  system(gvstr);
}

void DiagProc(FL_OBJECT *obj, long val) 
{
  char str[128];
  sprintf(str, "echo '(space %s)' > /tmp/flythrough", 
	  (val == EUC) ? "euclidean" : "hyperbolic");
  system(str);
}

void DoneProc(FL_OBJECT *obj, long val) 
{
  if (helpwinid) fl_hide_form(HelpForm);
  helpwinid = 0;
  system("echo '(exit)\n' > /tmp/flythrough");
  fl_set_button(Info, 0);
}

void QuitProc(FL_OBJECT *obj, long val) 
{
  DoneProc(NULL, NULL);
  exit(0);
}

main(int argc, char *argv[])
{
  char line[80];
  char *more, *caughtup;
  int i, turbo;

  init();
  while (--argc > 0) {
    if (argv[1][0] == '-' && argv[1][1] == 't')
      turbo = 1;
    else if (argv[1][0] == '-' && argv[1][1] == 'h')
      InfoProc(NULL, NULL);
    argv++;
  }
  while (1) {
    fl_check_forms();
    if (go)
      if (turbo || (caughtup = fgets(line, 10, stdin))) {
      /* a command is exactly 18 lines long due to the vagaries of
	 Mathematica... */
      for (i = 0; i < 18; i++) {
	if (! (more = fgets(line, 80, f))) {
	  rewind(f);
	  break;
	} else {
	  fputs(line, stdout);
	}
      }
      if (!turbo) printf("(echo 'caughtup\n')\n");
      fflush(stdout);
    }
  }
}

/* Stolen from Mark Phillips' Hinge module */
static char *getline(char *s)
{
  static char *p;
  char *first;

  if (s != NULL) {
    p = s;
  } else {
    *p = '\n';
  }
  ++p;
  first = p;
  while (*p != '\n' && *p != '\0') ++p;
  if (*p == '\n') {
    *p = '\0';
    return first;
  }
  return NULL;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.