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

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

#include "ooglutil.h"
#include "point3.h"
#include "hpoint3.h"
#include "geom.h"
#include "bezierP.h"
#include "crayolaP.h"

#ifndef FUDGE
#define FUDGE .1
#endif

void *cray_bezier_HasVColor(int sel, Geom *geom, va_list args);
void *cray_bezier_UseVColor(int sel, Geom *geom, va_list args);
void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list args);
void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list args);
void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list args);
void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list args);
void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list args);

#define MAX_METHODS 10

static craySpecFunc methods[] = {
  "crayHasColor", cray_bezier_HasVColor,
  "crayHasVColor", cray_bezier_HasVColor,
  "crayCanUseVColor", crayTrue,
  "crayUseVColor", cray_bezier_UseVColor,
  "crayEliminateColor", cray_bezier_EliminateColor,
  "craySetColorAll", cray_bezier_SetColorAll,
  "craySetColorAt", cray_bezier_SetColorAt,
  "craySetColorAtF", cray_bezier_SetColorAtF,
  "crayGetColorAt", cray_bezier_GetColorAt,
  "crayGetColorAtV", cray_bezier_GetColorAt
  };

cray_bezier_init() {
  crayInitSpec(methods, MAX_METHODS, GeomClassLookup("bezier"));
  return 0;
}

void *cray_bezier_HasVColor(int sel, Geom *geom, va_list args) {
  Bezier *b = (Bezier *)geom;
  return (void *)(b->flag & BEZ_C);
}

void *cray_bezier_UseVColor(int sel, Geom *geom, va_list args) {
  int i;
  Bezier *b = (Bezier *)geom;
  ColorA *def;

  if (crayHasColor(geom, NULL)) return 0;

  def = va_arg(args, ColorA *);
  for (i = 0; i < 4; i++) b->c[i] = *def; 

  b->flag |= BEZ_C;

  return (void *)geom;
}

void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list args) {
  Bezier *b = (Bezier *)geom;

  if (!crayHasColor(geom, NULL)) return NULL;
  b->flag ^= BEZ_C;
  return (void *)geom;
}

void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list args) {
  int i;
  Bezier *b = (Bezier *)geom;
  ColorA *color;

  if (!crayHasColor(geom, NULL)) return NULL;
  color = va_arg(args, ColorA *);
  for (i = 0; i < 4; i++) b->c[i] = *color;
  return (void *)geom;
}

#define prtpt3(pt) fprintf(stderr, "%.3f %.3f %.3f\n", \
			   ((Point3 *)(pt))->x, ((Point3 *)(pt))->y, \
			   ((Point3 *)(pt))->z)
#define prtpt4(pt) fprintf(stderr, "%.3f %.3f %.3f %.3f\n", \
			   ((HPoint3 *)(pt))->x, ((HPoint3 *)(pt))->y, \
			   ((HPoint3 *)(pt))->z, ((HPoint3 *)(pt))->w)

static int WhichCorner(Bezier *b, int vindex, HPoint3 *pt) {
  float close, newclose;
  const Point3 *pt3;
  HPoint3 *pt4;
  int index;

  pt3 = (Point3 *)pt;
  pt4 = pt;

  if (b->dimn != 3 && b->dimn != 4) {
    OOGLError(1, "Bezier patch of unrecognized dimension %d.\n", b->dimn);
    return -1;
  }
  /* Hits on a corner of the mesh are vertex hits.  Other hits are face 
   * hits and color the entire thing */
  close = FUDGE;
  index = -1;
  newclose = b->dimn == 3 ? 
    Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[0])) :
      HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[0]));
  if (newclose < close) {
    index = 0;
    close = newclose;
  }
  newclose = b->dimn == 3 ?
    Pt3Distance(pt3, (Point3 *)(&b->CtrlPnts[b->degree_u * 3])) :
      HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[b->degree_u * 4]));
  if (newclose < close) {
    index = 1;
    close = newclose;
  }
  newclose = b->dimn == 3 ?
    Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) *
						    b->degree_u) * 3])) 
      : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) *
						    b->degree_u) * 4]));
  
  if (newclose < close) {
    index = 2;
    close = newclose;
  }
  newclose = b->dimn == 3 ? 
    Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) *
						    (b->degree_u + 1) - 1)
						   * 3]))
      : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) *
						    (b->degree_u + 1) - 1) 
						   * 4]));
  if (newclose < close) {
    index = 3;
    newclose = close;
  }

  return index;
}

void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list args) {
  Bezier *b = (Bezier *)geom;
  ColorA *color;
  int vindex, index;
  HPoint3 *pt;

  color = va_arg(args, ColorA *);
  vindex = va_arg(args, int);
  va_arg(args, int);			/* findex */
  va_arg(args, int *);			/* edge */
  va_arg(args, int *);			/* gpath */
  pt = va_arg(args, HPoint3 *);

  index = WhichCorner(b, vindex, pt);
  if (index < 0) return (void *)craySetColorAtF(geom, color, 0, NULL);

  b->c[index] = *color;
  return (void *)geom;
}

void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list args) {
  int i;
  Bezier *b = (Bezier *)geom;
  ColorA *color;
  if (!crayHasColor(geom, NULL)) return NULL;
  color = va_arg(args, ColorA *);
  for (i = 0; i < 4; i++) b->c[i] = *color;
  return (void *)geom;
}

void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list args) {
  Bezier *b = (Bezier *)geom;
  ColorA *color;
  int vindex, index;
  HPoint3 *pt;

  if (!crayHasColor(geom, NULL)) return NULL;
  color = va_arg(args, ColorA *);
  vindex = va_arg(args, int);
  va_arg(args, int);                    /* findex */
  va_arg(args, int *);                  /* edge */
  va_arg(args, int *);                  /* gpath */
  pt = va_arg(args, HPoint3 *);

  index = WhichCorner(b, vindex, pt);
  if (index < 0) index = 0;

  *color = b->c[index];
  return (void *)geom;
}

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