src/Terrain.hh
author Tero Marttila <terom@fixme.fi>
Thu, 22 Jan 2009 01:53:05 +0200
branchnew_graphics
changeset 417 c503e0c6a740
parent 412 721c60072091
child 423 947ab54de4b7
permissions -rw-r--r--
support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     1
#ifndef TERRAIN_HH
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     2
#define TERRAIN_HH
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     3
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     4
#include "Vector.hh"
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 255
diff changeset
     5
#include "Types.hh"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     6
#include "Config.hh"
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
     7
#include "Configuration.hh"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     8
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
     9
#include "Graphics/Drawable.hh"
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
    10
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    11
#include <vector>
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    12
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    13
/**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    14
 * Different types of terrain available
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    15
 */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    16
enum TerrainType {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    17
    /** Empty space, air */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    18
    TERRAIN_EMPTY   = 0x00,
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    19
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    20
    /** Dirt, which can be destroyed/dug through */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    21
    TERRAIN_DIRT    = 0x01,
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    22
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    23
    /** Indestructible rock */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    24
    TERRAIN_ROCK    = 0x02
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    25
};
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    26
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    27
/**
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    28
 * Terrain class. Represents game terrain and contains member
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    29
 * functions to manipulate terrain and get info about it.
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    30
 * 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    31
 * Terrain resolution is a constant that is defined in
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    32
 * configuration. Terrain has a scale (i.e. the width and height in
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    33
 * "real" units. Scaling is needed because physics simulation uses
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    34
 * "real" units. The idea is that this class is used with "real" units
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    35
 * and it uses pixelcoordinates internally.
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    36
 */ 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    37
class Terrain {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    38
protected:
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    39
    /** The terrain data is stored as a linear array in row-major order, with width * height elements */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    40
    TerrainPixel *terrain_buf;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    41
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    42
    /** Terrain dimensions */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    43
    PixelDimension width, height;
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    44
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    45
#if GRAPHICS_ENABLED    
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    46
    /** We pre-render the textured terrain data for display */
203
3ec7ab40755f send initial terrain data to clients using a new NETCHAN_TERRAIN_ARRAY channel using raw BigNetworkPacket
terom
parents: 185
diff changeset
    47
    CL_PixelBuffer pixbuf;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    48
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    49
#endif    
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    50
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    51
    // XXX: terrain texture
243
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
    52
    std::vector<std::vector<int> > texture;
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
    53
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    54
public:    
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    55
    /**
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    56
     * Construct a new terrain based on the given configuration
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    57
     *
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    58
     * @param config a TerrainConfig describing how to build the terrain
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    59
     */
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    60
    explicit Terrain (const TerrainConfig &config);
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    61
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    62
    /**
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    63
     * Construct the terrain using the provided terrain data. The given \a terrain_buf must be a linear array in the
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    64
     * same format as Terrain::terrain_buf, meaning a row-major order array with width * height elements. The buffer
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    65
     * must be allocated on the heap using 'new []', and ownership will be transferred (i.e. the buffer is not copied,
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    66
     * and will eventually be deleteĀ []'d).
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    67
     *
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    68
     * @param width terrain width
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    69
     * @param height terrain height
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    70
     * @param terrain_buf dynamically allocated width * height array of terrain data
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    71
     */
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    72
    Terrain (PixelDimension width, PixelDimension height, TerrainPixel *terrain_buf);
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    73
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    74
    /**
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
    75
     * Destructor, frees our terrain buffer
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    76
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    77
    ~Terrain (void);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    78
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    79
private:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    80
    /* No copying */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    81
    Terrain (const Terrain &copy);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    82
    Terrain &operator= (const Terrain &copy);
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    83
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    84
protected:
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    85
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    86
     * Set induvidual pixel value, updates both terrain_buf and pixbuf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    87
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    88
    inline void setType (PixelDimension x, PixelDimension y, TerrainType t) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    89
        terrain_buf[y * width + x] = (TerrainPixel) t;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    90
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    91
#if GRAPHICS_ENABLED        
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    92
        // XXX: locking?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    93
        pixbuf.draw_pixel(x, y, getTexturePixel(x, y));
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
    94
#endif        
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    95
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    96
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    97
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    98
     * Generate random terrain using given seed
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    99
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   100
     * @param seed seed for the random number generator
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   101
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   102
    void generateTerrain (int seed);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   103
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   104
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   105
     * Regenerates our pixbuf from the current terrain. This is a slow process, but using the pixbuffer directly
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   106
     * greatly speeds up drawing.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   107
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   108
    void generatePixelBuffer (void);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   109
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   110
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   111
     * Generates an area of random texture using a fractal-based algorithm, this can then be applied to the terrain
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   112
     * pixels using noisifyPixel
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   113
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   114
    void generateTexture();
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   115
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   116
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   117
     * Applies noise generated using generateTexture to generate a slightly varying color for the terrain pixel
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   118
     * at \a pc.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   119
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   120
    CL_Color getTexturePixel (PixelDimension x, PixelDimension y);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   121
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   122
    /**
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   123
     * Scale parameter to "pixels"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   124
     *
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   125
     * @param x Scaled value
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   126
     * @return Corresponding value in pixels
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   127
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   128
    inline PixelDimension scale (float x) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   129
        return (int) x;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   130
    }
243
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
   131
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   132
 public:
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   133
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   134
     * Get pixel location of a point that is in "real" units.
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   135
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   136
     * @param point Point in "real" units
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   137
     * @return Int vector
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   138
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   139
    inline PixelCoordinate getPixelCoordinate (Vector point) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   140
        return PixelCoordinate(scale(point.x), scale(point.y));
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   141
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   142
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   143
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   144
     * Return the terrain dimensions Ć  la a PixelCoordinate
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   145
     */
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   146
    PixelCoordinate getDimensions (void) const {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   147
        return PixelCoordinate(width, height);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   148
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   149
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   150
    /**
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   151
     * Return dimensions in component form
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   152
     */
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   153
    PixelDimension getWidth (void) const {
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   154
        return width;
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   155
    }
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   156
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   157
    PixelDimension getHeight (void) const {
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   158
        return height;
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   159
    }
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   160
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 406
diff changeset
   161
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   162
     * Return the type of terrain at given position. Returns TERRAIN_ROCK if given point is not inside terrain area.
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   163
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   164
     * @param x terrain x coordinate
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   165
     * @param y terrain x coordinate
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   166
     * @return terrain pixel type
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   167
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   168
    TerrainType getType (PixelDimension x, PixelDimension y) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   169
        // XXX: optimize access by removing error checking?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   170
        if (x < 0 || y < 0 || x >= width || y >= height)
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   171
            return TERRAIN_ROCK;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   172
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   173
        return (TerrainType) terrain_buf[y * width + x];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   174
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   175
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   176
    inline TerrainType getType (PixelCoordinate pc) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   177
        return getType(pc.x, pc.y);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   178
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   179
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   180
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   181
    inline TerrainType getType (Vector point) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   182
        return getType(getPixelCoordinate(point));
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   183
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   184
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   185
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   186
     * Get raw read-only terrain data buffer
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   187
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   188
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   189
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   190
    const TerrainPixel* getTerrainBuffer (void) const;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   191
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   192
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   193
     * Load new terrain data from given buffer. Must be the right size
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   194
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   195
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   196
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   197
    void loadFromBuffer (const TerrainPixel *buf);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   198
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   199
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   200
     * Check if the given point is terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   201
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   202
    bool collides (const Vector &point) const;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   203
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   204
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   205
     * Check if the given line collides with terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   206
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   207
     * @param begin line starting point
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   208
     * @param end line ending point
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   209
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   210
    bool collides (const Vector &begin, const Vector &end) const;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   211
    
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   212
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   213
     * Remove a circular area of terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   214
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   215
     * @param pos circle center
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   216
     * @param r circle radius
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   217
     */ 
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   218
    void removeGround (const Vector &pos, float r);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   219
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   220
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   221
     * Returns direction normal vector for the given \a point. 
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   222
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   223
     * \a point should be ground, and \a prevPoint air.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   224
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   225
     * @param point the ground that we collided into
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   226
     * @param prevPoint position in air where we were before the collision
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   227
     * @return direction ormal vector, or (0,0) if there's no terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   228
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   229
    Vector getNormal (Vector point, Vector prevPoint) const;
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   230
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
   231
#if GRAPHICS_ENABLED        
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   232
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   233
     * Draw the terrain onto the given graphics context
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   234
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   235
     * @param gc Graphics to draw on
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   236
     * @param camera view position
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   237
     */
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
   238
    virtual void draw (graphics::Display &display, PixelCoordinate camera = PixelCoordinate(0, 0));
417
c503e0c6a740 support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
Tero Marttila <terom@fixme.fi>
parents: 412
diff changeset
   239
#endif    
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   240
};
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   241
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   242
#endif