/* * JBox2D - A Java Port of Erin Catto's Box2D * * JBox2D homepage: http://jbox2d.sourceforge.net/ * Box2D homepage: http://www.box2d.org * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ package org.jbox2d.collision.shapes; //Updated to rev 56 of b2Shape.cpp/.h // -> rev 97 of b2PolygonShape.cpp/.h import java.util.ArrayList; import java.util.List; import org.jbox2d.collision.FilterData; import org.jbox2d.common.Vec2; import org.jbox2d.common.XForm; /** * Convex polygon. The vertices must be in CCW order for a right-handed * coordinate system with the z-axis coming out of the screen. * Add vertices using PolygonDef.add(Vec2), * and create the polygon shape using Body::createShape(ShapeDef). */ public class PolygonDef extends ShapeDef { /** * The polygon vertices in local coordinates. * <BR><BR> * Accessing this field is discouraged - it remains * public for the moment, but that is likely to change. * Please use addVertex(Vec2) and getVertexList/Array * instead to add to or inspect the current vertices. */ public List<Vec2> vertices; public void set(final PolygonDef copyMe) { this.density = copyMe.density; this.filter = new FilterData(); this.filter.set(copyMe.filter); this.friction = copyMe.friction; this.isSensor = copyMe.isSensor; this.restitution = copyMe.restitution; this.type = copyMe.type; this.userData = copyMe.userData; this.vertices = new ArrayList<Vec2>(); for(int i=0; i<copyMe.vertices.size(); ++i) { this.addVertex(copyMe.vertices.get(i).clone()); } } public PolygonDef() { type = ShapeType.POLYGON_SHAPE; vertices = new ArrayList<Vec2>(); } /** Add a vertex to the polygon. */ public void addVertex(final Vec2 v) { vertices.add(v); } /** Removes all vertices. */ public void clearVertices() { vertices.clear(); } /** Return the vertex list as an array. */ public Vec2[] getVertexArray() { return vertices.toArray(new Vec2[0]); } /** Return the vertex list as a List<Vec2>. */ public List<Vec2> getVertexList() { return vertices; } /** * Build vertices to represent an axis-aligned box. * @param hx the half-width. * @param hy the half-height. */ public void setAsBox(final float hx, final float hy) { vertices.clear(); vertices.add(new Vec2(-hx, -hy)); vertices.add(new Vec2(hx, -hy)); vertices.add(new Vec2(hx, hy)); vertices.add(new Vec2(-hx, hy)); } /** * Build vertices to represent an oriented box. * @param hx the half-width. * @param hy the half-height. * @param center the center of the box in local coordinates. * @param angle the rotation of the box in local coordinates. */ public void setAsBox(final float hx, final float hy, final Vec2 center, final float angle) { setAsBox(hx, hy); final XForm xf = new XForm(); xf.position.set(center); xf.R.set(angle); // djm optimized. I'm leaving the XForm creation, it doesn't matter here for (int i = 0; i < vertices.size(); ++i) { XForm.mulToOut(xf, vertices.get(i), vertices.get(i)); } } /** Return the number of vertices. */ public int getVertexCount() { return vertices.size(); } }