Subversion Repositories AndroidProjects

Rev

Rev 1234 | Rev 1240 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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==================================================================================

}