2017-11-21 3 views
0

私はa tutorial on the gfx libraryに従っています。次のコードは、ウィンドウシステムを初期化するために使用され、暗黙的に型指定されたバインディングを使用してさまざまなビットを返します。フロントエンドのクレート内のボックスからGfxバックエンドタイプを参照する

私は読みやすさのために、チュートリアルの一部である描画コードをそれ自身の機能に抽出しようと決めました。ここで

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クレート内に存在するクレートに属します。

コンパイラは、これがコードの最初のフラグメントで暗黙的に定義されていることに満足していますが、私は明示的にそれを参照することはできません。 (つまり、私はgfx_glutin_windowの木枠でそれを得ることができません)。

ここでマークを完全に紛失しているのか、それとも設計上のものであるのか分かりません。プロジェクトの依存関係が一時的な依存関係と衝突するシナリオを想像することはできますが、

答えて

2

一方で、パブリックAPIがそれらのタイプのインスタンスを効果的に返すので、gfx_window_glutinはおそらくデータタイプを再エクスポートすると恩恵を受ける可能性があります。これは以前に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> 
{ 
    // ... 
} 
+0

ああ、素晴らしい(私はこれが錆のパターンになるのではないかと恐れていた)後者の解決策は間違いなくより堅牢です。このような状況で特性を使用することは、錆が発生しても良い習慣と考えられますか?ありがとう。ああ、私の質問をクリアしてくれてありがとう。 – user975391

+0

@ user975391可能であれば、一般化はしばしば良い考えです。例えば、Gfx上でのpiston2d-graphics APIの使用を選択した場合でも、['Graphics'](https://docs.rs/piston2d-graphics/0.23.0/graphics/trait)でコードを汎用的にすることをお勧めします.Graphics.html)。特定のテクスチャのみを使用する場合、[テクスチャ]関連タイプを割り当てることができます(https://docs.rs/piston2d-graphics/0.23.0/graphics/trait.Graphics.html#associatedtype.Texture )を目的のテクスチャタイプに変更します。 –

関連する問題