git-svn-id: svn://db.shs.com.ru/libs@627 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-11-22 20:22:30 +00:00
parent 09248aae34
commit e65ee56ee4
21 changed files with 527 additions and 208 deletions

View File

@@ -27,7 +27,7 @@ Mesh * Primitive::plane(float width, float length) {
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & i(ret->indices ());
QVector< Vector3i> & i(ret->indicesTriangles ());
float hw = width / 2.f, hl = length / 2.f;
for (int j = 0; j < 4; ++j) n << QVector3D(0., 0., 1.);
t << QVector2D(0., 0.) << QVector2D(0., 1.) << QVector2D(1., 1.) << QVector2D(1., 0.);
@@ -43,7 +43,7 @@ Mesh * Primitive::cube(float width, float length, float height) {
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & i(ret->indices ());
QVector< Vector3i> & i(ret->indicesTriangles ());
float hs = 0.5f;
int si = 0;
QMatrix4x4 mat;
@@ -92,7 +92,7 @@ Mesh * Primitive::ellipsoid(int segments_wl, int segments_h, float width, float
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & ind(ret->indices());
QVector< Vector3i> & ind(ret->indicesTriangles());
double hh = height / 2.f;
int hseg = segments_h + 1, wlseg = segments_wl + 1;
double crw, crl, a, ch, twl;
@@ -131,7 +131,7 @@ Mesh * Primitive::disc(int segments, float width, float length, bool up) {
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & ind(ret->indices());
QVector< Vector3i> & ind(ret->indicesTriangles());
segments = qMax(segments + 1, 4);
QVector3D cp;
@@ -176,7 +176,7 @@ Mesh * Primitive::cone(int segments, float width, float length, float height) {
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & ind(ret->indices());
QVector< Vector3i> & ind(ret->indicesTriangles());
int seg = qMax(segments + 1, 4);
double rx = width / 2., ry = length / 2.;
@@ -212,7 +212,7 @@ Mesh * Primitive::cylinder(int segments, float width, float length, float height
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector3i> & ind(ret->indices());
QVector< Vector3i> & ind(ret->indicesTriangles());
int seg = qMax(segments + 1, 4);
double rx = width / 2., ry = length / 2.;
@@ -261,3 +261,66 @@ Mesh * Primitive::arrow(int segments, float thick, float angle) {
delete m;
return ret;
}
Mesh * Primitive::cubeFrame(float width, float length, float height) {
Mesh * ret = new Mesh(GL_LINES);
QVector3D scale(width, length, height);
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector2i> & i(ret->indicesLines());
float hs = 0.5f;
v << QVector3D(-hs, -hs, -hs) << QVector3D(-hs, hs, -hs) << QVector3D( hs, hs, -hs) << QVector3D( hs, -hs, -hs);
v << QVector3D(-hs, -hs, hs) << QVector3D(-hs, hs, hs) << QVector3D( hs, hs, hs) << QVector3D( hs, -hs, hs);
for (int j = 0; j < 8; ++j) {
v[j] *= scale;
t << QVector2D(0, 0);
n << QVector3D(0,0,1);
}
for (int j = 0; j < 4; ++j) {
i << Vector2i(j, (j + 1) % 4);
i << Vector2i(j, j + 4);
i << Vector2i(j + 4, (j + 1) % 4 + 4);
}
return ret;
}
Mesh * Primitive::ellipsoidFrame(int segments_wl, int segments_h, float width, float length, float height) {
Mesh * ret = new Mesh(GL_LINES);
QVector<QVector3D> & v(ret->vertices ());
QVector<QVector3D> & n(ret->normals ());
QVector<QVector2D> & t(ret->texcoords());
QVector< Vector2i> & ind(ret->indicesLines());
double hh = height / 2.f;
int hseg = segments_h + 1, wlseg = segments_wl + 1;
double crw, crl, a, ch, twl;
QVector3D cp;
for (int i = 0; i <= hseg; i++) {
ch = -cos((double)i / hseg * M_PI);
cp.setZ(ch * hh);
twl = sqrt(1. - ch * ch) / 2.;
crw = twl * width;
crl = twl * length;
int cvcnt = wlseg * 2;
for (int j = 0; j < cvcnt; j++) {
a = (double)j / (cvcnt - 1) * M_2PI;
cp.setX(crl * cos(a));
cp.setY(crw * sin(a));
v << cp; t << QVector2D((double)j / (cvcnt - 1), ch/2.f + 0.5f);
int si = v.size() - 1;
if (j > 0 && i > 0) {
ind << Vector2i(si, si - 1);
ind << Vector2i(si - cvcnt, si);
}
}
}
n.resize(v.size());
for (int i = 0; i < v.size(); i++)
n[i] = v[i].normalized();
return ret;
}