I am not sure if this is semi-official or not. I downloaded the version 2.02 and tested 4-5 cases with it and it seems to be working. I will show the output of a simple model (one rectangle welded to a non-convex polygon which is attached to the ground by a revolute joint, maybe you can tell if it is the latest or not.
2.01 output:
//Auto-generated by Mekanimo (www.mekanimo.net) on Mon Oct 05 19:27:53 2009
//Don't forget to add the following line to g_testEntries[] in testentries.cpp as a test entry.
//{"201.h", 201.h::Create},
#ifndef 201.H_H
#define 201.H_H
class 201.h : public Test
{
public:
201.h()
{
b2Body* ground = m_world->GetGroundBody();
b2BodyDef bodyDef;
b2Vec2 initVel;
b2PolygonDef shapeDef;
b2CircleDef circleDef;
b2RevoluteJointDef revJointDef;
b2DistanceJointDef jointDef;
b2Vec2 pos;
//Compounds (shapes welded together)
//Compound 0
bodyDef.position.Set(24.713464f, 33.500765f);
bodyDef.angle = 0.0f;
b2Body* compound0 = m_world->CreateBody(&bodyDef);
initVel.Set(0.0f, 0.0f);
compound0->SetLinearVelocity(initVel);
compound0->SetAngularVelocity(0.0f);
//polygon1
//Partition 0
shapeDef.vertexCount = 5;
shapeDef.vertices[0].Set(-5.048006f, -6.841606f);
shapeDef.vertices[1].Set(5.130945f, -1.025062f);
shapeDef.vertices[2].Set(4.023032f, 4.029791f);
shapeDef.vertices[3].Set(-4.978762f, 0.567563f);
shapeDef.vertices[4].Set(-9.756637f, -2.686932f);
shapeDef.density = 0.015000f;
shapeDef.friction = 0.300000f;
shapeDef.restitution = 0.600000f;
shapeDef.filter.groupIndex = int16(0);
shapeDef.filter.categoryBits = uint16(65535);
shapeDef.filter.maskBits = uint16(65535);
compound0->CreateShape(&shapeDef);
//Partition 1
shapeDef.vertexCount = 3;
shapeDef.vertices[0].Set(-4.978762f, 0.567563f);
shapeDef.vertices[1].Set(-8.994947f, 3.198857f);
shapeDef.vertices[2].Set(-9.756637f, -2.686932f);
shapeDef.density = 0.015000f;
shapeDef.friction = 0.300000f;
shapeDef.restitution = 0.600000f;
shapeDef.filter.groupIndex = int16(0);
shapeDef.filter.categoryBits = uint16(65535);
shapeDef.filter.maskBits = uint16(65535);
compound0->CreateShape(&shapeDef);
compound0->SetMassFromShapes();
//rectangle1
shapeDef.vertexCount = 4;
shapeDef.vertices[0].Set(2.084184f, 0.983030f);
shapeDef.vertices[1].Set(11.224467f, 0.983030f);
shapeDef.vertices[2].Set(11.224467f, 4.999215f);
shapeDef.vertices[3].Set(2.084184f, 4.999215f);
shapeDef.density = 0.015000f;
shapeDef.friction = 0.300000f;
shapeDef.restitution = 0.600000f;
shapeDef.filter.groupIndex = int16(0);
shapeDef.filter.categoryBits = uint16(65535);
shapeDef.filter.maskBits = uint16(65535);
compound0->CreateShape(&shapeDef);
compound0->SetMassFromShapes();
//Revolute joints
pos.Set(34.830018f, 37.461312f);
revJointDef.Initialize(compound0, ground, pos);
revJointDef.collideConnected = false;
m_world->CreateJoint(&revJointDef);
}
static Test* Create()
{
return new 201.h;
}
};
#endif
2.02 output
//Auto-generated by Mekanimo (www.mekanimo.net) on Mon Oct 05 19:28:06 2009
//Don't forget to add the following line to g_testEntries[] in testentries.cpp as a test entry.
//{"202.h", 202.h::Create},
#ifndef 202.H_H
#define 202.H_H
class 202.h : public Test
{
public:
202.h()
{
b2Body* ground = NULL;
b2BodyDef bd;
ground = m_world->CreateBody(&bd);
b2BodyDef bodyDef;
b2Vec2 initVel;
b2PolygonShape shape;
b2CircleShape circleShape;
b2FixtureDef fd;
b2RevoluteJointDef revJointDef;
b2DistanceJointDef jointDef;
b2Vec2 pos;
//Compounds (shapes welded together)
//Compound 0
bodyDef.position.Set(24.713464f, 33.500765f);
bodyDef.angle = 0.0f;
b2Body* compound0 = m_world->CreateBody(&bodyDef);
initVel.Set(0.0f, 0.0f);
compound0->SetLinearVelocity(initVel);
compound0->SetAngularVelocity(0.0f);
//polygon1
//Partition 0
b2Vec2 p1_0_vertices[5];
p1_0_vertices[0].Set(-5.048006f, -6.841606f);
p1_0_vertices[1].Set(5.130945f, -1.025062f);
p1_0_vertices[2].Set(4.023032f, 4.029791f);
p1_0_vertices[3].Set(-4.978762f, 0.567563f);
p1_0_vertices[4].Set(-9.756637f, -2.686932f);
shape.Set(p1_0_vertices, 5);
fd.shape = &shape;
fd.density = 0.015000f;
fd.friction = 0.300000f;
fd.restitution = 0.600000f;
fd.filter.groupIndex = int16(0);
fd.filter.categoryBits = uint16(65535);
fd.filter.maskBits = uint16(65535);
compound0->CreateFixture(&fd);
//Partition 1
b2Vec2 p1_1_vertices[3];
p1_1_vertices[0].Set(-4.978762f, 0.567563f);
p1_1_vertices[1].Set(-8.994947f, 3.198857f);
p1_1_vertices[2].Set(-9.756637f, -2.686932f);
shape.Set(p1_1_vertices, 3);
fd.shape = &shape;
fd.density = 0.015000f;
fd.friction = 0.300000f;
fd.restitution = 0.600000f;
fd.filter.groupIndex = int16(0);
fd.filter.categoryBits = uint16(65535);
fd.filter.maskBits = uint16(65535);
compound0->CreateFixture(&fd);
//rectangle1
b2Vec2 rectangle1_vertices[4];
rectangle1_vertices[0].Set(2.084184f, 0.983030f);
rectangle1_vertices[1].Set(11.224467f, 0.983030f);
rectangle1_vertices[2].Set(11.224467f, 4.999215f);
rectangle1_vertices[3].Set(2.084184f, 4.999215f);
shape.Set(rectangle1_vertices, 4);
fd.shape = &shape;
fd.density = 0.015000f;
fd.friction = 0.300000f;
fd.restitution = 0.600000f;
fd.filter.groupIndex = int16(0);
fd.filter.categoryBits = uint16(65535);
fd.filter.maskBits = uint16(65535);
compound0->CreateFixture(&fd);
//Revolute joints
pos.Set(34.830018f, 37.461312f);
revJointDef.Initialize(compound0, ground, pos);
revJointDef.collideConnected = false;
m_world->CreateJoint(&revJointDef);
}
static Test* Create()
{
return new 202.h;
}
};
#endif