package com.gebauz.bauzoid.math.collision;
import java.util.Vector;
import com.badlogic.gdx.Gdx;
import com.gebauz.bauzoid.graphics.Graphics;
import com.gebauz.bauzoid.graphics.RenderUtil;
import com.gebauz.bauzoid.graphics.sprite.SpriteTransform;
import com.gebauz.bauzoid.math.Line2;
import com.gebauz.bauzoid.math.Vector2;
import com.gebauz.bauzoid.math.Vector4;
/** Convex polygon element class. */
public class PolyElement
extends BaseShapeElement
{
// Constants========================================================================================
// Embedded Types===================================================================================
// Fields===========================================================================================
private Vector2
[] mPoints =
null;
// Methods==========================================================================================
public PolyElement
(Shape shape, Vector2
[] points
)
{
super(shape
);
mPoints =
new Vector2
[points.
length];
for (int i =
0; i
< points.
length; i++
)
mPoints
[i
] = points
[i
].
copy();
}
public PolyElement
(Shape shape,
Vector<Vector2
> points
)
{
super(shape
);
mPoints =
new Vector2
[points.
size()];
for (int i =
0; i
< points.
size(); i++
)
mPoints
[i
] = points.
get(i
).
copy();
}
@
Override
public BaseShapeElement copy
(Shape newOwner
)
{
return new PolyElement
(newOwner, mPoints
);
/*Vector2[] newPoints = new Vector2[mPoints.length];
for (int i = 0; i < mPoints.length; i++)
{
}*/
}
/* @Override
public CollisionResult collideRayCast(Line2 ray)
{
return new CollisionResult();
}*/
@
Override
public void renderDebug
(Graphics graphics, SpriteTransform t
)
{
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
(i+
1) % mPoints.
length;
RenderUtil.
drawLine(graphics, mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
h, mPoints
[j
].
x * t.
w, mPoints
[j
].
y * t.
h, t,
new Vector4
(0,
1,
0,
1));
//Gdx.app.log(Consts.LOG_TAG, "[" + i + "-" + j + "]: " + (mPoints[i].x * t.w) + ", " + (mPoints[i].y * t.h) + " - "
// + (mPoints[j].x * t.w) + ", " + (mPoints[j].y * t.h));
}
//RenderUtil.drawLine(graphics, 0, 100, 400, 400, t, new Vector4(0, 1, 0, 1));
}
@
Override
public Vector2
[] getUntransformedPoints
()
{
Vector2
[] points =
new Vector2
[mPoints.
length];
for (int i =
0; i
< mPoints.
length; i++
)
points
[i
] = mPoints
[i
].
copy();
return points
;
}
@
Override
public Vector2
[] getPoints
()
{
SpriteTransform t = getOwner
().
transform;
Vector2
[] points =
new Vector2
[mPoints.
length];
for (int i =
0; i
< mPoints.
length; i++
)
{
points
[i
] = t.
spriteToWorld(mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
w);
}
return points
;
}
@
Override
public Line2
[] getUntransformedLineSegments
()
{
Line2
[] lines =
new Line2
[mPoints.
length];
SpriteTransform t = getOwner
().
transform;
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
((i+
1) % mPoints.
length);
lines
[i
] =
new Line2
(mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
h, mPoints
[j
].
x * t.
w, mPoints
[j
].
y * t.
h);
}
return lines
;
}
@
Override
public Line2
[] getLineSegments
()
{
Line2
[] lines =
new Line2
[mPoints.
length];
SpriteTransform t = getOwner
().
transform;
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
((i+
1) % mPoints.
length);
/*Gdx.app.log(Consts.LOG_TAG, "-- " + i);
Vector2 test = t.spriteToWorld(0, 0);
Gdx.app.log(Consts.LOG_TAG, "test: " + test.x + ", " + test.y);
test = t.spriteToWorld(64, 0);
Gdx.app.log(Consts.LOG_TAG, "test: " + test.x + ", " + test.y);*/
//Gdx.app.log(Consts.LOG_TAG, "a vec: " + mPoints[i].x + ", " + mPoints[i].y);
//Gdx.app.log(Consts.LOG_TAG, "b vec: " + mPoints[j].x + ", " + mPoints[j].y);
Vector2 a = t.
spriteToWorld(mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
h);
Vector2 b = t.
spriteToWorld(mPoints
[j
].
x * t.
w, mPoints
[j
].
y * t.
h);
//Gdx.app.log(Consts.LOG_TAG, "a vec: " + a.x + ", " + a.y);
//Gdx.app.log(Consts.LOG_TAG, "b vec: " + b.x + ", " + b.y);
lines
[i
] =
new Line2
(a, b
);
//Vector2 l = lines[i].getLineVector();
//Gdx.app.log(Consts.LOG_TAG, "line vec: " + l.x + ", " + l.y);
}
//Vector2 test = t.spriteToWorld(1, 0);
//Gdx.app.log(Consts.LOG_TAG, "test: " + test.x + ", " + test.y);
return lines
;
}
@
Override
public Line2
[] getSweepLineSegments
(Vector2 move
)
{
Line2
[] lines =
new Line2
[mPoints.
length * 2];
SpriteTransform t = getOwner
().
transform;
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
((i+
1) % mPoints.
length);
Vector2 a = t.
spriteToWorld(mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
h);
Vector2 b = t.
spriteToWorld(mPoints
[j
].
x * t.
w, mPoints
[j
].
y * t.
h);
lines
[i
] =
new Line2
(a, b
);
}
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
((i+
1) % mPoints.
length);
Vector2 a = t.
spriteToWorld(mPoints
[i
].
x * t.
w + move.
x, mPoints
[i
].
y * t.
h + move.
y);
Vector2 b = t.
spriteToWorld(mPoints
[j
].
x * t.
w + move.
x, mPoints
[j
].
y * t.
h + move.
y);
lines
[i+mPoints.
length] =
new Line2
(a, b
);
}
return lines
;
}
@
Override
public Vector2
[] getProjectionAxes
()
{
Vector2
[] axes =
new Vector2
[mPoints.
length];
SpriteTransform t = getOwner
().
transform;
for (int i =
0; i
< mPoints.
length; i++
)
{
int j =
((i+
1) % mPoints.
length);
Vector2 a = t.
spriteToWorld(mPoints
[i
].
x * t.
w, mPoints
[i
].
y * t.
h);
Vector2 b = t.
spriteToWorld(mPoints
[j
].
x * t.
w, mPoints
[j
].
y * t.
h);
axes
[i
] =
new Vector2
(b.
x-a.
x, b.
y-a.
y);
}
for (int i =
0; i
< axes.
length; i++
)
{
axes
[i
].
set(axes
[i
].
y, -axes
[i
].
x);
}
return axes
;
}
// Getters/Setters==================================================================================
}