src/PhysicsObject.hh
author terom
Mon, 15 Dec 2008 23:56:42 +0000
changeset 378 5589abf5e61b
parent 322 f94a5c192097
child 423 947ab54de4b7
permissions -rw-r--r--
break the network code. Too late to set up a branch for this now
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     1
#ifndef PHYSICS_OBJECT_HH
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     2
#define PHYSICS_OBJECT_HH
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     3
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     4
#include <ClanLib/display.h>
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
     5
#include <utility>
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     6
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     7
// Forward declares
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     8
class PhysicsObject;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     9
struct Derivative;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    10
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    11
#include "PhysicsWorld.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    12
#include "Vector.hh"
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 200
diff changeset
    13
#include "Timer.hh"
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    14
#include "Config.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    15
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    16
// Type definitions
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    17
typedef Vector Force;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    18
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    19
/** Specifies possible object types. */
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    20
enum ObjectType { PLAYER, PROJECTILE, ROPE };
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    21
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    22
/** Specifies possible facing directions for objects. */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    23
enum FacingDirection {
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    24
    FACING_LEFT,
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    25
    FACING_RIGHT
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    26
};
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    27
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    28
/**
321
69ed10f20a9e fixed typo
saiam
parents: 320
diff changeset
    29
 * PhysicsObject class. Represents an object in the physics simulation.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    30
 */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    31
class PhysicsObject {
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    32
public:
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    33
    /** Reference to PhysicsWorld. */
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    34
    PhysicsWorld &world;
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    35
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    36
protected:
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    37
    /** Object position. */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    38
    Vector position;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    39
    /** Object position on previous physics tick. */
285
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
    40
    Vector previousPosition;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    41
    /** Object velocity */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    42
    Vector velocity;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    43
    /** Object mass. */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    44
    float mass;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    45
    /** Tells if the object is "on the ground" */
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    46
    bool inAir;
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    47
    /** Object elasticity. */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    48
    float collision_elasticity;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    49
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    50
    // Attributes for players
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    51
    /** Aim angle in radians. */
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    52
    float aim; 
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    53
    /** Player facing. */
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    54
    FacingDirection facing; 
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    55
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    56
    /** Specifies if the player is alive (or dead). */
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    57
    bool alive;
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    58
    /** True if player object should be removed from the game. */
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    59
    bool shouldDelete;
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    60
    
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    61
    /** Type of the object */
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    62
    ObjectType type;
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    63
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    64
    /** Pivot object for this object. */
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    65
    PhysicsObject *pivot;
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    66
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    67
    /** 
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    68
     * Class constructor
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    69
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    70
     * @param world Reference to PhysicsWorld
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    71
     * @param mass Object mass
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    72
     * @param position Object position
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    73
     * @param velocity Object velocity
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    74
     * @param type Object type
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    75
     * @param collision_elasticity Object elasticity
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    76
     * @param enabled Is the object currently part of the simulation
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    77
     */
279
e36f5e1a1c8d let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
terom
parents: 273
diff changeset
    78
    PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity, ObjectType type, 
e36f5e1a1c8d let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
terom
parents: 273
diff changeset
    79
            float collision_elasticity, bool enabled = true);
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    80
    virtual ~PhysicsObject (void);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    81
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    82
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    83
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    84
     * Apply a force to the object. The force is applied to the object
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    85
     * on the next physics tick.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    86
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    87
     * @param force Force vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    88
     */
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
    89
    void applyForce(Force force, TimeMS dt = PHYSICS_TICK_MS);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    90
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    91
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    92
     * Change player aim. This function takes care that aim angle
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    93
     * stays inside limits.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    94
     *
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
    95
     * @param da Aim angle change in radians
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    96
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    97
    void changeAim(float da);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    98
   
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    99
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   100
     * Set player facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   101
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   102
     * @param facingRight True if player is facing right.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   103
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
   104
    void setFacing (FacingDirection facing);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   105
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   106
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   107
     * Makes the player jump in the air.
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   108
     *
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   109
     * @param direction -1: jump left, 0: jump up, 1: jump right
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   110
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   111
    void jump (int direction);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   112
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   113
    /** 
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   114
     * Handle object bounce.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   115
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   116
     * @param normal Normal vector relative to which to bounce
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   117
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   118
    void bounce (Vector normal);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   119
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   120
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   121
     * Called on network clients to sync state from server
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   122
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   123
     * @param position New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   124
     * @param velocity New velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   125
     * @param inAir New inAir value
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
   126
     * @param facingRight New facingRight value
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
   127
     * @param aim New aim
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   128
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   129
    virtual void updatePhysics (Vector position, Vector velocity, bool inAir, FacingDirection facing, float aim);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   130
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   131
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   132
     * Put the object in the physics simulation. When the object is in
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   133
     * the physics simulation it's movements will be calculated.
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   134
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   135
    void enable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   136
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   137
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   138
     * Remove object from the objects physics simulation. When the
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   139
     * object isn't in the physics simulation it won't be deleted but
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   140
     * its movements will not be calculated.
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   141
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   142
    void disable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   143
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   144
private:
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   145
    /** Objects shape. Edgepoints of the polygon */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   146
    std::vector<Vector> shape;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   147
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   148
    /** Object force queue. The queue is emptied on every physics
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   149
        tick.*/
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
   150
    std::queue<std::pair<Force, TimeMS> > forceq;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   151
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   152
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   153
     * Handle player movement and apply forces.
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   154
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   155
     * @param dt Time intervall
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   156
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   157
    void updatePosition (TimeMS dt);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   158
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   159
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   160
     * Use RK4 to integrate the effects of force over a time interwall.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   161
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   162
     * @param force Force to integrate
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   163
     * @param dt Time intervall
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   164
     * @param posAfterTick Reference to object postition after integration.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   165
     * @param velAfterTick Reference to object velocity after integration.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   166
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   167
    void integrate (Force force, TimeMS dt, Vector &posAfterTick, Vector &velAfterTick);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   168
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   169
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   170
     * Evaluate the value of the derivative at given time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   171
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   172
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   173
     * @param dt Time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   174
     * @param d Previous derivative
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   175
     * @return Derivative
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   176
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   177
    Derivative evaluate (Force force, TimeMS dt, Derivative &d, const Vector &posAfterTick, const Vector &velAfterTick);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   178
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   179
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   180
     * Return object acceleration with given force.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   181
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   182
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   183
     * @return Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   184
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   185
    Vector acceleration (const Force &force);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   186
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   187
     /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   188
     * Handle ground movement.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   189
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   190
     * @param right Boolean describing the movement direction.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   191
     * @return New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   192
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   193
    void walk (TimeMS, bool right);
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   194
    Vector walk_one_step (float, bool);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   195
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 287
diff changeset
   196
public:
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   197
    /**
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   198
     * Define object behaviour on collisions.
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
   199
     *
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   200
     * @param collisionPoint Point of collision.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   201
     * @param other The other object we have collided with.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   202
     */
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 287
diff changeset
   203
    virtual void onCollision (Vector collisionPoint, PhysicsObject *other = NULL);
272
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   204
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   205
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   206
     * Get object type.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   207
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   208
     * @return Object type
287
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   209
     */
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   210
    ObjectType getType (void) const;
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   211
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   212
    /**
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   213
     * Checks if it is possible for the object to be in the given
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   214
     * location.
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   215
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   216
     * @param loc Location
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   217
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   218
    bool possibleLocation (Vector loc);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   219
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   220
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   221
     * Get current object position.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   222
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   223
     * @return Position vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   224
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   225
    Vector getPosition (void) const;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   226
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   227
    /**
285
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   228
     * Set previous object position.
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   229
     *
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   230
     * @param Position vector
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   231
     */
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   232
    void setPosition (Vector pos);
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   233
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   234
    /**
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   235
     * Get previous object position.
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   236
     *
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   237
     * @return Position vector
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   238
     */
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   239
    Vector getPreviousPosition (void) const;
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   240
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   241
    /**
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   242
     * Get current object screen coordinates
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   243
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   244
     * @return PixelCoordinate position
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   245
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   246
    PixelCoordinate getCoordinate (void) const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   247
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   248
    /**
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   249
     * Get current object velocity.
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   250
     *
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   251
     * @return Velocity vector
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   252
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   253
    Vector getVelocity (void) const;
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   254
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   255
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   256
     * Return object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   257
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   258
     * @return Polygon points
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   259
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   260
    const std::vector<Vector>& getShape (void) const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   261
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   262
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   263
     * Set object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   264
     *
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   265
     * @param shape Vector containing polygon points
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   266
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   267
    void setShape(std::vector<Vector> shape);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   268
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   269
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   270
     * Return object facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   271
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   272
     * @return Object facing (true if facing right)
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   273
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
   274
    FacingDirection getFacing() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   275
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   276
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   277
     * Return object aim angle.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   278
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   279
     * @return Object aim angle
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   280
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   281
    float getAim() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   282
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   283
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   284
     * Get object direction.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   285
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   286
     * @return Unit vector to facing+aim
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   287
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   288
    Vector getDirection (void) const;
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   289
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   290
    /**
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   291
     *  Mark object as destroyed, it will be delete'd later
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   292
     */
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   293
    void destroy (void);
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   294
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   295
    /**
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   296
     * Check if the object is alive.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   297
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   298
     * @return Is the object alive?
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   299
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   300
    bool isAlive (void);
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   301
    
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   302
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   303
     * Tells the state of the object.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   304
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   305
     * @return True if object has been destroyed.
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   306
     */
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   307
    bool removeIfDestroyed (void);
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   308
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   309
    /**
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   310
     * Set object pivot.
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   311
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   312
     * @param pivot Pivot object
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   313
     */
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   314
    void setPivot (PhysicsObject *pivot);
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   315
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   316
    /**
322
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   317
     * Return the pivot object pointer.
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   318
     */
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   319
    PhysicsObject *getPivot (void);
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   320
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   321
    /**
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   322
     * Checks if object collides with other objects
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   323
     *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   324
     * @param obj Other PhysicsObject
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   325
     * @return Did we collide?
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   326
     */
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   327
    bool collides (const PhysicsObject &obj);
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   328
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   329
    /**
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   330
     * Compute the force that this object (as a pivot) exerts on the given object
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   331
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   332
     * @param bob Othe object
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   333
     * @return Force
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   334
     */
322
f94a5c192097 Rope fixing
ekku
parents: 321
diff changeset
   335
    virtual Vector getPivotForce (void);
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   336
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   337
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   338
     * Update object in physics simulation.
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   339
     *
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   340
     * @param tick_length Length of the physics tick
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   341
     */
221
fbc5db6fce45 reorganize the weapons code and input handling code
terom
parents: 209
diff changeset
   342
    virtual void tick (TimeMS tick_length);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   343
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   344
320
cb33eca69b29 Updated PhysicsObject documentation
saiam
parents: 317
diff changeset
   345
/** Helper struct for the integration */
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   346
struct Derivative {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   347
    Vector dx; // Velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   348
    Vector dv; // Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   349
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   350
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   351
/**
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   352
 * Returns the "sign" of the cross product between given points. In
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   353
 * practice the sign of the return value tels on which side of the
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   354
 * line drawn between p1 and p2 the point p3 is.
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   355
 *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   356
 * @param p1 Line start point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   357
 * @param p2 Line end point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   358
 * @param p3 Point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   359
 * @return Variable, the sign of which tells on which side of the line p3 is.
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   360
 */
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   361
int8_t crossProduct(const Vector &p1, const Vector &p2, const Vector &p3);
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   362
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   363
#endif