author | Tero Marttila <terom@fixme.fi> |
Thu, 22 Jan 2009 01:53:05 +0200 | |
branch | new_graphics |
changeset 417 | c503e0c6a740 |
parent 412 | 721c60072091 |
child 423 | 947ab54de4b7 |
permissions | -rw-r--r-- |
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> |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
6 |
#include <cassert> |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
7 |
#include <algorithm> |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
8 |
#include <ClanLib/display.h> |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
9 |
|
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
10 |
const Vector DIRECTIONS[] = { |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
11 |
Vector(0,-1), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
12 |
Vector(1,-1), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
13 |
Vector(1,0), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
14 |
Vector(1,1), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
15 |
Vector(0,1), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
16 |
Vector(-1,1), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
17 |
Vector(-1,0), |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
18 |
Vector(-1,-1) |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
19 |
}; |
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
285
diff
changeset
|
20 |
|
409
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
21 |
Terrain::Terrain (const TerrainConfig &config) : |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
22 |
terrain_buf(NULL), |
412
721c60072091
new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents:
409
diff
changeset
|
23 |
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
|
24 |
{ |
409
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
25 |
// allocate terrain_buf |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
26 |
terrain_buf = new TerrainPixel[width * height]; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
27 |
|
409
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
28 |
// fill with dirt |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
29 |
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
|
30 |
|
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
31 |
// geneerate random map? |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
32 |
if (config.random_seed) |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
33 |
generateTerrain(config.random_seed); |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
34 |
|
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
35 |
// update pixel buffer |
1a03ff151abc
add --terrain-seed and --terrain-size arguments, plus bugfixes
Tero Marttila <terom@fixme.fi>
parents:
408
diff
changeset
|
36 |
generatePixelBuffer(); |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
37 |
} |
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
38 |
|
408
e6cfc44266af
reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents:
406
diff
changeset
|
39 |
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
|
40 |
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
|
41 |
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
|
42 |
{ |
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
|
43 |
// 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
|
44 |
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
|
45 |
} |
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
|
46 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
47 |
Terrain::~Terrain (void) { |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
48 |
// free terrain data |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
49 |
delete[] terrain_buf; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
50 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
51 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
52 |
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
|
53 |
// 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
|
54 |
srand(seed); |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
55 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
56 |
// 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
|
57 |
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
|
58 |
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
|
59 |
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
|
60 |
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
|
61 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
62 |
// 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
|
63 |
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
|
64 |
// circle origin |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
65 |
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
|
66 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
67 |
// radius |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
68 |
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
|
69 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
70 |
// circle type |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
71 |
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
|
72 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
73 |
// 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
|
74 |
if (i == 0) { |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
75 |
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
|
76 |
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
|
77 |
range = 150; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
78 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
79 |
} 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
|
80 |
// some rock |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
81 |
type = TERRAIN_ROCK; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
82 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
83 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
84 |
// 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
|
85 |
for ( |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
86 |
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
|
87 |
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
|
88 |
y++ |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
89 |
) { |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
90 |
for ( |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
91 |
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
|
92 |
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
|
93 |
x++ |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
94 |
) { |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
95 |
// inside radius? |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
96 |
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
|
97 |
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
|
98 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
99 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
100 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
101 |
} |
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
102 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
103 |
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
|
104 |
|
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
|
105 |
#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
|
106 |
// initialize textures |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
107 |
generateTexture(); |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
108 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
109 |
// 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
|
110 |
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
|
111 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
112 |
// 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
|
113 |
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
|
114 |
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
|
115 |
// 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
|
116 |
pixbuf.draw_pixel(x, y, getTexturePixel(x, y)); |
243 | 117 |
} |
118 |
} |
|
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
|
119 |
|
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
|
120 |
#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
|
121 |
// 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
|
122 |
|
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
|
123 |
#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
|
124 |
|
243 | 125 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
126 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
127 |
/* |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
128 |
* 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
|
129 |
*/ |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
130 |
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
|
131 |
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
|
132 |
for (int j = dist; j < size; j += dist * 2) { |
243 | 133 |
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
|
134 |
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
|
135 |
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
|
136 |
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
|
137 |
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
|
138 |
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
|
139 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
140 |
} |
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 = 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
|
142 |
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
|
143 |
double sum = 0; |
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; |
243 | 149 |
} |
150 |
} |
|
151 |
} |
|
152 |
||
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
153 |
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
|
154 |
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
|
155 |
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
|
156 |
double sum = 0; |
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 + 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
|
158 |
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
|
159 |
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
|
160 |
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
|
161 |
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
|
162 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
163 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
164 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
165 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
166 |
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
|
167 |
// texture is a 128x128 px pattern |
243 | 168 |
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
|
169 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
170 |
// store the generated texture |
243 | 171 |
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
|
172 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
173 |
// 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
|
174 |
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
|
175 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
176 |
// XXX: magic constants with unintelligble names |
243 | 177 |
double str = 0.8; |
244 | 178 |
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
|
179 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
180 |
// do some magic |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
181 |
for (int i = 512; i >= 1; i /= 2) { |
243 | 182 |
fractal_diamond(land, texturesize, str, i); |
183 |
fractal_step(land, texturesize, str, i); |
|
184 |
str *= H; |
|
185 |
} |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
186 |
|
243 | 187 |
double min = 100000; |
188 |
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
|
189 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
190 |
// 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
|
191 |
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
|
192 |
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
|
193 |
if (land[i] > max) max = land[i]; |
243 | 194 |
} |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
195 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
196 |
// normalize min down to zero |
243 | 197 |
max -= min; |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
198 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
199 |
// 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
|
200 |
for (int i = 0; i < texturesize * texturesize; i++) { |
243 | 201 |
land[i] -= min; |
202 |
} |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
203 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
204 |
// 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
|
205 |
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
|
206 |
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
|
207 |
texture[i % texturesize][i / texturesize] = (int) land[i]; |
243 | 208 |
} |
209 |
} |
|
210 |
||
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
211 |
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
|
212 |
if (val < min) |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
213 |
return min; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
214 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
215 |
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
|
216 |
return max; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
217 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
218 |
else |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
219 |
return val; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
220 |
} |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
221 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
222 |
CL_Color Terrain::getTexturePixel (PixelDimension x, PixelDimension y) { |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
223 |
CL_Color color; |
327 | 224 |
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
|
225 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
226 |
// determine fade constant |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
227 |
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
|
228 |
case TERRAIN_EMPTY: |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
229 |
color = COLOR_EMPTY; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
230 |
break; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
231 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
232 |
case TERRAIN_DIRT: |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
233 |
color = COLOR_DIRT; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
234 |
texture_fade = 4; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
235 |
break; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
236 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
237 |
case TERRAIN_ROCK: |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
238 |
color = COLOR_ROCK; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
239 |
texture_fade = 2; |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
240 |
break; |
327 | 241 |
} |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
242 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
243 |
// calculate texture coordinate |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
244 |
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
|
245 |
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
|
246 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
247 |
// get color components |
243 | 248 |
int red = color.get_red(); |
249 |
int green = color.get_green(); |
|
250 |
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
|
251 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
252 |
// apply noise from texture |
327 | 253 |
red += (texture[tx][ty] - 128) / texture_fade; |
254 |
green += (texture[tx][ty] - 128) / texture_fade; |
|
255 |
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
|
256 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
257 |
// normalize colors to within range and return new color |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
258 |
return CL_Color( |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
259 |
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
|
260 |
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
|
261 |
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
|
262 |
); |
243 | 263 |
} |
264 |
||
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
265 |
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
|
266 |
return terrain_buf; |
243 | 267 |
} |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
268 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
269 |
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
|
270 |
// copy bytes |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
271 |
memcpy(terrain_buf, buf, width * height); |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
272 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
273 |
// regenerate pixbuf |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
274 |
generatePixelBuffer(); |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
275 |
} |
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
276 |
|
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
277 |
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
|
278 |
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
|
279 |
} |
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
280 |
|
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
281 |
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
|
282 |
// 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
|
283 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
284 |
// 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
|
285 |
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
|
286 |
PixelCoordinate e = getPixelCoordinate(end); |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
287 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
288 |
// 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
|
289 |
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
|
290 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
291 |
// 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
|
292 |
if (steep) { |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
293 |
std::swap(b.x, b.y); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
294 |
std::swap(e.x, e.y); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
295 |
} |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
296 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
297 |
// 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
|
298 |
if (b.x > e.x) |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
299 |
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
|
300 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
301 |
// line length |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
302 |
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
|
303 |
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
|
304 |
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
|
305 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
306 |
// 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
|
307 |
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
|
308 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
309 |
// 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
|
310 |
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
|
311 |
if (steep) { |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
312 |
// 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
|
313 |
if (getType(y, x) != TERRAIN_EMPTY) |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
314 |
return true; |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
315 |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
316 |
} else { |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
317 |
if (getType(x, y) != TERRAIN_EMPTY) |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
318 |
return true; |
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
319 |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
320 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
321 |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
322 |
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
|
323 |
|
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
324 |
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
|
325 |
// 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
|
326 |
y = y + ystep; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
327 |
err = err + dx; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
328 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
329 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
330 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
331 |
// no collision |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
332 |
return false; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
333 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
334 |
|
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
335 |
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
|
336 |
// 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
|
337 |
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
|
338 |
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
|
339 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
340 |
// 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
|
341 |
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
|
342 |
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
|
343 |
// 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
|
344 |
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
|
345 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
346 |
// within radius? |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
347 |
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
|
348 |
// update terrain buf |
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
349 |
setType(i, j, TERRAIN_EMPTY); |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
350 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
351 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
352 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
353 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
354 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
355 |
|
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
356 |
/** |
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
|
357 |
* 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
|
358 |
* |
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
|
359 |
* XXX: ugly little "lookup table" |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
360 |
*/ |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
361 |
static int getDirectionIndex (Vector direction) { |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
362 |
Vector dir = direction.roundToInt(); |
370
39e59dd36b6e
clean up Vector a bit, remove unused Terrain -> direction function
terom
parents:
327
diff
changeset
|
363 |
|
39e59dd36b6e
clean up Vector a bit, remove unused Terrain -> direction function
terom
parents:
327
diff
changeset
|
364 |
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
|
365 |
return 0; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
366 |
} 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
|
367 |
return 1; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
368 |
} 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
|
369 |
return 2; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
370 |
} 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
|
371 |
return 3; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
372 |
} 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
|
373 |
return 4; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
374 |
} 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
|
375 |
return 5; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
376 |
} 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
|
377 |
return 6; |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
378 |
} 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
|
379 |
return 7; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
380 |
} |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
381 |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
382 |
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
|
383 |
return 0; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
384 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
385 |
|
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
386 |
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
|
387 |
// 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
|
388 |
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
|
389 |
|
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
|
390 |
// sanity check |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
391 |
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
|
392 |
|
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
|
393 |
// 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
|
394 |
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
|
395 |
|
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
|
396 |
// 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
|
397 |
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
|
398 |
|
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
|
399 |
// check the two pixels clockwise from the impact direction |
223 | 400 |
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
|
401 |
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
|
402 |
normal += DIRECTIONS[(dirIdx + i + 8) % 8]; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
403 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
404 |
} |
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
|
405 |
|
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 |
// check the two pixels counterclockwise from the impact direction |
223 | 407 |
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
|
408 |
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
|
409 |
normal += DIRECTIONS[(dirIdx - i + 8) % 8]; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
410 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
411 |
} |
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
|
412 |
|
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
|
413 |
// sanity check |
255
99431fdb0dc8
add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents:
248
diff
changeset
|
414 |
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
|
415 |
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
|
416 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
417 |
|
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
418 |
return normal; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
419 |
} |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
420 |
|
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
|
421 |
#if GRAPHICS_ENABLED |
412
721c60072091
new graphics code compiles... no, it doesn't work yet
Tero Marttila <terom@fixme.fi>
parents:
409
diff
changeset
|
422 |
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
|
423 |
// XXX: can we optimize this somehow? |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
424 |
|
406
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
425 |
// 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
|
426 |
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
|
427 |
|
a2e35ca66c74
cleanup Terrain, use a single linear array instead of nested vectors
Tero Marttila <terom@fixme.fi>
parents:
377
diff
changeset
|
428 |
// 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
|
429 |
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
|
430 |
} |
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
|
431 |
#endif |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
432 |