This is mgrimesh.c in view mode; [Download] [Up]
#include "mgP.h"
#include "mgriP.h"
int
mgri_mesh( wrap, nu, nv, P, N, C)
int wrap;
int nu, nv;
HPoint3 *P;
Point3 *N;
ColorA *C;
{
register Appearance *ap;
ColorA *c;
Color *c3;
Point3 *n;
void mgri_submesh();
int u,v;
ap = &_mgc->astk->ap;
if(ap->flag & APF_FACEDRAW) {
mgri_submesh( wrap, nu, nv, P, N, C);
}
if(ap->flag & APF_EDGEDRAW) {
RiAttributeBegin();
RiGeometricRepresentation("lines");
mgri_closer();
c3 = &ap->mat->edgecolor;
RiColor((float *)c3);
mgri_submesh( wrap, nu, nv, P, N, C);
RiAttributeEnd();
}
if((ap->flag & APF_NORMALDRAW) && N!=NULL) {
Color *color = &_mgc->astk->mat.normalcolor;
n = N;
RiAttributeBegin();
RiSurface(RI_CONSTANT, RI_NULL);
RiColor((float *)color);
for(u=0; u<nu; u++) {
for(v=0; v<nv; v++) {
mgri_drawnormal(&P[u + v * nu], &N[u + v * nu], color);
}
}
RiAttributeEnd();
}
return 1;
}
void
mgri_submesh( wrap, nu, nv, P, N, C)
int wrap;
int nu, nv;
HPoint3 *P;
Point3 *N;
ColorA *C;
{
register Appearance *ap;
char *uwrap,*vwrap;
int shading;
int i;
register HPoint3 *p;
register Point3 *n;
register ColorA *c;
int nunv;
float alpha;
int colorsdefined;
int normalsdefined;
/* Ignore colors if overridden */
if((_mgc->astk->mat.override & MTF_DIFFUSE) && !_mgc->astk->useshader)
C = NULL;
nunv = nu * nv;
p = P;
n = N;
c = C;
ap = &_mgc->astk->ap;
if(wrap & MM_UWRAP) uwrap = RI_PERIODIC;
else uwrap = RI_NONPERIODIC;
if(wrap & MM_VWRAP) vwrap = RI_PERIODIC;
else vwrap = RI_NONPERIODIC;
RiAttributeBegin(); // IS THIS NECESSARY!?
/* Points */
/* NOTES: Check to see if we can use Pw here!! */
for(i=0; i<nunv; i++, p++) {
mgri_normalize(p, ript[i]);
}
/* use normals if supplied */
if(N!=NULL) {
for(i=0; i<nunv; i++, n++) {
bcopy((char *)n, (char *)rinormal[i], sizeof(float)*3);
}
normalsdefined=1;
} else normalsdefined=0;
/* use colors if supplied */
if(C!=NULL) {
for(i=0; i<nunv; i++, c++) {
//bcopy((char *)c, (char *)ricolor[i], sizeof(float)*3);
*(Color *)&ricolor[i] = *(Color *)c;
}
colorsdefined=1;
} else colorsdefined=0;
/* No Opacity in QuickRenderman */
/* Define mesh via the renderman interface */
if(!colorsdefined && normalsdefined)
RiPatchMesh( RI_BILINEAR, nu, uwrap, nv, vwrap, RI_P, (RtPointer)ript,
RI_N, (RtPointer)rinormal, RI_NULL);
else if(colorsdefined && !normalsdefined)
RiPatchMesh( RI_BILINEAR, nu, uwrap, nv, vwrap, RI_P, (RtPointer)ript,
RI_CS, (RtPointer)ricolor, RI_NULL);
else if(!colorsdefined && !normalsdefined)
RiPatchMesh( RI_BILINEAR, nu, uwrap, nv, vwrap, RI_P, (RtPointer)ript,
RI_NULL);
else RiPatchMesh( RI_BILINEAR, nu, uwrap, nv, vwrap, RI_P, (RtPointer)ript,
RI_CS, (RtPointer)ricolor, RI_N, (RtPointer)rinormal, RI_NULL);
RiAttributeEnd();
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.