828 |
|
|
829 |
} |
} |
830 |
|
|
831 |
void renderCylinder(const std::vector<ZVec> &pt, int n, int m) const { |
void renderCylinder(const std::vector<ZVec> &pt, int n, int m, |
832 |
|
bool pole0 = false, bool pole1 = false) const { |
833 |
std::vector<ZVec> norm(n * m); |
std::vector<ZVec> norm(n * m); |
834 |
int i, j; |
int i, j; |
835 |
|
|
836 |
for (i = 0; i < n; i++) { |
ZVec sum(0,0,0); |
837 |
|
for (j = 0; j < m; j++) { |
838 |
|
ZVec px0 = pt[0 * m + j]; |
839 |
|
ZVec px1 = pt[1 * m + j]; |
840 |
|
ZVec py0 = pt[pole0 * m + (j== 0 ? m-1 : j-1)]; |
841 |
|
ZVec py1 = pt[pole0 * m + (j==m-1 ? 0 : j+1)]; |
842 |
|
|
843 |
|
sum += norm[0 * m + j] = (px1 - px0).crossp(py1 - py0).normalized(); |
844 |
|
} |
845 |
|
if (pole0) { |
846 |
|
sum = sum.normalized(); |
847 |
|
for (j = 0; j < m; j++) norm[0 * m + j] = sum; |
848 |
|
} |
849 |
|
|
850 |
|
sum = ZVec(0,0,0); |
851 |
|
for (i = 1; i < n-1; i++) { |
852 |
for (j = 0; j < m; j++) { |
for (j = 0; j < m; j++) { |
853 |
ZVec px0 = pt[(i== 0 ? 0 : i-1) * m + j]; |
ZVec px0 = pt[(i-1) * m + j]; |
854 |
ZVec px1 = pt[(i==n-1 ? n-1 : i+1) * m + j]; |
ZVec px1 = pt[(i+1) * m + j]; |
855 |
ZVec py0 = pt[i * m + (j== 0 ? m-1 : j-1)]; |
ZVec py0 = pt[i * m + (j== 0 ? m-1 : j-1)]; |
856 |
ZVec py1 = pt[i * m + (j==m-1 ? 0 : j+1)]; |
ZVec py1 = pt[i * m + (j==m-1 ? 0 : j+1)]; |
857 |
|
|
859 |
} |
} |
860 |
} |
} |
861 |
|
|
862 |
|
for (j = 0; j < m; j++) { |
863 |
|
ZVec px0 = pt[(n-2) * m + j]; |
864 |
|
ZVec px1 = pt[(n-1) * m + j]; |
865 |
|
ZVec py0 = pt[(n-1-pole1) * m + (j== 0 ? m-1 : j-1)]; |
866 |
|
ZVec py1 = pt[(n-1-pole1) * m + (j==m-1 ? 0 : j+1)]; |
867 |
|
|
868 |
|
sum += norm[(n - 1) * m + j] = (px1 - px0).crossp(py1 - py0).normalized(); |
869 |
|
} |
870 |
|
if (pole1) { |
871 |
|
sum = sum.normalized(); |
872 |
|
for (j = 0; j < m; j++) norm[(n-1) * m + j] = sum; |
873 |
|
} |
874 |
|
|
875 |
for (i = 0; i < n - 1; i++) { |
for (i = 0; i < n - 1; i++) { |
876 |
glBegin(GL_QUAD_STRIP); |
glBegin(GL_QUAD_STRIP); |
877 |
for (j = 0; j < m; j++) { |
for (j = 0; j < m; j++) { |
1023 |
} |
} |
1024 |
} |
} |
1025 |
|
|
1026 |
renderCylinder(pt, ndice + 1, ndice); |
renderCylinder(pt, ndice + 1, ndice, false, true); |
1027 |
} |
} |
1028 |
} |
} |
1029 |
|
|
1051 |
for (i = 0; i < (ndice + 1) * (ndice * 2); i++) |
for (i = 0; i < (ndice + 1) * (ndice * 2); i++) |
1052 |
pt[i] = blend(conns, N, r, pt[i]) + p0; |
pt[i] = blend(conns, N, r, pt[i]) + p0; |
1053 |
|
|
1054 |
renderCylinder(pt, ndice + 1, ndice * 2); |
renderCylinder(pt, ndice + 1, ndice * 2, true, true); |
1055 |
} else { |
} else { |
1056 |
|
|
1057 |
|
|