1 个不稳定版本

0.1.0 2020年4月7日

#1342游戏开发

MIT/Apache

45KB
459

amethyst-lyon

Amethyst-lyon为Amethyst游戏引擎提供了对lyon crate的集成。

Lyon是一个用于基于GPU的2D图形渲染的路径细分库,用Rust编写。这个crate为Amethyst游戏引擎添加了矢量图形。

集成

这个crate提供了一个amethyst RenderPlugin(自amethyst 0.12以来可用),它可以正确渲染由lyon crate生成的网格。

一个最小示例可以在examples/basic/main.rs找到

cargo run --example basic --features amethyst/metal

Lyon将复杂路径转换为可以由GPU渲染的三角形网格。Lyon不依赖于特定的渲染器或坐标系,但这个crate不是。特别是,amethyst-lyon在屏幕空间中工作,并且为了处理屏幕高DPI,还会进行额外的缩放。

Lyon将路径转换为2D顶点和索引的集合,这些顶点和索引在amethyst-lyon中以Mesh的形式表示

pub type IndexType = u16;

#[derive(Debug, Default)]
pub struct VertexType {
    pub position: [f32; 2],
    pub colour: [f32; 4],
}

/// Component for the triangles we wish to draw to the screen
#[derive(Debug, Default)]
pub struct Mesh {
    pub vertices: Vec<VertexType>,
    pub indices: Vec<IndexType>,  
}

Mesh是一个组件类型,因此可以与实体相关联。默认情况下,所有网格组件都会被渲染,但可以使用ActiveMesh来控制。

pub struct ActiveMesh {
    pub entity: Option<Entity>,
}

如果ActiveMeshNone,其默认状态,则所有网格都会被渲染;如果它是Some(entity),则只渲染与entity关联的网格。这提供了生成大量独立网格的灵活性,但与单个网格的单次绘制调用相比,增加了多次绘制调用的额外成本。提供了调试网格等功能。

用法

这个crate目前需要包含amethyst crate;由于功能不同,这可能会导致amethyst的完整重新编译。如果这种情况发生,您需要克隆此git仓库并设置适当的特性。

这个crate使用amethyst shader-compiler,它在构建时依赖于shaderc来编译其着色器。最后,这个crate公开了与amethyst相同的渲染功能,并将它们传递给amethyst。

示例Cargo.toml用法

amethyst-lyon = "not-yet"

RenderPlugin用法

fn main() -> amethyst::Result<()> {
    amethyst::start_logger(Default::default());

    let app_root = application_root_dir()?;
    let display_config_path = app_root.join("examples/config/display.ron");
    let assets_dir = app_root.join("examples/assets/");

    let game_data = GameDataBuilder::default()
        .with_bundle(TransformBundle::new())?
        .with_bundle(InputBundle::<StringBindings>::new())?
        .with_bundle(UiBundle::<StringBindings>::new())?
        .with_bundle(
            RenderingBundle::<DefaultBackend>::new()
                .with_plugin(
                    RenderToWindow::from_config_path(display_config_path)?
                        .with_clear([1.0, 1.0, 1.0, 1.0]),
                )
                .with_plugin(RenderFlat2D::default())
                .with_plugin(RenderUi::default())
                .with_plugin(RenderLyon::default()),     
        )?;

    let mut game = Application::new(assets_dir, BasicUsageState::default(), game_data)?;

    game.run();
    Ok(())
}

使用Lyon创建一个简单的三角形网格(有关Lyon工作原理的详细信息,请参阅文档。)

// create a path builder and add a triangle
let mut builder = Path::builder();

builder.move_to(point(100., 350.));
builder.line_to(point(150. , 350.));
builder.line_to(point(155. , 250. ));
builder.line_to(point(100. , 350.));

let path = builder.build();

// allocate buffers and tessellate path
let mut geometry: VertexBuffers<VertexType, u16> = VertexBuffers::new();
let mut tessellator_fill = FillTessellator::new();
{
        tessellator_fill.tessellate_path(
        &path,
        &FillOptions::default(),
        &mut BuffersBuilder::new(&mut geometry, |pos: Point, _: FillAttributes| {
            VertexType {
                position: pos.to_array(),
                colour: [0., 1., 0., 1.],
            }
        }),
    ).unwrap();
}

// crate renderable mesh
let mesh = Mesh {
    vertices: geometry.vertices,
    indices: geometry.indices,
};

// add to world
world
    .create_entity()
    .with(mesh)
    .build());

许可证

字体文件 examples/assets/font/square.ttf 来自 Amethyst 库

在您选择下,受以下任何一种许可证的约束。

Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
Mozilla Public License 2.0

任意选择。

双重MIT/Apache2许可更为宽松。

依赖项

~39–59MB
~884K SLoC