Move blocks into its own crate to speed up compile times
This commit is contained in:
parent
051f836fde
commit
92d773bd72
|
@ -15,6 +15,7 @@ dependencies = [
|
||||||
"sdl2 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"sdl2 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"steven_blocks 0.0.1",
|
||||||
"steven_gl 0.0.1",
|
"steven_gl 0.0.1",
|
||||||
"steven_openssl 0.0.1",
|
"steven_openssl 0.0.1",
|
||||||
"steven_resources 0.1.0",
|
"steven_resources 0.1.0",
|
||||||
|
@ -475,6 +476,15 @@ dependencies = [
|
||||||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "steven_blocks"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"cgmath 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"collision 0.5.1 (git+https://github.com/csherratt/collision-rs?rev=f80825e)",
|
||||||
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "steven_gl"
|
name = "steven_gl"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
|
|
|
@ -32,3 +32,7 @@ version = "0"
|
||||||
[dependencies.steven_resources]
|
[dependencies.steven_resources]
|
||||||
path = "./resources"
|
path = "./resources"
|
||||||
version = "0"
|
version = "0"
|
||||||
|
|
||||||
|
[dependencies.steven_blocks]
|
||||||
|
path = "./blocks"
|
||||||
|
version = "0"
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
[root]
|
||||||
|
name = "steven_blocks"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"cgmath 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"collision 0.5.1 (git+https://github.com/csherratt/collision-rs?rev=f80825e)",
|
||||||
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cgmath"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"num 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "collision"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "git+https://github.com/csherratt/collision-rs?rev=f80825e#f80825eca687ff1053ff492e54fa782944c9cf6b"
|
||||||
|
dependencies = [
|
||||||
|
"cgmath 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "0.1.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num"
|
||||||
|
version = "0.1.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.3.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-serialize"
|
||||||
|
version = "0.3.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "steven_blocks"
|
||||||
|
version = "0.0.1"
|
||||||
|
authors = [ "Thinkofdeath <thinkofdeath@spigotmc.org>" ]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
lazy_static = "0.1.15"
|
||||||
|
cgmath = "0.7.0"
|
||||||
|
collision = {git = "https://github.com/csherratt/collision-rs", rev = "f80825e"}
|
|
@ -24,15 +24,50 @@
|
||||||
// Fire (Update State)
|
// Fire (Update State)
|
||||||
// CobblestoneWall (Connections)
|
// CobblestoneWall (Connections)
|
||||||
|
|
||||||
|
#![recursion_limit="300"]
|
||||||
|
|
||||||
|
extern crate cgmath;
|
||||||
|
extern crate collision;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate lazy_static;
|
||||||
|
|
||||||
use collision::{Aabb, Aabb3};
|
use collision::{Aabb, Aabb3};
|
||||||
use cgmath::Point3;
|
use cgmath::Point3;
|
||||||
use types::Direction;
|
|
||||||
|
|
||||||
pub mod material;
|
pub mod material;
|
||||||
pub use self::material::Material;
|
pub use self::material::Material;
|
||||||
|
|
||||||
pub use self::Block::*;
|
pub use self::Block::*;
|
||||||
|
|
||||||
|
pub trait WorldAccess {
|
||||||
|
fn get_block(&self, x: i32, y: i32, z: i32) -> Block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! create_ids {
|
||||||
|
($t:ty, ) => ();
|
||||||
|
($t:ty, prev($prev:ident), $name:ident) => (
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
pub const $name: $t = $prev + 1;
|
||||||
|
);
|
||||||
|
($t:ty, prev($prev:ident), $name:ident, $($n:ident),+) => (
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
pub const $name: $t = $prev + 1;
|
||||||
|
create_ids!($t, prev($name), $($n),+);
|
||||||
|
);
|
||||||
|
($t:ty, $name:ident, $($n:ident),+) => (
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
pub const $name: $t = 0;
|
||||||
|
create_ids!($t, prev($name), $($n),+);
|
||||||
|
);
|
||||||
|
($t:ty, $name:ident) => (
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
pub const $name: $t = 0;
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
macro_rules! consume_token { ($i:tt) => (0) }
|
macro_rules! consume_token { ($i:tt) => (0) }
|
||||||
|
|
||||||
macro_rules! offsets {
|
macro_rules! offsets {
|
||||||
|
@ -240,7 +275,7 @@ macro_rules! define_blocks {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused_variables, unreachable_code)]
|
#[allow(unused_variables, unreachable_code)]
|
||||||
pub fn update_state(&self, world: &super::World, x: i32, y: i32, z: i32) -> Block {
|
pub fn update_state<W: WorldAccess>(&self, world: &W, x: i32, y: i32, z: i32) -> Block {
|
||||||
match *self {
|
match *self {
|
||||||
$(
|
$(
|
||||||
Block::$name {
|
Block::$name {
|
||||||
|
@ -3940,8 +3975,9 @@ define_blocks! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn can_connect<F: Fn(Block) -> bool>(world: &super::World, x: i32, y: i32, z: i32, dir: Direction, f: &F) -> bool {
|
fn can_connect<F: Fn(Block) -> bool, W: WorldAccess>(world: &W, x: i32, y: i32, z: i32, dir: Direction, f: &F) -> bool {
|
||||||
let block = world.get_block_offset(x, y, z, dir);
|
let (ox, oy, oz) = dir.get_offset();
|
||||||
|
let block = world.get_block(x + ox, y + oy, z + oz);
|
||||||
f(block) || (block.get_material().renderable && block.get_material().should_cull_against)
|
f(block) || (block.get_material().renderable && block.get_material().should_cull_against)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3973,11 +4009,12 @@ fn can_connect_glasspane(block: Block) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn can_connect_redstone(world: &super::World, x: i32, y: i32, z: i32, dir: Direction) -> RedstoneSide {
|
fn can_connect_redstone<W: WorldAccess>(world: &W, x: i32, y: i32, z: i32, dir: Direction) -> RedstoneSide {
|
||||||
let block = world.get_block_offset(x, y, z, dir);
|
let (ox, oy, oz) = dir.get_offset();
|
||||||
|
let block = world.get_block(x + ox, y + oy, z + oz);
|
||||||
|
|
||||||
if block.get_material().should_cull_against {
|
if block.get_material().should_cull_against {
|
||||||
let side_up = world.get_block_offset(x, y + 1, z, dir);
|
let side_up = world.get_block(x + ox, y + oy + 1, z + oz);
|
||||||
let up = world.get_block(x, y + 1, z);
|
let up = world.get_block(x, y + 1, z);
|
||||||
|
|
||||||
if match side_up { Block::RedstoneWire{..} => true, _ => false,} && !up.get_material().should_cull_against {
|
if match side_up { Block::RedstoneWire{..} => true, _ => false,} && !up.get_material().should_cull_against {
|
||||||
|
@ -3987,7 +4024,7 @@ fn can_connect_redstone(world: &super::World, x: i32, y: i32, z: i32, dir: Direc
|
||||||
return RedstoneSide::None;
|
return RedstoneSide::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let side_down = world.get_block_offset(x, y - 1, z, dir);
|
let side_down = world.get_block(x + ox, y + oy - 1, z + oz);
|
||||||
if match block { Block::RedstoneWire{..} => true, _ => false,} || match side_down { Block::RedstoneWire{..} => true, _ => false,} {
|
if match block { Block::RedstoneWire{..} => true, _ => false,} || match side_down { Block::RedstoneWire{..} => true, _ => false,} {
|
||||||
return RedstoneSide::Side;
|
return RedstoneSide::Side;
|
||||||
}
|
}
|
||||||
|
@ -4039,7 +4076,7 @@ fn door_data(facing: Direction, half: DoorHalf, hinge: Side, open: bool, powered
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_door_state(world: &super::World, x: i32, y: i32, z: i32, ohalf: DoorHalf, ofacing: Direction, ohinge: Side, oopen: bool, opowered: bool) -> (Direction, Side, bool, bool) {
|
fn update_door_state<W: WorldAccess>(world: &W, x: i32, y: i32, z: i32, ohalf: DoorHalf, ofacing: Direction, ohinge: Side, oopen: bool, opowered: bool) -> (Direction, Side, bool, bool) {
|
||||||
let oy = if ohalf == DoorHalf::Upper {
|
let oy = if ohalf == DoorHalf::Upper {
|
||||||
-1
|
-1
|
||||||
} else {
|
} else {
|
||||||
|
@ -4068,7 +4105,7 @@ fn update_door_state(world: &super::World, x: i32, y: i32, z: i32, ohalf: DoorHa
|
||||||
(ofacing, ohinge, oopen, opowered)
|
(ofacing, ohinge, oopen, opowered)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_double_plant_state(world: &super::World, x: i32, y: i32, z: i32, ohalf: BlockHalf, ovariant: DoublePlantVariant) -> (BlockHalf, DoublePlantVariant) {
|
fn update_double_plant_state<W: WorldAccess>(world: &W, x: i32, y: i32, z: i32, ohalf: BlockHalf, ovariant: DoublePlantVariant) -> (BlockHalf, DoublePlantVariant) {
|
||||||
if ohalf != BlockHalf::Upper {
|
if ohalf != BlockHalf::Upper {
|
||||||
return (ohalf, ovariant);
|
return (ohalf, ovariant);
|
||||||
}
|
}
|
||||||
|
@ -4896,7 +4933,7 @@ impl StairShape {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_stair_info(world: &super::World, x: i32, y: i32, z: i32) -> Option<(Direction, BlockHalf)> {
|
fn get_stair_info<W: WorldAccess>(world: &W, x: i32, y: i32, z: i32) -> Option<(Direction, BlockHalf)> {
|
||||||
use self::Block::*;
|
use self::Block::*;
|
||||||
match world.get_block(x, y, z) {
|
match world.get_block(x, y, z) {
|
||||||
OakStairs{facing, half, ..} |
|
OakStairs{facing, half, ..} |
|
||||||
|
@ -4917,7 +4954,7 @@ fn get_stair_info(world: &super::World, x: i32, y: i32, z: i32) -> Option<(Direc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_stair_shape(world: &super::World, x: i32, y: i32, z: i32, facing: Direction) -> StairShape {
|
fn update_stair_shape<W: WorldAccess>(world: &W, x: i32, y: i32, z: i32, facing: Direction) -> StairShape {
|
||||||
let (ox, oy, oz) = facing.get_offset();
|
let (ox, oy, oz) = facing.get_offset();
|
||||||
if let Some((other_facing, _)) = get_stair_info(world, x+ox, y+oy, z+oz) {
|
if let Some((other_facing, _)) = get_stair_info(world, x+ox, y+oy, z+oz) {
|
||||||
if other_facing != facing && other_facing != facing.opposite() {
|
if other_facing != facing && other_facing != facing.opposite() {
|
||||||
|
@ -5108,3 +5145,96 @@ impl FlowerPotVariant {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
|
pub enum Direction {
|
||||||
|
Invalid,
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
North,
|
||||||
|
South,
|
||||||
|
West,
|
||||||
|
East,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Direction {
|
||||||
|
pub fn all() -> Vec<Direction> {
|
||||||
|
vec![
|
||||||
|
Direction::Up, Direction::Down,
|
||||||
|
Direction::North, Direction::South,
|
||||||
|
Direction::West, Direction::East,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_string(val: &str) -> Direction {
|
||||||
|
match val {
|
||||||
|
"up" => Direction::Up,
|
||||||
|
"down" => Direction::Down,
|
||||||
|
"north" => Direction::North,
|
||||||
|
"south" => Direction::South,
|
||||||
|
"west" => Direction::West,
|
||||||
|
"east" => Direction::East,
|
||||||
|
_ => Direction::Invalid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn opposite(&self) -> Direction {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => Direction::Down,
|
||||||
|
Direction::Down => Direction::Up,
|
||||||
|
Direction::North => Direction::South,
|
||||||
|
Direction::South => Direction::North,
|
||||||
|
Direction::West => Direction::East,
|
||||||
|
Direction::East => Direction::West,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clockwise(&self) -> Direction {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => Direction::Up,
|
||||||
|
Direction::Down => Direction::Down,
|
||||||
|
Direction::East => Direction::South,
|
||||||
|
Direction::West => Direction::North,
|
||||||
|
Direction::South => Direction::West,
|
||||||
|
Direction::North => Direction::East,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn counter_clockwise(&self) -> Direction {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => Direction::Up,
|
||||||
|
Direction::Down => Direction::Down,
|
||||||
|
Direction::East => Direction::North,
|
||||||
|
Direction::West => Direction::South,
|
||||||
|
Direction::South => Direction::East,
|
||||||
|
Direction::North => Direction::West,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_offset(&self) -> (i32, i32, i32) {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => (0, 1, 0),
|
||||||
|
Direction::Down => (0, -1, 0),
|
||||||
|
Direction::North => (0, 0, -1),
|
||||||
|
Direction::South => (0, 0, 1),
|
||||||
|
Direction::West => (-1, 0, 0),
|
||||||
|
Direction::East => (1, 0, 0),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_string(&self) -> &'static str {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => "up",
|
||||||
|
Direction::Down => "down",
|
||||||
|
Direction::North => "north",
|
||||||
|
Direction::South => "south",
|
||||||
|
Direction::West => "west",
|
||||||
|
Direction::East => "east",
|
||||||
|
Direction::Invalid => "invalid",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,7 @@ extern crate log;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
extern crate collision;
|
extern crate collision;
|
||||||
|
pub extern crate steven_blocks;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod macros;
|
pub mod macros;
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
pub mod block;
|
pub use steven_blocks as block;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
@ -590,6 +590,12 @@ impl World {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl block::WorldAccess for World {
|
||||||
|
fn get_block(&self, x: i32, y: i32, z: i32) -> block::Block {
|
||||||
|
World::get_block(self, x, y, z)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Snapshot {
|
pub struct Snapshot {
|
||||||
blocks: Vec<u16>,
|
blocks: Vec<u16>,
|
||||||
block_light: nibble::Array,
|
block_light: nibble::Array,
|
||||||
|
|
Loading…
Reference in New Issue