Project

General

Profile

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

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

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