MotionBlurComponent.java :  » Graphics-3D-2D-OpenGL » freeland » com » replica » replicaisland » Android Open Source

Android Open Source » Graphics 3D 2D OpenGL » freeland 
freeland » com » replica » replicaisland » MotionBlurComponent.java
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.replica.replicaisland;

public class MotionBlurComponent extends GameComponent {
  private static final int STEP_COUNT = 4;
  private static final float STEP_DELAY = 0.1f;
  private static final float OPACITY_STEP = 1.0f / (STEP_COUNT + 1);
  private BlurRecord[] mHistory;
  private RenderComponent mBlurTarget;
  private float mStepDelay;
  private int mCurrentStep;
  private float mTimeSinceLastStep;
  private int mTargetPriority;
  
  private class BlurRecord {
    public Vector2 position = new Vector2();
    public Texture texture;
    public int width;
    public int height;
    public int[] crop = new int[4];
  }
  public MotionBlurComponent() {
        super();
        mHistory = new BlurRecord[STEP_COUNT];
        for (int x = 0; x < STEP_COUNT; x++) {
          mHistory[x] = new BlurRecord();
        }
        reset();
        setPhase(ComponentPhases.PRE_DRAW.ordinal());
    }
  
  @Override
  public void reset() {
    for (int x = 0; x < STEP_COUNT; x++) {
      mHistory[x].texture = null;
      mHistory[x].position.zero();
        }
    mStepDelay = STEP_DELAY;
    mBlurTarget = null;
    mCurrentStep = 0;
    mTimeSinceLastStep = 0.0f;
  }
  
  public void setTarget(RenderComponent target) {
    mBlurTarget = target;
  }
  
  @Override
  public void update(float timeDelta, BaseObject parent) {
    if (mBlurTarget != null) {
      mTimeSinceLastStep += timeDelta;
      if (mTimeSinceLastStep > mStepDelay) {
        DrawableBitmap drawable = (DrawableBitmap)mBlurTarget.getDrawable();
        if (drawable != null) {
          Texture currentTexture = drawable.getTexture();
          mTargetPriority = mBlurTarget.getPriority();
          mHistory[mCurrentStep].texture = currentTexture;
          mHistory[mCurrentStep].position.set(((GameObject)parent).getPosition());
          mHistory[mCurrentStep].width = drawable.getWidth();
          mHistory[mCurrentStep].height = drawable.getHeight();
          final int[] drawableCrop = drawable.getCrop();
          mHistory[mCurrentStep].crop[0] = drawableCrop[0];
          mHistory[mCurrentStep].crop[1] = drawableCrop[1];
          mHistory[mCurrentStep].crop[2] = drawableCrop[2];
          mHistory[mCurrentStep].crop[3] = drawableCrop[3];
          mCurrentStep = (mCurrentStep + 1) % STEP_COUNT;
          mTimeSinceLastStep = 0.0f;
        }
      }
      

            RenderSystem renderer = sSystemRegistry.renderSystem;
            
            
      final int startStep = mCurrentStep > 0 ? mCurrentStep - 1 : STEP_COUNT - 1;
      // draw each step
      for (int x = 0; x < STEP_COUNT; x++) {
        final int step = (startStep - x) < 0 ? (STEP_COUNT + (startStep - x)) : (startStep - x);
        final BlurRecord record = mHistory[step];
        if (record.texture != null) {
          DrawableBitmap stepImage = sSystemRegistry.drawableFactory.allocateDrawableBitmap();
          stepImage.setTexture(record.texture);
          stepImage.setWidth(record.width);
          stepImage.setHeight(record.height);
          stepImage.setCrop(record.crop[0], record.crop[1], record.crop[2], -record.crop[3]);
          final float opacity = (STEP_COUNT - x) * OPACITY_STEP;
          stepImage.setOpacity(opacity);
          
               
                    renderer.scheduleForDraw(stepImage, record.position, mTargetPriority - (x + 1), true);
        }
      }
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.