X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fshape%2FTube.java;h=dc7ff4e5270a31c0707df36e02a4531556781989;hb=53d55c24c779745f188bdb18d32f71d20acb61b2;hp=828fd2690c95e648d1c162c4701aca97eb68c67a;hpb=58ebeb2baac48f9066c1395a9071f99745574ef9;p=simantics%2F3d.git diff --git a/org.simantics.g3d/src/org/simantics/g3d/shape/Tube.java b/org.simantics.g3d/src/org/simantics/g3d/shape/Tube.java index 828fd269..dc7ff4e5 100644 --- a/org.simantics.g3d/src/org/simantics/g3d/shape/Tube.java +++ b/org.simantics.g3d/src/org/simantics/g3d/shape/Tube.java @@ -29,6 +29,8 @@ public class Tube { Double radius = 1.0; int resolution = 8; + boolean cap = false; + public void setResolution(int resolution) { if (resolution > 2) @@ -56,6 +58,10 @@ public class Tube { } + public void setCap(boolean cap) { + this.cap = cap; + } + public Mesh create() { if (vertices.size() < 2 ) @@ -66,18 +72,43 @@ public class Tube { for (int i = 0; i < vertices.size() - 1; i++) { t.set(vertices.get(i+1)); t.sub(vertices.get(i)); - if (t.lengthSquared() < 0.0001) + if (t.lengthSquared() < 0.000001) throw new IllegalArgumentException("vertices at index " + i + " are too close to each other"); } - List points = new ArrayList(vertices.size()*resolution); - List normals = new ArrayList(vertices.size()*resolution); + int vcount = vertices.size()*resolution; + int icount = (vertices.size()-1)*resolution*6; + + if (cap) { + vcount+=2; + icount+=resolution * 6; + } + + List points = new ArrayList(vcount); + List normals = new ArrayList(vcount); for (int i = 0; i < vertices.size(); i++) { createCircle(i,points,normals); } + if (cap) { + int l = vertices.size()-1; + points.add(new Vector3d(vertices.get(0))); + points.add(new Vector3d(vertices.get(l))); + Vector3d n1 = new Vector3d(vertices.get(1)); + n1.sub(vertices.get(0)); + n1.normalize(); + normals.add(n1); + + Vector3d n2 = new Vector3d(vertices.get(l-1)); + n2.sub(vertices.get(l)); + n2.normalize(); + normals.add(n2); + } + - int index[] = new int[(vertices.size()-1)*resolution*6]; + + + int index[] = new int[icount]; createIndices(index); List indices = new ArrayList(); @@ -163,9 +194,9 @@ public class Tube { int iv = c*resolution + s; /* - iv+1 ---- iv + resolution + 1 - | /| - |/ | + iv+1 ---- iv + resolution + 1 + | /| + |/ | iv ---- iv + resolution */ if (s < resolution - 1) { @@ -187,6 +218,42 @@ public class Tube { } } } + if (cap) { + int c = 0; + int isi = ((vertices.size()-1) * resolution) * 6; + int ivi = vertices.size() * resolution; + for (int s = 0; s < resolution; s++) { + int ii = isi + s*3; + int iv = c*resolution + s; + if (s < resolution - 1) { + index[ii+2] = iv; + index[ii+1] = iv+1; + index[ii+0] = ivi; + } else { + index[ii+2] = iv; + index[ii+1] = iv+1-resolution; + index[ii+0] = ivi; + } + + } + isi += resolution * 3; + c = (vertices.size()-1); + for (int s = 0; s < resolution; s++) { + int ii = isi + s*3; + int iv = c*resolution + s; + if (s < resolution - 1) { + index[ii+2] = iv; + index[ii+1] = iv+1; + index[ii+0] = ivi+1; + } else { + index[ii+2] = iv; + index[ii+1] = iv+1-resolution; + index[ii+0] = ivi+1; + } + + } + + } } }