You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.2 KiB
72 lines
2.2 KiB
#pragma once
|
|
|
|
#include <cmath>
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
class Saw : public Test {
|
|
protected:
|
|
int num_lines;
|
|
float displacement_scale;
|
|
|
|
public:
|
|
Saw()
|
|
{
|
|
m_world->SetGravity(b2Vec2(0, 0));
|
|
|
|
float friction_coeff = 0.0;
|
|
float restitution_coeff = 0.0;
|
|
float density = 1.0f;
|
|
|
|
// Define the box.
|
|
{
|
|
b2BodyDef boxBodyDef;
|
|
boxBodyDef.type = b2_dynamicBody;
|
|
boxBodyDef.bullet = true;
|
|
boxBodyDef.position.Set(1, 2.5);
|
|
b2Body* box = m_world->CreateBody(&boxBodyDef);
|
|
box->SetLinearVelocity(b2Vec2(1, -10));
|
|
b2PolygonShape boxShape;
|
|
boxShape.SetAsBox(2, 0.5);
|
|
b2Fixture* boxFixture = box->CreateFixture(&boxShape, density);
|
|
boxFixture->SetFriction(friction_coeff);
|
|
boxFixture->SetRestitution(restitution_coeff);
|
|
}
|
|
|
|
{
|
|
b2BodyDef sawBodyDef;
|
|
sawBodyDef.type = b2_staticBody;
|
|
sawBodyDef.bullet = true;
|
|
sawBodyDef.position.Set(0, 0);
|
|
b2Body* saw = m_world->CreateBody(&sawBodyDef);
|
|
b2ChainShape sawShape;
|
|
std::vector<b2Vec2> sawPoints;
|
|
const double delta_x = 1.0;
|
|
for (double x = 0; x < 10; x += delta_x) {
|
|
sawPoints.push_back(b2Vec2(x, 1));
|
|
sawPoints.push_back(b2Vec2(x + delta_x, 0));
|
|
}
|
|
sawShape.CreateChain(&sawPoints.front(), sawPoints.size());
|
|
b2Fixture* sawFixture = saw->CreateFixture(&sawShape, density);
|
|
sawFixture->SetFriction(friction_coeff);
|
|
sawFixture->SetRestitution(restitution_coeff);
|
|
}
|
|
}
|
|
|
|
static Test* Create() { return new Saw(); }
|
|
|
|
virtual void Step(Settings* settings) override
|
|
{
|
|
static bool firstCall = true;
|
|
if (firstCall) {
|
|
settings->enableSleep = false;
|
|
settings->hz = 1 / 1e-1;
|
|
settings->velocityIterations = 300;
|
|
settings->positionIterations = 300;
|
|
settings->drawContactPoints = true;
|
|
settings->drawContactImpulse = true;
|
|
firstCall = false;
|
|
}
|
|
Test::Step(settings);
|
|
}
|
|
};
|
|
|