Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

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;
        }

}