Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectNames.java @ a1c83f28

1 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 6a06a912 Leszek Koltunski
package org.distorted.library;
21
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23 476bbc81 Leszek Koltunski
/**
24
 * Names of Effects one can apply to DistortedObjects.
25 0df17fad Leszek Koltunski
 * <p>
26 b911dc09 Leszek Koltunski
 * Effect's 'Type' is one of the constants defined in {@link EffectTypes}.
27 e25d0dde Leszek Koltunski
 * </p>
28
 * <p>
29 8298e6af Leszek Koltunski
 * Effect's 'Uniforms' are a vector of 7 (matrix effects) 12 (vertex) or 8 (fragment) floats, which
30 e25d0dde Leszek Koltunski
 * 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 476bbc81 Leszek Koltunski
 */
42
public enum EffectNames
43 6a06a912 Leszek Koltunski
  {
44
  // EFFECT NAME /////// EFFECT TYPE ////////////// UNITY /////////////////////////
45 0df17fad Leszek Koltunski
46
  /////////////////////////////////////////////////////////////////////////////////
47
  // MATRIX EFFECTS.
48
  // Always 7 Uniforms: 4 per-effect interpolated values + 3 dimensional center.
49
 /**
50
   * Rotate the whole Object around a center point (in angle-axis notation).
51
   * <p>
52 e25d0dde Leszek Koltunski
   * Uniforms: (angle,axisX,axisY,axisZ,centerX,centerY,centerZ)
53 3695d6fa Leszek Koltunski
   * <p>
54 0df17fad Leszek Koltunski
   * Unity: angle==0
55
   */
56 a1c83f28 Leszek Koltunski
  ROTATE           ( EffectTypes.MATRIX  ,   new float[] {0.0f}           , 1, false, true ),
57 0df17fad Leszek Koltunski
 /**
58
   * Rotate the whole Object around a center point (in quaternion notation).
59
   * <p>
60 e25d0dde Leszek Koltunski
   * Uniforms: (quatX,quatY,quatZ,quatW,centerX,centerY,centerZ)
61 3695d6fa Leszek Koltunski
   * <p>
62 0df17fad Leszek Koltunski
   * Unity: (quatX,quatY,quatZ) = (0,0,0)
63
   */
64 a1c83f28 Leszek Koltunski
  QUATERNION       ( EffectTypes.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 4, false, true ),
65 0df17fad Leszek Koltunski
 /**
66
   * Move the whole Object by a vector.
67
   * <p>
68 e25d0dde Leszek Koltunski
   * Uniforms: (vectorX,vectorY,vectorZ,UNUSED,UNUSED,UNUSED,UNUSED)
69 3695d6fa Leszek Koltunski
   * <p>
70 0df17fad Leszek Koltunski
   * Unity: (vectorX,vectorY,vectorZ) = (0,0,0)
71
   */
72 a1c83f28 Leszek Koltunski
  MOVE             ( EffectTypes.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 3, false, false ),
73 0df17fad Leszek Koltunski
 /**
74
   * Scale the whole Object independently in all 3 dimensions.
75
   * <p>
76 e25d0dde Leszek Koltunski
   * Uniforms: (scaleX,scaleY,scaleZ,UNUSED,UNUSED,UNUSED,UNUSED)
77 3695d6fa Leszek Koltunski
   * <p>
78 0df17fad Leszek Koltunski
   * Unity: (scaleX,scaleY,scaleZ) = (1,1,1)
79
   */
80 a1c83f28 Leszek Koltunski
  SCALE            ( EffectTypes.MATRIX  ,   new float[] {1.0f,1.0f,1.0f} , 3, false, false ),
81 0df17fad Leszek Koltunski
 /**
82
   * Shear the whole Object in 3 dimensions around a center point.
83
   * <p>
84 e25d0dde Leszek Koltunski
   * Uniforms: (shearX,shearY,shearZ,UNUSED,centerX,centerY,centerZ)
85 3695d6fa Leszek Koltunski
   * <p>
86 0df17fad Leszek Koltunski
   * Unity:  (shearX,shearY,shearZ) = (0,0,0)
87
   */
88 a1c83f28 Leszek Koltunski
  SHEAR            ( EffectTypes.MATRIX  ,   new float[] {0.0f,0.0f,0.0f} , 3, false, true ),
89 1e438fc7 Leszek Koltunski
  // add new Matrix effects here...
90 0df17fad Leszek Koltunski
91
 /////////////////////////////////////////////////////////////////////////////////
92
 // VERTEX EFFECTS
93 8298e6af Leszek Koltunski
 // Always 12 Uniforms: 6 per-effect interpolated values, 2-dimensional center of
94
 // the effect, 4-dimensional Region
95 0df17fad Leszek Koltunski
 /**
96
   * Apply a 3D vector of force to area around a point on the surface of the Object.
97
   * <p>
98 02ef26bc Leszek Koltunski
   * Uniforms: (forceX ,forceY ,forceZ  ,UNUSED  ,
99 3695d6fa Leszek Koltunski
   *            UNUSED , UNUSED,centerX ,centerY ,
100
   *            regionX,regionY,regionRX,regionRY)
101
   * <p>
102 0df17fad Leszek Koltunski
   * Unity: (forceX,forceY,forceZ) = (0,0,0)
103
   */
104 a1c83f28 Leszek Koltunski
  DISTORT          ( EffectTypes.VERTEX  ,   new float[] {0.0f,0.0f,0.0f} , 3, true, true ),
105 0df17fad Leszek Koltunski
 /**
106
   * Deform the whole Object by applying a 2D vector of force to a center point.
107
   * <p>
108 02ef26bc Leszek Koltunski
   * Uniforms: (forceX,forceY,UNUSED,UNUSED,
109
   *            UNUSED,UNUSED,centerX,centerY,
110
   *            UNUSED,UNUSED,UNUSED,UNUSED)
111 3695d6fa Leszek Koltunski
   * <p>
112 0df17fad Leszek Koltunski
   * Unity: (forceX,forceY) = (0,0)
113
   */
114 a1c83f28 Leszek Koltunski
  DEFORM           ( EffectTypes.VERTEX  ,   new float[] {0.0f,0.0f}      , 3, false, true ),
115 0df17fad Leszek Koltunski
 /**
116
   * Pull (or push away) all points around a center point to (from) it.
117
   * <p>
118 02ef26bc Leszek Koltunski
   * Uniforms: (sinkFactor,UNUSED,UNUSED,UNUSED,
119
   *            UNUSED,UNUSED,centerX,centerY,
120
   *            regionX,regionY,regionRX,regionRY)
121 3695d6fa Leszek Koltunski
   * <p>
122 0df17fad Leszek Koltunski
   * Unity: sinkFactor = 1
123
   */
124 a1c83f28 Leszek Koltunski
  SINK             ( EffectTypes.VERTEX  ,   new float[] {1.0f}           , 1, true, true ),
125 0df17fad Leszek Koltunski
 /**
126
   * Smoothly rotate a limited area around a center point.
127
   * <p>
128 02ef26bc Leszek Koltunski
   * Uniforms: (swirlAngle,UNUSED,UNUSED,UNUSED,
129 35bece36 Leszek Koltunski
   *            UNUSED, UNUSED,centerX,centerY,
130 02ef26bc Leszek Koltunski
   *            regionX,regionY,regionRX,regionRY)
131 3695d6fa Leszek Koltunski
   * <p>
132 0df17fad Leszek Koltunski
   * Unity: swirlAngle = 0
133
   */
134 a1c83f28 Leszek Koltunski
  SWIRL            ( EffectTypes.VERTEX  ,   new float[] {0.0f}           , 1, true, true ),
135 4fde55a0 Leszek Koltunski
  /**
136
   * Directional sinusoidal wave effect. The direction of the wave is given by the 'angle'
137 b911dc09 Leszek Koltunski
   * parameters. Details: {@link DistortedObject#wave(Data5D,Data2D)}
138 4fde55a0 Leszek Koltunski
   * <p>
139 291705f6 Leszek Koltunski
   * Uniforms: (amplitude,length,phase,angleAlpha,
140 3695d6fa Leszek Koltunski
   *            angleBeta, UNUSED,centerX,centerY,
141 02ef26bc Leszek Koltunski
   *            regionX,regionY,regionRX,regionRY)
142 3695d6fa Leszek Koltunski
   * <p>
143 4fde55a0 Leszek Koltunski
   * Unity: amplitude  = 0
144
   */
145 a1c83f28 Leszek Koltunski
  WAVE             ( EffectTypes.VERTEX  ,   new float[] {0.0f}           , 5, true, true ),
146 6a06a912 Leszek Koltunski
  // add new Vertex Effects here...
147 0df17fad Leszek Koltunski
148
 /////////////////////////////////////////////////////////////////////////////////
149
 // FRAGMENT EFFECTS
150
 // Always 8 Uniforms: 4-per effect interpolated values, 4 dimensional Region.
151
 /**
152
   * Make a given Region (partially) transparent.
153
   * <p>
154 e25d0dde Leszek Koltunski
   * Uniforms: (transparencyLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
155 3695d6fa Leszek Koltunski
   * <p>
156 0df17fad Leszek Koltunski
   * Unity: transparencyLevel = 1
157
   */
158 a1c83f28 Leszek Koltunski
  ALPHA            ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
159 0df17fad Leszek Koltunski
 /**
160
   * Make a given Region (partially) transparent.
161
   * Effect smoothly fades towards the edges of the region.
162
   * <p>
163 e25d0dde Leszek Koltunski
   * Uniforms: (transparencyLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
164 0df17fad Leszek Koltunski
   * Unity: transparencyLevel = 1
165
   */
166 a1c83f28 Leszek Koltunski
  SMOOTH_ALPHA     ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
167 0df17fad Leszek Koltunski
 /**
168
   * Blend current color in the texture with a given color.
169
   * <p>
170 e25d0dde Leszek Koltunski
   * Uniforms: (blendLevel,colorR,colorG,colorB, regionX, regionY, regionRX, regionRY)
171 3695d6fa Leszek Koltunski
   * <p>
172 0df17fad Leszek Koltunski
   * Unity: blendLevel = 0
173
   */
174 a1c83f28 Leszek Koltunski
  CHROMA           ( EffectTypes.FRAGMENT,   new float[] {0.0f}           , 4, true, false ),
175 0df17fad Leszek Koltunski
 /**
176
   * Smoothly blend current color in the texture with a given color.
177
   * <p>
178 e25d0dde Leszek Koltunski
   * Uniforms: (blendLevel,colorR,colorG,colorB, regionX, regionY, regionRX, regionRY)
179 0df17fad Leszek Koltunski
   * Unity: blendLevel = 0
180
   */
181 a1c83f28 Leszek Koltunski
  SMOOTH_CHROMA    ( EffectTypes.FRAGMENT,   new float[] {0.0f}           , 4, true, false ),
182 0df17fad Leszek Koltunski
 /**
183
   * Change brightness level of a given Region.
184
   * <p>
185 e25d0dde Leszek Koltunski
   * Uniforms: (brightnessLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
186 3695d6fa Leszek Koltunski
   * <p>
187 0df17fad Leszek Koltunski
   * Unity: brightnessLevel = 1
188
   */
189 a1c83f28 Leszek Koltunski
  BRIGHTNESS       ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
190 0df17fad Leszek Koltunski
 /**
191
   * Smoothly change brightness level of a given Region.
192
   * <p>
193 e25d0dde Leszek Koltunski
   * Uniforms: (brightnessLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
194 3695d6fa Leszek Koltunski
   * <p>
195 0df17fad Leszek Koltunski
   * Unity: brightnessLevel = 1
196
   */
197 a1c83f28 Leszek Koltunski
  SMOOTH_BRIGHTNESS( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
198 0df17fad Leszek Koltunski
 /**
199
   * Change saturation level of a given Region.
200
   * <p>
201 e25d0dde Leszek Koltunski
   * Uniforms: (saturationLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
202 3695d6fa Leszek Koltunski
   * <p>
203 0df17fad Leszek Koltunski
   * Unity: saturationLevel = 1
204
   */
205 a1c83f28 Leszek Koltunski
  SATURATION       ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
206 0df17fad Leszek Koltunski
 /**
207
   * Smoothly change saturation level of a given Region.
208
   * <p>
209 e25d0dde Leszek Koltunski
   * Uniforms: (saturationLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
210 3695d6fa Leszek Koltunski
   * <p>
211 0df17fad Leszek Koltunski
   * Unity: saturationLevel = 1
212
   */
213 a1c83f28 Leszek Koltunski
  SMOOTH_SATURATION( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
214 0df17fad Leszek Koltunski
 /**
215
   * Change contrast level of a given Region.
216
   * <p>
217 e25d0dde Leszek Koltunski
   * Uniforms: (contrastLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
218 3695d6fa Leszek Koltunski
   * <p>
219 0df17fad Leszek Koltunski
   * Unity: contrastLevel = 1
220
   */
221 a1c83f28 Leszek Koltunski
  CONTRAST         ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false ),
222 0df17fad Leszek Koltunski
 /**
223
   * Smoothly change contrast level of a given Region.
224
   * <p>
225 e25d0dde Leszek Koltunski
   * Uniforms: (contrastLevel,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY)
226 3695d6fa Leszek Koltunski
   * <p>
227 0df17fad Leszek Koltunski
   * Unity: contrastLevel = 1
228
   */
229 a1c83f28 Leszek Koltunski
  SMOOTH_CONTRAST  ( EffectTypes.FRAGMENT,   new float[] {1.0f}           , 1, true, false );
230 6a06a912 Leszek Koltunski
  // add new Fragment effects here...
231
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233
  
234
  private static final int MAXDIM = 4;  // maximum supported dimension of an effect  
235
  
236 e8c81a8e Leszek Koltunski
  private final EffectTypes type;
237
  private final float[] unity;
238 1beb6f13 Leszek Koltunski
  private final int dimension;
239 a1c83f28 Leszek Koltunski
  private final boolean supportsR;
240
  private final boolean supportsC;
241
242 e8c81a8e Leszek Koltunski
  private static final float[] unities;
243 1beb6f13 Leszek Koltunski
  private static final int[] unityDimensions;
244 e8c81a8e Leszek Koltunski
  private static final int[] dimensions;
245 a1c83f28 Leszek Koltunski
  private static final boolean[] supportsRegion;
246
  private static final boolean[] supportsCenter;
247 e8c81a8e Leszek Koltunski
  private static final EffectNames[] names;
248
249 6a06a912 Leszek Koltunski
  static
250
    {
251
    int len = values().length;
252
    int i=0;
253
    
254 1beb6f13 Leszek Koltunski
    unityDimensions = new int[len];
255
    dimensions      = new int[len];
256 a1c83f28 Leszek Koltunski
    supportsRegion  = new boolean[len];
257
    supportsCenter  = new boolean[len];
258 1beb6f13 Leszek Koltunski
    unities         = new float[MAXDIM*len];
259
    names           = new EffectNames[len];
260 e8c81a8e Leszek Koltunski
261 6a06a912 Leszek Koltunski
    for(EffectNames name: EffectNames.values())
262
      {
263 1beb6f13 Leszek Koltunski
      unityDimensions[i] = (name.unity==null ? 0 : name.unity.length);
264
      dimensions[i]      = name.dimension;
265 a1c83f28 Leszek Koltunski
      supportsRegion[i]  = name.supportsR;
266
      supportsCenter[i]  = name.supportsC;
267 1beb6f13 Leszek Koltunski
      names[i]           = name;
268 e8c81a8e Leszek Koltunski
269 1beb6f13 Leszek Koltunski
      switch(unityDimensions[i])
270 6a06a912 Leszek Koltunski
        {
271
        case 4: unities[MAXDIM*i+3] = name.unity[3];
272
        case 3: unities[MAXDIM*i+2] = name.unity[2];
273
        case 2: unities[MAXDIM*i+1] = name.unity[1];
274 0318e7e3 Leszek Koltunski
        case 1: unities[MAXDIM*i  ] = name.unity[0];
275 6a06a912 Leszek Koltunski
        case 0: break;
276
        }
277
      
278
      i++;  
279
      }
280
    }
281
  
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283
  
284 a1c83f28 Leszek Koltunski
  EffectNames(EffectTypes type, float[] unity, int dimension, boolean supportsR, boolean supportsC)
285 6a06a912 Leszek Koltunski
    {
286 a1c83f28 Leszek Koltunski
    this.type      = type;
287
    this.unity     = unity;
288
    this.dimension = dimension;
289
    this.supportsR = supportsR;
290
    this.supportsC = supportsC;
291 6a06a912 Leszek Koltunski
    }
292
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294 c6e1c219 Leszek Koltunski
295 1e438fc7 Leszek Koltunski
  static EffectTypes getType(int ordinal)
296 6a06a912 Leszek Koltunski
    {
297 e8c81a8e Leszek Koltunski
    return names[ordinal].type;
298
    }
299 b3618cb5 Leszek Koltunski
300 e8c81a8e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
301
302
  static EffectNames getName(int ordinal)
303
    {
304
    return names[ordinal];
305 6a06a912 Leszek Koltunski
    }
306
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308
309
  static void fillWithUnities(int ordinal, float[] buffer, int index)
310
    {
311 1beb6f13 Leszek Koltunski
    switch(unityDimensions[ordinal])
312 6a06a912 Leszek Koltunski
      {
313
      case 0: break;
314 0318e7e3 Leszek Koltunski
      case 1: buffer[index  ]=unities[MAXDIM*ordinal  ];
315 6a06a912 Leszek Koltunski
              break;
316 0318e7e3 Leszek Koltunski
      case 2: buffer[index  ]=unities[MAXDIM*ordinal  ];
317 6a06a912 Leszek Koltunski
              buffer[index+1]=unities[MAXDIM*ordinal+1];
318
              break;
319 0318e7e3 Leszek Koltunski
      case 3: buffer[index  ]=unities[MAXDIM*ordinal  ];
320 6a06a912 Leszek Koltunski
              buffer[index+1]=unities[MAXDIM*ordinal+1]; 
321
              buffer[index+2]=unities[MAXDIM*ordinal+2];
322
              break;
323 0318e7e3 Leszek Koltunski
      case 4: buffer[index  ]=unities[MAXDIM*ordinal  ];
324 6a06a912 Leszek Koltunski
              buffer[index+1]=unities[MAXDIM*ordinal+1]; 
325
              buffer[index+2]=unities[MAXDIM*ordinal+2];
326
              buffer[index+3]=unities[MAXDIM*ordinal+3];
327
              break;
328
      }  
329
    }
330
  
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332
  
333
  static boolean isUnity(int ordinal, float[] buffer, int index)
334
    {
335 1beb6f13 Leszek Koltunski
    switch(unityDimensions[ordinal])
336 6a06a912 Leszek Koltunski
      {
337
      case 0: return true;
338 0318e7e3 Leszek Koltunski
      case 1: return buffer[index  ]==unities[MAXDIM*ordinal  ];
339
      case 2: return buffer[index  ]==unities[MAXDIM*ordinal  ] &&
340 6a06a912 Leszek Koltunski
                     buffer[index+1]==unities[MAXDIM*ordinal+1];
341 0318e7e3 Leszek Koltunski
      case 3: return buffer[index  ]==unities[MAXDIM*ordinal  ] &&
342 6a06a912 Leszek Koltunski
                     buffer[index+1]==unities[MAXDIM*ordinal+1] && 
343
                     buffer[index+2]==unities[MAXDIM*ordinal+2];
344 0318e7e3 Leszek Koltunski
      case 4: return buffer[index  ]==unities[MAXDIM*ordinal  ] &&
345 6a06a912 Leszek Koltunski
                     buffer[index+1]==unities[MAXDIM*ordinal+1] && 
346
                     buffer[index+2]==unities[MAXDIM*ordinal+2] &&
347
                     buffer[index+3]==unities[MAXDIM*ordinal+3];
348
      }
349
   
350
    return false;
351
    }
352
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354 476bbc81 Leszek Koltunski
// PUBLIC API
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356
/**
357
 * Returns the Type of an individual Effect. For example, EffectNames.ROTATION.getType() will
358
 * return EffectTypes.MATRIX.
359
 * @return type of the effect.
360
 */
361
  public EffectTypes getType()
362
    {
363
    return type;
364
    }
365 ac094579 Leszek Koltunski
366 1beb6f13 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
367
368 ac094579 Leszek Koltunski
/**
369
 * Returns the dimension of an Effect (in other words, the number of interpolated values).
370
 * @return dimension of the Effect.
371
 */
372
  public int getDimension() { return dimensions[ordinal()]; }
373 1beb6f13 Leszek Koltunski
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375
376
/**
377
 * Do we support being masked by a Region?
378
 * @return true if the Effect supports being masked with a Region.
379
 */
380 a1c83f28 Leszek Koltunski
  public boolean supportsRegion() { return supportsRegion[ordinal()]; }
381
382
///////////////////////////////////////////////////////////////////////////////////////////////////
383
384
/**
385
 * Does this Effect have a center?
386
 * @return true if the Effect has a center.
387
 */
388
  public boolean supportsCenter() { return supportsCenter[ordinal()]; }
389 1beb6f13 Leszek Koltunski
390 d333eb6b Leszek Koltunski
  }