Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 27 additions & 5 deletions examples/bindful/main.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// currently windows only because here we need a concrete gfx and os implementation
#![cfg(target_os = "windows")]

use hotline_rs::{*, prelude::{Pipeline, Texture}};
use hotline_rs::{*, prelude::*};

use os::{App, Window};
use gfx::{CmdBuf, Device, SwapChain, RenderPass};
Expand All @@ -12,6 +12,12 @@ struct Vertex {
color: [f32; 4],
}

#[repr(C)]
struct LetterboxPushConstants {
x: f32,
y: f32
}

fn main() -> Result<(), hotline_rs::Error> {
// app
let mut app = os_platform::App::create(os::AppInfo {
Expand All @@ -38,8 +44,8 @@ fn main() -> Result<(), hotline_rs::Error> {
rect: os::Rect {
x: 100,
y: 100,
width: 1024,
height: 1024,
width: 1280,
height: 720,
},
style: os::WindowStyleFlags::NONE,
parent_handle: None,
Expand Down Expand Up @@ -152,7 +158,6 @@ fn main() -> Result<(), hotline_rs::Error> {

cmdbuffer.set_heap(pso_pmfx, dev.get_shader_heap());

// set bindings
let srv0 = textures[0].get_srv_index().unwrap();
let srv1 = textures[1].get_srv_index().unwrap();
let srv2 = textures[2].get_srv_index().unwrap();
Expand All @@ -177,6 +182,23 @@ fn main() -> Result<(), hotline_rs::Error> {
if let Some(t3) = pso_pmfx.get_pipeline_slot(3, 0, gfx::DescriptorType::ShaderResource) {
cmdbuffer.set_binding(pso_pmfx, dev.get_shader_heap(), t3.index, srv3);
}

// lookup push constants for letterboxing the quad
if let Some(c0) = pso_pmfx.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants) {
let pc = if vp_rect.width >= vp_rect.height {
LetterboxPushConstants {
x: vp_rect.height as f32 / vp_rect.width as f32,
y: 1.0
}
}
else {
LetterboxPushConstants {
x: 1.0,
y: vp_rect.width as f32 / vp_rect.height as f32
}
};
cmdbuffer.push_render_constants(c0.index, 2, 0, gfx::as_u8_slice(&pc));
}

cmdbuffer.set_index_buffer(&index_buffer);
cmdbuffer.set_vertex_buffer(&vertex_buffer, 0);
Expand All @@ -196,7 +218,7 @@ fn main() -> Result<(), hotline_rs::Error> {

dev.execute(&cmdbuffer);

swap_chain.swap(&dev);
swap_chain.swap(&mut dev);
ci = (ci + 1) % 4;
}

Expand Down
88 changes: 43 additions & 45 deletions examples/bindless/main.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// currently windows only because here we need a concrete gfx and os implementation
#![cfg(target_os = "windows")]

use hotline_rs::*;
use hotline_rs::{*, prelude::*};

use os::{App, Window};
use gfx::{CmdBuf, Device, SwapChain, RenderPass};
Expand All @@ -12,6 +12,12 @@ struct Vertex {
color: [f32; 4],
}

#[repr(C)]
struct LetterboxPushConstants {
x: f32,
y: f32
}

fn main() -> Result<(), hotline_rs::Error> {
// app
let mut app = os_platform::App::create(os::AppInfo {
Expand All @@ -38,8 +44,8 @@ fn main() -> Result<(), hotline_rs::Error> {
rect: os::Rect {
x: 100,
y: 100,
width: 1024,
height: 1024,
width: 1280,
height: 720,
},
style: os::WindowStyleFlags::NONE,
parent_handle: None,
Expand All @@ -55,10 +61,10 @@ fn main() -> Result<(), hotline_rs::Error> {
a: 1.00,
}),
};
let mut swap_chain = dev.create_swap_chain::<os_platform::App>(&swap_chain_info, &win)?;
let mut swap_chain = dev.create_swap_chain::<os_platform::App>(&swap_chain_info, &win)?; // 2

// cmd buffer
let mut cmdbuffer = dev.create_cmd_buf(2);
let mut cmdbuffer = dev.create_cmd_buf(2); // 2

// vertex buffer
let vertices = [
Expand Down Expand Up @@ -128,26 +134,13 @@ fn main() -> Result<(), hotline_rs::Error> {
textures.push(tex);
}

// push constants
let constants: [f32; 4] = [1.0, 1.0, 0.0, 1.0];

// constant buffer
let mut cbuffer: [f32; 64] = [0.0; 64];
cbuffer[0] = 1.0;
cbuffer[1] = 0.0;
cbuffer[2] = 1.0;
cbuffer[3] = 1.0;

let info = gfx::BufferInfo {
usage: gfx::BufferUsage::CONSTANT_BUFFER,
cpu_access: gfx::CpuAccessFlags::NONE,
format: gfx::Format::Unknown,
stride: cbuffer.len() * 4,
num_elements: 1,
initial_state: gfx::ResourceState::VertexConstantBuffer
};

let _constant_buffer = dev.create_buffer(&info, data![gfx::as_u8_slice(&cbuffer)]);
// srv indices are used to index into descriptor arrays
let srv_indices = [
textures[0].get_srv_index().unwrap() as u32,
textures[1].get_srv_index().unwrap() as u32,
textures[2].get_srv_index().unwrap() as u32,
textures[3].get_srv_index().unwrap() as u32,
];

// render target
let rt_info = gfx::TextureInfo {
Expand All @@ -164,21 +157,6 @@ fn main() -> Result<(), hotline_rs::Error> {
};
let render_target = dev.create_texture(&rt_info, data![]).unwrap();

// depth stencil target
let ds_info = gfx::TextureInfo {
format: gfx::Format::D24nS8u,
tex_type: gfx::TextureType::Texture2D,
width: 512,
height: 512,
depth: 1,
array_layers: 1,
mip_levels: 1,
samples: 1,
usage: gfx::TextureUsage::DEPTH_STENCIL,
initial_state: gfx::ResourceState::DepthStencil,
};
let depth_stencil = dev.create_texture::<u8>(&ds_info, None).unwrap();

// pass for render target with depth stencil
let render_target_pass = dev
.create_render_pass(&gfx::RenderPassInfo {
Expand All @@ -189,7 +167,7 @@ fn main() -> Result<(), hotline_rs::Error> {
b: 1.0,
a: 1.0,
}),
depth_stencil: Some(&depth_stencil),
depth_stencil: None, //Some(&depth_stencil),
ds_clear: Some(gfx::ClearDepthStencil {
depth: Some(1.0),
stencil: None,
Expand Down Expand Up @@ -224,7 +202,7 @@ fn main() -> Result<(), hotline_rs::Error> {

// compute pass
cmdbuffer.set_marker(0xff00ffff, "Frame Start");

cmdbuffer.begin_event(0xff0000ff, "Compute Pass");
cmdbuffer.set_compute_pipeline(pso_compute);
cmdbuffer.set_heap(pso_compute, dev.get_shader_heap());
Expand Down Expand Up @@ -288,7 +266,27 @@ fn main() -> Result<(), hotline_rs::Error> {
cmdbuffer.set_index_buffer(&index_buffer);
cmdbuffer.set_vertex_buffer(&vertex_buffer, 0);

cmdbuffer.push_render_constants(0, 4, 0, constants.as_slice());
// lookup push constants for letterboxing the quad and push the data
if let Some(c0) = pso_pmfx.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants) {
let pc = if vp_rect.width >= vp_rect.height {
LetterboxPushConstants {
x: vp_rect.height as f32 / vp_rect.width as f32,
y: 1.0
}
}
else {
LetterboxPushConstants {
x: 1.0,
y: vp_rect.width as f32 / vp_rect.height as f32
}
};
cmdbuffer.push_render_constants(c0.index, 2, 0, gfx::as_u8_slice(&pc));
}

// lookup push srv indices and push the data
if let Some(c1) = pso_pmfx.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants) {
cmdbuffer.push_render_constants(c1.index, 4, 0, gfx::as_u8_slice(&srv_indices));
}

cmdbuffer.draw_indexed_instanced(6, 1, 0, 0, 0);

Expand All @@ -306,7 +304,7 @@ fn main() -> Result<(), hotline_rs::Error> {

dev.execute(&cmdbuffer);

swap_chain.swap(&dev);
swap_chain.swap(&mut dev);
ci = (ci + 1) % 4;
}

Expand All @@ -317,4 +315,4 @@ fn main() -> Result<(), hotline_rs::Error> {
dev.cleanup_dropped_resources(&swap_chain);

Ok(())
}
}
3 changes: 0 additions & 3 deletions examples/swap_chain/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ use hotline_rs::*;
use os::App;
use os::Window;

use maths_rs::Vec3f;
use maths_rs::vec::vec3f;
use maths_rs::vec::splat3f;
use maths_rs::dot;
use maths_rs::cos;

use gfx::Device;
Expand Down
2 changes: 0 additions & 2 deletions plugins/ecs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ use hotline_rs::prelude::*;
use maths_rs::prelude::*;

use bevy_ecs::prelude::*;

use bevy_ecs::schedule::SystemConfig;
use bevy_ecs::schedule::SystemConfigs;

use std::collections::HashMap;
Expand Down
17 changes: 9 additions & 8 deletions plugins/ecs_examples/src/bindless_texture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,25 +152,26 @@ pub fn setup_bindless_texture(
pub fn draw_meshes_bindless_texture(
pmfx: &Res<PmfxRes>,
view: &pmfx::View<gfx_platform::Device>,
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> {

let pmfx = &pmfx;
let fmt = view.pass.get_format_hash();
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
let camera = pmfx.get_camera_constants(&view.camera)?;

view.cmd_buf.set_render_pipeline(pipeline);
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
cmd_buf.set_render_pipeline(pipeline);
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));

view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
cmd_buf.set_heap(pipeline, &pmfx.shader_heap);

for (world_matrix, mesh, texture) in &mesh_draw_query {
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
view.cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0));
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0));

view.cmd_buf.set_index_buffer(&mesh.0.ib);
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
cmd_buf.set_index_buffer(&mesh.0.ib);
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
}

Ok(())
Expand Down
17 changes: 9 additions & 8 deletions plugins/ecs_examples/src/blend_states.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ pub fn setup_blend_states(
pub fn render_meshes_pipeline_coloured(
pmfx: &Res<PmfxRes>,
view: &pmfx::View<gfx_platform::Device>,
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &PipelineComponent, &Colour)>) -> Result<(), hotline_rs::Error> {

let pmfx = &pmfx;
Expand All @@ -116,14 +117,14 @@ pub fn render_meshes_pipeline_coloured(
for (world_matrix, mesh, pipeline, colour) in &mesh_draw_query {
// set pipeline per mesh
let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?;
view.cmd_buf.set_render_pipeline(pipeline);
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
view.cmd_buf.push_render_constants(1, 4, 12, &colour.0);

view.cmd_buf.set_index_buffer(&mesh.0.ib);
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
cmd_buf.set_render_pipeline(pipeline);
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
cmd_buf.push_render_constants(1, 4, 12, &colour.0);

cmd_buf.set_index_buffer(&mesh.0.ib);
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
}

Ok(())
Expand Down
17 changes: 9 additions & 8 deletions plugins/ecs_examples/src/cubemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,25 +70,26 @@ pub fn setup_cubemap(
pub fn render_meshes_cubemap(
pmfx: &Res<PmfxRes>,
view: &pmfx::View<gfx_platform::Device>,
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> {

let fmt = view.pass.get_format_hash();
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
let camera = pmfx.get_camera_constants(&view.camera)?;

view.cmd_buf.set_render_pipeline(pipeline);
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
cmd_buf.set_render_pipeline(pipeline);
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));

view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
cmd_buf.set_heap(pipeline, &pmfx.shader_heap);

let mut mip = 0;
for (world_matrix, mesh, cubemap) in &mesh_draw_query {
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0]));
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0]));

view.cmd_buf.set_index_buffer(&mesh.0.ib);
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
cmd_buf.set_index_buffer(&mesh.0.ib);
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);

mip += 1;
}
Expand Down
9 changes: 5 additions & 4 deletions plugins/ecs_examples/src/draw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,19 @@ pub fn setup_draw(
pub fn draw_meshes(
pmfx: &Res<PmfxRes>,
view: &pmfx::View<gfx_platform::Device>,
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent)>) -> Result<(), hotline_rs::Error> {

let fmt = view.pass.get_format_hash();
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
let camera = pmfx.get_camera_constants(&view.camera)?;

view.cmd_buf.set_render_pipeline(pipeline);
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
cmd_buf.set_render_pipeline(pipeline);
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));

for (_, mesh) in &mesh_draw_query {
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
view.cmd_buf.draw_instanced(3, 1, 0, 0);
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
cmd_buf.draw_instanced(3, 1, 0, 0);
}

Ok(())
Expand Down
Loading