summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2023-03-04 19:52:09 -0500
committerrealtradam <[email protected]>2023-03-04 19:52:09 -0500
commit4bd628fc4a9a8244c70fc241f9e6576e4af2d35e (patch)
treec008f3cde4a5197084d55115cdf272b2796a8527
parentb172c2a6b22796dc16c059979d2ec6108b0402e4 (diff)
downloadRodeoKit-4bd628fc4a9a8244c70fc241f9e6576e4af2d35e.tar.gz
RodeoKit-4bd628fc4a9a8244c70fc241f9e6576e4af2d35e.zip
fix build system and add emscripten
-rw-r--r--.gitignore1
-rw-r--r--CMakeLists.txt131
-rwxr-xr-xbuild3
-rw-r--r--buildShaders.mk29
-rwxr-xr-xbuild_shaders2
-rwxr-xr-xconfigure3
-rw-r--r--include/rodeo.h11
-rw-r--r--include/rodeo_types.h6
-rw-r--r--src/private/rodeo_internal_types.h3
-rw-r--r--src/rodeo.c86
-rw-r--r--src/rodeo_types.c3
11 files changed, 237 insertions, 41 deletions
diff --git a/.gitignore b/.gitignore
index bd379b4..259f765 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
[Bb]uild_[Dd]ir
+project_bgfx-prefix
# CMake
CMakeLists.txt.user
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c51caf3..a5d3514 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,6 +3,16 @@ include(ExternalProject)
project(RodeoEngine)
+set(CMAKE_BUILD_TYPE Debug)
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_SDL=2 -s USE_SDL_IMAGE=2 -std=c++11")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s USE_SDL=2 -s USE_SDL_IMAGE=2")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_SDL=2 -s USE_SDL_IMAGE=2 -s MIN_WEBGL_VERSION=2")
+endif()
+option(CGLM_SHARED "Shared build" OFF)
+option(CGLM_STATIC "Static build" ON)
+
file(GLOB SOURCES
"src/rodeo.c"
"src/rodeo_math.c"
@@ -14,9 +24,18 @@ file(GLOB SOURCES
add_library(${PROJECT_NAME} ${SOURCES})
+#if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+#target_compile_options(${PROJECT_NAME} PRIVATE
+#-Wall
+#-Wextra
+#-Wpedantic
+##-Werror
+#)
+#endif()
+
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
-# Update submodules as needed
+ # Update submodules as needed
option(GIT_SUBMODULE "Check submodules during build" ON)
if(GIT_SUBMODULE)
message(STATUS "Submodule update")
@@ -29,42 +48,90 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
endif()
endif()
-add_subdirectory(external/SDL)
-add_subdirectory(external/cglm EXCLUDE_FROM_ALL)
-
-ExternalProject_Add(project_bgfx
- #BUILD_IN_SOURCE true # this just doesn't work
- SOURCE_DIR "external/bgfx"
- BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/bgfx"
- DOWNLOAD_COMMAND ""
- CONFIGURE_COMMAND ""
- BUILD_COMMAND make linux
- INSTALL_COMMAND ""
- )
+
+if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+ add_subdirectory(external/SDL)
+endif()
+add_subdirectory(external/cglm)
+
+message("this is the dir")
+message(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+ COMMAND make --makefile=buildShaders.mk
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+ ExternalProject_Add(project_bgfx
+ #BUILD_IN_SOURCE true # this just doesn't work
+ SOURCE_DIR "external/bgfx"
+ BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/bgfx"
+ DOWNLOAD_COMMAND ""
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND make wasm-release
+ INSTALL_COMMAND ""
+ BUILD_ALWAYS TRUE
+ )
+elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+ ExternalProject_Add(project_bgfx
+ #BUILD_IN_SOURCE true # this just doesn't work
+ SOURCE_DIR "external/bgfx"
+ BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/bgfx"
+ DOWNLOAD_COMMAND ""
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND make linux-release64
+ INSTALL_COMMAND ""
+ BUILD_ALWAYS TRUE
+ )
+endif()
add_dependencies(RodeoEngine project_bgfx)
-target_include_directories(${PROJECT_NAME}
- PUBLIC external/SDL/include
- PUBLIC external/bgfx/include
- PUBLIC external/bx/include
- PUBLIC external/cglm/include
- PUBLIC include
- PRIVATE src
- )
+if(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+ target_include_directories(${PROJECT_NAME}
+ PUBLIC external/bgfx/include
+ PUBLIC external/bx/include
+ PUBLIC external/cglm/include
+ PUBLIC include
+ PRIVATE src
+ )
-target_link_directories(${PROJECT_NAME}
- PRIVATE external/SDL
- PRIVATE external/bgfx
- )
+ target_link_directories(${PROJECT_NAME}
+ PRIVATE external/bgfx
+ )
+elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+ target_include_directories(${PROJECT_NAME}
+ PUBLIC external/SDL/include
+ PUBLIC external/bgfx/include
+ PUBLIC external/bx/include
+ PUBLIC external/cglm/include
+ PUBLIC include
+ PRIVATE src
+ )
+ target_link_directories(${PROJECT_NAME}
+ PRIVATE external/SDL
+ PRIVATE external/bgfx
+ )
+endif()
ExternalProject_Get_Property(project_bgfx BINARY_DIR)
-#message("++" ${BINARY_DIR})
-target_link_libraries(${PROJECT_NAME} PRIVATE
- SDL2::SDL2 # dynamic lib
- cglm_headers
- ${BINARY_DIR}/.build/linux64_gcc/bin/libbgfx-shared-libRelease.so
- #${BINARY_DIR}/.build/linux64_gcc/bin/libbgfx-shared-libDebug.so
- )
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
+ target_link_libraries(${PROJECT_NAME} PRIVATE
+ cglm
+ ${BINARY_DIR}/.build/wasm/bin/bgfxRelease.bc
+ ${BINARY_DIR}/.build/wasm/bin/bxRelease.bc
+ ${BINARY_DIR}/.build/wasm/bin/bimgRelease.bc
+ )
+elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+ target_link_libraries(${PROJECT_NAME} PRIVATE
+ #SDL2::SDL2-static # static lib
+ #SDL2::SDL2main
+ SDL2::SDL2 # dynamic lib
+ cglm
+ ${BINARY_DIR}/.build/linux64_gcc/bin/libbgfx-shared-libRelease.so
+ )
+endif()
diff --git a/build b/build
index 45cd35b..2e2e93e 100755
--- a/build
+++ b/build
@@ -1,2 +1,3 @@
#! /bin/sh
-cd build_dir ; make
+cd build_dir/tux ; make
+#cd build_dir/web ; emmake make
diff --git a/buildShaders.mk b/buildShaders.mk
new file mode 100644
index 0000000..fd5ea4b
--- /dev/null
+++ b/buildShaders.mk
@@ -0,0 +1,29 @@
+SHADER_COMPILER = external/bgfx/.build/linux64_gcc/bin/shadercRelease
+DEFAULT_SHADER_FLAGS = --verbose -i external/bgfx/src/
+BUILD_DIR = build_dir/shaders/
+
+.PHONY: all
+all: spirv 100_es
+
+$(BUILD_DIR)spirv/simple.fragment.bin: src/shaders/simple.fragment.sc
+ @mkdir -p $(@D)
+ $(SHADER_COMPILER) -f src/shaders/simple.fragment.sc -o $(BUILD_DIR)spirv/simple.fragment.bin --platform linux --type fragment $(DEFAULT_SHADER_FLAGS) -p spirv
+
+$(BUILD_DIR)spirv/simple.vertex.bin: src/shaders/simple.vertex.sc
+ @mkdir -p $(@D)
+ $(SHADER_COMPILER) -f src/shaders/simple.vertex.sc -o $(BUILD_DIR)spirv/simple.vertex.bin --platform linux --type vertex $(DEFAULT_SHADER_FLAGS) -p spirv
+
+.PHONY: spirv
+spirv: $(BUILD_DIR)spirv/simple.fragment.bin $(BUILD_DIR)spirv/simple.vertex.bin
+
+$(BUILD_DIR)100_es/simple.fragment.bin: src/shaders/simple.fragment.sc
+ @mkdir -p $(@D)
+ $(SHADER_COMPILER) -f src/shaders/simple.fragment.sc -o $(BUILD_DIR)100_es/simple.fragment.bin --platform linux --type fragment $(DEFAULT_SHADER_FLAGS) -p 100_es
+
+$(BUILD_DIR)100_es/simple.vertex.bin: src/shaders/simple.vertex.sc
+ @mkdir -p $(@D)
+ $(SHADER_COMPILER) -f src/shaders/simple.vertex.sc -o $(BUILD_DIR)100_es/simple.vertex.bin --platform linux --type vertex $(DEFAULT_SHADER_FLAGS) -p 100_es
+
+.PHONY: 100_es
+100_es: $(BUILD_DIR)100_es/simple.fragment.bin $(BUILD_DIR)100_es/simple.vertex.bin
+
diff --git a/build_shaders b/build_shaders
index 6399436..5b00403 100755
--- a/build_shaders
+++ b/build_shaders
@@ -1,3 +1,5 @@
#! /bin/sh
./external/bgfx/.build/linux64_gcc/bin/shadercRelease -f ./src/shaders/simple.vertex.sc -o ./build_dir/simple.vertex.bin --platform linux --type vertex --verbose -i ./external/bgfx/src/ -p spirv
./external/bgfx/.build/linux64_gcc/bin/shadercRelease -f ./src/shaders/simple.fragment.sc -o ./build_dir/simple.fragment.bin --platform linux --type fragment --verbose -i ./external/bgfx/src/ -p spirv
+#./external/bgfx/.build/linux64_gcc/bin/shadercRelease -f ./src/shaders/simple.vertex.sc -o ./build_dir/simple.vertex.bin --platform asm.js --type vertex --verbose -i ./external/bgfx/src/ -p 100_es
+#./external/bgfx/.build/linux64_gcc/bin/shadercRelease -f ./src/shaders/simple.fragment.sc -o ./build_dir/simple.fragment.bin --platform asm.js --type fragment --verbose -i ./external/bgfx/src/ -p 100_es
diff --git a/configure b/configure
index 352dcd6..6a85de8 100755
--- a/configure
+++ b/configure
@@ -1,3 +1,4 @@
#! /bin/sh
-cmake -S . -B build_dir
+cmake -S . -B build_dir/tux
+#emcmake cmake -S . -B build_dir/web
diff --git a/include/rodeo.h b/include/rodeo.h
index 7b29d17..97a5e61 100644
--- a/include/rodeo.h
+++ b/include/rodeo.h
@@ -35,12 +35,23 @@ void
Rodeo__\
end(Rodeo__data_p state);
+void
+Rodeo__\
+execute_main_loop(
+ Rodeo__data_p state,
+ Rodeo__main_loop_p main_loop_function
+);
+
bool
Rodeo__\
should_quit(Rodeo__data_p state);
void
Rodeo__\
+set_quit(Rodeo__data_p state, bool quit);
+
+void
+Rodeo__\
draw_debug_text(uint16_t x, uint16_t y, const char *format, ...);
const char *
diff --git a/include/rodeo_types.h b/include/rodeo_types.h
index fd4ed82..47d2db9 100644
--- a/include/rodeo_types.h
+++ b/include/rodeo_types.h
@@ -34,3 +34,9 @@ struct
Rodeo__data
*Rodeo__\
data_p;
+
+typedef
+void
+(*Rodeo__\
+main_loop_p)
+(void);
diff --git a/src/private/rodeo_internal_types.h b/src/private/rodeo_internal_types.h
index 1dfa485..2114942 100644
--- a/src/private/rodeo_internal_types.h
+++ b/src/private/rodeo_internal_types.h
@@ -5,6 +5,9 @@
#include "rodeo_types.h"
// system
+#if __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
#include "SDL2/SDL.h"
#include "SDL2/SDL_syswm.h"
#include "bgfx/c99/bgfx.h"
diff --git a/src/rodeo.c b/src/rodeo.c
index e50debb..3a60b92 100644
--- a/src/rodeo.c
+++ b/src/rodeo.c
@@ -9,6 +9,9 @@
#include "private/rodeo_error.h"
// external
+#if __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
#include "SDL2/SDL.h"
#include "SDL2/SDL_syswm.h"
#include "bgfx/c99/bgfx.h"
@@ -42,12 +45,15 @@ init_window(
state->screen_height = screen_height;
state->screen_width = screen_width;
+ printf("SDL_Init...\n");
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
+ printf("done\n");
+ printf("SDL_CreateWindow...\n");
state->window = SDL_CreateWindow(
title,
SDL_WINDOWPOS_UNDEFINED,
@@ -56,13 +62,15 @@ init_window(
screen_height,
SDL_WINDOW_SHOWN
);
+ printf("done\n");
if(state->window == NULL)
{
printf("Window could not be created! SDL_Error %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
-
+#if !__EMSCRIPTEN__
+ printf("SDL_VERSION...\n");
SDL_VERSION(&state->wmi.version);
if(
!SDL_GetWindowWMInfo(
@@ -74,14 +82,22 @@ init_window(
printf("SDL_Error %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
-
+ printf("done\n");
bgfx_render_frame(-1);
+#endif
+
bgfx_platform_data_t pd;
memset(&pd, 0, sizeof(bgfx_platform_data_t));
+#if !__EMSCRIPTEN__
+ // x11
pd.ndt = state->wmi.info.x11.display;
pd.nwh = (void*)(uintptr_t)state->wmi.info.x11.window;
+#else
+ // web
+ pd.nwh = (void*)"#canvas";
+#endif
bgfx_init_t init = {0};
bgfx_init_ctor(&init);
@@ -105,7 +121,6 @@ init_window(
0
);
bgfx_set_view_rect(0, 0, 0, state->screen_width, state->screen_height);
-
bgfx_vertex_layout_begin(&state->vertex_layout, bgfx_get_renderer_type());
bgfx_vertex_layout_add(&state->vertex_layout, BGFX_ATTRIB_POSITION, 3, BGFX_ATTRIB_TYPE_FLOAT, false, false);
bgfx_vertex_layout_add(&state->vertex_layout, BGFX_ATTRIB_COLOR0, 4, BGFX_ATTRIB_TYPE_UINT8, true, false);
@@ -116,8 +131,38 @@ init_window(
state->index_buffer_handle = bgfx_create_dynamic_index_buffer((RODEO__MAX_VERTEX_SIZE / 4) * 6, BGFX_BUFFER_NONE);
// load shaders
- state->vertex_shader = _Rodeo__load_shader("./external/RodeoEngine/build_dir/simple.vertex.bin");
- state->fragment_shader = _Rodeo__load_shader("./external/RodeoEngine/build_dir/simple.fragment.bin");
+ const char* shader_path = "???";
+ switch(bgfx_get_renderer_type()) {
+ case BGFX_RENDERER_TYPE_NOOP:
+ printf("Noop renderer error");
+ exit(EXIT_FAILURE);
+ case BGFX_RENDERER_TYPE_OPENGLES:
+ shader_path = "shaders/100_es/";
+ break;
+ case BGFX_RENDERER_TYPE_VULKAN:
+ shader_path = "shaders/spirv/";
+ break;
+ default:
+ printf("No shaders for selected renderer. Exiting...");
+ exit(EXIT_FAILURE);
+ }
+ const char* vertex_shader_filename = "simple.vertex.bin";
+ const char* fragment_shader_filename = "simple.fragment.bin";
+ size_t shader_length = strlen(shader_path);
+ size_t fragment_length = strlen(fragment_shader_filename);
+ size_t vertex_length = strlen(vertex_shader_filename);
+ char *fragment_path = (char *)malloc(shader_length + fragment_length);
+ char *vertex_path = (char *)malloc(shader_length + vertex_length);
+ memcpy(fragment_path, shader_path, shader_length);
+ memcpy(&fragment_path[shader_length], fragment_shader_filename, fragment_length);
+ memcpy(vertex_path, shader_path, shader_length);
+ memcpy(&vertex_path[shader_length], vertex_shader_filename, vertex_length);
+
+ fragment_path[shader_length + fragment_length] = 0;
+ vertex_path[shader_length + vertex_length] = 0;
+
+ state->vertex_shader = _Rodeo__load_shader(vertex_path);
+ state->fragment_shader = _Rodeo__load_shader(fragment_path);
state->program_shader = bgfx_create_program(
state->vertex_shader,
state->fragment_shader,
@@ -219,6 +264,23 @@ end(Rodeo__data_p state)
}
}
+void
+Rodeo__\
+execute_main_loop(
+ Rodeo__data_p state,
+ Rodeo__main_loop_p main_loop_function
+)
+{
+#if __EMSCRIPTEN__
+ emscripten_set_main_loop(main_loop_function, 0, 1);
+#else
+ while(!Rodeo__should_quit(state))
+ {
+ main_loop_function();
+ }
+#endif
+}
+
bool
Rodeo__\
should_quit(Rodeo__data_p state)
@@ -228,6 +290,13 @@ should_quit(Rodeo__data_p state)
void
Rodeo__\
+set_quit(Rodeo__data_p state, bool quit)
+{
+ state->quit = quit;
+}
+
+void
+Rodeo__\
draw_debug_text(u_int16_t x, u_int16_t y, const char *format, ...)
{
va_list argList;
@@ -356,7 +425,7 @@ load_shader(const char* path)
if(!file)
{
- printf("Error: shader file \"%s\" not found", path);
+ printf("Error: shader file \"%s\" not found\n", path);
return invalid;
}
@@ -369,5 +438,8 @@ load_shader(const char* path)
mem->data[mem->size - 1] = '\0';
fclose(file);
- return bgfx_create_shader(mem);
+ bgfx_shader_handle_t shader = bgfx_create_shader(mem);
+ printf("Shader loaded as idx: %d\n", shader.idx);
+
+ return shader;
}
diff --git a/src/rodeo_types.c b/src/rodeo_types.c
index d2c56aa..ff87e27 100644
--- a/src/rodeo_types.c
+++ b/src/rodeo_types.c
@@ -4,6 +4,9 @@
#include "rodeo_config.h"
// external
+#if __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
#include "SDL2/SDL.h"
#include "SDL2/SDL_syswm.h"
#include "bgfx/c99/bgfx.h"