Struct glium::vertex::VertexBuffer

source ·
pub struct VertexBuffer<T>where
    T: Copy,{ /* private fields */ }
Expand description

A list of vertices loaded in the graphics card’s memory.

Implementations§

source§

impl<T> VertexBuffer<T>where T: Vertex,

source

pub fn new<F>(facade: &F, data: &[T]) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds a new vertex buffer.

Note that operations such as write will be very slow. If you want to modify the buffer from time to time, you should use the dynamic function instead.

Example
#[derive(Copy, Clone)]
struct Vertex {
    position: [f32; 3],
    texcoords: [f32; 2],
}

implement_vertex!(Vertex, position, texcoords);

let vertex_buffer = glium::VertexBuffer::new(&display, &[
    Vertex { position: [0.0,  0.0, 0.0], texcoords: [0.0, 1.0] },
    Vertex { position: [5.0, -3.0, 2.0], texcoords: [1.0, 0.0] },
]);
source

pub fn dynamic<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds a new vertex buffer.

This function will create a buffer that is intended to be modified frequently.

source

pub fn persistent<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds a new vertex buffer.

source

pub fn immutable<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds a new vertex buffer.

source

pub fn empty<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds an empty vertex buffer.

The parameter indicates the number of elements.

source

pub fn empty_dynamic<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds an empty vertex buffer.

The parameter indicates the number of elements.

source

pub fn empty_persistent<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds an empty vertex buffer.

The parameter indicates the number of elements.

source

pub fn empty_immutable<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds an empty vertex buffer.

The parameter indicates the number of elements.

source§

impl<T> VertexBuffer<T>where T: Copy,

source

pub unsafe fn new_raw<F>( facade: &F, data: &[T], bindings: VertexFormat, elements_size: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Builds a new vertex buffer from an indeterminate data type and bindings.

Example
use std::borrow::Cow;

let bindings = Cow::Owned(vec![(
        Cow::Borrowed("position"), 0,
        glium::vertex::AttributeType::F32F32,
    ), (
        Cow::Borrowed("color"), 2 * ::std::mem::size_of::<f32>(),
        glium::vertex::AttributeType::F32,
    ),
]);

let data = vec![
    1.0, -0.3, 409.0,
    -0.4, 2.8, 715.0f32
];

let vertex_buffer = unsafe {
    glium::VertexBuffer::new_raw(&display, &data, bindings, 3 * ::std::mem::size_of::<f32>())
};
source

pub unsafe fn new_raw_dynamic<F>( facade: &F, data: &[T], bindings: VertexFormat, elements_size: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,

Dynamic version of new_raw.

source

pub fn slice<R: RangeArgument<usize>>( &self, range: R ) -> Option<VertexBufferSlice<'_, T>>

Accesses a slice of the buffer.

Returns None if the slice is out of range.

source

pub fn get_bindings(&self) -> &VertexFormat

Returns the associated VertexFormat.

source

pub fn per_instance(&self) -> Result<PerInstance<'_>, InstancingNotSupported>

Creates a marker that instructs glium to use multiple instances.

Instead of calling surface.draw(&vertex_buffer, ...) you can call surface.draw(vertex_buffer.per_instance(), ...). This will draw one instance of the geometry for each element in this buffer. The attributes are still passed to the vertex shader, but each entry is passed for each different instance.

source§

impl<T> VertexBuffer<T>where T: Copy + Send + 'static,

source

pub fn into_vertex_buffer_any(self) -> VertexBufferAny

DEPRECATED: use .into() instead. Discard the type information and turn the vertex buffer into a VertexBufferAny.

Methods from Deref<Target = Buffer<[T]>>§

source

pub fn get_context(&self) -> &Rc<Context>

Returns the context corresponding to this buffer.

source

pub fn get_size(&self) -> usize

Returns the size in bytes of this buffer.

source

pub fn is_persistent(&self) -> bool

Returns true if this buffer uses persistent mapping.

source

pub fn write(&self, data: &T)

Uploads some data in this buffer.

Implementation
  • For persistent-mapped buffers, waits untils the data is no longer used by the GPU then memcpies the data to the mapping.
  • For immutable buffers, creates a temporary buffer that contains the data then calls glCopyBufferSubData to copy from the temporary buffer to the real one.
  • For other types, calls glBufferSubData.
Panic

Panics if the length of data is different from the length of this buffer.

source

pub fn invalidate(&self)

Invalidates the content of the buffer. The data becomes undefined.

You should call this if you only use parts of a buffer. For example if you want to use the first half of the buffer, you invalidate the whole buffer then write the first half.

This operation is a no-op if the backend doesn’t support it and for persistent-mapped buffers.

Implementation

Calls glInvalidateBufferData if supported. Otherwise, calls glBufferData with a null pointer for data. If glBufferStorage has been used to create the buffer and glInvalidateBufferData is not supported, does nothing.

source

pub fn read(&self) -> Result<T::Owned, ReadError>

Reads the content of the buffer.

source

pub fn map(&mut self) -> Mapping<'_, T>

Maps the buffer in memory for both reading and writing.

Implementation
  • For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
  • For immutable buffers, creates a temporary buffer containing the data of the buffer and maps it. When the mapping object is destroyed, copies the content of the temporary buffer to the real buffer.
  • For other types, calls glMapBuffer or glMapSubBuffer.
source

pub fn map_read(&mut self) -> ReadMapping<'_, T>

Maps the buffer in memory for reading.

Implementation
  • For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
  • For immutable buffers, creates a temporary buffer containing the data of the buffer and maps it.
  • For other types, calls glMapBuffer or glMapSubBuffer.
source

pub fn map_write(&mut self) -> WriteMapping<'_, T>

Maps the buffer in memory for writing only.

Implementation
  • For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
  • For immutable buffers, creates a temporary buffer and maps it. When the mapping object is destroyed, copies the content of the temporary buffer to the real buffer.
  • For other types, calls glMapBuffer or glMapSubBuffer.
source

pub fn copy_to<'a, S>(&self, target: S) -> Result<(), CopyError>where S: Into<BufferSlice<'a, T>>, T: 'a,

Copies the content of the buffer to another buffer.

Panic

Panics if T is unsized and the other buffer is too small.

source

pub unsafe fn slice_custom<F, R>(&self, f: F) -> BufferSlice<'_, R>where F: for<'r> FnOnce(&'r T) -> &'r R, R: Content + ?Sized,

Builds a slice that contains an element from inside the buffer.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

Example
#[derive(Copy, Clone)]
struct BufferContent {
    value1: u16,
    value2: u16,
}
let slice = unsafe { buffer.slice_custom(|content| &content.value2) };
Safety

The object whose reference is passed to the closure is uninitialized. Therefore you must not access the content of the object.

You must return a reference to an element from the parameter. The closure must not panic.

source

pub unsafe fn slice_custom_mut<F, R>(&mut self, f: F) -> BufferMutSlice<'_, R>where F: for<'r> FnOnce(&'r T) -> &'r R, R: Content + ?Sized,

Same as slice_custom but returns a mutable slice.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn as_slice(&self) -> BufferSlice<'_, T>

Builds a slice containing the whole subbuffer.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn as_mut_slice(&mut self) -> BufferMutSlice<'_, T>

Builds a slice containing the whole subbuffer.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn as_slice_any(&self) -> BufferAnySlice<'_>

Builds a slice-any containing the whole subbuffer.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn len(&self) -> usize

Returns the number of elements in this buffer.

source

pub fn slice<R: RangeArgument<usize>>( &self, range: R ) -> Option<BufferSlice<'_, [T]>>

Builds a slice of this subbuffer. Returns None if out of range.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn slice_mut<R: RangeArgument<usize>>( &mut self, range: R ) -> Option<BufferMutSlice<'_, [T]>>

Builds a slice of this subbuffer. Returns None if out of range.

This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.

source

pub fn read_as_texture_1d<S>(&self) -> Result<S, ReadError>where S: Texture1dDataSink<T>,

Reads the content of the buffer.

Trait Implementations§

source§

impl<T> Debug for VertexBuffer<T>where T: Copy + Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T> Deref for VertexBuffer<T>where T: Copy,

§

type Target = Buffer<[T]>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Buffer<[T]>

Dereferences the value.
source§

impl<T> DerefMut for VertexBuffer<T>where T: Copy,

source§

fn deref_mut(&mut self) -> &mut Buffer<[T]>

Mutably dereferences the value.
source§

impl<'a, T> From<&'a VertexBuffer<T>> for BufferSlice<'a, [T]>where T: Copy,

source§

fn from(b: &'a VertexBuffer<T>) -> BufferSlice<'a, [T]>

Converts to this type from the input type.
source§

impl<'a, T> From<&'a mut VertexBuffer<T>> for BufferMutSlice<'a, [T]>where T: Copy,

source§

fn from(b: &'a mut VertexBuffer<T>) -> BufferMutSlice<'a, [T]>

Converts to this type from the input type.
source§

impl<T> From<Buffer<[T]>> for VertexBuffer<T>where T: Vertex + Copy,

source§

fn from(buffer: Buffer<[T]>) -> VertexBuffer<T>

Converts to this type from the input type.
source§

impl<T> From<VertexBuffer<T>> for VertexBufferAnywhere T: Copy + Send + 'static,

source§

fn from(buf: VertexBuffer<T>) -> VertexBufferAny

Converts to this type from the input type.
source§

impl<T: Copy> GlObject for VertexBuffer<T>

§

type Id = u32

The type of identifier for this object.
source§

fn get_id(&self) -> c_uint

Returns the id of the object.
source§

impl<'a, T> IntoVerticesSource<'a> for &'a VertexBuffer<T>where T: Copy,

source§

fn into_vertices_source(self) -> VerticesSource<'a>

Builds the VerticesSource.

Auto Trait Implementations§

§

impl<T> !RefUnwindSafe for VertexBuffer<T>

§

impl<T> !Send for VertexBuffer<T>

§

impl<T> !Sync for VertexBuffer<T>

§

impl<T> Unpin for VertexBuffer<T>where T: Unpin,

§

impl<T> !UnwindSafe for VertexBuffer<T>

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere 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.

source§

impl<T, U> TryFrom<U> for Twhere 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 Twhere 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.