我正在关注a tutorial on the gfx library。以下代码用于初始化窗口系统,它使用隐式类型绑定返回各种位。
let (window, mut device, mut factory, color_view, mut depth_view) =
gfx_glutin::init::<ColorFormat, DepthFormat>(windowbuilder, contextbuilder, &events_loop);
为了便于阅读,我决定尝试将作为教程一部分的绘图代码提取到它自己的函数中。
fn draw_triangle(factory: &Factory) {
let mut encoder: gfx::Encoder<_, _> = factory.create_command_buffer().into();
const TRIANGLE: [Vertex; 3] = [
Vertex {
pos: [-0.5, -0.5, 0.0, 1.0],
color: [1.0, 0.0, 0.0],
},
Vertex {
pos: [0.5, -0.5, 0.0, 1.0],
color: [0.0, 1.0, 0.0],
},
Vertex {
pos: [0.0, 0.5, 0.0, 1.0],
color: [0.0, 0.0, 1.0],
},
];
//Identity Matrix
const TRANSFORM: Transform = Transform {
transform: [
[1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0],
],
};
let (vertex_buffer, slice) = factory.create_vertex_buffer_with_slice(&TRIANGLE, ());
let transform_buffer = factory.create_constant_buffer(1);
let data = pipe::Data {
vbuf: vertex_buffer,
transform: transform_buffer,
out: color_view.clone(),
};
//Put in main loop before swap buffers and device clean-up method
encoder.clear(&color_view, BLACK); //clear the framebuffer with a color(color needs to be an array of 4 f32s, RGBa)
encoder.update_buffer(&data.transform, &[TRANSFORM], 0); //update buffers
encoder.draw(&slice, &pso, &data); // draw commands with buffer data and attached pso
encoder.flush(&mut device); // execute draw commands
}
这里的问题是Factory
(从第一个代码片段传入)在该文件的范围内不存在,并且实际上属于gfx_glutin_window包中存在的包。
编译器很高兴在第一个代码片段中隐式定义了它,但看起来我没有明确地引用它而不声明对所述crate的硬依赖。 (即我无法通过gfx_glutin_window箱子获得它。)
我不确定我是否完全错过了这里的标记,或者这是否是设计的。虽然我可以想象在这种情况下项目依赖性与瞬态依赖性冲突的场景。
答案 0 :(得分:2)
一方面,gfx_window_glutin
可能会从重新导出数据类型中受益,因为它的公共API有效地返回了这些类型的实例。之前已经在pathfinder
re-exporting num_traits
等其他包装箱中发生过这种情况,并且可以通过在主存储库中提交问题来提出与gfx_window_glutin
类似的内容。
另一方面,实际上建议在Gfx的后端实现上构建通用代码。 Factory
和Resources
都是封装底层实现的特征类型,因此您应该在代码中使用这些约束。
use gfx::{Factory, Resources};
fn draw_triangle<R, F>(factory : &F)
where
R: Resources,
F: Factory<R>
{
// ...
}