include(${CMAKE_SOURCE_DIR}/cmake/modules/unity.cmake)

set(DFTDSOURCES
	subsim.cpp
	ai.cpp
	airplane.cpp
	bitstream.cpp
	bzip.cpp
	caustics.cpp
	cfg.cpp
	coast_renderer.cpp
	coastmap.cpp
	convoy.cpp
	countrycodes.cpp
	credits.cpp
	date.cpp
	daysky.cpp
	depth_charge.cpp
	dftdtester/tests.cpp
	event.cpp
	event_manager.cpp
	freeview_display.cpp
	game.cpp
	game_editor.cpp
	game_loader.cpp
	gun_shell.cpp
	height_generator_map.cpp
	highscorelist.cpp
	job_scheduler.cpp
	keys.cpp
	lighting_system.cpp
	logbook.cpp
	logbook_display.cpp
	map_display.cpp
	message_queue.cpp
	moon.cpp
	music.cpp
	parser.cpp
	particle.cpp
	panel_manager.cpp
	physics_system.cpp
	sea_object.cpp
	save_manager.cpp
	sensors.cpp
	scene_environment.cpp
	network_manager.cpp
	scoring_manager.cpp
	ship.cpp
	ping_manager.cpp
	ships_sunk_display.cpp
	simplex_noise.cpp
	sky.cpp
	sonar.cpp
	sonar_operator.cpp
	stars.cpp
	sub_bg_display.cpp
	sub_bridge_display.cpp
	sub_captainscabin_display.cpp
	sub_control_popup.cpp
	sub_damage_display.cpp
	sub_ecard_popup.cpp
	sub_gauges_display.cpp
	sub_ghg_display.cpp
	sub_kdb_display.cpp
	sub_periscope_display.cpp
	sub_recogmanual_display.cpp
	sub_recogmanual_popup.cpp
	sub_soldbuch_display.cpp
	sub_tdc_display.cpp
	sub_tdc_popup.cpp
	sub_torpedo_display.cpp
	sub_torpsetup_display.cpp
	sub_uzo_display.cpp
	sub_valves_display.cpp
	submarine.cpp
	submarine_interface.cpp
	tdc.cpp
	texts.cpp
	tone_reproductor.cpp
	torpedo.cpp
	torpedo_camera_display.cpp
	terrain_manager.cpp
	triangulate.cpp
	user_display.cpp
	user_interface.cpp
	ui_messages.cpp
	water.cpp
	water_splash.cpp
	weather_renderer.cpp
	world.cpp
	)

if(USE_SDL3)
	set(DFTD_AUDIO_BACKEND audio_backend_sdl3.cpp)
	set(DFTD_DISPLAY_BACKEND display_backend_sdl3.cpp)
	set(DFTD_IMAGE_LOADER image_loader_sdl3.cpp)
else()
	set(DFTD_AUDIO_BACKEND audio_backend_sdl2.cpp)
	set(DFTD_DISPLAY_BACKEND display_backend_sdl2.cpp)
	set(DFTD_IMAGE_LOADER image_loader_sdl2.cpp)
endif()

set(DFTDMEDIASOURCES
	${DFTD_AUDIO_BACKEND}
	${DFTD_DISPLAY_BACKEND}
	${DFTD_IMAGE_LOADER}
	bv_tree.cpp
	error.cpp
	font.cpp
	fpsmeasure.cpp
	framebufferobject.cpp
	geoclipmap.cpp
	image.cpp
	make_mesh.cpp
	model.cpp
	perlinnoise.cpp
	player_info.cpp
	postprocessor.cpp
	primitives.cpp
	shader.cpp
	system.cpp
	texture.cpp
	time_freezer.cpp
	vertexbufferobject.cpp
	visibility_manager.cpp
	xml.cpp)

set(FILEHELPER_OBJ
	filehelper.cpp)

set(WIDGET_OBJ
	widget.cpp)

set(GLOBALDATAOBJ
	global_data.cpp
	rnd.cpp
	string_split.cpp)

set(DATADIRSOBJ
	datadirs.cpp)

set(FRUSTUM_OBJ
	frustum.cpp)

set(THREADS_OBJ
	thread.cpp
	mutex.cpp
	condvar.cpp
	log.cpp)

set(OGLEXT_SRC
	oglext/OglExt.cpp
	oglext/RenderingContext.cpp)

set(OGLEXT_INC
	oglext/OglExt.h
	oglext/Macros.h
	oglext/RCHashArray.hpp
	oglext/RenderingContext.hpp)

set(FAULT_HDLR_SRC
	faulthandler.cpp)

set(INC
	ai.h
	airplane.h
	airplane_interface.h
	align16_allocator.h
	angle.h
	binstream.h
	bitstream.h
	bivector.h
	bspline.h
	bv_tree.h
	bzip.h
	caustics.h
	cfg.h
	coastmap.h
	color.h
	condvar.h
	convoy.h
	countrycodes.h
	credits.h
	datadirs.h
	date.h
	daysky.h
	depth_charge.h
	dmath.h
	error.h
	event.h
	faulthandler.h
	filehelper.h
	fixed.h
	font.h
	fpsmeasure.h
	fractal.h
	framebufferobject.h
	freeview_display.h
	frustum.h
	game.h
	game_editor.h
	geoclipmap.h
	gldebug.h
	global_constants.h
	global_data.h
	gun_shell.h
	height_generator.h
	height_generator_map.h
	highscorelist.h
	image.h
	keys.h
	log.h
	logbook.h
	logbook_display.h
	make_mesh.h
	map_display.h
	matrix.h
	matrix3.h
	matrix4.h
	message_queue.h
	model.h
	moon.h
	morton_bivector.h
	music.h
	mutex.h
	network.h
	objcache.h
	ocean_wave_generator.h
	parser.h
	particle.h
	perlinnoise.h
	plane.h
	polygon.h
	postprocessor.h
	primitives.h
	ptrlist.h
	ptrvector.h
	quaternion.h
	random_generator.h
	sea_object.h
	sensors.h
	shader.h
	ship.h
	ship_interface.h
	ships_sunk_display.h
	simplex_noise.h
	singleton.h
	sky.h
	sonar.h
	sonar_operator.h
	sphere.h
	stars.h
	sub_bg_display.h
	sub_bridge_display.h
	sub_captainscabin_display.h
	sub_control_popup.h
	sub_damage_display.h
	sub_ecard_popup.h
	sub_gauges_display.h
	sub_ghg_display.h
	sub_kdb_display.h
	sub_periscope_display.h
	sub_recogmanual_display.h
	sub_recogmanual_popup.h
	sub_soldbuch_display.h
	sub_tdc_display.h
	sub_tdc_popup.h
	sub_torpedo_display.h
	sub_torpsetup_display.h
	sub_uzo_display.h
	sub_valves_display.h
	submarine.h
	submarine_interface.h
	system.h
	tdc.h
	terrain.h
	texts.h
	texture.h
	thread.h
	tile.h
	tile_cache.h
	tone_reproductor.h
	torpedo.h
	torpedo_camera_display.h
	tree_generator.h
	triangle_intersection.h
	triangulate.h
	user_display.h
	user_interface.h
	user_popup.h
	vector2.h
	vector3.h
	vector4.h
	vertexbufferobject.h
	water.h
	water_splash.h
	widget.h
	xml.h
	${SYS_INC}
	)

set(MAIN_SRC ${DFTDSOURCES} ${DFTDMEDIASOURCES} ${FILEHELPER_OBJ} ${WIDGET_OBJ} ${FRUSTUM_OBJ} ${DATADIRSOBJ} ${GLOBALDATAOBJ} ${THREADS_OBJ} ${FAULT_HDLR_SRC} ${OGLEXT_SRC} ${OGLEXT_INC})

if(USE_UNITY STREQUAL "ON")
		enable_unity_build(dangerdeep MAIN_SRC )
endif(USE_UNITY STREQUAL "ON")

add_executable(dangerdeep ${MAIN_SRC} ${INC})

# Precompiled Headers: acelera compilación pre-compilando headers pesados usados frecuentemente
# Requiere CMake 3.16+
# NOTA: Solo incluir headers con declaraciones puras (sin definiciones inline conflictivas)
# Con USE_SDL3, usar nuestro wrapper <SDL.h> (redirige a SDL3 + compat)
# para que SDLK_w, SDL_SwapLE16 etc funcionen
set(SDL_PCH_HDR <SDL.h>)
target_precompile_headers(dangerdeep PRIVATE
	<vector>
	<string>
	<sstream>
	<iostream>
	<fstream>
	${SDL_PCH_HDR}
	"system.h"
	"log.h"
	"cfg.h"
	"texture.h"
	"model.h"
)

target_link_libraries(dangerdeep ${LIBS})

# Herramienta viewmodel: visor de modelos .mdl (usa mymain con VIEWMODEL)
option(BUILD_VIEWMODEL "Build viewmodel tool (model viewer)" OFF)
if(BUILD_VIEWMODEL)
	set(VM_SRC ${MAIN_SRC})
	list(REMOVE_ITEM VM_SRC subsim.cpp)
	list(APPEND VM_SRC viewmodel.cpp)
	add_executable(viewmodel ${VM_SRC} ${INC})
	target_compile_definitions(viewmodel PRIVATE VIEWMODEL)
	target_link_libraries(viewmodel ${LIBS})
	target_include_directories(viewmodel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
	# Sin PCH para evitar conflictos (viewmodel tiene su propio flujo)
	set_target_properties(viewmodel PROPERTIES
		SKIP_PRECOMPILE_HEADERS ON
	)
endif()

# Herramienta oceantest: demo del generador de olas (genera PGM)
option(BUILD_OCEANTEST "Build oceantest tool (ocean wave generator demo)" OFF)
if(BUILD_OCEANTEST)
	add_executable(oceantest oceantest.cpp rnd.cpp)
	target_link_libraries(oceantest ${LIBS})
	target_include_directories(oceantest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
	set_target_properties(oceantest PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
endif()

if(BUILD_UNIT_TESTS)
	add_subdirectory(test)
endif()
