BME_Mesh *BME_make_new_uvsphere(BME_Mesh *bmesh, float cent[3], float size, int rings, int segments) { BME_Edge **vedges; BME_Edge **nvedges; BME_Vert **verts; float tmp_vec[3] = {0.0,0.0,0.0}; float pi = 3.1415926542; float e = (pi*2)/segments; float d = 0.0-pi; int r,s,i,b; /*allocate memory like a good little coder :) */ verts = MEM_mallocN(sizeof(BME_Vert*)*(rings*segments), "BME_VERTEX pointer array"); vedges = MEM_mallocN(sizeof(BME_Edge*)*segments, "BME_EDGE pointer array"); nvedges = MEM_mallocN(sizeof(BME_Edge*)*segments, "BME_EDGE pointer array"); /*make top and bottom verts*/ VECCOPY(tmp_vec, cent); tmp_vec[2] = cent[2] + size; verts[0] = BME_MV(bmesh, tmp_vec); tmp_vec[2] = cent[2] - size; verts[(rings*segments)-1] = BME_MV(bmesh, tmp_vec); /* Make initial vertical edges*/ vedges[0] = BME_ME(bmesh,verts[0],verts[(rings*segments)-1]); for (i = 1; i < segments; i++) { vedges[i] = BME_ME(bmesh,verts[0],verts[(rings*segments)-1]); } /*make initial ploys*/ /*for (i = 0; i < segments; i++) { BME_Edge tmp_edgelist[2]; tmp_edgelist[0] = &vedges[i]; tmp_edgelist[1] = &vedges[i+1]; BME_MF(bmesh,tmp_edgelist[0]->v1,tmp_edgelist[0]->v2, &tmp_edgelist,2); }*/ /*split edges*/ /*make first ring*/ for (i = 0, b = 1 ; i < segments; i++,b++) { verts[b] = BME_SEMV(bmesh,verts[0],vedges[i],&nvedges[i]); } /*make rest of rings*/ for (r = 1; r < rings; r++) { for (s = 0; s < segments; s++) { verts[r*s] = BME_SEMV(bmesh,verts[(r*s)-segments],nvedges[s],&nvedges[s]); } } /*split faces*/ /*TO BE DONE*/ /*Move Verts into position*/ for (r = 0; r < rings; r++) { for (i = 0; i <= segments; i++){ float tmpvec[3]; tmpvec[0] = cent[0] + (size/rings)*cos(d); tmpvec[1] = cent[1] + (size/rings)*sin(d); tmpvec[2] = cent[2] + verts[0]->co[2] - ((size/rings)*r); VECCOPY(verts[i]->co, tmpvec); d += e; } } /*free allocated Mem like a good little coder :)*/ if (verts) MEM_freeN(verts); if (vedges) MEM_freeN(vedges); if (nvedges) MEM_freeN(nvedges); return bmesh; }