static void subdivide(int depth, GLdouble *v0, GLdouble *v1, GLdouble *v2, GLdouble p0[3], GLdouble radius, GLenum shadeType, int avnormal) { GLdouble w0[3], w1[3], w2[3]; GLdouble l; int i, j, k, n; for (i = 0; i < depth; i++) for (j = 0; i + j < depth; j++) { k = depth - i - j; for (n = 0; n < 3; n++) { w0[n] = (i*v0[n] + j*v1[n] + k*v2[n])/depth; w1[n] = ((i+1)*v0[n] + j*v1[n] + (k-1)*v2[n])/depth; w2[n] = (i*v0[n] + (j+1)*v1[n] + (k-1)*v2[n])/depth; } l = sqrt(w0[0]*w0[0] + w0[1]*w0[1] + w0[2]*w0[2]); w0[0] /= l; w0[1] /= l; w0[2] /= l; l = sqrt(w1[0]*w1[0] + w1[1]*w1[1] + w1[2]*w1[2]); w1[0] /= l; w1[1] /= l; w1[2] /= l; l = sqrt(w2[0]*w2[0] + w2[1]*w2[1] + w2[2]*w2[2]); w2[0] /= l; w2[1] /= l; w2[2] /= l; recorditem(w1, w0, w2, p0, radius, shadeType, avnormal); } for (i = 0; i < depth-1; i++) for (j = 0; i + j < depth-1; j++) { k = depth - i - j; for (n = 0; n < 3; n++) { w0[n] = ((i+1)*v0[n] + (j+1)*v1[n] + (k-2)*v2[n])/depth; w1[n] = ((i+1)*v0[n] + j*v1[n] + (k-1)*v2[n])/depth; w2[n] = (i*v0[n] + (j+1)*v1[n] + (k-1)*v2[n])/depth; } l = sqrt(w0[0]*w0[0] + w0[1]*w0[1] + w0[2]*w0[2]); w0[0] /= l; w0[1] /= l; w0[2] /= l; l = sqrt(w1[0]*w1[0] + w1[1]*w1[1] + w1[2]*w1[2]); w1[0] /= l; w1[1] /= l; w1[2] /= l; l = sqrt(w2[0]*w2[0] + w2[1]*w2[1] + w2[2]*w2[2]); w2[0] /= l; w2[1] /= l; w2[2] /= l; recorditem(w0, w1, w2, p0, radius, shadeType, avnormal); } }
static void subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2, GLenum shadeType) { int depth; GLfloat w0[3], w1[3], w2[3]; GLfloat l; int i, j, k, n; depth = 1; for (i = 0; i < depth; i++) { for (j = 0; i + j < depth; j++) { k = depth - i - j; for (n = 0; n < 3; n++) { w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth; w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n]) / depth; w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n]) / depth; } l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]); w0[0] /= l; w0[1] /= l; w0[2] /= l; l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]); w1[0] /= l; w1[1] /= l; w1[2] /= l; l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]); w2[0] /= l; w2[1] /= l; w2[2] /= l; recorditem(w1, w0, w2, shadeType); } } }