# Copyright (C) 2002-2025 UFO: Alien Invasion.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

cmake_minimum_required(VERSION 3.13)

project(uforadiant DESCRIPTION "UFORadiant map editor for UFO:AI.")

find_package(Intl)
find_package(GTK2)
find_package(GTKGL)
find_package(GTKSourceView2)
find_package(LibXml2)
find_package(OGG)
find_package(OpenAL)
find_package(SDL "2" EXACT)
find_package(VORBIS)
find_package(ZLIB)

set(UFORADIANT_SOURCES
	../../shared/entitiesdef.cpp
	../../shared/parse.cpp

	libs/Instance.cpp
	libs/gtkutil/MenuItemAccelerator.cpp
	libs/gtkutil/ModalProgressDialog.cpp
	libs/gtkutil/PanedPosition.cpp
	libs/gtkutil/RegistryConnector.cpp
	libs/gtkutil/SourceView.cpp
	libs/gtkutil/TextEntryDialog.cpp
	libs/gtkutil/TextPanel.cpp
	libs/gtkutil/Timer.cpp
	libs/gtkutil/TreeModel.cpp
	libs/gtkutil/VFSTreePopulator.cpp
	libs/gtkutil/WindowPosition.cpp
	libs/gtkutil/button.cpp
	libs/gtkutil/clipboard.cpp
	libs/gtkutil/cursor.cpp
	libs/gtkutil/dialog.cpp
	libs/gtkutil/filechooser.cpp
	libs/gtkutil/frame.cpp
	libs/gtkutil/glfont.cpp
	libs/gtkutil/glwidget.cpp
	libs/gtkutil/image.cpp
	libs/gtkutil/menu.cpp
	libs/gtkutil/menu/PopupMenu.cpp
	libs/gtkutil/messagebox.cpp
	libs/gtkutil/window.cpp
	libs/gtkutil/window/PersistentTransientWindow.cpp
	libs/picomodel/RenderablePicoModel.cpp
	libs/picomodel/RenderablePicoSurface.cpp
	libs/picomodel/model.cpp
	libs/xmlutil/Document.cpp
	libs/xmlutil/Node.cpp
	radiant/brush/Brush.cpp
	radiant/brush/BrushClipPlane.cpp
	radiant/brush/BrushInstance.cpp
	radiant/brush/BrushModule.cpp
	radiant/brush/BrushTokens.cpp
	radiant/brush/ContentsFlagsValue.cpp
	radiant/brush/Face.cpp
	radiant/brush/FaceInstance.cpp
	radiant/brush/FaceShader.cpp
	radiant/brush/FaceTexDef.cpp
	radiant/brush/TexDef.cpp
	radiant/brush/TextureProjection.cpp
	radiant/brush/brushmanip.cpp
	radiant/brush/construct/Cone.cpp
	radiant/brush/construct/Cuboid.cpp
	radiant/brush/construct/Prism.cpp
	radiant/brush/construct/Rock.cpp
	radiant/brush/construct/Sphere.cpp
	radiant/brush/construct/Terrain.cpp
	radiant/brush/csg/csg.cpp
	radiant/brush/winding.cpp
	radiant/brushexport/BrushExportOBJ.cpp
	radiant/camera/CamWnd.cpp
	radiant/camera/Camera.cpp
	radiant/camera/CameraSettings.cpp
	radiant/camera/GlobalCamera.cpp
	radiant/camera/view.cpp
	radiant/clipper/ClipPoint.cpp
	radiant/clipper/Clipper.cpp
	radiant/commands.cpp
	radiant/dialog.cpp
	radiant/entity/EntityCreator.cpp
	radiant/entity/EntitySettings.cpp
	radiant/entity/eclassmodel/EClassModel.cpp
	radiant/entity/eclassmodel/EClassModelInstance.cpp
	radiant/entity/eclassmodel/EClassModelNode.cpp
	radiant/entity/entity.cpp
	radiant/entity/entitydef/EntityClassManager.cpp
	radiant/entity/entitydef/EntityClassMgrModule.cpp
	radiant/entity/entitydef/EntityClassScanner.cpp
	radiant/entity/entitydef/EntityDefinitionModule.cpp
	radiant/entity/entitymodule.cpp
	radiant/entity/generic/GenericEntity.cpp
	radiant/entity/generic/GenericEntityInstance.cpp
	radiant/entity/generic/GenericEntityNode.cpp
	radiant/entity/group/Group.cpp
	radiant/entity/group/GroupInstance.cpp
	radiant/entity/group/GroupNode.cpp
	radiant/entity/light/Light.cpp
	radiant/entity/light/LightInstance.cpp
	radiant/entity/light/LightNode.cpp
	radiant/entity/model/MiscModel.cpp
	radiant/entity/model/MiscModelInstance.cpp
	radiant/entity/model/MiscModelNode.cpp
	radiant/entity/particle/MiscParticle.cpp
	radiant/entity/particle/MiscParticleInstance.cpp
	radiant/entity/particle/MiscParticleNode.cpp
	radiant/entity/sound/MiscSound.cpp
	radiant/entity/sound/MiscSoundInstance.cpp
	radiant/entity/sound/MiscSoundNode.cpp
	radiant/entity/targetable.cpp
	radiant/environment.cpp
	radiant/eventmanager/Accelerator.cpp
	radiant/eventmanager/Command.cpp
	radiant/eventmanager/EventManager.cpp
	radiant/eventmanager/Modifiers.cpp
	radiant/eventmanager/MouseEvents.cpp
	radiant/eventmanager/Toggle.cpp
	radiant/eventmanager/WidgetToggle.cpp
	radiant/exec.cpp
	radiant/filesystem/FileSystem.cpp
	radiant/filesystem/FileSystemModule.cpp
	radiant/filesystem/directory/DirectoryArchive.cpp
	radiant/filesystem/pk3/ZipArchive.cpp
	radiant/filetypes.cpp
	radiant/filters/BasicFilterSystem.cpp
	radiant/filters/LevelFilter.cpp
	radiant/filters/XMLFilter.cpp
	radiant/filters/filters.cpp
	radiant/image.cpp
	radiant/imagemodules.cpp
	radiant/log/console.cpp
	radiant/main.cpp
	radiant/map/AutoSaver.cpp
	radiant/map/MapCompiler.cpp
	radiant/map/MapFileChooserPreview.cpp
	radiant/map/RootNode.cpp
	radiant/map/algorithm/Traverse.cpp
	radiant/map/map.cpp
	radiant/map/mapmodule.cpp
	radiant/map/parse.cpp
	radiant/map/write.cpp
	radiant/material/LicenseParser.cpp
	radiant/material/MaterialModule.cpp
	radiant/material/MaterialShader.cpp
	radiant/material/MaterialShaderModule.cpp
	radiant/material/MaterialShaderSystem.cpp
	radiant/material/MaterialSystem.cpp
	radiant/model.cpp
	radiant/namespace/NameObserver.cpp
	radiant/namespace/Namespace.cpp
	radiant/namespace/NamespaceModule.cpp
	radiant/particles/ParticleParser.cpp
	radiant/particles/ParticleSystem.cpp
	radiant/pathfinding/Pathfinding.cpp
	radiant/pathfinding/PathfindingModule.cpp
	radiant/pathfinding/Routing.cpp
	radiant/pathfinding/RoutingLump.cpp
	radiant/pathfinding/RoutingLumpLoader.cpp
	radiant/pathfinding/RoutingRenderable.cpp
	radiant/plugin.cpp
	radiant/referencecache/nullmodel.cpp
	radiant/referencecache/referencecache.cpp
	radiant/render/OpenGLModule.cpp
	radiant/render/OpenGLRenderSystem.cpp
	radiant/render/backend/OpenGLShader.cpp
	radiant/render/backend/OpenGLShaderPass.cpp
	radiant/render/frontend/SphereRenderable.cpp
	radiant/scenegraph/CompiledGraph.cpp
	radiant/scenegraph/SceneGraphModule.cpp
	radiant/scenegraph/treemodel.cpp
	radiant/script/ScriptLibrary.cpp
	radiant/script/ScriptLibraryModule.cpp
	radiant/script/ScriptTokenWriter.cpp
	radiant/script/ScriptTokeniser.cpp
	radiant/select.cpp
	radiant/selection/BestPoint.cpp
	radiant/selection/Intersection.cpp
	radiant/selection/Manipulatables.cpp
	radiant/selection/Manipulators.cpp
	radiant/selection/Planes.cpp
	radiant/selection/RadiantSelectionSystem.cpp
	radiant/selection/RadiantWindowObserver.cpp
	radiant/selection/SelectionSystemModule.cpp
	radiant/selection/SelectionTest.cpp
	radiant/selection/TransformationVisitors.cpp
	radiant/selection/algorithm/Entity.cpp
	radiant/selection/algorithm/General.cpp
	radiant/selection/algorithm/Group.cpp
	radiant/selection/algorithm/Primitives.cpp
	radiant/selection/algorithm/Shader.cpp
	radiant/selection/algorithm/Transformation.cpp
	radiant/selection/selectionset/SelectionSet.cpp
	radiant/selection/selectionset/SelectionSetManager.cpp
	radiant/selection/selectionset/SelectionSetToolmenu.cpp
	radiant/selection/shaderclipboard/ShaderClipboard.cpp
	radiant/selection/shaderclipboard/Texturable.cpp
	radiant/server.cpp
	radiant/settings/GameDescription.cpp
	radiant/settings/GameManager.cpp
	radiant/settings/GameManagerModule.cpp
	radiant/settings/PreferenceDialog.cpp
	radiant/settings/Win32Registry.cpp
	radiant/sidebar/JobInfo.cpp
	radiant/sidebar/MapInfo.cpp
	radiant/sidebar/PrefabSelector.cpp
	radiant/sidebar/entityinspector/AddPropertyDialog.cpp
	radiant/sidebar/entityinspector/BooleanPropertyEditor.cpp
	radiant/sidebar/entityinspector/ColourPropertyEditor.cpp
	radiant/sidebar/entityinspector/EntityInspector.cpp
	radiant/sidebar/entityinspector/EntityPropertyEditor.cpp
	radiant/sidebar/entityinspector/FloatPropertyEditor.cpp
	radiant/sidebar/entityinspector/ModelPropertyEditor.cpp
	radiant/sidebar/entityinspector/ParticlePropertyEditor.cpp
	radiant/sidebar/entityinspector/PropertyEditor.cpp
	radiant/sidebar/entityinspector/PropertyEditorFactory.cpp
	radiant/sidebar/entityinspector/SkinChooser.cpp
	radiant/sidebar/entityinspector/SkinPropertyEditor.cpp
	radiant/sidebar/entityinspector/SoundPropertyEditor.cpp
	radiant/sidebar/entityinspector/SpawnflagsPropertyEditor.cpp
	radiant/sidebar/entityinspector/Vector3PropertyEditor.cpp
	radiant/sidebar/entitylist/EntityList.cpp
	radiant/sidebar/entitylist/GraphTreeModel.cpp
	radiant/sidebar/sidebar.cpp
	radiant/sidebar/surfaceinspector/surfaceinspector.cpp
	radiant/sidebar/texturebrowser.cpp
	radiant/sound/SoundManager.cpp
	radiant/sound/SoundManagerModule.cpp
	radiant/sound/SoundPlayer.cpp
	radiant/stacktrace.cpp
	radiant/textool/TexTool.cpp
	radiant/textool/TexToolItem.cpp
	radiant/textool/item/BrushItem.cpp
	radiant/textool/item/FaceItem.cpp
	radiant/textool/item/FaceVertexItem.cpp
	radiant/textures/Texture.cpp
	radiant/textures/TextureManipulator.cpp
	radiant/textures/TexturesMap.cpp
	radiant/textures/TexturesModule.cpp
	radiant/timer.cpp
	radiant/ufoscript/UFOScript.cpp
	radiant/ufoscript/common/DataBlock.cpp
	radiant/ufoscript/common/Parser.cpp
	radiant/ufoscript/common/ScriptValues.cpp
	radiant/ufoscript/mapdef/MapDef.cpp
	radiant/ufoscript/terrain/Terrain.cpp
	radiant/ui/about/AboutDialog.cpp
	radiant/ui/brush/QuerySidesDialog.cpp
	radiant/ui/colourscheme/ColourScheme.cpp
	radiant/ui/colourscheme/ColourSchemeEditor.cpp
	radiant/ui/colourscheme/ColourSchemeManager.cpp
	radiant/ui/commandlist/CommandList.cpp
	radiant/ui/commandlist/ShortcutChooser.cpp
	radiant/ui/common/MapPreview.cpp
	radiant/ui/common/MaterialDefinitionView.cpp
	radiant/ui/common/ModelPreview.cpp
	radiant/ui/common/RenderableAABB.cpp
	radiant/ui/common/ShaderChooser.cpp
	radiant/ui/common/ShaderSelector.cpp
	radiant/ui/common/SoundChooser.cpp
	radiant/ui/common/SoundPreview.cpp
	radiant/ui/common/TexturePreviewCombo.cpp
	radiant/ui/common/ToolbarCreator.cpp
	radiant/ui/common/UFOScriptDefinitionView.cpp
	radiant/ui/common/UMPDefinitionView.cpp
	radiant/ui/filterdialog/FilterDialog.cpp
	radiant/ui/filterdialog/FilterEditor.cpp
	radiant/ui/findbrush/findbrush.cpp
	radiant/ui/findshader/FindShader.cpp
	radiant/ui/lightdialog/LightDialog.cpp
	radiant/ui/mainframe/SplitPaneLayout.cpp
	radiant/ui/mainframe/mainframe.cpp
	radiant/ui/maptools/ErrorCheckDialog.cpp
	radiant/ui/materialeditor/MaterialEditor.cpp
	radiant/ui/menu/FiltersMenu.cpp
	radiant/ui/menu/UMPMenu.cpp
	radiant/ui/modelselector/ModelSelector.cpp
	radiant/ui/mru/MRU.cpp
	radiant/ui/mru/MRUMenuItem.cpp
	radiant/ui/ortho/EntityClassChooser.cpp
	radiant/ui/ortho/OrthoContextMenu.cpp
	radiant/ui/overlay/Overlay.cpp
	radiant/ui/particles/ParticleEditor.cpp
	radiant/ui/particles/ParticlePreview.cpp
	radiant/ui/particles/ParticleSelector.cpp
	radiant/ui/scripteditor/UFOScriptEditor.cpp
	radiant/ui/splash/Splash.cpp
	radiant/ui/textureoverview/TextureOverviewDialog.cpp
	radiant/ui/transform/TransformDialog.cpp
	radiant/ui/uimanager/MenuItem.cpp
	radiant/ui/uimanager/MenuManager.cpp
	radiant/ui/uimanager/UIManager.cpp
	radiant/ui/umpeditor/UMPEditor.cpp
	radiant/ump/UMPAssembly.cpp
	radiant/ump/UMPFile.cpp
	radiant/ump/UMPModule.cpp
	radiant/ump/UMPSystem.cpp
	radiant/ump/UMPTile.cpp
	radiant/undo/RadiantUndoSystem.cpp
	radiant/undo/RadiantUndoSystemModule.cpp
	radiant/undo/UndoStateTracker.cpp
	radiant/url.cpp
	radiant/windowobservers.cpp
	radiant/xmlregistry/RegistryTree.cpp
	radiant/xmlregistry/XMLRegistry.cpp
	radiant/xmlregistry/XMLRegistryModule.cpp
	radiant/xyview/GlobalXYWnd.cpp
	radiant/xyview/XYWnd.cpp
	radiant/xyview/grid/Grid.cpp

	../../libs/picomodel/picointernal.c
	../../libs/picomodel/picomodel.c
	../../libs/picomodel/picomodules.c
	../../libs/picomodel/pm_ase.c
	../../libs/picomodel/pm_md2.c
	../../libs/picomodel/pm_md3.c
	../../libs/picomodel/pm_obj.c
)

# platform specific sources
if(WIN32)
	list(APPEND UFORADIANT_SOURCES
		"radiant/radiant.rc"
	)
endif()

# uforadiant is executable
add_executable(${PROJECT_NAME} EXCLUDE_FROM_ALL ${UFORADIANT_SOURCES})

# For generic no-config case (e.g. with mingw, gcc, ...)
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/radiant)
# For multi-config builds like msvc
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
	string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
	set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/radiant)
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)

target_compile_definitions(${PROJECT_NAME} PRIVATE -DCOMPILE_MAP)
target_compile_definitions(${PROJECT_NAME} PRIVATE -DPATH_UFORADIANTICON_FILE="${CMAKE_SOURCE_DIR}/build/projects/radiant.ico")

target_include_directories(${PROJECT_NAME}
	PRIVATE include
	PRIVATE libs
	PRIVATE ../../libs/picomodel
	PRIVATE ${SDL_INCLUDE_DIR}
	PRIVATE ${GTK2_INCLUDE_DIRS}
	PRIVATE ${GTKSourceView2_INCLUDE_DIR}
	PRIVATE ${GTKGL_INCLUDE_DIRS}
	PRIVATE ${LIBXML2_INCLUDE_DIR}
	PRIVATE ${OPENAL_INCLUDE_DIR}
	PRIVATE ${VORBIS_INCLUDE_DIR}
	PRIVATE ${OGG_INCLUDE_DIR}
	PRIVATE ${Intl_INCLUDE_DIRS}
	PRIVATE ${ZLIB_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME}
	${GTK2_LIBRARIES}
	${GTKSourceView2_LIBRARY}
	${GTKGL_LIBRARIES}
	${LIBXML2_LIBRARY}
	${VORBIS_LIBRARY_FILE}
	${VORBIS_LIBRARY}
	${OGG_LIBRARIES}
	${OPENAL_LIBRARY}
	${JPEG_LIBRARIES}
	${PNG_LIBRARIES}
	${ZLIB_LIBRARIES}
	${CMAKE_DL_LIBS}
)

if(WIN32)
	target_link_libraries(${PROJECT_NAME}
		opengl32
		imm32
		${Intl_LIBRARIES}
		version
		winmm
	)
elseif(APPLE)
	target_link_libraries(${PROJECT_NAME}
		${Intl_LIBRARIES}
	)
elseif(UNIX)
	target_link_libraries(${PROJECT_NAME}
		GL
		X11
	)
	if(NOT CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
		target_link_libraries(${PROJECT_NAME}
			rt
		)
	endif()
endif()
