src/Terrain.hh
author Tero Marttila <terom@fixme.fi>
Tue, 20 Jan 2009 22:00:24 +0200
changeset 406 a2e35ca66c74
parent 370 39e59dd36b6e
child 408 e6cfc44266af
permissions -rw-r--r--
cleanup Terrain, use a single linear array instead of nested vectors
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>
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     5
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     6
#include "Vector.hh"
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
     7
#include "GraphicsPointer.hh"
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 255
diff changeset
     8
#include "Types.hh"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     9
#include "Config.hh"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    10
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    11
/**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    12
 * 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
    13
 */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    14
enum TerrainType {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    15
    /** Empty space, air */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    16
    TERRAIN_EMPTY   = 0x00,
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    17
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    18
    /** 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
    19
    TERRAIN_DIRT    = 0x01,
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    20
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    21
    /** Indestructible rock */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    22
    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
    23
};
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    24
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    25
/**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    26
 * Terrain "pixel" type
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    27
 */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    28
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
    29
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    30
/**
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    31
 * 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
    32
 * 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
    33
 * 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    34
 * 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
    35
 * 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
    36
 * "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
    37
 * "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
    38
 * and it uses pixelcoordinates internally.
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    39
 */ 
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    40
class Terrain {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    41
protected:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    42
    /** The terrain data is stored as a linear array in row-major order, with width*height elements */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    43
    TerrainPixel *terrain_buf;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    44
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    45
    /** Terrain dimensions */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    46
    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
    47
    
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    48
    /** 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
    49
    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
    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
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    54
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    55
     * Default constructor. The width/height are set to zero and the terrain is invalid until it gets updated
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    56
     */
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    57
    Terrain (void);
203
3ec7ab40755f send initial terrain data to clients using a new NETCHAN_TERRAIN_ARRAY channel using raw BigNetworkPacket
terom
parents: 185
diff changeset
    58
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    59
    /**
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    60
     * Constructor.
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    61
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    62
     * @param width terrain width
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    63
     * @param height terrain height
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    64
     * @param seed andom number generator seed used to generate the random terrain.
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
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
    Terrain (PixelDimension width, PixelDimension height, int seed);
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    67
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    68
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    69
     * Destructor
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    70
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    71
    ~Terrain (void);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    72
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    73
private:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    74
    /* No copying */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    75
    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
    76
    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
    77
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    78
protected:
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    79
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    80
     * 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
    81
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    82
    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
    83
        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
    84
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    85
        // XXX: locking?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    86
        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
    87
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    88
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    89
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    90
     * 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
    91
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    92
     * @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
    93
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
    94
    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
    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
     * 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
    98
     * 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
    99
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   100
    void generatePixelBuffer (void);
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
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   103
     * 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
   104
     * pixels using noisifyPixel
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   105
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   106
    void generateTexture();
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
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   109
     * 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
   110
     * at \a pc.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   111
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   112
    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
   113
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   114
    /**
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   115
     * Scale parameter to "pixels"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   116
     *
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   117
     * @param x Scaled value
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   118
     * @return Corresponding value in pixels
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   119
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   120
    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
   121
        return (int) x;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   122
    }
243
25d9a0090397 some generated texture
nireco
parents: 222
diff changeset
   123
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   124
 public:
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   125
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   126
     * 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
   127
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   128
     * @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
   129
     * @return Int vector
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   130
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   131
    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
   132
        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
   133
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   134
255
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
     * 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
   137
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   138
    inline PixelCoordinate getDimensions (void) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   139
        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
   140
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   141
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   142
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   143
     * 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
   144
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   145
     * @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
   146
     * @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
   147
     * @return terrain pixel type
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   148
     */
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   149
    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
   150
        // 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
   151
        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
   152
            return TERRAIN_ROCK;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   153
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   154
        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
   155
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   156
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   157
    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
   158
        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
   159
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   160
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   161
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   162
    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
   163
        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
   164
    }
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   165
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   166
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   167
     * 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
   168
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   169
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   170
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   171
    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
   172
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   173
    /**
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   174
     * 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
   175
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   176
     * @see terrain_buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   177
     */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   178
    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
   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
     * 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
   182
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   183
    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
   184
185
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
     * 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
   187
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   188
     * @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
   189
     * @param end line ending point
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   190
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   191
    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
   192
    
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   193
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   194
     * Remove a circular area of terrain
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   195
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   196
     * @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
   197
     * @param r circle radius
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   198
     */ 
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   199
    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
   200
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   201
    /**
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   202
     * 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
   203
     *
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   204
     * \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
   205
     *
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 370
diff changeset
   206
     * @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
   207
     * @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
   208
     * @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
   209
     */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   210
    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
   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
     * 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
   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 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
   216
     * @param camera view position
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
    virtual void draw (Graphics *g, PixelCoordinate camera = PixelCoordinate(0, 0));
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
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   221
#endif