Commit Graph

39 Commits

Author SHA1 Message Date
Imbris
83b5ca3335 Higher level cache abstraction 2019-10-01 02:10:28 -04:00
Imbris
89a1c45ac7 Cache most recent chunk access in terrain meshing 2019-10-01 02:10:28 -04:00
Joshua Barretto
d745acc948 Floodfill shadows, smooth shadow lighting 2019-09-26 00:15:07 +01:00
haslersn
b26043b0e6 common: Rework Chunk and Chonk implementation
Previously, voxels in sparsely populated chunks were stored in a `HashMap`.
However, during usage oftentimes block accesses are followed by subsequent
nearby voxel accesses. Therefore it's possible to provide cache friendliness,
but not with `HashMap`.

The previous merge request [!469](https://gitlab.com/veloren/veloren/merge_requests/469)
proposed to order voxels by their morton order (see https://en.wikipedia.org/wiki/Z-order_curve ).
This provided excellent cache friendliness. However, benchmarks showed that
the required indexing calculations are quite expensive. Particular results
on my _Intel(R) Core(TM) i7-7500U CPU @ 2.70 GHz_ were:

| Benchmark                                | Before this commit @ d322384bec | Morton Order @ ec8a7caf42 | This commit          |
| ---------------------------------------- | --------------------------------- | --------------------------- | -------------------- |
| `full read` (81920 voxels)               | 17.7ns per voxel                  | 8.9ns per voxel             | **3.6ns** per voxel  |
| `constrained read` (4913 voxels)         | 67.0ns per voxel                  | 40.1ns per voxel            | **14.1ns** per voxel |
| `local read` (125 voxels)                | 17.5ns per voxel                  | 14.7ns per voxel            | **3.8ns** per voxel  |
| `X-direction read` (17 voxels)           | 17.8ns per voxel                  | 25.9ns per voxel            | **4.2ns** per voxel  |
| `Y-direction read` (17 voxels)           | 18.4ns per voxel                  | 33.3ns per voxel            | **4.5ns** per voxel  |
| `Z-direction read` (17 voxels)           | 18.6ns per voxel                  | 38.2ns per voxel            | **5.4ns** per voxel  |
| `long Z-direction read` (65 voxels)      | 18.0ns per voxel                  | 37.7ns per voxel            | **5.1ns** per voxel  |
| `full write (dense)` (81920 voxels)      | 17.9ns per voxel                  | **10.3ns** per voxel        | 12.4ns per voxel     |

This commit (instead of utilizing morton order) replaces `HashMap` in the
`Chunk` implementation by the following data structure:

The volume is spatially subdivided into groups of `4*4*4` blocks. Since a
`Chunk` is of total size `32*32*16`, this implies that there are `8*8*4`
groups. (These numbers are generic in the actual code such that there are
always `256` groups. I.e. the group size is chosen depending on the desired
total size of the `Chunk`.)

There's a single vector `self.vox` which consecutively stores these groups.
Each group might or might not be contained in `self.vox`. A group that is
not contained represents that the full group consists only of `self.default`
voxels. This saves a lot of memory because oftentimes a `Chunk` consists of
either a lot of air or a lot of stone.

To track whether a group is contained in `self.vox`, there's an index buffer
`self.indices : [u8; 256]`. It contains for each group

* (a) the order in which it has been inserted into `self.vox`, if the group
    is contained in `self.vox` or
* (b) 255, otherwise. That case represents that the whole group consists
    only of `self.default` voxels.

(Note that 255 is a valid insertion order for case (a) only if `self.vox` is
full and then no other group has the index 255. Therefore there's no
ambiguity.)

Rationale:

The index buffer should be small because:

* Small size increases the probability that it will always be in cache.
* The index buffer is allocated for every `Chunk` and an almost empty `Chunk`
    shall not consume too much memory.

The number of 256 groups is particularly nice because it means that the index
buffer can consist of `u8`s. This keeps the space requirement for the index
buffer as low as 4 cache lines.
2019-09-06 18:20:15 +02:00
haslersn
1796c09ca1 common: Rework volume API
See the doc comments in `common/src/vol.rs` for more information on
the API itself.

The changes include:

* Consistent `Err`/`Error` naming.
  * Types are named `...Error`.
  * `enum` variants are named `...Err`.
* Rename `VolMap{2d, 3d}` -> `VolGrid{2d, 3d}`. This is in preparation
  to an upcoming change where a “map” in the game related sense will
  be added.
* Add volume iterators. There are two types of them:
  * _Position_ iterators obtained from the trait `IntoPosIterator`
    using the method
    `fn pos_iter(self, lower_bound: Vec3<i32>, upper_bound: Vec3<i32>) -> ...`
    which returns an iterator over `Vec3<i32>`.
  * _Volume_ iterators obtained from the trait `IntoVolIterator`
    using the method
    `fn vol_iter(self, lower_bound: Vec3<i32>, upper_bound: Vec3<i32>) -> ...`
    which returns an iterator over `(Vec3<i32>, &Self::Vox)`.
  Those traits will usually be implemented by references to volume
  types (i.e. `impl IntoVolIterator<'a> for &'a T` where `T` is some
  type which usually implements several volume traits, such as `Chunk`).
  * _Position_ iterators iterate over the positions valid for that
    volume.
  * _Volume_ iterators do the same but return not only the position
    but also the voxel at that position, in each iteration.
* Introduce trait `RectSizedVol` for the use case which we have with
  `Chonk`: A `Chonk` is sized only in x and y direction.
* Introduce traits `RasterableVol`, `RectRasterableVol`
  * `RasterableVol` represents a volume that is compile-time sized and has
    its lower bound at `(0, 0, 0)`. The name `RasterableVol` was chosen
    because such a volume can be used with `VolGrid3d`.
  * `RectRasterableVol` represents a volume that is compile-time sized at
    least in x and y direction and has its lower bound at `(0, 0, z)`.
    There's no requirement on he lower bound or size in z direction.
    The name `RectRasterableVol` was chosen because such a volume can be
    used with `VolGrid2d`.
2019-09-06 15:43:31 +02:00
haslersn
9844e95e5f common: Stop abusing wild animals for bit shifts 2019-08-29 18:06:52 +02:00
Acrimon
d0f10115f4 Eliminated unsafe. 2019-08-19 14:33:31 +02:00
Acrimon
b4a46f3e6e Finished switch to hashbrown. 2019-08-11 22:38:28 +02:00
timokoesters
a702f7258a Fix building 2019-07-03 21:28:07 +02:00
timokoesters
f5da167ce5
Fix warnings and clippy recommendations in common 2019-07-02 15:48:25 +02:00
Cody
14ac5babd4 Removes most unused imports; changes some unused variables to underscores or provides a leading underscore; removes some unnecessary variables and mutable declarations; and performs other miscellaneous warning fixes. 2019-06-06 14:48:41 +00:00
Joshua Barretto
1b5d2d468b Made idx_for use idx_for_unchecked internally 2019-06-06 07:42:59 +01:00
Joshua Barretto
9da2d82197 Added proper VD fog 2019-06-05 20:52:51 +01:00
timokoesters
4696cd2c8b Add better inputs, input validation and more
Former-commit-id: 3227221b12a674f66b011ce0ba734e226f223f34
2019-05-25 23:46:56 +02:00
timokoesters
f4434013db Fix clear_terrain not changing Changes
Former-commit-id: da7b02939d6d0bc7dbef7d923fb880081f6e08aa
2019-05-25 23:21:40 +02:00
timokoesters
f5751d65b1 Fix terrain not loading
Former-commit-id: f9279878ab051c6083c4a1f5125531fe79151fb8
2019-05-25 23:21:39 +02:00
Joshua Barretto
92391883a9 fmt
Former-commit-id: 689464ed1009ebfd74769fa113fc7b433ea62bbd
2019-05-25 06:54:47 +01:00
Joshua Barretto
c8ba5d9f89 Basic pine tree spawning
Former-commit-id: e58374724f6c9cb4a54ae96abd3420b02207fd30
2019-05-25 05:51:45 +01:00
Cody
6b09fd7c53 Pedantic comment and language fixes.
Former-commit-id: eb49765c911aaa97a9c8ed351216a7a6f8411213
2019-05-17 18:32:07 -04:00
Joshua Barretto
7174830279 fmt
Former-commit-id: 71912bdd2b8f40020153c5696cd5cc1af3f154cc
2019-05-17 18:54:56 +01:00
Joshua Barretto
91184356e7 Added chonks
Former-commit-id: a62fb321dbfb7541feaa9de4e641db9887b061fd
2019-05-17 18:44:30 +01:00
Joshua Barretto
0b1ea359fa Adjustments to VolMap
Former-commit-id: 53ba7185102e7ff17825891d02bd0e26e5fe1076
2019-05-13 11:06:59 +01:00
Joshua Barretto
edfd2290eb Massively sped up VolMap offset calculations
Former-commit-id: 8f3cdf57a77691ca60c0921bc86a79c8cfe36539
2019-05-13 11:06:58 +01:00
sxv20_
f600eca072 start fixing chunk rendering, noticed stack overflow crash
Former-commit-id: 334904276580cd78f5d5e3bf010a86fcd822cfdf
2019-05-13 11:03:47 +01:00
sxv20_
e20c2a1e00 Move VolMap to HashMap<_, Arc<Chunk>>
Former-commit-id: e209891596acbb1705876a1cb7ccce3ac2fe2d45
2019-05-13 11:03:47 +01:00
sxv20_
a23f9d90ea cache a chunk while cloning to increase performance (?)
Former-commit-id: 69c1fa67b13a8de49f2c73e9526f548779e988c1
2019-05-13 11:03:47 +01:00
Forest Anderson
993388e56a Ran fmt on codebase
Former-commit-id: 7fecffa1dc66fffba4f07d45fb80960dc5178f4f
2019-04-29 20:37:19 +00:00
Joshua Barretto
f9f434a1c2 Started work on worldgen
Former-commit-id: 277a4b2a0a5a393c590a710aebaf62e5cce2ad1d
2019-04-25 17:52:11 +01:00
timokoesters
06693136b6 Fixed names, debug and notify
Former-commit-id: f58dedf7c4eb9b284982588fc6b19bbe3edb0391
2019-04-22 23:00:24 +02:00
Joshua Barretto
3112486005 Added partial chunk loading, package section to workspace Cargo.toml
Former-commit-id: 4164daf4ccbe6695f664a44d0fce0ee10df39b8d
2019-04-14 14:23:43 +01:00
Joshua Barretto
507c47e771 Rewrote netcode, added basic chunk synching
Former-commit-id: e9f76f7fa9dbe0c81cd4c998bf0f0b3eec9235cb
2019-04-14 14:23:43 +01:00
Joshua Barretto
f27b5fa975 Added server-side chunk generation
Former-commit-id: 72e02f8ec711ec4fac3111b591c4b08086dee4e3
2019-04-14 14:23:43 +01:00
Joshua Barretto
3d9f8105e6 Started work on server-side chunks
Former-commit-id: 84a6bd7358f67a77043c4b11c787538f073c8d28
2019-04-14 14:23:43 +01:00
Joshua Barretto
8a37662cf0 Cleaned up codebase, added cursor grab toggle 2019-01-23 22:21:47 +00:00
Joshua Barretto
248577bdef Added test terrain loading and meshing 2019-01-23 20:01:58 +00:00
Joshua Barretto
41b6672743 Added Terrain type to scene 2019-01-15 15:13:11 +00:00
Joshua Barretto
ae4f1ae2ea Added vox trait 2019-01-14 18:49:53 +00:00
Joshua Barretto
8184bc6fc0 Added figures, segments, test .vox files, basic animation test 2019-01-13 20:53:55 +00:00
Joshua Barretto
523db9f054 Started work on adding terrain 2019-01-02 19:22:01 +00:00