coderedart / jokolay Goto Github PK
View Code? Open in Web Editor NEWAn Overlay for Guild Wars 2 in Rust
An Overlay for Guild Wars 2 in Rust
Merges alpha -> master
This branch will be used to do the primary development.
A lot of textures used in marker packs have a bunch of empty transparent pixels, just to pad out the empty areas to fit into a rectangle png image. using texture compression will probably give us a lot of savings in vram space.
This will be tracker issue for all the tasks that need completion before we can release a 0.2 version.
Checklist:
This is a big list, but having atleast this much will make it clear the scope of what we want to do and also set the expectations for future version. having a flexible architecture will help the future versions be much more smooth to tinker with.
xml_files: xml files are placed anywhere in the pack folder and they will all need to be parsed to get a complete pack.
the format is roughly like this:
OverlayData is the root tag in xml file
optional MarkerCategory tag which is recursive and represents the category menu along with marker attributes which are supposed to serve as "inheritance" properties.
optional POIs tag which contains POI and Trail tags
optional POI tag which represents a marker. two attributes need special mentioning here.
first is the "type" attribute which is an xpath (representing the path to category this marker belongs to).
second is the iconFile attribute which is a relative path from the pack root to a png image.
optional Trail tag which represents a trail. it also has the "type" attribute and its image tag is called "texture".
also has a special attribute called trailData to refer to the path of trail binary data just like png image.
Advantages of using xml packs:
Disadvantages of using xml packs:
In the above issues, some of them are due to lack of documentation/specification of the pack format, some of them due to manual editing of xml files and not checking for errors using linters, others due to no easy editors (which means manual editing) leading to inconsistencies between packs and more or less anyone actually enforcing the pack makers to care about these issues. if a trail binary is missing, there's no error.. so nobody ever knows about it unless they check for it specifically.
Most of the above issues in Xml Marker packs can be condensed into three categories:
POI
or Trail
affecting reproducibility.the main issue is that these problems require existing overlays to also support a stricter version of marker packs with the above issues fixed. I doubt they want to do that and break workflows for existing users. So, it is better for us to go with json packs.
I have spent way way way way way too much time on marker packs, and kinda starting to regret this. one of the main reasons to make Jokolay instead of porting taco was that I didn't want to learn specific functionality like taco's UI toolkit which won't be useful to me in the future compared to learning something like Qt or imgui in c++ or egui in rust. Yet, I spent way too much time wasting on this custom format. if it was gltf or some other open format, it might have been okay. we still learnt a bunch of stuff regarding all kinds of formats (text and binary) or the issues regarding representation of data like premultiplied colors or referring to external files like images/trail binaries. but, not enough to justify the amount of time invested.
size difference between xml and json packs was roughly 2 MB for Tekkit's pack.
just for completion, one more option we considered was databases like sqlite.
Advantages:
Disadvantages:
honestly, databases are an attractive option (especially with sqlite). but I don't want to completely commit myself to a schema yet, especially without consulting with other overlays. so i will choose json based pack. eventually we can use sqlite internally, but when we want to export a pack, we can choose to do so in json. once we get enough experience, we can reconsider databases.
Hey there! I see that this repository has previously contained an GLFW backend for bevy_window
, before being removed in d7bcf60.
I ask for permission to use that old code as a base for an actual bevy_glfw
crate, where my aim is to improve and maintain it. I am planning to license the fork under MIT or Apache 2.0, as per the Bevy Third Party Plugin Guidelines. I will credit your name.
As an aside, my motivation behind this is that I personally find it inconvenient to use winit due to its lack of proper keyboard input handling, as I'm using a non-qwerty keyboard layout, Colemak, which scrambles the key mapping in games, making it very difficult to use without making an effort to remap all keys to their correct locations. GLFW, on the other hand, always assumes a qwerty layout, no matter where the keys are physically located on the keyboard, which is the preferred behaviour in games. There is work underway to fix this in winit, but it's not done yet (rust-windowing/winit#1806).
Merges alpha -> master
Closes #7 . Tracking branch for alpha release of jokolay
Winit on web. Glfw on Desktop.
egui
There's only two 3D renderers in rust at the moment. rend3
and three-d
. but rend3
cannot work on web unless webgpu is on stable (and it is very much not stable right now. neither chrome nor firefox on linux can render wgpu samples properly except the very basic ones). webgpu could be in chrome in february 2023.
so, if three-d gets a wgpu backend, then we an use that right now. lets try contributing for now.
fortunately, for the forseeable future, we can easily work with just wgpu as we will only render egui + basic markers / trails (which are custom rendering anyway).
Window Manager is what deals with the layout/position of the windows , decorations, window frames/borders, focus, stacking order etc..
Compositor deals with the drawing part. it draws the decorations on a offscreen buffer, copies the window's framebuffer into the decorations, deals with the translucency and other color stuff before finally rendering it onto the monitor.
First, we must understand the 3 states that Guild Wars 2 can be in.
On Windows, we use the TOP_MOST attribute. refer window style hints and setting it dynamically . this will set the window to be above windowed fullscreen gw2.
The main issue we will be dealing with is that linux does not differentiate between windowed fullscreen and fullscreen. most window managers will try to "emulate" the behavior of windows. when using windowed fullscreen, they will allow you to alt-tab without minimizing game window and the game's resolution must still match that of the desktop/compositor. so, if gw2 is running on a desktop with FHD resolution, then the windowed fullscreen mode is running at FHD. otoh, if we use fullscreen with different resolutions in gw2, then the desktop also changes resolution just like windows and will even minimize gw2 when alt-tabbing.
But it is just an emulation. the spec does not care about it at all. what the spec recommends is the stack order https://specifications.freedesktop.org/wm-spec/wm-spec-1.4.html#STACKINGORDER which says that a "always on top" window must be BELOW a "focused fullscreen" window. it means that the overlay will be pushed into background when gw2 window is focused (by clicking on it for example) either in fullscreen or windowed fullscreen mode. the key word is "focused", so overlay can be technically on top of windowed fullscreen gw2 as long as it is focused. but its still a recommendation and wm like i3 do not implement that order.
On Linux, we have to use window mode for now. even if overlay stayed above windowed fullscreen mode gw2 in any particular DE, it is accidental and cannot be relied upon as standard behavior. we have a temporary workaround to get "almost" the desired behavior. It must be remembered that there's a lot of window managers and we must target the spec rather than a particular WM to make sure the most people can run it.
Workaround:
We can resize gw2 window to be borderless (decoration less) and resize it to the monitor. this will feel like a fullscreen window except for the taskbar panel being visible. we can set taskbar panel to autohide mode. now, overlay can stay on top of the gw2 window while also feeling like its in fullscreen. one caveat is that resizing without decorations is not fun at all.
A more permanent solution would be to use the "Transient_For" hint and set gw2 as the parent window of our overlay. i have not looked much into this because it would mean adding the dependency for X11 and sending manual commands.
future reference: https://stackoverflow.com/questions/31225743/x11-non-clipped-child-windows/31436071#31436071
The stacking order in netwm spec recommends that the child windows that have "transient_for" set to a parent window must appear on top of it. this also means that we now need to find the gw2 window on the linux side for the particular mumble link we are dealing with.
there's also the option to completely skip the window manager by using override_redirect hint. then, we can avoid place jokolay wherever we want and on top of all the other applications. we would need to experiment and find out whether window manager can place their focused windows on "top" of our override_redirected overlay window.
do u just do cargo run?
when i compiled and ran i got this
�[2m2022-12-24T15:04:23.661712Z�[0m �[31mERROR�[0m crashing: The application panicked (crashed).
Message: failed to create marker manager:
0: markers path is not a directory
Location:
src/jmf/manager/mod.rs:119
Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.
Location: src/lib.rs:33
Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.
�[2m2022-12-24T15:04:23.661863Z�[0m �[32m INFO�[0m Dropping Global
�[2m2022-12-24T15:04:23.662319Z�[0m �[32m INFO�[0m Destroying 0 command encoders
Need to decide on a simple format to store the activation data. the structure can just be simple, but will need to decide on a file format. with xml, we don't add new dependency, but it means we need to still deal with xml. otoh, we can take this chance to use a simpler format like toml.
Not sure where logs are saved (if they are), or I'd post them. Essentially switching workspaces in X11 Gnome 45 causes the Jokolay app to close/crash. I've replicated this with alt-tab switching spaces, using a defined hotkey, and also using the new scroll over feature from Gnome 45.
Here's a video clip of it:
at the moment, we use a binding wrapper over rapidxml to filter out any xml errors that we can including deduplicating attributes.
MarkerCategory and POI can actually share MarkerTemplate with a [#serde(flatten)] attribute so that we can simplify deserializing xml packs. but it doesn't work correctly due to quick-xml and serde_xml_rs having issues. stuck on
RReverser/serde-xml-rs#137
tafia/quick-xml#226
once we get that done, we can simplify xml -> json packs easily.
Merges gh-pages -> master
allows for deploying jokolay to github pages
The info attribute needs us to show text. we can do this in two ways.
right now, we have an assets directory (which we get from env) and have everything like marker packs as well as theme, cache, jokoconig etc.. all in that directory.
eventually we might split these as config, data and cache directories. if we make a linux deb/aur package.
right now, in mumble link, we use the xid provided by jokolink as the identification for an individual instance of gw2. but it means using x11 which is not exactly the fastest means of knowing whether gw2 is still alive or dead.
if we had the linux pid of the gw2 process, we could also be using that instead. it will also match the windows version where pid is the identification factor for a gw2 instance. especially for separating different gw2 instances writing to the same MumbleLink.
but wine doesn't provide any methods to get the linux pid mapped to the abstract wine pid that gw2 puts in the mumblelink.
this issue tracks a bug report made by us https://bugs.winehq.org/show_bug.cgi?id=52724 to wine and also check frequently if there's any progress.
Merges marker_manager -> alpha
We have a pretty good working of marker pack parsing and exporting. still needs polishing, but we need more info about our vulkan rendering and pipeline setup to optimize the structure of marker packs.
This merge will let us start working on vulkan and then later, we can complete the rest of the marker pack manager design.
gui is the heaviest component in terms of resource usage during runtime.
we have two options that are stable / mature enough for use.
Advantages:
mature toolkit. so, a lot of the rough edges are already taken care of. eg: menus and their placement
ffi. if we wanted to share gui with scripts, we could simply pass the imgui context over and pretty much all scripting languages have some sort of bindings to imgui.
features. docking and multi-window are HUGE HUGE improvements and it would be very powerful to have them.
disadvantages:
written in C. so, errors might be harder to debug. and there's always the playing catchup with upstream for bug fixes as well as latest features.
api: the api is still in flux and not complete in rust. had weird hacks like imstr or other stuff.
Advantages:
pure rust: easier to debug, build and all the safety advantages because egui doesn't use unsafe.
api: egui api is not ideal, but atleast clean and simple.
Disadvantages:
still new. lots of changes happening and some very rough edges like menus and such going out of window.
lacks momentum of imgui. there's only one core developer and could be abandoned if they burn out. imgui-rs OTOH, has changed hands of multiple devs and still going strong.
features. any complex features like docking or multi-window will take a long while to complete.
ffi. I have no idea how to pass egui context to mods/scripts as it uses a bunch of rust structs like Mutex/Arc.
For now, we will just try to keep UI logic separate from the other parts so that we can swap out the UI based on whichever toolkit becomes more reliable to support. we can even have feature gates to choose which UI to use and run trials with users.
Other alternatives which could be possible options in future:
could look into projects like iced, raui etc... to see if they are easy to integrate into a game-like app like ours.
ofcourse, if we shift to either godot or bevy in future as our base, we might reach different conclusions.
Merges alpha -> master
This merge deals with completing the glfw part of jokolay.
This will Deal with Loading, Reading, Writing, Storing, Editing, Creating and Management of Marker Packs from filesystem to providing filtered markers suitable for rendering.
after we load marker packs, on a reset event (at startup or map changes etc..), we will generate marker Quads (mesh which has all the required data/defaults set for rendering) on a per player/account basis in a buffer and store the indexes in a map.
optional: we can create a secondary buffer that can be used by MDI or just as alpha multiplier to disable/enable markers based on whatever filters we decide (achievement done, triggered behavior, disabled cat, deleted marker, compute culling, map changed so no need to draw this marker from previous map etc..).
while multiboxing, there can be per account/profile buffers for only drawing markers relevant to that game window. (like each account only enabling certain set of categories, or being in a different map, achievement status etc..) and per player buffers can be regenerated only for that player.
where will we store data specific to gw2/markers like achievements (per character or account)? and when will we filter these markers? can this be disabled when the data is actually invalid? can this be manually set instead of relying on api keys or servers?
Ans: External data like achievement status has nothing to do with marker packs themselves, so they will be dealt with by some other manager like player class. instead marker manager can have a per player hashmap<achievement_id: u32, done: bool> for the ones that it actually needs filters with the default being false (achievement not done, so show the markers). this can be set/updated by the overlay when it wants to and the changes will propagate to filters/renders.
in situations of Rendering/Editing Markers:
what happens on map change? Ans: rebuild buffer
what happens when user logs into a different character? Ans: same as map change
what happens when user logs out and logs in with a different account? Ans: rebuild player buffer and other metadata like achievements + activation times.
Design a way to specify which textures are needed in gpu (alive textures). Ans: textures union of al player buffers
what to do with markers when the texture is not loaded yet? Ans: a loading texture or default texture coords could be used
preferably when to unload textures from gpu? Ans: only when it is not used in player buffers
What happens on texture manager reset? Ans: you regenerate all the meshes again with the new coords.
Add ways to reset the triggers of markers or to ignore certain packs/categories/markers from triggering. Ans: triggers are player specific, so they can be exposed via overlay
ways to only check triggers for markers which are NOT already activated (or not awake) OR ignored explicitly? Ans: to avoid duplication of checking sleeping (already triggered) markers, we will keep a list of awake markers and will only make them sleep (apply trigger ) IF they are not ignored explicitly (which is a separate hashset maintained by player).
add a Activation Data file, either globally or per pack with options for save intervals instead of writing the file at every change to filesystem. Ans: activation data should be based on player, and changes can just set a dirty flag, and a custom timer can write the file if it is dirty at its ticks.
how will we store data for individual characters or individual accounts or map instances as some behavior are specific to characters/accounts/instances (map IP).Ans: Activation of a marker will include the necessary metadata to store these appropriately.
what will we do when we do not know if the character logged in belongs to a certain account when we don't have api key or api servers are not working?
Add any configuration to MarkerConfig struct which can be part of JokoConfig.
add more typesafety with units like pixels, meters, inches for marker attributes. or decide what units we will use for JSON markers and what units are default for the XML markers.
add a way to mark a pack as "partially" loaded when we are only loading markers from a particular map. and when user wants to, he can explicitly upgrade to a fully loaded pack seamlessly.
Create a Marker Manager that handles the everything from loading to exporting and also filtering/rendering markers (atleast export the relevant glsl-compatible types) so that the core jokolay can handle the drawing part.
check if the markers exported by jokolay actually work in taco and blish.
Simplify XML to JSON packs conversion, and viceversa. make the code more readable and see if we can save it
in a map based XML pack like Multi JSON so that blish can also use it for optimized loading.
Design a MarkerQuad struct (using crevice for glsl compatibility std430) to be able to be sent to gpu. this could be what we send in for rendering in batches based on texture.
Make Single JSON Pack be written to filesystem as a Multi JSON Pack.
MultiJSONPack will just be markers saved as a HashMap<CateogryID, HashMap<MarkerID, Marker> in a json file named by the MapID.
this will make possible the loading of markers in readonly packs that are strictly necessary. (or when you only want to add/delete/edit markers to the present map.)
Write predicates to filter markers from packs for rendering and dynamic trigger checks
jokolay is divided into core and client threads.
there's two kind of markers:
there's three kind of scene contexts:
there's two kinds of rendering:
Textures:
we do texture atlassing with 2048x248 sized texture arrays which dynamically resize. this could be a hit for performance at higher textures volume. only time will tell.
there's a question about whether we batch the markers by texture. this is absolutely essential if atlassing doesn't workout.
we have no idea on how to deallocate textures or how to keep track of active/alive/needed textures.
also, compression would be cool if we could figure that out.
synchronizing between core and client threads:
the hard part is to know when to update, how to update the gpu buffers on core thread and how to communicate changes.
With lots of distros coming in wayland nowadays we should target wayland too and make it run there.
Also maybe a List of working and todo Stuff could be added to the README.md or in https://github.com/coderedart/jokolay/projects so that ppl who want to contribute can do so more easily.
Is this even still developed?
We will delay the multi-boxing support for now.
Note: although we consider two windows, there's not much difference between two or five windows for any of the windows. the same problems apply.
There's 3 use cases that we need to consider for multi-boxing:
Finally, egui itself is single window at the moment. multi window is only cool if egui's windows could be dragged between (or out of ) windows.
so, we will just not support the multi window / multiboxing for now.
This is to ensure that issue numbers in GitLab and GitHub are the same
We can have a static website on gitlab pages, as well as our own server.
Jokolay was imagined as a linux native port (cross platform technically) of Taco, primarily intended to be used by RolePlayers to enable them to create custom "Quests" and other players being able to "play" them.
We intended to use MumbleLink + Gw2 Api + arcdps combat data along with a scripting langauge which will enable them RolePlayers to create "Rooms", have a host be the "Dungeon Master", select a "Quest" and start playing with other players. they can assign tasks like "go kill this enemy" and we will use arcdps to track how many enemies they killed to report to DM (dungeon master), or "go to this spot with this item in your inventory" and we will use gw2 api to get items in inventory while mumblelink provides us with the location to track player to emit a successfully completed task event for that player.
now that we are done with the basic overlay on native, i wonder if i really made the right decision. I have spent almost a year and although there's a lot of stuff that i learnt, at the end of the day, every feature i implement takes forever and i feel like electronJS would have gotten me much further and a lot sooner. okay, that sounds a little whiny, but its not all bad. by making Jokolay in rust, we have great performance to show off.
anyway, this issue is to compare alternatives and consider if there's a need to rewrite Jokolay with other languages / platforms instead. although, this also serves as an important pillar to convince myself that i'm not going down the wrong road.
Object is Null
too many times to understand this part.This is to ensure that issue numbers in GitLab and GitHub are the same
The idea is to not leave gw2 window when you want to look up an entry in wiki.
https://wiki.guildwars2.com/ is actually a mediawiki
server. so, we can use the api exposed by mediawiki.
So, we can use that api in jokolay to render wiki pages in a window within the game itself.
Fortunately, mediawiki even provides an API sandbox GUI page where we can modify various endpoints and experiment.
example: the above provided api url is generated using https://wiki.guildwars2.com/wiki/Special:ApiSandbox#action=query&format=json&prop=revisions&titles=Revenant&rvprop=ids%7Ctimestamp%7Cflags%7Ccomment%7Cuser%7Ccontent%7Ccontentmodel%7Ctags&rvslots=*
just modify the parameters and get any info you need. we can use the help
action to get info about the possible endpoints.
example: getting endpoints/docs of query action -> https://wiki.guildwars2.com/api.php?action=help&modules=query
The returned content of wiki content will use mediawiki formatting
https://wiki.guildwars2.com/wiki/Help:Editing has a helpful guide covering most of the usage includidng templates/images/iwlinks(internal wiki links) etc..
we can probably write a basic renderer for mediawiki using egui.
there's existing api crates too https://github.com/magnusmanske/mediawiki_rust , so we probably don't need to write it.
This is to ensure that issue numbers in GitLab and GitHub are the same
This is to ensure that issue numbers in GitLab and GitHub are the same
references to marker/trail attribute definitions.
https://blishhud.com/docs/markers/attributes/achievement
http://www.gw2taco.com/2016/01/how-to-create-your-own-marker-pack.html
This Issue will serve us in four ways:
For an attribute to be supported, we must consider its impact in 3 areas:
First, we will focus on Markers. these attributes are being worked on at the moment.
Trail attributes are mostly same.
Attributes that will not be supported.
If we want to support editing markerpacks by multiple people at once, we need a way to to communicate peer2peer to avoid server traffic. And p2p brings the problem of sync-ing a pack when multiple people are editing it.
This issue will serve as the place for discussion, while we first get the jokolay 0.2 out.
for consensus algorithm, we have http://thesecretlivesofdata.com/raft/ which allows a bunch of people to get together (party) and edit a marker pack. Even if any of them goes down, the rest of the players can continue being in sync. https://www.freecodecamp.org/news/in-search-of-an-understandable-consensus-algorithm-a-summary-4bc294c97e0d/ is a good resource for a rough overview.
This is to ensure that issue numbers in GitLab and GitHub are the same
I thought it would be better for there to be an issue, which clearly tracks the wayland blockers.
We can't support pure Wayland
sessions for the following reasons:
wine
(and lutris
/steam
by extension) use X11
windows for the games. So, you cannot run GW2
without X11
(or Xwayland
) anyway. Maybe in 2025? https://gitlab.winehq.org/wine/wine/-/merge_requests?scope=all&state=opened&search=winewaylandWayland
has no concept of window "position". we cannot get positions of our window or gw2 window. and we cannot set position of our window. And, without those functions, we cannot move the overlay on to gw2 window. Go express your support on https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/264 , which is just the first step in getting this working.xwayland
, very few actually "need" pure wayland
support. Should we really be prioritizing this over other features?I thought this should be documented somewhere.
rust by default uses the guaranteed instruction sets like sse1
and sse2
. but most cpus support better features.
The options you give to a compiler are called target_features
and we can get the default settings (features) for a configuration by using
rustc -C target-cpu=native --target=x86_64-pc-windows-gnu --print cfg
.
ofcourse, the rustc --print cfg
is the important part, but the other two options also help a lot in knowing what cpus support which features and what targets support which features by changing them up. target-cpu
can be any cpu family name like skylake
for intel 6th gen.
to get a list of ALL features available we use rustc --print target-features
.
once we are done with the refactoring of the jokolay for alpha 0.2, we can start doing some benchmarks using latest features. if the benchmarks improve performance by a decent margin, we can release jokolay as multiple binaries with and without features enabled during compilation.
it seems that memory usage is at the very least roughly 50MB. after checking other basic triangle windows from glfw, glfw-rs, vulkano-examples and a normal winit window, it seems that this is just normal. I guess we need to check again after we load marker packs, because each pack is like 50 MB :D deserializing that might spike memory usage for a moment
Considering blish already supports Modules, This feature might be requested eventually.
Short Answer: NO. no support for any sort of addons. it is too big in scope and we will consider it after getting the basic overlay stuff working.
Long Answer: Maybe. scripting will help add features easily when they are lightweight. but
Lua obviously makes sense. its popular in gamedev / game modding communitites, has a lot of libraries, fast af. but lifetimes are a pain and rust doesn't have smooth integration with lua yet.
Javascript. nothing needs to be said. every programmer and their mother know this. will be heavily popular with plugin creators. but package management will probably be a little painful to integrate. again, no smooth integration with rust yet.
Python. not as fast as js or lua. but has an okayish integration with python. has lots of libraries and will be easy for newbies that want to make plugins.
Finally, the real candidate would be Web Assembly. one advantage is that we now have speed AND the integration would be smooth considering rust support is first class for wasm. But more importantly, we can write wasm modules in any language and have them compile to wasm, and pack it for rust. But exposing the plugin API in wasm might not be an easy task at all.
No matter which language we select, we will need to provide a sample template repo on github, a guide for setting up the dev environment for plugins, finally a package format for use with Jokolay. thinking in these terms, self contained wasm files should be ez to distribute/package. we could just refer to already established guides about wasm dev setup for different languages. especially kotlin/rust/js/lua which already work with wasm.
too many decisions and we didn't even consider what we want to expose in plugin api, or security, or what happens if a plugin is too slow, do we wait or do we just skip rendering it this frame? or what kinda refactoring would we need in Jokolay itself to keep it clean and finally if we want to cooperate and expose similar api like Blish/ or make our own.
Merges config_manager -> alpha
We have a Core Part of the Overlay which deals with Windowing, Input and Rendering stuff which MUST be handled from the main thread.
We have a Client Part of the Overlay which deals with Texture Management. We maintain a Asset Manager class and we have to make sure to share the pixels and texture atlas layout so that both the core and client can access it.
Merges development -> master
This branch will contain all the development and we will only commit to master a working version to keep master always in a decent state
In GitLab by @coderedart on Oct 29, 2021, 23:34
previous discussion https://gitlab.com/coderedart/jokolay/-/issues/27
Bevy uses ECS, which requires us to split most of the data and its related behavior cleanly. This will allow us to design things and document the requirements explicitly.
This issue serves as list of things to implement, as well as track the progress of the overall rewrite process.
This is to ensure that issue numbers in GitLab and GitHub are the same
This is to ensure that issue numbers in GitLab and GitHub are the same
Blish uses Mono Engine (Xna Framework) as its base. (can't deal with linux and uses C#. has scripting support with C# and maybe Lua in nearby future )
Burrito uses Godot Engine as its base. (can't deal with windows and okay-ish rust support. has gdscript too)
Taco uses raw dx11. (can't deal with linux and uses c++)
Electaco uses threejs (i think) with electron. (could be cross platform, but just windows-only for now. can use rust via wasm probably. has js for scripting)
Jokolay uses raw wgpu (webgpu with vulkan backend). can do both linux and windows. uses rust. will probably use Lua as scripting lang.
But there is some merit on being based on a game engine. especially for a lot of things like gltf support or sound etc.. which are readily provided in an engine rather than having to figure it all out ourselves. Although, it is a lot of fun to know how all of this works, its not exactly productive if we want to add things like video markers.
So, this issue will track the status of other game engines and their viability to work for us.
All things considered, we are doing reasonably fine imo. its just that we chose a language like Rust with its young undeveloped ecosystem instead of C++ which would have been a breeze with either godot or a hundred other convenient libraries like Sol2 for lua / imgui.
part of #31
Bevy Glfw
is the crate to be used as the windowing backend for Jokolay
.
The main reason to use Glfw
over Winit
is the PASSTHROUGH
feature. As the feature is still not released in Glfw
Stable releases, we will use the patched glfw-rs
and glfw-sys
repos. we must shift back to piston glfw crates when PASSTHROUGH
is in stable release.
Functionality of Bevy Glfw and its implementation status:
when two gw2 instances are started, by default, both of them write to the same MumbleLink shared memory.
when we see a uitick being less than previous tick, at the moment, we assume that previous instance has crashed and we are looking at the data of a new gw2 instance. this will lead to jokolay switching between both windows and acting "crazy" for newbie multi-boxers.
we must explicitly check that the previous gw2 instance is still alive or dead, and if its alive, show a notification or messagebox to inform user that we are following a new gw2 instance now and that they should use different mumblelink names to support jokolay's multiboxing requirements.
this will be a good way to annoy the newbie multi-boxers to actually use different mumble link names.and it will only be annoying to them and the rest of users would never see this message.
we will differentiate between them based on the pid/xid from the data.this is bad. now our mumble data per instance is not updated as often and we are going to "skip" frames. the alternative is to update mumble more often which is pointless when there's only one gw2 instance.
We will go with Case 1 for now.
Primary issues with existing marker packs:
MapID
, xpos
, type
, GUID
, trailData
all have different casexpos
is in meters. fadeNear
is in game units (inches). color
uses u8
for components like alpha in range of 0..255
. alpha
attribute uses float in range of 0.0..1.0
wasm32-unknown-unknown
.POI
and Trail
tags are mixed in with each other under the same POIs
container.If we don't care about editing though, pretty much all of these issues can be just a one time workaround.
sure, it won't be the most efficient way of doing things. but readonly packs can still be significantly performant as we will
and in terms of advantages:
some disadvantages like lack of documentation still exist. but whatever.
previous attempt #19 to use Json packs which are a super set of marker packs is way too hard. it is better to just let Json Packs be their own scene format with lua support.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.