diff options
| author | realtradam <[email protected]> | 2023-03-04 19:52:09 -0500 |
|---|---|---|
| committer | realtradam <[email protected]> | 2023-03-04 19:52:09 -0500 |
| commit | 4bd628fc4a9a8244c70fc241f9e6576e4af2d35e (patch) | |
| tree | c008f3cde4a5197084d55115cdf272b2796a8527 | |
| parent | b172c2a6b22796dc16c059979d2ec6108b0402e4 (diff) | |
| download | RodeoKit-4bd628fc4a9a8244c70fc241f9e6576e4af2d35e.tar.gz RodeoKit-4bd628fc4a9a8244c70fc241f9e6576e4af2d35e.zip | |
fix build system and add emscripten
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | CMakeLists.txt | 131 | ||||
| -rwxr-xr-x | build | 3 | ||||
| -rw-r--r-- | buildShaders.mk | 29 | ||||
| -rwxr-xr-x | build_shaders | 2 | ||||
| -rwxr-xr-x | configure | 3 | ||||
| -rw-r--r-- | include/rodeo.h | 11 | ||||
| -rw-r--r-- | include/rodeo_types.h | 6 | ||||
| -rw-r--r-- | src/private/rodeo_internal_types.h | 3 | ||||
| -rw-r--r-- | src/rodeo.c | 86 | ||||
| -rw-r--r-- | src/rodeo_types.c | 3 |
11 files changed, 237 insertions, 41 deletions
@@ -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() @@ -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 @@ -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" |
