src/Terrain.cc
author Tero Marttila <terom@fixme.fi>
Tue, 27 Jan 2009 00:25:58 +0200
changeset 439 9823e6cd1086
parent 423 947ab54de4b7
permissions -rw-r--r--
some README text
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 409
diff changeset
     1
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     2
#include "Terrain.hh"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     3
#include "Engine.hh"
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     4
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     5
#include <cmath>
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
     6
#include <cstring>
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     7
#include <cassert>
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
     8
#include <algorithm>
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
     9
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    10
#if GRAPHICS_ENABLED
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    11
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    12
#include "Graphics/Drawable.hh"
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    13
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    14
#include <ClanLib/display.h>
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    15
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    16
#endif
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
    17
296
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    18
const Vector DIRECTIONS[] = {
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    19
    Vector(0,-1),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    20
    Vector(1,-1),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    21
    Vector(1,0),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    22
    Vector(1,1),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    23
    Vector(0,1),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    24
    Vector(-1,1),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    25
    Vector(-1,0),
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    26
    Vector(-1,-1)
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    27
};
4d3ebaa29430 add separate Types.hh, and fix projectile-worm collisions on network
terom
parents: 285
diff changeset
    28
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    29
Terrain::Terrain (const TerrainConfig &config) :
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    30
    terrain_buf(NULL),
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 409
diff changeset
    31
    width(config.dimensions.width), height(config.dimensions.height)
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    32
{
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    33
    // allocate terrain_buf
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    34
    terrain_buf = new TerrainPixel[width * height];
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
    35
409
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    36
    // fill with dirt
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    37
    memset(terrain_buf, TERRAIN_DIRT, width * height);
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
    // geneerate random map?
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    40
    if (config.random_seed)
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    41
        generateTerrain(config.random_seed);
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
    // update pixel buffer
1a03ff151abc add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents: 408
diff changeset
    44
    generatePixelBuffer();
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    45
}
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    46
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
    47
Terrain::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
    48
    terrain_buf(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
    49
    width(width), height(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
    50
{
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
    51
    // just generate the pixel 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
    52
    generatePixelBuffer();
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
    53
}
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
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    55
Terrain::~Terrain (void) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    56
    // free terrain data
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    57
    delete[] terrain_buf;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    58
}
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
    59
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    60
void Terrain::generateTerrain (int seed) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    61
    // set random number generator seed.
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    62
    srand(seed); 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    63
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    64
    // some constants to control random generation
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    65
    const int min_range = 25;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    66
    const int max_range = 80;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    67
    const int num = 50;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    68
    const int rock_rarity = 4;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    69
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    70
    // generate \a num random circles
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    71
    for (int i = 0; i < num; i++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    72
        // circle origin
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    73
        PixelCoordinate mid (rand() % width, rand() % height);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    74
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    75
        // radius
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    76
        int range = rand() % (max_range - min_range) + min_range;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    77
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    78
        // circle type
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    79
        TerrainType type = TERRAIN_EMPTY;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    80
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    81
        // tweak to make sure that there's a circle in the midle of the cave
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    82
        if (i == 0) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    83
            mid.x = width / 2;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    84
            mid.y = height / 2;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    85
            range = 150;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    86
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    87
        } else if (rand() % rock_rarity == 0) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    88
            // some rock
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    89
           type = TERRAIN_ROCK;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    90
        }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    91
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    92
        // iterate over the area of the circle
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    93
        for (
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    94
            PixelDimension y = std::max((PixelDimension) 0, mid.y - range);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    95
            y < std::min(height, mid.y + range);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    96
            y++
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    97
        ) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    98
            for (
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
    99
                PixelDimension x = std::max((PixelDimension) 0, mid.x - range); 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   100
                x < std::min(width, mid.x + range); 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   101
                x++
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   102
            ) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   103
                // inside radius?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   104
                if ((x - mid.x) * (x - mid.x) + (y - mid.y) * (y - mid.y) < range * range) 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   105
                    terrain_buf[y * width + x] = (TerrainPixel) type;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   106
            }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   107
        } 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   108
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   109
}
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   110
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   111
void Terrain::generatePixelBuffer (void) {
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
   112
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
   113
#if GRAPHICS_ENABLED    
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   114
    // initialize textures
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   115
    generateTexture();
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   116
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   117
    // create the pixel buffer of the correct size
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   118
    pixbuf = CL_PixelBuffer(width, height, 4 * width, CL_PixelFormat::rgba8888);
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   119
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   120
    // iterate over each pixel
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   121
    for (PixelDimension x = 0; x < width; x++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   122
        for (PixelDimension y = 0; y < height; y++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   123
            // draw textureized pixel color
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   124
            pixbuf.draw_pixel(x, y, getTexturePixel(x, y));
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   125
        }
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   126
    }
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
   127
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
   128
#else
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
   129
    // no-op
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
   130
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
   131
#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
   132
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   133
}
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   134
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   135
// XXX: disable textures as well
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   136
#if GRAPHICS_ENABLED
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   137
/*
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   138
 * Texture generation utility functions
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   139
 */
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   140
static void fractal_step (std::vector<double>& land, int size, double str, int dist) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   141
    for (int i = 0; i < size; i += dist * 2) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   142
        for (int j = dist; j < size; j += dist * 2) {
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   143
            double sum = 0;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   144
            sum += land[(i + size - dist) % size + j * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   145
            sum += land[i + ((j + size - dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   146
            sum += land[(i + dist) % size + j * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   147
            sum += land[i + ((j + dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   148
            land[i + j * size] = sum / 4 + (rand() % 10000 - 5000) * str;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   149
        }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   150
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   151
    for (int i = dist; i < size; i += dist * 2) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   152
        for (int j = 0; j < size; j += dist * 2) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   153
            double sum = 0;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   154
            sum += land[(i + size - dist) % size + j * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   155
            sum += land[i + ((j + size - dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   156
            sum += land[(i + dist) % size + j * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   157
            sum += land[i + ((j + dist)  % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   158
            land[i + j * size] = sum / 4 + (rand() % 10000 - 5000) * str;
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   159
        }
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   160
    }
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   161
}
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   162
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   163
static void fractal_diamond (std::vector<double>& land, int size, double str, int dist) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   164
    for (int i = dist; i < size; i += dist*2) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   165
        for (int j = dist; j < size; j += dist*2) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   166
            double sum = 0;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   167
            sum += land[(i + size - dist) % size + ((j + size - dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   168
            sum += land[(i + dist) % size + ((j + size - dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   169
            sum += land[(i + size - dist) % size + ((j + dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   170
            sum += land[(i + dist) % size + ((j + dist) % size) * size];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   171
            land[i + j * size] = sum / 4 + (rand() % 10000 - 5000) * str;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   172
        }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   173
    }
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   174
}
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   175
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   176
void Terrain::generateTexture (void) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   177
    // texture is a 128x128 px pattern
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   178
    int texturesize = 128;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   179
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   180
    // store the generated texture
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   181
    texture = std::vector<std::vector<int> >(texturesize, std::vector<int>(texturesize));
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   182
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   183
    // generate texture into this
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   184
    std::vector<double> land(texture.size() * texture.size());
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   185
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   186
    // XXX: magic constants with unintelligble names
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   187
    double str = 0.8;
244
80a818ac288b fixed H value of generate_texture
nireco
parents: 243
diff changeset
   188
    double H = 0.8;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   189
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   190
    // do some magic
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   191
    for (int i = 512; i >= 1; i /= 2) {
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   192
        fractal_diamond(land, texturesize, str, i);
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   193
        fractal_step(land, texturesize, str, i);
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   194
        str *= H;
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   195
    }
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   196
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   197
    double min = 100000;
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   198
    double max = -100000;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   199
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   200
    // find the range of minimum and maximum values
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   201
    for (int i = 0; i < texturesize * texturesize; i++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   202
        if (land[i] < min) min = land[i];
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   203
        if (land[i] > max) max = land[i];
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   204
    }
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   205
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   206
    // normalize min down to zero
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   207
    max -= min;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   208
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   209
    // normalize values to [0, max]
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   210
    for (int i = 0; i < texturesize * texturesize; i++) {
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   211
        land[i] -= min;
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   212
    }
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   213
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   214
    // copy+mangle land to texture as integers
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   215
    for (int i = 0; i < texturesize * texturesize; i++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   216
        land[i] = land[i] * 255 / max;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   217
        texture[i % texturesize][i / texturesize] = (int) land[i];
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   218
    }
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   219
}
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   220
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   221
static int normalizeRange (int min, int val, int max) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   222
    if (val < min)
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   223
        return min;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   224
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   225
    else if (val > max)
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   226
        return max;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   227
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   228
    else 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   229
        return val;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   230
}
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   231
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   232
Color Terrain::getTexturePixel (PixelDimension x, PixelDimension y) {
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   233
    Color color;
327
09a3b5055862 stronger texture
nireco
parents: 323
diff changeset
   234
    int texture_fade = 8;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   235
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   236
    // determine fade constant
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   237
    switch (getType(x, y)) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   238
        case TERRAIN_EMPTY:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   239
            color = COLOR_EMPTY;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   240
            break;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   241
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   242
        case TERRAIN_DIRT:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   243
            color = COLOR_DIRT;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   244
            texture_fade = 4;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   245
            break;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   246
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   247
        case TERRAIN_ROCK:
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   248
            color = COLOR_ROCK;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   249
            texture_fade = 2;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   250
            break;
327
09a3b5055862 stronger texture
nireco
parents: 323
diff changeset
   251
    }
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   252
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   253
    // calculate texture coordinate
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   254
    int tx = (x + texture_fade * 37) % texture.size();
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   255
    int ty = (y + texture_fade * 37) % texture[0].size();
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   256
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   257
    // get color components
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   258
    int red = color.get_red();
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   259
    int green = color.get_green();
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   260
    int blue = color.get_blue();
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   261
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   262
    // apply noise from texture
327
09a3b5055862 stronger texture
nireco
parents: 323
diff changeset
   263
    red += (texture[tx][ty] - 128) / texture_fade;
09a3b5055862 stronger texture
nireco
parents: 323
diff changeset
   264
    green += (texture[tx][ty] - 128) / texture_fade;
09a3b5055862 stronger texture
nireco
parents: 323
diff changeset
   265
    blue += (texture[tx][ty] - 128) / texture_fade;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   266
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   267
    // normalize colors to within range and return new color    
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   268
    return Color(
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   269
            normalizeRange(0, red, 255),
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   270
            normalizeRange(0, green, 255),
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   271
            normalizeRange(0, blue, 255)
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   272
    );
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   273
}
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 417
diff changeset
   274
#endif /* GRAPHICS_ENABLED */
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   275
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   276
const TerrainPixel* Terrain::getTerrainBuffer (void) const {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   277
    return terrain_buf;
243
25d9a0090397 some generated texture
nireco
parents: 223
diff changeset
   278
}
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   279
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   280
void Terrain::loadFromBuffer (const TerrainPixel *buf) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   281
    // copy bytes
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   282
    memcpy(terrain_buf, buf, width * height);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   283
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   284
    // regenerate pixbuf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   285
    generatePixelBuffer();
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   286
}
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   287
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   288
bool Terrain::collides (const Vector &point) const {
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   289
    return (getType(point) != TERRAIN_EMPTY);
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   290
}
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   291
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   292
bool Terrain::collides (const Vector &begin, const Vector &end) const {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   293
    // TODO: Maybe there should be another function that also returns the point where we collided.
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   294
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   295
    // use Bresenhams line algorithm to go trough all the "pixels" of the line.
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   296
    PixelCoordinate b = getPixelCoordinate(begin);
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   297
    PixelCoordinate e = getPixelCoordinate(end);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   298
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   299
    // steepness of line (large angle against horizontal)
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   300
    bool steep = (abs(e.y - b.y) > abs(e.x - b.x)); // k > 1
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   301
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   302
    // if the line is steep, swap the x and y coordinates
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   303
    if (steep) { 
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   304
        std::swap(b.x, b.y);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   305
        std::swap(e.x, e.y);
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   306
    }
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   307
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   308
    // normalize so that the line goes upwards
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   309
    if (b.x > e.x)
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   310
        std::swap(b, e);
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   311
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   312
    // line length
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   313
    PixelDimension dx = e.x - b.x, dy = abs(e.y - b.y);
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   314
    PixelDimension err = dx / 2;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   315
    PixelDimension y = b.y;
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   316
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   317
    // ascending or descending line?
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   318
    PixelDimension ystep = b.y < e.y ? 1 : -1;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   319
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   320
    // iterate through the pixels on the line
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   321
    for (PixelDimension x = b.x; x <= e.x; x++) {
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   322
        if (steep) { 
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   323
            // x and y coordinates must be switched if steep
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   324
            if (getType(y, x) != TERRAIN_EMPTY)
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   325
                return true;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   326
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   327
        } else {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   328
            if (getType(x, y) != TERRAIN_EMPTY) 
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   329
                return true;
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   330
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   331
        }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   332
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   333
        err = err - dy;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   334
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   335
        if (err < 0) { 
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   336
            // check if we want to make an ystep
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   337
            y = y + ystep;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   338
            err = err + dx;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   339
        }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   340
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   341
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   342
    // no collision
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   343
    return false; 
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   344
}
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   345
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   346
void Terrain::removeGround (const Vector &pos, float radius) {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   347
    // scale arguments to pixel units
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   348
    PixelCoordinate mid = getPixelCoordinate(pos);
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   349
    PixelDimension r = scale(radius); 
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   350
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   351
    // iterate through the circle's pixels
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   352
    for (PixelDimension j = mid.y - r; j < mid.y + r; j++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   353
        for (PixelDimension i = mid.x - r; i < mid.x + r; i++) {
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   354
            // getType also returns TERRAIN_ROCK if out-of-bounds
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   355
            if (getType(i, j) != TERRAIN_ROCK) { 
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   356
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   357
                // within radius?
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   358
                if ((i - mid.x) * (i - mid.x) + (j - mid.y) * (j - mid.y) < r * r) {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   359
                    // update terrain buf
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   360
                    setType(i, j, TERRAIN_EMPTY);
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   361
                }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   362
            }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   363
        }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   364
    }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   365
}
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   366
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   367
/**
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
   368
 * Gets the index of the given coordinate direction referring to the DIRECTIONS table in Physics.hh
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
   369
 *
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
   370
 * XXX: ugly little "lookup table"
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   371
 */
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   372
static int getDirectionIndex (Vector direction) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   373
    Vector dir = direction.roundToInt();
370
39e59dd36b6e clean up Vector a bit, remove unused Terrain -> direction function
terom
parents: 327
diff changeset
   374
39e59dd36b6e clean up Vector a bit, remove unused Terrain -> direction function
terom
parents: 327
diff changeset
   375
    if (dir.x == 0 && dir.y == -1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   376
        return 0;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   377
    } else if (dir.x == 1 && dir.y == -1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   378
        return 1;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   379
    } else if (dir.x == 1 && dir.y == 0) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   380
        return 2;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   381
    } else if (dir.x == 1 && dir.y == 1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   382
        return 3;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   383
    } else if (dir.x == 0 && dir.y == 1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   384
        return 4;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   385
    } else if (dir.x == -1 && dir.y == 1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   386
        return 5;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   387
    } else if (dir.x == -1 && dir.y == 0) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   388
        return 6;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   389
    } else if (dir.x == -1 && dir.y == -1) {
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   390
        return 7;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   391
    }
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   392
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   393
    Engine::log(DEBUG, "Terrain.getDirectionIndex ") << "invalid direction: " << direction;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   394
    return 0;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   395
}
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   396
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   397
Vector Terrain::getNormal(Vector point, Vector prevPoint) const {
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
   398
    // convert location to coordinate
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   399
    PixelCoordinate p = getPixelCoordinate(point);
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
   400
    
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
   401
    // sanity check
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   402
    assert(point != prevPoint);
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
   403
    
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
   404
    // round and subtract to get an integer direction vector, and turn this into a direction index
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   405
    int dirIdx = getDirectionIndex(prevPoint.roundToInt() - point.roundToInt());
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
   406
    
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
   407
    // always add our own direction to normal
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
   408
    Vector normal = DIRECTIONS[dirIdx];
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
   409
    
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
   410
    // check the two pixels clockwise from the impact direction
223
2fcaf54ed37b basic network-projectiles
terom
parents: 204
diff changeset
   411
    for (int i = 1; i <= 2; i++) {
377
01d3c340b372 direction normalization functions in vector, change rope color, misc comments+whitespace
terom
parents: 370
diff changeset
   412
        if (getType(point + DIRECTIONS[(dirIdx + i + 8) % 8]) == TERRAIN_EMPTY) {
01d3c340b372 direction normalization functions in vector, change rope color, misc comments+whitespace
terom
parents: 370
diff changeset
   413
            normal += DIRECTIONS[(dirIdx + i + 8) % 8];
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   414
        }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   415
    }
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
   416
    
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
   417
    // check the two pixels counterclockwise from the impact direction
223
2fcaf54ed37b basic network-projectiles
terom
parents: 204
diff changeset
   418
    for (int i = 1; i <= 2; i++) {
377
01d3c340b372 direction normalization functions in vector, change rope color, misc comments+whitespace
terom
parents: 370
diff changeset
   419
        if (getType(point + DIRECTIONS[(dirIdx - i + 8) % 8]) == TERRAIN_EMPTY) {
01d3c340b372 direction normalization functions in vector, change rope color, misc comments+whitespace
terom
parents: 370
diff changeset
   420
            normal += DIRECTIONS[(dirIdx - i + 8) % 8];
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   421
        }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   422
    }
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
   423
    
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
   424
    // sanity check
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   425
    if (getType(point) == TERRAIN_EMPTY || getType(prevPoint) != TERRAIN_EMPTY) {
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
   426
        Engine::log(DEBUG, "Physics.getNormal ") << "silly collision";
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   427
    }
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   428
    
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   429
    return normal;
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   430
}
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   431
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
   432
#if GRAPHICS_ENABLED
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 409
diff changeset
   433
void Terrain::draw (graphics::Display &display, PixelCoordinate camera) {
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   434
    // XXX: can we optimize this somehow?
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   435
    
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   436
    // load the terrain pixbuf as a surface
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 248
diff changeset
   437
    CL_Surface surf (pixbuf);
406
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   438
    
a2e35ca66c74 cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents: 377
diff changeset
   439
    // draw it onto the graphics, offset by camera position
412
721c60072091 new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents: 409
diff changeset
   440
    surf.draw(-camera.x, -camera.y, display.get_gc());
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   441
}
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
   442
#endif
185
25becd2cb026 that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff changeset
   443