Project

General

Profile

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

examples / src / main / java / org / distorted / examples / starwars / StarWarsRenderer.java @ d2aee6cc

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

    
22
import java.io.IOException;
23
import java.io.InputStream;
24
import java.util.Random;
25

    
26
import javax.microedition.khronos.egl.EGLConfig;
27
import javax.microedition.khronos.opengles.GL10;
28

    
29
import org.distorted.examples.R;
30

    
31
import org.distorted.library.DistortedNode;
32
import org.distorted.library.DistortedScreen;
33
import org.distorted.library.MeshFlat;
34
import org.distorted.library.EffectNames;
35
import org.distorted.library.type.Dynamic1D;
36
import org.distorted.library.type.Dynamic3D;
37
import org.distorted.library.type.Static1D;
38
import org.distorted.library.type.Static3D;
39
import org.distorted.library.type.Static4D;
40
import org.distorted.library.message.EffectListener;
41
import org.distorted.library.message.EffectMessage;
42
import org.distorted.library.Distorted;
43
import org.distorted.library.DistortedTexture;
44
import org.distorted.library.DistortedEffects;
45

    
46
import android.graphics.Bitmap;
47
import android.graphics.BitmapFactory;
48
import android.graphics.Canvas;
49
import android.graphics.Paint;
50
import android.graphics.Typeface;
51
import android.opengl.GLES30;
52
import android.opengl.GLSurfaceView;
53

    
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55

    
56
class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
57
  {
58
  private final String[] mGFFAString = 
59
         
60
            { "A long time ago, in a galaxy far,",
61
              "far away...." };                    // yes, there really was a four-dot ellipsis
62

    
63
  private final String[] mCRAWLString = 
64
      
65
            { "It is a period of civil war.",      // in the original 1977 version, there was no 
66
              "Rebel spaceships, striking",        // 'Episode IV New Hope' subtitle line before
67
              "from a hidden base, have",          // the crawl. Lets keep to the classic.
68
              "won their first victory",
69
              "against the evil Galactic",
70
              "Empire.",
71
              "",
72
              "During the battle, rebel",
73
              "spies managed to steal",
74
              "secret plans to the Empire's",
75
              "ultimate weapon, the",
76
              "DEATH STAR, an armored",
77
              "space station with enough",
78
              "power to destroy an entire",
79
              "planet.",
80
              "",
81
              "Pursued by the Empire's",
82
              "sinister agents, Princess",
83
              "Leia races home aboard her",
84
              "starship, custodian of the",
85
              "stolen plans that can save",
86
              "her people and restore",
87
              "freedom to the galaxy...." };      // four-dot.
88
   
89
  private final int NUM_STARS = 40;
90
   
91
  private final int CRAWL_COLOR = 0xffffe81f;
92
  private final int GFFA_COLOR  = 0xff0000ff;
93
  private final int FONT_HEIGHT      = 40;
94
  private final int VERTICAL_SPACING = 10;
95
  private final String CRAWL_TYPEFACE = "News Gothic";
96
   
97
  private final int CRAWL_WIDTH = 500;
98
  private final int CRAWL_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mCRAWLString.length+1);
99
   
100
  private final int GFFA_WIDTH = 600;
101
  private final int GFFA_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mGFFAString.length+1);
102
   
103
  private final float CRAWL_ANGLE = -30.0f;
104
   
105
  private GLSurfaceView mView;
106
  private DistortedTexture mGFFATexture, mLogoTexture, mCrawlTexture, mCrawlBackgroundTexture, mStarTexture;
107
  private DistortedEffects mGFFAEffects, mLogoEffects, mCrawlEffects, mCrawlBackgroundEffects;
108
  private DistortedEffects[] mStarEffects;
109
  private DistortedNode mBackground;
110
  private DistortedScreen mScreen;
111
  private MeshFlat mQuad;
112

    
113
  private long gffaID, logoID, crawlID;
114
  private Random mRnd = new Random(0);
115
  private int mWidth, mHeight;
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
  StarWarsRenderer(GLSurfaceView v)
120
    {
121
    android.util.Log.d("STAR WARS", "constructor");
122

    
123
    mView = v;
124

    
125
    mQuad = new MeshFlat(1,1);
126

    
127
    mGFFAEffects            = new DistortedEffects();
128
    mLogoEffects            = new DistortedEffects();
129
    mCrawlEffects           = new DistortedEffects();
130
    mCrawlBackgroundEffects = new DistortedEffects();
131

    
132
    if( NUM_STARS>0 )
133
      {
134
      mStarEffects = new DistortedEffects[NUM_STARS];
135
      mStarEffects[0] = new DistortedEffects();
136

    
137
      for (int i = 1; i < NUM_STARS; i++)
138
        mStarEffects[i] = new DistortedEffects(mStarEffects[0], Distorted.CLONE_VERTEX);
139
      }
140

    
141
    mScreen = new DistortedScreen();
142
    mScreen.setProjection(60.0f, 0.0f, 0.0f);
143
    mScreen.enableDepth(false);
144
    }
145

    
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147

    
148
  public void onPause()
149
    {
150
    android.util.Log.d("STAR WARS", "onPause");
151

    
152
    mWidth = 0;
153
    mHeight= 0;
154
    }
155

    
156
///////////////////////////////////////////////////////////////////////////////////////////////////
157
   
158
  public void onDrawFrame(GL10 glUnused) 
159
    {
160
    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
161
    mScreen.render(System.currentTimeMillis());
162
    }
163

    
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165
    
166
  public void onSurfaceChanged(GL10 glUnused, int width, int height) 
167
    {
168
    android.util.Log.d("STAR WARS", "surfaceChanged");
169

    
170

    
171
    if( mWidth!=width || mHeight!=height )  // after onPause() we get 2 calls here
172
      {
173
      mWidth = width;
174
      mHeight= height;
175

    
176
      mGFFAEffects.abortAllEffects();
177
      mLogoEffects.abortAllEffects();
178
      mCrawlEffects.abortAllEffects();
179
      mCrawlBackgroundEffects.abortAllEffects();
180

    
181
      for(int i=0; i<NUM_STARS; i++) mStarEffects[i].abortAllEffects();
182

    
183
      mScreen.detachAll();
184
      setupScreen(width,height);
185
      mScreen.resize(width, height);
186
      }
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190
    
191
  public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
192
    {
193
    android.util.Log.d("STAR WARS", "surfaceCreated");
194

    
195
    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
196

    
197
    setupBitmaps();
198

    
199
    try
200
      {
201
      Distorted.onCreate(mView.getContext());
202
      }
203
    catch(Exception ex)
204
      {
205
      android.util.Log.e("Star Wars", ex.getMessage() );
206
      }
207
    }
208
    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  private void setupScreen(int w, int h)
212
    {
213
    mCrawlBackgroundTexture = new DistortedTexture(w,(int)(Math.sqrt(3.0)*h));
214
       
215
    int randomA, randomX, randomY, randomTime;
216
    float randomS, randomAlpha1, randomAlpha2;
217
       
218
    Static3D center = new Static3D(0,0,0);
219
    Static3D axis   = new Static3D(0,0,1);
220
    Static1D alphaNoise = new Static1D(0.4f);
221

    
222
    for(int i=0; i<NUM_STARS; i++)
223
      {
224
      randomX = mRnd.nextInt(w);
225
      randomY = mRnd.nextInt(h);
226
      randomS = 0.2f+ 0.8f*mRnd.nextFloat();
227
      randomA = (int)(180*mRnd.nextFloat());
228
      randomAlpha1 = 0.2f + 0.8f*mRnd.nextFloat();
229
      randomAlpha2 = 0.8f + 0.2f*mRnd.nextFloat();
230
      randomTime = 500+mRnd.nextInt(2000);
231
      
232
      mStarEffects[i].move( new Static3D(randomX,randomY,0) );
233
      mStarEffects[i].scale(randomS);
234
      mStarEffects[i].rotate( new Static1D(randomA), axis, center );
235
      
236
      Dynamic1D di = new Dynamic1D(randomTime,0.0f);
237
      di.setNoise(alphaNoise);
238
      di.add(new Static1D(randomAlpha1));
239
      di.add(new Static1D(randomAlpha2));
240
      
241
      mStarEffects[i].alpha(di);
242
      
243
      mScreen.attach(mStarTexture, mStarEffects[i], mQuad);
244
      }
245
      
246
    float scale = (0.5f*w/mGFFATexture.getWidth());
247
    
248
    Dynamic1D di = new Dynamic1D(6000,0.5f);
249
    di.add(new Static1D(1.0f));
250
    di.add(new Static1D(1.0f));
251
    di.add(new Static1D(0.0f));
252
    
253
    mGFFAEffects.move( new Static3D(w/5,h/3,0) );
254
    mGFFAEffects.scale( new Static3D(scale,scale,scale) );
255
    mGFFAEffects.alpha(di);
256
      
257
    mScreen.attach(mGFFATexture, mGFFAEffects, mQuad);
258
    mGFFAEffects.registerForMessages(this);
259
    }
260
    
261
///////////////////////////////////////////////////////////////////////////////////////////////////
262

    
263
  private void setupBitmaps()
264
    {
265
    InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.starwars);
266
    InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.star);
267
    
268
    Bitmap bitmapStar, bitmapGFFA, bitmapLogo, bitmapText;
269
      
270
    try 
271
      {
272
      bitmapLogo = BitmapFactory.decodeStream(is1);
273
      bitmapStar = BitmapFactory.decodeStream(is2);
274
      } 
275
    finally 
276
      {
277
      try 
278
        {
279
        is1.close();
280
        is2.close();
281
        } 
282
      catch(IOException e) { }
283
      } 
284
      
285
    Paint paint = new Paint();
286
    paint.setAntiAlias(true);
287
    paint.setTextAlign(Paint.Align.LEFT);
288
    paint.setTextSize(FONT_HEIGHT);
289
    paint.setColor(GFFA_COLOR);
290
      
291
    Typeface tf = Typeface.create(CRAWL_TYPEFACE, Typeface.BOLD);
292
    paint.setTypeface(tf);     
293
 
294
    ///// create GFFA ///////////////////
295
    mGFFATexture  = new DistortedTexture(GFFA_WIDTH,GFFA_HEIGHT);
296
    bitmapGFFA = Bitmap.createBitmap(GFFA_WIDTH,GFFA_HEIGHT,Bitmap.Config.ARGB_8888);
297
    bitmapGFFA.eraseColor(0x00000000);
298
    Canvas gffaCanvas = new Canvas(bitmapGFFA);
299
      
300
    for(int i=0; i<mGFFAString.length; i++)
301
      {
302
      gffaCanvas.drawText(mGFFAString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), paint);  
303
      }
304
  
305
    mGFFATexture.setTexture(bitmapGFFA);
306
      
307
    ///// create Logo ///////////////////
308
    mLogoTexture  = new DistortedTexture(bitmapLogo.getWidth(),bitmapLogo.getHeight());
309
    mLogoTexture.setTexture(bitmapLogo);
310

    
311
    ///// create CRAWL //////////////////
312
    mCrawlTexture = new DistortedTexture(CRAWL_WIDTH,CRAWL_HEIGHT);
313
    bitmapText = Bitmap.createBitmap(CRAWL_WIDTH,CRAWL_HEIGHT,Bitmap.Config.ARGB_8888);
314
    bitmapText.eraseColor(0x00000000);
315
    Canvas textCanvas = new Canvas(bitmapText);
316
    paint.setColor(CRAWL_COLOR);
317
  
318
    for(int i=0; i<mCRAWLString.length; i++)
319
      {
320
      displayJustified(mCRAWLString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), CRAWL_WIDTH, textCanvas, paint);  
321
      }
322
      
323
    mCrawlTexture.setTexture(bitmapText);
324
      
325
    ///// create Stars ///////////////////
326
    mStarTexture = new DistortedTexture(bitmapStar.getWidth(),bitmapStar.getHeight());
327
    mStarTexture.setTexture(bitmapStar);
328

    
329
    gffaID = mGFFAEffects.getID();
330
    logoID = mLogoEffects.getID();
331
    crawlID= mCrawlEffects.getID();
332
    }
333
 
334
///////////////////////////////////////////////////////////////////////////////////////////////////
335

    
336
  private void displayJustified(String str, int x, int y, int length, Canvas c, Paint paint)
337
    { 
338
    int len       = str.length();
339
    int numspaces = retNumSpaces(str);
340
    
341
    if( len>0 && str.charAt(len-1) == ' ' ) numspaces--;
342

    
343
    float left=x,w = (numspaces>0 ? (length-paint.measureText(str))/numspaces : 0);
344
    String tmp;
345
    int begin,end=0;
346

    
347
    while( end<len )
348
      {
349
      begin=end;
350
      end = str.indexOf(' ', begin)+1;
351
      if( end<=0 ) end = len;
352

    
353
      tmp = str.substring(begin,end);
354
      c.drawText( tmp, left, y, paint);
355
      left+= (paint.measureText(tmp)+w);
356
      }  
357
    }
358

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360
   
361
  private int retNumSpaces(String str)
362
    {
363
    int begin=0, ret=0;
364

    
365
    while( true )
366
      {
367
      begin = str.indexOf(' ', begin) +1;
368

    
369
      if( begin>0 ) ret++;
370
      else break;
371
      }
372

    
373
    return ret;
374
    }
375
    
376
///////////////////////////////////////////////////////////////////////////////////////////////////
377
// the library sending messages to us. This is running on a library 'MessageSender' thread.
378

    
379
  public void effectMessage(final EffectMessage em, final long effectID, final EffectNames effectName, final long objectID)
380
    {
381
    if( em==EffectMessage.EFFECT_FINISHED )
382
      {
383
      if( objectID == gffaID )
384
        {
385
        mScreen.detach(mGFFAEffects);
386
        mGFFAEffects.abortAllEffects();
387
        mGFFATexture.markForDeletion();
388

    
389
        int screenW=mScreen.getWidth();
390
        int screenH=mScreen.getHeight();
391
        
392
        int logoW = mLogoTexture.getWidth();
393
        int logoH = mLogoTexture.getHeight();
394
      
395
        int initSize= (int)(3.0f*screenW/logoW);
396
        int finaSize= (int)(0.1f*screenW/logoW);
397
      
398
        Dynamic3D di = new Dynamic3D(10000,0.5f);
399
        di.add(new Static3D(initSize,initSize,1));
400
        di.add(new Static3D(finaSize,finaSize,1));
401

    
402
        mLogoEffects.move( new Static3D(screenW/2,screenH/2,0) );
403
        mLogoEffects.scale(di);
404
        mLogoEffects.move( new Static3D(-logoW/2,-logoH/2,0) );
405
      
406
        mScreen.attach(mLogoTexture, mLogoEffects,mQuad);
407
        mLogoEffects.registerForMessages(this);
408
        }
409
      else if( objectID==logoID )
410
        {
411
        mScreen.detach(mLogoEffects);
412
        mLogoEffects.abortAllEffects();
413
        mLogoTexture.markForDeletion();
414
        
415
        int crawlW = mCrawlTexture.getWidth();
416
        int crawlH = mCrawlTexture.getHeight();
417
        int screenW= mScreen.getWidth();
418
        int screenH= mScreen.getHeight();
419
        int backH  = mCrawlBackgroundTexture.getHeight();
420
        float scale= (float)screenW/crawlW;
421
      
422
        Dynamic3D di = new Dynamic3D(60000,0.5f);
423
        di.add(new Static3D(screenW/2,+backH       , 0));
424
        di.add(new Static3D(screenW/2,-scale*crawlH, 0));
425
        
426
        mCrawlBackgroundEffects.move( new Static3D(0,screenH-backH,0) );
427
        mCrawlBackgroundEffects.rotate( new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,backH,0) );
428
        
429
        final int transpDist = 5;
430
        Static4D region = new Static4D(screenW/2,(1-transpDist)*backH,transpDist*backH,transpDist*backH);
431
        mCrawlBackgroundEffects.alpha(new Static1D(1-transpDist/2), region, true);
432
        
433
        mCrawlEffects.move(di);
434
        mCrawlEffects.scale( new Static3D(scale,scale,scale) );
435
        mCrawlEffects.move( new Static3D(-crawlW/2,0,0) );
436
        
437
        mBackground = mScreen.attach(mCrawlBackgroundTexture, mCrawlBackgroundEffects,mQuad);
438
        mBackground.attach(mCrawlTexture, mCrawlEffects,mQuad);
439
        mCrawlEffects.registerForMessages(this);
440
        }
441
      else if( objectID==crawlID )
442
        {
443
        mScreen.detach(mBackground);
444
        mBackground.detach(mCrawlEffects);
445
        mCrawlEffects.abortAllEffects();
446
        mCrawlTexture.markForDeletion();
447
        mCrawlBackgroundEffects.abortAllEffects();
448
        mCrawlBackgroundTexture.markForDeletion();
449
        }
450
      }
451
    }
452
  }
(2-2/3)