- Fix texture state management in BgfxDevice: defer setTexture until submit() - Add transient instance buffer support for multi-batch rendering - Add ParticlePass with fire, smoke and sparkle particle systems - Load multiple textures from config (texture1..texture10) - Visual test now demonstrates multi-texture sprites and multi-particle effects 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
238 lines
6.8 KiB
CMake
238 lines
6.8 KiB
CMake
# ============================================================================
|
|
# BgfxRenderer Module - CMake Configuration
|
|
# ============================================================================
|
|
|
|
cmake_minimum_required(VERSION 3.20)
|
|
|
|
# ============================================================================
|
|
# Fetch bgfx
|
|
# ============================================================================
|
|
|
|
include(FetchContent)
|
|
|
|
FetchContent_Declare(
|
|
bgfx
|
|
GIT_REPOSITORY https://github.com/bkaradzic/bgfx.cmake.git
|
|
GIT_TAG v1.127.8710-464
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
|
|
# bgfx options
|
|
set(BGFX_BUILD_TOOLS ON CACHE BOOL "" FORCE) # Need shaderc for shader compilation
|
|
set(BGFX_BUILD_TOOLS_SHADER ON CACHE BOOL "" FORCE)
|
|
set(BGFX_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
|
set(BGFX_INSTALL OFF CACHE BOOL "" FORCE)
|
|
set(BGFX_CUSTOM_TARGETS OFF CACHE BOOL "" FORCE)
|
|
|
|
FetchContent_MakeAvailable(bgfx)
|
|
|
|
# ============================================================================
|
|
# BgfxRenderer Shared Library
|
|
# ============================================================================
|
|
|
|
add_library(BgfxRenderer SHARED
|
|
# Main module
|
|
BgfxRendererModule.cpp
|
|
|
|
# RHI
|
|
RHI/RHICommandBuffer.cpp
|
|
RHI/BgfxDevice.cpp
|
|
|
|
# Frame
|
|
Frame/FrameAllocator.cpp
|
|
|
|
# RenderGraph
|
|
RenderGraph/RenderGraph.cpp
|
|
|
|
# Shaders
|
|
Shaders/ShaderManager.cpp
|
|
|
|
# Passes
|
|
Passes/ClearPass.cpp
|
|
Passes/TilemapPass.cpp
|
|
Passes/SpritePass.cpp
|
|
Passes/TextPass.cpp
|
|
Passes/ParticlePass.cpp
|
|
Passes/DebugPass.cpp
|
|
|
|
# Text
|
|
Text/BitmapFont.cpp
|
|
|
|
# Scene
|
|
Scene/SceneCollector.cpp
|
|
|
|
# Resources
|
|
Resources/ResourceCache.cpp
|
|
Resources/TextureLoader.cpp
|
|
|
|
# Debug
|
|
Debug/DebugOverlay.cpp
|
|
)
|
|
|
|
target_include_directories(BgfxRenderer PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../include
|
|
${bgfx_SOURCE_DIR}/bimg/3rdparty # stb_image
|
|
)
|
|
|
|
target_link_libraries(BgfxRenderer PRIVATE
|
|
GroveEngine::impl
|
|
bgfx
|
|
bx
|
|
spdlog::spdlog
|
|
)
|
|
|
|
target_compile_features(BgfxRenderer PRIVATE cxx_std_17)
|
|
|
|
set_target_properties(BgfxRenderer PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
|
|
)
|
|
|
|
# ============================================================================
|
|
# Platform-specific settings
|
|
# ============================================================================
|
|
|
|
if(WIN32)
|
|
target_compile_definitions(BgfxRenderer PRIVATE
|
|
WIN32_LEAN_AND_MEAN
|
|
NOMINMAX
|
|
)
|
|
endif()
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
target_link_libraries(BgfxRenderer PRIVATE
|
|
pthread
|
|
dl
|
|
X11
|
|
GL
|
|
)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
target_link_libraries(BgfxRenderer PRIVATE
|
|
"-framework Cocoa"
|
|
"-framework QuartzCore"
|
|
"-framework Metal"
|
|
)
|
|
endif()
|
|
|
|
# ============================================================================
|
|
# Shader Compilation
|
|
# ============================================================================
|
|
|
|
set(BGFX_SHADER_INCLUDE_DIR ${bgfx_SOURCE_DIR}/bgfx/src)
|
|
set(SHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Shaders)
|
|
|
|
# Function to compile a shader
|
|
function(compile_bgfx_shader SHADER_NAME SHADER_TYPE OUTPUT_VAR)
|
|
set(INPUT_FILE ${SHADER_DIR}/${SHADER_NAME}.sc)
|
|
set(OUTPUT_DIR ${SHADER_DIR})
|
|
set(VARYING_DEF ${SHADER_DIR}/varying.def.sc)
|
|
|
|
# Output files for each platform
|
|
set(OUTPUT_SPIRV ${OUTPUT_DIR}/${SHADER_NAME}_spirv.bin)
|
|
set(OUTPUT_GLSL ${OUTPUT_DIR}/${SHADER_NAME}_glsl.bin)
|
|
set(OUTPUT_ESSL ${OUTPUT_DIR}/${SHADER_NAME}_essl.bin)
|
|
set(OUTPUT_DX11 ${OUTPUT_DIR}/${SHADER_NAME}_dx11.bin)
|
|
set(OUTPUT_MTL ${OUTPUT_DIR}/${SHADER_NAME}_mtl.bin)
|
|
|
|
if(SHADER_TYPE STREQUAL "vertex")
|
|
set(SHADER_MODEL vs_5_0)
|
|
set(SHADER_PROFILE 430)
|
|
else()
|
|
set(SHADER_MODEL ps_5_0)
|
|
set(SHADER_PROFILE 430)
|
|
endif()
|
|
|
|
# Compile for Vulkan (SPIR-V)
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_SPIRV}
|
|
COMMAND shaderc
|
|
-f ${INPUT_FILE}
|
|
-o ${OUTPUT_SPIRV}
|
|
--type ${SHADER_TYPE}
|
|
--platform linux
|
|
--profile spirv
|
|
-i ${BGFX_SHADER_INCLUDE_DIR}
|
|
--varyingdef ${VARYING_DEF}
|
|
DEPENDS ${INPUT_FILE} ${VARYING_DEF} shaderc
|
|
COMMENT "Compiling ${SHADER_NAME} for SPIR-V"
|
|
)
|
|
|
|
# Compile for OpenGL
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_GLSL}
|
|
COMMAND shaderc
|
|
-f ${INPUT_FILE}
|
|
-o ${OUTPUT_GLSL}
|
|
--type ${SHADER_TYPE}
|
|
--platform linux
|
|
--profile ${SHADER_PROFILE}
|
|
-i ${BGFX_SHADER_INCLUDE_DIR}
|
|
--varyingdef ${VARYING_DEF}
|
|
DEPENDS ${INPUT_FILE} ${VARYING_DEF} shaderc
|
|
COMMENT "Compiling ${SHADER_NAME} for GLSL"
|
|
)
|
|
|
|
# Compile for OpenGL ES
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_ESSL}
|
|
COMMAND shaderc
|
|
-f ${INPUT_FILE}
|
|
-o ${OUTPUT_ESSL}
|
|
--type ${SHADER_TYPE}
|
|
--platform android
|
|
-i ${BGFX_SHADER_INCLUDE_DIR}
|
|
--varyingdef ${VARYING_DEF}
|
|
DEPENDS ${INPUT_FILE} ${VARYING_DEF} shaderc
|
|
COMMENT "Compiling ${SHADER_NAME} for ESSL"
|
|
)
|
|
|
|
# Compile for DirectX 11
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_DX11}
|
|
COMMAND shaderc
|
|
-f ${INPUT_FILE}
|
|
-o ${OUTPUT_DX11}
|
|
--type ${SHADER_TYPE}
|
|
--platform windows
|
|
--profile ${SHADER_MODEL}
|
|
-i ${BGFX_SHADER_INCLUDE_DIR}
|
|
--varyingdef ${VARYING_DEF}
|
|
DEPENDS ${INPUT_FILE} ${VARYING_DEF} shaderc
|
|
COMMENT "Compiling ${SHADER_NAME} for DX11"
|
|
)
|
|
|
|
# Compile for Metal
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_MTL}
|
|
COMMAND shaderc
|
|
-f ${INPUT_FILE}
|
|
-o ${OUTPUT_MTL}
|
|
--type ${SHADER_TYPE}
|
|
--platform osx
|
|
--profile metal
|
|
-i ${BGFX_SHADER_INCLUDE_DIR}
|
|
--varyingdef ${VARYING_DEF}
|
|
DEPENDS ${INPUT_FILE} ${VARYING_DEF} shaderc
|
|
COMMENT "Compiling ${SHADER_NAME} for Metal"
|
|
)
|
|
|
|
set(${OUTPUT_VAR} ${OUTPUT_SPIRV} ${OUTPUT_GLSL} ${OUTPUT_ESSL} ${OUTPUT_DX11} ${OUTPUT_MTL} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Compile sprite shaders
|
|
compile_bgfx_shader(vs_sprite vertex VS_SPRITE_OUTPUTS)
|
|
compile_bgfx_shader(fs_sprite fragment FS_SPRITE_OUTPUTS)
|
|
|
|
# Custom target to compile all shaders
|
|
add_custom_target(compile_shaders
|
|
DEPENDS ${VS_SPRITE_OUTPUTS} ${FS_SPRITE_OUTPUTS}
|
|
COMMENT "Compiling all BgfxRenderer shaders"
|
|
)
|
|
|
|
# Make BgfxRenderer depend on shaders (optional, enable if you want auto-compilation)
|
|
# add_dependencies(BgfxRenderer compile_shaders)
|