return;
}
}
+ else if (eType == eXactCylinder)
+ {
+ int n = (width - 1) / 2; // n = number of segments
+ setDims(width, height);
+
+ // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents);
+ // vPos[1] = aabb.origin;
+ // vPos[2] = vector3_added(aabb.origin, aabb.extents);
+
+ int i, j;
+ float f = 1 / cos(M_PI / n);
+ for(i = 0; i < width; ++i)
+ {
+ float angle = (M_PI * i) / n; // 0 to 2pi
+ float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f);
+ float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f);
+ for(j = 0; j < height; ++j)
+ {
+ float z = vPos[0][2] + (vPos[2][2] - vPos[0][2]) * (j / (float)(height - 1));
+ PatchControl *v;
+ v = &m_ctrl.data()[j*width+i];
+ v->m_vertex[0] = x;
+ v->m_vertex[1] = y;
+ v->m_vertex[2] = z;
+ }
+ }
+ }
+ else if (eType == eXactCone)
+ {
+ int n = (width - 1) / 2; // n = number of segments
+ setDims(width, height);
+
+ // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents);
+ // vPos[1] = aabb.origin;
+ // vPos[2] = vector3_added(aabb.origin, aabb.extents);
+
+ int i, j;
+ float f = 1 / cos(M_PI / n);
+ for(i = 0; i < width; ++i)
+ {
+ float angle = (M_PI * i) / n;
+ for(j = 0; j < height; ++j)
+ {
+ float x = vPos[1][0] + (1.0f - (j / (float)(height - 1))) * (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f);
+ float y = vPos[1][1] + (1.0f - (j / (float)(height - 1))) * (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f);
+ float z = vPos[0][2] + (vPos[2][2] - vPos[0][2]) * (j / (float)(height - 1));
+ PatchControl *v;
+ v = &m_ctrl.data()[j*width+i];
+ v->m_vertex[0] = x;
+ v->m_vertex[1] = y;
+ v->m_vertex[2] = z;
+ }
+ }
+ }
+ else if (eType == eXactSphere)
+ {
+ int n = (width - 1) / 2; // n = number of segments (yaw)
+ int m = (height - 1) / 2; // m = number of segments (pitch)
+ setDims(width, height);
+
+ // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents);
+ // vPos[1] = aabb.origin;
+ // vPos[2] = vector3_added(aabb.origin, aabb.extents);
+
+ int i, j;
+ float f = 1 / cos(M_PI / n);
+ float g = 1 / cos(M_PI / (2*m));
+ for(i = 0; i < width; ++i)
+ {
+ float angle = (M_PI * i) / n;
+ for(j = 0; j < height; ++j)
+ {
+ float angle2 = (M_PI * j) / (2*m);
+ float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) * sin(angle2) * ((j&1) ? g : 1.0f) * cos(angle) * ((i&1) ? f : 1.0f);
+ float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) * sin(angle2) * ((j&1) ? g : 1.0f) * sin(angle) * ((i&1) ? f : 1.0f);
+ float z = vPos[1][2] + (vPos[2][2] - vPos[1][2]) * -cos(angle2) * ((j&1) ? g : 1.0f);
+ PatchControl *v;
+ v = &m_ctrl.data()[j*width+i];
+ v->m_vertex[0] = x;
+ v->m_vertex[1] = y;
+ v->m_vertex[2] = z;
+ }
+ }
+ }
else if (eType == eBevel)
{
unsigned char *pIndex;