inox2d-wgpu 0.1.0

WGPU renderer for Inox2D
Documentation
use std::collections::HashMap;

use wgpu::{util::DeviceExt, Buffer, BufferDescriptor, BufferUsages, Device};

use inox2d::{nodes::node::InoxNodeUuid, puppet::Puppet};

pub struct InoxBuffers {
	pub uniform_buffer: Buffer,
	pub uniform_index_map: HashMap<InoxNodeUuid, usize>,

	pub vertex_buffer: Buffer,
	pub uv_buffer: Buffer,
	pub deform_buffer: Buffer,
	pub index_buffer: Buffer,
}

pub fn buffers_for_puppet(device: &Device, puppet: &Puppet, uniform_alignment_needed: usize) -> InoxBuffers {
	let mut uniform_index_map: HashMap<InoxNodeUuid, usize> = HashMap::new();

	for (i, node) in (puppet.nodes.arena.iter())
		.map(|arena_node| arena_node.get())
		.filter(|node| node.is_part() || node.is_composite())
		.enumerate()
	{
		uniform_index_map.insert(node.uuid, i);
	}

	let uniform_buffer = device.create_buffer(&BufferDescriptor {
		label: Some("inox2d uniform buffer"),
		size: (uniform_alignment_needed * uniform_index_map.len()) as u64,
		usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST,
		mapped_at_creation: false,
	});

	let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
		label: Some("vertex buffer"),
		contents: bytemuck::cast_slice(&puppet.render_ctx.vertex_buffers.verts),
		usage: wgpu::BufferUsages::VERTEX,
	});

	let uv_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
		label: Some("uv buffer"),
		contents: bytemuck::cast_slice(&puppet.render_ctx.vertex_buffers.uvs),
		usage: wgpu::BufferUsages::VERTEX,
	});

	let deform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
		label: Some("deform buffer"),
		contents: bytemuck::cast_slice(&puppet.render_ctx.vertex_buffers.deforms),
		usage: wgpu::BufferUsages::VERTEX | BufferUsages::COPY_DST,
	});

	let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
		label: Some("index buffer"),
		contents: bytemuck::cast_slice(&puppet.render_ctx.vertex_buffers.indices),
		usage: wgpu::BufferUsages::INDEX,
	});

	InoxBuffers {
		uniform_buffer,
		uniform_index_map,

		vertex_buffer,
		uv_buffer,
		deform_buffer,
		index_buffer,
	}
}