Project

General

Profile

Download (8.83 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / effect / EffectName.java @ 7625e47e

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.library.effect;
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
/**
24
 * Names of Effects one can add to the DistortedEffects queues.
25
 * <p>
26
 * Effect's 'Type' is one of the constants defined in {@link EffectType}.
27
 * </p>
28
 * <p>
29
 * Effect's 'Uniforms' are a vector of 7 (matrix effects) 12 (vertex) or 8 (fragment) floats, which
30
 * together form full information how to compute a given effect.
31
 * Typically, some of those values will be Interpolated in CPU (by one of the 'EffectQueueX.compute()'
32
 * methods) and the effect of such Interpolation sent to the Shaders.
33
 * </p>
34
 * <p>
35
 * Effect's 'Unity' is such a particular vector of its 'interpolated values' which makes the
36
 * effect NULL. For example, if the effect is 'MOVE' by a 3-dimensional vector, then a 'NULL
37
 * MOVE' is a MOVE by vector (0,0,0), thus (0,0,0) is the unity of the MOVE effect.
38
 * This is used by the EffectQueue classes to decide if the final form of the Effect is NULL - and
39
 * thus if it can safely be removed from Effect Queues without affecting the visual in any way.
40
 * </p>
41
 */
42

    
43
public enum EffectName
44
  {
45
  // EFFECT NAME /////// EFFECT TYPE /////// EFFECT UNITY //////////// DIM // REGION // CENTER
46
  ROTATE           ( EffectType.MATRIX  ,   new float[] {0.0f}           , 4, false, true  ),
47
  QUATERNION       ( EffectType.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 4, false, true  ),
48
  MOVE             ( EffectType.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 3, false, false ),
49
  SCALE            ( EffectType.MATRIX  ,   new float[] {1.0f,1.0f,1.0f} , 3, false, false ),
50
  SHEAR            ( EffectType.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 3, false, true  ),
51
  DISTORT          ( EffectType.VERTEX  ,   new float[] {0.0f,0.0f,0.0f} , 3, true , true  ),
52
  DEFORM           ( EffectType.VERTEX  ,   new float[] {0.0f,0.0f,0.0f} , 3, true , true  ),
53
  SINK             ( EffectType.VERTEX  ,   new float[] {1.0f}           , 1, true , true  ),
54
  PINCH            ( EffectType.VERTEX  ,   new float[] {1.0f}           , 2, true , true  ),
55
  SWIRL            ( EffectType.VERTEX  ,   new float[] {0.0f}           , 1, true , true  ),
56
  WAVE             ( EffectType.VERTEX  ,   new float[] {0.0f}           , 5, true , true  ),
57
  ALPHA            ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
58
  SMOOTH_ALPHA     ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
59
  CHROMA           ( EffectType.FRAGMENT,   new float[] {0.0f}           , 4, true , false ),
60
  SMOOTH_CHROMA    ( EffectType.FRAGMENT,   new float[] {0.0f}           , 4, true , false ),
61
  BRIGHTNESS       ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
62
  SMOOTH_BRIGHTNESS( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
63
  SATURATION       ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
64
  SMOOTH_SATURATION( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
65
  CONTRAST         ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
66
  SMOOTH_CONTRAST  ( EffectType.FRAGMENT,   new float[] {1.0f}           , 1, true , false ),
67
  BLUR             ( EffectType.POSTPROCESS,new float[] {0.0f}           , 1, false, false ),
68
  GLOW             ( EffectType.POSTPROCESS,new float[] {0.0f}           , 1, false, false );
69

    
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

    
72
  private static final int MAXDIM = 4;  // maximum supported dimension of effect's unity
73
  public static final int LENGTH = values().length;
74

    
75
  private final EffectType type;
76
  private final float[] unity;
77
  private final int dimension;
78
  private final boolean supportsR;
79
  private final boolean supportsC;
80

    
81
  private static final float[] unities;
82
  private static final int[] unityDimensions;
83
  private static final int[] dimensions;
84
  private static final boolean[] supportsRegion;
85
  private static final boolean[] supportsCenter;
86
  private static final EffectName[] names;  // copy the values() to a local variable so that we
87
                                            // don't have to keep recreating the array every time
88
  static
89
    {
90
    int i=0;
91

    
92
    unities         = new float[MAXDIM*LENGTH];
93
    unityDimensions = new int[LENGTH];
94
    dimensions      = new int[LENGTH];
95
    supportsRegion  = new boolean[LENGTH];
96
    supportsCenter  = new boolean[LENGTH];
97
    names           = new EffectName[LENGTH];
98

    
99
    for(EffectName name: EffectName.values())
100
      {
101
      unityDimensions[i] = (name.unity==null ? 0 : name.unity.length);
102
      dimensions[i]      = name.dimension;
103
      supportsRegion[i]  = name.supportsR;
104
      supportsCenter[i]  = name.supportsC;
105
      names[i]           = name;
106

    
107
      switch(unityDimensions[i])
108
        {
109
        case 4: unities[MAXDIM*i+3] = name.unity[3];
110
        case 3: unities[MAXDIM*i+2] = name.unity[2];
111
        case 2: unities[MAXDIM*i+1] = name.unity[1];
112
        case 1: unities[MAXDIM*i  ] = name.unity[0];
113
        case 0: break;
114
        }
115

    
116
      i++;
117
      }
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  float[] getUnity()
123
    {
124
    return unity;
125
    }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
  EffectName(EffectType type, float[] unity, int dimension, boolean supportsR, boolean supportsC)
130
    {
131
    this.type      = type;
132
    this.unity     = unity;
133
    this.dimension = dimension;
134
    this.supportsR = supportsR;
135
    this.supportsC = supportsC;
136
    }
137

    
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
// PUBLIC API
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141
/**
142
 * Returns the Type of an individual Effect. For example, EffectName.ROTATION.getType() will
143
 * return EffectType.MATRIX.
144
 * @return type of the effect.
145
 */
146
  public EffectType getType()
147
    {
148
    return type;
149
    }
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
/**
153
 * Returns the i-th EffectName.
154
 * <p>
155
 * If you want to loop over all possible Effects, you need this.
156
 */
157
  public static EffectName getName(int ordinal)
158
    {
159
    return names[ordinal];
160
    }
161

    
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163
/**
164
 * Returns the dimension of an Effect (in other words, the number of interpolated values).
165
 * @return dimension of the Effect.
166
 */
167
  public int getDimension() { return dimensions[ordinal()]; }
168

    
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170
/**
171
 * Do we support being masked by a Region?
172
 * @return true if the Effect supports being masked with a Region.
173
 */
174
  public boolean supportsRegion() { return supportsRegion[ordinal()]; }
175

    
176
///////////////////////////////////////////////////////////////////////////////////////////////////
177
/**
178
 * Does this Effect have a center?
179
 * @return true if the Effect has a center.
180
 */
181
  public boolean supportsCenter() { return supportsCenter[ordinal()]; }
182
  }
183

    
(2-2/25)