从前端包装箱中的包装箱引用Gfx后端类型

时间:2017-11-21 11:37:22

标签: rust

我正在关注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箱子获得它。)

我不确定我是否完全错过了这里的标记,或者这是否是设计的。虽然我可以想象在这种情况下项目依赖性与瞬态依赖性冲突的场景。

1 个答案:

答案 0 :(得分:2)

一方面,gfx_window_glutin可能会从重新导出数据类型中受益,因为它的公共API有效地返回了这些类型的实例。之前已经在pathfinder re-exporting num_traits等其他包装箱中发生过这种情况,并且可以通过在主存储库中提交问题来提出与gfx_window_glutin类似的内容。

另一方面,实际上建议在Gfx的后端实现上构建通用代码。 FactoryResources都是封装底层实现的特征类型,因此您应该在代码中使用这些约束。

use gfx::{Factory, Resources};

fn draw_triangle<R, F>(factory : &F)
where
    R: Resources,
    F: Factory<R>
{
    // ...
}