package no.agens.depth;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import no.agens.depth.headers.AuraDrawable;
import no.agens.depth.headers.NoiseEffect;
import no.agens.depth.headers.ParticleSystem;
import no.agens.depth.headers.Renderable;
import com.github.florent37.depth.lib.tween.FrameRateCounter;
/**
* Created by danielzeller on 01.10.14.
*/
public class BearSceneView extends View {
public static final int WIND_RANDOMIZE_INTERVAL = 300;
private Renderable[] renderables;
public BearSceneView(Context context) {
super(context);
}
private float wind = 10f;
float windRanomizerTarget;
float windRanomizerEased;
ParticleSystem flames;
ParticleSystem sparks;
Smoke smoke;
public BearSceneView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BearSceneView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (renderables == null) {
init();
}
}
private void init() {
renderables = new Renderable[17];
Bitmap threeB = BitmapFactory.decodeResource(getResources(), R.mipmap.tree);
addThree(threeB,getMeasuredWidth() * 0.18f, getMeasuredHeight() * -0.65f, 0.28f, 0.46f);
addThree(threeB,getMeasuredWidth() * 0.6f, getMeasuredHeight() * -0.65f, 0.33f, 0.46f);
addThree(threeB,getMeasuredWidth() * 0.45f, getMeasuredHeight() * -0.45f, 0.5f, 0.8f);
addThree(threeB,getMeasuredWidth() * 0.13f, getMeasuredHeight() * -0.65f, 0.3f, 0.46f);
addThree(threeB,getMeasuredWidth() * 0.83f, getMeasuredHeight() * -0.2f, 0.5f, 1f);
addThree(threeB,getMeasuredWidth() * 0.02f, getMeasuredHeight() * -0.1f, 0.8f, 1f);
addThree(threeB,getMeasuredWidth() * 0.18f, getMeasuredHeight() * 0.15f, 0.8f, 1f);
addThree(threeB,getMeasuredWidth() * 0.7f, getMeasuredHeight() * -0.1f, 0.8f, 1f);
Bitmap bear1 = BitmapFactory.decodeResource(getResources(), R.mipmap.bear_1);
Bitmap bear2 = BitmapFactory.decodeResource(getResources(), R.mipmap.bear_2);
Bitmap bear3 = BitmapFactory.decodeResource(getResources(), R.mipmap.bear_white);
Bitmap stones = BitmapFactory.decodeResource(getResources(), R.drawable.stones);
Bitmap smoke = BitmapFactory.decodeResource(getResources(), R.drawable.smoke);
Bitmap grunge = BitmapFactory.decodeResource(getResources(), R.drawable.grunge);
addFire(smoke, stones, getMeasuredWidth() * 0.61f, getMeasuredHeight() * 0.8f);
addBear(getMeasuredWidth() * 0.636f, getMeasuredHeight() * 0.59f, bear1, bear2);
addWhiteBear(getMeasuredWidth() * 0.44f, getMeasuredHeight() * 0.66f, bear3);
setLayerType(View.LAYER_TYPE_HARDWARE, null);
addGrunge(grunge);
}
private void addGrunge(Bitmap grunge) {
NoiseEffect noise = new NoiseEffect(grunge, 100, 2.5f);
renderables[index] = noise;
noise.setNoiseIntensity(0.25f);
index += 1;
}
private void addFire(Bitmap smoke, Bitmap stones, float x, float y) {
renderables[index] = new AuraDrawable(getResources().getDrawable(R.drawable.aura_gradient), new Rect((int) (getMeasuredWidth() * 0.44f), (int) (getMeasuredHeight() * 0.4f), (int) (getMeasuredWidth() * 0.8f), (int) (getMeasuredHeight() * 1.1f)));
index += 1;
renderables[index] = new AuraDrawable(getResources().getDrawable(R.drawable.aura_gradient_inner), new Rect((int) (getMeasuredWidth() * 0.5f), (int) (getMeasuredHeight() * 0.6f), (int) (getMeasuredWidth() * 0.72f), (int) (getMeasuredHeight() * 1f)));
index += 1;
float density = getResources().getDisplayMetrics().density;
float randomXPlacement = 5f * density;
flames = new ParticleSystem(x, y, 30, -30f * density, randomXPlacement);
sparks = new ParticleSystem(x, y, 600, -30f * density, randomXPlacement);
renderables[index] = flames;
flames.setParticleSize((int) (8f * density));
flames.setRandomMovementX(20f * density);
flames.setRandomMovementY(1.5f * density);
flames.setColors(getResources().getColor(R.color.fire_start_color), getResources().getColor(R.color.fire_end_color));
index += 1;
renderables[index] = sparks;
sparks.setParticleSize((int) (1f * density));
sparks.setRandomMovementX(25f * density);
sparks.setRandomMovementY(2.5f * density);
sparks.setRandomMovementChangeInterval(900);
sparks.setColors(getResources().getColor(R.color.fire_start_color), getResources().getColor(R.color.fire_start_color));
sparks.setMinYCoord(0);
index += 1;
renderables[index] = new Renderable(stones, x - randomXPlacement * 2f, y);
index += 1;
this.smoke = new Smoke(smoke, x, getMeasuredHeight() * 0.68f, 110 * density, 60 * density, 8, density);
renderables[index] = this.smoke;
index += 1;
}
private void addWhiteBear(float v, float v1, Bitmap bear3) {
renderables[index] = new Renderable(bear3, v, v1);
index += 1;
}
private void addBear(float v, float v1, Bitmap bear1, Bitmap bear2) {
renderables[index] = new RenderableBear(new Bitmap[]{bear1, bear2}, v, v1);
index += 1;
}
int index = 0;
void addThree(Bitmap bitmap, float x, float y, float scale, float alpha) {
renderables[index] = new RenderableThree(bitmap, x, y, alpha);
renderables[index].setScale(scale, scale);
index += 1;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
destroyResources();
}
private void destroyResources() {
for (Renderable renderable: renderables)
renderable.destroy();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (renderables == null && getWidth() != 0)
init();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float deltaTime = FrameRateCounter.timeStep();
windRanomizerEased += ((windRanomizerTarget - windRanomizerEased) * 4f) * deltaTime;
for (Renderable renderable : renderables) {
renderable.draw(canvas);
if (renderable instanceof Smoke || renderable instanceof ParticleSystem)
renderable.update(deltaTime, wind);
else
renderable.update(deltaTime, wind + windRanomizerEased);
}
if (lastWindRandomChange + WIND_RANDOMIZE_INTERVAL < System.currentTimeMillis()) {
lastWindRandomChange = System.currentTimeMillis();
float randomSpeedInterval = Math.max(wind / 2, 1);
windRanomizerTarget = (float) MathHelper.rand.nextInt((int) randomSpeedInterval) - randomSpeedInterval / 2f;
}
if (!pause)
invalidate();
}
public void setPause(boolean pause) {
this.pause = pause;
if (!pause) {
FrameRateCounter.timeStep();
invalidate();
for (Renderable renderable : renderables)
renderable.resume();
} else {
for (Renderable renderable : renderables)
renderable.pause();
}
}
private boolean pause = false;
long lastWindRandomChange;
public void setWind(int wind) {
this.wind = wind;
}
float LOWEST_FLAMES_COORD = 0.8f;
float HIGHEST_FLAMES_COORD = 0.4f;
float HIGHEST_SMOKE_COORD = 0.6f;
public void setFlamesHeight(int progress) {
float flamesHeight = getYCoordByPercent(LOWEST_FLAMES_COORD - ((LOWEST_FLAMES_COORD - HIGHEST_FLAMES_COORD) * ((float) progress / 100f)));
flames.setMinYCoord(flamesHeight);
float smokeYCoord = getYCoordByPercent(LOWEST_FLAMES_COORD - ((LOWEST_FLAMES_COORD - HIGHEST_SMOKE_COORD) * ((float) progress / 100f)));
smoke.setY(smokeYCoord);
}
private float getYCoordByPercent(float percent) {
return getHeight() * percent;
}
}