use crate::{ChunkId, ChunkOccurrenceId, DatasetId, LogicalRow};
use molgfx_math::Vec3;
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub enum ChunkSpatialKind {
Atom = 0,
Point = 1,
Instance = 2,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub enum ChunkDomainKind {
Atom = 0,
Point = 1,
Instance = 2,
TemplatePart = 3,
Relation = 4,
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct ChunkDomainRef {
dataset: DatasetId,
chunk: ChunkId,
kind: ChunkDomainKind,
}
impl ChunkDomainRef {
#[must_use]
pub const fn new(dataset: DatasetId, chunk: ChunkId, kind: ChunkDomainKind) -> Self {
Self {
dataset,
chunk,
kind,
}
}
#[must_use]
pub const fn dataset(self) -> DatasetId {
self.dataset
}
#[must_use]
pub const fn chunk(self) -> ChunkId {
self.chunk
}
#[must_use]
pub const fn kind(self) -> ChunkDomainKind {
self.kind
}
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct ChunkEntityRef {
dataset: DatasetId,
chunk: ChunkId,
occurrence: ChunkOccurrenceId,
row: LogicalRow,
kind: ChunkSpatialKind,
}
impl ChunkEntityRef {
#[must_use]
pub const fn new(
dataset: DatasetId,
chunk: ChunkId,
occurrence: ChunkOccurrenceId,
row: LogicalRow,
kind: ChunkSpatialKind,
) -> Self {
Self {
dataset,
chunk,
occurrence,
row,
kind,
}
}
#[must_use]
pub const fn dataset(self) -> DatasetId {
self.dataset
}
#[must_use]
pub const fn chunk(self) -> ChunkId {
self.chunk
}
#[must_use]
pub const fn occurrence(self) -> ChunkOccurrenceId {
self.occurrence
}
#[must_use]
pub const fn row(self) -> LogicalRow {
self.row
}
#[must_use]
pub const fn kind(self) -> ChunkSpatialKind {
self.kind
}
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct TemplatePartChunkRef {
instance: ChunkEntityRef,
part_row: u32,
}
impl TemplatePartChunkRef {
#[must_use]
pub const fn new(instance: ChunkEntityRef, part_row: u32) -> Self {
Self { instance, part_row }
}
#[must_use]
pub const fn instance(self) -> ChunkEntityRef {
self.instance
}
#[must_use]
pub const fn part_row(self) -> u32 {
self.part_row
}
}
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum PagedSpatialAnchor {
World(Vec3),
Entity(ChunkEntityRef),
TemplatePart(TemplatePartChunkRef),
}
impl PagedSpatialAnchor {
pub(super) fn valid(self) -> bool {
match self {
Self::World(position) => position.is_finite(),
Self::Entity(_) => true,
Self::TemplatePart(reference) => {
reference.instance().kind() == ChunkSpatialKind::Instance
}
}
}
}
#[derive(Clone, Copy, PartialEq, Debug)]
pub struct PagedRelation {
pub start: PagedSpatialAnchor,
pub end: PagedSpatialAnchor,
}