Example #1
0
Color *radiosity_prog(int n, Poly **p, Color *e, Color *rho)
{
  int src, rcv, iter = 0;
  Real ff, mts, *a = NEWTARRAY(n, Real);
  Color d, *dm = NEWTARRAY(n, Color);
  Color ma, *m = NEWTARRAY(n, Color);
	
  initialize(n, m, dm, a, p, e);
  while (iter-- < max_iter) {
    src = select_shooter(n, dm, a);
    if (converged(src, dm))
      break;
    for (rcv = 0; rcv < n; rcv++) {
      if (rcv == src || (ff = formfactor(src, rcv, n, p, a)) < REL_EPS)
	continue;
      d = c_scale(ff, c_mult(rho[rcv], dm[src]));

      m[rcv] = c_add(m[rcv], d);
      dm[rcv] = c_add(dm[rcv], d);
    }
    dm[src] = c_make(0,0,0);
  }
  ma = ambient_rad(n, dm, a);
  for (rcv = 0; rcv < n; rcv++)
    m[rcv] = c_add(m[rcv], ma);
  efree(a), efree(dm);
  return m;
}
Example #2
0
File: opengl.c Project: cheque/s3d
void vbo_store_mesh_gl(Object *o, iMesh *m)
{
  int nv, ni, i;
  GLsizei vsiz, nsiz, tsiz, dusiz, dvsiz;
  GLfloat *verts = NULL;
  GLfloat *norms = NULL;
  GLfloat *texc = NULL;
  GLfloat *du = NULL;
  GLfloat *dv = NULL;
  GLuint *inds = NULL;
  GLenum glerror;
  unsigned char *dest = NULL;
  iTri *t; 

  if (sh_vb_(o) == NULL)
    sh_vb_(o) = NEWSTRUCT(GLvbuf);
  ResetError_GL();
  // set vertices and attributes
  sh_vb_(o)->nvert = nv = m->n;
  verts = alloc_set_buffer(nv, m->p);
  vsiz = nv*3*sizeof(GLfloat);
  nsiz = tsiz = dusiz = dvsiz = 0;
  if (m->nv) {
    nsiz = nv*3*sizeof(GLfloat);
    norms = alloc_set_buffer(nv, m->nv);
  }
  sh_vb_(o)->ntex = 0;
  if (m->tx || TRUE) { 
    sh_vb_(o)->ntex++; tsiz = nv*3*sizeof(GLfloat);
    texc =  alloc_set_buffer(nv, m->tx); 
  }
  if (m->du || TRUE) { 
    sh_vb_(o)->ntex++; dusiz = nv*3*sizeof(GLfloat);
    du =  alloc_set_buffer(nv, m->du); 
  }
  if (m->dv || TRUE) { 
    sh_vb_(o)->ntex++; dvsiz = nv*3*sizeof(GLfloat);
    dv =  alloc_set_buffer(nv, m->dv); 
  }
  // set triangles
  for (ni = 0, t = m->t; t != NULL; t = t->next)
    ni+=3;
  sh_vb_(o)->nind = ni;
  inds =  NEWTARRAY(ni, GLuint);
  for (ni = 0, t = m->t; t != NULL; t = t->next, ni+=3) {
    inds[ni] = t->v[0]; inds[ni+1] = t->v[1]; inds[ni+2] = t->v[2]; 
  }
  glGenBuffers(1, &(sh_vb_(o)->buffer));
  glBindBuffer(GL_ARRAY_BUFFER, sh_vb_(o)->buffer);
  CheckError_GL("vbo verts", sh_vb_(o)->buffer, 0);
  glBufferData(GL_ARRAY_BUFFER, vsiz+nsiz+tsiz+dusiz+dvsiz, NULL, GL_STATIC_DRAW);
  glerror = glGetError();
  dest = (unsigned char *) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
  if (glerror == GL_NO_ERROR && dest) {
    memcpy(dest, (void *)verts, vsiz);
    memcpy(dest+vsiz, (void *)norms, nsiz);
    memcpy(dest+vsiz+nsiz, (void *)texc, tsiz);
    memcpy(dest+vsiz+nsiz+tsiz, (void *)du, dusiz);
    memcpy(dest+vsiz+nsiz+tsiz+dusiz, (void *)dv, dvsiz);
    glUnmapBuffer(GL_ARRAY_BUFFER); 
  } else 
    error("vbo data alloc");
  glBindBuffer(GL_ARRAY_BUFFER, 0);

  glGenBuffers(1, &(sh_vb_(o)->indices));
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sh_vb_(o)->indices);
  CheckError_GL("vbo inds", 0, 0);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, ni*sizeof(GLuint), NULL, GL_STATIC_DRAW);
  glerror = glGetError();
  dest = (unsigned char *) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
  if (glerror == GL_NO_ERROR && dest) {
    memcpy(dest, (void *)inds, ni*sizeof(GLuint));
    glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); 
  } else
    error("vbo ind alloc");
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

  efree(verts); efree(norms); efree(inds); efree(texc); efree(du); efree(dv);
}