changeset 7:2217fd1fe384

added angular and linear velocity limit
author zzzzrrr <mason.green@gmail.com>
date Sat, 21 Mar 2009 19:34:20 -0400
parents eb6059f7035a
children 4ee9e4a0c03b
files main.d melee.d orz.d render.d ship.d urQuan.d
diffstat 6 files changed, 54 insertions(+), 134 deletions(-) [+]
line wrap: on
line diff
--- 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);
         }
         
--- 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;
--- 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);
--- 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);
-        }
     }
 }
 
--- 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);
+    }
 }
--- 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;