Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedEffects.java @ 40f0cea6

1 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 2e569ff6 Leszek Koltunski
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3 d333eb6b Leszek Koltunski
//                                                                                               //
4 46b572b5 Leszek Koltunski
// This file is part of Distorted.                                                               //
5 d333eb6b Leszek Koltunski
//                                                                                               //
6 2e569ff6 Leszek Koltunski
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10 d333eb6b Leszek Koltunski
//                                                                                               //
11 2e569ff6 Leszek Koltunski
// This library is distributed in the hope that it will be useful,                               //
12 d333eb6b Leszek Koltunski
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13 2e569ff6 Leszek Koltunski
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15 d333eb6b Leszek Koltunski
//                                                                                               //
16 2e569ff6 Leszek Koltunski
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 fe82a979 Leszek Koltunski
package org.distorted.library.main;
22 6a06a912 Leszek Koltunski
23 fe82a979 Leszek Koltunski
import org.distorted.library.effect.Effect;
24 da9b3f07 Leszek Koltunski
import org.distorted.library.effect.EffectName;
25 809dcae3 Leszek Koltunski
import org.distorted.library.effectqueue.EffectQueue;
26 da9b3f07 Leszek Koltunski
import org.distorted.library.effect.EffectType;
27 c638c1b0 Leszek Koltunski
28 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
29 b329f352 Leszek Koltunski
/**
30 faa3ff56 Leszek Koltunski
 * Class containing Matrix, Vertex, Fragment and Postprocessing effect queues.
31 b73dcaa7 Leszek Koltunski
 * <p>
32 715e7726 Leszek Koltunski
 * The queues hold actual effects to be applied to a given (InputSurface,MeshBase) combo.
33 b329f352 Leszek Koltunski
 */
34 86d322b5 Leszek Koltunski
public class DistortedEffects
35 d425545a Leszek Koltunski
  {
36 8b36dabf Leszek Koltunski
  private final long mID;
37
  private final EffectQueue[] mQueues;
38 3d590d8d Leszek Koltunski
39 55c14a19 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
40 809dcae3 Leszek Koltunski
/**
41
 * @y.exclude
42
 */
43
  public EffectQueue[] getQueues()
44 d425545a Leszek Koltunski
    {
45 a0397f32 Leszek Koltunski
    return mQueues;
46 80b3acf6 Leszek Koltunski
    }
47
48 8e34674e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
49
// PUBLIC API
50 ada90d33 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
51 d425545a Leszek Koltunski
/**
52 4e2382f3 Leszek Koltunski
 * Create empty effect queue.
53 d425545a Leszek Koltunski
 */
54 044b5494 Leszek Koltunski
 public DistortedEffects()
55 d425545a Leszek Koltunski
    {
56 3543a3cf Leszek Koltunski
    mID = InternalStackFrameList.getNextEffectsID();
57 a0397f32 Leszek Koltunski
    mQueues = new EffectQueue[EffectType.LENGTH];
58 20dbec0e Leszek Koltunski
    EffectQueue.allocateQueues(mQueues,null,0);
59 d425545a Leszek Koltunski
    }
60 ada90d33 Leszek Koltunski
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62 d425545a Leszek Koltunski
/**
63 4e2382f3 Leszek Koltunski
 * Copy constructor.
64 d425545a Leszek Koltunski
 * <p>
65
 * Whatever we do not clone gets created just like in the default constructor.
66
 *
67
 * @param dc    Source object to create our object from
68
 * @param flags A bitmask of values specifying what to copy.
69 e6ab30eb Leszek Koltunski
 *              For example, CLONE_VERTEX | CLONE_MATRIX.
70 d425545a Leszek Koltunski
 */
71 421c2728 Leszek Koltunski
  public DistortedEffects(DistortedEffects dc, int flags)
72 d425545a Leszek Koltunski
    {
73 3543a3cf Leszek Koltunski
    mID = InternalStackFrameList.getNextEffectsID();
74 a0397f32 Leszek Koltunski
    mQueues = new EffectQueue[EffectType.LENGTH];
75 20dbec0e Leszek Koltunski
    EffectQueue.allocateQueues(mQueues,dc.getQueues(),flags);
76 d425545a Leszek Koltunski
    }
77 6a06a912 Leszek Koltunski
78
///////////////////////////////////////////////////////////////////////////////////////////////////
79
/**
80 4e2382f3 Leszek Koltunski
 * Returns unique ID of this instance.
81
 *
82
 * @return ID of the object.
83 6a06a912 Leszek Koltunski
 */
84 4e2382f3 Leszek Koltunski
  public long getID()
85 d425545a Leszek Koltunski
      {
86 4e2382f3 Leszek Koltunski
      return mID;
87 d425545a Leszek Koltunski
      }
88 4e2382f3 Leszek Koltunski
89 6c3a8db8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
90
/**
91
 * Return if this queue contains effect with a given ID.
92
 */
93
  public boolean exists(long id)
94
    {
95
    int num = (int)(id&EffectType.MASK);
96
    return mQueues[num].exists(id);
97
    }
98
99 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
100
/**
101 d07f2950 Leszek Koltunski
 * Aborts all Effects.
102
 * @return Number of effects aborted.
103 6a06a912 Leszek Koltunski
 */
104 d425545a Leszek Koltunski
  public int abortAllEffects()
105 13687207 leszek
    {
106 a0397f32 Leszek Koltunski
    int aborted = 0;
107
108
    for( int i=0; i<EffectType.LENGTH; i++)
109
      {
110 ceed2df6 Leszek Koltunski
      aborted += mQueues[i].removeAll(true);
111 a0397f32 Leszek Koltunski
      }
112
113
    return aborted;
114 13687207 leszek
    }
115 6a06a912 Leszek Koltunski
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117
/**
118 d07f2950 Leszek Koltunski
 * Aborts all Effects of a given type, for example all MATRIX Effects.
119 6a06a912 Leszek Koltunski
 * 
120 da9b3f07 Leszek Koltunski
 * @param type one of the constants defined in {@link EffectType}
121 d07f2950 Leszek Koltunski
 * @return Number of effects aborted.
122 6a06a912 Leszek Koltunski
 */
123 da9b3f07 Leszek Koltunski
  public int abortByType(EffectType type)
124 d425545a Leszek Koltunski
    {
125 a0397f32 Leszek Koltunski
    int num = type.ordinal();
126 ceed2df6 Leszek Koltunski
    return mQueues[num].removeAll(true);
127 d425545a Leszek Koltunski
    }
128 47316d20 leszek
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130
/**
131 faa3ff56 Leszek Koltunski
 * Aborts an Effect by its ID.
132 47316d20 leszek
 *
133
 * @param id the Id of the Effect to be removed, as returned by getID().
134
 * @return Number of effects aborted.
135
 */
136
  public int abortById(long id)
137
    {
138 a0397f32 Leszek Koltunski
    int num = (int)(id&EffectType.MASK);
139
    return mQueues[num].removeById(id);
140 47316d20 leszek
    }
141
142 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
143
/**
144
 * Aborts a single Effect.
145
 * 
146 6bb59aad Leszek Koltunski
 * @param effect the Effect we want to abort.
147 476bbc81 Leszek Koltunski
 * @return number of Effects aborted. Always either 0 or 1.
148 6a06a912 Leszek Koltunski
 */
149 6bb59aad Leszek Koltunski
  public int abortEffect(Effect effect)
150 d425545a Leszek Koltunski
    {
151 a0397f32 Leszek Koltunski
    int num = effect.getType().ordinal();
152
    return mQueues[num].removeEffect(effect);
153 d425545a Leszek Koltunski
    }
154 6a06a912 Leszek Koltunski
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
/**
157 e8c81a8e Leszek Koltunski
 * Abort all Effects of a given name, for example all rotations.
158 6a06a912 Leszek Koltunski
 * 
159 da9b3f07 Leszek Koltunski
 * @param name one of the constants defined in {@link EffectName}
160 476bbc81 Leszek Koltunski
 * @return number of Effects aborted.
161 6a06a912 Leszek Koltunski
 */
162 da9b3f07 Leszek Koltunski
  public int abortByName(EffectName name)
163 d425545a Leszek Koltunski
    {
164 a0397f32 Leszek Koltunski
    int num = name.getType().ordinal();
165
    return mQueues[num].removeByName(name);
166 d425545a Leszek Koltunski
    }
167 432442f9 Leszek Koltunski
168 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
169
/**
170 34e43b0a Leszek Koltunski
 * Add a new Effect to the tail of our queue.
171 f2fe7e28 Leszek Koltunski
 *
172 6bb59aad Leszek Koltunski
 * @param effect The Effect to add.
173 ae77d55e Leszek Koltunski
 * @return <code>true</code> if operation was successful, <code>false</code> otherwise.
174 6a06a912 Leszek Koltunski
 */
175 ae77d55e Leszek Koltunski
  public boolean apply(Effect effect)
176 d425545a Leszek Koltunski
    {
177 a0397f32 Leszek Koltunski
    int num = effect.getType().ordinal();
178
    return mQueues[num].add(effect);
179 4fde55a0 Leszek Koltunski
    }
180 34e43b0a Leszek Koltunski
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182
/**
183
 * Add a new Effect to our queue at a specified position.
184
 *
185
 * @param effect The Effect to add.
186
 * @param position the place in the effects queue where to add the new effect.
187
 * @return <code>true</code> if operation was successful, <code>false</code> otherwise.
188
 */
189
  public boolean apply(Effect effect, int position)
190
    {
191
    int num = effect.getType().ordinal();
192
    return mQueues[num].add(effect,position);
193
    }
194 106ae28d Leszek Koltunski
195 fb001aff Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
196
/**
197
 * Mark the underlying OpenGL object for deletion. Actual deletion will take place on the next render.
198
 */
199
  public void markForDeletion()
200
    {
201
    for( int i=0; i<EffectType.LENGTH; i++)
202
      {
203
      mQueues[i].markForDeletion();
204
      }
205
    }
206
207 106ae28d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
208
/**
209
 * Return number of effects of the given type currently in the Queue.
210
 *
211
 * @param type The EffectType.
212
 * @return Number of effects of the given type currently in the Queue.
213
 */
214
  public int getNumEffects(EffectType type)
215
    {
216
    int num = type.ordinal();
217
    return mQueues[num].getNumEffects();
218
    }
219 4c96c7c9 Leszek Koltunski
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221
/**
222
 * Return a string describing all effects in the queues.
223
 */
224 40f0cea6 Leszek Koltunski
  public String debug(int depth)
225 4c96c7c9 Leszek Koltunski
    {
226 40f0cea6 Leszek Koltunski
    StringBuilder s = new StringBuilder();
227
    for(int i=0; i<depth; i++) s.append(" ");
228
    String space = s.toString();
229
230 4c96c7c9 Leszek Koltunski
    String mat = mQueues[0].retEffects();
231
    String ver = mQueues[1].retEffects();
232
    String fra = mQueues[2].retEffects();
233
    String pos = mQueues[3].retEffects();
234
235 40f0cea6 Leszek Koltunski
    return space+"MAT: "+mat+"\n"+space+"VER: "+ver+"\n"+space+"FRA: "+fra+"\n"+space+"POS: "+pos;
236 4c96c7c9 Leszek Koltunski
    }
237 f2fe7e28 Leszek Koltunski
  }