Project

General

Profile

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

examples / src / main / java / org / distorted / examples / starwars / StarWarsRenderer.java @ 7589635e

1 bc0a685b 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 427ab7bf Leszek Koltunski
20 5068fa06 Leszek Koltunski
package org.distorted.examples.starwars;
21 427ab7bf Leszek Koltunski
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 5068fa06 Leszek Koltunski
import org.distorted.examples.R;
30
31 7589635e Leszek Koltunski
import org.distorted.library.type.Dynamic1D;
32
import org.distorted.library.type.Dynamic3D;
33 5068fa06 Leszek Koltunski
import org.distorted.library.DistortedNode;
34 7589635e Leszek Koltunski
import org.distorted.library.type.Static1D;
35
import org.distorted.library.type.Static2D;
36
import org.distorted.library.type.Static3D;
37
import org.distorted.library.type.Static4D;
38 13efa930 Leszek Koltunski
import org.distorted.library.message.EffectListener;
39
import org.distorted.library.message.EffectMessage;
40 5068fa06 Leszek Koltunski
import org.distorted.library.Distorted;
41
import org.distorted.library.DistortedBitmap;
42 427ab7bf Leszek Koltunski
43
import android.graphics.Bitmap;
44
import android.graphics.BitmapFactory;
45
import android.graphics.Canvas;
46
import android.graphics.Paint;
47
import android.graphics.Typeface;
48
import android.opengl.GLES20;
49
import android.opengl.GLSurfaceView;
50
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52
53
class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
54 bc0a685b Leszek Koltunski
  {
55
  private final String[] mGFFAString = 
56 427ab7bf Leszek Koltunski
         
57
            { "A long time ago, in a galaxy far,",
58
              "far away...." };                    // yes, there really was a four-dot ellipsis
59
60 bc0a685b Leszek Koltunski
  private final String[] mCRAWLString = 
61 427ab7bf Leszek Koltunski
      
62
            { "It is a period of civil war.",      // in the original 1977 version, there was no 
63
              "Rebel spaceships, striking",        // 'Episode IV New Hope' subtitle line before
64
              "from a hidden base, have",          // the crawl. Lets keep to the classic.
65
              "won their first victory",
66
              "against the evil Galactic",
67
              "Empire.",
68
              "",
69
              "During the battle, rebel",
70
              "spies managed to steal",
71
              "secret plans to the Empire's",
72
              "ultimate weapon, the",
73
              "DEATH STAR, an armored",
74
              "space station with enough",
75
              "power to destroy an entire",
76
              "planet.",
77
              "",
78
              "Pursued by the Empire's",
79
              "sinister agents, Princess",
80
              "Leia races home aboard her",
81
              "starship, custodian of the",
82
              "stolen plans that can save",
83
              "her people and restore",
84
              "freedom to the galaxy...." };      // four-dot.
85
   
86 bc0a685b Leszek Koltunski
  private final int NUM_STARS = 40;
87 427ab7bf Leszek Koltunski
   
88 bc0a685b Leszek Koltunski
  private final int CRAWL_COLOR = 0xffffe81f;
89
  private final int GFFA_COLOR  = 0xff0000ff;
90
  private final int FONT_HEIGHT      = 40;
91
  private final int VERTICAL_SPACING = 10;
92
  private final String CRAWL_TYPEFACE = "News Gothic";
93 427ab7bf Leszek Koltunski
   
94 bc0a685b Leszek Koltunski
  private final int CRAWL_WIDTH = 500;
95
  private final int CRAWL_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mCRAWLString.length+1);
96 427ab7bf Leszek Koltunski
   
97 bc0a685b Leszek Koltunski
  private final int GFFA_WIDTH = 600;
98
  private final int GFFA_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mGFFAString.length+1);
99 427ab7bf Leszek Koltunski
   
100 bc0a685b Leszek Koltunski
  private final float CRAWL_ANGLE = -30.0f;
101 427ab7bf Leszek Koltunski
   
102 bc0a685b Leszek Koltunski
  private GLSurfaceView mView;
103
  private DistortedBitmap mScreen, mGFFA, mLogo, mCrawl, mCrawlBackground;
104
  private DistortedBitmap[] mStars;
105
  private long gffaID, logoID, crawlID;
106 427ab7bf Leszek Koltunski
    
107 bc0a685b Leszek Koltunski
  private Random mRnd = new Random(0);
108
  private DistortedNode mRoot, mBackground;
109 427ab7bf Leszek Koltunski
    
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111
112 bc0a685b Leszek Koltunski
  public StarWarsRenderer(GLSurfaceView v) 
113
    {
114
    mView = v;
115 427ab7bf Leszek Koltunski
     
116 bc0a685b Leszek Koltunski
    Distorted.setFov(60.0f);
117
    }
118 427ab7bf Leszek Koltunski
119
///////////////////////////////////////////////////////////////////////////////////////////////////
120
   
121 bc0a685b Leszek Koltunski
  public void onDrawFrame(GL10 glUnused) 
122
    {
123
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
124
    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
125 427ab7bf Leszek Koltunski
     
126 bc0a685b Leszek Koltunski
    mRoot.draw(System.currentTimeMillis());
127
    }
128 427ab7bf Leszek Koltunski
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130
    
131 bc0a685b Leszek Koltunski
  public void onSurfaceChanged(GL10 glUnused, int width, int height) 
132
    { 
133
    Distorted.onSurfaceChanged(width, height); 
134
    setupScreen(width,height);
135
    }
136 427ab7bf Leszek Koltunski
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
    
139 bc0a685b Leszek Koltunski
  public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
140
    {
141
    setupBitmaps();
142 427ab7bf Leszek Koltunski
         
143 bc0a685b Leszek Koltunski
    try
144
      {
145
      Distorted.onSurfaceCreated(mView.getContext());
146
      }
147
    catch(Exception ex)
148
      {
149
      android.util.Log.e("Star Wars", ex.getMessage() );
150 427ab7bf Leszek Koltunski
      }
151 bc0a685b Leszek Koltunski
    }
152 427ab7bf Leszek Koltunski
    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155 bc0a685b Leszek Koltunski
  private void setupScreen(int w, int h)
156
    {
157
    mScreen = new DistortedBitmap(w,h,1);
158
    mRoot = new DistortedNode(mScreen);
159 427ab7bf Leszek Koltunski
      
160 bc0a685b Leszek Koltunski
    mCrawlBackground = new DistortedBitmap(w,(int)(Math.sqrt(3.0)*h),1);
161 427ab7bf Leszek Koltunski
       
162 bc0a685b Leszek Koltunski
    int randomA, randomX, randomY, randomTime;
163
    float randomS, randomAlpha1, randomAlpha2;
164 427ab7bf Leszek Koltunski
       
165 7589635e Leszek Koltunski
    Static3D center = new Static3D(0,0,0);
166
    Static3D axis   = new Static3D(0,0,1);
167
168 bc0a685b Leszek Koltunski
    for(int i=0; i<NUM_STARS; i++)
169
      {
170
      randomX = mRnd.nextInt(w);
171
      randomY = mRnd.nextInt(h);
172
      randomS = 0.2f+ mRnd.nextFloat();
173
      randomA = (int)(180*mRnd.nextFloat());
174
      randomAlpha1 = 0.2f + 0.8f*mRnd.nextFloat();
175
      randomAlpha2 = 0.8f + 0.2f*mRnd.nextFloat();
176
      randomTime = 500+mRnd.nextInt(2000);
177 427ab7bf Leszek Koltunski
      
178 7589635e Leszek Koltunski
      mStars[i].move( new Static3D(randomX,randomY,0) );
179
      mStars[i].scale( new Static3D(randomS,randomS,randomS) );
180
      mStars[i].rotate( center, new Static1D(randomA), axis);
181 427ab7bf Leszek Koltunski
      
182 7589635e Leszek Koltunski
      Dynamic1D di = new Dynamic1D();
183 bc0a685b Leszek Koltunski
      di.setDuration(randomTime);
184
      di.setCount(0.0f);
185
      di.setNoise(0.3f);
186 7589635e Leszek Koltunski
      di.add(new Static1D(randomAlpha1));
187
      di.add(new Static1D(randomAlpha2));
188 427ab7bf Leszek Koltunski
      
189 7589635e Leszek Koltunski
      mStars[i].alpha(di, null, new Static2D(0,0));
190 427ab7bf Leszek Koltunski
      
191 bc0a685b Leszek Koltunski
      mRoot.attach(mStars[i]);
192 427ab7bf Leszek Koltunski
      }
193 bc0a685b Leszek Koltunski
      
194
    float scale = (0.5f*w/mGFFA.getWidth());
195
    
196 7589635e Leszek Koltunski
    Dynamic1D di = new Dynamic1D();
197 bc0a685b Leszek Koltunski
    di.setDuration(6000);
198
    di.setCount(0.5f);
199 7589635e Leszek Koltunski
    di.add(new Static1D(1.0f));
200
    di.add(new Static1D(1.0f));
201
    di.add(new Static1D(0.0f));
202 bc0a685b Leszek Koltunski
    
203 7589635e Leszek Koltunski
    mGFFA.move( new Static3D(w/5,h/3,0) );
204
    mGFFA.scale( new Static3D(scale,scale,scale) );
205
    mGFFA.alpha(di, null, new Static2D(0,0));
206 bc0a685b Leszek Koltunski
      
207
    mRoot.attach(mGFFA);
208
    mGFFA.addEventListener(this); 
209
    }
210 427ab7bf Leszek Koltunski
    
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212
213 bc0a685b Leszek Koltunski
  private void setupBitmaps()
214
    {
215
    InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.starwars);
216
    InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.star);
217 427ab7bf Leszek Koltunski
    
218 bc0a685b Leszek Koltunski
    Bitmap bitmapStar, bitmapGFFA, bitmapLogo, bitmapText;
219
      
220
    try 
221
      {
222
      bitmapLogo = BitmapFactory.decodeStream(is1);
223
      bitmapStar = BitmapFactory.decodeStream(is2);
224
      } 
225
    finally 
226
      {
227 427ab7bf Leszek Koltunski
      try 
228
        {
229 bc0a685b Leszek Koltunski
        is1.close();
230
        is2.close();
231 427ab7bf Leszek Koltunski
        } 
232 bc0a685b Leszek Koltunski
      catch(IOException e) { }
233
      } 
234 427ab7bf Leszek Koltunski
      
235 bc0a685b Leszek Koltunski
    Paint paint = new Paint();
236
    paint.setAntiAlias(true);
237
    paint.setTextAlign(Paint.Align.LEFT);
238
    paint.setTextSize(FONT_HEIGHT);
239
    paint.setColor(GFFA_COLOR);
240 427ab7bf Leszek Koltunski
      
241 bc0a685b Leszek Koltunski
    Typeface tf = Typeface.create(CRAWL_TYPEFACE, Typeface.BOLD);
242
    paint.setTypeface(tf);     
243 427ab7bf Leszek Koltunski
 
244 bc0a685b Leszek Koltunski
    ///// create GFFA ///////////////////
245
    mGFFA  = new DistortedBitmap(GFFA_WIDTH, GFFA_HEIGHT, 1);
246
    bitmapGFFA = Bitmap.createBitmap(GFFA_WIDTH,GFFA_HEIGHT,Bitmap.Config.ARGB_8888);
247
    bitmapGFFA.eraseColor(0x00000000);
248
    Canvas gffaCanvas = new Canvas(bitmapGFFA);
249 427ab7bf Leszek Koltunski
      
250 bc0a685b Leszek Koltunski
    for(int i=0; i<mGFFAString.length; i++)
251
      {
252
      gffaCanvas.drawText(mGFFAString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), paint);  
253
      }
254 427ab7bf Leszek Koltunski
  
255 bc0a685b Leszek Koltunski
    mGFFA.setBitmap(bitmapGFFA);
256 427ab7bf Leszek Koltunski
      
257 bc0a685b Leszek Koltunski
    ///// create Logo ///////////////////
258
    mLogo  = new DistortedBitmap(bitmapLogo, 1);
259 427ab7bf Leszek Koltunski
      
260 bc0a685b Leszek Koltunski
    ///// create CRAWL //////////////////
261
    mCrawl = new DistortedBitmap(CRAWL_WIDTH, CRAWL_HEIGHT, 1);
262
    bitmapText = Bitmap.createBitmap(CRAWL_WIDTH,CRAWL_HEIGHT,Bitmap.Config.ARGB_8888);
263
    bitmapText.eraseColor(0x00000000);
264
    Canvas textCanvas = new Canvas(bitmapText);
265
    paint.setColor(CRAWL_COLOR);
266 427ab7bf Leszek Koltunski
  
267 bc0a685b Leszek Koltunski
    for(int i=0; i<mCRAWLString.length; i++)
268
      {
269
      displayJustified(mCRAWLString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), CRAWL_WIDTH, textCanvas, paint);  
270
      }
271 427ab7bf Leszek Koltunski
      
272 bc0a685b Leszek Koltunski
    mCrawl.setBitmap(bitmapText);
273 427ab7bf Leszek Koltunski
      
274 bc0a685b Leszek Koltunski
    ///// create Stars ///////////////////
275 427ab7bf Leszek Koltunski
      
276 bc0a685b Leszek Koltunski
    mStars = new DistortedBitmap[NUM_STARS];
277 427ab7bf Leszek Koltunski
      
278 bc0a685b Leszek Koltunski
    mStars[0] = new DistortedBitmap(bitmapStar,1);
279 427ab7bf Leszek Koltunski
      
280 bc0a685b Leszek Koltunski
    for(int i=1; i<NUM_STARS; i++)
281
      {
282
      mStars[i] = new DistortedBitmap(mStars[0], Distorted.CLONE_BITMAP|Distorted.CLONE_VERTEX);  
283 427ab7bf Leszek Koltunski
      }
284 bc0a685b Leszek Koltunski
      
285
    gffaID = mGFFA.getID();
286
    logoID = mLogo.getID();
287
    crawlID= mCrawl.getID();
288
    }
289 427ab7bf Leszek Koltunski
 
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291
292 bc0a685b Leszek Koltunski
  private void displayJustified(String str, int x, int y, int length, Canvas c, Paint paint)
293
    { 
294
    int len       = str.length();
295
    int numspaces = retNumSpaces(str);
296 427ab7bf Leszek Koltunski
    
297 bc0a685b Leszek Koltunski
    if( len>0 && str.charAt(len-1) == ' ' ) numspaces--;
298 427ab7bf Leszek Koltunski
299 bc0a685b Leszek Koltunski
    float left=x,w = (numspaces>0 ? (length-paint.measureText(str))/numspaces : 0);
300
    String tmp;
301
    int begin,end=0;
302 427ab7bf Leszek Koltunski
303 bc0a685b Leszek Koltunski
    while( end<len )
304
      {
305
      begin=end;
306
      end = str.indexOf(' ', begin)+1;
307
      if( end<=0 ) end = len;
308 427ab7bf Leszek Koltunski
309 bc0a685b Leszek Koltunski
      tmp = str.substring(begin,end);
310
      c.drawText( tmp, left, y, paint);
311
      left+= (paint.measureText(tmp)+w);
312
      }  
313
    }
314 427ab7bf Leszek Koltunski
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316
   
317 bc0a685b Leszek Koltunski
  private int retNumSpaces(String str)
318
    {
319
    int begin=0, ret=0;
320 427ab7bf Leszek Koltunski
321 bc0a685b Leszek Koltunski
    while( true )
322
      {
323
      begin = str.indexOf(' ', begin) +1;
324 427ab7bf Leszek Koltunski
325 bc0a685b Leszek Koltunski
      if( begin>0 ) ret++;
326
      else break;
327 427ab7bf Leszek Koltunski
      }
328 bc0a685b Leszek Koltunski
329
    return ret;
330
    }
331 427ab7bf Leszek Koltunski
    
332
///////////////////////////////////////////////////////////////////////////////////////////////////
333
334 bc0a685b Leszek Koltunski
  public void effectMessage(final EffectMessage em, final long effectID, final int effectName, final long bitmapID, final String message)
335
    {
336
    if( em==EffectMessage.EFFECT_FINISHED )
337 427ab7bf Leszek Koltunski
      {
338 bc0a685b Leszek Koltunski
      if( bitmapID == gffaID )
339 427ab7bf Leszek Koltunski
        {
340 bc0a685b Leszek Koltunski
        mRoot.detach(mGFFA);   
341
        mGFFA.removeEventListener(this);
342 427ab7bf Leszek Koltunski
       
343 bc0a685b Leszek Koltunski
        int screenW=mScreen.getWidth();
344
        int screenH=mScreen.getHeight();
345 427ab7bf Leszek Koltunski
        
346 bc0a685b Leszek Koltunski
        int logoW = mLogo.getWidth();
347
        int logoH = mLogo.getHeight();
348 427ab7bf Leszek Koltunski
      
349 bc0a685b Leszek Koltunski
        int initSize= (int)(3.0f*screenW/logoW);
350
        int finaSize= (int)(0.1f*screenW/logoW);
351 427ab7bf Leszek Koltunski
      
352 7589635e Leszek Koltunski
        Dynamic3D di = new Dynamic3D();
353 427ab7bf Leszek Koltunski
      
354 7589635e Leszek Koltunski
        di.add(new Static3D(initSize,initSize,1));
355
        di.add(new Static3D(finaSize,finaSize,1));
356 bc0a685b Leszek Koltunski
        di.setCount(0.5f);
357
        di.setDuration(10000);
358 427ab7bf Leszek Koltunski
      
359 7589635e Leszek Koltunski
        mLogo.move( new Static3D(screenW/2,screenH/2,0) );
360 bc0a685b Leszek Koltunski
        mLogo.scale(di);
361 7589635e Leszek Koltunski
        mLogo.move( new Static3D(-logoW/2,-logoH/2,0) );
362 427ab7bf Leszek Koltunski
      
363 bc0a685b Leszek Koltunski
        mRoot.attach(mLogo);
364
        mLogo.addEventListener(this);
365
        }
366
      else if( bitmapID==logoID )
367
        {
368
        mRoot.detach(mLogo);   
369
        mLogo.removeEventListener(this);
370 427ab7bf Leszek Koltunski
        
371 bc0a685b Leszek Koltunski
        int crawlW = mCrawl.getWidth();
372
        int crawlH = mCrawl.getHeight();
373
        int screenW= mScreen.getWidth();
374
        int screenH= mScreen.getHeight();
375
        int backH  = mCrawlBackground.getHeight();
376
        float scale= (float)screenW/crawlW;
377
      
378 7589635e Leszek Koltunski
        Dynamic3D di = new Dynamic3D();
379 bc0a685b Leszek Koltunski
        di.setCount(0.5f);
380
        di.setDuration(60000);
381 7589635e Leszek Koltunski
        di.add(new Static3D(screenW/2,+backH       , 0));
382
        di.add(new Static3D(screenW/2,-scale*crawlH, 0));
383 427ab7bf Leszek Koltunski
        
384 7589635e Leszek Koltunski
        mCrawlBackground.move( new Static3D(0,screenH-backH,0) );
385
        mCrawlBackground.rotate(new Static3D(screenW/2,backH,0), new Static1D(CRAWL_ANGLE), new Static3D(1,0,0) );
386 427ab7bf Leszek Koltunski
        
387 bc0a685b Leszek Koltunski
        final int transpDistance = 5;
388 7589635e Leszek Koltunski
        mCrawlBackground.smooth_alpha((1-transpDistance/2)*1.0f, new Static4D(0,0,transpDistance*backH,transpDistance*backH), new Static2D(screenW/2,(1-transpDistance)*backH));
389 427ab7bf Leszek Koltunski
        
390 bc0a685b Leszek Koltunski
        mCrawl.move(di);
391 7589635e Leszek Koltunski
        mCrawl.scale( new Static3D(scale,scale,scale) );
392
        mCrawl.move( new Static3D(-crawlW/2,0,0) );
393 427ab7bf Leszek Koltunski
        
394 bc0a685b Leszek Koltunski
        mBackground = mRoot.attach(mCrawlBackground);
395
        mBackground.attach(mCrawl);
396
        mCrawl.addEventListener(this);
397
        }
398
      else if( bitmapID==crawlID )
399
        {
400
        mRoot.detach(mBackground);
401
        mBackground.detach(mCrawl);
402
        mCrawl.removeEventListener(this);
403 427ab7bf Leszek Koltunski
        }
404
      }
405 bc0a685b Leszek Koltunski
    }
406
  }