# HG changeset patch # User zzzzrrr # Date 1237678460 14400 # Node ID 2217fd1fe38408ff4684be97fe0ed584f5ee37dc # Parent eb6059f7035ac0cd01e65c6f8923c1165fba5f33 added angular and linear velocity limit diff -r eb6059f7035a -r 2217fd1fe384 main.d --- a/main.d Sat Mar 21 16:42:08 2009 -0400 +++ b/main.d Sat Mar 21 19:34:20 2009 -0400 @@ -29,8 +29,6 @@ */ module openmelee.main; -import tango.io.Stdout : Stdout; - version(distrib) import tango.io.vfs.ZipFolder; import tango.time.StopWatch; import fc = tango.text.convert.Float : toString; @@ -42,6 +40,8 @@ import xf.hybrid.backend.GL; import xf.omg.core.LinearAlgebra; +import blaze.common.bzMath: bzVec2; + import openmelee.melee; import openmelee.render; @@ -79,7 +79,8 @@ bool running = true; jobHub.addPreFrameJob( { - + bzVec2 velocity = whut.ship1.rBody.linearVelocity; + whut.ship1.limitVelocity(); }); jobHub.addPostFrameJob( { @@ -104,7 +105,7 @@ vec2 p2 = vec2.from(whut.ship2.rBody.position); vec2 distance = p1 - p2; float d = distance.length; - whut.zoom = bzClamp(1/d*1000, 10, 50); + whut.zoom = bzClamp(1/d*1000, 5, 50); whut.viewCenter = p1 - (distance * 0.5f); } diff -r eb6059f7035a -r 2217fd1fe384 melee.d --- a/melee.d Sat Mar 21 16:42:08 2009 -0400 +++ b/melee.d Sat Mar 21 19:34:20 2009 -0400 @@ -64,13 +64,6 @@ // Smallest allowed dimension const MIN_DIMENSION = 0.1; -// Water stuffs -const MAX_PARTICLES = 10000; -const WATER_BOUNCE = 0.01; -const WATER_FRICTION = 0.5; -const WATER_RADIUS = 0.05f; -const MAX_CIRCLE_RES = 32; - const k_maxContactPoints = 2048; enum ContactState { @@ -91,9 +84,9 @@ // Melee settings. Some can be controlled in the GUI. struct Settings { - float hz = 60; - int velocityIterations = 8; - int positionIterations = 2; + float hz = 30; + int velocityIterations = 5; + int positionIterations = 1; bool drawShapes = true; bool drawJoints = true; bool drawControllers; @@ -171,8 +164,8 @@ void init() { // Define world boundaries - worldAABB.lowerBound.set(-100.0f, -100.0f); - worldAABB.upperBound.set(100.0f, 100.0f); + worldAABB.lowerBound.set(-200.0f, -200.0f); + worldAABB.upperBound.set(200.0f, 200.0f); world = new bzWorld(worldAABB, gravity, allowSleep); world.boundaryListener = m_boundaryListener; world.contactListener = m_contactListener; diff -r eb6059f7035a -r 2217fd1fe384 orz.d --- a/orz.d Sat Mar 21 16:42:08 2009 -0400 +++ b/orz.d Sat Mar 21 19:34:20 2009 -0400 @@ -46,18 +46,19 @@ this(bzWorld world) { super(world); - super.engineForce = bzVec2(300, 0); - super.turnForce = bzVec2(0, 10000); - super.rightTurnPoint = bzVec2(-0.1, 0); - super.leftTurnPoint = bzVec2(0.1, 0); + engineForce = bzVec2(500, 0); + turnForce = bzVec2(0, 5000); + rightTurnPoint = bzVec2(-0.5, 0); + leftTurnPoint = bzVec2(0.5, 0); auto bodyDef = new bzBodyDef; + //bodyDef.isBullet = true; bodyDef.position = bzVec2(10,10); bodyDef.angle = PI/2; bodyDef.allowFreeze = false; rBody = world.createBody(bodyDef); - float density = 2.0f; + float density = 5.0f; // Body auto b = new bzPolyDef(density); diff -r eb6059f7035a -r 2217fd1fe384 render.d --- a/render.d Sat Mar 21 16:42:08 2009 -0400 +++ b/render.d Sat Mar 21 19:34:20 2009 -0400 @@ -37,6 +37,9 @@ import openmelee.melee; +// Water stuffs +const MAX_CIRCLE_RES = 32; + /// Color for drawing. Each value has the range [0,1]. struct Color { static Color opCall(float r, float g, float b) @@ -355,13 +358,6 @@ gl.Flush(); } } - - // Draw water - bzFluidParticle[] particles = world.particles; - gl.Color3f(0, 0, 1); - foreach (p; particles) { - gl.drawCircle(vec2.from(p.position), WATER_RADIUS, true); - } } // Draw joints @@ -526,12 +522,20 @@ } } + // Draw the world bounds + bzBroadPhase bp = world.broadPhase; + bzVec2 worldLower = bp.m_worldAABB.lowerBound; + bzVec2 worldUpper = bp.m_worldAABB.upperBound; + Color color = Color(0.3f, 0.9f, 0.9f); + vec2 vs[4]; + vs[0] = vec2(worldLower.x, worldLower.y); + vs[1] = vec2(worldUpper.x, worldLower.y); + vs[2] = vec2(worldUpper.x, worldUpper.y); + vs[3] = vec2(worldLower.x, worldUpper.y); + drawPolygon(gl, vs, color); + // Draw axis aligned bounding boxes (bzAABB) if (settings.drawAABBs) { - bzBroadPhase bp = world.broadPhase; - bzVec2 worldLower = bp.m_worldAABB.lowerBound; - bzVec2 worldUpper = bp.m_worldAABB.upperBound; - Color color; bzVec2 invQ; invQ.set(1.0f / bp.m_quantizationFactor.x, 1.0f / bp.m_quantizationFactor.y); color = Color(1.0f, 1.0f, 1.0f); @@ -548,7 +552,6 @@ b.upperBound.x = worldLower.x + invQ.x * bp.m_bounds[0][p.upperBounds[0]].value; b.upperBound.y = worldLower.y + invQ.y * bp.m_bounds[1][p.upperBounds[1]].value; - vec2 vs[4]; vs[0] = vec2(b.lowerBound.x, b.lowerBound.y); vs[1] = vec2(b.upperBound.x, b.lowerBound.y); vs[2] = vec2(b.upperBound.x, b.upperBound.y); @@ -556,102 +559,6 @@ drawPolygon(gl, vs, color); } - - vec2 vs[4]; - vs[0] = vec2(worldLower.x, worldLower.y); - vs[1] = vec2(worldUpper.x, worldLower.y); - vs[2] = vec2(worldUpper.x, worldUpper.y); - vs[3] = vec2(worldLower.x, worldUpper.y); - - color = Color(0.3f, 0.9f, 0.9f); - drawPolygon(gl, vs, color); - } - - // Draw contact points - if (settings.drawContactPoints) { - const k_axisScale = 0.3f; - const k_forceScale = 0.01f; - - - for (int i = 0; i < pointCount; ++i) { - ContactPoint point = points[i]; - Color color; - - if (point.state == ContactState.e_contactAdded) { - // Add - color = Color(0.3f, 0.95f, 0.3f); - vec2 p = vec2.from(point.position); - gl.drawPoint(p, 10.0f, color); - }else if (point.state == ContactState.e_contactPersisted) { - // Persist - color = Color(0.3f, 0.3f, 0.95f); - vec2 p = vec2.from(point.position); - gl.drawPoint(p, 5.0f, color); - }else { - // Remove - color = Color(0.95f, 0.3f, 0.3f); - vec2 p = vec2.from(point.position); - gl.drawPoint(p, 10.0f, color); - } - - if (settings.drawContactNormals == 1) { - vec2 p1 = vec2.from(point.position); - vec2 p2 = p1 + k_axisScale * vec2.from(point.normal); - color = Color(0.4f, 0.9f, 0.4f); - gl.drawSegment(p1, p2, color); - }else if (settings.drawContactForces) { /* - vec2 p1 = vec2.from(point.position); - vec2 p2 = p1 + k_forceScale * vec2.from(point.normalForce * point.normal); - color = Color(0.9f, 0.9f, 0.3f); - gl.drawSegment(p1, p2, color);*/ - } - - if (settings.drawFrictionForces) { /* - vec2 tangent = vec2.from(bzCross(point.normal, 1.0f)); - vec2 p1 = point.position; - vec2 p2 = p1 + k_forceScale * vec2.from(point.tangentForce) * tangent; - color = Color(0.9f, 0.9f, 0.3f); - gl.drawSegment(p1, p2, color); */ - } - } - } - - if (settings.drawOBBs) { - Color color = Color(0.5f, 0.3f, 0.5f); - - for (bzBody b = world.bodyList; b; b = b.next) { - bzXForm xf = b.xf; - for (bzShape s = b.shapeList; s; s = s.next) { - if (s.type != bzShapeType.POLYGON) { - continue; - } - - bzPolygon poly = cast(bzPolygon)s; - bzOBB obb = poly.obb; - bzVec2 h = obb.extents; - bzVec2 vs[4]; - vs[0].set(-h.x, -h.y); - vs[1].set(h.x, -h.y); - vs[2].set(h.x, h.y); - vs[3].set(-h.x, h.y); - - vec2[4] v; - for (int i = 0; i < 4; ++i) { - vs[i] = obb.center + bzMul(obb.R, vs[i]); - v[i] = vec2.from(bzMul(xf, vs[i])); - } - - drawPolygon(gl, v, color); - } - } - } - - if (settings.drawCOMs) { - for (bzBody b = world.bodyList; b; b = b.next) { - bzXForm xf = b.xf; - xf.position = b.worldCenter; - drawXForm(gl, xf); - } } } diff -r eb6059f7035a -r 2217fd1fe384 ship.d --- a/ship.d Sat Mar 21 16:42:08 2009 -0400 +++ b/ship.d Sat Mar 21 19:34:20 2009 -0400 @@ -34,7 +34,7 @@ import tango.util.container.LinkedList : LinkedList; import blaze.dynamics.bzBody : bzBody; import blaze.collision.shapes.bzShape : bzShape; -import blaze.common.bzMath: bzVec2, bzCross; +import blaze.common.bzMath: bzVec2, bzCross, bzClamp; import blaze.bzWorld : bzWorld; import blaze.dynamics.forces.bzAttractor: bzAttractor; @@ -50,32 +50,49 @@ bzVec2 leftTurnPoint; bzVec2 rightTurnPoint; + float maxLinVel = 100; + float maxAngVel = 2; + this(bzWorld world) { + this.world = world; shapes = new ShapeList; } void thrust() { + rBody.force += engineForce.rotate(rBody.angle); } void turnLeft() { + rBody.torque += bzCross(leftTurnPoint.rotate(rBody.angle), turnForce.rotate(rBody.angle)); } void turnRight() { + rBody.torque += bzCross(rightTurnPoint.rotate(rBody.angle), turnForce.rotate(rBody.angle)); } void setGravity() { - float minRadius = 1; - float maxRadius = 30; - float strength = 4; + float minRadius = 0.1; + float maxRadius = 10; + float strength = 3.5; bzVec2 center = bzVec2(0,0); auto attractor = new bzAttractor(rBody, center, strength, minRadius, maxRadius); world.addForce(attractor); } + + void limitVelocity() { + + float vx = rBody.linearVelocity.x; + float vy = rBody.linearVelocity.y; + float av = rBody.angularVelocity; + rBody.linearVelocity.x = bzClamp(vx, -maxLinVel, maxLinVel); + rBody.linearVelocity.y = bzClamp(vy, -maxLinVel, maxLinVel); + rBody.angularVelocity = bzClamp(av, -maxAngVel, maxAngVel); + } } diff -r eb6059f7035a -r 2217fd1fe384 urQuan.d --- a/urQuan.d Sat Mar 21 16:42:08 2009 -0400 +++ b/urQuan.d Sat Mar 21 19:34:20 2009 -0400 @@ -47,10 +47,11 @@ super(world); auto bodyDef = new bzBodyDef; + //bodyDef.isBullet = true; bodyDef.position = bzVec2(10,5); bodyDef.allowFreeze = false; rBody = world.createBody(bodyDef); - float density = 2.0f; + float density = 5.0f; // Head auto head = new bzPolyDef;