gfx2d: begin Sprite2D new design
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
77b95aa9a9
commit
4d2c917b66
1 changed files with 55 additions and 26 deletions
|
|
@ -41,6 +41,11 @@ pub const components = struct {
|
||||||
|
|
||||||
/// The size of the sprite, in pixels.
|
/// The size of the sprite, in pixels.
|
||||||
pub const size = Vec2;
|
pub const size = Vec2;
|
||||||
|
|
||||||
|
/// The ID of the pipeline this sprite belongs to. By default, zero.
|
||||||
|
///
|
||||||
|
/// This determines which shader, textures, etc. are used for rendering the sprite.
|
||||||
|
pub const pipeline = u8;
|
||||||
};
|
};
|
||||||
|
|
||||||
const Uniforms = extern struct {
|
const Uniforms = extern struct {
|
||||||
|
|
@ -181,6 +186,49 @@ pub fn deinit(sprite2d: *mach.Mod(.engine_sprite2d)) !void {
|
||||||
sprite2d.state.sprite_sizes.release();
|
sprite2d.state.sprite_sizes.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn engineSprite2dUpdated(
|
||||||
|
engine: *mach.Mod(.engine),
|
||||||
|
sprite2d: *mach.Mod(.engine_sprite2d),
|
||||||
|
pipeline: u32,
|
||||||
|
) !void {
|
||||||
|
_ = pipeline;
|
||||||
|
const device = engine.state.device;
|
||||||
|
|
||||||
|
// TODO: make sure these entities only belong to the given pipeline
|
||||||
|
// we need a better tagging mechanism
|
||||||
|
var archetypes_iter = engine.entities.query(.{ .all = &.{
|
||||||
|
.{ .engine_sprite2d = &.{
|
||||||
|
.uv_transform,
|
||||||
|
.transform,
|
||||||
|
.size,
|
||||||
|
.pipeline,
|
||||||
|
} },
|
||||||
|
} });
|
||||||
|
|
||||||
|
const encoder = device.createCommandEncoder(null);
|
||||||
|
var transforms_offset: usize = 0;
|
||||||
|
var uv_transforms_offset: usize = 0;
|
||||||
|
var sizes_offset: usize = 0;
|
||||||
|
while (archetypes_iter.next()) |archetype| {
|
||||||
|
var transforms = archetype.slice(.engine_sprite2d, .transform);
|
||||||
|
var uv_transforms = archetype.slice(.engine_sprite2d, .uv_transform);
|
||||||
|
var sizes = archetype.slice(.engine_sprite2d, .size);
|
||||||
|
|
||||||
|
encoder.writeBuffer(sprite2d.state.sprite_transforms, transforms_offset, transforms);
|
||||||
|
encoder.writeBuffer(sprite2d.state.sprite_uv_transforms, uv_transforms_offset, uv_transforms);
|
||||||
|
encoder.writeBuffer(sprite2d.state.sprite_sizes, sizes_offset, sizes);
|
||||||
|
|
||||||
|
transforms_offset += transforms.len;
|
||||||
|
uv_transforms_offset += uv_transforms.len;
|
||||||
|
sizes_offset += sizes.len;
|
||||||
|
}
|
||||||
|
|
||||||
|
var command = encoder.finish(null);
|
||||||
|
encoder.release();
|
||||||
|
sprite2d.state.queue.submit(&[_]*gpu.CommandBuffer{command});
|
||||||
|
command.release();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn tick(
|
pub fn tick(
|
||||||
engine: *mach.Mod(.engine),
|
engine: *mach.Mod(.engine),
|
||||||
sprite2d: *mach.Mod(.engine_sprite2d),
|
sprite2d: *mach.Mod(.engine_sprite2d),
|
||||||
|
|
@ -216,37 +264,18 @@ pub fn tick(
|
||||||
};
|
};
|
||||||
encoder.writeBuffer(sprite2d.state.uniform_buffer, 0, &[_]Uniforms{uniforms});
|
encoder.writeBuffer(sprite2d.state.uniform_buffer, 0, &[_]Uniforms{uniforms});
|
||||||
|
|
||||||
// Synchronize entity data into our GPU sprite buffer
|
// Calculate number of vertices
|
||||||
|
// TODO: eliminate this
|
||||||
|
var total_vertices: u32 = 0;
|
||||||
var archetypes_iter = engine.entities.query(.{ .all = &.{
|
var archetypes_iter = engine.entities.query(.{ .all = &.{
|
||||||
.{ .engine_sprite2d = &.{
|
.{ .engine_sprite2d = &.{
|
||||||
.uv_transform,
|
.pipeline,
|
||||||
.transform,
|
|
||||||
.size,
|
|
||||||
} },
|
} },
|
||||||
} });
|
} });
|
||||||
|
|
||||||
// TODO: eliminate these
|
|
||||||
var sprite_transforms = try std.ArrayListUnmanaged(Mat4x4).initCapacity(engine.allocator, 1000);
|
|
||||||
defer sprite_transforms.deinit(engine.allocator);
|
|
||||||
var sprite_uv_transforms = try std.ArrayListUnmanaged(Mat3x3).initCapacity(engine.allocator, 1000);
|
|
||||||
defer sprite_uv_transforms.deinit(engine.allocator);
|
|
||||||
var sprite_sizes = try std.ArrayListUnmanaged(Vec2).initCapacity(engine.allocator, 1000);
|
|
||||||
defer sprite_sizes.deinit(engine.allocator);
|
|
||||||
while (archetypes_iter.next()) |archetype| {
|
while (archetypes_iter.next()) |archetype| {
|
||||||
var transforms = archetype.slice(.engine_sprite2d, .transform);
|
total_vertices += 6;
|
||||||
var uv_transforms = archetype.slice(.engine_sprite2d, .uv_transform);
|
var pipelines = archetype.slice(.engine_sprite2d, .pipeline);
|
||||||
var sizes = archetype.slice(.engine_sprite2d, .size);
|
for (pipelines) |_| total_vertices += 6;
|
||||||
for (transforms, uv_transforms, sizes) |transform, uv_transform, size| {
|
|
||||||
try sprite_transforms.append(engine.allocator, transform);
|
|
||||||
try sprite_uv_transforms.append(engine.allocator, uv_transform);
|
|
||||||
try sprite_sizes.append(engine.allocator, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const total_vertices = @as(u32, @intCast(sprite_sizes.items.len * 6));
|
|
||||||
if (sprite_transforms.items.len > 0) {
|
|
||||||
encoder.writeBuffer(sprite2d.state.sprite_transforms, 0, sprite_transforms.items);
|
|
||||||
encoder.writeBuffer(sprite2d.state.sprite_uv_transforms, 0, sprite_uv_transforms.items);
|
|
||||||
encoder.writeBuffer(sprite2d.state.sprite_sizes, 0, sprite_sizes.items);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the sprite batch
|
// Draw the sprite batch
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue