123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- * Box2D QML plugin
- * Copyright (C) 2010 Nokia Corporation
- *
- * This file is part of the Box2D QML plugin.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or (at
- * your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; If not, see <http://www.gnu.org/licenses/>.
- */
- #include "box2dfixture.h"
- #include "box2dworld.h"
- #include <QDebug>
- Box2DFixture::Box2DFixture(QDeclarativeItem *parent) :
- QDeclarativeItem(parent),
- mFixtureDef(),
- mFixture(0)
- {
- }
- float Box2DFixture::density() const
- {
- return mFixtureDef.density;
- }
- void Box2DFixture::setDensity(float density)
- {
- if (mFixtureDef.density == density)
- return;
- mFixtureDef.density = density;
- if (mFixture)
- mFixture->SetDensity(density);
- emit densityChanged();
- }
- float Box2DFixture::friction() const
- {
- return mFixtureDef.friction;
- }
- void Box2DFixture::setFriction(float friction)
- {
- if (mFixtureDef.friction == friction)
- return;
- mFixtureDef.friction = friction;
- if (mFixture)
- mFixture->SetFriction(friction);
- emit frictionChanged();
- }
- float Box2DFixture::restitution() const
- {
- return mFixtureDef.restitution;
- }
- void Box2DFixture::setRestitution(float restitution)
- {
- if (mFixtureDef.restitution == restitution)
- return;
- mFixtureDef.restitution = restitution;
- if (mFixture)
- mFixture->SetRestitution(restitution);
- emit restitutionChanged();
- }
- bool Box2DFixture::isSensor() const
- {
- return mFixtureDef.isSensor;
- }
- void Box2DFixture::setSensor(bool sensor)
- {
- if (mFixtureDef.isSensor == sensor)
- return;
- mFixtureDef.isSensor = sensor;
- if (mFixture)
- mFixture->SetSensor(sensor);
- emit sensorChanged();
- }
- Box2DFixture::CategoryFlags Box2DFixture::categories() const
- {
- return CategoryFlags(mFixtureDef.filter.categoryBits);
- }
- void Box2DFixture::setCategories(CategoryFlags layers)
- {
- if (mFixtureDef.filter.categoryBits == layers)
- return;
- mFixtureDef.filter.categoryBits = layers;
- emit categoriesChanged();
- }
- Box2DFixture::CategoryFlags Box2DFixture::collidesWith() const
- {
- return CategoryFlags(mFixtureDef.filter.maskBits);
- }
- void Box2DFixture::setCollidesWith(CategoryFlags layers)
- {
- if (mFixtureDef.filter.maskBits == layers)
- return;
- mFixtureDef.filter.maskBits = layers;
- emit collidesWithChanged();
- }
- int Box2DFixture::groupIndex() const
- {
- return mFixtureDef.filter.groupIndex;
- }
- void Box2DFixture::setGroupIndex(int groupIndex)
- {
- if (mFixtureDef.filter.groupIndex == groupIndex)
- return;
- mFixtureDef.filter.groupIndex = groupIndex;
- emit groupIndexChanged();
- }
- void Box2DFixture::createFixture(b2Body *body)
- {
- b2Shape *shape = createShape();
- if (!shape)
- return;
- mFixtureDef.shape = shape;
- mFixture = body->CreateFixture(&mFixtureDef);
- mFixture->SetUserData(this);
- delete shape;
- }
- void Box2DFixture::emitBeginContact(Box2DFixture *other)
- {
- emit beginContact(other);
- }
- void Box2DFixture::emitContactChanged(Box2DFixture *other)
- {
- emit contactChanged(other);
- }
- void Box2DFixture::emitEndContact(Box2DFixture *other)
- {
- emit endContact(other);
- }
- b2Shape *Box2DBox::createShape()
- {
- const float32 _x = x() / scaleRatio;
- const float32 _y = -y() / scaleRatio;
- b2Vec2 vertices[4];
- vertices[0].Set(_x, _y);
- vertices[1].Set(_x, _y - height() / scaleRatio);
- vertices[2].Set(_x + width() / scaleRatio, _y - height() / scaleRatio);
- vertices[3].Set(_x + width() / scaleRatio, _y);
- int32 count = 4;
- b2PolygonShape *shape = new b2PolygonShape;
- shape->Set(vertices, count);
- return shape;
- }
- b2Shape *Box2DCircle::createShape()
- {
- b2CircleShape *shape = new b2CircleShape;
- shape->m_radius = mRadius / scaleRatio;
- shape->m_p.Set(x() / scaleRatio, -y() / scaleRatio);
- return shape;
- }
- void Box2DCircle::setRadius(float radius)
- {
- if (mRadius == radius)
- return;
- mRadius = radius;
- b2CircleShape *shape = static_cast<b2CircleShape*>(getShape());
-
- if (shape) {
- shape->m_radius = mRadius / scaleRatio; // update 2B engine
- shape->m_p.Set(x() / scaleRatio, -y() / scaleRatio);
- }
- emit radiusChanged();
- }
- b2Shape *Box2DPolygon::createShape()
- {
- const int count = mVertices.length();
- if (count < 2 || count > b2_maxPolygonVertices) {
- qWarning() << "Polygon: Invalid number of vertices:" << count;
- return 0;
- }
- b2Vec2 vertices[count];
- for (int i = 0; i < count; ++i) {
- const QPointF &point = mVertices.at(i).toPointF();
- vertices[i].Set(point.x() / scaleRatio, -point.y() / scaleRatio);
- }
- b2PolygonShape *shape = new b2PolygonShape;
- shape->Set(vertices, count);
- return shape;
- }
|