Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effectqueue / EffectQueueActivity.java @ 5601cfa6

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.examples.effectqueue;
21

    
22
import org.distorted.library.effect.Effect;
23
import org.distorted.library.effect.EffectName;
24
import org.distorted.library.effect.EffectType;
25
import org.distorted.library.main.DistortedEffects;
26
import org.distorted.library.main.DistortedLibrary;
27
import org.distorted.examples.R;
28

    
29
import android.app.Activity;
30
import android.opengl.GLSurfaceView;
31
import android.os.Bundle;
32
import android.view.View;
33
import android.widget.AdapterView;
34
import android.widget.ArrayAdapter;
35
import android.widget.Spinner;
36
import android.widget.TableLayout;
37
import android.widget.TableRow;
38
import android.widget.TextView;
39
import android.widget.Toast;
40

    
41
import java.util.ArrayList;
42

    
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44

    
45
public class EffectQueueActivity extends Activity implements AdapterView.OnItemSelectedListener
46
  {
47
  private Spinner mAdd, mID, mName, mType;
48
  private static ArrayAdapter<Long> mAdapterID;
49

    
50
  private int mPosID, mPosName, mPosType;
51
  private TableLayout mLayoutList;
52

    
53
  private static class EffectRow
54
    {
55
    Effect effect;
56
    TableRow row;
57

    
58
    EffectRow(Effect e, TableRow tr)
59
      {
60
      effect = e;
61
      row    = tr;
62
      }
63
    }
64

    
65
  private ArrayList<EffectRow> mList = new ArrayList<>();
66

    
67
///////////////////////////////////////////////////////////////////////////////////////////////////
68

    
69
  @Override
70
  protected void onCreate(Bundle savedInstanceState) 
71
    {
72
    super.onCreate(savedInstanceState);
73
 
74
    setContentView(R.layout.effectqueuelayout);
75

    
76
    mPosID   = 0;
77
    mPosName = 0;
78
    mPosType = 0;
79

    
80
    mAdd  = findViewById(R.id.effects2d_spinnerAdd );
81
    mID   = findViewById(R.id.effects2d_spinnerID  );
82
    mName = findViewById(R.id.effects2d_spinnerName);
83
    mType = findViewById(R.id.effects2d_spinnerType);
84

    
85
    mAdd.setOnItemSelectedListener(this);
86
    mID.setOnItemSelectedListener(this);
87
    mName.setOnItemSelectedListener(this);
88
    mType.setOnItemSelectedListener(this);
89

    
90
    ArrayList<Long> itemsId  = new ArrayList<>();
91

    
92
    String[] itemsName = new String[] { getText(R.string.distort   ).toString(),
93
                                        getText(R.string.sink      ).toString(),
94
                                        getText(R.string.alpha     ).toString(),
95
                                        getText(R.string.saturation).toString(),
96
                                        getText(R.string.chroma).toString()};
97

    
98
    String[] itemsType = new String[] {"VERTEX", "FRAGMENT"};
99

    
100
    mAdapterID = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsId);
101
    mAdapterID.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
102
    mID.setAdapter(mAdapterID);
103

    
104
    ArrayAdapter<String> adapterAdd = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsName);
105
    adapterAdd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
106
    mAdd.setAdapter(adapterAdd);
107

    
108
    ArrayAdapter<String> adapterName = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsName);
109
    adapterName.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
110
    mName.setAdapter(adapterName);
111

    
112
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, itemsType);
113
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
114
    mType.setAdapter(adapterType);
115

    
116
    mLayoutList = findViewById(R.id.effects2dTableList);
117
    }
118

    
119
///////////////////////////////////////////////////////////////////////////////////////////////////
120

    
121
  @Override
122
  protected void onResume() 
123
    {
124
    super.onResume();
125
      
126
    GLSurfaceView mView = findViewById(R.id.effects2dSurfaceView);
127
    mView.onResume();
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131

    
132
  @Override
133
  protected void onPause() 
134
    {
135
    GLSurfaceView mView = findViewById(R.id.effects2dSurfaceView);
136
    mView.onPause();
137

    
138
    DistortedLibrary.onPause();
139
    super.onPause();
140
    }
141
    
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143

    
144
  @Override
145
  public void onStop()
146
    {
147
    super.onStop();
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  @Override
153
  public void onDestroy()
154
    {
155
    DistortedLibrary.onDestroy();
156
    super.onDestroy();
157
    }     
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
162
    {
163
    switch(parent.getId())
164
      {
165
      case R.id.effects2d_spinnerAdd : EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
166
                                       v.setEffect(pos); break;
167
      case R.id.effects2d_spinnerID  : mPosID   = pos; break;
168
      case R.id.effects2d_spinnerName: mPosName = pos; break;
169
      case R.id.effects2d_spinnerType: mPosType = pos; break;
170
      }
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  public void onNothingSelected(AdapterView<?> parent)
176
    {
177
    }
178

    
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180

    
181
  public void removeByID(View view)
182
    {
183
    try
184
      {
185
      Long currEffect = (Long)mID.getItemAtPosition(mPosID);
186
      EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
187
      v.getRenderer().getEffects().abortById(currEffect);
188

    
189
      int numRows = mList.size();
190

    
191
      for(int i=0; i<numRows; i++)
192
        {
193
        Effect effect = mList.get(i).effect;
194

    
195
        if( effect.getID() == currEffect )
196
          {
197
          effectRemoved(i);
198
          break;
199
          }
200
        }
201
      }
202
    catch(IndexOutOfBoundsException ex)
203
      {
204
      android.util.Log.e("effectQueue", "Failure trying to remove "+mPosID);
205
      }
206
    }
207

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  public void removeByName(View view)
211
    {
212
    EffectName name;
213

    
214
    switch(mPosName)
215
      {
216
      case  0: name = EffectName.DISTORT      ; break;
217
      case  1: name = EffectName.SINK         ; break;
218
      case  2: name = EffectName.SMOOTH_ALPHA ; break;
219
      case  3: name = EffectName.SATURATION   ; break;
220
      case  4: name = EffectName.SMOOTH_CHROMA; break;
221
      default: name = EffectName.CONTRAST     ;
222
      }
223

    
224
      int numRows = mList.size();
225

    
226
      for(int i=0; i<numRows; i++)
227
        {
228
        Effect effect = mList.get(i).effect;
229

    
230
        if( effect.getName() == name )
231
          {
232
          effectRemoved(i);
233
          i--;
234
          numRows--;
235
          }
236
        }
237

    
238
    EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
239
    v.getRenderer().getEffects().abortByName(name);
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

    
244
  public void removeByType(View view)
245
    {
246
    EffectType type;
247

    
248
    switch(mPosType)
249
      {
250
      case  0: type = EffectType.VERTEX  ; break;
251
      case  1: type = EffectType.FRAGMENT; break;
252
      default: type = EffectType.MATRIX;
253
      }
254

    
255
    int numRows = mList.size();
256

    
257
    for(int i=0; i<numRows; i++)
258
      {
259
      Effect effect = mList.get(i).effect;
260

    
261
      if( effect.getType() == type )
262
        {
263
        effectRemoved(i);
264
        i--;
265
        numRows--;
266
        }
267
      }
268

    
269
    EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
270

    
271
    DistortedEffects effects = v.getRenderer().getEffects();
272
    effects.abortByType(type);
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276

    
277
  public void effectAdded(boolean success, final Effect effect)
278
    {
279
    if( success )  // we really added a new effect
280
      {
281
      EffectQueueSurfaceView v = findViewById(R.id.effects2dSurfaceView);
282
      effect.notifyWhenFinished(v.getRenderer());
283

    
284
      mAdapterID.add(effect.getID());
285
      mAdapterID.notifyDataSetChanged();
286

    
287
      TableRow tr = new TableRow(this);
288
      tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
289

    
290
      TextView b1 = new TextView(this);
291
      b1.setText(getString(R.string.effect_id_placeholder,effect.getID()));
292
      b1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
293
      tr.addView(b1);
294

    
295
      TextView b2 = new TextView(this);
296
      b2.setText(effect.getName().name());
297
      b2.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
298
      tr.addView(b2);
299

    
300
      TextView b3 = new TextView(this);
301
      b3.setText(effect.getType().name());
302
      b3.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
303
      tr.addView(b3);
304

    
305
      TextView b4 = new TextView(this);
306
      b4.setText(R.string.effect_live);
307
      b4.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
308
      tr.addView(b4);
309

    
310
      mList.add(new EffectRow(effect,tr));
311

    
312
      mLayoutList.addView(tr, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
313
      }
314
    else // id=-1, i.e. we failed to add new effect due to too many effects already
315
      {
316
      Toast.makeText(this, R.string.example_effects2d_toast , Toast.LENGTH_LONG).show();
317
      }
318
    }
319

    
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321

    
322
  private void effectRemoved(int index)
323
    {
324
    EffectRow er = mList.remove(index);
325

    
326
    mAdapterID.remove(er.effect.getID());
327
    mAdapterID.notifyDataSetChanged();
328

    
329
    if( er.row!=null )
330
      {
331
      mLayoutList.removeView(er.row);
332
      }
333
    else
334
      {
335
      android.util.Log.e("EFFECTQUEUE", "Impossible: id="+er.effect.getID()+" not in the map!");
336
      }
337
    }
338

    
339
///////////////////////////////////////////////////////////////////////////////////////////////////
340

    
341
  public void effectFinished(final long id)
342
    {
343
    runOnUiThread(new Runnable()
344
      {
345
      public void run()
346
        {
347
        TableRow row = null;
348

    
349
        int numRows = mList.size();
350

    
351
        for(int i=0; i<numRows; i++)
352
          {
353
          EffectRow er = mList.get(i);
354

    
355
          if( er.effect.getID() == id )
356
            {
357
            row = er.row;
358
            break;
359
            }
360
          }
361

    
362
        if( row!=null )
363
          {
364
          TextView v = (TextView)row.getVirtualChildAt(3);
365
          v.setText(R.string.effect_finished);
366
          }
367
        }
368
      });
369
    }
370
  }
(1-1/3)