Giter VIP home page Giter VIP logo

novelrt / novelrt Goto Github PK

View Code? Open in Web Editor NEW
181.0 15.0 43.0 21.08 MB

A cross-platform 2D game engine accompanied by a strong toolset for visual novels.

License: MIT License

CMake 2.54% C++ 91.24% Lua 0.12% GLSL 0.15% Shell 0.16% C 5.58% Dockerfile 0.10% HLSL 0.10% CSS 0.01%
c-plus-plus cross-platform engine game game-development game-engine visual-novel visual-novel-engine 2d 2d-game-engine

novelrt's Introduction

NovelRT

NovelRT is a cross-platform, flexible Visual Novel and 2D game engine. It is aimed at designers and developers alike, however many of the designer tools and features we have on our roadmap have yet to be implemented.

Latest Nightly Build

GitHub tag (latest by date)

Discord

Current Features

Currently, NovelRT supports the following in its base form:

  • Graphics LLAPI
  • Audio LLAPI

Future & Immediate Improvements

Current features in development include:

  • C++ HLAPI
  • Fabulist narrative scripting language support

For information on Fabulist, check it out from here.

Getting Started with NovelRT

Currently there are no binary distributions of the engine as of yet, and we are still in our early alpha for almost everything.

Dependencies

If you wish to attempt to build a basic visual novel with the existing C++ API, you must first install the following dependencies:

The dependencies that are handled by CMake that do not need to be manually installed are as follows:

  • Doxygen 1.8.17 (building docs)
  • GLFW 3.3.7
  • glm 0.9.9.9
  • gtest/gmock 1.11.0
  • libpng 1.6.35
  • libsndfile 1.1.0
  • Microsoft GSL 4.0.0
  • OneTBB 2021.5.0
  • OpenAL 1.21.1
  • spdlog 1.10.0

Build instructions

These instructions are based on the CMake build system generator. You can download the latest version here here.

If you are compiling on Linux, please note - we do not support GCC at this time. Please use Clang 10+ instead. We will gladly accept contributions towards making GCC compatible, but until support is guaranteed we will only officially support first-party compilers as described in our CI builds found here.

Linux

First, you must install the dependencies. On Ubuntu 20.04, it looks like this:

sudo apt install clang  libgl-dev xorg-dev libx11-xcb-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev \
libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev \
libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev libxcb-util-dev python \

If you are building from a command line terminal, clone NovelRT and set up the build folder like so:

git clone https://github.com/NovelRT/NovelRT.git
mkdir -p NovelRT/build
cd NovelRT/build

Then, you can configure and build using CMake, like so:

cmake ..
cmake --build . -j

Windows (x64 only)

Prerequisites:

  • Windows 10 x64
  • Either:
    • Visual Studio 2019 w/ "Desktop development with C++" Workload,
    • Visual Studio 2022 w/ "Desktop development with C++" Workload, OR
    • Build Tools for Visual Studio 2019/2022 w/ "Desktop development with C++" Workload
  • CMake 3.19 or above (note: Do not use the included one with Visual Studio at this time! It is outdated as of this time of writing and is considered incompatible.)
  • Python 3.11 or above

(32-bit builds will not be supported at this time.)

If you are building from a command line terminal, clone NovelRT and set up the build folder like so:

git clone https://github.com/NovelRT/NovelRT.git
cd NovelRT
mkdir build
cd build

Then, you can configure and build using CMake, like so:

cmake ..
cmake --build . -j
Visual studio 2019/2022 specific instructions

When you open the NovelRT folder in VS2019 or VS2022 for the first time the CMakeSettings.json file will contain incorrect values. Change the buildRoot value to ${projectDir}\\build and the installRoot to ${projectDir}\\install and restart Visual Studio this will make sure that it uses the same build path as the CLI commands. You can delete the out folder in the NovelRT root as well as we won't use it anymore. Then regenerate the cmake by clicking regenerate on the yellow warning ribbon on the top of Visual Studio.

macOS 10.15 (and above)

Prerequisites:

  • XCode 12
  • XCode Command Line Tools matching the installed version
  • CMake 3.19.8
  • Vulkan SDK 1.3.231.1
  • Python 3.11 or above

NOTE: Until native Metal support is introduced at a future time, it is required that you install Vulkan SDK version 1.3.231.1 as a prerequisite to configuring/building NovelRT. The instructions below will indicate directions assuming that the Vulkan SDK is already installed in a non-system path. If it is not installed, NovelRT's build system will fail to properly configure.

If you are building from a command line terminal, clone NovelRT and set up the build folder like so:

git clone https://github.com/NovelRT/NovelRT.git
mkdir -p NovelRT/build
cd NovelRT/build

Once you have cloned the repository, ensure that the terminal performing configuration of NovelRT runs the source setup-env.sh from within the Vulkan SDK directory.

If you have an Intel Mac you can configure the cmake files like so:

cmake ..

However, if you have Apple-Silicon Mac (M1, M2, etc), you must add an additional flag to the configuration command, like so:

cmake .. -DCMAKE_APPLE_SILICON_PROCESSOR="arm64"

If Vulkan SDK is not installed in a system path and the setup-env.sh file did not properly add the required environment variables, you can specify the VULKAN_SDK environment variable to your local Vulkan SDK location as such:

VULKAN_SDK=/Users/youruser/Vulkan SDK/1.3.231.1/macOS cmake .. 

Please ensure that the path includes the macOS folder, otherwise finding the proper libraries will fail.

Once NovelRT is configured, you can build it like so:

cmake --build . -j

To run the samples, you will need to navigate to the folder the executable resides in, and launch from there. This is due to how macOS and CMake handle's RPATHs.

Example

Examples will be placed here when we have created some. In the meantime, we advise asking us directly on our discord (invite URL above and below).

Contributing

First off, if you want to contribute, thanks!

If you would like to contribute to the development of NovelRT, please see our contribution guide here. If this doesn't answer any questions that you have, feel free to reach out to us on Discord to discuss what you can work on - we greatly appreciate it!

NovelRT and everyone contributing (this includes issues, pull requests, the wiki, Discord in all forms, etc.) must abide by our code of conduct, which can be found here. Instances of abuse, harrassment or otherwise unacceptable behaviour must either be reported to a NovelRT Developer via direct message on Discord or by contacting us via email.

Licence

Unless otherwise specified, all files are copyright © Matt Jones and Contributors. Licensed under the MIT Licence (MIT).

See LICENCE in the repository root for more information.

Questions?

You can reach us directly via our discord, or you can post your question as an issue on the appropriate repository (but honestly asking us directly might be easier).

novelrt's People

Contributors

actualdio avatar arkrait avatar banalityofseeking avatar banananaman91 avatar bjauny avatar capnkenny avatar chococookies131 avatar chrisdevchroma avatar deepakreddyvelagala avatar erlite avatar exadon avatar favna avatar finitereality avatar gnbrkm41 avatar goostuffeddoll avatar jeuxjeux20 avatar nihlus avatar nullsapphire avatar olegrevedzhuk avatar pheubel avatar quantumlyy avatar rubynova avatar ryadaproductions avatar sakshi-75 avatar shidesu avatar smyleface avatar tannergooding avatar thaumanovic avatar tylertron1998 avatar yukiivr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

novelrt's Issues

Implement clang-format stylesheet.

We need to get up and running on clang-format based on our current code style. Some stuff keeps passing in PRs when it shouldn't and really it'd be great to automate this with clang-format.

Add GCC support for sanitisation flags.

In a recent PR by @Nihlus (that I lazily merged after seeing someone else say LGTM), a set of sanitisation flags were added that work for older versions of GCC but not for anything newer than GCC 8 as far as I know. They are also incompatible with clang. Due to my mistake (and the fact I really don't have time to test GCC extensively right now) I have amended the offending flags for clang as that's our first and foremost priority in terms of compiler support, although its not in master yet. Once it is this ticket can be worked on.

This ticket is free for anyone to pick up should they wish to do so.

Question about NovelRT library api.

There are a few moments that I would like to resolve before continuing to wrap core api in C. Should we build the library as static or dynamic? And do we only provide C api for consuming or C++ as well?

Introduce built-in camera modes for NovelRT::Graphics::Camera?

As per #73 I have introduced the groundwork for supporting multiple camera view/projection view types.

Its a bit messy and needs cleaning up, but once its done we can look into this in further detail for Novel3D probably, I can't see them getting too much use out of it in the current state of the engine.

We can either remove it or try to implement it however I'm a bit "on the fence" about it, and would like other people's opinions.

Consider reordering members so private fields are at the top

Currently, the header files are declaring fields at the bottom of the class (which I believe is "standard" C++ practice).

This frequently leads to code like:

class MyClass {
public:
    inline int getValue() const;

private:
    int _value;
};

inline int MyClass::getValue() const {
    return _value;
}

Reordering these such that fields are at the top could simplify this greatly:

class MyClass {
private:
    int _value;
public:
    inline int getValue() const {
        return _value;
    }
};

Add NovelRT::TextureConfig type.

As the title suggests, I think it would be good to add a configurable texture type that houses all the relevant texture information as part of #56 .

This is primarily to allow us to create texture-coordinate-based effects amongst other things while also aiding with the instancing ticket.

It would also bring us more in-line with engines such as Unity3D that support this sort of behaviour out of the box.

Thoughts?

OpenGL Instancing.

Currently our approach to loading the same normalised data (upcoming in a WIP feature branch) is not that efficient. We need to instance the data onto the GPU ideally.

Implement Timestamp type

As discussed on Discord, a basic implementation would look like this:

  • You track a scene graph
  • Interactions can trigger events
  • External services (like a timer) can trigger events

This would be part of a central eventing API, as well as to avoid scenarios as below -

As referenced in the basic audio PR:

There is a subtle, but non obvious bug here that deals with floating-point values and timestamps in general. Namely around Frequency being significantly larger than the TicksPerSecond, which you've defined to be 1000. For example, on my box, Frequency is 10'000'000, which means that this has a risk of producing a really tiny result and incurring rounding error.

Originally posted by @tannergooding in #33

Add support for either Box2D or Bullet?

There has been many discussions about LLAPI supporting a variety of games.

To that end, I am wondering if we should provide physics support via Box2D or Bullet.

It would only be LLAPI though, as I have no intention of supporting physics in the HLAPI due to the nature of said HLAPI.

Thoughts?

Fix Intermittent Texture Failures on Linux

Currently, the text rendering PR introduces an intermittent bug where the rendering of textures (i.e. Novel-Chan in this case) fails. So far, it's only reproducing in LInux (specifically Ubuntu atm).

image

Add a relative positioning system.

We need a way to simplify calculating the positions of objects relative to other key points in the window. Specifically things such as the world space margins and probably other objects - essentially kind of like a "local space". It would mean yet another plane of space but it would resolve LLAPI positioning concerns raised by @tannergooding and it is something I was considering adding for the HLAPI anyway, so how we go about this is open for debate.

Remove needless const declarations.

As per a previous discussion with @tannergooding , the code style is being modified to not use the const modifier in places where pointers and references are not being used. Its a simple task however we have it in many locations right now, so may take a little while to actually fully do.

Implement font loading sharing.

As it stands, each text rect will load a font at a specified size irrespective if that font is already loaded in, even if it is the same size.

The proposal is to add some form of API to accommodate shared font loading between the text rects. This will probably involve abstracting font loading logic into a new type (name to be announced.

This will be coming relatively shortly and is something I will implement myself.

Window size does not auto-adjust to 3840 x 1080 correctly

When the engine starts, window size auto-adjusts to main screen size whilst not adjusting correctly to the resolution.

Expected to correctly display at screen resolution or Window size to be limited to display resolution.

Window size adjusts to 32:9 aspect ratio without the display adjusting to 3840 x 1080 resolution.

To reproduce, run project on 32:9 monitor at 3840 x 1080 resolution. Testing on other monitor resolutions advised.

NovelRTBug

Logging framework

We should probably think about proper logging for the runtime, as logging is incredibly important for projects of any size

AB#3

Audio Service needs rework

After discussion, the current implementation of the Audio Service does not meet the original specification as discussed/designed.

What was sought was for is a three-part system:

AudioService -> AudioChannel -> AudioSource

The Service would handle creation of channels, and the channel would handle creation of sources/files. This would also allow for manipulation of the channel as a whole, as well as channel grouping.

This will need to be done as well to help support additional Audio back-ends (i.e. XAudio, OpenAL-Soft) in the future.

Add helper for failure reponses from methods

Currently, we are checking against constants or magic numbers, especially when dealing with SDL-based calls. These should get wrapped in a helper method so that if they fail, we can handle them appropriately with logging.

As referenced in basic audio PR:

SDL_SUCCESS in particular seems like something that could be solved by a helper method. Namely something like ThrowIfFailed(MyFunc(args), "Error Message")

This would then check for success, log the error, and throw an exception.

Originally posted by @tannergooding in #33

Update the logic in StepTimer to account for scenarios where _frequency > TicksPerSecond

As called out on #34 (comment), the StepTimer can technically bug out if the hardware timer frequency is greater than the TicksPerSecond.

This is problematic because the math is using integer arithmetic and follows (counterDelta * TicksPerSecond) / _frequency, so if _frequency > TicksPerSecond you can end up getting "zero" as the tick delta.

A solution should be devised that takes this into account so that users still get the appropriate updates.

Update CMake with a more readable configuration for adding source files.

As per a discussion on PR #34 started by @tannergooding the CMake's source file handling is becoming a little unwieldy and unreadable. After the discussion the proposed solution is to do the following:

set (NOVELRT_SOURCES
 a.cpp
 b.cpp
 c.cpp
)

set (NOVELRT_HEADERS
  a.h
  b.h
  c.h
)

Followed by:

add_executable(NovelRT ${NOVELRT_SOURCES} ${NOVELRT_HEADERS})

This should help make it more readable.

Suggestion To Implement Node-based Editor

Why?

TL;DR

  • Low-entry for users who aren't familiar with coding
  • Better overview of branching dialogue
  • Can allow for a more cohesive UX*

Many games that contain a more complicated dialogue system use some kind of node-editor to visualize and editor dialogue.

Articy craft is a good example of a professional tool designed exactly for that. Used by Ubisoft, CD Projekt Red, EA, and many other professional studios.

image

This is how Articy Craft visualizes a dialogue. By using a node-editor and icons it makes it very intuitive for a user to create and edit dialogues.

A simpler version of this could look something like this:
image

*= The reason why this can allow for better UX is that you can allow the user to edit other data by selecting items/buttons inside of the node. An example would be the avatar. You could have a small edit button, double-tap, etc. to open up a window to change that character's data.

How?

It's completely up to the team on how to go about implementing something like this but I would like to pitch in my two cents on this.
It's important to avoid dependencies and keep editor code completely separate.
So I think ideally you would want to generate API code (Lua,Ink,etc.) using the node-editor.
The editor could even be a separate application by all means whilst generating scripts.
Really depends on how exactly you want things to work in tandem.

Refactor NovelRunner into Dispatcher/Application Model

In order to set up multi-threading as well as making it easier to develop future services, we should break NovelRunner apart, allowing NovelRT to have the following setup:

-- Application (Singleton, Exposes Services)
-- Various Services
-- Dispatcher (Per Thread, Runs the Event Pump)

Currently, NovelRunner does both of what the "Application" and the "Dispatcher" would do, and is not currently a singleton. This can pose many problems, as theoretically end users can create as many runners as they want, which would multiply the number of services per runner.

The suggested method of doing this, as per @tannergooding's comments in Discord, would be to:

  • Rename Runner to Application
    • It exposes a static getCurrent() method so anyone can retrieve services, etc
  • Break out the event loop logic into some kind of Dispatcher (or Runner) class
    • This allows you to queue/dispatch pending events
    • This is "per thread" and are created lazily

This would be a larger refactoring job, and may need to wait until other PRs are merged (logging, UBO, etc).

Add NovelRT::ShaderProgram type.

This type will purely exist to abstract OpenGL/DX/Vulkan from the engine core as shaders are now becoming more frequently passed around.

Modifying GeoVector to support GLM.

I'm unsure if this is even beneficial for us at this point but I've recently discovered GLM exists.

GLM is the official OpenGL maths library

Any thoughts on whether we should refactor to use it? Its probably faster than our own implementation but it may hurt our support for DX and Vulkan in the future.

Audio: Add Handle for loaded sound/music

For NovelAudioService::load()

It would be good if you gave back some kind of "opaque handle" that could be used instead of the file name. Basically just something that, for an already loaded sound, can be used to play a sound with O(1) (or really cheap) lookup.

For the overload that takes a name, you would effectively just have

auto soundHandle = loadSound(soundName);
playSound(soundHandle);

Originally posted by @tannergooding in #33

Create TextureRect type.

As per a discussion on #98 pointed out, our extensibility is a bit limited in certain places at the moment. To rectify this, it has been proposed we make a new TextureRect type that things such as ImageRect and, in the future, TextRect can inherit from.

This sould provide better granularity and customisation options for developers.

Configure Doxygen for CI/CD on AzDO.

As per the most recent PR (#75 ) for our CI/CD pipeline, Doxygen isn't actually working when used in our CI/CD setup currently.

We need to figure out how we get this functional and then figure out how to package it up SDK in the future.

Create new SoundBank type.

As described in #98 , a new type is required for handling audio instancing.

This will be a part of the new audio rework.

Mount CoreCLR for bi-directional bindings.

This ticket specifically lays out what is required for the .NET and Ink bindings.

We need to be able to essentially mount/host CoreCLR ourselves from inside the engine Unity style. There has been multiple discussions on why we wish to take this approach over just using extern C like we are for Rust and JS and then just P/Invoking in is because this will actively sacrifice universal Ink support. One of the main goals of this engine is to provide Ink to all of the language APIs universally. To see more about Ink, you can view it here: https://github.com/inkle/ink

The other main reason for hosting the CLR ourselves is because we can have communication both ways - as in, the engine core invokes C# code which can then come back into the engine core, much like how Unity approaches it.

The downside to this is, naturally, it will to be more work to implement, test, etc. This will probably require extensive tests once we have set up the google test suite (this is still on our TODO).

The other concern is without this, we can't actually make an alpha build of any kind as we planned to have C# and possibly Ink from the get-go in terms of the roadmap.

If there is a faster way to achieve this, you are welcome to suggest it here, however this is probably the best approach to my understanding.

AB#6

Basic Audio Implementation

AB#2

Requirements for a basic Audio Implementation (new SDL_Mixer v1):

Stuff needed:

  • Add SDL_mixer to project
  • Add music / sound
  • Play music / sound individually
  • Play music & sound together

should add CI

This project seems to have a lot of active changes and PRs. It makes sense to add a Continous Integration to the codebase to verify that PRs aren't breaking anything.

SDL2-Mixer external support broken

Due to (what seems to be) the newest update to the SDL2-mixer vcpkg files, adding in any modules for SDL2-Mixer besides core is broken on Windows. This is due to the bug resolving to .lib for every module which does not play nicely (i.e. using Vorbisfile results in a 0xc000012f error as it links to the library via .lib instead of .dll)

Until this is resolved, we can only support whatever formats SDL2 Mixer supports OOB.

For reference:
microsoft/vcpkg#8429

LoggingService API rework.

As pointed out in #98 , the logging service API restricts instantiation and usage in ways that violate the principle of "the runner owns all services".

We need to find a way to make this friendlier and to adhere to our codebase structure and service management.

Add API for deleting render objects from memory.

At the moment the only way for objects to be deleted is when the game is torn down.

Naturally this isn't very feasible long term. An API needs to be added to support deleting render objects on the fly.

Add support for reporting frame diagnostics

NovelRunner should be updated such that it can report frame diagnostics.

This should initially just track simple information like current FPS, the min/max FPS, average FPS, and total frame count.

However, it could also be extended to report additional information, like how many objects are rendered in the frame, the loaded shaders, and other information that may be useful for debugging.

The user can then request the frame diagnostic information and display it to the user or perform other suitable actions with it.

Remove usages of std::string_view in the LLAPI and engine core.

I keep running into problems in the engine core of going from a string view to const char* for the C-based APIs, specifically OpenGL, FreeType and SDL2.

It's a pain, and uneeded cost, to go from std::string_view to std::string followed by calling c_str(). We could call for the data pointer instead but that's nowhere near as safe as it might not be a null-terminated string in the view.

Thoughts?

Add Build instructions to README or Wiki page

Seeing as how we tend to have slight issues when it comes to having new contributors start building, we should probably write some steps to build NovelRT.

Included sections would be:

  • Prerequisites
  • Building using the automated build scripts
  • Building manually (without using build.cmd)

This could be added to a Wiki page, and then linked to the readme, or it could be just added directly to the readme.

[Proposal] renaming Novel* types without the prefix and using namespaces for engine related types.

Currently, we have a lot of types prefixed with Novel; see: NovelObject.cpp, NovelRenderingService.cpp, etc.

We use this to describe the fact that the type is core to the engine - but we could use namespaces instead.

This comes with some design considerations. What do we do for commonly named types, e.g. NovelObject - Object itself would be way too generic. Do we try to be consistent with all naming and just remove the prefix no matter the ambiguity? Do we do this selectively, considering if the type name would be descriptive enough without the prefix?

Filesystem Handling

Currently, launch issues can arise due to not having normalized paths for files that are used as input to the engine (i.e. the Basic and Texture shaders).

As per Ruby's suggestion, this could be resolved by a filesystem handling service or something of that nature, that would allow the engine core to properly find and open the files being called.
(Input is appreciated on this)

Move common rect arguments to a struct.

Where we're at right now

As it stands, the arguments the rendering service takes to create rects are a little...long. It makes maintenance a little cumbersome.

As an example, currently to instantiate an image rect the constructor looks like:

    NovelImageRect::NovelImageRect(NovelRenderingService* novelRenderer, const float screenScale, const GeoVector<float> &position, const std::string_view imageDir,
                                   const float rotation, const GeoVector<float>& scale, const int layer, const int orderInLayer)

but with a struct, this could be reduced to

NovelImageRect::NovelImageRect(NovelCommonArgs, std::string_view imageDir)

Opinions?

Glad should be bundled with the project instead of being pulled from vcpkg

At the moment, NovelRT utilizes Glad as a rendering layer and function loader, allowing it to access various OpenGL extensions and profiles in a unified manner.

However, Glad is being imported via vcpkg, which is orthogonal to the way Glad is designed to be used. By design, Glad generates a single source file and two header files, which are intended to be directly included in projects utilizing it. The files are generated to fit the needs of the project, in terms of which Khronos specification it uses, the version of the specification, the extensions it would like to have available, etc.

This presents itself as an issue in the following ways:

  • NovelRT does not have control over what OpenGL API it accesses, and is constrained to the one selected by the packager of Glad in vcpkg
  • NovelRT cannot be built without the use of vcpkg, since, by design, no distribution of Linux, Windows, or Mac has a system-level package available for Glad

Fixing this issue by directly generating and including Glad in NovelRT would allow building the project without the use of vcpkg, and let NovelRT define exactly which extensions and what OpenGL version it requires.

See the following links for information about Glad, and its intended use.

Introduce Mac OS X to CI

With the oncoming changes to macOS (namely dropping OpenGL), we will need to wait until Vulkan support is brought into the engine to support macOS Catalina and above. With that being said, we can currently support macOS / Mac OS X variants below as certain Macs (around 2010+) come with OpenGL 4.1 built in.

We should add a Microsoft-hosted build agent to allow the CI to test against Mac builds as well. This allows us to test our code against Macs to ensure our code won't break if an end user is trying to use a Mac instead of Linux or Windows.

[Proposal] Asset Database

Currently, we have no implementation for an asset loading/registering system. This is useful for many different things, and also relates to #24 - an asset database would be nice for loading and resolving of types.

Example: (C# due to my inexperience with C++)

var brickTexture = await AssetDatabase["textures"].GetAsync("brick.png");

We could also implement special folder handling. Like the above example, to register a special folder for "textures" it could be:

AssetDatabase.RegisterSpecialFolder("textures", "./Textures", createFolder: true);

This would allow for flexibility and some abstraction for user end assets over the file system proposal.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.