summaryrefslogtreecommitdiffstats
path: root/src/demos/xtrans/XTBasicTransition.java
blob: a6bfd0f89cd32874ce28dcee66bc7bf4214aa1f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package demos.xtrans;

import javax.media.opengl.*;
import gleem.linalg.*;

/** A basic transition supporting animated translation, rotation about
    a pivot point, scrolling and fading effects. */

public class XTBasicTransition implements XTTransition {
  protected Vec3f              pivot       = new Vec3f();
  protected Vec3f              axis        = new Vec3f();
  protected InterpolatedFloat  angle;
  protected InterpolatedVec3f  translation;
  protected InterpolatedQuad3f vertices;
  protected InterpolatedQuad2f texcoords;
  protected InterpolatedFloat  alpha;
  protected float              percentage;

  /** Constructs a new transition object with all of its initial state
      set to zero. */
  public XTBasicTransition() {
  }

  public void update(float percentage) {
    this.percentage = percentage;
  }

  public void draw(GL gl) {
    float  percent = percentage;
    Quad3f vts     = vertices.getCurrent(percent);
    Quad2f tex     = texcoords.getCurrent(percent);

    if (translation != null) {
      Vec3f  trans   = translation.getCurrent(percent);
      gl.glTranslatef(trans.x(), trans.y(), trans.z());
    }
    // Rotate about pivot point
    gl.glTranslatef(pivot.x(), pivot.y(), pivot.z());
    if (angle != null) {
      gl.glRotatef(angle.getCurrent(percent), axis.x(), axis.y(), axis.z());
    }
    gl.glTranslatef(-pivot.x(), -pivot.y(), -pivot.z());

    gl.glBegin(GL.GL_TRIANGLES);
    float a = 1.0f;
    if (alpha != null) {
      a = alpha.getCurrent(percent);
    }
    gl.glColor4f(1, 1, 1, a);
    // Triangle 1
    gl.glTexCoord2f(tex.getVec(0).x(), tex.getVec(0).y());
    gl.glVertex3f  (vts.getVec(0).x(), vts.getVec(0).y(), vts.getVec(0).z());
    gl.glTexCoord2f(tex.getVec(1).x(), tex.getVec(1).y());
    gl.glVertex3f  (vts.getVec(1).x(), vts.getVec(1).y(), vts.getVec(1).z());
    gl.glTexCoord2f(tex.getVec(3).x(), tex.getVec(3).y());
    gl.glVertex3f  (vts.getVec(3).x(), vts.getVec(3).y(), vts.getVec(3).z());
    // Triangle 2
    gl.glTexCoord2f(tex.getVec(3).x(), tex.getVec(3).y());
    gl.glVertex3f  (vts.getVec(3).x(), vts.getVec(3).y(), vts.getVec(3).z());
    gl.glTexCoord2f(tex.getVec(1).x(), tex.getVec(1).y());
    gl.glVertex3f  (vts.getVec(1).x(), vts.getVec(1).y(), vts.getVec(1).z());
    gl.glTexCoord2f(tex.getVec(2).x(), tex.getVec(2).y());
    gl.glVertex3f  (vts.getVec(2).x(), vts.getVec(2).y(), vts.getVec(2).z());
    gl.glEnd();
  }

  /** Returns the rotation axis for this transition. By default this
      axis is not set, so if an interpolator is specified for the
      rotation angle the axis of rotation must be specified as
      well. */
  public Vec3f             getRotationAxis() { return axis; }

  /** Sets the rotation axis for this transition. By default this axis
      is not set, so if an interpolator is specified for the rotation
      angle the axis of rotation must be specified as well. */
  public void              setRotationAxis(Vec3f axis) { this.axis.set(axis); }

  /** Returns the interpolator for the rotation angle for this
      transition. By default this interpolator is null, meaning that
      the transition does not perform any rotation. */
  public InterpolatedFloat getRotationAngle() { return angle; }

  /** Sets the interpolator for the rotation angle for this
      transition. By default this interpolator is null, meaning that
      the transition does not perform any rotation. */
  public void              setRotationAngle(InterpolatedFloat angle) { this.angle = angle; }

  /** Returns the pivot point for this transition's rotation. By
      default this is set to the origin, which corresponds to the
      upper-left corner of the component being animated. */
  public Vec3f getPivotPoint() { return pivot; }

  /** Sets the pivot point for this transition's rotation. By default
      this is set to the origin, which corresponds to the upper-left
      corner of the component being animated. */
  public void  setPivotPoint(Vec3f point) { pivot.set(point); }

  /** Returns the interpolator for this transition's translation. By
      default the translation is a fixed vector from the origin to the
      upper left corner of the component being animated; the vertices
      are specified relative to that point in the +x and -y
      directions. */
  public InterpolatedVec3f getTranslation() { return translation; }

  /** Sets the interpolator for this transition's translation. By
      default the translation is a fixed vector from the origin to the
      upper left corner of the component being animated; the vertices
      are specified relative to that point in the +x and -y
      directions. */
  public void              setTranslation(InterpolatedVec3f interp) { translation = interp; }

  /** Returns the interpolator for the vertices of this transition's
      component when drawn on screen. By default the vertices are
      specified with the upper-left corner of the component at the
      origin and the component extending in the +x (right) and -y
      (down) directions; the units of the vertices correspond to the
      on-screen size of the component in pixels. The component's
      location is specified using the translation interpolator. */
  public InterpolatedQuad3f getVertices() { return vertices; }

  /** Sets the interpolator for the vertices of this transition's
      component when drawn on screen. By default the vertices are
      specified with the upper-left corner of the component at the
      origin and the component extending in the +x (right) and -y
      (down) directions; the units of the vertices correspond to the
      on-screen size of the component in pixels. The component's
      location is specified using the translation interpolator. */
  public void               setVertices(InterpolatedQuad3f interp) { vertices = interp; }

  /** Returns the interpolator for the texture coordinates of this
      transition's component when drawn on screen. By default these
      are set so that at either the start or end point (depending on
      whether this is an "in" or "out" transition) the texture
      coordinates specify rendering of the component's entire
      contents. */
  public InterpolatedQuad2f getTexCoords() { return texcoords; }

  /** Sets the interpolator for the texture coordinates of this
      transition's component when drawn on screen. By default these
      are set so that at either the start or end point (depending on
      whether this is an "in" or "out" transition) the texture
      coordinates specify rendering of the component's entire
      contents. */
  public void               setTexCoords(InterpolatedQuad2f interp) { texcoords = interp; }

  /** Returns the interpolator for this component's alpha value. */
  public InterpolatedFloat  getAlpha() { return alpha; }

  /** Sets the interpolator for this component's alpha value. */
  public void               setAlpha(InterpolatedFloat interp) { alpha = interp; }
}