src/Terrain.hh
author Tero Marttila <terom@fixme.fi>
Wed, 21 Jan 2009 23:07:22 +0200
branchnew_graphics
changeset 412 721c60072091
parent 411 106aaf6eadfe
child 417 c503e0c6a740
permissions -rw-r--r--
new graphics code compiles... no, it doesn't work yet
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"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     7
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
     8
#include "Graphics/Drawable.hh"
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
     9
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    10
/**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    11
 * 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
    12
 */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    13
enum TerrainType {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    14
    /** Empty space, air */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    15
    TERRAIN_EMPTY   = 0x00,
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    16
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    17
    /** 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
    18
    TERRAIN_DIRT    = 0x01,
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
    /** Indestructible rock */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    21
    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
    22
};
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    23
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    24
/**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    25
 * Terrain "pixel" type
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    26
 */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    27
typedef uint8_t TerrainPixel;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    28
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    29
/**
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    30
 * Terrain configuration
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    31
 */
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    32
struct TerrainConfig {
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    33
    /** Size of the terrain field*/
411
106aaf6eadfe there's a grain of truth in the new graphics code now...
Tero Marttila <terom@fixme.fi>
parents: 409
diff changeset
    34
    PixelDimensions dimensions;
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    35
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    36
    /** Set to nonzero to generate random map */
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    37
    int random_seed;
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    38
    
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    39
    /** Defaults */
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    40
    TerrainConfig (void) : dimensions(TERRAIN_WIDTH, TERRAIN_HEIGHT), random_seed(TERRAIN_RANDOM_SEED) { }
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    41
};
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    42
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    43
#include <vector>
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    44
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    45
/**
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    46
 * 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
    47
 * 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
    48
 * 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    49
 * 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
    50
 * 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
    51
 * "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
    52
 * "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
    53
 * and it uses pixelcoordinates internally.
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    54
 */ 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    55
class Terrain {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    56
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
    57
    /** 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
    58
    TerrainPixel *terrain_buf;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    59
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    60
    /** Terrain dimensions */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    61
    PixelDimension width, height;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    62
    
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    63
    /** 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
    64
    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
    65
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    66
    // XXX: terrain texture
243
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
    67
    std::vector<std::vector<int> > texture;
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
    68
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
    69
public:    
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    70
    /**
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    71
     * 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
    72
     *
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    73
     * @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
    74
     */
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    75
    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
    76
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    77
    /**
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
    78
     * 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
    79
     * 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
    80
     * 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
    81
     * 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
    82
     *
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
    83
     * @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
    84
     * @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
    85
     * @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
    86
     */
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
    87
    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
    88
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
    89
    /**
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
    90
     * 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
    91
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    92
    ~Terrain (void);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    93
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    94
private:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    95
    /* No copying */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    96
    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
    97
    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
    98
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    99
protected:
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   100
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   101
     * 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
   102
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   103
    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
   104
        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
   105
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   106
        // XXX: locking?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   107
        pixbuf.draw_pixel(x, y, getTexturePixel(x, y));
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   108
    }
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
     * 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
   112
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   113
     * @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
   114
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   115
    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
   116
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   117
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   118
     * 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
   119
     * 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
   120
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   121
    void generatePixelBuffer (void);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   122
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   123
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   124
     * 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
   125
     * pixels using noisifyPixel
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   126
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   127
    void generateTexture();
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   128
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   129
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   130
     * 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
   131
     * at \a pc.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   132
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   133
    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
   134
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   135
    /**
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   136
     * Scale parameter to "pixels"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   137
     *
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   138
     * @param x Scaled value
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   139
     * @return Corresponding value in pixels
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   140
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   141
    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
   142
        return (int) x;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   143
    }
243
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
   144
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   145
 public:
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   146
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   147
     * 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
   148
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   149
     * @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
   150
     * @return Int vector
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   151
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   152
    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
   153
        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
   154
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   155
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   156
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   157
     * 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
   158
     */
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
   159
    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
   160
        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
   161
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   162
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   163
    /**
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
   164
     * 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
   165
     */
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
   166
    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
   167
        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
   168
    }
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
   169
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
   170
    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
   171
        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
   172
    }
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
   173
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
   174
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   175
     * 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
   176
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   177
     * @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
   178
     * @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
   179
     * @return terrain pixel type
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   180
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   181
    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
   182
        // 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
   183
        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
   184
            return TERRAIN_ROCK;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   185
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   186
        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
   187
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   188
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   189
    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
   190
        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
   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
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   194
    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
   195
        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
   196
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   197
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   198
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   199
     * 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
   200
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   201
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   202
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   203
    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
   204
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   205
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   206
     * 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
   207
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   208
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   209
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   210
    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
   211
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   212
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   213
     * 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
   214
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   215
    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
   216
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   217
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   218
     * 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
   219
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   220
     * @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
   221
     * @param end line ending point
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   222
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   223
    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
   224
    
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   225
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   226
     * Remove a circular area of terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   227
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   228
     * @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
   229
     * @param r circle radius
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   230
     */ 
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   231
    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
   232
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   233
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   234
     * 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
   235
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   236
     * \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
   237
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   238
     * @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
   239
     * @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
   240
     * @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
   241
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   242
    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
   243
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   244
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   245
     * 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
   246
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   247
     * @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
   248
     * @param camera view position
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   249
     */
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 411
diff changeset
   250
    virtual void draw (graphics::Display &display, PixelCoordinate camera = PixelCoordinate(0, 0));
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   251
};
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   252
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   253
#endif