home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / mg / rib / mgribmesh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-06  |  3.7 KB  |  167 lines

  1. #include "mgP.h"
  2. #include "mgribP.h"
  3. #include "mgribtoken.h"
  4.  
  5. #define    HAS_N    0x1
  6. #define    HAS_C    0x2
  7. #define    HAS_SMOOTH 0x4
  8.  
  9. #define VI_TUPLET_LIMIT 2 /* for sgi vi formatting (so we can use it!) */
  10.  
  11. static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, ColorA *C );
  12. static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P );
  13.  
  14. int
  15. mgrib_mesh( wrap, nu, nv, P, N, C)
  16.     int wrap;
  17.     int nu, nv;
  18.     HPoint3 *P;
  19.     Point3 *N;
  20.     ColorA *C;
  21. {
  22.     register Appearance *ap;
  23.     ColorA    *c;
  24.     Color   *c3;
  25.     Point3  *n;
  26.     HPoint3 *p;
  27.     int u,v;
  28.  
  29.     ap = &_mgc->astk->ap;
  30.  
  31.     if(ap->flag & APF_FACEDRAW) {
  32.     mgrib_submesh( wrap, nu, nv, P, N, C);
  33.     }
  34.     
  35.     if(ap->flag & APF_EDGEDRAW) {
  36.     /* must draw edges manually */
  37.     c3 = &ap->mat->edgecolor;
  38.     mrti(mr_attributebegin, mr_color, mr_parray, 3, c3,
  39.         mr_opacity, mr_array, 3, 1., 1., 1.,
  40.         mr_surface, mr_constant, mr_NULL);
  41.     mgrib_prmanmesh( wrap, nu, nv, P);
  42.     mrti(mr_attributeend,mr_NULL);
  43.     }
  44.     
  45.     if((ap->flag & APF_NORMALDRAW) && N!=NULL) {
  46.     p = P;
  47.     n = N;
  48.     for(u = nu*nv; --u >= 0; )
  49.         mgrib_drawnormal(p++, n++);
  50.     }
  51.     
  52.     return 1;
  53. }
  54.  
  55. static void
  56. mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, ColorA *C )
  57. {
  58.     register Appearance *ap;
  59.     char    *uwrap,*vwrap;
  60.     int     shading;
  61.     int     i;
  62.     register HPoint3 *p;
  63.     register Point3  *n;
  64.     register ColorA    *c;
  65.     int     nunv;
  66.     int     viflag; /* used to insert \n into RIB file so lines */
  67.             /* won't be too long for 'vi' to work well   */
  68.     float   alpha;
  69.  
  70.     nunv = nu * nv;
  71.     p = P;
  72.     n = N;
  73.     c = C;
  74.         
  75.     ap = &_mgc->astk->ap;
  76.     
  77.     uwrap = (wrap & MM_UWRAP) ? "wrap" : "nowrap";
  78.     vwrap = (wrap & MM_VWRAP) ? "wrap" : "nowrap";
  79.     
  80.     mrti(mr_attributebegin, mr_NULL);
  81.  
  82. /* THIS SHOULD BE AT A HIGHER LEVEL
  83.     mgrib_print("ShadingInterpolation ");
  84.     if(ap->shading & APF_SMOOTH) mgrib_print("\"smooth\"\n");
  85.     else mgrib_print("\"constant\"\n");
  86. */
  87.     
  88.     mrti(mr_patchmesh, mr_string, "bilinear",
  89.         mr_int, nu, mr_string, uwrap,
  90.         mr_int, nv, mr_string, vwrap,
  91.     mr_P, mr_buildarray, 3*nunv, mr_NULL);
  92.     
  93.     for(i=0; i<nunv; i++, p++, viflag++) {
  94.     mrti(mr_subarray3, p, mr_NULL);
  95.     if(viflag>=VI_TUPLET_LIMIT) {
  96.         viflag=0;
  97.         /* wrap lines so they won't be too long for vi */
  98.         mrti(mr_nl, mr_NULL);
  99.     }
  100.     }
  101.     
  102.     /* use normals if supplied */
  103.     if(N!=NULL) {
  104.     viflag = 0;
  105.     mrti(mr_N, mr_buildarray, 3*nunv, mr_NULL);
  106.     for(i=0; i<nunv; i++, n++, viflag++) {
  107.         mrti(mr_subarray3, n, mr_NULL);
  108.         if(viflag>=VI_TUPLET_LIMIT) {
  109.         viflag = 0;
  110.         mrti(mr_nl, mr_NULL);
  111.         }
  112.     }
  113.     }
  114.     
  115.     /* use colors if supplied and not overridden */
  116.     if(C && !( (ap->mat->override & MTF_DIFFUSE) && !_mgc->astk->useshader) ) {
  117.     viflag = 0;
  118.     mrti(mr_Cs, mr_buildarray, 3*nunv, mr_NULL);
  119.     for(i=0; i<nunv; i++, c++, viflag++) {
  120.         mrti(mr_subarray3, c, mr_NULL);
  121.         if(viflag>=VI_TUPLET_LIMIT) {
  122.         viflag = 0;
  123.         mrti(mr_nl, mr_NULL);
  124.         }
  125.     }
  126.     
  127.     /* transparancy */
  128.     if(ap->flag & APF_TRANSP) {
  129.         c = C;
  130.         mrti(mr_Os, mr_buildarray, 3*nunv, mr_NULL);
  131.         for(i=0; i<nunv; i++, c++) {
  132.         mrti(mr_subarray3, c, mr_NULL);
  133.         if(viflag>=VI_TUPLET_LIMIT)
  134.         {
  135.             viflag = 0;
  136.             mrti(mr_nl, mr_NULL);
  137.         }
  138.         }
  139.     }            
  140.     }
  141.     mrti(mr_attributeend, mr_NULL);
  142. }
  143.  
  144. static void
  145. mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P )
  146. {
  147.     int u, v, prevu, prevv;
  148.  
  149.     for(v=0; v<nv; v++) {
  150.     if(wrap & MM_UWRAP) u = 0, prevu = nu-1;
  151.     else            u = 1, prevu = 0;
  152.     for( ; u<nu; u++) {
  153.         mgrib_drawline(&P[prevu + v * nu], &P[u + v * nu]);
  154.         prevu = u;
  155.     }
  156.     }
  157.  
  158.     for(u=0; u<nu; u++) {
  159.     if(wrap & MM_VWRAP) v = 0, prevv = nv-1;
  160.     else            v = 1, prevv = 0;
  161.     for( ; v<nv; v++) {
  162.         mgrib_drawline(&P[u + prevv * nu], &P[u + v * nu]);
  163.         prevv = v;
  164.     }
  165.     }
  166. }
  167.