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; }
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); }