ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/lib/pointlist/ptlBezier.c

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

#include "ooglutil.h"
#include "geom.h"
#include "bezierP.h"
#include "pointlistP.h"

void *bezier_PointList_get(int sel, Geom *geom, va_list args);
void *bezier_PointList_fillin(int sel, Geom *geom, va_list args);
void *bezier_PointList_set(int sel, Geom *geom, va_list args);
void *bezier_PointList_length(int sel, Geom *geom, va_list args);

#define MAX_METHODS 4

static SpecFunc methods[] = {
  "PointList_get", bezier_PointList_get,
  "PointList_fillin", bezier_PointList_fillin,
  "PointList_set", bezier_PointList_set,
  "PointList_length", bezier_PointList_length
  };

static char msg[] = "ptlBezier.c";

ptlBezier_init() {
  pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("bezier"));
}

void *bezier_PointList_get(int sel, Geom *geom, va_list args) {
  HPoint3 *pt;
  float **t;
  int n_points;
  Bezier *b = (Bezier *)geom;

  t = va_arg(args, float **);

  n_points = (int)GeomCall(GeomMethodSel("PointList_length"), geom);
  pt = OOGLNewNE(HPoint3, n_points, msg);

  return (GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt));

}

void *bezier_PointList_fillin(int sel, Geom *geom, va_list args) {
  int i;
  float **t;
  HPoint3 *pt;
  Bezier *b = (Bezier *)geom;

  t = va_arg(args, float **);
  va_arg(args, int);      
  pt = va_arg(args, HPoint3 *);

  if (b->CtrlPnts != NULL)
    if (b->dimn == 3) 
      for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++)
	HPt3From(&pt[i], b->CtrlPnts[i*3], b->CtrlPnts[i*3 + 1], 
		 b->CtrlPnts[i*3 + 2], 1.0);
    else if (b->dimn == 4)
      for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++)
	HPt3From(&pt[i], b->CtrlPnts[i*4], b->CtrlPnts[i*4 + 1],
		 b->CtrlPnts[i*4 + 2], b->CtrlPnts[i*4 + 3]);
    else {
      OOGLError(1, "Bezier patch of unfamiliar dimensions.");
      OOGLFree(pt);
      return NULL;
    }

#ifdef DONT_DO_THIS
  if (b->flag & BEZ_ST) {
    HPt3From(&pt[i], b->STCords[0], b->STCords[1], b->STCords[2], 
	     b->STCords[3]);
    HPt3From(&pt[i+1], b->STCords[4], b->STCords[5], b->STCords[6],
	     b->STCords[7]);
  }
#endif /*DONT_DO_THIS*/

  HPt3TransformN(t, pt, pt, i+1);

  return pt;
}


void *bezier_PointList_set(int sel, Geom *geom, va_list args) {
  int i;
  HPoint3 *pt;
  Bezier *b = (Bezier *)geom;

  va_arg(args, int);
  pt = va_arg(args, HPoint3 *);
  i = 0;
  if (b->CtrlPnts != NULL) 
    if (b->dimn == 3) 
      for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) {
	b->CtrlPnts[i*3] = pt[i].x;
	b->CtrlPnts[i*3 + 1] = pt[i].y;
	b->CtrlPnts[i*3 + 2] = pt[i].z;
      }
    else if (b->dimn == 4) 
      for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) {
	b->CtrlPnts[i*4] = pt[i].x;
	b->CtrlPnts[i*4 + 1] = pt[i].y;
	b->CtrlPnts[i*4 + 2] = pt[i].z;
	b->CtrlPnts[i*4 + 3] = pt[i].w;
      }
    else {
      OOGLError(1, "Bezier patch of unfamiliar dimension.");
      return NULL;
    }

#ifdef DONT_DO_THIS
  if (b->flag & BEZ_ST) {
    b->STCords[0] = pt[i].x;
    b->STCords[1] = pt[i].y;
    b->STCords[2] = pt[i].z;
    b->STCords[3] = pt[i++].w;
    b->STCords[4] = pt[i].x;
    b->STCords[5] = pt[i].y;
    b->STCords[6] = pt[i].z;
    b->STCords[7] = pt[i].w;
  }
#endif /*DONT_DO_THIS*/

  GeomDelete((Geom *)b->mesh);
  b->mesh = NULL;

  return geom;
}

void *bezier_PointList_length(int sel, Geom *geom, va_list args) {
  Bezier *b = (Bezier *)geom;
  return ((void *)((b->degree_u + 1) * (b->degree_v + 1)
#ifdef DONT_DO_THIS
	+ (b->flag & BEZ_ST ? 2 : 0)
#endif 
	));
}

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