2023-03-07 18:31:38 -06:00
|
|
|
use serde::{Serialize, Deserialize};
|
2023-02-15 15:07:47 -06:00
|
|
|
use strum::EnumIter;
|
2023-11-20 13:59:34 -06:00
|
|
|
use num_enum::TryFromPrimitive;
|
2023-11-25 18:29:02 -06:00
|
|
|
use crate::item::Item;
|
2023-02-15 15:07:47 -06:00
|
|
|
|
2023-03-07 18:31:38 -06:00
|
|
|
#[derive(Serialize, Deserialize, Clone, Copy, Debug, EnumIter)]
|
2023-02-15 15:07:47 -06:00
|
|
|
#[repr(u8)]
|
|
|
|
pub enum BlockTexture {
|
|
|
|
Stone,
|
|
|
|
Dirt,
|
|
|
|
GrassTop,
|
|
|
|
GrassSide,
|
|
|
|
Sand,
|
|
|
|
Bedrock,
|
|
|
|
Wood,
|
|
|
|
WoodTop,
|
|
|
|
Leaf,
|
|
|
|
Torch,
|
|
|
|
TallGrass,
|
|
|
|
Snow,
|
|
|
|
GrassSideSnow,
|
|
|
|
Cobblestone,
|
2023-02-15 19:44:21 -06:00
|
|
|
Planks,
|
2023-02-17 17:58:31 -06:00
|
|
|
WaterSolid,
|
2023-02-15 15:07:47 -06:00
|
|
|
}
|
|
|
|
|
2023-11-20 13:59:34 -06:00
|
|
|
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, EnumIter, TryFromPrimitive)]
|
2023-02-15 15:07:47 -06:00
|
|
|
#[repr(u8)]
|
|
|
|
pub enum Block {
|
|
|
|
Air,
|
2023-02-17 17:37:17 -06:00
|
|
|
Marker,
|
2023-02-15 15:07:47 -06:00
|
|
|
Stone,
|
|
|
|
Dirt,
|
|
|
|
Grass,
|
|
|
|
Sand,
|
|
|
|
Cobblestone,
|
2023-02-15 16:32:06 -06:00
|
|
|
TallGrass,
|
2023-02-15 19:44:21 -06:00
|
|
|
Planks,
|
2023-02-15 20:54:57 -06:00
|
|
|
Torch,
|
|
|
|
Wood,
|
|
|
|
Leaf,
|
2023-02-17 17:58:31 -06:00
|
|
|
Water,
|
2023-02-15 15:07:47 -06:00
|
|
|
}
|
2023-01-19 17:45:46 -06:00
|
|
|
|
2023-02-15 15:11:15 -06:00
|
|
|
impl Block {
|
2023-02-15 15:08:48 -06:00
|
|
|
#[inline]
|
2023-02-15 15:11:15 -06:00
|
|
|
pub const fn descriptor(self) -> BlockDescriptor {
|
2023-01-25 20:05:29 -06:00
|
|
|
match self {
|
|
|
|
Self::Air => BlockDescriptor {
|
|
|
|
name: "air",
|
|
|
|
render: RenderType::None,
|
|
|
|
collision: CollisionType::None,
|
|
|
|
raycast_collision: false,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-01-25 20:05:29 -06:00
|
|
|
},
|
2023-02-17 17:37:17 -06:00
|
|
|
Self::Marker => BlockDescriptor {
|
|
|
|
name: "marker",
|
|
|
|
render: RenderType::None,
|
|
|
|
collision: CollisionType::None,
|
|
|
|
raycast_collision: false,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-17 17:37:17 -06:00
|
|
|
},
|
2023-11-25 18:29:02 -06:00
|
|
|
Self::Stone => BlockDescriptor {
|
|
|
|
name: "stone",
|
|
|
|
render: RenderType::SolidBlock(CubeTexture::all(BlockTexture::Stone)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
|
|
|
drops: None,
|
2023-01-25 20:05:29 -06:00
|
|
|
},
|
2023-11-25 18:29:02 -06:00
|
|
|
Self::Dirt => BlockDescriptor {
|
|
|
|
name: "dirt",
|
|
|
|
render: RenderType::SolidBlock(CubeTexture::all(BlockTexture::Dirt)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
|
|
|
drops: None,
|
2023-01-25 20:50:38 -06:00
|
|
|
},
|
2023-11-25 18:29:02 -06:00
|
|
|
Self::Grass => BlockDescriptor {
|
|
|
|
name: "grass",
|
2023-01-25 20:50:38 -06:00
|
|
|
render: RenderType::SolidBlock(CubeTexture::top_sides_bottom(
|
2023-11-25 18:29:02 -06:00
|
|
|
BlockTexture::GrassTop,
|
|
|
|
BlockTexture::GrassSide,
|
2023-01-25 20:50:38 -06:00
|
|
|
BlockTexture::Dirt
|
2023-11-25 18:29:02 -06:00
|
|
|
)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
|
|
|
drops: None,
|
2023-01-25 20:50:38 -06:00
|
|
|
},
|
2023-11-25 18:29:02 -06:00
|
|
|
Self::Sand => BlockDescriptor {
|
|
|
|
name: "sand",
|
2023-01-25 20:50:38 -06:00
|
|
|
render: RenderType::SolidBlock(CubeTexture::all(BlockTexture::Sand)),
|
2023-11-25 18:29:02 -06:00
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
|
|
|
drops: None,
|
2023-01-25 20:50:38 -06:00
|
|
|
},
|
2023-02-04 18:43:47 -06:00
|
|
|
Self::Cobblestone => BlockDescriptor {
|
|
|
|
name: "cobblestone",
|
|
|
|
render: RenderType::SolidBlock(CubeTexture::all(BlockTexture::Cobblestone)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 16:32:06 -06:00
|
|
|
},
|
|
|
|
Self::TallGrass => BlockDescriptor {
|
|
|
|
name: "tall grass",
|
|
|
|
render: RenderType::CrossShape(CrossTexture::all(BlockTexture::TallGrass)),
|
|
|
|
collision: CollisionType::None,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 19:44:21 -06:00
|
|
|
},
|
2023-11-25 18:29:02 -06:00
|
|
|
Self::Planks => BlockDescriptor {
|
|
|
|
name: "planks",
|
2023-02-15 19:44:21 -06:00
|
|
|
render: RenderType::SolidBlock(CubeTexture::all(BlockTexture::Planks)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 19:44:21 -06:00
|
|
|
},
|
2023-02-15 20:54:57 -06:00
|
|
|
Self::Torch => BlockDescriptor {
|
|
|
|
name: "torch",
|
|
|
|
render: RenderType::CrossShape(CrossTexture::all(BlockTexture::Torch)),
|
|
|
|
collision: CollisionType::None,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 20:54:57 -06:00
|
|
|
},
|
|
|
|
Self::Wood => BlockDescriptor {
|
|
|
|
name: "leaf",
|
|
|
|
render: RenderType::SolidBlock(CubeTexture::horizontal_vertical(BlockTexture::Wood, BlockTexture::WoodTop)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 20:54:57 -06:00
|
|
|
},
|
|
|
|
Self::Leaf => BlockDescriptor {
|
|
|
|
name: "leaf",
|
|
|
|
render: RenderType::BinaryTransparency(CubeTexture::all(BlockTexture::Leaf)),
|
|
|
|
collision: CollisionType::Solid,
|
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-15 20:54:57 -06:00
|
|
|
},
|
2023-02-17 17:58:31 -06:00
|
|
|
Self::Water => BlockDescriptor {
|
|
|
|
name: "water",
|
|
|
|
render: RenderType::BinaryTransparency(CubeTexture::all(BlockTexture::WaterSolid)),
|
|
|
|
collision: CollisionType::None,
|
2023-02-17 18:04:54 -06:00
|
|
|
raycast_collision: true,
|
2023-11-25 18:29:02 -06:00
|
|
|
drops: None,
|
2023-02-17 17:58:31 -06:00
|
|
|
},
|
2023-01-25 20:05:29 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub struct BlockDescriptor {
|
|
|
|
pub name: &'static str,
|
|
|
|
pub render: RenderType,
|
|
|
|
pub collision: CollisionType,
|
|
|
|
pub raycast_collision: bool,
|
2023-11-25 18:29:02 -06:00
|
|
|
pub drops: Option<Item>,
|
2023-01-25 20:05:29 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub struct CubeTexture {
|
|
|
|
pub top: BlockTexture,
|
|
|
|
pub bottom: BlockTexture,
|
|
|
|
pub left: BlockTexture,
|
|
|
|
pub right: BlockTexture,
|
|
|
|
pub front: BlockTexture,
|
|
|
|
pub back: BlockTexture,
|
|
|
|
}
|
|
|
|
impl CubeTexture {
|
|
|
|
pub const fn top_sides_bottom(top: BlockTexture, sides: BlockTexture, bottom: BlockTexture) -> Self {
|
|
|
|
Self {
|
|
|
|
top,
|
|
|
|
bottom,
|
|
|
|
left: sides,
|
|
|
|
right: sides,
|
|
|
|
front: sides,
|
|
|
|
back: sides,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pub const fn horizontal_vertical(horizontal: BlockTexture, vertical: BlockTexture) -> Self {
|
|
|
|
Self::top_sides_bottom(vertical, horizontal, vertical)
|
|
|
|
}
|
|
|
|
pub const fn all(texture: BlockTexture) -> Self {
|
|
|
|
Self::horizontal_vertical(texture, texture)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-15 15:07:47 -06:00
|
|
|
#[derive(Clone, Copy, Debug)]
|
2023-02-15 19:00:09 -06:00
|
|
|
pub struct CrossTextureSides {
|
|
|
|
pub front: BlockTexture,
|
|
|
|
pub back: BlockTexture
|
2023-02-15 15:11:15 -06:00
|
|
|
}
|
2023-02-15 19:00:09 -06:00
|
|
|
impl CrossTextureSides {
|
|
|
|
pub const fn all(texture: BlockTexture) -> Self {
|
2023-02-15 16:32:06 -06:00
|
|
|
Self {
|
2023-02-15 19:00:09 -06:00
|
|
|
front: texture,
|
|
|
|
back: texture
|
2023-02-15 16:32:06 -06:00
|
|
|
}
|
|
|
|
}
|
2023-02-15 19:00:09 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub struct CrossTexture(pub CrossTextureSides, pub CrossTextureSides);
|
|
|
|
impl CrossTexture {
|
2023-02-15 16:32:06 -06:00
|
|
|
pub const fn all(texture: BlockTexture) -> Self {
|
2023-02-15 19:00:09 -06:00
|
|
|
Self(
|
|
|
|
CrossTextureSides::all(texture),
|
|
|
|
CrossTextureSides::all(texture)
|
|
|
|
)
|
2023-02-15 16:32:06 -06:00
|
|
|
}
|
2023-02-15 15:07:47 -06:00
|
|
|
}
|
|
|
|
|
2023-01-25 20:05:29 -06:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
|
|
pub enum CollisionType {
|
|
|
|
None,
|
|
|
|
Solid,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub enum RenderType {
|
|
|
|
None,
|
2023-02-15 15:07:47 -06:00
|
|
|
SolidBlock(CubeTexture),
|
2023-02-15 20:54:57 -06:00
|
|
|
BinaryTransparency(CubeTexture),
|
2023-02-15 15:11:15 -06:00
|
|
|
CrossShape(CrossTexture),
|
2023-01-25 20:05:29 -06:00
|
|
|
}
|