Browse Source

Initial commit

Godzil 2 months ago
commit
a689a63030

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+# Let's ignore all build files and edition artifacts
+build/
+cmake-*/
+*.o
+*~

+ 34 - 0
CMakeLists.txt

@@ -0,0 +1,34 @@
+cmake_minimum_required(VERSION 3.8)
+
+# External cmake modules
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/cmake ${CMAKE_MODULE_PATH})
+
+project("PhysicEngine")
+
+include(GetGitRevisionDescription)
+
+git_describe(VERSION --tags --dirty=-dirty)
+
+option(WARN_AS_ERROR "Enable warning as error" OFF)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+set(COMP_FLAGS "-Wall -Wextra -Wno-unused-parameter -Wno-unused-result -Wno-write-strings")
+
+if (WARN_AS_ERROR)
+    set(COMP_FLAGS "${COMP_FLAGS} -Werror")
+endif()
+
+set(CMAKE_C_FLAGS ${COMP_FLAGS})
+set(CMAKE_CXX_FLAGS ${COMP_FLAGS})
+
+# Add other libraries deps
+#add_subdirectory(external/glm)
+
+message("-- Building version ${VERSION}")
+
+add_compile_definitions(VERSION="${VERSION}")
+
+add_subdirectory(source)

+ 0 - 0
README.txt


+ 168 - 0
external/cmake/GetGitRevisionDescription.cmake

@@ -0,0 +1,168 @@
+# - Returns a version string from Git
+#
+# These functions force a re-configure on each git commit so that you can
+# trust the values of the variables in your build system.
+#
+#  get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+#  git_describe(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe on the source tree, and adjusting
+# the output so that it tests false if an error occurs.
+#
+#  git_get_exact_tag(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe --exact-match on the source tree,
+# and adjusting the output so that it tests false if there was no exact
+# matching tag.
+#
+#  git_local_changes(<var>)
+#
+# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
+# Uses the return code of "git diff-index --quiet HEAD --".
+# Does not regard untracked files.
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__get_git_revision_description)
+    return()
+endif()
+set(__get_git_revision_description YES)
+
+# We must run the following at "include" time, not at function call time,
+# to find the path to this module rather than the path to a calling list file
+get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+function(get_git_head_revision _refspecvar _hashvar)
+    set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+    set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+    while(NOT EXISTS "${GIT_DIR}")	# .git dir not found, search parent directories
+        set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
+        get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
+        if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
+            # We have reached the root directory, we are not in git
+            set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+            set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+            return()
+        endif()
+        set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+    endwhile()
+    # check if this is a submodule
+    if(NOT IS_DIRECTORY ${GIT_DIR})
+        file(READ ${GIT_DIR} submodule)
+        string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
+        get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
+        get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
+    endif()
+    set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
+    if(NOT EXISTS "${GIT_DATA}")
+        file(MAKE_DIRECTORY "${GIT_DATA}")
+    endif()
+
+    if(NOT EXISTS "${GIT_DIR}/HEAD")
+        return()
+    endif()
+    set(HEAD_FILE "${GIT_DATA}/HEAD")
+    configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
+
+    configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
+            "${GIT_DATA}/grabRef.cmake"
+            @ONLY)
+    include("${GIT_DATA}/grabRef.cmake")
+
+    set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
+    set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
+endfunction()
+
+function(git_describe _var)
+    if(NOT GIT_FOUND)
+        find_package(Git QUIET)
+    endif()
+    get_git_head_revision(refspec hash)
+    if(NOT GIT_FOUND)
+        set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+    if(NOT hash)
+        set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+
+    # TODO sanitize
+    #if((${ARGN}" MATCHES "&&") OR
+    #	(ARGN MATCHES "||") OR
+    #	(ARGN MATCHES "\\;"))
+    #	message("Please report the following error to the project!")
+    #	message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
+    #endif()
+
+    #message(STATUS "Arguments to execute_process: ${ARGN}")
+
+    execute_process(COMMAND
+            "${GIT_EXECUTABLE}"
+            describe
+            #${hash}
+            ${ARGN}
+            WORKING_DIRECTORY
+            "${CMAKE_CURRENT_SOURCE_DIR}"
+            RESULT_VARIABLE
+            res
+            OUTPUT_VARIABLE
+            out
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if(NOT res EQUAL 0)
+        set(out "${out}-${res}-NOTFOUND")
+    endif()
+
+    set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
+
+function(git_get_exact_tag _var)
+    git_describe(out --exact-match ${ARGN})
+    set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
+
+function(git_local_changes _var)
+    if(NOT GIT_FOUND)
+        find_package(Git QUIET)
+    endif()
+    get_git_head_revision(refspec hash)
+    if(NOT GIT_FOUND)
+        set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+    if(NOT hash)
+        set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
+        return()
+    endif()
+
+    execute_process(COMMAND
+            "${GIT_EXECUTABLE}"
+            diff-index --quiet HEAD --
+            WORKING_DIRECTORY
+            "${CMAKE_CURRENT_SOURCE_DIR}"
+            RESULT_VARIABLE
+            res
+            OUTPUT_VARIABLE
+            out
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if(res EQUAL 0)
+        set(${_var} "CLEAN" PARENT_SCOPE)
+    else()
+        set(${_var} "DIRTY" PARENT_SCOPE)
+    endif()
+endfunction()

+ 41 - 0
external/cmake/GetGitRevisionDescription.cmake.in

@@ -0,0 +1,41 @@
+#
+# Internal file for GetGitRevisionDescription.cmake
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+set(HEAD_HASH)
+
+file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
+
+string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
+if(HEAD_CONTENTS MATCHES "ref")
+	# named branch
+	string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
+	if(EXISTS "@GIT_DIR@/${HEAD_REF}")
+		configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+	else()
+		configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
+		file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
+		if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
+			set(HEAD_HASH "${CMAKE_MATCH_1}")
+		endif()
+	endif()
+else()
+	# detached HEAD
+	configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
+endif()
+
+if(NOT HEAD_HASH)
+	file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
+	string(STRIP "${HEAD_HASH}" HEAD_HASH)
+endif()

+ 18 - 0
source/CMakeLists.txt

@@ -0,0 +1,18 @@
+cmake_minimum_required(VERSION 3.8)
+
+#find_package(SDL2 REQUIRED)
+#find_package(SDL2_mixer REQUIRED)
+#find_package(SDL2_ttf REQUIRED)
+#find_package(SDL2_image REQUIRED)
+
+#set(SDL2_LIBS ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARY} ${SDL2_TTF_LIBRARY} ${SDL2_MIXER_LIBRARY})
+#set(SDL2_INCDIR ${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR} ${SDL2_MIXER_INCLUDE_DIR})
+
+file(GLOB_RECURSE GE_SOURCES *.cpp)
+file(GLOB_RECURSE GE_HEADERS include/*.h)
+
+add_executable(physicengine)
+target_include_directories(physicengine PUBLIC include/)
+target_sources(physicengine PRIVATE ${GE_SOURCES} ${GE_HEADERS})
+#target_include_directories(physicengine PUBLIC ${SDL2_INCDIR})
+target_link_libraries(physicengine ${SDL2_LIBS})

+ 47 - 0
source/include/logger.h

@@ -0,0 +1,47 @@
+/*
+ * 2D Game Engine 
+ * Logger.h: 
+ * Based on pikuma.com 2D game engine in C++ and Lua course
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 11/02/2021.
+ */
+
+#ifndef GAMEENGINE_LOGGER_H
+#define GAMEENGINE_LOGGER_H
+
+#include <time.h>
+#include <vector>
+
+typedef enum LogType
+{
+    LOG_LOG = 0,
+    LOG_ERROR,
+    LOG_WARNING,
+    LOG_INFO,
+    LOG_CRITICAL,
+    LOG_DEBUG,
+} LogType;
+
+typedef struct LogEntry
+{
+    LogType type;
+    time_t timestamp;
+    char *message;
+} LogEntry;
+
+class Logger
+{
+public:
+    /* C++ is stupid. */
+    static std::vector<LogEntry> messages;
+
+    static void Log(const char *message, ...);
+    static void Error(const char *message, ...);
+    static void Warning(const char *message, ...);
+    static void Info(const char *message, ...);
+    static void Critical(const char *message, ...);
+    static void Debug(const char *message, ...);
+};
+
+#endif /* GAMEENGINE_LOGGER_H */

+ 110 - 0
source/logger.cpp

@@ -0,0 +1,110 @@
+/*
+ * 2D Game Engine 
+ * Logger.cpp:
+ * Based on pikuma.com 2D game engine in C++ and Lua course
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 11/02/2021.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include <Logger.h>
+
+typedef struct logData
+{
+    char name[7];
+    uint8_t colour;
+} logData;
+
+static logData dataTable[] =
+{
+    [LOG_LOG] = { "LOG", 32 },
+    [LOG_ERROR] = { "ERROR", 31 },
+    [LOG_WARNING] = { "WARN", 33 },
+    [LOG_INFO] = { "INFO", 36 },
+    [LOG_CRITICAL] = { "CRITIC", 101 },
+    [LOG_DEBUG] = { "DEBUG", 35 },
+};
+
+std::vector<LogEntry> Logger::messages;
+
+static void printLastLog()
+{
+    LogEntry entry = Logger::messages.back();
+
+    char buf[30];
+    struct tm *p = localtime(&entry.timestamp);
+    int typeColour = dataTable[entry.type].colour;
+    const char *typeName = dataTable[entry.type].name;
+
+    strftime(buf, 38, "%d-%b-%Y %H:%M:%S", p);
+    fprintf(stderr, "\x1B[%d;1m%-6s | %-20s - ", typeColour, typeName, buf);
+    fprintf(stderr, "%s", entry.message);
+    fprintf(stderr, "\x1B[0m\n");
+}
+
+static void addLog(LogType type, const char *message, va_list params)
+{
+    LogEntry entry;
+    time_t curtime = time(NULL);
+
+    entry.message = (char *)calloc(512, sizeof(char));
+    vsnprintf(entry.message, 510, message, params);
+    entry.timestamp = curtime;
+    entry.type = type;
+
+    Logger::messages.push_back(entry);
+    printLastLog();
+}
+
+void Logger::Log(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_LOG, message, list);
+    va_end(list);
+}
+
+void Logger::Error(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_ERROR, message, list);
+    va_end(list);
+}
+
+void Logger::Warning(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_WARNING, message, list);
+    va_end(list);
+}
+
+void Logger::Info(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_INFO, message, list);
+    va_end(list);
+}
+
+void Logger::Critical(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_CRITICAL, message, list);
+    va_end(list);
+}
+
+void Logger::Debug(const char *message, ...)
+{
+    va_list list;
+    va_start(list, message);
+    addLog(LOG_DEBUG, message, list);
+    va_end(list);
+}

+ 19 - 0
source/main.cpp

@@ -0,0 +1,19 @@
+/*
+ * 2D Physic Engine
+ * main.cpp: App entry point
+ * Based on pikuma.com Learn Game Physics Engine Programming course.
+ * Copyright (c) 2022 986-Studio. All Right Reserved
+ *
+ * Created by Manoël Trapier on 06/06/2022.
+ */
+
+#include <logger.h>
+
+int main(int argc, char *argv[])
+{
+    Logger::Info("Booting up Physic Engine version %s", VERSION);
+
+    Logger::Info("Hello World!");
+
+    return 0;
+}