mirror of
https://github.com/NickTheFox99/ChristmOS.git
synced 2026-06-28 08:45:33 -04:00
Initial commit
This commit is contained in:
151
.github/workflows/cmake-multi-platform.yml
vendored
Normal file
151
.github/workflows/cmake-multi-platform.yml
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
name: CMake on multiple platforms
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-latest
|
||||
c_compiler: cl
|
||||
cpp_compiler: cl
|
||||
platform: Windows
|
||||
artifact_name: windows
|
||||
build_type: Release
|
||||
|
||||
- os: ubuntu-latest
|
||||
c_compiler: gcc
|
||||
cpp_compiler: g++
|
||||
platform: Linux
|
||||
artifact_name: linux
|
||||
build_type: Release
|
||||
|
||||
- os: macos-latest
|
||||
c_compiler: clang
|
||||
cpp_compiler: clang++
|
||||
platform: MacOS
|
||||
artifact_name: macos
|
||||
build_type: Release
|
||||
|
||||
- os: ubuntu-latest
|
||||
c_compiler: emcc
|
||||
cpp_compiler: em++
|
||||
platform: Web
|
||||
artifact_name: web
|
||||
build_type: Release
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set reusable strings
|
||||
id: strings
|
||||
shell: bash
|
||||
run: |
|
||||
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Install Linux Dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev vim-common
|
||||
|
||||
- name: Install MacOS Dependencies
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
brew install cmake
|
||||
xcode-select --install || true
|
||||
|
||||
- name: Install Windows Dependencies
|
||||
if: runner.os == 'Windows'
|
||||
run: choco install vim -y
|
||||
shell: pwsh
|
||||
|
||||
- name: Cache CMake files
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cmake
|
||||
${{ github.workspace }}/build/_deps
|
||||
key: ${{ runner.os }}-cmake-${{ matrix.c_compiler }}-${{ hashFiles('**/CMakeLists.txt', '**/*.cmake') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cmake-${{ matrix.c_compiler }}-
|
||||
${{ runner.os }}-cmake-
|
||||
|
||||
- name: Setup Emscripten
|
||||
if: matrix.c_compiler == 'emcc'
|
||||
uses: mymindstorm/setup-emsdk@v14
|
||||
with:
|
||||
version: latest
|
||||
|
||||
- name: Setup Web Build Environment
|
||||
if: matrix.c_compiler == 'emcc'
|
||||
run: |
|
||||
mkdir -p ${{ steps.strings.outputs.build-output-dir }}/assets
|
||||
# cp -r assets/* ${{ steps.strings.outputs.build-output-dir }}/assets/
|
||||
|
||||
- name: Configure CMake
|
||||
run: >
|
||||
cmake -B ${{ steps.strings.outputs.build-output-dir }}
|
||||
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
|
||||
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
||||
${{ matrix.c_compiler == 'emcc' && '-DPLATFORM=Web' || '' }}
|
||||
-S ${{ github.workspace }}
|
||||
|
||||
- name: Build
|
||||
run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{ steps.strings.outputs.build-output-dir }}
|
||||
run: ctest --build-config ${{ matrix.build_type }}
|
||||
|
||||
- name: Create Release ZIP (Windows)
|
||||
if: matrix.platform == 'Windows'
|
||||
run: |
|
||||
cd build/${{ matrix.build_type }}
|
||||
Compress-Archive -Path *.exe -DestinationPath ../../${{ matrix.artifact_name }}.zip
|
||||
shell: pwsh
|
||||
|
||||
- name: Create Release ZIP (Web)
|
||||
if: matrix.platform == 'Web'
|
||||
run: |
|
||||
cd build
|
||||
zip -r ../${{ matrix.artifact_name }}.zip *.html *.js *.data *.wasm 2>/dev/null || true
|
||||
shell: bash
|
||||
|
||||
- name: Create Release ZIP (Linux/macOS)
|
||||
if: matrix.platform == 'Linux' || matrix.platform == 'MacOS'
|
||||
run: |
|
||||
mkdir -p release_files
|
||||
cd build
|
||||
# Copy executable files (excluding libraries and build artifacts)
|
||||
for file in *; do
|
||||
if [ -f "$file" ] && [ -x "$file" ]; then
|
||||
case "$file" in
|
||||
*.so|*.a|*.dylib|*.sh) ;;
|
||||
*) cp "$file" ../release_files/ ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
cd ../release_files
|
||||
if [ -n "$(ls -A 2>/dev/null)" ]; then
|
||||
zip ../${{ matrix.artifact_name }}.zip *
|
||||
fi
|
||||
shell: bash
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.artifact_name }}
|
||||
path: ${{ matrix.artifact_name }}.zip
|
||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
build/*
|
||||
build-web/*
|
||||
data/*
|
||||
.cache/*
|
||||
105
CMakeLists.txt
Normal file
105
CMakeLists.txt
Normal file
@@ -0,0 +1,105 @@
|
||||
cmake_minimum_required(VERSION 3.11) # FetchContent is available in 3.11+
|
||||
project(game C CXX)
|
||||
|
||||
# Generate compile_commands.json
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# Dependencies
|
||||
set(RAYLIB_VERSION 5.5)
|
||||
find_package(raylib ${RAYLIB_VERSION} QUIET) # QUIET or REQUIRED
|
||||
if(NOT raylib_FOUND) # If there's none, fetch and build raylib
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
raylib
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP OFF
|
||||
URL https://github.com/raysan5/raylib/archive/refs/tags/${RAYLIB_VERSION}.tar.gz
|
||||
)
|
||||
FetchContent_GetProperties(raylib)
|
||||
if(NOT raylib_POPULATED) # Have we downloaded raylib yet?
|
||||
set(FETCHCONTENT_QUIET NO)
|
||||
FetchContent_MakeAvailable(raylib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(RAYLIB_CPP_VERSION "v5.5.0")
|
||||
find_package(raylib_cpp QUIET) # QUIET or REQUIRED
|
||||
if(NOT raylib_cpp_FOUND) # If there's none, fetch and build raylib
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
raylib_cpp
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP OFF
|
||||
URL https://github.com/RobLoach/raylib-cpp/archive/refs/tags/${RAYLIB_CPP_VERSION}.tar.gz
|
||||
)
|
||||
FetchContent_GetProperties(raylib_cpp)
|
||||
if(NOT raylib_cpp_POPULATED) # Have we downloaded raylib yet?
|
||||
set(FETCHCONTENT_QUIET NO)
|
||||
FetchContent_MakeAvailable(raylib_cpp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Our Project
|
||||
add_executable(${PROJECT_NAME})
|
||||
|
||||
# Generate header files from assets using xxd
|
||||
file(GLOB_RECURSE ASSET_FILES ${CMAKE_CURRENT_SOURCE_DIR}/assets/*)
|
||||
|
||||
set(DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||
set(GENERATED_HEADERS "")
|
||||
|
||||
foreach(ASSET_FILE ${ASSET_FILES})
|
||||
file(RELATIVE_PATH REL_PATH
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/assets
|
||||
${ASSET_FILE}
|
||||
)
|
||||
|
||||
get_filename_component(FILE_NAME ${ASSET_FILE} NAME)
|
||||
get_filename_component(SUB_DIR ${REL_PATH} DIRECTORY)
|
||||
|
||||
set(OUTPUT_DIR ${DATA_DIR}/${SUB_DIR})
|
||||
file(MAKE_DIRECTORY ${OUTPUT_DIR})
|
||||
|
||||
set(OUTPUT_FILE ${OUTPUT_DIR}/${FILE_NAME}.h)
|
||||
|
||||
get_filename_component(ASSET_DIR ${ASSET_FILE} DIRECTORY)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${OUTPUT_FILE}
|
||||
COMMAND xxd -i ${FILE_NAME} ${OUTPUT_FILE}
|
||||
DEPENDS ${ASSET_FILE}
|
||||
WORKING_DIRECTORY ${ASSET_DIR}
|
||||
COMMENT "Embedding ${REL_PATH}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
list(APPEND GENERATED_HEADERS ${OUTPUT_FILE})
|
||||
endforeach()
|
||||
|
||||
# Add source files
|
||||
file(GLOB_RECURSE PROJECTSOURCES "src/*.c" "src/*.cpp")
|
||||
target_sources(${PROJECT_NAME} PRIVATE ${PROJECTSOURCES})
|
||||
|
||||
# Add generated headers
|
||||
target_sources(${PROJECT_NAME} PRIVATE ${GENERATED_HEADERS})
|
||||
|
||||
# Include directories
|
||||
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||
${DATA_DIR}
|
||||
${raylib_INCLUDE_DIRS}
|
||||
${raylib_cpp_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
# Link libraries
|
||||
target_link_libraries(${PROJECT_NAME} raylib raylib_cpp)
|
||||
|
||||
# Web Configurations
|
||||
if(${PLATFORM} STREQUAL "Web")
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".html")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s ASYNCIFY -s GL_ENABLE_GET_PROC_ADDRESS=1 -s SINGLE_FILE=1 --shell-file ${CMAKE_SOURCE_DIR}/src/minshell.html")
|
||||
endif()
|
||||
|
||||
# macOS frameworks
|
||||
if(APPLE)
|
||||
target_link_libraries(${PROJECT_NAME} "-framework IOKit")
|
||||
target_link_libraries(${PROJECT_NAME} "-framework Cocoa")
|
||||
target_link_libraries(${PROJECT_NAME} "-framework OpenGL")
|
||||
endif()
|
||||
16
LICENSE
Normal file
16
LICENSE
Normal file
@@ -0,0 +1,16 @@
|
||||
Copyright (c) 2013-2023 Ramon Santamaria (@raysan5)
|
||||
|
||||
This software is provided "as-is", without any express or implied warranty. In no event
|
||||
will the authors be held liable for any damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose, including commercial
|
||||
applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not claim that you
|
||||
wrote the original software. If you use this software in a product, an acknowledgment
|
||||
in the product documentation would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||
as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# RaylibGame
|
||||
|
||||
A template for making games with Raylib-CPP
|
||||
BIN
assets/cube.png
Normal file
BIN
assets/cube.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 102 B |
95
src/main.cpp
Normal file
95
src/main.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
#include "../data/cube.png.h"
|
||||
#include "raylib.h"
|
||||
#include <cmath>
|
||||
#include <raylib-cpp.hpp>
|
||||
|
||||
#if defined(PLATFORM_WEB)
|
||||
#include <emscripten/emscripten.h>
|
||||
#endif
|
||||
|
||||
#define SCREEN_WIDTH (320)
|
||||
#define SCREEN_HEIGHT (240)
|
||||
#define WIN_WIDTH (1280)
|
||||
#define WIN_HEIGHT (720)
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
void MainLoop();
|
||||
|
||||
raylib::Window window(WIN_WIDTH, WIN_HEIGHT, "game",
|
||||
FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT);
|
||||
|
||||
raylib::RenderTexture2D target(SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||
|
||||
raylib::Image texImg =
|
||||
raylib::LoadImageFromMemory(".png", cube_png, cube_png_len);
|
||||
|
||||
raylib::Texture2D texture = texImg.LoadTexture();
|
||||
|
||||
raylib::Camera3D cam(raylib::Vector3(0.0f, 0.0f, std::sqrt(3.0f)),
|
||||
raylib::Vector3::Zero(), raylib::Vector3(0.0f, 1.0f, 0.0f),
|
||||
60.0f, CAMERA_PERSPECTIVE);
|
||||
|
||||
raylib::Model cube(GenMeshCube(1.0f, 1.0f, 1.0f));
|
||||
|
||||
int main(void) {
|
||||
window.SetMinSize({320, 240});
|
||||
window.SetTargetFPS(60);
|
||||
window.SetExitKey(KEY_BACKSPACE);
|
||||
|
||||
target.GetTexture().SetFilter(TEXTURE_FILTER_POINT);
|
||||
|
||||
cube.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = texture;
|
||||
|
||||
#if defined(PLATFORM_WEB)
|
||||
emscripten_set_main_loop(MainLoop, 0, 1);
|
||||
#else
|
||||
while (!window.ShouldClose() && !raylib::Keyboard::IsKeyDown(KEY_ESCAPE))
|
||||
MainLoop();
|
||||
#endif
|
||||
|
||||
window.Close();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MainLoop() {
|
||||
{
|
||||
int winWidth = GetScreenWidth(), winHeight = GetScreenHeight();
|
||||
float scale =
|
||||
MIN((float)winWidth / SCREEN_WIDTH, (float)winHeight / SCREEN_HEIGHT);
|
||||
|
||||
cube.SetTransform(
|
||||
raylib::Matrix::RotateXYZ(
|
||||
raylib::Vector3(1.0f, 1.5f, 2.5f).Scale(window.GetFrameTime()))
|
||||
.Multiply(cube.GetTransform()));
|
||||
|
||||
target.BeginMode();
|
||||
{
|
||||
ClearBackground(BLACK);
|
||||
raylib::Vector2(160.0f, 120.0f)
|
||||
.DrawCircle(120.0f, raylib::Color::White());
|
||||
cam.BeginMode();
|
||||
{
|
||||
cube.Draw(raylib::Vector3::Zero());
|
||||
}
|
||||
cam.EndMode();
|
||||
}
|
||||
target.EndMode();
|
||||
|
||||
window.BeginDrawing();
|
||||
{
|
||||
ClearBackground(BLACK);
|
||||
target.GetTexture().Draw(
|
||||
raylib::Rectangle(0.0f, 0.0f, (float)SCREEN_WIDTH,
|
||||
(float)-SCREEN_HEIGHT),
|
||||
raylib::Rectangle((winWidth - ((float)SCREEN_WIDTH * scale)) * 0.5f,
|
||||
(winHeight - ((float)SCREEN_HEIGHT * scale)) * 0.5f,
|
||||
(float)SCREEN_WIDTH * scale,
|
||||
(float)SCREEN_HEIGHT * scale),
|
||||
raylib::Vector2(0, 0), 0.0f, WHITE);
|
||||
}
|
||||
window.EndDrawing();
|
||||
}
|
||||
}
|
||||
72
src/minshell.html
Normal file
72
src/minshell.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
<style>
|
||||
body {
|
||||
margin: 0px;
|
||||
overflow: hidden;
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
canvas.emscripten {
|
||||
border: 0px none;
|
||||
background-color: black;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<script type='text/javascript' src="https://cdn.jsdelivr.net/gh/eligrey/FileSaver.js/dist/FileSaver.min.js"> </script>
|
||||
<script type='text/javascript'>
|
||||
function saveFileFromMEMFSToDisk(memoryFSname, localFSname) // This can be called by C/C++ code
|
||||
{
|
||||
var isSafari = false; // Not supported, navigator.userAgent access is being restricted
|
||||
//var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
||||
var data = FS.readFile(memoryFSname);
|
||||
var blob;
|
||||
|
||||
if (isSafari) blob = new Blob([data.buffer], {type: "application/octet-stream"});
|
||||
else blob = new Blob([data.buffer], {type: "application/octet-binary"});
|
||||
|
||||
// NOTE: SaveAsDialog is a browser setting. For example, in Google Chrome,
|
||||
// in Settings/Advanced/Downloads section you have a setting:
|
||||
// 'Ask where to save each file before downloading' - which you can set true/false.
|
||||
// If you enable this setting it would always ask you and bring the SaveAsDialog
|
||||
saveAs(blob, localFSname);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<canvas class=emscripten id=canvas oncontextmenu=event.preventDefault() tabindex=-1></canvas>
|
||||
<p id="output" />
|
||||
<script>
|
||||
var Module = {
|
||||
print: (function () {
|
||||
var element = document.getElementById('output');
|
||||
if (element) element.value = ''; // clear browser cache
|
||||
return function (text) {
|
||||
if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
|
||||
console.log(text);
|
||||
if (element) {
|
||||
element.value += text + "\n";
|
||||
element.scrollTop = element.scrollHeight; // focus on bottom
|
||||
}
|
||||
};
|
||||
})(),
|
||||
canvas: (function () {
|
||||
var canvas = document.getElementById('canvas');
|
||||
return canvas;
|
||||
})()
|
||||
};
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user