public void applyForce(Vec2 f) { // force += f; force.Addi(f); }
void RenderGLImpulseEngine() { if (impulse == null) { return; } if (impulse.bodies.Count > 0) { foreach (Body b in impulse.bodies) { if (b.shape is Circle) { Circle c = (Circle)b.shape; // Circle GL.Begin(GL.LINE_STRIP); material.SetPass(0); GL.Color(Color.red); for (int i = 0; i < 45; i++) { //xyz = p.vertices[i];// Vec2 don't reference when modifying take x, y values only xyz.x = (float)Mathf.Cos((i / 45f) * 2 * Mathf.PI); xyz.y = (float)Mathf.Sin((i / 45f) * 2 * Mathf.PI); xyz.x *= c.radius; xyz.y *= c.radius; xyz.x += b.position.x; xyz.y += b.position.y; GL.Vertex(xyz); } GL.End(); rxyz.x = Mathf.Cos(b.orient) * c.radius; rxyz.y = Mathf.Sin(b.orient) * c.radius; // Line GL.Begin(GL.LINES); material.SetPass(0); GL.Color(Color.red); xyz.x = b.position.x; xyz.y = b.position.y; GL.Vertex(xyz); rxyz.x = b.position.x + rxyz.x; rxyz.y = b.position.y + rxyz.y; GL.Vertex(rxyz); GL.End(); } else if (b.shape is Polygon) { Polygon p = (Polygon)b.shape; // Polygon GL.Begin(GL.LINE_STRIP); material.SetPass(0); GL.Color(Color.blue); for (int i = 0; i < p.vertexCount; i++) { //vxy = p.vertices[i];// Vec2 don't reference when modifying take x, y values only vxy.x = p.vertices[i].x; vxy.y = p.vertices[i].y; b.shape.u.Muli(vxy); vxy.Addi(b.position); xyz.x = vxy.x; xyz.y = vxy.y; GL.Vertex(xyz); } //vxy = p.vertices[i];// don't reference when modifying take x, y values only vxy.x = p.vertices[0].x; vxy.y = p.vertices[0].y; b.shape.u.Muli(vxy); vxy.Addi(b.position); xyz.x = vxy.x; xyz.y = vxy.y; GL.Vertex(xyz); GL.End(); } } } GL.Color(Color.black); if (impulse.contacts.Count > 0) { foreach (Manifold m in impulse.contacts) { for (int i = 0; i < m.contactCount; i++) { vxy.x = m.contacts[i].x; vxy.y = m.contacts[i].y; nxy.x = m.normal.x; nxy.y = m.normal.y; // Line GL.Begin(GL.LINES); material.SetPass(0); GL.Color(Color.red); xyz.x = vxy.x; xyz.y = vxy.y; GL.Vertex(xyz); xyz.x = vxy.x + nxy.x * .4f; xyz.y = vxy.y + nxy.y * .4f; GL.Vertex(xyz); GL.End(); } } } }