Project

General

Profile

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

examples / src / main / java / org / distorted / examples / predeform / PredeformActivity.java @ 641ea00c

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.predeform;
21

    
22
import android.app.Activity;
23
import android.content.Intent;
24
import android.os.Bundle;
25
import android.view.View;
26
import android.widget.AdapterView;
27
import android.widget.ArrayAdapter;
28
import android.widget.Button;
29
import android.widget.LinearLayout;
30
import android.widget.NumberPicker;
31
import android.widget.Spinner;
32

    
33
import org.distorted.examples.R;
34
import org.distorted.library.effect.Effect;
35
import org.distorted.library.effect.EffectName;
36
import org.distorted.library.effect.EffectType;
37
import org.distorted.library.effect.VertexEffect;
38
import org.distorted.library.type.Static4D;
39

    
40
import java.util.ArrayList;
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

    
44
public class PredeformActivity extends Activity implements View.OnClickListener, AdapterView.OnItemSelectedListener
45
  {
46
  private int mNumCols = 1;
47
  private int mNumRows = 1;
48
  private int mNumSlic = 1;
49
  private NumberPicker mColsPicker, mRowsPicker, mSlicPicker;
50
  private int mObjectType;
51
  private int mBitmapID;
52
  private EffectName[] mEffectNames;
53
  private int mEffectAdd;
54
  private LinearLayout mLayout;
55
  private int mChildren;
56
  private ArrayList<PredeformEffect> mList;
57

    
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59

    
60
  @Override
61
  protected void onCreate(Bundle savedState)
62
    {
63
    super.onCreate(savedState);
64

    
65
    setContentView(R.layout.predeformpickerlayout);
66

    
67
    mLayout = findViewById(R.id.predeformLayout);
68
    mChildren = 0;
69
    mList = new ArrayList<>();
70

    
71
    mColsPicker = findViewById(R.id.predeformCols);
72
    mRowsPicker = findViewById(R.id.predeformRows);
73
    mSlicPicker = findViewById(R.id.predeformSlices);
74

    
75
    mColsPicker.setMaxValue(40);
76
    mColsPicker.setMinValue( 1);
77
    mRowsPicker.setMaxValue(40);
78
    mRowsPicker.setMinValue( 1);
79
    mSlicPicker.setMaxValue(40);
80
    mSlicPicker.setMinValue( 0);
81

    
82
    mColsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
83
         {
84
         @Override
85
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
86
           {
87
           mNumCols = newVal;
88
           }
89
         });
90

    
91
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
92
         {
93
         @Override
94
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
95
           {
96
           mNumRows = newVal;
97
           }
98
         });
99

    
100
    mSlicPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
101
         {
102
         @Override
103
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
104
           {
105
           mNumSlic = newVal;
106
           }
107
         });
108

    
109
    mObjectType = 0;
110

    
111
    Spinner typeSpinner  = findViewById(R.id.predeformSpinnerType);
112
    typeSpinner.setOnItemSelectedListener(this);
113

    
114
    String[] objectType = new String[PredeformMeshList.LENGTH];
115

    
116
    for(int mesh=0; mesh<PredeformMeshList.LENGTH; mesh++)
117
      {
118
      objectType[mesh] = "Mesh: "+PredeformMeshList.getName(mesh);
119
      }
120

    
121
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
122
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
123
    typeSpinner.setAdapter(adapterType);
124

    
125
    Spinner bitmapSpinner  = findViewById(R.id.predeformSpinnerBitmap);
126
    bitmapSpinner.setOnItemSelectedListener(this);
127

    
128
    String[] objectBitmap = new String[] { "Texture: Grid", "Texture: Girl", "Texture: Dog", "Texture: Cat",
129
                                           "Texture: Squares", "Texture: Bean", "Texture: Lisa", "Texture: World" };
130

    
131
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
132
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
133
    bitmapSpinner.setAdapter(adapterBitmap);
134

    
135
    Spinner effectSpinner  = findViewById(R.id.predeformSpinnerEffect);
136
    effectSpinner.setOnItemSelectedListener(this);
137

    
138
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, createEffectNames());
139
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
140
    effectSpinner.setAdapter(adapterEffect);
141

    
142
    Button add = findViewById(R.id.predeformAddEffect);
143
    add.setOnClickListener(this);
144
    Button rem = findViewById(R.id.predeformRemoveEffect);
145
    rem.setOnClickListener(this);
146
    Button cre = findViewById(R.id.predeformCreate);
147
    cre.setOnClickListener(this);
148
    }
149

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

    
152
    private String[] createEffectNames()
153
      {
154
      EffectType type;
155
      EffectName[] names = EffectName.values();
156

    
157
      int numEffects=0;
158

    
159
      for (EffectName effectName : names)
160
        {
161
        type = effectName.getType();
162
        if (type == EffectType.VERTEX) numEffects++;
163
        }
164

    
165
      mEffectNames = new EffectName[numEffects];
166
      String[] effectStrings = new String[numEffects];
167

    
168
      numEffects=0;
169

    
170
      for (EffectName name : names)
171
        {
172
        type = name.getType();
173

    
174
        if (type == EffectType.VERTEX)
175
          {
176
          mEffectNames[numEffects] = name;
177
          effectStrings[numEffects] = name.name();
178

    
179
          numEffects++;
180
          }
181
        }
182

    
183
      return effectStrings;
184
      }
185

    
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187

    
188
  public void newEffect()
189
    {
190
    PredeformEffect eff = new PredeformEffect(mEffectNames[mEffectAdd], this );
191
    mList.add(eff);
192

    
193
    mChildren++;
194

    
195
    View view = eff.createView(mChildren);
196
    mLayout.addView(view);
197

    
198
    int dimension = eff.getDimension();
199
    Button butt;
200

    
201
    switch(dimension)
202
      {
203
      case 1: butt = view.findViewById(R.id.button1dRemove);
204
              butt.setOnClickListener(this);
205
              break;
206
      case 2: butt = view.findViewById(R.id.button2dRemove);
207
              butt.setOnClickListener(this);
208
              break;
209
      case 3: butt = view.findViewById(R.id.button3dRemove);
210
              butt.setOnClickListener(this);
211
              break;
212
      case 4: butt = view.findViewById(R.id.button4dRemove);
213
              butt.setOnClickListener(this);
214
              break;
215
      case 5: butt = view.findViewById(R.id.button5dRemove);
216
              butt.setOnClickListener(this);
217
              break;
218
      }
219

    
220
    if( mEffectNames[mEffectAdd].getCenterDimension() > 0 )
221
      {
222
      View center = eff.createCenter(mChildren);
223
      mLayout.addView(center);
224
      }
225

    
226
    if( mEffectNames[mEffectAdd].getRegionDimension() > 0 )
227
      {
228
      View region = eff.createRegion(mChildren);
229
      mLayout.addView(region);
230
      }
231

    
232
    Effect effect = eff.createEffect();
233

    
234
    PredeformEffectList.addNew( (VertexEffect)effect );
235
    }
236

    
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

    
239
  public void removeAll()
240
    {
241
    mChildren = 0;
242
    mList.clear();
243
    mLayout.removeAllViews();
244
    PredeformEffectList.removeAll();
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  public void remove(View v)
250
    {
251
    for(PredeformEffect effect: mList)
252
      {
253
      if( effect.thisView(v) )
254
        {
255
        View view;
256

    
257
        view = effect.getEffect();
258
        if( view!=null ) mLayout.removeView(view);
259
        view = effect.getCenter();
260
        if( view!=null ) mLayout.removeView(view);
261
        view = effect.getRegion();
262
        if( view!=null ) mLayout.removeView(view);
263

    
264
        PredeformEffectList.remove(effect.getId());
265

    
266
        int index = mList.indexOf(effect);
267
        int capac = mList.size();
268

    
269
        for(int i=index+1; i<capac; i++)
270
          {
271
          mList.get(i).setBackground(i-1);
272
          }
273

    
274
        mList.remove(effect);
275
        mChildren--;
276

    
277
        break;
278
        }
279
      }
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  public void create()
285
    {
286
    Intent mainInt = new Intent( getApplicationContext(), PredeformActivity2.class);
287
    Bundle b = new Bundle();
288

    
289
    b.putInt("type"  , mObjectType);
290
    b.putInt("cols"  , PredeformMeshList.getCols(mObjectType, mNumCols, mNumRows, mNumSlic) );
291
    b.putInt("rows"  , PredeformMeshList.getRows(mObjectType, mNumCols, mNumRows, mNumSlic) );
292
    b.putInt("slices", PredeformMeshList.getSlic(mObjectType, mNumCols, mNumRows, mNumSlic) );
293
    b.putInt("bitmap", mBitmapID);
294

    
295
    mainInt.putExtras(b);
296
    startActivity(mainInt);
297
    }
298

    
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300
// TODO
301

    
302
  int getScreenWidth()
303
    {
304
    return 1080;
305
    }
306

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308
// only important for matrix effects, ignore here
309

    
310
  float getScaleFactor()
311
    {
312
    return 1.0f;
313
    }
314

    
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316
// only if we want to draw the center, ignore here
317

    
318
  void setCenter(float x, float y, float z)
319
    {
320

    
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324
// only if we want to draw the region, ignore here
325

    
326
  void setRegion(Static4D region)
327
    {
328

    
329
    }
330

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

    
333
  int getWidth()
334
    {
335
    return mNumCols;
336
    }
337

    
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

    
340
  int getHeight()
341
    {
342
    return mNumRows;
343
    }
344

    
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346

    
347
  int getDepth()
348
    {
349
    return mNumSlic;
350
    }
351

    
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

    
354
  @Override
355
  public void onClick(View v)
356
    {
357
    switch (v.getId())
358
      {
359
      case R.id.predeformAddEffect   : newEffect(); break;
360
      case R.id.predeformRemoveEffect: removeAll(); break;
361
      case R.id.predeformCreate      : create();    break;
362
      case R.id.button1dRemove       :
363
      case R.id.button2dRemove       :
364
      case R.id.button3dRemove       :
365
      case R.id.button4dRemove       :
366
      case R.id.button5dRemove       : remove(v)  ; break;
367
      }
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
  @Override
373
  public void onWindowFocusChanged(boolean hasFocus)
374
    {
375
    super.onWindowFocusChanged(hasFocus);
376

    
377
    mColsPicker.setValue(mNumCols);
378
    mRowsPicker.setValue(mNumRows);
379
    mSlicPicker.setValue(mNumSlic);
380
    }
381

    
382
///////////////////////////////////////////////////////////////////////////////////////////////////
383

    
384
  @Override
385
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
386
    {
387
    switch(parent.getId())
388
      {
389
      case R.id.predeformSpinnerType  : if( mObjectType!=pos )
390
                                          {
391
                                          mObjectType = pos;
392

    
393
                                          int dim = PredeformMeshList.getDimension(mObjectType);
394

    
395
                                          mRowsPicker.setEnabled(dim>=1);
396
                                          mColsPicker.setEnabled(dim>=2);
397
                                          mSlicPicker.setEnabled(dim>=3);
398
                                          }
399
                                        break;
400
      case R.id.predeformSpinnerBitmap: switch(pos)
401
                                          {
402
                                          case 0: mBitmapID = -1            ; break;
403
                                          case 1: mBitmapID = R.raw.face    ; break;
404
                                          case 2: mBitmapID = R.raw.dog     ; break;
405
                                          case 3: mBitmapID = R.raw.cat     ; break;
406
                                          case 4: mBitmapID = R.raw.grid    ; break;
407
                                          case 5: mBitmapID = R.raw.bean    ; break;
408
                                          case 6: mBitmapID = R.raw.monalisa; break;
409
                                          case 7: mBitmapID = R.raw.world   ; break;
410
                                          }
411
                                        break;
412
      case R.id.predeformSpinnerEffect: mEffectAdd = pos;
413
                                        break;
414
      }
415
    }
416

    
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418

    
419
  @Override
420
  public void onNothingSelected(AdapterView<?> parent)
421
    {
422
    }
423
  }
(1-1/7)