vortexcoyote / leraine-studio Goto Github PK
View Code? Open in Web Editor NEWA cross-platform portable open-source VSRG chart editor written in C++ with SFML.
License: Mozilla Public License 2.0
A cross-platform portable open-source VSRG chart editor written in C++ with SFML.
License: Mozilla Public License 2.0
Lower priority as of now, but it would be nice to get an overview of which functions eats up the most performance every tick.
Most menubar buttons are just empty buttons which doesn't do anything, like "copy" and "paste". These need to be implemented
I think this editor could be perfect for touch screen users. maybe adding more visual interface such as scrolling through beat snap and selecting edit mode might be cool.
Also might want to scrap the idea of holding shift to place LN
Add functionality to parse and export stepmania files. This might require some rethinking in what modules should do what, since the stepmania file format already includes things such as beat division for notes.
On the topic of sm support, stepmania contains a note type called fakes which are genuinely fake taps. They are taps which you cannot hit and count for nothing. In notedata they are usually represented as F
This is not to be confused with a fake region which in sm/ssc timingdata basically means "a section of real taps/objects which cannot be hit because a warp or ssc fake region makes it impossible"
I'm not sure any other games have this note type.
BASS_ChannelBytes2Seconds
returns -1
when _StreamHandle
is 0. Outside here there is a new
.
Save the callstack to some kind of log file when the editor crashes. The stacktrace will have to be some form of crossplatform solution.
Implement functionality for selected notes to be mirrored
It's common knowledge that the audio encoding and decoding for the BASS audio library differs from others, thus creating compatibility issues between osu! and Stepmania charts. I think it's possible to combat this by using a different audio engine for Stepmania charts.
pressing random keys (shifts, f keys, etc) easily crashes the program
Implement a notification system.
Loading files with unicode currently crashes the editor. Investigate how we can support this format
This issue may not be exclusive to the osu songs folder, and may just happen with any folder that has a lot of stuff/osu files in it, but the editor will always crash upon trying to sort by modified. all of the other options dont seem to crash it (but appear to not do anything?), this issue only happens with the date modified option
running on windows, specs can be given if you need em
[ 2%] Building CXX object CMakeFiles/leraine-studio.dir/source/editing/base/edit-mode.cpp.obj
[ 5%] Building CXX object CMakeFiles/leraine-studio.dir/source/editing/bpm-edit-mode.cpp.obj
C:\Users\USER\Codes\leraine-studio\source\editing\bpm-edit-mode.cpp: In member function 'void BpmEditMode::DisplayBpmNode(BpmPoint&, int, int, bool)':
C:\Users\USER\Codes\leraine-studio\source\editing\bpm-edit-mode.cpp:253:37: warning: cast from 'BpmPoint*' to 'int' loses precision [-fpermissive]
253 | ImGui::Begin(std::to_string((int)&InBpmPoint).c_str(), &open, windowFlags);
| ^~~~~~~~~~~~~~~~
[ 7%] Building CXX object CMakeFiles/leraine-studio.dir/source/editing/note-edit-mode.cpp.obj
[ 10%] Building CXX object CMakeFiles/leraine-studio.dir/source/editing/select-edit-mode.cpp.obj
[ 12%] Building CXX object CMakeFiles/leraine-studio.dir/source/global/global-functions.cpp.obj
[ 15%] Building CXX object CMakeFiles/leraine-studio.dir/source/main.cpp.obj
[ 17%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/audio-module.cpp.obj
[ 20%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/background-module.cpp.obj
[ 22%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/base/module.cpp.obj
[ 25%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/beat-module.cpp.obj
[ 27%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/chart-parser-module.cpp.obj
[ 30%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/debug-module.cpp.obj
[ 32%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/dialog-module.cpp.obj
[ 35%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/edit-module.cpp.obj
[ 37%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/imgui-module.cpp.obj
[ 40%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/input-module.cpp.obj
[ 42%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/manager/module-manager.cpp.obj
[ 45%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/minimap-module.cpp.obj
[ 47%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/notification-module.cpp.obj
C:\Users\USER\Codes\leraine-studio\source\modules\notification-module.cpp: In member function 'virtual bool NotificationModule::Tick(const float&)':
C:\Users\USER\Codes\leraine-studio\source\modules\notification-module.cpp:27:41: warning: cast from 'NotificationMessage::Message*' to 'int' loses precision [-fpermissive]
27 | ImGui::Begin(std::to_string((int)&message).c_str(), &open, windowFlags);
| ^~~~~~~~~~~~~
[ 50%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/popup-module.cpp.obj
[ 52%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/shortcut-menu-module.cpp.obj
[ 55%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/timefield-render-module.cpp.obj
[ 57%] Building CXX object CMakeFiles/leraine-studio.dir/source/modules/waveform-module.cpp.obj
[ 60%] Building CXX object CMakeFiles/leraine-studio.dir/source/program/program-meta.cpp.obj
[ 62%] Building CXX object CMakeFiles/leraine-studio.dir/source/program/program.cpp.obj
[ 65%] Building CXX object CMakeFiles/leraine-studio.dir/source/structures/chart.cpp.obj
[ 67%] Building CXX object CMakeFiles/leraine-studio.dir/source/structures/configuration.cpp.obj
[ 70%] Building CXX object CMakeFiles/leraine-studio.dir/source/structures/notification-message.cpp.obj
[ 72%] Building CXX object CMakeFiles/leraine-studio.dir/source/structures/skin.cpp.obj
[ 75%] Building CXX object CMakeFiles/leraine-studio.dir/source/structures/timefield-render-graph.cpp.obj
[ 77%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguidock/imguidock.cpp.obj
[ 80%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguifilesystem/imguifilesystem.cpp.obj
[ 82%] Building C object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguifilesystem/minizip/ioapi.c.obj
[ 85%] Building C object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguifilesystem/minizip/unzip.c.obj
[ 87%] Building C object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguifilesystem/minizip/zip.c.obj
[ 90%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguilistview/imguilistview.cpp.obj
[ 92%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguistring/imguistring.cpp.obj
[ 95%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/addons/imguitoolbar/imguitoolbar.cpp.obj
[ 97%] Building CXX object CMakeFiles/leraine-studio.dir/source/utilities/imgui/std/imgui-stdlib.cpp.obj
[100%] Linking CXX executable ..\binaries\leraine-studio.exe
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x4fa): undefined reference to `__imp__ZTVN2sf14RectangleShapeE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x538): undefined reference to `__imp__ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x554): undefined reference to `__imp__ZN2sf13Transformable11setPositionEff'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x577): undefined reference to `__imp__ZN2sf14RectangleShape7setSizeERKNS_7Vector2IfEE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x599): undefined reference to `__imp__ZN2sf5ColorC1Ehhhh'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x5a5): undefined reference to `__imp__ZN2sf5Shape12setFillColorERKNS_5ColorE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x5ac): undefined reference to `__imp__ZN2sf12RenderStates7DefaultE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x5b8): undefined reference to `__imp__ZN2sf12RenderTarget4drawERKNS_8DrawableERKNS_12RenderStatesE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x5c6): undefined reference to `__imp__ZN2sf5ShapeD2Ev'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x889): undefined reference to `ImGui::SetNextWindowPos(ImVec2 const&, int, ImVec2 const&)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x9be): undefined reference to `ImGui::Begin(char const*, bool*, int)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0x9f7): undefined reference to `ImGui::Button(char const*, ImVec2 const&)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xa1f): undefined reference to `ImGui::SameLine(float, float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xa2b): undefined reference to `ImGui::Text(char const*, ...)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xa3b): undefined reference to `ImGui::SameLine(float, float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xa48): undefined reference to `ImGui::PushItemWidth(float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xa92): undefined reference to `ImGui::DragFloat(char const*, float*, float, float, float, char const*, int)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xac8): undefined reference to `ImGui::Button(char const*, ImVec2 const&)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xadf): undefined reference to `ImGui::SameLine(float, float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xaf7): undefined reference to `ImGui::Button(char const*, ImVec2 const&)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb03): undefined reference to `ImGui::End()'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb30): undefined reference to `ImGui::Button(char const*, ImVec2 const&)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb54): undefined reference to `ImGui::SameLine(float, float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb60): undefined reference to `ImGui::Text(char const*, ...)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb70): undefined reference to `ImGui::SameLine(float, float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xb7d): undefined reference to `ImGui::PushItemWidth(float)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xbc7): undefined reference to `ImGui::DragFloat(char const*, float*, float, float, float, char const*, int)'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xcee): undefined reference to `__imp__ZTVN2sf14RectangleShapeE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xd13): undefined reference to `__imp__ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xd64): undefined reference to `__imp__ZN2sf13Transformable11setPositionEff'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xd80): undefined reference to `__imp__ZN2sf14RectangleShape7setSizeERKNS_7Vector2IfEE'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xdad): undefined reference to `__imp__ZN2sf5ColorC1Ehhhh'
c:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\leraine-studio.dir/objects.a(bpm-edit-mode.cpp.obj):bpm-edit-mode.:(.text+0xdd7): undefined reference to `make[2]: *** Deleting file '../binaries/leraine-studio.exe'
make[2]: unlink: ../binaries/leraine-studio.exe: Permission denied
make[2]: *** [CMakeFiles\leraine-studio.dir\build.make:753: ../binaries/leraine-studio.exe] Interrupt
make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/leraine-studio.dir/all] Error 130
The linking error happens a lot longer. i interrupted it early
Public roadmap for what to expect for the next update!
Subject to change.
This update will mainly focus on bringing over Stepmania features and functionality for the editor. New controls will have to be implemented, the .sm file format will need to be supported and some systems will have to be slightly rewritten.
Stepmania related features:
Other unrelated minor or quality of life features could also be implemented, and will be displayed here.
If you have anything to add feel free to comment on this thread!
Implement a popup window which lists all shortcuts and respective keybindings
Right now it looks choppy, since it's basing its timepoint on a pixel transformed into a timepoint. We could maybe calculate the delta time somehow.
Maybe having folder system like the one on osu.
Would be cool if we can add a tool that can convert osu / sm skins into usable leraine skin ๐
The editor needs functionality to export a chart to file
Contains information about things that would not carry over if you import an .osu file (mainly hitsounds).
would also want to save the time they clicked "understood" since people would forget about them over time
Implement upscroll within the timefield-render-module. This will require some rewriting and additional settings for the config file
To store all preferences + recent files
On the topic of sm support, stepmania contains a note type called lifts which are notes that require you to lift or release when they reach the judge line. In notedata they are usually represented as L. It may be important to keep in mind that a lift is not related in any way to a hold.
Other games have this note type in the form of a hold release, if at all.
Update the linux branch to support all new features, will require some small rewrites.
CTRL+A should select all notes within the chart, although it's worth to mention, the rendering of selected notes is really slow, so that needs to be rewritten
In my view, the only thing useful in .vscode/setting.json is:
leraine-studio/.vscode/settings.json
Lines 3 to 12 in b0f3a63
While others are generated or are preferences for the programmer. The settings about CMake above should be computer dependent, not project dependent, though (except "PROJECT_NAME").
I suggest instructing the user to set "VCPKG_ROOT", "CMAKE_TOOLCHAIN_FILE" as their global configs, and use "set(PROJECT_NAME ...)" in CMakeLists.txt. "VCPKG_TARGET_TRIPLET" should be deprecated because VS Code can select a correct triplet according to our compiler configuration.
If Alt+Tab is used, the pop of Alt key won't be captured. Consider getting the state of Alt key once it is needed or capturing kill focus message.
Add support for an AV / DDream like control scheme
Setup pop-up window for creating a new chart, which includes all basic meta-data, asset paths and difficulty data
keyboard shortcuts for actions like Save, Export, Open, ect. The keybinds are already stated within the menubar buttons, but not implemented.
This will require us to add a new note type, which is similar to the "common" note type.
For example:
leraine-studio/source/program/program.cpp
Line 240 in 503ced9
Only here the UsePitch of AudioModule is modified. When the config file is load on the launch of the application, it is not applied to AudioModule. Note that there are other such options sharing the same problem.
Basically shifts everything - timing points and notes by a specific amount of ms like how Quaver has it in "Apply offset to map".
This will help with porting for many games (i.e. osu!mania maps use offset on time-stretched downrate while other StepMania and Quaver use offset on the pitched downrate) + will help with shifting offset on variable timing for the aforementioned osu!mania's offset norm as well.
std::filesystem is cool and we should support it to its fullest.
Fix all compiler warnings across GCC and MSVC. As of now we have a lot of compiler warnings related to type casting and value assignment. By fixing these warnings we could potentially prevent future bugs.
The current waveform is lackluster at best. We need to explore several areas:
The goal is to make something similar to the Arrow Vortex waveform.
Rolls are a hold note subtype in stepmania which require the player to continuously tap in order to keep the hold alive, rather than simply hold the note. In notedata, their head is represented by 4
and the tail is 3
I believe no other game has this note type, so (un)fortunately they should probably just be converted to regular holds in those cases.
The quaver file format uses yaml, so this will require looking up a good yaml parsing library
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.