1 个不稳定版本
0.1.0 | 2020年4月7日 |
---|
#1342 在 游戏开发
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>,
}
如果ActiveMesh
是None
,其默认状态,则所有网格都会被渲染;如果它是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