From 6f35786b847b934ff2ab02cac97d9972b1d0345c Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 19 Aug 2019 18:23:47 +0100 Subject: [PATCH] Added Instances construct --- voxygen/src/render/instances.rs | 32 ++++++++++++++++++++++++++++++++ voxygen/src/render/mod.rs | 1 + voxygen/src/render/renderer.rs | 23 +++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 voxygen/src/render/instances.rs diff --git a/voxygen/src/render/instances.rs b/voxygen/src/render/instances.rs new file mode 100644 index 0000000000..da5f62b83b --- /dev/null +++ b/voxygen/src/render/instances.rs @@ -0,0 +1,32 @@ +use super::{gfx_backend, RenderError}; +use gfx::{ + self, + buffer::Role, + memory::{Bind, Usage}, + Factory, +}; + +/// Represents a mesh that has been sent to the GPU. +pub struct Instances { + pub ibuf: gfx::handle::Buffer, +} + +impl Instances { + pub fn new(factory: &mut gfx_backend::Factory, len: usize) -> Result { + Ok(Self { + ibuf: factory + .create_buffer(len, Role::Vertex, Usage::Data, Bind::TRANSFER_DST) + .map_err(|err| RenderError::BufferCreationError(err))?, + }) + } + + pub fn update( + &mut self, + encoder: &mut gfx::Encoder, + instances: &[T], + ) -> Result<(), RenderError> { + encoder + .update_buffer(&self.ibuf, instances, 0) + .map_err(|err| RenderError::UpdateError(err)) + } +} diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index ec371da2e8..3fd92a63f7 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -1,4 +1,5 @@ pub mod consts; +pub mod instances; pub mod mesh; pub mod model; pub mod pipelines; diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 0294364274..c9d516ef8e 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -1,6 +1,7 @@ use super::{ consts::Consts, gfx_backend, + instances::Instances, mesh::Mesh, model::{DynamicModel, Model}, pipelines::{figure, fluid, postprocess, skybox, sprite, terrain, ui, Globals, Light}, @@ -435,6 +436,28 @@ impl Renderer { ); } + /// Queue the rendering of the provided terrain chunk model in the upcoming frame. + pub fn render_sprites( + &mut self, + model: &Model, + globals: &Consts, + instances: &Instances, + lights: &Consts, + ) { + self.encoder.draw( + &model.slice, + &self.sprite_pipeline.pso, + &sprite::pipe::Data { + vbuf: model.vbuf.clone(), + ibuf: instances.ibuf.clone(), + globals: globals.buf.clone(), + lights: lights.buf.clone(), + tgt_color: self.tgt_color_view.clone(), + tgt_depth: self.tgt_depth_view.clone(), + }, + ); + } + /// Queue the rendering of the provided UI element in the upcoming frame. pub fn render_ui_element( &mut self,