Rust 引用前端板条箱中板条箱的Gfx后端类型

Rust 引用前端板条箱中板条箱的Gfx后端类型,rust,Rust,我跟在后面。下面的代码用于初始化窗口系统,它使用隐式类型绑定返回各种位 let (window, mut device, mut factory, color_view, mut depth_view) = gfx_glutin::init::<ColorFormat, DepthFormat>(windowbuilder, contextbuilder, &events_loop); let(窗口、mut设备、mut工厂、颜色视图、mut深度视图)= gfx_gl

我跟在后面。下面的代码用于初始化窗口系统,它使用隐式类型绑定返回各种位

let (window, mut device, mut factory, color_view, mut depth_view) =
    gfx_glutin::init::<ColorFormat, DepthFormat>(windowbuilder, contextbuilder, &events_loop);
let(窗口、mut设备、mut工厂、颜色视图、mut深度视图)=
gfx_glutin::init::(windowbuilder、contextbuilder和events_循环);
为了可读性,我决定尝试将教程中的绘图代码提取到它自己的函数中

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
}
fn绘制三角形(工厂:&factory){
让mut编码器:gfx::encoder=factory.create_命令_buffer().into();
常数三角形:[顶点;3]=[
顶点{
位置:[-0.5,-0.5,0.0,1.0],
颜色:[1.0,0.0,0.0],
},
顶点{
位置:[0.5,-0.5,0.0,1.0],
颜色:[0.0,1.0,0.0],
},
顶点{
位置:[0.0,0.5,0.0,1.0],
颜色:[0.0,0.0,1.0],
},
];
//单位矩阵
常量转换:转换=转换{
转换:[
[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(顶点缓冲区,切片)=工厂。使用切片(&三角形,())创建顶点缓冲区;
让transform\u buffer=factory。创建\u常量\u buffer(1);
让数据=管道::数据{
vbuf:顶点缓冲区,
变换:变换缓冲区,
out:color\u view.clone(),
};
//在交换缓冲区和设备清理方法之前放入主回路
encoder.clear(&color_view,黑色);//用颜色清除帧缓冲区(颜色需要是4个f32、RGBa的数组)
编码器.update_缓冲区(&data.transform,&[transform],0);//更新缓冲区
encoder.draw(&slice,&pso,&data);//使用缓冲区数据和附加的pso绘制命令
encoder.flush(&mut device);//执行绘图命令
}
这里的问题是
工厂
(从第一个代码片段传入)不存在于此文件的范围内,实际上属于gfx\u glutin\u窗口板条箱内的板条箱

编译器很高兴在第一段代码中隐式地定义了它,但看起来我不能在不声明对所述板条箱的硬依赖关系的情况下显式地引用它。(也就是说,我无法通过gfx_glutin_窗户板条箱找到它)


我不确定我是否完全忽略了这一点,或者这是故意的。尽管我可以想象在这种情况下项目依赖项与暂时依赖项发生冲突的场景。

一方面,确实,
gfx\u window\u glutin
可能会从重新导出数据类型中受益,因为它的公共API有效地返回了这些类型的实例。这种情况以前在其他板条箱中也发生过,例如,可以通过在主存储库中提交问题来提出类似于gfx_window_glutin的建议

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

use gfx::{Factory, Resources};

fn draw_triangle<R, F>(factory : &F)
where
    R: Resources,
    F: Factory<R>
{
    // ...
}
使用gfx::{Factory,Resources};
fn绘制三角形(工厂:&F)
哪里
R:资源,
F:工厂
{
// ...
}

一方面,
gfx\u window\u glutin
确实可以从重新导出数据类型中获益,因为它的公共API实际上返回了这些类型的实例。这种情况以前在其他板条箱中也发生过,例如,可以通过在主存储库中提交问题来提出类似于gfx_window_glutin的建议

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

use gfx::{Factory, Resources};

fn draw_triangle<R, F>(factory : &F)
where
    R: Resources,
    F: Factory<R>
{
    // ...
}
使用gfx::{Factory,Resources};
fn绘制三角形(工厂:&F)
哪里
R:资源,
F:工厂
{
// ...
}

啊,太棒了(我担心这会成为锈迹斑斑的一种模式),后一种解决方案肯定更健壮。在这些情况下使用性状是否被认为是跨锈菌的良好实践?谢谢哦,谢谢你澄清了我的问题。@user975391如果可行,概括通常是个好主意。例如,如果您选择在Gfx上使用piston2d图形API,仍然建议您在Gfx上使用通用代码。当使用仅适用于特定纹理的纹理时,可以将其转换为预期的纹理类型。啊,太棒了(我担心这会成为锈迹中的图案),后一种解决方案肯定更健壮。在这些情况下使用性状是否被认为是跨锈菌的良好实践?谢谢哦,谢谢你澄清了我的问题。@user975391如果可行,概括通常是个好主意。例如,如果您选择在Gfx上使用piston2d图形API,仍然建议您在Gfx上使用通用代码。使用仅适用于特定纹理的纹理时,可以将其转换为所需的纹理类型。