예제 #1
0
 /**
  * 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());
 }
예제 #2
0
  /**
   * 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();
  }
예제 #3
0
  /**
   * 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();
  }
예제 #4
0
  /**
   * 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();
  }
예제 #5
0
  /**
   * 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();
  }
예제 #6
0
  /** 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());
    		*/

  }
예제 #7
0
 public void drawNV(Coords normal, Coords point) {
   manager.normal(normal);
   manager.vertexToScale(point);
 }
예제 #8
0
  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;
  }
예제 #9
0
  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();
  }
예제 #10
0
  /**
   * @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;
  }
예제 #11
0
  /**
   * @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();
  }