Compare commits
33 Commits
master
...
looking-at
@ -0,0 +1,53 @@
|
|||||||
|
Content-Type: text/x-zim-wiki
|
||||||
|
Wiki-Format: zim 0.4
|
||||||
|
Creation-Date: 2020-08-06T21:51:48-07:00
|
||||||
|
|
||||||
|
====== MakingAnActualThing ======
|
||||||
|
Created Thursday 06 August 2020
|
||||||
|
|
||||||
|
So, I need to figure out how to determine which objects will :
|
||||||
|
* Be rendered
|
||||||
|
* Be notified
|
||||||
|
* Get batched
|
||||||
|
* And initialized
|
||||||
|
|
||||||
|
|
||||||
|
Looks like it could possibly be specs...
|
||||||
|
|
||||||
|
Sprites currently are just a container for the meta-information needed in order to return a VertexTypeContainer.
|
||||||
|
|
||||||
|
{{{code: lang="rust" linenumbers="True"
|
||||||
|
pub enum VertexTypeContainer {
|
||||||
|
TextureType(Vec<TextureVertex3D>, Arc<CanvasTextureHandle>),
|
||||||
|
ImageType(Vec<ImageVertex3D>, Arc<CanvasImageHandle>),
|
||||||
|
ColorType(Vec<ColorVertex3D>),
|
||||||
|
ThreeDType(Vec<Vertex3D>),
|
||||||
|
TextType(Vec<ColorVertex3D>),
|
||||||
|
}
|
||||||
|
}}}
|
||||||
|
|
||||||
|
|
||||||
|
So for a sprite, which is a generic texture and position/size combo
|
||||||
|
Images are similar, but instead of a "sprite" I made a computsprite because that's the only thing that uses them.
|
||||||
|
|
||||||
|
Now if I had to shove these into a component / a set of components... I could have a component of the vertex type even?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
===== Sep 2020 =====
|
||||||
|
|
||||||
|
Lets think about this for a minute...
|
||||||
|
|
||||||
|
* We have components which are purely data...
|
||||||
|
* But can also have structs that impl functionality
|
||||||
|
* The data can be contained within traits. But it has to do all IO through the trait interface. ALL
|
||||||
|
* Problem, for example I have primitives like textured sprites, and also complex widgets which also have additional IO they they need. Like text input or buttons. I suppose This could all be made message based. So when the text input receives a focus, and then key presses it would update. When the enter key is pressed it could create a customer event for which another component is the listener...
|
||||||
|
* Maybe this is the way to go... Have some generic structure that has a render(params), notify(event), update(delta) -> VEvent
|
||||||
|
* So if I had a textbox sprite it could notify(key events) render
|
||||||
|
* We can split up components in order to have sharable sets of data for shared functionality. e.g rendering
|
||||||
|
|
||||||
|
[[paste]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
So that article more or less talked about what I was thinking with the ECS. But they didn't really go into the separation of components.
|
@ -0,0 +1,95 @@
|
|||||||
|
Content-Type: text/x-zim-wiki
|
||||||
|
Wiki-Format: zim 0.4
|
||||||
|
Creation-Date: 2020-10-06T22:33:37-07:00
|
||||||
|
|
||||||
|
====== layout-scripts ======
|
||||||
|
Created Tuesday 06 October 2020
|
||||||
|
|
||||||
|
===== Keywords =====
|
||||||
|
|
||||||
|
***table will need some description of it's requested elements***
|
||||||
|
**Actually I think this could just be done in the parser. Emitting warnings if names dont match**
|
||||||
|
|
||||||
|
elem table {
|
||||||
|
}
|
||||||
|
|
||||||
|
**elem is a keyword specifying that the next token will implement some type of rendering behaviour in this case, it is a table.**
|
||||||
|
|
||||||
|
elem table : globalTableFormatting {
|
||||||
|
meta tableFormatting {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta globalTableFormatting {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
**meta is a keyword specifying that the next token will contain some subset of the data that an elem that needs to render.**
|
||||||
|
|
||||||
|
|
||||||
|
===== Nesting =====
|
||||||
|
|
||||||
|
**There is no way around a tree structure in the markup.**
|
||||||
|
|
||||||
|
elem div {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
elem table {
|
||||||
|
meta tableFormatting {
|
||||||
|
color: Black,
|
||||||
|
}
|
||||||
|
elem tr {
|
||||||
|
elem tc {
|
||||||
|
text: "testText1"
|
||||||
|
}
|
||||||
|
elem tc {
|
||||||
|
text: "testText2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
**But I think I can strongly type the nesting structure, e.g**
|
||||||
|
|
||||||
|
struct Table {
|
||||||
|
fn addChild(child: TableRow)
|
||||||
|
}
|
||||||
|
elem!(table, Table)
|
||||||
|
|
||||||
|
struct TableRow {
|
||||||
|
fn addChild(child: TableColumn)
|
||||||
|
}
|
||||||
|
elem!(table, TableRow)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
Content-Type: text/x-zim-wiki
|
||||||
|
Wiki-Format: zim 0.4
|
||||||
|
Creation-Date: 2020-09-09T22:41:18-07:00
|
||||||
|
|
||||||
|
====== paste ======
|
||||||
|
Created Wednesday 09 September 2020
|
||||||
|
|
||||||
|
// If I were to have multiple systems
|
||||||
|
/*
|
||||||
|
|
||||||
|
One for rendering
|
||||||
|
One for updating
|
||||||
|
One for eventing
|
||||||
|
|
||||||
|
Rendering is easy enough. It needs all the components necessary in order
|
||||||
|
to generate the vertices. This includes the position, size, and vertex generator
|
||||||
|
|
||||||
|
Updating can probably be multiple types, I imagine something that implemented an Updatable
|
||||||
|
trait could then be used.
|
||||||
|
|
||||||
|
So the big problem here is that I have two traits that I want to expose, BUT
|
||||||
|
I have to put the concrete value in both containers... I don't think this is something
|
||||||
|
that specs will like since it wants to be the only owner. No use in RefCell'ing it
|
||||||
|
because that's just stupid
|
||||||
|
|
||||||
|
What if I turn this on it's head and really embrace the systems. So for example I could have
|
||||||
|
the User system. Ooof this is a big question actually...
|
||||||
|
|
||||||
|
// Components that want to be updated
|
||||||
|
Move
|
||||||
|
|
||||||
|
// want to be drawn
|
||||||
|
Drawable
|
||||||
|
Geom
|
||||||
|
|
||||||
|
Notifyable
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 22 KiB |
@ -0,0 +1,16 @@
|
|||||||
|
# this is a comment
|
||||||
|
elem table {
|
||||||
|
elem tr {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
elem table {
|
||||||
|
elem tr {
|
||||||
|
|
||||||
|
}
|
||||||
|
elem tr {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
After Width: | Height: | Size: 407 KiB |
@ -0,0 +1,58 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use specs::{Component, Join, System, VecStorage, Write, WriteStorage};
|
||||||
|
|
||||||
|
use crate::canvas::canvas_frame::CanvasFrame;
|
||||||
|
use crate::canvas::compu_frame::CompuFrame;
|
||||||
|
use crate::canvas::managed::handles::{CanvasImageHandle, CanvasTextureHandle, CompuBufferHandle, CompuKernelHandle};
|
||||||
|
use crate::PersistentState;
|
||||||
|
use crate::render_system::{Geometry, Images, Position, Textures};
|
||||||
|
use crate::util::vertex::{ImageVertex3D, TextureVertex3D, VertexTypeContainer};
|
||||||
|
use crate::vkprocessor::VkProcessor;
|
||||||
|
|
||||||
|
pub struct Compu {
|
||||||
|
pub kernels: Vec<Arc<CompuKernelHandle>>,
|
||||||
|
pub buffers: Vec<Arc<CompuBufferHandle>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Compu {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct CompuSystem;
|
||||||
|
|
||||||
|
impl<'a> System<'a> for CompuSystem {
|
||||||
|
type SystemData = (
|
||||||
|
WriteStorage<'a, Compu>,
|
||||||
|
WriteStorage<'a, Images>,
|
||||||
|
Write<'a, PersistentState>, // delta_time, window size, etc.
|
||||||
|
Write<'a, VkProcessor>, // Renderer
|
||||||
|
);
|
||||||
|
|
||||||
|
fn run(&mut self, (
|
||||||
|
mut compu_list,
|
||||||
|
mut image_list,
|
||||||
|
mut state,
|
||||||
|
mut vk_processor
|
||||||
|
): Self::SystemData) {
|
||||||
|
state.compu_frame = CompuFrame::new(state.window_size);
|
||||||
|
|
||||||
|
// compu_frame.add_with_image_swap(compute_buffer.clone(), compute_kernel.clone(), &compu_sprite1);
|
||||||
|
// compu_frame.add(compute_buffer.clone(), compute_kernel.clone());
|
||||||
|
|
||||||
|
for (compute_item, image) in (&mut compu_list, &mut image_list).join() {
|
||||||
|
state.compu_frame.add_with_image_swap(
|
||||||
|
compute_item.buffers.get(0).unwrap().clone(),
|
||||||
|
compute_item.kernels.get(0).unwrap().clone(),
|
||||||
|
image,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (compute_item) in (&mut compu_list).join() {
|
||||||
|
state.compu_frame.add(
|
||||||
|
compute_item.buffers.get(0).unwrap().clone(),
|
||||||
|
compute_item.kernels.get(0).unwrap().clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,169 +0,0 @@
|
|||||||
use std::ffi::CStr;
|
|
||||||
use vulkano::buffer::{CpuAccessibleBuffer, BufferUsage};
|
|
||||||
use std::sync::Arc;
|
|
||||||
use vulkano::framebuffer::RenderPassAbstract;
|
|
||||||
use vulkano::pipeline::{GraphicsPipelineAbstract, ComputePipeline};
|
|
||||||
use vulkano::device::Device;
|
|
||||||
use image::ImageBuffer;
|
|
||||||
use image::GenericImageView;
|
|
||||||
use vulkano::image::{ImageUsage, AttachmentImage};
|
|
||||||
use vulkano::descriptor::descriptor_set::{PersistentDescriptorSetBuf, PersistentDescriptorSet};
|
|
||||||
use vulkano::format::Format;
|
|
||||||
use vulkano::descriptor::pipeline_layout::PipelineLayout;
|
|
||||||
use std::borrow::Borrow;
|
|
||||||
use image::Rgba;
|
|
||||||
use vulkano::command_buffer::AutoCommandBufferBuilder;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use shade_runner::{CompiledShaders, Entry, CompileError};
|
|
||||||
use vulkano::pipeline::shader::ShaderModule;
|
|
||||||
use shaderc::CompileOptions;
|
|
||||||
use crate::compute::compu_frame::CompuFrame;
|
|
||||||
use crate::canvas::managed::handles::Handle;
|
|
||||||
use crate::compute::managed::compu_buffer::CompuBuffers;
|
|
||||||
use crate::compute::managed::handles::{CompuKernelHandle, CompuBufferHandle};
|
|
||||||
use crate::compute::managed::compu_kernel::CompuKernel;
|
|
||||||
use crate::canvas::canvas_state::CanvasState;
|
|
||||||
|
|
||||||
|
|
||||||
/// State holding the compute buffers for computation and the kernels which will compute them
|
|
||||||
pub struct CompuState {
|
|
||||||
compute_buffers: Vec<CompuBuffers>,
|
|
||||||
kernels: Vec<CompuKernel>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CompuState {
|
|
||||||
|
|
||||||
pub fn new() -> CompuState {
|
|
||||||
CompuState {
|
|
||||||
compute_buffers: vec![],
|
|
||||||
kernels: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates a 2d compute buffer from incoming data
|
|
||||||
pub fn new_compute_buffer(&mut self,
|
|
||||||
data: Vec<u8>,
|
|
||||||
dimensions: (u32, u32),
|
|
||||||
stride: u32,
|
|
||||||
device: Arc<Device>) -> Arc<CompuBufferHandle> {
|
|
||||||
|
|
||||||
let handle = Arc::new(CompuBufferHandle {
|
|
||||||
handle: self.compute_buffers.len() as u32
|
|
||||||
});
|
|
||||||
|
|
||||||
self.compute_buffers.push(
|
|
||||||
(CompuBuffers::new(device.clone(), data, dimensions, stride, handle.clone())));
|
|
||||||
|
|
||||||
handle
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn read_compute_buffer(&mut self, handle: Arc<CompuBufferHandle>) -> Vec<u8> {
|
|
||||||
let mut buffer : &CompuBuffers = self.compute_buffers.get(handle.handle as usize).unwrap();
|
|
||||||
let v = buffer.read_output_buffer();
|
|
||||||
v.into_vec()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Write to the compute buffer, ostensibly overwriting what's already there
|
|
||||||
pub fn write_compute_buffer(&self, handle: Arc<CompuBufferHandle>, data: Vec<u8>) {
|
|
||||||
unimplemented!("read_compute_buffer is not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_kernel(&mut self,
|
|
||||||
filename: String,
|
|
||||||
device: Arc<Device>) -> Arc<CompuKernelHandle> {
|
|
||||||
let handle = Arc::new(CompuKernelHandle {
|
|
||||||
handle: self.kernels.len() as u32
|
|
||||||
});
|
|
||||||
|
|
||||||
self.kernels.push((CompuKernel::new(filename, device.clone(), handle.clone())));
|
|
||||||
|
|
||||||
handle
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_kernel_handle(&self, kernel_name: String) -> Option<Arc<CompuKernelHandle>> {
|
|
||||||
for i in self.kernels.clone() {
|
|
||||||
if i.get_name() == kernel_name {
|
|
||||||
return Some(i.get_handle());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn compute_commands(&mut self,
|
|
||||||
compute_frame: &CompuFrame,
|
|
||||||
mut command_buffer: &mut AutoCommandBufferBuilder,
|
|
||||||
canvas: &CanvasState) {
|
|
||||||
|
|
||||||
// i = (Buffer, Kernel)
|
|
||||||
for i in &compute_frame.pure_compute {
|
|
||||||
let buffer_id = (*i.0).clone().get_handle() as usize;
|
|
||||||
let kernel_id = (*i.1).clone().get_handle() as usize;
|
|
||||||
|
|
||||||
let buffer = self.compute_buffers.get(buffer_id).unwrap();
|
|
||||||
let kernel = self.kernels.get(kernel_id).unwrap();
|
|
||||||
|
|
||||||
let pipeline = kernel.clone().get_pipeline();
|
|
||||||
let descriptorset = buffer.get_descriptor_set(kernel.clone().get_pipeline());
|
|
||||||
|
|
||||||
let size = buffer.get_size();
|
|
||||||
|
|
||||||
command_buffer = command_buffer
|
|
||||||
.dispatch([size.0 / 8, size.1 / 8, 1], pipeline, descriptorset, ()).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
// i = (Buffer, Image, Kernel)
|
|
||||||
for i in &compute_frame.swapped_to_image {
|
|
||||||
let buffer_id = (*i.0).clone().get_handle() as usize;
|
|
||||||
let image_id = i.1.clone();
|
|
||||||
let kernel_id = (*i.2).clone().handle as usize;
|
|
||||||
|
|
||||||
let buffer = self.compute_buffers.get(buffer_id).unwrap();
|
|
||||||
let image = canvas.get_image(image_id);
|
|
||||||
let kernel = self.kernels.get(kernel_id).unwrap();
|
|
||||||
|
|
||||||
let p = kernel.clone().get_pipeline();
|
|
||||||
let d = buffer.get_descriptor_set(kernel.clone().get_pipeline());
|
|
||||||
|
|
||||||
let dimensions = image.dimensions();
|
|
||||||
let dimensions = (dimensions[0], dimensions[1]);
|
|
||||||
if dimensions != buffer.get_size() {
|
|
||||||
panic!("Buffer sizes not the same");
|
|
||||||
}
|
|
||||||
|
|
||||||
let size = buffer.get_size();
|
|
||||||
|
|
||||||
command_buffer = command_buffer
|
|
||||||
.dispatch([size.0 / 8, size.1 / 8, 1], p, d, ()).unwrap()
|
|
||||||
.copy_buffer_to_image(buffer.get_output_buffer(), image).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// i = (Input Buffer, Output Buffer, Kernel)
|
|
||||||
// Input buffer -> Kernel -> Output buffer
|
|
||||||
for i in &compute_frame.swapped_to_buffer {
|
|
||||||
let input_buffer_id = (*i.0).clone().get_handle() as usize;
|
|
||||||
let output_buffer_id = (*i.1).clone().get_handle() as usize;
|
|
||||||
let kernel_id = (*i.2).clone().handle as usize;
|
|
||||||
|
|
||||||
let input_buffer = self.compute_buffers.get(input_buffer_id).unwrap();
|
|
||||||
let output_buffer = self.compute_buffers.get(output_buffer_id).unwrap();
|
|
||||||
let kernel = self.kernels.get(kernel_id).unwrap();
|
|
||||||
|
|
||||||
let pipeline = kernel.clone().get_pipeline();
|
|
||||||
let descriptor_set = input_buffer.get_descriptor_set(kernel.clone().get_pipeline());
|
|
||||||
|
|
||||||
if input_buffer.get_size() != output_buffer.get_size() {
|
|
||||||
panic!("Buffer sizes not the same");
|
|
||||||
}
|
|
||||||
let size = input_buffer.get_size();
|
|
||||||
|
|
||||||
command_buffer = command_buffer
|
|
||||||
// .dispatch([size.0/8, size.1/8,1], pipeline, descriptor_set, ()).unwrap()
|
|
||||||
.copy_buffer(
|
|
||||||
input_buffer.get_output_buffer(),
|
|
||||||
output_buffer.get_input_buffer()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
|||||||
use crate::canvas::managed::handles::Handle;
|
|
||||||
|
|
||||||
/// Typed wrapper for a u32 handle
|
|
||||||
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
|
|
||||||
pub struct CompuBufferHandle {
|
|
||||||
pub(in crate::compute) handle: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Handle for CompuBufferHandle {
|
|
||||||
fn get_handle(&self) -> u32 {
|
|
||||||
self.handle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Typed wrapper for a u32 handle
|
|
||||||
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
|
|
||||||
pub struct CompuKernelHandle {
|
|
||||||
pub(in crate::compute) handle: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Handle for CompuKernelHandle {
|
|
||||||
fn get_handle(&self) -> u32 {
|
|
||||||
self.handle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
pub mod compu_buffer;
|
|
||||||
pub mod compu_kernel;
|
|
||||||
pub mod handles;
|
|
@ -1,6 +0,0 @@
|
|||||||
pub mod compu_frame;
|
|
||||||
pub mod compu_state;
|
|
||||||
pub mod managed;
|
|
||||||
|
|
||||||
use crate::compute::compu_state::CompuState;
|
|
||||||
use crate::compute::compu_frame::CompuFrame;
|
|
@ -0,0 +1,59 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use specs::{Component, Entities, Join, System, VecStorage, Write, WriteStorage};
|
||||||
|
use vulkano::swapchain::Surface;
|
||||||
|
use winit::window::Window;
|
||||||
|
|
||||||
|
use crate::PersistentState;
|
||||||
|
use crate::render_system::Position;
|
||||||
|
use crate::util::tr_event::{TrEvent, TrEventExtension, TrWindowEvent};
|
||||||
|
use crate::vkprocessor::VkProcessor;
|
||||||
|
use winit::event::ElementState;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Evented {
|
||||||
|
pub subscribed: fn(event: TrEvent<TrEventExtension>) -> bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Evented {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct EventSystem;
|
||||||
|
|
||||||
|
impl<'a> System<'a> for EventSystem {
|
||||||
|
type SystemData = (
|
||||||
|
Entities<'a>,
|
||||||
|
WriteStorage<'a, Evented>,
|
||||||
|
Write<'a, PersistentState>,
|
||||||
|
Write<'a, VkProcessor>,
|
||||||
|
Write<'a, Vec<TrEvent<TrEventExtension>>>
|
||||||
|
);
|
||||||
|
|
||||||
|
fn run(&mut self, (
|
||||||
|
entity,
|
||||||
|
mut evented_list,
|
||||||
|
mut state,
|
||||||
|
mut vk_processor,
|
||||||
|
event_stack
|
||||||
|
): Self::SystemData) {
|
||||||
|
|
||||||
|
for (evented) in (&evented_list).join() {
|
||||||
|
for event in &*event_stack {
|
||||||
|
match event {
|
||||||
|
TrEvent::WindowEvent { window_id, event } => {
|
||||||
|
match event {
|
||||||
|
TrWindowEvent::MouseInput { device_id, state, button, modifiers } => {
|
||||||
|
if *state == ElementState::Pressed {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (entity, evented) in (&*entity, &mut evented_list).join() {}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
pub mod parser;
|
@ -0,0 +1,220 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use specs::{Component, Join, System, VecStorage, Write, WriteStorage};
|
||||||
|
|
||||||
|
use crate::canvas::canvas_frame::CanvasFrame;
|
||||||
|
use crate::canvas::compu_frame::CompuFrame;
|
||||||
|
use crate::canvas::managed::handles::{CanvasImageHandle, CanvasTextureHandle};
|
||||||
|
use crate::PersistentState;
|
||||||
|
use crate::util::vertex::{ImageVertex3D, TextureVertex3D, VertexTypeContainer};
|
||||||
|
use crate::vkprocessor::VkProcessor;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Position {
|
||||||
|
pub x: f32,
|
||||||
|
pub y: f32,
|
||||||
|
pub z: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Position {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Geometry {
|
||||||
|
pub size_x: f32,
|
||||||
|
pub size_y: f32,
|
||||||
|
pub rotation: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Geometry {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Textures {
|
||||||
|
pub textures: Vec<Arc<CanvasTextureHandle>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Textures {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Images {
|
||||||
|
pub images: Vec<Arc<CanvasImageHandle>>,
|
||||||
|
pub image_resolutions: Vec<(u32, u32)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for Images {
|
||||||
|
type Storage = VecStorage<Self>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct RenderSystem;
|
||||||
|
|
||||||
|
impl<'a> System<'a> for RenderSystem {
|
||||||
|
type SystemData = (
|
||||||
|
WriteStorage<'a, Position>,
|
||||||
|
WriteStorage<'a, Geometry>,
|
||||||
|
WriteStorage<'a, Textures>,
|
||||||
|
WriteStorage<'a, Images>,
|
||||||
|
Write<'a, PersistentState>, // delta_time, window size, etc.
|
||||||
|
Write<'a, VkProcessor>, // Renderer
|
||||||
|
);
|
||||||
|
|
||||||
|
fn run(&mut self, (
|
||||||
|
mut pos_list,
|
||||||
|
mut geom_list,
|
||||||
|
mut textures_list,
|
||||||
|
mut images_list,
|
||||||
|
mut state,
|
||||||
|
mut vk_processor
|
||||||
|
): Self::SystemData) {
|
||||||
|
state.canvas_frame = CanvasFrame::new(state.window_size);
|
||||||
|
|
||||||
|
// compu_frame.add_with_image_swap(compute_buffer.clone(), compute_kernel.clone(), &compu_sprite1);
|
||||||
|
// compu_frame.add(compute_buffer.clone(), compute_kernel.clone());
|
||||||
|
|
||||||
|
for (position, geometry, textures) in (&mut pos_list, &mut geom_list, &mut textures_list).join() {
|
||||||
|
// geom.pos_x += mv.vel_x * state.delta_time;
|
||||||
|
// geom.pos_y += mv.vel_y * state.delta_time;
|
||||||
|
|
||||||
|
let window_size = state.window_size.clone();
|
||||||
|
let pos = (position.x, position.y);
|
||||||
|
let size = (geometry.size_x, geometry.size_y);
|
||||||
|
let normalized_depth = position.z as f32 / 255.0;
|
||||||
|
|
||||||
|
let textured_vertices = vec![
|
||||||
|
VertexTypeContainer::TextureType(
|
||||||
|
generate_textured_verts(window_size, pos, size, normalized_depth),
|
||||||
|
textures.textures.get(0).unwrap().clone(),
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
state.canvas_frame.add(textured_vertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (position, geometry, images) in (&mut pos_list, &mut geom_list, &mut images_list).join() {
|
||||||
|
// geom.pos_x += mv.vel_x * state.delta_time;
|
||||||
|
// geom.pos_y += mv.vel_y * state.delta_time;
|
||||||
|
|
||||||
|
let window_size = state.window_size.clone();
|
||||||
|
let pos = (position.x, position.y);
|
||||||
|
let size = (geometry.size_x, geometry.size_y);
|
||||||
|
let normalized_depth = position.z as f32 / 255.0;
|
||||||
|
|
||||||
|
let textured_vertices = vec![
|
||||||
|
VertexTypeContainer::ImageType(
|
||||||
|
generate_image_verts(window_size, pos, size, images.image_resolutions.get(0).unwrap().clone(), normalized_depth),
|
||||||
|
images.images.get(0).unwrap().clone(),
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
state.canvas_frame.add(textured_vertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
let compu_frame = &state.compu_frame;
|
||||||
|
vk_processor.run(&state.surface.clone().unwrap(),
|
||||||
|
&state.canvas_frame,
|
||||||
|
compu_frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_image_verts(
|
||||||
|
window_size: (u32, u32),
|
||||||
|
position: (f32, f32),
|
||||||
|
size: (f32, f32),
|
||||||
|
image_size: (u32, u32),
|
||||||
|
depth: f32,
|
||||||
|
) -> Vec<ImageVertex3D> {
|
||||||
|
let image_size = (image_size.0 as f32, image_size.1 as f32);
|
||||||
|
|
||||||
|
// screen space position
|
||||||
|
let ss_position = (
|
||||||
|
position.0 / window_size.0 as f32 - 1.0,
|
||||||
|
position.1 / window_size.1 as f32 - 1.0
|
||||||
|
);
|
||||||
|
|
||||||
|
// screen space size
|
||||||
|
let ss_size = (
|
||||||
|
size.0 / window_size.0 as f32,
|
||||||
|
size.1 / window_size.1 as f32
|
||||||
|
);
|
||||||
|
|
||||||
|
// pub fn new(position: (f32, f32),
|
||||||
|
// size: (f32, f32),
|
||||||
|
// depth: u32,
|
||||||
|
// image_size: (f32, f32),
|
||||||
|
// image_handle: Arc<CanvasImageHandle>) -> CompuSprite {
|
||||||
|
|
||||||
|
vec![
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1, depth], // top left
|
||||||
|
ti_position: [-0.0, -0.0],
|
||||||
|
},
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1 + ss_size.1, depth], // bottom left
|
||||||
|
ti_position: [-0.0, image_size.1],
|
||||||
|
},
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1 + ss_size.1, depth], // bottom right
|
||||||
|
ti_position: [image_size.0, image_size.1],
|
||||||
|
},
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1, depth], // top left
|
||||||
|
ti_position: [-0.0, -0.0],
|
||||||
|
},
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1 + ss_size.1, depth], // bottom right
|
||||||
|
ti_position: [image_size.0, image_size.1],
|
||||||
|
},
|
||||||
|
ImageVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1, depth], // top right
|
||||||
|
ti_position: [image_size.0, -0.0],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_textured_verts(
|
||||||
|
window_size: (u32, u32),
|
||||||
|
position: (f32, f32),
|
||||||
|
size: (f32, f32),
|
||||||
|
depth: f32,
|
||||||
|
) -> Vec<TextureVertex3D> {
|
||||||
|
let ss_position = (
|
||||||
|
position.0 / window_size.0 as f32 - 1.0,
|
||||||
|
position.1 / window_size.1 as f32 - 1.0
|
||||||
|
);
|
||||||
|
|
||||||
|
let ss_size = (
|
||||||
|
size.0 / window_size.0 as f32,
|
||||||
|
size.1 / window_size.1 as f32
|
||||||
|
);
|
||||||
|
|
||||||
|
vec![
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1, depth], // top left
|
||||||
|
ti_position: [-0.0, -0.0],
|
||||||
|
},
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1 + ss_size.1, depth], // bottom left
|
||||||
|
ti_position: [-0.0, 1.0],
|
||||||
|
},
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1 + ss_size.1, depth], // bottom right
|
||||||
|
ti_position: [1.0, 1.0],
|
||||||
|
},
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0, ss_position.1, depth], // top left
|
||||||
|
ti_position: [-0.0, -0.0],
|
||||||
|
},
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1 + ss_size.1, depth], // bottom right
|
||||||
|
ti_position: [1.0, 1.0],
|
||||||
|
},
|
||||||
|
TextureVertex3D {
|
||||||
|
v_position: [ss_position.0 + ss_size.0, ss_position.1, depth], // top right
|
||||||
|
ti_position: [1.0, -0.0],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
@ -1,25 +1,214 @@
|
|||||||
use winit::window::WindowId;
|
use winit::window::{WindowId, Theme};
|
||||||
use winit::event::{WindowEvent, DeviceId, DeviceEvent, KeyboardInput, ModifiersState, MouseScrollDelta, TouchPhase, ElementState, MouseButton, AxisId, Touch};
|
use winit::event::{WindowEvent, DeviceId, DeviceEvent, KeyboardInput, ModifiersState, MouseScrollDelta, TouchPhase, ElementState, MouseButton, AxisId, Touch, StartCause, Event};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use winit::dpi::{PhysicalPosition, PhysicalSize};
|
use winit::dpi::{PhysicalPosition, PhysicalSize};
|
||||||
use gilrs::Event as GilEvent;
|
use gilrs::Event as GilEvent;
|
||||||
|
use vulkano::pipeline::shader::GeometryShaderExecutionMode::TrianglesWithAdjacency;
|
||||||
|
|
||||||
pub enum TrEvent {
|
#[derive(Clone)]
|
||||||
MouseFocusEvent {
|
pub enum TrUIEvent<T> {
|
||||||
position : (f32, f32),
|
UIEvent(T)
|
||||||
},
|
}
|
||||||
MouseClickEvent {
|
|
||||||
position : (f32, f32),
|
|
||||||
button : MouseButton,
|
|
||||||
},
|
|
||||||
MouseHeldEvent {
|
|
||||||
|
|
||||||
},
|
#[derive(Clone)]
|
||||||
KeyHeldEvent {
|
pub enum TrEventExtension {
|
||||||
|
|
||||||
|
/// Custom events here
|
||||||
|
MouseHeldEvent {},
|
||||||
|
KeyHeldEvent {},
|
||||||
|
GamepadEvent {
|
||||||
|
gil_event: GilEvent,
|
||||||
},
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum TrEvent<T> {
|
||||||
|
|
||||||
|
/// Custom events here
|
||||||
|
MouseHeldEvent {},
|
||||||
|
KeyHeldEvent {},
|
||||||
GamepadEvent {
|
GamepadEvent {
|
||||||
gil_event: GilEvent,
|
gil_event: GilEvent,
|
||||||
|
},
|
||||||
|
|
||||||
|
/// Winit events here
|
||||||
|
NewEvents(StartCause),
|
||||||
|
WindowEvent {
|
||||||
|
window_id: WindowId,
|
||||||
|
event: TrWindowEvent,
|
||||||
|
},
|
||||||
|
DeviceEvent {
|
||||||
|
device_id: DeviceId,
|
||||||
|
event: DeviceEvent,
|
||||||
|
},
|
||||||
|
UserEvent(T),
|
||||||
|
Suspended,
|
||||||
|
Resumed,
|
||||||
|
MainEventsCleared,
|
||||||
|
RedrawRequested(WindowId),
|
||||||
|
RedrawEventsCleared,
|
||||||
|
LoopDestroyed,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<T> From<Event<'_, T>> for TrEvent<T> {
|
||||||
|
fn from(event: Event<T>) -> Self {
|
||||||
|
match event {
|
||||||
|
Event::NewEvents(cause) => {
|
||||||
|
TrEvent::NewEvents(cause)
|
||||||
|
},
|
||||||
|
Event::WindowEvent { window_id: window_id, event: event } => {
|
||||||
|
TrEvent::WindowEvent {
|
||||||
|
window_id: window_id,
|
||||||
|
event: match event {
|
||||||
|
WindowEvent::AxisMotion { device_id, axis, value } => {
|
||||||
|
TrWindowEvent::AxisMotion { device_id, axis, value }
|
||||||
|
},
|
||||||
|
WindowEvent::Resized(physical_size) => {
|
||||||
|
TrWindowEvent::Resized(physical_size)
|
||||||
|
}
|
||||||
|
WindowEvent::Moved(physical_position) => {
|
||||||
|
TrWindowEvent::Moved(physical_position)
|
||||||
|
}
|
||||||
|
WindowEvent::CloseRequested => {
|
||||||
|
TrWindowEvent::CloseRequested
|
||||||
|
}
|
||||||
|
WindowEvent::Destroyed => {
|
||||||
|
TrWindowEvent::Destroyed
|
||||||
|
}
|
||||||
|
WindowEvent::DroppedFile(path_buf) => {
|
||||||
|
TrWindowEvent::DroppedFile(path_buf)
|
||||||
|
}
|
||||||
|
WindowEvent::HoveredFile(path_buf) => {
|
||||||
|
TrWindowEvent::HoveredFile(path_buf)
|
||||||
|
}
|
||||||
|
WindowEvent::HoveredFileCancelled => {
|
||||||
|
TrWindowEvent::HoveredFileCancelled
|
||||||
|
}
|
||||||
|
WindowEvent::ReceivedCharacter(char) => {
|
||||||
|
TrWindowEvent::ReceivedCharacter(char)
|
||||||
|
}
|
||||||
|
WindowEvent::Focused(bool) => {
|
||||||
|
TrWindowEvent::Focused(bool)
|
||||||
|
}
|
||||||
|
WindowEvent::KeyboardInput { device_id: device_id, input: input, is_synthetic: is_synthetic } => {
|
||||||
|
TrWindowEvent::KeyboardInput { device_id, input, is_synthetic }
|
||||||
|
}
|
||||||
|
WindowEvent::ModifiersChanged(modifiers_state) => {
|
||||||
|
TrWindowEvent::ModifiersChanged(modifiers_state)
|
||||||
|
}
|
||||||
|
WindowEvent::CursorMoved { device_id: device_id, position: position, modifiers: modifiers } => {
|
||||||
|
TrWindowEvent::CursorMoved { device_id, position, modifiers }
|
||||||
|
}
|
||||||
|
WindowEvent::CursorEntered { device_id: device_id } => {
|
||||||
|
TrWindowEvent::CursorEntered { device_id }
|
||||||
|
}
|
||||||
|
WindowEvent::CursorLeft { device_id: device_id } => {
|
||||||
|
TrWindowEvent::CursorLeft { device_id }
|
||||||
|
}
|
||||||
|
WindowEvent::MouseWheel { device_id: device_id, delta: delta, phase: phase, modifiers: modifiers } => {
|
||||||
|
TrWindowEvent::MouseWheel { device_id, delta, phase, modifiers }
|
||||||
|
}
|
||||||
|
WindowEvent::MouseInput { device_id: device_id, state: state, button: button, modifiers: modifiers } => {
|
||||||
|
TrWindowEvent::MouseInput { device_id, state, button, modifiers }
|
||||||
|
}
|
||||||
|
WindowEvent::TouchpadPressure { device_id: device_id, pressure: pressure, stage: stage } => {
|
||||||
|
TrWindowEvent::TouchpadPressure { device_id, pressure, stage }
|
||||||
|
}
|
||||||
|
WindowEvent::Touch(touch) => {
|
||||||
|
TrWindowEvent::Touch(touch)
|
||||||
|
}
|
||||||
|
WindowEvent::ScaleFactorChanged { scale_factor: scale_factor, new_inner_size: new_inner_size } => {
|
||||||
|
TrWindowEvent::ScaleFactorChanged { scale_factor, new_inner_size: PhysicalSize { width: new_inner_size.width, height: new_inner_size.height } }
|
||||||
|
}
|
||||||
|
WindowEvent::ThemeChanged(theme) => {
|
||||||
|
TrWindowEvent::ThemeChanged(theme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Event::DeviceEvent { device_id: device_id, event: event } => {
|
||||||
|
TrEvent::DeviceEvent { device_id, event }
|
||||||
|
}
|
||||||
|
Event::UserEvent(user_event) => {
|
||||||
|
TrEvent::UserEvent(user_event)
|
||||||
|
}
|
||||||
|
Event::Suspended => {
|
||||||
|
TrEvent::Suspended
|
||||||
|
}
|
||||||
|
Event::Resumed => {
|
||||||
|
TrEvent::Resumed
|
||||||
|
}
|
||||||
|
Event::MainEventsCleared => {
|
||||||
|
TrEvent::MainEventsCleared
|
||||||
|
}
|
||||||
|
Event::RedrawRequested(window_id) => {
|
||||||
|
TrEvent::RedrawRequested(window_id)
|
||||||
|
}
|
||||||
|
Event::RedrawEventsCleared => {
|
||||||
|
TrEvent::RedrawEventsCleared
|
||||||
|
}
|
||||||
|
Event::LoopDestroyed => {
|
||||||
|
TrEvent::LoopDestroyed
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
|
pub enum TrWindowEvent {
|
||||||
|
|
||||||
|
Resized(PhysicalSize<u32>),
|
||||||
|
Moved(PhysicalPosition<i32>),
|
||||||
|
CloseRequested,
|
||||||
|
Destroyed,
|
||||||
|
DroppedFile(PathBuf),
|
||||||
|
HoveredFile(PathBuf),
|
||||||
|
HoveredFileCancelled,
|
||||||
|
ReceivedCharacter(char),
|
||||||
|
Focused(bool),
|
||||||
|
KeyboardInput {
|
||||||
|
device_id: DeviceId,
|
||||||
|
input: KeyboardInput,
|
||||||
|
is_synthetic: bool,
|
||||||
|
},
|
||||||
|
ModifiersChanged(ModifiersState),
|
||||||
|
CursorMoved {
|
||||||
|
device_id: DeviceId,
|
||||||
|
position: PhysicalPosition<f64>,
|
||||||
|
#[deprecated = "Deprecated in favor of WindowEvent::ModifiersChanged"]
|
||||||
|
modifiers: ModifiersState,
|
||||||
|
},
|
||||||
|
CursorEntered { device_id: DeviceId },
|
||||||
|
CursorLeft { device_id: DeviceId },
|
||||||
|
MouseWheel {
|
||||||
|
device_id: DeviceId,
|
||||||
|
delta: MouseScrollDelta,
|
||||||
|
phase: TouchPhase,
|
||||||
|
#[deprecated = "Deprecated in favor of WindowEvent::ModifiersChanged"]
|
||||||
|
modifiers: ModifiersState,
|
||||||
|
},
|
||||||
|
MouseInput {
|
||||||
|
device_id: DeviceId,
|
||||||
|
state: ElementState,
|
||||||
|
button: MouseButton,
|
||||||
|
#[deprecated = "Deprecated in favor of WindowEvent::ModifiersChanged"]
|
||||||
|
modifiers: ModifiersState,
|
||||||
|
},
|
||||||
|
TouchpadPressure {
|
||||||
|
device_id: DeviceId,
|
||||||
|
pressure: f32,
|
||||||
|
stage: i64,
|
||||||
|
},
|
||||||
|
AxisMotion {
|
||||||
|
device_id: DeviceId,
|
||||||
|
axis: AxisId,
|
||||||
|
value: f64,
|
||||||
|
},
|
||||||
|
Touch(Touch),
|
||||||
|
ScaleFactorChanged {
|
||||||
|
scale_factor: f64,
|
||||||
|
new_inner_size: PhysicalSize<u32>,
|
||||||
|
},
|
||||||
|
ThemeChanged(Theme),
|
||||||
}
|
}
|
Loading…
Reference in new issue