Example #1
0
void PolyMolecule::computeNormals()
{
  m_FaceNormals.fill(vec3_t(0,0,0), m_Faces.size());
  m_NodeNormals.fill(vec3_t(0,0,0), m_Nodes.size());
  for (int i = 0; i < m_Faces.size(); ++i) {
    QVector<vec3_t> x(m_Faces[i].size() + 1);
    vec3_t x_face(0,0,0);
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      x[j] = getXNode(m_Faces[i][j]);
      x_face += x[j];
    }
    x.last() = x.first();
    x_face *= 1.0/m_Faces[i].size();
    m_FaceNormals[i] = vec3_t(0,0,0);
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      m_FaceNormals[i] += triNormal(x_face, x[j], x[j+1]);
    }
    for (int j = 0; j < m_Faces[i].size(); ++j) {
      vec3_t n = m_FaceNormals[i];
      //n.normalise();
      m_NodeNormals[m_Faces[i][j]] += n;
    }
  }
  for (int i = 0; i < m_Nodes.size(); ++i) {
    m_NodeNormals[i].normalise();
  }
}
Example #2
0
static void
x_analyze(x_display *xdpy, int fam)
{
  int i, j, n, face, pixsize, nsizes;
  char *name;
  if (tmp_fonts) tmp_free();
  tmp_fonts = XListFonts(xdpy->dpy, pattern[((unsigned int)fam)>>2], 1024, &n);

  for (i=0 ; i<n ; i++) {
    name = x_face(tmp_fonts[i], &face);
    if (!name) continue;

    /* extract pixels field */
    pixsize = 0;
    if (name[0]!='*') while (name[0] && name[0]>='0' && name[0]<='9')
      pixsize = 10*pixsize + *(name++) - '0';
    else
      name++;
    if (name[0]!='-') continue;

    /* protect against superlong font names */
    if (!pixsize && strlen(tmp_fonts[i])>120) continue;

    face += fam;

    nsizes = xdpy->available[face].nsizes;
    if (x_lookup(pixsize, xdpy->available[face].sizes, nsizes)) continue;
    if (nsizes%12==0) {
      int *sizes = xdpy->available[face].sizes;
      char **names = xdpy->available[face].names;
      xdpy->available[face].sizes = p_realloc(sizes, sizeof(int)*(nsizes+12));
      if (!xdpy->available[face].sizes) {
        xdpy->available[face].sizes = sizes;
        return;
      }
      xdpy->available[face].names = p_realloc(names,sizeof(char*)*(nsizes+13));
      if (!xdpy->available[face].names) {
        xdpy->available[face].names = names;
        return;
      }
    }
    j = x_insert(pixsize, xdpy->available[face].sizes,
                 xdpy->available[face].names, nsizes);
    xdpy->available[face].nsizes++;
    if (pixsize) {
      xdpy->available[face].names[j] = p_strcpy(tmp_fonts[i]);
    } else {
      /* scalable font needs wildcard name */
      char nm[128], *pnm = nm;
      int n = 7;
      name = tmp_fonts[i];
      while (n--) while ((*(pnm++)= *(name++))!='-');
      /* skip over pixels, points fields */
      *(pnm++)= '*';   *(pnm++)= '-';  *(pnm++)= '*';   *(pnm++)= '-';
      for (n=2 ; n-- ;) while (name[0] && *(name++)!='-');
      /* copy hres, vres, spacing fields */
      for (n=3 ; n-- ;) while (name[0] && (*(pnm++)= *(name++))!='-');
      /* skip over average width field */
      *(pnm++)= '*';   *(pnm++)= '-';
      while (name[0] && *(name++)!='-');
      /* copy remainder (character set fields) */
      while ((*(pnm++)= *(name++)));
      xdpy->available[face].names[j] = p_strcpy(nm);
    }
  }

  tmp_free();
}