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

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

/* (picked "name" (gx gy gz) (vx vy vz) (x1 y1 z1 x2 y2 z2)) */

#include <stdio.h>
#include "lisp.h"
#include "pickfunc.h"
#include "3d.h"
#include "handleP.h"
#include "ooglutil.h"

void deflittlebox(FILE *fp, float size);
void norm(FILE *fp);

int verbose = 0;

handle_pick(FILE *fp, int picked, HPoint3 *gotten,
	    int vert, HPoint3 *v, int edge, HPoint3 e[])
{
  static int first = 1;
  HPoint3 got, e0, e1;

  HPt3Normalize(&e[0], &e0);
  HPt3Normalize(&e[1], &e1);
  HPt3Normalize(gotten, &got);
  fprintf(fp, "(progn\n");
  if (!picked) {
    fprintf(fp,"(geometry \"pick\" { LIST } )\n");
  } else {
    fprintf(fp,"(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
	got.x, got.y, got.z);
    fprintf(fp,"(geometry \"pick\"\n");
    if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n");
    else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n");
    fprintf(fp, "  { LIST { :littlebox }\n");

    if (edge && !vert) {
	e0.x -= got.x; e0.y -= got.y; e0.z -= got.z;
	e1.x -= got.x; e1.y -= got.y; e1.z -= got.z;
	fprintf(fp,"{ appearance { material { diffuse 0 1 1 } }\n\
  LIST\n\
   { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
   { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
   { VECT\n\
	  1 2 1\n\
	  2\n\
	  1\n\
	  %f %f %f\n\
	  %f %f %f\n\
	  1 1 0 1\n\
   }\n\
  }\n",
	     e0.x, e0.y, e0.z,
	     e1.x, e1.y, e1.z,
	     e0.x, e0.y, e0.z,
	     e1.x, e1.y, e1.z);
    }
    fprintf(fp,"    }\n  }\n)\n");
  }
  if (first) {
    fprintf(fp, "(pickable \"pick\" no)\n");
    first = 0;
  }
  fprintf(fp, ")\n");
  fflush(fp);
}

DEFPICKFUNC("(pick COORDSYS GEOMID G V E F P VI EI FI)",
	    coordsys,
	    id,
	    point, pn,
	    vertex, vn,
	    edge, en,
	    face, fn, 10,
	    ppath, ppn, 50,
	    vi,
	    ei, ein,
	    fi,
{	    
  int picked = pn > 0;
  handle_pick(stdout, picked, &point, vn>0, &vertex, en>0, edge);
  if (verbose)
    handle_pick(stderr, picked, &point, vn>0, &vertex, en>0, edge);
  return Lt;
})


init()
{
  LInit();
  LDefun("pick", Lpick, Hpick);
}

pickability(FILE *fp)
{
  fprintf(fp, "(interest (pick world * * * * nil nil nil nil nil))\n");
  fflush(fp);
}

main()
{
  Lake *lake;
  LObject *lit, *val;
  extern char *getenv();

  verbose = (getenv("VERBOSE_NOSE") != NULL);

  fprintf(stdout, "(progn\n");
  init();
  deflittlebox(stdout, 0.04);
  if (verbose) deflittlebox(stderr, 0.04);

  pickability(stdout);
  if (verbose) pickability(stderr);

  norm(stdout);
  if (verbose) norm(stderr);

  fprintf(stdout, ")\n");
  fflush(stdout);

  lake = LakeDefine(stdin, stdout, NULL);
  while (!feof(stdin)) {
    lit = LSexpr(lake);
    val = LEval(lit);
    LFree(lit);
    LFree(val);
  }
}

void
norm(FILE *fp)
{
  fprintf(fp, "(geometry \"pick\" { LIST } )\n");
  fprintf(fp, "(normalization \"pick\" none)\n");
  fprintf(fp, "(bbox-draw \"pick\" off)\n");
  fflush(fp);
}


void
deflittlebox(FILE *fp, float size)
{
  fprintf(fp,"\
  (read geometry { define littlebox {\n\
	INST\n\
	  transform %f 0 0 0\n\
		    0 %f 0 0\n\
		    0 0 %f 0\n\
		    0 0 0  1\n\
	  geom\n\
	  OFF\n\
	  8 6 12\n\
\n\
	  -.5 -.5 -.5	# 0   \n\
	   .5 -.5 -.5	# 1   \n\
	   .5  .5 -.5	# 2   \n\
	  -.5  .5 -.5	# 3   \n\
	  -.5 -.5  .5	# 4   \n\
	   .5 -.5  .5	# 5   \n\
	   .5  .5  .5	# 6   \n\
	  -.5  .5  .5	# 7   \n\
\n\
	  4 0 1 2 3\n\
	  4 4 5 6 7\n\
	  4 2 3 7 6\n\
	  4 0 1 5 4\n\
	  4 0 4 7 3\n\
	  4 1 2 6 5\n\
	  }})\n", size, size, size);
}

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