pub struct Terrain<V: RectRasterableVol = TerrainChunk> {
    atlas: AtlasAllocator,
    chunks: HashMap<Vec2<i32>, TerrainChunkData>,
    shadow_chunks: Vec<(Vec2<i32>, TerrainChunkData)>,
    mesh_send_tmp: Sender<MeshWorkerResponse>,
    mesh_recv: Receiver<MeshWorkerResponse>,
    mesh_todo: HashMap<Vec2<i32>, ChunkMeshState>,
    mesh_todos_active: Arc<AtomicU64>,
    mesh_recv_overflow: f32,
    pub sprite_render_state: SpriteRenderState,
    pub sprite_globals: SpriteGlobalsBindGroup,
    atlas_textures: Arc<AtlasTextures<Locals, TerrainAtlasData>>,
    phantom: PhantomData<V>,
}

Fields§

§atlas: AtlasAllocator

This is always the current atlas into which data is being allocated. Once an atlas is too full to allocate the next texture, we always allocate a fresh texture and start allocating into that. Trying to keep more than one texture available for allocation doesn’t seem worth it, because our allocation patterns are heavily spatial (so all data allocated around the same time should have a very similar lifetime, even in pathological cases). As a result, fragmentation effects should be minimal.

TODO: Consider “moving GC” style allocation to deal with spatial fragmentation effects due to odd texture sizes, which in some cases might significantly reduce the number of textures we need for particularly difficult locations.

§chunks: HashMap<Vec2<i32>, TerrainChunkData>§shadow_chunks: Vec<(Vec2<i32>, TerrainChunkData)>

Temporary storage for dead chunks that might still be shadowing chunks in view. We wait until either the chunk definitely cannot be shadowing anything the player can see, the chunk comes back into view, or for daylight to end, before removing it (whichever comes first).

Note that these chunks are not complete; for example, they are missing texture data (they still currently hold onto a reference to their backing texture, but it generally can’t be trusted for rendering purposes).

§mesh_send_tmp: Sender<MeshWorkerResponse>§mesh_recv: Receiver<MeshWorkerResponse>§mesh_todo: HashMap<Vec2<i32>, ChunkMeshState>§mesh_todos_active: Arc<AtomicU64>§mesh_recv_overflow: f32§sprite_render_state: SpriteRenderState§sprite_globals: SpriteGlobalsBindGroup§atlas_textures: Arc<AtlasTextures<Locals, TerrainAtlasData>>

As stated previously, this is always the very latest texture into which we allocate. Code cannot assume that this is the assigned texture for any particular chunk; look at the texture field in TerrainChunkData for that.

§phantom: PhantomData<V>

Implementations§

source§

impl<V: RectRasterableVol> Terrain<V>

source

pub fn new( renderer: &mut Renderer, global_model: &GlobalModel, lod_data: &LodData, sprite_render_context: SpriteRenderContext ) -> Self

source

fn make_atlas( renderer: &mut Renderer ) -> Result<(AtlasAllocator, AtlasTextures<Locals, TerrainAtlasData>), RenderError>

source

fn remove_chunk_meta(&mut self, _pos: Vec2<i32>, chunk: &TerrainChunkData)

source

fn insert_chunk(&mut self, pos: Vec2<i32>, chunk: TerrainChunkData)

source

fn remove_chunk(&mut self, pos: Vec2<i32>)

source

pub fn light_at_wpos(&self, wpos: Vec3<i32>) -> f32

Find the light level (sunlight) at the given world position.

source

fn skip_remesh(old_block: Block, new_block: Block) -> (bool, bool)

Determine whether a given block change actually require remeshing.

Returns (skip_color, skip_lights) where

skip_color means no textures were recolored (i.e. this was a sprite only change).

skip_lights means no remeshing or relighting was required (i.e. the block opacity / lighting info / block kind didn’t change).

source

pub fn glow_at_wpos(&self, wpos: Vec3<i32>) -> f32

Find the glow level (light from lamps) at the given world position.

source

pub fn glow_normal_at_wpos(&self, wpos: Vec3<f32>) -> (Vec3<f32>, f32)

source

pub fn maintain( &mut self, renderer: &mut Renderer, scene_data: &SceneData<'_>, focus_pos: Vec3<f32>, loaded_distance: f32, camera: &Camera ) -> (Aabb<f32>, Vec<Vec3<f32>>, Aabr<f32>, Vec<Vec3<f32>>, Aabr<f32>)

Maintain terrain data. To be called once per tick.

The returned visible bounding volumes take into account the current camera position (i.e: when underground, surface structures will be culled from the volume).

source

pub fn get(&self, chunk_key: Vec2<i32>) -> Option<&TerrainChunkData>

source

pub fn chunk_count(&self) -> usize

source

pub fn visible_chunk_count(&self) -> usize

source

pub fn shadow_chunk_count(&self) -> usize

source

pub fn render_shadows<'a>( &'a self, drawer: &mut TerrainShadowDrawer<'_, 'a>, focus_pos: Vec3<f32>, culling_mode: CullingMode )

source

pub fn render_rain_occlusion<'a>( &'a self, drawer: &mut TerrainShadowDrawer<'_, 'a>, focus_pos: Vec3<f32> )

source

pub fn chunks_for_point_shadows( &self, focus_pos: Vec3<f32> ) -> impl Clone + Iterator<Item = (&Model<Vertex>, &BoundLocals)>

source

pub fn render<'a>( &'a self, drawer: &mut FirstPassDrawer<'a>, focus_pos: Vec3<f32>, culling_mode: CullingMode )

source

pub fn render_sprites<'a>( &'a self, sprite_drawer: &mut SpriteDrawer<'_, 'a>, focus_pos: Vec3<f32>, cam_pos: Vec3<f32>, sprite_render_distance: f32, culling_mode: CullingMode )

source

pub fn render_translucent<'a>( &'a self, drawer: &mut FirstPassDrawer<'a>, focus_pos: Vec3<f32> )

Auto Trait Implementations§

§

impl<V = Chonk<Block, TerrainChunkSize, TerrainChunkMeta>> !RefUnwindSafe for Terrain<V>

§

impl<V> Send for Terrain<V>
where V: Send,

§

impl<V> Sync for Terrain<V>
where V: Sync,

§

impl<V> Unpin for Terrain<V>
where V: Unpin,

§

impl<V = Chonk<Block, TerrainChunkSize, TerrainChunkMeta>> !UnwindSafe for Terrain<V>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T, U> Cast<U> for T
where U: FromCast<T>,

§

fn cast(self) -> U

Numeric cast from self to T.
§

impl<T> Chain<T> for T

§

fn len(&self) -> usize

The number of items that this chain link consists of.
§

fn append_to(self, v: &mut Vec<T>)

Append the elements in this link to the chain.
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromCast<T> for T

§

fn from_cast(t: T) -> T

Numeric cast from T to Self.
§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

impl<T> GetSetFdFlags for T

§

fn get_fd_flags(&self) -> Result<FdFlags, Error>
where T: AsFilelike,

Query the “status” flags for the self file descriptor.
§

fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>
where T: AsFilelike,

Create a new SetFdFlags value for use with set_fd_flags. Read more
§

fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>
where T: AsFilelike,

Set the “status” flags for the self file descriptor. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( pointer: <T as Pointee>::Pointer, f: &mut Formatter<'_> ) -> Result<(), Error>

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<Context> SubContext<Context> for Context

source§

fn sub_context(self) -> Context

§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> Any for T
where T: Any,

§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

impl<T> Event for T
where T: Send + Sync + 'static,

§

impl<T> Resource for T
where T: Any + Send + Sync,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSync for T
where T: Sync,