This is ptlInst.c in view mode; [Download] [Up]
#include "ooglutil.h"
#include "geom.h"
#include "instP.h"
#include "pointlistP.h"
void *inst_PointList_get(int sel, Geom *geom, va_list args);
void *inst_PointList_fillin(int sel, Geom *geom, va_list args);
void *inst_PointList_set(int sel, Geom *geom, va_list args);
void *inst_PointList_length(int sel, Geom *geom, va_list args);
#define MAX_METHODS 4
static SpecFunc methods[] = {
"PointList_get", inst_PointList_get,
"PointList_fillin", inst_PointList_fillin,
"PointList_set", inst_PointList_set,
"PointList_length", inst_PointList_length
};
static char msg[] = "ptlInst.c";
ptlInst_init() {
pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("inst"));
}
void *inst_PointList_get(int sel, Geom *geom, va_list args) {
Inst *i = (Inst *)geom;
HPoint3 *plist;
int n_points;
float **t;
int coordsys;
n_points = (int)GeomCall(GeomMethodSel("PointList_length"), geom);
plist = OOGLNewNE(HPoint3, n_points, msg);
t = va_arg(args, float **);
coordsys = va_arg(args, int);
return GeomCall(GeomMethodSel("PointList_fillin"), geom, t,
coordsys, plist);
}
void *inst_PointList_fillin(int sel, Geom *geom, va_list args) {
Inst *inst = (Inst *)geom;
HPoint3 *plist;
int coordsys;
GeomIter *it;
Transform Tnew;
int i, n_points;
float **t;
t = va_arg(args, float **);
coordsys = va_arg(args, int);
plist = va_arg(args, HPoint3 *);
n_points = (int)GeomCall(GeomMethodSel("PointList_length"), inst->geom);
it = GeomIterate(geom, DEEP);
for (i = 0; NextTransform(it, Tnew); i += n_points)
if (coordsys == POINTLIST_SELF) {
TmConcat(Tnew, t, Tnew);
GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, &Tnew[0][0],
coordsys, &plist[i]);
} else if (coordsys == POINTLIST_PRIMITIVE)
GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, t, coordsys,
&plist[i]);
else {
OOGLError(1, "Unrecognized coordinate system in inst_PointList_fillin");
return NULL;
}
return plist;
}
void *inst_PointList_set(int sel, Geom *geom, va_list args) {
Inst *inst = (Inst *)geom;
HPoint3 *plist;
Transform T, TInv;
int coordsys;
GeomIter *it;
coordsys = va_arg(args, int);
plist = va_arg(args, HPoint3 *);
/* If the point list has more than one copy of the points
* of the geom in it, just use the first set */
it = GeomIterate(geom, DEEP);
if (NextTransform(it, T) && coordsys == POINTLIST_SELF) {
Tm3Invert(T, TInv);
HPt3TransformN(TInv, plist, plist,
GeomCall(GeomMethodSel("PointList_length"), inst->geom));
}
GeomCall(GeomMethodSel("PointList_set"), inst->geom, coordsys, plist);
return NULL;
}
void *inst_PointList_length(int sel, Geom *geom, va_list args) {
Inst *inst = (Inst *)geom;
int i, n_points;
Transform T;
GeomIter *it;
n_points =
(int)GeomCall(GeomMethodSel("PointList_length"), inst->geom);
it = GeomIterate(geom, DEEP);
for (i = 0; NextTransform(it, T); i += n_points);
return (void *)i;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.