Project

General

Profile

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

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

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