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

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

#include "geom.h"
#include "listP.h"
#include "crayolaP.h"

void *cray_list_HasColor(int sel, Geom *geom, va_list args);
void *cray_list_HasVColor(int sel, Geom *geom, va_list args);
void *cray_list_HasFColor(int sel, Geom *geom, va_list args);

void *cray_list_CanUseVColor(int sel, Geom *geom, va_list args);
void *cray_list_CanUseFColor(int sel, Geom *geom, va_list args);

void *cray_list_UseVColor(int sel, Geom *geom, va_list args);
void *cray_list_UseFColor(int sel, Geom *geom, va_list args);

void *cray_list_EliminateColor(int sel, Geom *geom, va_list args);

void *cray_list_SetColorAll(int sel, Geom *geom, va_list args);
void *cray_list_SetColorAt(int sel, Geom *geom, va_list args);
void *cray_list_SetColorAtV(int sel, Geom *geom, va_list args);
void *cray_list_SetColorAtF(int sel, Geom *geom, va_list args);

void *cray_list_GetColorAt(int sel, Geom *geom, va_list args);
void *cray_list_GetColorAtV(int sel, Geom *geom, va_list args);
void *cray_list_GetColorAtF(int sel, Geom *geom, va_list args);

#define MAX_METHODS 14
static craySpecFunc methods[] = {
  "crayHasColor", cray_list_HasColor,
  "crayHasVColor", cray_list_HasVColor,
  "crayHasFColor", cray_list_HasFColor,
  
  "crayCanUseVColor", cray_list_CanUseVColor,
  "crayCanUseFColor", cray_list_CanUseFColor,
  
  "crayUseVColor", cray_list_UseVColor,
  "crayUseFColor", cray_list_UseFColor,
  
  "crayEliminateColor", cray_list_EliminateColor,
  
  "craySetColorAll", cray_list_SetColorAll,
  "craySetColorAt", cray_list_SetColorAt,
  "craySetColorAtV", cray_list_SetColorAtV,
  "craySetColorAtF", cray_list_SetColorAtF,
  
  "crayGetColorAt", cray_list_GetColorAt,
  "crayGetColorAtV", cray_list_GetColorAtV,
  "crayGetColorAtF", cray_list_GetColorAtF
  };


cray_list_init() {
  crayInitSpec(methods, MAX_METHODS, GeomClassLookup("list"));
  return 0;
}

static Geom *ListElement(Geom *list, int elem) {
  int i;
  List *l = (List *)list;
  
  for (i = 0; i < elem && l != NULL; i++) l = l->cdr;

  if (l == NULL) {
    OOGLError(1, "Unable to retrieve list element %d\n", elem);
    return NULL;
  }

  return l->car;
}

/* 
 * Performs the named function (with its arguements included) on each 
 * element of the list found in the variable geom, then returns the
 * result of all of them |'d together
 */
#define LIST_EACH(list, func) \
{ \
  int val; \
  for (val = 0; list = (Geom*)((List *)(list))->cdr;) \
    val |= (int)func; \
  return (void *)val; \
}

void *cray_list_HasColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayHasColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayHasColor(((List *)geom)->car, NULL));
}

void *cray_list_HasVColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayHasVColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayHasVColor(((List *)geom)->car, NULL));
}

void *cray_list_HasFColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayHasFColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayHasFColor(((List *)geom)->car, NULL));
}

void *cray_list_CanUseVColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayCanUseVColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayCanUseVColor(((List *)geom)->car, NULL));
}

void *cray_list_CanUseFColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayCanUseFColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayCanUseFColor(((List *)geom)->car, NULL));
}

void *cray_list_UseVColor(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayUseVColor(ListElement(geom, *gpath), c, gpath + 1));
  LIST_EACH(geom, crayUseVColor(((List *)geom)->car, c, NULL));
}

void *cray_list_UseFColor(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayUseFColor(ListElement(geom, *gpath), c, gpath + 1));
  LIST_EACH(geom, crayUseFColor(((List *)geom)->car, c, NULL));
}

void *cray_list_EliminateColor(int sel, Geom *geom, va_list args) {
  int *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayEliminateColor(ListElement(geom, *gpath), gpath + 1));
  LIST_EACH(geom, crayEliminateColor(((List *)geom)->car, NULL));
}

void *cray_list_SetColorAll(int sel, Geom *geom, va_list args) {
  List *l = (List *)geom;
  ColorA *c = va_arg(args, ColorA *);
  int *gpath = va_arg(args, int *);

  if (gpath != NULL) 
    return (void *)craySetColorAll(ListElement(geom, *gpath), c, gpath + 1);
  LIST_EACH(geom, craySetColorAll(((List *)geom)->car, c, NULL));
}

void *cray_list_SetColorAt(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int vindex = va_arg(args, int), findex = va_arg(args, int),
  *edge = va_arg(args, int *), *gpath = va_arg(args, int *);
  HPoint3 *pt = va_arg(args, HPoint3 *);
  if (gpath != NULL) 
    return (void *)(craySetColorAt(ListElement(geom, *gpath), c, vindex,
				   findex, edge, gpath + 1, pt));
  LIST_EACH(geom, craySetColorAt(((List *)geom)->car, c, vindex, findex,
				 edge, NULL, pt));
}

void *cray_list_SetColorAtV(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int index = va_arg(args, int), *gpath = va_arg(args, int *);
  HPoint3 *pt = va_arg(args, HPoint3 *);
  if (gpath != NULL) 
    return (void *)(craySetColorAtV(ListElement(geom, *gpath), c, index, 
				    gpath + 1, pt));
  LIST_EACH(geom, craySetColorAtV(((List *)geom)->car, c, index, NULL, pt));
}

void *cray_list_SetColorAtF(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int index = va_arg(args, int), *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(craySetColorAtF(ListElement(geom, *gpath), c, index, 
				    gpath + 1));
  LIST_EACH(geom, craySetColorAtF(((List *)geom)->car, c, index, NULL));
}

void *cray_list_GetColorAt(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int vindex = va_arg(args, int), findex = va_arg(args, int),
  *edge = va_arg(args, int *), *gpath = va_arg(args, int *);
  HPoint3 *pt = va_arg(args, HPoint3 *);
  if (gpath != NULL) 
    return (void *)(crayGetColorAt(ListElement(geom, *gpath), c, vindex, 
				   findex, edge, gpath + 1, pt));
  LIST_EACH(geom, crayGetColorAt(((List *)geom)->car, c, vindex, 
				 findex, edge, NULL, pt));
}

void *cray_list_GetColorAtV(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int index = va_arg(args, int), *gpath = va_arg(args, int *);
  HPoint3 *pt = va_arg(args, HPoint3 *);
  if (gpath != NULL)
      return (void *)(crayGetColorAtV(ListElement(geom, *gpath), c, index, 
				      gpath + 1, pt));
  LIST_EACH(geom, crayGetColorAtV(((List *)geom)->car, c, index, NULL, pt));
}

void *cray_list_GetColorAtF(int sel, Geom *geom, va_list args) {
  ColorA *c = va_arg(args, ColorA *);
  int index = va_arg(args, int), *gpath = va_arg(args, int *);
  if (gpath != NULL) 
    return (void *)(crayGetColorAtF(ListElement(geom, *gpath), c, index, 
				    gpath + 1));
  LIST_EACH(geom, crayGetColorAtF(((List *)geom)->car, c, index, NULL));
}

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