CMake Build System (#4) and some code form the old codebase

* added test game, moved engine projects under "shadow" folder

* More work on build files

* fix git ignore

* working game folder setup

* Work on game rule

* [SYNC] work on the shadow engine rule

* [SYNC] Added wrapper c sript

* Work on wrapper

* Working wrapper

* Add Vulkan sdk rules

* First working build using the CMake toolchain

* updates

* fix tests

* remove .clwb

Co-authored-by: dpeter99 <dpeter99@gmail.com>
This commit is contained in:
Curle 2022-07-19 18:34:21 +01:00 committed by GitHub
parent 66d8618e4e
commit 3bf44e8985
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 18874 additions and 360 deletions

View File

View File

@ -1,17 +0,0 @@
directories:
# Add the directories you want added as source here
# By default, we've added your entire workspace ('.')
.
# Automatically includes all relevant targets under the 'directories' above
derive_targets_from_directories: true
targets:
# If source code isn't resolving, add additional targets that compile it here
additional_languages:
# Uncomment any additional languages you want supported
# dart
# javascript
# python
# typescript

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.system.id="Blaze" type="BLAZE_CPP_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../..">
<excludeFolder url="file://$MODULE_DIR$/../../.idea" />
<excludeFolder url="file://$MODULE_DIR$/.." />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.system.id="Blaze" type="BLAZE_CPP_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../../..">
<sourceFolder url="file://$MODULE_DIR$/../../.." isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/../../../bazel-bin" />
<excludeFolder url="file://$MODULE_DIR$/../../../bazel-genfiles" />
<excludeFolder url="file://$MODULE_DIR$/../../../bazel-out" />
<excludeFolder url="file://$MODULE_DIR$/../../../bazel-testlogs" />
<excludeFolder url="file://$MODULE_DIR$/../../../bazel-umbra" />
<excludeFolder url="file://$MODULE_DIR$/../.." />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1 +0,0 @@
umbra

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.blaze/modules/.project-data-dir.iml" filepath="$PROJECT_DIR$/.blaze/modules/.project-data-dir.iml" />
<module fileurl="file://$PROJECT_DIR$/.blaze/modules/.workspace.iml" filepath="$PROJECT_DIR$/.blaze/modules/.workspace.iml" />
</modules>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

4
.gitignore vendored
View File

@ -4,7 +4,7 @@ obj/
riderModule.iml riderModule.iml
/_ReSharper.Caches/ /_ReSharper.Caches/
*.user
bazel-*/
test-results test-results
/cmake-build-vs-debug/
/.idea/

40
CMakeLists.txt Normal file
View File

@ -0,0 +1,40 @@
cmake_minimum_required(VERSION 3.22)
Include(FetchContent)
# Fetch SDL for the runtime
FetchContent_Declare(
SDL2
URL https://www.libsdl.org/release/SDL2-devel-2.0.22-VC.zip
)
FetchContent_MakeAvailable(SDL2)
set(SDL2_PATH ${sdl2_SOURCE_DIR})
# Fetch Catch2 for the file format tests
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v2.13.9 # or a later release
)
FetchContent_MakeAvailable(Catch2)
# Import some find files
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
project(umbra)
# Common utilities
add_subdirectory(projs/shadow/shadow-utility)
# Asset management
add_subdirectory(projs/shadow/shadow-file-format)
# Reflection
add_subdirectory(projs/shadow/shadow-reflection)
# Core engine
add_subdirectory(projs/shadow/shadow-engine)
# Runtime executable
add_subdirectory(projs/shadow/shadow-runtime)

View File

@ -1,7 +0,0 @@
workspace(
name = "umbra",
)
load("//vendor:deps.bzl", "deps")
deps()

388
cmake/FindSDL2.cmake Normal file
View File

@ -0,0 +1,388 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Copyright 2019 Amine Ben Hassouna <amine.benhassouna@gmail.com>
# Copyright 2000-2019 Kitware, Inc. and Contributors
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Kitware, Inc. nor the names of Contributors
# may be used to endorse or promote products derived from this
# software without specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#[=======================================================================[.rst:
FindSDL2
--------
Locate SDL2 library
This module defines the following 'IMPORTED' targets:
::
SDL2::Core
The SDL2 library, if found.
Libraries should link to SDL2::Core
SDL2::Main
The SDL2main library, if found.
Applications should link to SDL2::Main instead of SDL2::Core
This module will set the following variables in your project:
::
SDL2_LIBRARIES, the name of the library to link against
SDL2_INCLUDE_DIRS, where to find SDL.h
SDL2_FOUND, if false, do not try to link to SDL2
SDL2MAIN_FOUND, if false, do not try to link to SDL2main
SDL2_VERSION_STRING, human-readable string containing the version of SDL2
This module responds to the following cache variables:
::
SDL2_PATH
Set a custom SDL2 Library path (default: empty)
SDL2_NO_DEFAULT_PATH
Disable search SDL2 Library in default path.
If SDL2_PATH (default: ON)
Else (default: OFF)
SDL2_INCLUDE_DIR
SDL2 headers path.
SDL2_LIBRARY
SDL2 Library (.dll, .so, .a, etc) path.
SDL2MAIN_LIBRAY
SDL2main Library (.a) path.
SDL2_BUILDING_LIBRARY
This flag is useful only when linking to SDL2_LIBRARIES insead of
SDL2::Main. It is required only when building a library that links to
SDL2_LIBRARIES, because only applications need main() (No need to also
link to SDL2main).
If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES
and no SDL2::Main target will be created.
Don't forget to include SDLmain.h and SDLmain.m in your project for the
OS X framework based version. (Other versions link to -lSDL2main which
this module will try to find on your behalf.) Also for OS X, this
module will automatically add the -framework Cocoa on your behalf.
Additional Note: If you see an empty SDL2_LIBRARY in your project
configuration, it means CMake did not find your SDL2 library
(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point
to your SDL2 library, and configure again. Similarly, if you see an
empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These
values are used to generate the final SDL2_LIBRARIES variable and the
SDL2::Core and SDL2::Main targets, but when these values are unset,
SDL2_LIBRARIES, SDL2::Core and SDL2::Main does not get created.
$SDL2DIR is an environment variable that would correspond to the
./configure --prefix=$SDL2DIR used in building SDL2. l.e.galup 9-20-02
Created by Amine Ben Hassouna:
Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake).
Add cache variables for more flexibility:
SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above).
Mark 'Threads' as a required dependency for non-OSX systems.
Modernize the FindSDL2.cmake module by creating specific targets:
SDL2::Core and SDL2::Main (for details, see doc above).
Original FindSDL.cmake module:
Modified by Eric Wing. Added code to assist with automated building
by using environmental variables and providing a more
controlled/consistent search behavior. Added new modifications to
recognize OS X frameworks and additional Unix paths (FreeBSD, etc).
Also corrected the header search path to follow "proper" SDL
guidelines. Added a search for SDLmain which is needed by some
platforms. Added a search for threads which is needed by some
platforms. Added needed compile switches for MinGW.
On OSX, this will prefer the Framework version (if found) over others.
People will have to manually change the cache value of SDL2_LIBRARY to
override this selection or set the SDL2_PATH variable or the CMake
environment CMAKE_INCLUDE_PATH to modify the search paths.
Note that the header path has changed from SDL/SDL.h to just SDL.h
This needed to change because "proper" SDL convention is #include
"SDL.h", not <SDL/SDL.h>. This is done for portability reasons
because not all systems place things in SDL/ (see FreeBSD).
#]=======================================================================]
# Define options for searching SDL2 Library in a custom path
set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path")
set(_SDL2_NO_DEFAULT_PATH OFF)
if(SDL2_PATH)
set(_SDL2_NO_DEFAULT_PATH ON)
endif()
set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH}
CACHE BOOL "Disable search SDL2 Library in default path")
unset(_SDL2_NO_DEFAULT_PATH)
set(SDL2_NO_DEFAULT_PATH_CMD)
if(SDL2_NO_DEFAULT_PATH)
set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH)
endif()
# Search for the SDL2 include directory
find_path(SDL2_INCLUDE_DIR SDL.h
HINTS
ENV SDL2DIR
${SDL2_NO_DEFAULT_PATH_CMD}
PATH_SUFFIXES SDL2
# path suffixes to search inside ENV{SDL2DIR}
include/SDL2 include
PATHS ${SDL2_PATH}
DOC "Where the SDL2 headers can be found"
)
set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(VC_LIB_PATH_SUFFIX lib/x64)
else()
set(VC_LIB_PATH_SUFFIX lib/x86)
endif()
# SDL-2.0 is the name used by FreeBSD ports...
# don't confuse it for the version number.
find_library(SDL2_LIBRARY
NAMES SDL2 SDL-2.0
HINTS
ENV SDL2DIR
${SDL2_NO_DEFAULT_PATH_CMD}
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
PATHS ${SDL2_PATH}
DOC "Where the SDL2 Library can be found"
)
set(SDL2_LIBRARIES "${SDL2_LIBRARY}")
if(NOT SDL2_BUILDING_LIBRARY)
if(NOT SDL2_INCLUDE_DIR MATCHES ".framework")
# Non-OS X framework versions expect you to also dynamically link to
# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
# seem to provide SDL2main for compatibility even though they don't
# necessarily need it.
if(SDL2_PATH)
set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}")
endif()
if(NOT SDL2_NO_DEFAULT_PATH)
set(SDL2MAIN_LIBRARY_PATHS
/sw
/opt/local
/opt/csw
/opt
"${SDL2MAIN_LIBRARY_PATHS}"
)
endif()
find_library(SDL2MAIN_LIBRARY
NAMES SDL2main
HINTS
ENV SDL2DIR
${SDL2_NO_DEFAULT_PATH_CMD}
PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
PATHS ${SDL2MAIN_LIBRARY_PATHS}
DOC "Where the SDL2main library can be found"
)
unset(SDL2MAIN_LIBRARY_PATHS)
endif()
endif()
# SDL2 may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
if(NOT APPLE)
find_package(Threads QUIET)
if(NOT Threads_FOUND)
set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).")
if(SDL2_FIND_REQUIRED)
message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND})
else()
if(NOT SDL2_FIND_QUIETLY)
message(STATUS ${SDL2_THREADS_NOT_FOUND})
endif()
return()
endif()
unset(SDL2_THREADS_NOT_FOUND)
endif()
endif()
# MinGW needs an additional link flag, -mwindows
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows
if(MINGW)
set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW")
endif()
if(SDL2_LIBRARY)
# For SDL2main
if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX)
if(_SDL2_MAIN_INDEX EQUAL -1)
set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES})
endif()
unset(_SDL2_MAIN_INDEX)
endif()
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
# CMake doesn't display the -framework Cocoa string in the UI even
# though it actually is there if I modify a pre-used variable.
# I think it has something to do with the CACHE STRING.
# So I use a temporary variable until the end so I can set the
# "real" variable in one-shot.
if(APPLE)
set(SDL2_LIBRARIES ${SDL2_LIBRARIES} -framework Cocoa)
endif()
# For threads, as mentioned Apple doesn't need this.
# In fact, there seems to be a problem if I used the Threads package
# and try using this line, so I'm just skipping it entirely for OS X.
if(NOT APPLE)
set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
endif()
# For MinGW library
if(MINGW)
set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES})
endif()
endif()
# Read SDL2 version
if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$")
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$")
string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}")
string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}")
set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH})
unset(SDL2_VERSION_MAJOR_LINE)
unset(SDL2_VERSION_MINOR_LINE)
unset(SDL2_VERSION_PATCH_LINE)
unset(SDL2_VERSION_MAJOR)
unset(SDL2_VERSION_MINOR)
unset(SDL2_VERSION_PATCH)
endif()
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR
VERSION_VAR SDL2_VERSION_STRING)
if(SDL2MAIN_LIBRARY)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main
REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR
VERSION_VAR SDL2_VERSION_STRING)
endif()
mark_as_advanced(SDL2_PATH
SDL2_NO_DEFAULT_PATH
SDL2_LIBRARY
SDL2MAIN_LIBRARY
SDL2_INCLUDE_DIR
SDL2_BUILDING_LIBRARY)
# SDL2:: targets (SDL2::Core and SDL2::Main)
if(SDL2_FOUND)
# SDL2::Core target
if(SDL2_LIBRARY AND NOT TARGET SDL2::Core)
add_library(SDL2::Core UNKNOWN IMPORTED)
set_target_properties(SDL2::Core PROPERTIES
IMPORTED_LOCATION "${SDL2_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}")
if(APPLE)
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
# For more details, please see above.
set_property(TARGET SDL2::Core APPEND PROPERTY
INTERFACE_LINK_OPTIONS -framework Cocoa)
else()
# For threads, as mentioned Apple doesn't need this.
# For more details, please see above.
set_property(TARGET SDL2::Core APPEND PROPERTY
INTERFACE_LINK_LIBRARIES Threads::Threads)
endif()
endif()
# SDL2::Main target
# Applications should link to SDL2::Main instead of SDL2::Core
# For more details, please see above.
if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::Main)
if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY)
add_library(SDL2::Main INTERFACE IMPORTED)
set_property(TARGET SDL2::Main PROPERTY
INTERFACE_LINK_LIBRARIES SDL2::Core)
elseif(SDL2MAIN_LIBRARY)
# MinGW requires that the mingw32 library is specified before the
# libSDL2main.a static library when linking.
# The SDL2::MainInternal target is used internally to make sure that
# CMake respects this condition.
add_library(SDL2::MainInternal UNKNOWN IMPORTED)
set_property(TARGET SDL2::MainInternal PROPERTY
IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}")
set_property(TARGET SDL2::MainInternal PROPERTY
INTERFACE_LINK_LIBRARIES SDL2::Core)
add_library(SDL2::Main INTERFACE IMPORTED)
if(MINGW)
# MinGW needs an additional link flag '-mwindows' and link to mingw32
set_property(TARGET SDL2::Main PROPERTY
INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows")
endif()
set_property(TARGET SDL2::Main APPEND PROPERTY
INTERFACE_LINK_LIBRARIES SDL2::MainInternal)
endif()
endif()
endif()

View File

@ -1,17 +0,0 @@
cc_library(
name = "shadow-engine",
srcs = glob(["src/**/*.cpp", "src/**/*.h"]),
hdrs = glob(["src/**/*.h"]),
strip_include_prefix = "src/",
includes = [],
copts = [
"/std:c++20"
],
deps = [
"//projs/shadow-utility",
"@sdl2"
],
visibility = ["//visibility:public"],
)

View File

@ -1,61 +0,0 @@
#include <iostream>
#include <SDL.h>
#include <glm.hpp>
// You must include the command line parameters for your main function to be recognized by SDL
int main(int argc, char** args) {
// Pointers to our window and surface
SDL_Surface* winSurface = NULL;
SDL_Window* window = NULL;
// Initialize SDL. SDL_Init will return -1 if it fails.
if ( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) {
std::cout << "Error initializing SDL: " << SDL_GetError() << std::endl;
system("pause");
// End the program
return 1;
}
// Create our window
window = SDL_CreateWindow( "Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 720, SDL_WINDOW_SHOWN );
// Make sure creating the window succeeded
if ( !window ) {
std::cout << "Error creating window: " << SDL_GetError() << std::endl;
system("pause");
// End the program
return 1;
}
// Get the surface from the window
winSurface = SDL_GetWindowSurface( window );
// Make sure getting the surface succeeded
if ( !winSurface ) {
std::cout << "Error getting surface: " << SDL_GetError() << std::endl;
system("pause");
// End the program
return 1;
}
// Fill the window with a white rectangle
SDL_FillRect( winSurface, NULL, SDL_MapRGB( winSurface->format, 255, 255, 255 ) );
// Update the window display
SDL_UpdateWindowSurface( window );
// Wait
system("pause");
// Destroy the window. This will also destroy the surface
SDL_DestroyWindow( window );
// Quit SDL
SDL_Quit();
// End the program
return 0;
}

View File

@ -1,31 +0,0 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_library(
name = "shadow-file-format",
srcs = glob(["src/**/*.cpp", "src/**/*.h"]),
hdrs = glob(["src/**/*.h"]),
strip_include_prefix = "src/",
includes = [],
copts = [
"/std:c++17"
],
deps = [
"//projs/shadow-utility"
],
visibility = ["//visibility:public"],
)
cc_test(
name = "test",
srcs = glob(["test/**/*.cpp", "test/**/*.h"]),
includes = [],
defines = [ "CATCH_CONFIG_MAIN" ],
copts = [
"/std:c++17"
],
deps = [
"//projs/shadow-file-format",
"@catch2"
],
)

View File

@ -1,16 +0,0 @@
cc_binary(
name = "shadow-runtime",
srcs = glob(["src/**/*.cpp", "src/**/*.h"]),
includes = [],
copts = [
"/std:c++20"
],
deps = [
"//projs/shadow-engine",
"@sdl2"
],
)

View File

@ -1,8 +0,0 @@
//
// Created by dpete on 2022-06-20.
//
#ifndef UMBRA_MAIN_H
#define UMBRA_MAIN_H
#endif //UMBRA_MAIN_H

View File

@ -1,15 +0,0 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
cc_library(
name = "shadow-utility",
srcs = glob(["**/*.cpp", "**/*.h"]),
hdrs = glob(["**/*.h"]),
strip_include_prefix = "src/",
includes = [],
copts = [
"/std:c++20"
],
deps = [
],
visibility = ["//visibility:public"],
)

View File

@ -0,0 +1,12 @@
find_package(Vulkan REQUIRED)
find_package(SDL2 REQUIRED)
set(CMAKE_CXX_STANDARD 20)
FILE(GLOB_RECURSE SOURCES src/*.cpp)
FILE(GLOB_RECURSE HEADERS src/*.h)
add_library(shadow-engine ${SOURCES})
target_include_directories(shadow-engine PRIVATE ${SDL2_INCLUDE_DIRS} PUBLIC ${HEADERS})
target_link_libraries(shadow-engine PRIVATE Vulkan::Vulkan PUBLIC SDL2::Core shadow-reflect shadow-asset)

View File

@ -0,0 +1,8 @@
//
// Created by dpete on 2022-07-06.
//
#include "Module.h"
namespace ShadowEngine {
} // ShadowEngine

View File

@ -0,0 +1,52 @@
#ifndef UMBRA_MODULE_H
#define UMBRA_MODULE_H
#include "../../../shadow-reflection/src/SHObject.h"
namespace ShadowEngine {
/// <summary>
/// ShadowModules are the base of the engine. They add core abilities.
/// </summary>
class Module : public SHObject
{
SHObject_Base(Module)
public:
/// <summary>
/// Pre Init is called when the module is added to the engine
/// </summary>
virtual void PreInit() = 0;
/// <summary>
/// Init is called after all the modules are added
/// </summary>
virtual void Init() = 0;
/// <summary>
/// update is called each frame
/// </summary>
virtual void Update() = 0;
virtual void Render() = 0;
virtual void LateRender() = 0;
virtual void AfterFrameEnd() {};
/// <summary>
/// Returns the name of the module
/// </summary>
/// <returns></returns>
virtual std::string GetName() = 0;
Module();
virtual ~Module();
};
} // ShadowEngine
#endif //UMBRA_MODULE_H

View File

@ -0,0 +1,5 @@
//
// Created by dpete on 2022-07-06.
//
#include "ModuleManager.h"

View File

@ -0,0 +1,51 @@
#ifndef UMBRA_MODULEMANAGER_H
#define UMBRA_MODULEMANAGER_H
#include <memory>
#include <list>
#include "Module.h"
namespace ShadowEngine {
class ModuleRef{
std::unique_ptr<Module> module;
std::string domain;
};
class ModuleManager {
public:
static ModuleManager *instance;
std::list<ModuleRef> modules;
ModuleManager();
~ModuleManager();
void PushModule(Module *module);
Module &GetModule(std::string name);
template<typename T>
T *GetModuleByType() {
for (auto &module: modules) {
if (module->GetTypeId() == T::TypeId())
return dynamic_cast<T *>(module.get());
}
//SH_CORE_ERROR("Can't find the module {0}", T::Type());
return nullptr;
}
void Init();
void Update();
void LateRender();
void Render();
void AfterFrameEnd();
};
}
#endif //UMBRA_MODULEMANAGER_H

View File

@ -2,8 +2,6 @@
#include "Time.h" #include "Time.h"
#include <string>
namespace ShadowEngine { namespace ShadowEngine {
ShadowApplication* ShadowApplication::instance = nullptr; ShadowApplication* ShadowApplication::instance = nullptr;
@ -21,10 +19,13 @@ namespace ShadowEngine {
{ {
this->no_gui = true; this->no_gui = true;
} }
if(param == "-game")
{
this->game = argv[i+1];
}
} }
} }
//game = _setupFunc(); //game = _setupFunc();
} }
@ -69,8 +70,14 @@ namespace ShadowEngine {
void ShadowApplication::Start() void ShadowApplication::Start()
{ {
SDL_Event event;
while (running) while (running)
{ {
while (SDL_PollEvent(&event)) { // poll until all events are handled!
if (event.type == SDL_QUIT)
running = false;
}
Time::UpdateTime(); Time::UpdateTime();
} }
} }

View File

@ -1,6 +1,8 @@
#pragma once #pragma once
#include "ShadowWindow.h" #include "ShadowWindow.h"
#include <string>
namespace ShadowEngine { namespace ShadowEngine {
/// <summary> /// <summary>
@ -31,6 +33,8 @@ namespace ShadowEngine {
bool no_gui = false; bool no_gui = false;
std::string game = "";
public: public:
/// <summary> /// <summary>
/// Default constructor /// Default constructor

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL.h>
class ShadowWindow class ShadowWindow
{ {

View File

@ -0,0 +1,20 @@
set(CMAKE_CXX_STANDARD 20)
# Set up Catch2 testing
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
enable_testing()
# Set up asset sourceset
FILE(GLOB_RECURSE SOURCES src/*.cpp src/*.h)
FILE(GLOB_RECURSE TESTS test/*.cpp)
add_library(shadow-asset ${SOURCES})
# Set up test executable
add_executable(shadow-asset-test ${TESTS})
target_link_libraries(shadow-asset-test PRIVATE Catch2::Catch2 shadow-utils)
# Enable testing on the executable
include(CTest)
include(Catch)
catch_discover_tests(shadow-asset-test)

View File

@ -0,0 +1,90 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#-----------------------------------------------------------------------------
function(catch_discover_tests TARGET)
cmake_parse_arguments(
""
""
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;REPORTER;OUTPUT_DIR;OUTPUT_PREFIX;OUTPUT_SUFFIX"
"TEST_SPEC;EXTRA_ARGS;PROPERTIES"
${ARGN}
)
if(NOT _WORKING_DIRECTORY)
set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
endif()
if(NOT _TEST_LIST)
set(_TEST_LIST ${TARGET}_TESTS)
endif()
## Generate a unique name based on the extra arguments
string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS} ${_REPORTER} ${_OUTPUT_DIR} ${_OUTPUT_PREFIX} ${_OUTPUT_SUFFIX}")
string(SUBSTRING ${args_hash} 0 7 args_hash)
# Define rule to generate test list for aforementioned test executable
set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake")
set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake")
get_property(crosscompiling_emulator
TARGET ${TARGET}
PROPERTY CROSSCOMPILING_EMULATOR
)
add_custom_command(
TARGET ${TARGET} POST_BUILD
BYPRODUCTS "${ctest_tests_file}"
COMMAND "${CMAKE_COMMAND}"
-D "TEST_TARGET=${TARGET}"
-D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
-D "TEST_EXECUTOR=${crosscompiling_emulator}"
-D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
-D "TEST_SPEC=${_TEST_SPEC}"
-D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
-D "TEST_PROPERTIES=${_PROPERTIES}"
-D "TEST_PREFIX=${_TEST_PREFIX}"
-D "TEST_SUFFIX=${_TEST_SUFFIX}"
-D "TEST_LIST=${_TEST_LIST}"
-D "TEST_REPORTER=${_REPORTER}"
-D "TEST_OUTPUT_DIR=${_OUTPUT_DIR}"
-D "TEST_OUTPUT_PREFIX=${_OUTPUT_PREFIX}"
-D "TEST_OUTPUT_SUFFIX=${_OUTPUT_SUFFIX}"
-D "CTEST_FILE=${ctest_tests_file}"
-P "${_CATCH_DISCOVER_TESTS_SCRIPT}"
VERBATIM
)
file(WRITE "${ctest_include_file}"
"if(EXISTS \"${ctest_tests_file}\")\n"
" include(\"${ctest_tests_file}\")\n"
"else()\n"
" add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n"
"endif()\n"
)
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
# Add discovered tests to directory TEST_INCLUDE_FILES
set_property(DIRECTORY
APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}"
)
else()
# Add discovered tests as directory TEST_INCLUDE_FILE if possible
get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET)
if (NOT ${test_include_file_set})
set_property(DIRECTORY
PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}"
)
else()
message(FATAL_ERROR
"Cannot set more than one TEST_INCLUDE_FILE"
)
endif()
endif()
endfunction()
###############################################################################
set(_CATCH_DISCOVER_TESTS_SCRIPT
${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake
CACHE INTERNAL "Catch2 full path to CatchAddTests.cmake helper file"
)

View File

@ -0,0 +1,135 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
set(prefix "${TEST_PREFIX}")
set(suffix "${TEST_SUFFIX}")
set(spec ${TEST_SPEC})
set(extra_args ${TEST_EXTRA_ARGS})
set(properties ${TEST_PROPERTIES})
set(reporter ${TEST_REPORTER})
set(output_dir ${TEST_OUTPUT_DIR})
set(output_prefix ${TEST_OUTPUT_PREFIX})
set(output_suffix ${TEST_OUTPUT_SUFFIX})
set(script)
set(suite)
set(tests)
function(add_command NAME)
set(_args "")
# use ARGV* instead of ARGN, because ARGN splits arrays into multiple arguments
math(EXPR _last_arg ${ARGC}-1)
foreach(_n RANGE 1 ${_last_arg})
set(_arg "${ARGV${_n}}")
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument
else()
set(_args "${_args} ${_arg}")
endif()
endforeach()
set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
endfunction()
# Run test executable to get list of available tests
if(NOT EXISTS "${TEST_EXECUTABLE}")
message(FATAL_ERROR
"Specified test executable '${TEST_EXECUTABLE}' does not exist"
)
endif()
execute_process(
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only
OUTPUT_VARIABLE output
RESULT_VARIABLE result
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
)
# Catch --list-test-names-only reports the number of tests, so 0 is... surprising
if(${result} EQUAL 0)
message(WARNING
"Test executable '${TEST_EXECUTABLE}' contains no tests!\n"
)
elseif(${result} LESS 0)
message(FATAL_ERROR
"Error running test executable '${TEST_EXECUTABLE}':\n"
" Result: ${result}\n"
" Output: ${output}\n"
)
endif()
string(REPLACE "\n" ";" output "${output}")
# Run test executable to get list of available reporters
execute_process(
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-reporters
OUTPUT_VARIABLE reporters_output
RESULT_VARIABLE reporters_result
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
)
if(${reporters_result} EQUAL 0)
message(WARNING
"Test executable '${TEST_EXECUTABLE}' contains no reporters!\n"
)
elseif(${reporters_result} LESS 0)
message(FATAL_ERROR
"Error running test executable '${TEST_EXECUTABLE}':\n"
" Result: ${reporters_result}\n"
" Output: ${reporters_output}\n"
)
endif()
string(FIND "${reporters_output}" "${reporter}" reporter_is_valid)
if(reporter AND ${reporter_is_valid} EQUAL -1)
message(FATAL_ERROR
"\"${reporter}\" is not a valid reporter!\n"
)
endif()
# Prepare reporter
if(reporter)
set(reporter_arg "--reporter ${reporter}")
endif()
# Prepare output dir
if(output_dir AND NOT IS_ABSOLUTE ${output_dir})
set(output_dir "${TEST_WORKING_DIR}/${output_dir}")
if(NOT EXISTS ${output_dir})
file(MAKE_DIRECTORY ${output_dir})
endif()
endif()
# Parse output
foreach(line ${output})
set(../test ${line})
# Escape characters in test case names that would be parsed by Catch2
set(test_name ${test})
#foreach(char , [ ])
#string(REPLACE ${char} "\\${char}" test_name ${test_name})
#endforeach(char)
# ...add output dir
if(output_dir)
string(REGEX REPLACE "[^A-Za-z0-9_]" "_" test_name_clean ${test_name})
set(output_dir_arg "--out ${output_dir}/${output_prefix}${test_name_clean}${output_suffix}")
endif()
# ...and add to script
add_command(add_test
"${prefix}${test}${suffix}"
${TEST_EXECUTOR}
"${TEST_EXECUTABLE}"
"${test_name}"
${extra_args}
"${reporter_arg}"
"${output_dir_arg}"
)
add_command(set_tests_properties
"${prefix}${test}${suffix}"
PROPERTIES
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
${properties}
)
list(APPEND tests "${prefix}${test}${suffix}")
endforeach()
# Create a list of all discovered tests, which users may use to e.g. set
# properties on the tests
add_command(set ${TEST_LIST} ${tests})
# Write CTest script
file(WRITE "${CTEST_FILE}" "${script}")

View File

@ -1,9 +1,8 @@
#include "SFFParser.h" #include "SFFParser.h"
#include "../../shadow-utility/src/string-helpers.h"
#include <fstream> #include <fstream>
#include "string-helpers.h"
namespace Shadow::SFF { namespace Shadow::SFF {
SFFElement* SFFParser::ReadFromStream(std::istream& stream) SFFElement* SFFParser::ReadFromStream(std::istream& stream)

View File

@ -1,3 +1,4 @@
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp> #include <catch2/catch.hpp>
TEST_CASE("15 is less than 20", "[numbers]") { TEST_CASE("15 is less than 20", "[numbers]") {

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
set(CMAKE_CXX_STANDARD 20)
include_directories(${SDL2_INCLUDE_DIRS})
FILE(GLOB_RECURSE SOURCES src/*.cpp src/*.h)
add_library(shadow-reflect ${SOURCES})

View File

@ -0,0 +1 @@
#include "SHObject.h"

View File

@ -0,0 +1,60 @@
#pragma once
#include <string>
#include <typeinfo>
namespace ShadowEngine {
/**
* \brief This is the base class for every class in the Engine that uses runtime reflection.
* Currently it provides a runtime TypeID and TypeName witch can be accesed as static and as class memebers.
* The ID is a int type number witch is generated incramently, on the first call to get a type.
* Each class that inherits from this or it's parent inheris form it must implement the
SHObject::GetType and SHObject::GetTypeId methodes and make it's own static methodes.
To make it easier a standard implementation of these can be used with the SHObject_Base() macro
witch implements all of these functions. It uses the typeid().name of the class.
*/
class SHObject
{
protected:
/**
* \brief Generates a new UID for each call
* \return the next Unique ID that was just generated
*/
static uint64_t GenerateId() noexcept
{
static uint64_t count = 0;
return ++count;
}
public:
/**
* \brief Returns the top level class type name of the object
* \return The class Class name as a string
*/
virtual const std::string& GetType() const = 0;
/**
* \brief Gets the top level type ID
* \return UID of the class
*/
virtual const uint64_t GetTypeId() const = 0;
virtual ~SHObject() = default;
};
/**
* \brief Macro to make the override functions of SHObject. This should be added in each derived class
* \param type The type of the class
*/
#define SHObject_Base(type) \
public: \
static const std::string& Type() { static const std::string t = typeid(type).name(); return t; } \
static uint64_t TypeId() { static const uint64_t id = GenerateId(); return id; } \
const std::string& GetType() const override { return Type(); } \
const uint64_t GetTypeId() const override { return type::TypeId(); } \
private:
}

View File

@ -0,0 +1,7 @@
set(CMAKE_CXX_STANDARD 20)
find_package(SDL2 REQUIRED)
add_executable(shadow-runtime src/main.cpp)
target_include_directories(shadow-runtime PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(shadow-runtime PRIVATE SDL2::Main shadow-engine)

View File

@ -1,12 +1,10 @@
#include "main.h" #include "../../shadow-engine/src/core/ShadowApplication.h"
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <cstdlib> #include <cstdlib>
#include "core/ShadowApplication.h" #include <SDL.h>
#include <SDL2/SDL.h>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -15,8 +13,7 @@ int main(int argc, char *argv[])
for(int ndx{}; ndx != argc; ++ndx) { for(int ndx{}; ndx != argc; ++ndx) {
std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n'; std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n';
} }
std::cout << "argv[" << argc << "] == " std::cout << "argv[" << argc << "] == " << static_cast<void*>(argv[argc]) << '\n';
<< static_cast<void*>(argv[argc]) << '\n';
/*...*/ /*...*/
ShadowEngine::ShadowApplication app(argc, argv); ShadowEngine::ShadowApplication app(argc, argv);

View File

@ -0,0 +1,5 @@
set(CMAKE_CXX_STANDARD 20)
FILE(GLOB_RECURSE SOURCES src/*.cpp src/*.h)
add_library(shadow-utils ${SOURCES})

0
vendor/BUILD vendored
View File

15
vendor/deps.bzl vendored
View File

@ -1,15 +0,0 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("//vendor/sdl2:sdl2-dep.bzl", "sdl2_dep")
load("//vendor/glm:glm-dep.bzl", "glm_dep")
def deps():
sdl2_dep()
glm_dep()
# this doesn't require a whole folder with a build, props, bzl file, so it's set here.
http_archive(
name = "catch2",
strip_prefix = "Catch2-2.13.0",
urls = ["https://github.com/catchorg/Catch2/archive/v2.13.0.tar.gz"],
)

0
vendor/glm/BUILD vendored
View File

View File

@ -1,10 +0,0 @@
load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
def glm_dep():
if "glm_lib" not in native.existing_rules():
new_git_repository(
name = "glm_lib",
remote = "https://github.com/g-truc/glm.git",
commit = "658d8960d081e0c9c312d49758c7ef919371b428",
build_file = Label("//vendor/glm:glm.BUILD"),
)

12
vendor/glm/glm.BUILD vendored
View File

@ -1,12 +0,0 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
cc_library(
name = "glm",
hdrs = glob([
"glm/*.hpp",
"glm/**/*.hpp",
]),
includes = ["glm"],
textual_hdrs = glob(["glm/**/*.inl"]),
visibility = ["//visibility:public"],
)

14
vendor/glm/glm.props vendored
View File

@ -1,14 +0,0 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="AdditionalIncludeDirectories">
<None Include="$(SolutionDir)vendor/glm/glm-repo/glm/">
</None>
</ItemGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(SolutionDir)vendor/glm/glm-repo/glm/; %(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
</Project>

0
vendor/sdl2/BUILD vendored
View File

View File

@ -1,14 +0,0 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
VERSION = "2.0.22"
URL_TOOLCHAIN = "https://www.libsdl.org/release/SDL2-devel-2.0.22-mingw.zip"
def sdl2_dep():
if "sdl2" not in native.existing_rules():
http_archive(
name = "sdl2",
build_file = Label("//vendor/sdl2:sdl2.BUILD"),
url = URL_TOOLCHAIN,
strip_prefix = "SDL2-2.0.22",
sha256 = "18b3da2b3b5f1e802e0abbe99004d7404848755bbfe5153cd9dfcfc0a9522632",
)

View File

@ -1,56 +0,0 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
alias(
name = "windows",
actual = "@bazel_tools//src/conditions:windows"
)
alias(
name = "macos",
actual = "@bazel_tools//src/conditions:darwin_x86_64"
)
alias(
name = "linux",
actual = "@bazel_tools//src/conditions:linux_x86_64"
)
cc_library(
name = "sdl2_win",
srcs= [
"x86_64-w64-mingw32/lib/libSDL2.a",
"x86_64-w64-mingw32/lib/libSDL2main.a"
],
hdrs = glob(["x86_64-w64-mingw32/include/**/*.h"]),
includes = ["x86_64-w64-mingw32/include"], # Optional.
linkopts = [
"-DEFAULTLIB:user32",
"-DEFAULTLIB:gdi32",
"-DEFAULTLIB:winmm",
"-DEFAULTLIB:imm32",
"-DEFAULTLIB:ole32",
"-DEFAULTLIB:oleaut32",
"-DEFAULTLIB:version",
"-DEFAULTLIB:uuid",
"-DEFAULTLIB:shell32",
"-DEFAULTLIB:advapi32",
"-DEFAULTLIB:hid",
"-DEFAULTLIB:setupapi",
"-DEFAULTLIB:opengl32",
"-DEFAULTLIB:kernel32",
"/ENTRY:WinMainCRTStartup"
],
visibility = ["//visibility:public"],
)
alias(
name = "sdl2",
actual = select({
"//:windows": "//:sdl2_win",
"//conditions:default": "//sdl2_win",
}),
visibility = ["//visibility:public"],
)