Project

General

Profile

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

examples / src / main / java / org / distorted / examples / starwars / StarWarsRenderer.java @ 2f7afccf

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 8744aa41 Leszek Koltunski
import org.distorted.library.DistortedNode;
32 d218d64e leszek
import org.distorted.library.DistortedScreen;
33 b01acdaf Leszek Koltunski
import org.distorted.library.MeshFlat;
34 c5a28eb8 Leszek Koltunski
import org.distorted.library.EffectNames;
35 7589635e Leszek Koltunski
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 13efa930 Leszek Koltunski
import org.distorted.library.message.EffectListener;
41
import org.distorted.library.message.EffectMessage;
42 5068fa06 Leszek Koltunski
import org.distorted.library.Distorted;
43 f6d884d5 Leszek Koltunski
import org.distorted.library.DistortedTexture;
44 d04a4886 Leszek Koltunski
import org.distorted.library.DistortedEffects;
45 427ab7bf Leszek Koltunski
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 41a81a14 Leszek Koltunski
import android.opengl.GLES30;
52 427ab7bf Leszek Koltunski
import android.opengl.GLSurfaceView;
53
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
56
class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
57 bc0a685b Leszek Koltunski
  {
58
  private final String[] mGFFAString = 
59 427ab7bf Leszek Koltunski
         
60
            { "A long time ago, in a galaxy far,",
61
              "far away...." };                    // yes, there really was a four-dot ellipsis
62
63 bc0a685b Leszek Koltunski
  private final String[] mCRAWLString = 
64 427ab7bf Leszek Koltunski
      
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 76f2d645 leszek
  private final int NUM_STARS = 40;
90 427ab7bf Leszek Koltunski
   
91 bc0a685b Leszek Koltunski
  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 427ab7bf Leszek Koltunski
   
97 bc0a685b Leszek Koltunski
  private final int CRAWL_WIDTH = 500;
98
  private final int CRAWL_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mCRAWLString.length+1);
99 427ab7bf Leszek Koltunski
   
100 bc0a685b Leszek Koltunski
  private final int GFFA_WIDTH = 600;
101
  private final int GFFA_HEIGHT= (FONT_HEIGHT+VERTICAL_SPACING)*(mGFFAString.length+1);
102 427ab7bf Leszek Koltunski
   
103 bc0a685b Leszek Koltunski
  private final float CRAWL_ANGLE = -30.0f;
104 2f7afccf leszek
  private final float FOV_ANGLE   =  60.0f;
105
106 bc0a685b Leszek Koltunski
  private GLSurfaceView mView;
107 d2aee6cc leszek
  private DistortedTexture mGFFATexture, mLogoTexture, mCrawlTexture, mCrawlBackgroundTexture, mStarTexture;
108
  private DistortedEffects mGFFAEffects, mLogoEffects, mCrawlEffects, mCrawlBackgroundEffects;
109 d04a4886 Leszek Koltunski
  private DistortedEffects[] mStarEffects;
110 d2aee6cc leszek
  private DistortedNode mBackground;
111 d218d64e leszek
  private DistortedScreen mScreen;
112 b01acdaf Leszek Koltunski
  private MeshFlat mQuad;
113 392e16fd Leszek Koltunski
114
  private long gffaID, logoID, crawlID;
115
  private Random mRnd = new Random(0);
116 c4f5a8db Leszek Koltunski
  private int mWidth, mHeight;
117 e8b6aa95 Leszek Koltunski
118 427ab7bf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
119
120 e7a4ef16 Leszek Koltunski
  StarWarsRenderer(GLSurfaceView v)
121 bc0a685b Leszek Koltunski
    {
122
    mView = v;
123 e8b6aa95 Leszek Koltunski
124 b01acdaf Leszek Koltunski
    mQuad = new MeshFlat(1,1);
125 f6d884d5 Leszek Koltunski
126 d04a4886 Leszek Koltunski
    mGFFAEffects            = new DistortedEffects();
127
    mLogoEffects            = new DistortedEffects();
128
    mCrawlEffects           = new DistortedEffects();
129
    mCrawlBackgroundEffects = new DistortedEffects();
130 f6d884d5 Leszek Koltunski
131 3f5b2cb3 leszek
    if( NUM_STARS>0 )
132
      {
133
      mStarEffects = new DistortedEffects[NUM_STARS];
134
      mStarEffects[0] = new DistortedEffects();
135 f6d884d5 Leszek Koltunski
136 3f5b2cb3 leszek
      for (int i = 1; i < NUM_STARS; i++)
137
        mStarEffects[i] = new DistortedEffects(mStarEffects[0], Distorted.CLONE_VERTEX);
138
      }
139 f6d884d5 Leszek Koltunski
140 d218d64e leszek
    mScreen = new DistortedScreen();
141 2f7afccf leszek
    mScreen.setProjection(FOV_ANGLE, 0.02f);
142 bc0a685b Leszek Koltunski
    }
143 427ab7bf Leszek Koltunski
144 c4f5a8db Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
145
146
  public void onPause()
147
    {
148
    mWidth = 0;
149
    mHeight= 0;
150
    }
151
152 427ab7bf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
153
   
154 bc0a685b Leszek Koltunski
  public void onDrawFrame(GL10 glUnused) 
155
    {
156 41a81a14 Leszek Koltunski
    GLES30.glClear( GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
157 fe59d375 Leszek Koltunski
    mScreen.render(System.currentTimeMillis());
158 bc0a685b Leszek Koltunski
    }
159 427ab7bf Leszek Koltunski
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161
    
162 bc0a685b Leszek Koltunski
  public void onSurfaceChanged(GL10 glUnused, int width, int height) 
163 b4cc083b Leszek Koltunski
    {
164 c4f5a8db Leszek Koltunski
    if( mWidth!=width || mHeight!=height )  // after onPause() we get 2 calls here
165
      {
166
      mWidth = width;
167
      mHeight= height;
168 b4cc083b Leszek Koltunski
169 392e16fd Leszek Koltunski
      mGFFAEffects.abortAllEffects();
170
      mLogoEffects.abortAllEffects();
171
      mCrawlEffects.abortAllEffects();
172
      mCrawlBackgroundEffects.abortAllEffects();
173 b4cc083b Leszek Koltunski
174 d04a4886 Leszek Koltunski
      for(int i=0; i<NUM_STARS; i++) mStarEffects[i].abortAllEffects();
175 b4cc083b Leszek Koltunski
176 fe59d375 Leszek Koltunski
      mScreen.detachAll();
177 d2aee6cc leszek
      setupScreen(width,height);
178 392e16fd Leszek Koltunski
      mScreen.resize(width, height);
179 c4f5a8db Leszek Koltunski
      }
180 bc0a685b Leszek Koltunski
    }
181 427ab7bf Leszek Koltunski
182
///////////////////////////////////////////////////////////////////////////////////////////////////
183
    
184 bc0a685b Leszek Koltunski
  public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
185
    {
186 41a81a14 Leszek Koltunski
    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
187 e7a4ef16 Leszek Koltunski
188 bc0a685b Leszek Koltunski
    setupBitmaps();
189 b4cc083b Leszek Koltunski
190 bc0a685b Leszek Koltunski
    try
191
      {
192 76f9798b Leszek Koltunski
      Distorted.onCreate(mView.getContext());
193 bc0a685b Leszek Koltunski
      }
194
    catch(Exception ex)
195
      {
196
      android.util.Log.e("Star Wars", ex.getMessage() );
197 427ab7bf Leszek Koltunski
      }
198 bc0a685b Leszek Koltunski
    }
199 427ab7bf Leszek Koltunski
    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202 bc0a685b Leszek Koltunski
  private void setupScreen(int w, int h)
203
    {
204 2f7afccf leszek
    double angleA = (90.0f - FOV_ANGLE/2)*Math.PI/180;
205
    double angleB = (90.0f - FOV_ANGLE/2 +CRAWL_ANGLE)*Math.PI/180;
206
207
    mCrawlBackgroundTexture = new DistortedTexture(w,(int)(h*Math.sin(angleA)/Math.sin(angleB)));
208 427ab7bf Leszek Koltunski
       
209 bc0a685b Leszek Koltunski
    int randomA, randomX, randomY, randomTime;
210
    float randomS, randomAlpha1, randomAlpha2;
211 427ab7bf Leszek Koltunski
       
212 7589635e Leszek Koltunski
    Static3D center = new Static3D(0,0,0);
213
    Static3D axis   = new Static3D(0,0,1);
214 9ff0c8c3 Leszek Koltunski
    Static1D alphaNoise = new Static1D(0.4f);
215
216 bc0a685b Leszek Koltunski
    for(int i=0; i<NUM_STARS; i++)
217
      {
218
      randomX = mRnd.nextInt(w);
219
      randomY = mRnd.nextInt(h);
220 f6d884d5 Leszek Koltunski
      randomS = 0.2f+ 0.8f*mRnd.nextFloat();
221 bc0a685b Leszek Koltunski
      randomA = (int)(180*mRnd.nextFloat());
222
      randomAlpha1 = 0.2f + 0.8f*mRnd.nextFloat();
223
      randomAlpha2 = 0.8f + 0.2f*mRnd.nextFloat();
224
      randomTime = 500+mRnd.nextInt(2000);
225 427ab7bf Leszek Koltunski
      
226 d04a4886 Leszek Koltunski
      mStarEffects[i].move( new Static3D(randomX,randomY,0) );
227
      mStarEffects[i].scale(randomS);
228
      mStarEffects[i].rotate( new Static1D(randomA), axis, center );
229 427ab7bf Leszek Koltunski
      
230 f988589e Leszek Koltunski
      Dynamic1D di = new Dynamic1D(randomTime,0.0f);
231 9ff0c8c3 Leszek Koltunski
      di.setNoise(alphaNoise);
232 7589635e Leszek Koltunski
      di.add(new Static1D(randomAlpha1));
233
      di.add(new Static1D(randomAlpha2));
234 427ab7bf Leszek Koltunski
      
235 d04a4886 Leszek Koltunski
      mStarEffects[i].alpha(di);
236 427ab7bf Leszek Koltunski
      
237 d2aee6cc leszek
      mScreen.attach(mStarTexture, mStarEffects[i], mQuad);
238 427ab7bf Leszek Koltunski
      }
239 bc0a685b Leszek Koltunski
      
240 f6d884d5 Leszek Koltunski
    float scale = (0.5f*w/mGFFATexture.getWidth());
241 bc0a685b Leszek Koltunski
    
242 f988589e Leszek Koltunski
    Dynamic1D di = new Dynamic1D(6000,0.5f);
243 7589635e Leszek Koltunski
    di.add(new Static1D(1.0f));
244
    di.add(new Static1D(1.0f));
245
    di.add(new Static1D(0.0f));
246 bc0a685b Leszek Koltunski
    
247 392e16fd Leszek Koltunski
    mGFFAEffects.move( new Static3D(w/5,h/3,0) );
248
    mGFFAEffects.scale( new Static3D(scale,scale,scale) );
249
    mGFFAEffects.alpha(di);
250 bc0a685b Leszek Koltunski
      
251 d2aee6cc leszek
    mScreen.attach(mGFFATexture, mGFFAEffects, mQuad);
252 392e16fd Leszek Koltunski
    mGFFAEffects.registerForMessages(this);
253 bc0a685b Leszek Koltunski
    }
254 427ab7bf Leszek Koltunski
    
255
///////////////////////////////////////////////////////////////////////////////////////////////////
256
257 bc0a685b Leszek Koltunski
  private void setupBitmaps()
258
    {
259
    InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.starwars);
260
    InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.star);
261 427ab7bf Leszek Koltunski
    
262 bc0a685b Leszek Koltunski
    Bitmap bitmapStar, bitmapGFFA, bitmapLogo, bitmapText;
263
      
264
    try 
265
      {
266
      bitmapLogo = BitmapFactory.decodeStream(is1);
267
      bitmapStar = BitmapFactory.decodeStream(is2);
268
      } 
269
    finally 
270
      {
271 427ab7bf Leszek Koltunski
      try 
272
        {
273 bc0a685b Leszek Koltunski
        is1.close();
274
        is2.close();
275 427ab7bf Leszek Koltunski
        } 
276 bc0a685b Leszek Koltunski
      catch(IOException e) { }
277
      } 
278 427ab7bf Leszek Koltunski
      
279 bc0a685b Leszek Koltunski
    Paint paint = new Paint();
280
    paint.setAntiAlias(true);
281
    paint.setTextAlign(Paint.Align.LEFT);
282
    paint.setTextSize(FONT_HEIGHT);
283
    paint.setColor(GFFA_COLOR);
284 427ab7bf Leszek Koltunski
      
285 bc0a685b Leszek Koltunski
    Typeface tf = Typeface.create(CRAWL_TYPEFACE, Typeface.BOLD);
286
    paint.setTypeface(tf);     
287 427ab7bf Leszek Koltunski
 
288 bc0a685b Leszek Koltunski
    ///// create GFFA ///////////////////
289 7451c98a Leszek Koltunski
    mGFFATexture  = new DistortedTexture(GFFA_WIDTH,GFFA_HEIGHT);
290 bc0a685b Leszek Koltunski
    bitmapGFFA = Bitmap.createBitmap(GFFA_WIDTH,GFFA_HEIGHT,Bitmap.Config.ARGB_8888);
291
    bitmapGFFA.eraseColor(0x00000000);
292
    Canvas gffaCanvas = new Canvas(bitmapGFFA);
293 427ab7bf Leszek Koltunski
      
294 bc0a685b Leszek Koltunski
    for(int i=0; i<mGFFAString.length; i++)
295
      {
296
      gffaCanvas.drawText(mGFFAString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), paint);  
297
      }
298 427ab7bf Leszek Koltunski
  
299 f6d884d5 Leszek Koltunski
    mGFFATexture.setTexture(bitmapGFFA);
300 427ab7bf Leszek Koltunski
      
301 bc0a685b Leszek Koltunski
    ///// create Logo ///////////////////
302 7451c98a Leszek Koltunski
    mLogoTexture  = new DistortedTexture(bitmapLogo.getWidth(),bitmapLogo.getHeight());
303 f6d884d5 Leszek Koltunski
    mLogoTexture.setTexture(bitmapLogo);
304 e8b6aa95 Leszek Koltunski
305 bc0a685b Leszek Koltunski
    ///// create CRAWL //////////////////
306 7451c98a Leszek Koltunski
    mCrawlTexture = new DistortedTexture(CRAWL_WIDTH,CRAWL_HEIGHT);
307 bc0a685b Leszek Koltunski
    bitmapText = Bitmap.createBitmap(CRAWL_WIDTH,CRAWL_HEIGHT,Bitmap.Config.ARGB_8888);
308
    bitmapText.eraseColor(0x00000000);
309
    Canvas textCanvas = new Canvas(bitmapText);
310
    paint.setColor(CRAWL_COLOR);
311 427ab7bf Leszek Koltunski
  
312 bc0a685b Leszek Koltunski
    for(int i=0; i<mCRAWLString.length; i++)
313
      {
314
      displayJustified(mCRAWLString[i], 0, (i+1)*(FONT_HEIGHT+VERTICAL_SPACING), CRAWL_WIDTH, textCanvas, paint);  
315
      }
316 427ab7bf Leszek Koltunski
      
317 f6d884d5 Leszek Koltunski
    mCrawlTexture.setTexture(bitmapText);
318 427ab7bf Leszek Koltunski
      
319 bc0a685b Leszek Koltunski
    ///// create Stars ///////////////////
320 7451c98a Leszek Koltunski
    mStarTexture = new DistortedTexture(bitmapStar.getWidth(),bitmapStar.getHeight());
321 f6d884d5 Leszek Koltunski
    mStarTexture.setTexture(bitmapStar);
322 e8b6aa95 Leszek Koltunski
323 392e16fd Leszek Koltunski
    gffaID = mGFFAEffects.getID();
324
    logoID = mLogoEffects.getID();
325
    crawlID= mCrawlEffects.getID();
326 bc0a685b Leszek Koltunski
    }
327 427ab7bf Leszek Koltunski
 
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329
330 bc0a685b Leszek Koltunski
  private void displayJustified(String str, int x, int y, int length, Canvas c, Paint paint)
331
    { 
332
    int len       = str.length();
333
    int numspaces = retNumSpaces(str);
334 427ab7bf Leszek Koltunski
    
335 bc0a685b Leszek Koltunski
    if( len>0 && str.charAt(len-1) == ' ' ) numspaces--;
336 427ab7bf Leszek Koltunski
337 bc0a685b Leszek Koltunski
    float left=x,w = (numspaces>0 ? (length-paint.measureText(str))/numspaces : 0);
338
    String tmp;
339
    int begin,end=0;
340 427ab7bf Leszek Koltunski
341 bc0a685b Leszek Koltunski
    while( end<len )
342
      {
343
      begin=end;
344
      end = str.indexOf(' ', begin)+1;
345
      if( end<=0 ) end = len;
346 427ab7bf Leszek Koltunski
347 bc0a685b Leszek Koltunski
      tmp = str.substring(begin,end);
348
      c.drawText( tmp, left, y, paint);
349
      left+= (paint.measureText(tmp)+w);
350
      }  
351
    }
352 427ab7bf Leszek Koltunski
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354
   
355 bc0a685b Leszek Koltunski
  private int retNumSpaces(String str)
356
    {
357
    int begin=0, ret=0;
358 427ab7bf Leszek Koltunski
359 bc0a685b Leszek Koltunski
    while( true )
360
      {
361
      begin = str.indexOf(' ', begin) +1;
362 427ab7bf Leszek Koltunski
363 bc0a685b Leszek Koltunski
      if( begin>0 ) ret++;
364
      else break;
365 427ab7bf Leszek Koltunski
      }
366 bc0a685b Leszek Koltunski
367
    return ret;
368
    }
369 427ab7bf Leszek Koltunski
    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371 c5a28eb8 Leszek Koltunski
// the library sending messages to us. This is running on a library 'MessageSender' thread.
372 427ab7bf Leszek Koltunski
373 9d12dd4a Leszek Koltunski
  public void effectMessage(final EffectMessage em, final long effectID, final EffectNames effectName, final long objectID)
374 bc0a685b Leszek Koltunski
    {
375
    if( em==EffectMessage.EFFECT_FINISHED )
376 427ab7bf Leszek Koltunski
      {
377 c5a28eb8 Leszek Koltunski
      if( objectID == gffaID )
378 427ab7bf Leszek Koltunski
        {
379 d2aee6cc leszek
        mScreen.detach(mGFFAEffects);
380 3c8b1903 Leszek Koltunski
        mGFFATexture.markForDeletion();
381 611ea379 Leszek Koltunski
382 d2aee6cc leszek
        int screenW=mScreen.getWidth();
383
        int screenH=mScreen.getHeight();
384 427ab7bf Leszek Koltunski
        
385 f6d884d5 Leszek Koltunski
        int logoW = mLogoTexture.getWidth();
386
        int logoH = mLogoTexture.getHeight();
387 427ab7bf Leszek Koltunski
      
388 bc0a685b Leszek Koltunski
        int initSize= (int)(3.0f*screenW/logoW);
389
        int finaSize= (int)(0.1f*screenW/logoW);
390 427ab7bf Leszek Koltunski
      
391 f988589e Leszek Koltunski
        Dynamic3D di = new Dynamic3D(10000,0.5f);
392 7589635e Leszek Koltunski
        di.add(new Static3D(initSize,initSize,1));
393
        di.add(new Static3D(finaSize,finaSize,1));
394 f988589e Leszek Koltunski
395 392e16fd Leszek Koltunski
        mLogoEffects.move( new Static3D(screenW/2,screenH/2,0) );
396
        mLogoEffects.scale(di);
397
        mLogoEffects.move( new Static3D(-logoW/2,-logoH/2,0) );
398 427ab7bf Leszek Koltunski
      
399 d2aee6cc leszek
        mScreen.attach(mLogoTexture, mLogoEffects,mQuad);
400 392e16fd Leszek Koltunski
        mLogoEffects.registerForMessages(this);
401 bc0a685b Leszek Koltunski
        }
402 c5a28eb8 Leszek Koltunski
      else if( objectID==logoID )
403 bc0a685b Leszek Koltunski
        {
404 d2aee6cc leszek
        mScreen.detach(mLogoEffects);
405 3c8b1903 Leszek Koltunski
        mLogoTexture.markForDeletion();
406 427ab7bf Leszek Koltunski
        
407 f6d884d5 Leszek Koltunski
        int crawlW = mCrawlTexture.getWidth();
408
        int crawlH = mCrawlTexture.getHeight();
409 d2aee6cc leszek
        int screenW= mScreen.getWidth();
410
        int screenH= mScreen.getHeight();
411 f6d884d5 Leszek Koltunski
        int backH  = mCrawlBackgroundTexture.getHeight();
412 bc0a685b Leszek Koltunski
        float scale= (float)screenW/crawlW;
413 ee82510e leszek
414 392e16fd Leszek Koltunski
        mCrawlBackgroundEffects.move( new Static3D(0,screenH-backH,0) );
415
        mCrawlBackgroundEffects.rotate( new Static1D(CRAWL_ANGLE), new Static3D(1,0,0), new Static3D(screenW/2,backH,0) );
416 ee82510e leszek
417 59759251 Leszek Koltunski
        final int transpDist = 5;
418
        Static4D region = new Static4D(screenW/2,(1-transpDist)*backH,transpDist*backH,transpDist*backH);
419 2f7afccf leszek
        mCrawlBackgroundEffects.alpha(new Static1D(1-transpDist*0.6f), region, true);
420 ee82510e leszek
421 2f7afccf leszek
        Dynamic3D di = new Dynamic3D(70000,0.5f);
422 ee82510e leszek
        di.add(new Static3D(screenW/2,+backH       , 0));
423
        di.add(new Static3D(screenW/2,-scale*crawlH, 0));
424
425 392e16fd Leszek Koltunski
        mCrawlEffects.move(di);
426
        mCrawlEffects.scale( new Static3D(scale,scale,scale) );
427
        mCrawlEffects.move( new Static3D(-crawlW/2,0,0) );
428 427ab7bf Leszek Koltunski
        
429 d2aee6cc leszek
        mBackground = mScreen.attach(mCrawlBackgroundTexture, mCrawlBackgroundEffects,mQuad);
430 392e16fd Leszek Koltunski
        mBackground.attach(mCrawlTexture, mCrawlEffects,mQuad);
431 fc695380 leszek
        mBackground.glDisable(GLES30.GL_DEPTH_TEST);
432
        mBackground.glDepthMask(false);
433 392e16fd Leszek Koltunski
        mCrawlEffects.registerForMessages(this);
434 bc0a685b Leszek Koltunski
        }
435 c5a28eb8 Leszek Koltunski
      else if( objectID==crawlID )
436 bc0a685b Leszek Koltunski
        {
437 d2aee6cc leszek
        mScreen.detach(mBackground);
438 392e16fd Leszek Koltunski
        mBackground.detach(mCrawlEffects);
439 3c8b1903 Leszek Koltunski
        mCrawlTexture.markForDeletion();
440 392e16fd Leszek Koltunski
        mCrawlBackgroundEffects.abortAllEffects();
441 3c8b1903 Leszek Koltunski
        mCrawlBackgroundTexture.markForDeletion();
442 427ab7bf Leszek Koltunski
        }
443
      }
444 bc0a685b Leszek Koltunski
    }
445
  }