package com.xtremelabs.devicewallmarblerun.objecttypes;
import org.jbox2d.common.Vec2;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.xtremelabs.devicewallmarblerun.engine.GameProperties;
import com.xtremelabs.devicewallmarblerun.utils.JSONProperties;
import com.xtremelabs.devicewallmarblerun.utils.ScreenProperties;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.RadialGradient;
import android.graphics.Shader.TileMode;
import android.util.Log;
public class RectDrawing extends DrawableObject {
float width = 1;
float height = 1;
Vec2[] verticies = new Vec2[1];
float BLOCK_HEIGHT = 0.5f;
public Vec2 position = new Vec2();
public Vec2 nearestPoint = new Vec2();
public float angle = 0;
private Vec2[] vertex = new Vec2[8];
private int myGlowColor = 0;
Path pathBack = new Path();
Path pathSide = new Path();
Path pathHeight = new Path();
private static Paint faces = new Paint();
private static Paint edges = new Paint();
static{
faces.setColor(Color.WHITE);
faces.setStyle(Style.FILL);
edges.setColor(Color.BLACK);
edges.setStyle(Style.STROKE);
edges.setStrokeWidth(2f);
}
{
myGlowColor = 0xFF000000 | (int)(Math.random()*0xFFFFFF);
}
public RectDrawing(int paintid, JSONObject json) {
super(paintid, json);
usePaint = new Paint(faces);
}
@Override
public void drawMe(Canvas canvas) {
drawCube(0, BLOCK_HEIGHT, canvas, true);
}
@Override
public void drawReflection(Canvas canvas){
drawCube(BLOCK_HEIGHT, 2*BLOCK_HEIGHT, canvas, false);
}
private void drawCube(float near, float far, Canvas canvas, boolean aboveGround){
int length = verticies.length;
edges.setColor(aboveGround ? 0xFF555555 : 0xFFaaaaaa);
pathBack.reset();
pathSide.reset();
pathHeight.reset();
float mult = ScreenProperties.MULTIPLIER_CONSTANT/(ScreenProperties.NEAR_FIELD + near),
mult2 = ScreenProperties.MULTIPLIER_CONSTANT/(ScreenProperties.NEAR_FIELD + far);
vertex[0] = ScreenProperties.worldToScreen(ScreenProperties.rotate(verticies[0], angle).add(position).mul(mult));
vertex[4] = ScreenProperties.worldToScreen(ScreenProperties.rotate(verticies[0], angle).add(position).mul(mult2));
for (int i = 1; i < length; ++i) {
vertex[i] = ScreenProperties.worldToScreen(ScreenProperties.rotate(verticies[i], angle).add(position).mul(mult));
vertex[4+i] = ScreenProperties.worldToScreen(ScreenProperties.rotate(verticies[i], angle).add(position).mul(mult2));
}
float t = Integer.MAX_VALUE;
int index = 0;
for(int i = 0; i < 4; i++){
if(vertex[i].sub(ScreenProperties.getWorldMiddle()).length() < t){
t = vertex[i].sub(ScreenProperties.getWorldMiddle()).length();
index = i;
}
}
nearestPoint = vertex[index];
// Log.d("", "Picked index: " + index);
pathBack.moveTo(vertex[0].x, vertex[0].y);
pathBack.lineTo(vertex[1].x, vertex[1].y);
pathBack.lineTo(vertex[2].x, vertex[2].y);
pathBack.lineTo(vertex[3].x, vertex[3].y);
pathBack.lineTo(vertex[0].x, vertex[0].y);
if(index == 0 || index == 3){
pathSide.moveTo(vertex[4].x, vertex[4].y);
pathSide.lineTo(vertex[0].x, vertex[0].y);
pathSide.lineTo(vertex[3].x, vertex[3].y);
pathSide.lineTo(vertex[7].x, vertex[7].y);
pathSide.lineTo(vertex[4].x, vertex[4].y);
} else {
pathSide.moveTo(vertex[6].x, vertex[6].y);
pathSide.lineTo(vertex[2].x, vertex[2].y);
pathSide.lineTo(vertex[1].x, vertex[1].y);
pathSide.lineTo(vertex[5].x, vertex[5].y);
pathSide.lineTo(vertex[6].x, vertex[6].y);
}
if(aboveGround)canvas.drawPath(pathSide, usePaint);
canvas.drawPath(pathSide, edges);
if(index == 0 || index == 1){
pathHeight.moveTo(vertex[4].x, vertex[4].y);
pathHeight.lineTo(vertex[0].x, vertex[0].y);
pathHeight.lineTo(vertex[1].x, vertex[1].y);
pathHeight.lineTo(vertex[5].x, vertex[5].y);
pathHeight.lineTo(vertex[4].x, vertex[4].y);
} else {
pathHeight.moveTo(vertex[6].x, vertex[6].y);
pathHeight.lineTo(vertex[2].x, vertex[2].y);
pathHeight.lineTo(vertex[3].x, vertex[3].y);
pathHeight.lineTo(vertex[7].x, vertex[7].y);
pathHeight.lineTo(vertex[6].x, vertex[6].y);
}
if(aboveGround)canvas.drawPath(pathHeight, usePaint);
canvas.drawPath(pathHeight, edges);
long lastDif = System.currentTimeMillis() - lastContactTime; //Log.w("", "Rect made contact,," + lastDif + " " + id + " " + (id%GameProperties.ELEMENT_DIVIDER != GameProperties.GAME_ELEMENT_GROUND));
if(lastDif > 0 && lastDif < CONTACT_EXPIRY && id%GameProperties.ELEMENT_DIVIDER != GameProperties.GAME_ELEMENT_GROUND){
Vec2 cont = ScreenProperties.worldToScreen(ScreenProperties.rotate(lastContactPlace, angle).add(position)); //Log.w("", "Contact hya");
usePaint.setShader(new RadialGradient(cont.x, cont.y, lastDif + 0.01f, getContactCols(myGlowColor, (int)lastDif), contactColsPos, TileMode.CLAMP));
} else if(usePaint.getShader() != null)
usePaint = new Paint(faces);
if(aboveGround)canvas.drawPath(pathSide, usePaint);
canvas.drawPath(pathSide, edges);
if(aboveGround)canvas.drawPath(pathHeight, usePaint);
canvas.drawPath(pathHeight, edges);
if(aboveGround){
canvas.drawPath(pathBack, usePaint);
canvas.drawPath(pathBack, edges);
}
}
@Override
public void setObject(JSONObject propertiesJson) {
super.setObject(propertiesJson);
try {
if(propertiesJson.has(JSONProperties.Rectangle.POSITION)){
JSONArray pos = propertiesJson.getJSONArray(JSONProperties.Rectangle.POSITION);
position = new Vec2((float)pos.getDouble(0), (float)pos.getDouble(1));
}
if(propertiesJson.has(JSONProperties.Rectangle.ANGLE)){
angle = (float) propertiesJson.getDouble(JSONProperties.Rectangle.ANGLE);
}
if(propertiesJson.has(JSONProperties.Rectangle.DIMENSIONS)){
JSONArray pos = propertiesJson.getJSONArray(JSONProperties.Rectangle.DIMENSIONS);
width = 2*(float)pos.getDouble(0);
height = 2*(float)pos.getDouble(1);
verticies = new Vec2[4];
verticies[0] = new Vec2(-width/2, -height/2);
verticies[1] = new Vec2(width/2, -height/2);
verticies[2] = new Vec2(width/2, height/2);
verticies[3] = new Vec2(-width/2, height/2);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onContact(long timestamp, Vec2 loc) {
super.onContact(timestamp, loc); Log.w("", "Rect made contact " + id);
}
@Override
public Vec2 getPosition() {
return nearestPoint;
}
}