⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ellihelp.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* ellipsoid_par_help.c */#include "ellipsoid.h"#define SetP(p,px,py,pz) (p).x=(px), (p).y=(py), (p).z=(pz)#define SetV(v,px,py,pz,nx,ny,nz) SetP((v)->p,px,py,pz), SetP((v)->n,nx,ny,nz)#define SetF(f,i0,i1,i2) (f)->v0 = i0, (f)->v1 = i1, (f)->v2 = i2void ellipsoid_par_help (int n, int nv, int nf, vertex *ev, face *ef, vertex *octant){   int i, j, vv, ww, vv0, ww0;   vertex *v, *o;   face *f;   /* Generate vertices and triangular faces of the ellipsoid.   */   /* Note that each of the 18 statements below (par_0 ~ par_17) */   /*    are independent of each other.                          */#pragma parallel#pragma local(i,j,v,o,f,vv,ww,vv0,ww0)#pragma byvalue(n,nv,nf,ev,ef,octant)/** #pragma distinct(*v,*ev) **//** #pragma distinct(*o,*octant) **//** #pragma distinct(*f,*ef) **//* parallel */ {#pragma independent   /* par_0 */ { /* the north pole */      v = ev, o = octant;            SetV (v,  o->p.x,  o->p.y,  o->p.z,  o->n.x,  o->n.y,  o->n.z);      ;   }#pragma independent   /* par_1 */ { /* vertices on the 1st octant */      v = ev+1, o = octant+1;      for (i = 1;;) {         for (j = i; --j >= 0; o++, v++)            SetV (v,  o->p.x,  o->p.y,  o->p.z,  o->n.x,  o->n.y,  o->n.z);         if (i == n) break;         v += 3*i, i++, o++;      }      ; /* This empty statement is necessary because of the compiler-bug(?). */   }#pragma independent   /* par_2 */ { /* vertices on the 2nd octant */      v = ev+2, o = octant+2;      for (i = 1;;) {         for (j = i; --j >= 0; o--, v++)            SetV (v, -o->p.x,  o->p.y,  o->p.z, -o->n.x,  o->n.y,  o->n.z);         if (i == n) break;         v += 3*i+1, i++, o += 2*i;      }      ;   }#pragma independent   /* par_3 */ { /* vertices on the 3rd octant */      v = ev+3, o = octant+1;      for (i = 1;;) {         for (j = i; --j >= 0; o++, v++)            SetV (v, -o->p.x, -o->p.y,  o->p.z, -o->n.x, -o->n.y,  o->n.z);         if (i == n) break;         v += 3*i+2, i++, o++;      }      ;   }#pragma independent   /* par_4 */ { /* vertices on the 4th octant */      v = ev+4, o = octant+2;      for (i = 1;;) {         for (j = i; --j >= 0; o--, v++)            SetV (v,  o->p.x, -o->p.y,  o->p.z,  o->n.x, -o->n.y,  o->n.z);         if (i == n) break;         i++, v += 3*i, o += 2*i;      }      ;   }#pragma independent   /* par_5 */ { /* vertices on the 5th octant */      v = ev+nv-5, o = octant+1;      for (i = 1;;) {         for (j = i; --j >= 0; o++, v++)            SetV (v,  o->p.x,  o->p.y, -o->p.z,  o->n.x,  o->n.y, -o->n.z);         if (i == n) break;         v -= 5*i+4, i++, o++;      }      ;   }#pragma independent   /* par_6 */ { /* vertices on the 6th octant */      v = ev+nv-4, o = octant+2;      for (i = 1;;) {         for (j = i; --j >= 0; o--, v++)            SetV (v, -o->p.x,  o->p.y, -o->p.z, -o->n.x,  o->n.y, -o->n.z);         if (i == n) break;         v -= 5*i+3, i++, o += 2*i;      }      ;   }#pragma independent   /* par_7 */ { /* vertices on the 7th octant */      v = ev+nv-3, o = octant+1;      for (i = 1;;) {         for (j = i; --j >= 0; o++, v++)            SetV (v, -o->p.x, -o->p.y, -o->p.z, -o->n.x, -o->n.y, -o->n.z);         if (i == n) break;         v -= 5*i+2, i++, o++;      }      ;   }#pragma independent   /* par_8 */ { /* vertices on the 8th octant */      v = ev+nv-2, o = octant+2;      for (i = 1;;) {         for (j = i; --j >= 0; o--, v++)            SetV (v,  o->p.x, -o->p.y, -o->p.z,  o->n.x, -o->n.y, -o->n.z);         if (i == n) break;         v -= 5*i+1, i++, o += 2*i;      }      ;   }#pragma independent   /* par_9 */ { /* the south pole */      v = ev+nv-1, o = octant;            SetV (v, -o->p.x, -o->p.y, -o->p.z, -o->n.x, -o->n.y, -o->n.z);      ;   }#pragma independent   /* par_10 */ { /* faces on the 1st octant */      f = ef; vv = 0, ww = 1;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++ww), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++vv), f++;         }         if (i == n) break;         f += 6*i-3; vv = ww-i; ww += 3*i; i++;      }      ;   }#pragma independent   /* par_11 */ { /* faces on the 2nd octant */      f = ef+1; vv = 0, ww = 2;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++ww), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++vv), f++;         }         if (i == n) break;         f += 6*i-1; vv = ww-i; ww += 3*i+1; i++;      }      ;   }#pragma independent   /* par_12 */ { /* faces on the 3rd octant */      f = ef+2; vv = 0, ww = 3;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++ww), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++vv), f++;         }         if (i == n) break;         f += 6*i+1; vv = ww-i; ww += 3*i+2; i++;      }      ;   }#pragma independent   /* par_13 */ { /* faces on the 4th octant */      f = ef+3; vv = 0, ww = 4, vv0 = 0, ww0 = 1;      for (i = 1;;) {         for (j = i;;) {            if (--j == 0) { SetF (f, vv0, ww, ww0), vv++, ww++, f++; break; }            SetF (f, vv, ww, ++ww), f++;            if (j == 1) SetF (f, vv, ww, vv0), f++;            else SetF (f, vv, ww, ++vv), f++;         }         if (i == n) break;         vv0 = ww0; ww0 += 4*i;         f += 6*i+3; vv = ww-i; i++; ww += 3*i;      }      ;   }#pragma independent   /* par_14 */ { /* faces on the 5th octant */      f = ef+nf-4; vv = nv-5, ww = nv-1;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++vv), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++ww), f++;         }         if (i == n) break;         f -= 10*i+3; ww = vv-i; i++; vv -= 5*i-1;      }      ;   }#pragma independent   /* par_15 */ { /* faces on the 6th octant */      f = ef+nf-3; vv = nv-4, ww = nv-1;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++vv), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++ww), f++;         }         if (i == n) break;         f -= 10*i+1; ww = vv-i; i++; vv -= 5*i-2;      }      ;   }#pragma independent   /* par_16 */ { /* faces on the 7th octant */      f = ef+nf-2; vv = nv-3, ww = nv-1;      for (i = 1;;) {         for (j = i;;) {            SetF (f, vv, ww, ++vv), f++;            if (--j == 0) break;            SetF (f, vv, ww, ++ww), f++;         }         if (i == n) break;         f -= 10*i-1; ww = vv-i; i++; vv -= 5*i-3;      }      ;   }#pragma independent   /* par_17 */ { /* faces on the 8th octant */      f = ef+nf-1; vv = nv-2, ww = nv-1, vv0 = nv-5, ww0 = nv-1;      for (i = 1;;) {         for (j = i;;) {            if (--j == 0) { SetF (f, vv, ww0, vv0), vv++, ww++, f++; break; }            SetF (f, vv, ww, ++vv), f++;            if (j == 1) SetF (f, vv, ww, ww0), f++;            else SetF (f, vv, ww, ++ww), f++;         }         if (i == n) break;         f -= 10*i-3; ww = vv-i; i++; vv -= 5*i-4;         ww0 = vv0; vv0 -= 4*i;      }      ;   }/* parallel */ }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -