datoviz 源码准备好了

This commit is contained in:
2026-08-13 23:46:10 +08:00
parent aea74a219b
commit 47c649bdf3
70 changed files with 262 additions and 13 deletions
+8 -2
View File
@@ -24,9 +24,12 @@ if (Renderive_render_3D_missing)
return()
endif ()
rcl_load_dependency_environment(${Renderive_render_3D_dependencies})
set(ENV{VULKAN_SDK} "C:/VulkanSDK/1.4.357.0")
find_package(Vulkan REQUIRED)
find_package(PThreads4W REQUIRED)
find_package(PThreads4W QUIET)
if (NOT PThreads4W_FOUND)
rcl_log_append(${CMAKE_CURRENT_LIST_LINE} "[FATAL_ERROR] Renderive_render_3D PThreads4W installation is incomplete. Rebuild render_3D::PThreads4W")
return()
endif ()
find_package(cglm CONFIG REQUIRED)
find_package(volk CONFIG REQUIRED)
find_package(VulkanMemoryAllocator CONFIG REQUIRED)
@@ -44,14 +47,17 @@ if (NOT TARGET Renderive_Kernel)
rcl_log_append(${CMAKE_CURRENT_LIST_LINE} "[FATAL_ERROR] Renderive_render_3D requires Renderive_Kernel")
return()
endif ()
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/datoviz" "${CMAKE_CURRENT_BINARY_DIR}/datoviz")
set(Renderive_render_3D_source_dir "${CMAKE_CURRENT_LIST_DIR}")
append_glob_source(Renderive_render_3D_sources "${Renderive_render_3D_source_dir}")
list(FILTER Renderive_render_3D_sources EXCLUDE REGEX "/tests/")
list(FILTER Renderive_render_3D_sources EXCLUDE REGEX "/datoviz/")
add_library(Renderive_render_3D STATIC ${Renderive_render_3D_sources})
target_include_directories(Renderive_render_3D PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
)
target_compile_features(Renderive_render_3D PUBLIC cxx_std_20)
target_link_libraries(Renderive_render_3D PRIVATE ${Renderive_render_3D_datoviz_targets} tinyobjloader::tinyobjloader)
if (MSVC)
target_compile_options(Renderive_render_3D PRIVATE /utf-8)
endif ()
+12 -5
View File
@@ -96,17 +96,24 @@ block()
)
set(msdfgl_cmake_option "")
if (WIN32)
set(PThreads4W_option ${base_options})
list(APPEND PThreads4W_option
"-DCMAKE_C_FLAGS=-D_WINDLL"
"-DCMAKE_CXX_FLAGS=-D_WINDLL"
)
_register_git_cmake_library(render_3D::PThreads4W
https://github.com/jwinarske/pthreads4w.git
"cmake"
)
rcl_get_effective_install_dir(render_3D::PThreads4W PTHREADS4W_ROOT)
set(PThreads4W_option ${base_options})
list(APPEND PThreads4W_option
"-DDIST_ROOT=${PTHREADS4W_ROOT}"
"-DCMAKE_C_FLAGS=-D_WINDLL"
"-DCMAKE_CXX_FLAGS=-D_WINDLL"
)
rcl_cmake_library_set_cmake_options(render_3D::PThreads4W ${PThreads4W_option})
rcl_cmake_library_set_init_script(render_3D::PThreads4W
"set(PTHREADS4W_ROOT \"${PTHREADS4W_ROOT}\")"
)
rcl_cmake_library_set_clear_script(render_3D::PThreads4W
"unset(PTHREADS4W_ROOT)"
)
endif ()
set(glfw3_option ${base_options})
_register_git_cmake_library(render_3D::glfw3
+24 -6
View File
@@ -1,12 +1,30 @@
include_guard(GLOBAL)
rcl_get_effective_install_dir(render_3D::PThreads4W PTHREADS4W_ROOT)
message("render_3D::PThreads4W PTHREADS4W_ROOT=${PTHREADS4W_ROOT}")
set(PThreads4W_INCLUDE_DIR "${PTHREADS4W_ROOT}/include")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(PThreads4W_LIBRARY "${PTHREADS4W_ROOT}/lib/pthreadVC3d.lib")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64)$")
set(PThreads4W_ARCH "x86_64")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
set(PThreads4W_ARCH "ARM64")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3-6]86)$")
set(PThreads4W_ARCH "x86")
else ()
set(PThreads4W_LIBRARY "${PTHREADS4W_ROOT}/lib/pthreadVC3.lib")
set(PThreads4W_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
endif ()
set(PThreads4W_INSTALL_DIR "${PTHREADS4W_ROOT}/${PThreads4W_ARCH}/${CMAKE_BUILD_TYPE}")
find_path(PThreads4W_INCLUDE_DIR
NAMES pthread.h
PATHS "${PThreads4W_INSTALL_DIR}/include"
NO_DEFAULT_PATH
)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(PThreads4W_LIBRARY_NAME pthreadVC3d)
else ()
set(PThreads4W_LIBRARY_NAME pthreadVC3)
endif ()
find_library(PThreads4W_LIBRARY
NAMES "${PThreads4W_LIBRARY_NAME}"
PATHS "${PThreads4W_INSTALL_DIR}/lib"
NO_DEFAULT_PATH
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PThreads4W
REQUIRED_VARS
@@ -23,4 +41,4 @@ endif ()
mark_as_advanced(
PThreads4W_INCLUDE_DIR
PThreads4W_LIBRARY
)
)
+218
View File
@@ -0,0 +1,218 @@
# Datoviz 移植源码只在这个目录内维护,不加载上游 Datoviz 的总 CMake,也不生成 datoviz 库。
enable_language(C)
set(Renderive_render_3D_datoviz_root "${CMAKE_CURRENT_LIST_DIR}")
set(Renderive_render_3D_datoviz_include_dir "${Renderive_render_3D_datoviz_root}/include")
set(Renderive_render_3D_datoviz_src_dir "${Renderive_render_3D_datoviz_root}/src")
set(Renderive_render_3D_datoviz_external_dir "${Renderive_render_3D_datoviz_root}/external")
# 这些定义保持 Datoviz 当前 Vulkan/scene 源码的编译语义;未迁入的 app/gui/window 等能力明确关闭。
set(Renderive_render_3D_datoviz_os_linux 0)
set(Renderive_render_3D_datoviz_os_macos 0)
set(Renderive_render_3D_datoviz_os_windows 0)
set(Renderive_render_3D_datoviz_os_unix 0)
if(UNIX AND NOT APPLE)
set(Renderive_render_3D_datoviz_os_linux 1)
set(Renderive_render_3D_datoviz_os_unix 1)
elseif(APPLE)
set(Renderive_render_3D_datoviz_os_macos 1)
set(Renderive_render_3D_datoviz_os_unix 1)
elseif(WIN32)
set(Renderive_render_3D_datoviz_os_windows 1)
endif()
set(Renderive_render_3D_datoviz_cc_gcc 0)
set(Renderive_render_3D_datoviz_cc_clang 0)
set(Renderive_render_3D_datoviz_cc_msvc 0)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(Renderive_render_3D_datoviz_cc_gcc 1)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(Renderive_render_3D_datoviz_cc_clang 1)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(Renderive_render_3D_datoviz_cc_msvc 1)
endif()
set(Renderive_render_3D_datoviz_compile_definitions
ENABLE_VALIDATION_LAYERS=$<IF:$<CONFIG:Release>,0,1>
DEBUG=$<IF:$<CONFIG:Debug>,1,0>
VK_NO_PROTOTYPES
OS_LINUX=${Renderive_render_3D_datoviz_os_linux}
OS_MACOS=${Renderive_render_3D_datoviz_os_macos}
OS_WINDOWS=${Renderive_render_3D_datoviz_os_windows}
OS_UNIX=${Renderive_render_3D_datoviz_os_unix}
CC_MSVC=${Renderive_render_3D_datoviz_cc_msvc}
CC_GCC=${Renderive_render_3D_datoviz_cc_gcc}
CC_CLANG=${Renderive_render_3D_datoviz_cc_clang}
DVZ_HAS_ZLIB=1
DVZ_HAS_OPENMP=0
DVZ_HAS_CUDA=0
DVZ_HAS_GLFW=0
DVZ_HAS_KVZ=0
DVZ_HAS_CGLM=1
DVZ_HAS_FREETYPE=1
DVZ_HAS_MSDF_ATLAS=1
DVZ_HAS_DRP2=1
DVZ_HAS_CONTROLLER=1
DVZ_HAS_SCENE=1
DVZ_HAS_APP=0
DVZ_HAS_GUI=0
DVZ_HAS_MIMALLOC=0
DVZ_ALLOCATOR_DEFAULT_MIMALLOC=0
DVZ_ENABLE_ASAN_IN_DEBUG=0
FPNG_NO_SSE=1
VMA_STATIC_VULKAN_FUNCTIONS=0
VMA_DYNAMIC_VULKAN_FUNCTIONS=0
)
if(WIN32)
list(APPEND Renderive_render_3D_datoviz_compile_definitions VK_USE_PLATFORM_WIN32_KHR NOMINMAX)
endif()
# 所有 Datoviz 移植模块共用同一套 C11/C++17、宏定义和目录分组,后续替换 empty 源文件时不改变模块语义。
function(Renderive_render_3D_datoviz_configure_target target)
target_compile_definitions(${target} PUBLIC ${Renderive_render_3D_datoviz_compile_definitions})
target_compile_features(${target} PRIVATE c_std_11 cxx_std_17)
set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON FOLDER Renderive_render_3D/datoviz)
if(MSVC)
target_compile_options(${target} PRIVATE /utf-8)
endif()
endfunction()
# 每个模块从自己的移植目录收集源码;当前 empty.c 只是占位,后续直接覆盖/加入 Datoviz 原源码即可。
function(Renderive_render_3D_datoviz_collect_sources out dir)
file(GLOB _sources CONFIGURE_DEPENDS
"${dir}/*.c"
"${dir}/*.cc"
"${dir}/*.cpp"
"${dir}/*.cxx"
)
set(${out} ${_sources} PARENT_SCOPE)
endfunction()
if(TARGET Vulkan::Headers)
set(Renderive_render_3D_datoviz_vulkan_target Vulkan::Headers)
else()
set(Renderive_render_3D_datoviz_vulkan_target Vulkan::Vulkan)
endif()
# CORE/commonDatoviz 通用基础设施,线程实现沿用当前 PThreads4W 环境。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_common_sources "${Renderive_render_3D_datoviz_src_dir}/common")
add_library(Renderive_render_3D_datoviz_common OBJECT ${Renderive_render_3D_datoviz_common_sources})
target_include_directories(Renderive_render_3D_datoviz_common PUBLIC "${Renderive_render_3D_datoviz_include_dir}" INTERFACE "${Renderive_render_3D_datoviz_src_dir}/common")
target_link_libraries(Renderive_render_3D_datoviz_common PUBLIC PThreads4W::PThreads4W)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_common)
# CORE/fileio:保留 Datoviz fileio + fpng 的边界,压缩统一使用工程已经安装的 ZLIB。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_fileio_sources "${Renderive_render_3D_datoviz_src_dir}/fileio")
list(APPEND Renderive_render_3D_datoviz_fileio_sources "${Renderive_render_3D_datoviz_external_dir}/fpng.cpp")
add_library(Renderive_render_3D_datoviz_fileio OBJECT ${Renderive_render_3D_datoviz_fileio_sources})
target_include_directories(Renderive_render_3D_datoviz_fileio PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_external_dir}" "${Renderive_render_3D_datoviz_src_dir}/common")
target_compile_definitions(Renderive_render_3D_datoviz_fileio PUBLIC FPNG_USE_UNALIGNED_LOADS=0)
target_link_libraries(Renderive_render_3D_datoviz_fileio PUBLIC ZLIB::ZLIB)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_fileio)
# CORE/geom:保持 Datoviz 的 cglm 数学依赖。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_geom_sources "${Renderive_render_3D_datoviz_src_dir}/geom")
add_library(Renderive_render_3D_datoviz_geom OBJECT ${Renderive_render_3D_datoviz_geom_sources})
target_include_directories(Renderive_render_3D_datoviz_geom PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common" "${Renderive_render_3D_datoviz_external_dir}")
target_link_libraries(Renderive_render_3D_datoviz_geom PUBLIC cglm::cglm)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_geom)
# CORE/math:保持 cglm + 线程依赖。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_math_sources "${Renderive_render_3D_datoviz_src_dir}/math")
add_library(Renderive_render_3D_datoviz_math OBJECT ${Renderive_render_3D_datoviz_math_sources})
target_include_directories(Renderive_render_3D_datoviz_math PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common")
target_link_libraries(Renderive_render_3D_datoviz_math PUBLIC cglm::cglm PThreads4W::PThreads4W)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_math)
# CORE/thread:线程模块只依赖线程运行库,不引入 Datoviz 其他 runtime。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_thread_sources "${Renderive_render_3D_datoviz_src_dir}/thread")
add_library(Renderive_render_3D_datoviz_thread OBJECT ${Renderive_render_3D_datoviz_thread_sources})
target_include_directories(Renderive_render_3D_datoviz_thread PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common")
target_link_libraries(Renderive_render_3D_datoviz_thread PUBLIC PThreads4W::PThreads4W)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_thread)
# CONTROLLER/input:先保留 Datoviz 输入数据结构,不接 window/glfw。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_input_sources "${Renderive_render_3D_datoviz_src_dir}/input")
add_library(Renderive_render_3D_datoviz_input OBJECT ${Renderive_render_3D_datoviz_input_sources})
target_include_directories(Renderive_render_3D_datoviz_input PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common")
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_input)
# CONTROLLER/controller:保持 input -> math -> cglm 的原模块关系。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_controller_sources "${Renderive_render_3D_datoviz_src_dir}/controller")
add_library(Renderive_render_3D_datoviz_controller OBJECT ${Renderive_render_3D_datoviz_controller_sources})
target_include_directories(Renderive_render_3D_datoviz_controller PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common" "${Renderive_render_3D_datoviz_src_dir}/controller")
target_link_libraries(Renderive_render_3D_datoviz_controller PUBLIC Renderive_render_3D_datoviz_input Renderive_render_3D_datoviz_math cglm::cglm)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_controller)
# VK/vk:直接使用工程安装的 volk、VMA 和 Vulkan Headers;不编译 Datoviz 自带第三方库。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_vk_sources "${Renderive_render_3D_datoviz_src_dir}/vk")
list(APPEND Renderive_render_3D_datoviz_vk_sources "${Renderive_render_3D_datoviz_external_dir}/vk_mem_alloc.cpp")
add_library(Renderive_render_3D_datoviz_vk OBJECT ${Renderive_render_3D_datoviz_vk_sources})
target_include_directories(Renderive_render_3D_datoviz_vk PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common")
target_link_libraries(Renderive_render_3D_datoviz_vk PUBLIC volk::volk GPUOpen::VulkanMemoryAllocator ${Renderive_render_3D_datoviz_vulkan_target})
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_vk)
# VK/vklite:保持 Datoviz 的轻量 Vulkan abstractionGPU 入口由 vk/volk 提供。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_vklite_sources "${Renderive_render_3D_datoviz_src_dir}/vklite")
add_library(Renderive_render_3D_datoviz_vklite OBJECT ${Renderive_render_3D_datoviz_vklite_sources})
target_include_directories(Renderive_render_3D_datoviz_vklite PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common" PRIVATE "${Renderive_render_3D_datoviz_src_dir}/vklite")
target_link_libraries(Renderive_render_3D_datoviz_vklite PUBLIC Renderive_render_3D_datoviz_vk cglm::cglm)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_vklite)
# DRP2:保留 packet/recording/backend 这一层,后续真实源码迁入时仍由 vklite 执行 Vulkan backend。
Renderive_render_3D_datoviz_collect_sources(Renderive_render_3D_datoviz_drp2_sources "${Renderive_render_3D_datoviz_src_dir}/drp2")
add_library(Renderive_render_3D_datoviz_drp2 OBJECT ${Renderive_render_3D_datoviz_drp2_sources})
target_include_directories(Renderive_render_3D_datoviz_drp2 PUBLIC "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_src_dir}/common" "${Renderive_render_3D_datoviz_external_dir}")
target_compile_definitions(Renderive_render_3D_datoviz_drp2 PUBLIC DVZ_DRP2_HAS_VKLITE=1 DVZ_HAS_SHADERC=0)
target_link_libraries(Renderive_render_3D_datoviz_drp2 PUBLIC Renderive_render_3D_datoviz_vklite)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_drp2)
# SCENE:目录完整保留 Datoviz scene 子模块;当前关闭 shader/font 生成,避免在占位阶段依赖尚未迁入的资源文件。
file(GLOB_RECURSE Renderive_render_3D_datoviz_scene_sources CONFIGURE_DEPENDS
"${Renderive_render_3D_datoviz_src_dir}/scene/*.c"
"${Renderive_render_3D_datoviz_src_dir}/scene/*.cc"
"${Renderive_render_3D_datoviz_src_dir}/scene/*.cpp"
"${Renderive_render_3D_datoviz_src_dir}/scene/*.cxx"
)
add_library(Renderive_render_3D_datoviz_scene OBJECT ${Renderive_render_3D_datoviz_scene_sources})
target_include_directories(Renderive_render_3D_datoviz_scene PUBLIC
"${Renderive_render_3D_datoviz_include_dir}"
"${Renderive_render_3D_datoviz_src_dir}/common"
"${Renderive_render_3D_datoviz_external_dir}"
"${Renderive_render_3D_datoviz_external_dir}/cimgui"
"${Renderive_render_3D_datoviz_src_dir}/scene"
"${Renderive_render_3D_datoviz_src_dir}/scene/annotation"
"${Renderive_render_3D_datoviz_src_dir}/scene/color"
"${Renderive_render_3D_datoviz_src_dir}/scene/core"
"${Renderive_render_3D_datoviz_src_dir}/scene/domain"
"${Renderive_render_3D_datoviz_src_dir}/scene/frame_plan"
"${Renderive_render_3D_datoviz_src_dir}/scene/frame_plan/graph"
"${Renderive_render_3D_datoviz_src_dir}/scene/interaction"
"${Renderive_render_3D_datoviz_src_dir}/scene/plot"
"${Renderive_render_3D_datoviz_src_dir}/scene/render_contract"
"${Renderive_render_3D_datoviz_src_dir}/scene/runtime"
"${Renderive_render_3D_datoviz_src_dir}/scene/scene_emit"
"${Renderive_render_3D_datoviz_src_dir}/scene/shaders"
"${Renderive_render_3D_datoviz_src_dir}/scene/techniques"
"${Renderive_render_3D_datoviz_src_dir}/scene/text"
"${Renderive_render_3D_datoviz_src_dir}/scene/visuals"
)
target_compile_definitions(Renderive_render_3D_datoviz_scene PUBLIC
DVZ_HAS_PRECOMPILED_SHADERS=0
DVZ_HAS_GLSL_SHADERS=0
DVZ_HAS_WGSL_SHADERS=0
DVZ_HAS_EMBEDDED_FONTS=0
DVZ_HAS_FREETYPE=1
DVZ_HAS_MSDF_ATLAS=1
DVZ_HAS_MSDF_SVG=1
DVZ_DRP2_HAS_VKLITE=1
)
target_link_libraries(Renderive_render_3D_datoviz_scene PUBLIC
Renderive_render_3D_datoviz_geom
Renderive_render_3D_datoviz_controller
Renderive_render_3D_datoviz_drp2
cglm::cglm
Freetype::Freetype
msdfgen::msdfgen
msdf-atlas-gen::msdf-atlas-gen
tinyxml2::tinyxml2
ZLIB::ZLIB
)
Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_scene)
# 只把需要的 Datoviz 模块交给 Render_3Dcanvas/window/stream/video/app/gui/qtbridge/wasm 不进入目标。
set(Renderive_render_3D_datoviz_targets
Renderive_render_3D_datoviz_common
Renderive_render_3D_datoviz_fileio
Renderive_render_3D_datoviz_geom
Renderive_render_3D_datoviz_math
Renderive_render_3D_datoviz_thread
Renderive_render_3D_datoviz_input
Renderive_render_3D_datoviz_controller
Renderive_render_3D_datoviz_vk
Renderive_render_3D_datoviz_vklite
Renderive_render_3D_datoviz_drp2
Renderive_render_3D_datoviz_scene
PARENT_SCOPE
)
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File