package com.gebauz.bauzoid.math.collision;
import java.util.Vector;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.gebauz.bauzoid.app.Consts;
import com.gebauz.bauzoid.math.Vector2;
import com.gebauz.bauzoid.parser.Preprocessor;
import com.gebauz.bauzoid.parser.ScanException;
import com.gebauz.bauzoid.parser.Tokenizer;
public class ShapeUtil
{
public static final String LOG_TAG = Consts.
LOG_TAG +
":SpriteUtil";
public static boolean verbose =
true;
private ShapeUtil
() {}
public static void log
(String tag,
String msg
)
{
if (verbose
)
Gdx.
app.
log(tag, msg
);
}
public static ShapeData createShapeFromFile
(Shape owner,
String filename
)
{
return createShapeFromFile
(owner, Gdx.
files.
internal(filename
));
}
public static ShapeData createShapeFromFile
(Shape owner, FileHandle file
)
{
String fileContents = Preprocessor.
stripComments(file.
readString());
ShapeData shape =
new ShapeData
();
float frameW =
0;
float frameH =
0;
int startFrame = -
1;
int endFrame = -
1;
try
{
Tokenizer tokenizer =
new Tokenizer
(fileContents
);
tokenizer.
setStringDelimiter(new char[] {'\'',
'"'} );
while (!tokenizer.
checkNoMoreTokens())
{
String identifier = tokenizer.
readIdentifier();
if (identifier.
equalsIgnoreCase("frameSize"))
{
frameW = tokenizer.
readNumber();
tokenizer.
readToken(",");
frameH = tokenizer.
readNumber();
tokenizer.
readToken(";");
}
else if (identifier.
equalsIgnoreCase("frameRange"))
{
startFrame =
(int)tokenizer.
readNumber();
tokenizer.
readToken(",");
endFrame =
(int)tokenizer.
readNumber();
tokenizer.
readToken(";");
}
else if (identifier.
equalsIgnoreCase("rect"))
{
// TODO: there is no check whether framesize is set at all!
BaseShapeElement element = readRect
(tokenizer, owner, frameW, frameH, startFrame, endFrame
);
if (element
!=
null)
shape.
addElement(element
);
}
else if (identifier.
equalsIgnoreCase("ellipse"))
{
BaseShapeElement element = readEllipse
(tokenizer, owner, frameW, frameH, startFrame, endFrame
);
if (element
!=
null)
shape.
addElement(element
);
}
else if (identifier.
equalsIgnoreCase("polygon"))
{
BaseShapeElement element = readPolygon
(tokenizer, owner, frameW, frameH, startFrame, endFrame
);
if (element
!=
null)
shape.
addElement(element
);
}
else
{
throw new ScanException
(LOG_TAG,
"Syntax error at: " + tokenizer.
getSurroundings());
}
}
}
catch (ScanException e
)
{
e.
log(LOG_TAG
);
return null;
}
return shape
;
}
public static BaseShapeElement readRect
(Tokenizer t,
Shape shape,
float frameW,
float frameH,
int startFrame,
int endFrame
) throws ScanException
{
if ((frameW == 0.0f
) ||
(frameH == 0.0f
))
throw new ScanException
(LOG_TAG,
"framesize not set or 0!");
float x = t.
readNumber();
t.
readToken(",");
float y = t.
readNumber();
t.
readToken(",");
float w = t.
readNumber();
t.
readToken(",");
float h = t.
readNumber();
t.
readToken(";");
RectElement element =
new RectElement
(shape, x / frameW, y / frameH, w / frameW, h / frameH, startFrame, endFrame
);
//RectElement element = new RectElement(shape, x, y, w, h);
if (verbose
)
Gdx.
app.
log(Consts.
LOG_TAG,
"RectElement: " + x +
", " + y +
", " + w +
", " + h
);
return element
;
}
public static BaseShapeElement readEllipse
(Tokenizer t,
Shape shape,
float frameW,
float frameH,
int startFrame,
int endFrame
) throws ScanException
{
if ((frameW == 0.0f
) ||
(frameH == 0.0f
))
throw new ScanException
(LOG_TAG,
"framesize not set or 0!");
float x = t.
readNumber();
t.
readToken(",");
float y = t.
readNumber();
t.
readToken(",");
float radiusX = t.
readNumber();
t.
readToken(",");
float radiusY = t.
readNumber();
t.
readToken(";");
EllipseElement element =
new EllipseElement
(shape, x / frameW, y / frameH, radiusX / frameW, radiusY / frameH, startFrame, endFrame
);
//EllipseElement element = new EllipseElement(shape, x, y , radiusX, radiusY);
if (verbose
)
Gdx.
app.
log(Consts.
LOG_TAG,
"EllipseElement: " + x +
", " + y +
", " + radiusX +
", " + radiusY
);
return element
;
}
public static BaseShapeElement readPolygon
(Tokenizer t,
Shape shape,
float frameW,
float frameH,
int startFrame,
int endFrame
) throws ScanException
{
if ((frameW == 0.0f
) ||
(frameH == 0.0f
))
throw new ScanException
(LOG_TAG,
"framesize not set or 0!");
t.
readToken("{");
Vector<Vector2
> vertices =
new Vector<Vector2
>();
while (!t.
checkToken("}"))
{
t.
readIdentifier();
float x = t.
readNumber();
t.
readToken(",");
float y = t.
readNumber();
t.
readToken(";");
vertices.
add(new Vector2
(x / frameW, y / frameH
));
}
t.
readToken("}");
PolyElement element =
new PolyElement
(shape, vertices, startFrame, endFrame
);
//EllipseElement element = new EllipseElement(shape, x, y , radiusX, radiusY);
if (verbose
)
Gdx.
app.
log(Consts.
LOG_TAG,
"PolygonElement: " + vertices.
elementAt(0).
x +
", " + vertices.
elementAt(0).
y +
"--> [" + vertices.
size() +
"]");
return element
;
}
}