/** * draw triangle * * @param p1 first vertex * @param p2 second vertex * @param p3 last vertex * @param norm1 first normal * @param norm2 second normal * @param norm3 third normal */ public void triangle( Coords3 p1, Coords3 p2, Coords3 p3, Coords3 norm1, Coords3 norm2, Coords3 norm3) { manager.normal(norm1.getXd(), norm1.getYd(), norm1.getZd()); manager.vertexToScale(p1.getXd(), p1.getYd(), p1.getZd()); manager.normal(norm2.getXd(), norm2.getYd(), norm2.getZd()); manager.vertexToScale(p2.getXd(), p2.getYd(), p2.getZd()); manager.normal(norm3.getXd(), norm3.getYd(), norm3.getZd()); manager.vertexToScale(p3.getXd(), p3.getYd(), p3.getZd()); }
/** * draws a disc * * @param center * @param v1 * @param v2 * @param radius */ public void disc(Coords center, Coords v1, Coords v2, double radius) { manager.startGeometry(Manager.Type.TRIANGLE_FAN); int longitude = manager.getLongitudeDefault(); Coords vn; float dt = (float) 1 / longitude; float da = (float) (2 * Math.PI * dt); manager.texture(0, 0); manager.normal(v1.crossProduct(v2)); manager.triangleFanApex(center); float u = 1, v = 0; vn = v1.mul(u).add(v2.mul(v)); manager.triangleFanVertex(center.add(vn.mul(radius))); for (int i = 1; i <= longitude; i++) { u = (float) Math.cos(i * da); v = (float) Math.sin(i * da); vn = v1.mul(u).add(v2.mul(v)); manager.triangleFanVertex(center.add(vn.mul(radius))); } manager.endGeometry(); }
/** * fill a parabola * * @param center center * @param v1 1st eigenvector * @param v2 2nd eigenvector * @param p eigenvalue * @param tMin t min * @param tMax t max */ public void parabola(Coords center, Coords v1, Coords v2, double p, double tMin, double tMax) { manager.startGeometry(Manager.Type.TRIANGLE_FAN); manager.texture(0, 0); manager.normal(v1.crossProduct(v2)); int longitude = manager.getLongitudeDefault(); Coords m; float dt = (float) (tMax - tMin) / longitude; float u, v; double t; // first point t = tMin; u = (float) (p * t * t / 2); v = (float) (p * t); m = v1.mul(u).add(v2.mul(v)); // center of the fan is midpoint of branch ends t = tMax; u = (float) (p * t * t / 2); v = (float) (p * t); manager.triangleFanApex(center.add((m.add(v1.mul(u).add(v2.mul(v)))).mul(0.5))); // first point manager.triangleFanVertex(center.add(m)); for (int i = 1; i <= longitude; i++) { t = tMin + i * dt; u = (float) (p * t * t / 2); v = (float) (p * t); m = v1.mul(u).add(v2.mul(v)); manager.triangleFanVertex(center.add(m)); } manager.endGeometry(); }
/** * draws a parallelogram * * @param center * @param v1 * @param v2 * @param l1 * @param l2 */ public void parallelogram(Coords center, Coords v1, Coords v2, double l1, double l2) { manager.startGeometry(Manager.Type.TRIANGLES); manager.setDummyTexture(); tmpCoords.setCrossProduct(v1, v2); manager.normal(tmpCoords); tmpCoords.setAdd(center, tmpCoords.setMul(v1, l1)); tmpCoords2.setAdd(tmpCoords, tmpCoords2.setMul(v2, l2)); tmpCoords3.setAdd(center, tmpCoords3.setMul(v2, l2)); manager.vertexToScale(center); manager.vertexToScale(tmpCoords); manager.vertexToScale(tmpCoords2); manager.vertexToScale(center); manager.vertexToScale(tmpCoords2); manager.vertexToScale(tmpCoords3); manager.endGeometry(); }
/** * draws the inside of the hyperobola part * * @param center center * @param v1 1st eigenvector * @param v2 2nd eigenvector * @param a 1st eigenvalue * @param b 2nd eigenvalue * @param tMin t min * @param tMax t max */ public void hyperbolaPart( Coords center, Coords v1, Coords v2, double a, double b, double tMin, double tMax) { manager.startGeometry(Manager.Type.TRIANGLE_FAN); manager.texture(0, 0); manager.normal(v1.crossProduct(v2)); int longitude = manager.getLongitudeDefault(); Coords m; float dt = (float) (tMax - tMin) / longitude; float u, v; // first point on the branch u = (float) Math.cosh(tMin); v = (float) Math.sinh(tMin); m = v1.mul(a * u).add(v2.mul(b * v)); // center of the fan is midpoint of branch ends u = (float) Math.cosh(tMax); v = (float) Math.sinh(tMax); manager.triangleFanApex(center.add((m.add(v1.mul(a * u).add(v2.mul(b * v)))).mul(0.5))); // first point manager.triangleFanVertex(center.add(m)); for (int i = 1; i <= longitude; i++) { u = (float) Math.cosh(tMin + i * dt); v = (float) Math.sinh(tMin + i * dt); m = v1.mul(a * u).add(v2.mul(b * v)); manager.triangleFanVertex(center.add(m)); } manager.endGeometry(); }
/** draws a section point */ private void draw(PlotterBrushSection s, double u, double v, int texture) { GgbVector[] vectors = s.getNormalAndPosition(u, v); // Application.debug(vectors[0].toString()); /* manager.normal( (float) vectors[0].getX(), (float) vectors[0].getY(), (float) vectors[0].getZ()); */ manager.normal(vectors[0]); manager.texture( getTexture(textureX[texture], textureTypeX), getTexture(textureY[texture], textureTypeY)); manager.vertex(vectors[1]); /* manager.vertex( (float) vectors[1].getX(), (float) vectors[1].getY(), (float) vectors[1].getZ()); */ }
public void drawNV(Coords normal, Coords point) { manager.normal(normal); manager.vertexToScale(point); }
public Coords cylinder( Coords center, Coords vx, Coords vy, Coords vz, double r1, double r2, double start, double extent, double min, double max, boolean minFading, boolean maxFading, int longitude) { manager.startGeometry(Manager.Type.TRIANGLE_STRIP); float c, s; float dt = (float) 1 / longitude; float da = (float) (extent * dt); center1.set(vz); center1.mulInside3(min); center1.addInside(center); center2.set(vz); center2.mulInside3(max); center2.addInside(center); boolean fading = minFading || maxFading; if (!fading) { manager.setDummyTexture(); } for (int i = 0; i <= longitude; i++) { c = (float) Math.cos(start + i * da); s = (float) Math.sin(start + i * da); n.setAdd(tmpCoords.setMul(vx, r2 * c), tmpCoords2.setMul(vy, r1 * s)); n.normalize(); // point on top circle if (fading) { if (maxFading) { manager.texture(0, 1); } else { manager.texture(0, 0); } } tmpCoords3.setAdd(tmpCoords.setMul(vx, r1 * c), tmpCoords2.setMul(vy, r2 * s)); manager.normal(n); manager.vertexToScale(tmpCoords.setAdd(center2, tmpCoords3)); // point on bottom circle if (fading) { if (minFading) { manager.texture(0, 1); } else { manager.texture(0, 0); } } manager.normal(n); manager.vertexToScale(tmpCoords.setAdd(center1, tmpCoords3)); } manager.endGeometry(); return center2; }
public void cone( Coords center, Coords vx, Coords vy, Coords vz, double r1, double r2, double start, double extent, double min, double max, boolean minFading, boolean maxFading) { manager.startGeometry(Manager.Type.TRIANGLE_STRIP); int longitude = manager.getLongitudeDefault(); float u, v; float dt = (float) 1 / longitude; float da = (float) (extent * dt); center1.set(vz); center1.mulInside3(min); center1.addInside(center); center2.set(vz); center2.mulInside3(max); center2.addInside(center); double rmin = r1 * min; double rmax = r1 * max; double ratio = r2 / r1; // ensure radius are positive and normals go outside int sgn = 1; if (max > 0) { sgn = -1; } else { rmin *= -1; rmax *= -1; } double rr = r1 * r2 * sgn; boolean fading = minFading || maxFading; if (!fading) { manager.setDummyTexture(); } for (int i = 0; i <= longitude; i++) { u = (float) Math.cos(start + i * da); v = (float) Math.sin(start + i * da); m.setAdd(tmpCoords2.setMul(vx, u), tmpCoords3.setMul(vy, v * ratio)); n.setMul(vx, r2 * u); tmpCoords.setMul(vy, r1 * v); n.addInside(tmpCoords); tmpCoords.setMul(vz, rr); n.addInside(tmpCoords); n.normalize(); // point on top circle if (fading) { if (maxFading) { manager.texture(0, 1); } else { manager.texture(0, 0); } } manager.normal(n); manager.vertexToScale(tmpCoords2.setAdd(center2, tmpCoords3.setMul(m, rmax))); // point on bottom circle if (fading) { if (minFading) { manager.texture(0, 1); } else { manager.texture(0, 0); } } manager.normal(n); manager.vertexToScale(tmpCoords2.setAdd(center1, tmpCoords3.setMul(m, rmin))); } manager.endGeometry(); }
/** * @param center * @param vx * @param vy * @param vz * @param r1 * @param r2 * @param start * @param extent * @param height * @param fading * @return center of the bottom */ public Coords cone( Coords center, Coords vx, Coords vy, Coords vz, double r1, double r2, double start, double extent, double height, float fading) { manager.startGeometry(Manager.Type.TRIANGLE_STRIP); int longitude = manager.getLongitudeDefault(); double u, v; float dt = (float) 1 / longitude; float da = (float) (extent * dt); // if (height > 0){ // ensure correct back/front face culling // da *= -1; // } if (fading == 1) { // no fading manager.setDummyTexture(); } center2.set(vz); center2.mulInside3(height); center2.addInside(center); double r1h = r1 * -height; double r2h = r2 * -height; double rr = r1 * r2; for (int i = 0; i <= longitude; i++) { u = Math.cos(start + i * da); v = Math.sin(start + i * da); m.setAdd(tmpCoords2.setMul(vx, u * r1h), tmpCoords3.setMul(vy, v * r2h)); n.setMul(vx, r2 * u); tmpCoords.setMul(vy, r1 * v); n.addInside(tmpCoords); tmpCoords.setMul(vz, rr); n.addInside(tmpCoords); n.normalize(); // center of the triangle fan if (fading < 1) { manager.texture(0, fading); } manager.normal(n); manager.vertexToScale(center); // point on circle if (fading < 1) { manager.texture(0, 1); } manager.normal(n); manager.vertexToScale(tmpCoords2.setAdd(center2, m)); } manager.endGeometry(); return center2; }
/** * @param center * @param v1 * @param v2 * @param a * @param b * @param start * @param extent * @param fromEllipseCenter says if the surface is drawn from center of the ellipse */ public void ellipsePart( Coords center, Coords v1, Coords v2, double a, double b, double start, double extent, boolean fromEllipseCenter) { manager.startGeometry(Manager.Type.TRIANGLE_FAN); int longitude = manager.getLongitudeDefault(); float u, v; float dt = (float) 1 / longitude; float da = (float) (extent * dt); manager.setDummyTexture(); manager.normal(v1.crossProduct(v2)); u = (float) Math.cos(start); v = (float) Math.sin(start); v1.mul(a * u, m); v2.mul(b * v, tmpCoords); m.add(tmpCoords, m); // center of the triangle fan if (fromEllipseCenter) { // center of the ellipse manager.triangleFanApex(center); } else { // mid point of the ellipse start and end u = (float) Math.cos(start + extent); v = (float) Math.sin(start + extent); v1.mul(a * u, tmpCoords2); v2.mul(b * v, tmpCoords); tmpCoords2.add(tmpCoords, tmpCoords2); tmpCoords2.add(m, tmpCoords2); tmpCoords2.mul(0.5, tmpCoords2); center.add(tmpCoords2, tmpCoords2); manager.triangleFanApex(tmpCoords2); } // first point manager.triangleFanVertex(center.add(m)); for (int i = 1; i <= longitude; i++) { u = (float) Math.cos(start + i * da); v = (float) Math.sin(start + i * da); v1.mul(a * u, m); v2.mul(b * v, tmpCoords); m.add(tmpCoords, m); center.add(m, m); manager.triangleFanVertex(m); } manager.endGeometry(); }