This is mgribmesh.c in view mode; [Download] [Up]
#include "mgP.h" #include "mgribP.h" #include "mgribtoken.h" #define HAS_N 0x1 #define HAS_C 0x2 #define HAS_SMOOTH 0x4 #define VI_TUPLET_LIMIT 2 /* for sgi vi formatting (so we can use it!) */ static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, ColorA *C ); static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ); int mgrib_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; HPoint3 *p; int u,v; ap = &_mgc->astk->ap; if(ap->flag & APF_FACEDRAW) { mgrib_submesh( wrap, nu, nv, P, N, C); } if(ap->flag & APF_EDGEDRAW) { /* must draw edges manually */ c3 = &ap->mat->edgecolor; mrti(mr_attributebegin, mr_color, mr_parray, 3, c3, mr_opacity, mr_array, 3, 1., 1., 1., mr_surface, mr_constant, mr_NULL); mgrib_prmanmesh( wrap, nu, nv, P); mrti(mr_attributeend,mr_NULL); } if((ap->flag & APF_NORMALDRAW) && N!=NULL) { p = P; n = N; for(u = nu*nv; --u >= 0; ) mgrib_drawnormal(p++, n++); } return 1; } static void mgrib_submesh( int wrap, int nu, int 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; int viflag; /* used to insert \n into RIB file so lines */ /* won't be too long for 'vi' to work well */ float alpha; nunv = nu * nv; p = P; n = N; c = C; ap = &_mgc->astk->ap; uwrap = (wrap & MM_UWRAP) ? "wrap" : "nowrap"; vwrap = (wrap & MM_VWRAP) ? "wrap" : "nowrap"; mrti(mr_attributebegin, mr_NULL); /* THIS SHOULD BE AT A HIGHER LEVEL mgrib_print("ShadingInterpolation "); if(ap->shading & APF_SMOOTH) mgrib_print("\"smooth\"\n"); else mgrib_print("\"constant\"\n"); */ mrti(mr_patchmesh, mr_string, "bilinear", mr_int, nu, mr_string, uwrap, mr_int, nv, mr_string, vwrap, mr_P, mr_buildarray, 3*nunv, mr_NULL); for(i=0; i<nunv; i++, p++, viflag++) { mrti(mr_subarray3, p, mr_NULL); if(viflag>=VI_TUPLET_LIMIT) { viflag=0; /* wrap lines so they won't be too long for vi */ mrti(mr_nl, mr_NULL); } } /* use normals if supplied */ if(N!=NULL) { viflag = 0; mrti(mr_N, mr_buildarray, 3*nunv, mr_NULL); for(i=0; i<nunv; i++, n++, viflag++) { mrti(mr_subarray3, n, mr_NULL); if(viflag>=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } /* use colors if supplied and not overridden */ if(C && !( (ap->mat->override & MTF_DIFFUSE) && !_mgc->astk->useshader) ) { viflag = 0; mrti(mr_Cs, mr_buildarray, 3*nunv, mr_NULL); for(i=0; i<nunv; i++, c++, viflag++) { mrti(mr_subarray3, c, mr_NULL); if(viflag>=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } /* transparancy */ if(ap->flag & APF_TRANSP) { c = C; mrti(mr_Os, mr_buildarray, 3*nunv, mr_NULL); for(i=0; i<nunv; i++, c++) { mrti(mr_subarray3, c, mr_NULL); if(viflag>=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } } mrti(mr_attributeend, mr_NULL); } static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ) { int u, v, prevu, prevv; for(v=0; v<nv; v++) { if(wrap & MM_UWRAP) u = 0, prevu = nu-1; else u = 1, prevu = 0; for( ; u<nu; u++) { mgrib_drawline(&P[prevu + v * nu], &P[u + v * nu]); prevu = u; } } for(u=0; u<nu; u++) { if(wrap & MM_VWRAP) v = 0, prevv = nv-1; else v = 1, prevv = 0; for( ; v<nv; v++) { mgrib_drawline(&P[u + prevv * nu], &P[u + v * nu]); prevv = v; } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.