blob: ae6509cf7dc03ed4b423c49a1834a2ede67e7e9a [file] [log] [blame]
/*
* Copyright (C) 2009 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.cooliris.media;
import javax.microedition.khronos.opengles.GL11;
import android.util.Log;
public class CrossFadingTexture {
private static final String TAG = "CrossFadingTexture";
private Texture mTexture;
private Texture mFadingTexture;
private float mMixRatio = 0.0f;
private float mAnimatedMixRatio = 0.0f;
private boolean mBindUsingMixed = false;
private boolean mBind = false;
private boolean mFadeNecessary = false;
public CrossFadingTexture() {
}
public CrossFadingTexture(Texture initialTexture) {
mMixRatio = 1.0f;
mAnimatedMixRatio = 1.0f;
mFadeNecessary = false;
mTexture = initialTexture;
mFadingTexture = initialTexture;
}
public void clear() {
mTexture = null;
mFadingTexture = null;
}
public CrossFadingTexture(Texture source, Texture destination) {
mFadingTexture = source;
mTexture = destination;
mMixRatio = 1.0f;
mAnimatedMixRatio = 0.0f;
Log.i(TAG, "Creating crossfading texture");
}
public Texture getTexture() {
return mTexture;
}
public void setTexture(Texture texture) {
if (mTexture == texture || texture == null || mAnimatedMixRatio < 1.0f) {
return;
}
mFadeNecessary = false;
if (mFadingTexture == null) {
mFadeNecessary = true;
}
if (mTexture != null) {
mFadingTexture = mTexture;
} else {
mFadingTexture = texture;
}
mTexture = texture;
mAnimatedMixRatio = 0.0f;
mMixRatio = 1.0f;
}
public void setTextureImmediate(Texture texture) {
if (texture == null || texture.isLoaded() == false || mTexture == texture) {
return;
}
if (mTexture != null) {
mFadingTexture = mTexture;
}
mTexture = texture;
mMixRatio = 1.0f;
}
public boolean update(float timeElapsed) {
if (mTexture != null && mFadingTexture != null && mTexture.isLoaded() && mFadingTexture.isLoaded()) {
mAnimatedMixRatio = FloatUtils.animate(mAnimatedMixRatio, mMixRatio, timeElapsed * 0.5f);
return (mMixRatio != mAnimatedMixRatio);
} else {
mAnimatedMixRatio = 0.0f;
return false;
}
}
public boolean bind(RenderView view, GL11 gl) {
if (mBind) {
return true; // Already bound.
}
if (mFadingTexture != null && mFadingTexture.mState == Texture.STATE_ERROR) {
mFadingTexture = null;
}
if (mTexture != null && mTexture.mState == Texture.STATE_ERROR) {
mTexture = null;
}
mBindUsingMixed = false;
boolean fadingTextureLoaded = false;
boolean textureLoaded = false;
if (mFadingTexture != null) {
fadingTextureLoaded = view.bind(mFadingTexture);
}
if (mTexture != null) {
view.bind(mTexture);
textureLoaded = mTexture.isLoaded();
}
if (mFadeNecessary) {
if (view.getAlpha() > mAnimatedMixRatio) {
view.setAlpha(mAnimatedMixRatio);
}
if (mAnimatedMixRatio == 1.0f) {
mFadeNecessary = false;
}
}
if (textureLoaded == false && fadingTextureLoaded == false) {
return false;
}
mBind = true;
if (mAnimatedMixRatio <= 0.0f && fadingTextureLoaded) {
view.bind(mFadingTexture);
} else if (mAnimatedMixRatio >= 1.0f || !fadingTextureLoaded || view.getAlpha() < mAnimatedMixRatio
|| mFadingTexture == mTexture) {
view.bind(mTexture);
} else {
mBindUsingMixed = true;
view.bindMixed(mFadingTexture, mTexture, mAnimatedMixRatio);
}
return true;
}
public void unbind(RenderView view, GL11 gl) {
if (mBindUsingMixed && mBind) {
view.unbindMixed();
mBindUsingMixed = false;
}
mBind = false;
}
}