project(building-parts)
find_program(PYTHON3_EXECUTABLE NAMES python3 python REQUIRED)
set(PARTS_FILES pier.blend)
set(FURNITURE_FILES furniture.blend furniture-sofa.blend)
set(PARTS_OUTPUT_DIRS)
foreach(PARTS_FILE ${PARTS_FILES})
	get_filename_component(FILE_NAME ${PARTS_FILE} NAME_WE)
	set(PARTS_OUTPUT_DIR ${CMAKE_BINARY_DIR}/resources/buildings/parts/${FILE_NAME})
	add_custom_command(
		OUTPUT ${PARTS_OUTPUT_DIR}
		COMMAND ${CMAKE_COMMAND} -E make_directory ${PARTS_OUTPUT_DIR}
		COMMAND ${BLENDER} ${CMAKE_CURRENT_SOURCE_DIR}/${PARTS_FILE}
			-b -Y -P
			${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_building_parts.py
			-- ${PARTS_OUTPUT_DIR}
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PARTS_FILE} ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_building_parts.py)
	list(APPEND PARTS_OUTPUT_DIRS ${PARTS_OUTPUT_DIR})
endforeach()
set(FURNITURE_BAKED_BLENDS)
set(FURNITURE_ATLAS_PARTS)
list(LENGTH FURNITURE_FILES FURNITURE_COUNT)
foreach(FURNITURE_FILE ${FURNITURE_FILES})
	list(FIND FURNITURE_FILES ${FURNITURE_FILE} FURNITURE_INDEX)
	get_filename_component(FILE_NAME ${FURNITURE_FILE} NAME_WE)
	set(BAKED_BLEND ${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}_baked.blend)
	set(BAKE_SUCCESS ${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}.bake_success)
	set(ATLAS_PART ${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}-atlas.png)
	add_custom_command(
		OUTPUT ${BAKED_BLEND} ${ATLAS_PART} ${BAKE_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -E rm -f ${BAKE_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -E copy
			${CMAKE_CURRENT_SOURCE_DIR}/${FURNITURE_FILE}
			${CMAKE_CURRENT_BINARY_DIR}/${FURNITURE_FILE}
		COMMAND ${BLENDER} -b ${CMAKE_CURRENT_BINARY_DIR}/${FURNITURE_FILE}
			-Y -P ${CMAKE_CURRENT_SOURCE_DIR}/bake_furniture.py
			-- ${ATLAS_PART} ${FURNITURE_INDEX} ${FURNITURE_COUNT}
			${BAKE_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -D FILE=${BAKE_SUCCESS}
			-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FURNITURE_FILE}
			${CMAKE_CURRENT_SOURCE_DIR}/bake_furniture.py)
	list(APPEND FURNITURE_BAKED_BLENDS ${BAKED_BLEND})
	list(APPEND FURNITURE_ATLAS_PARTS ${ATLAS_PART})
endforeach()

# One shared runtime atlas/material for all furniture sources.  Each source
# owns a deterministic vertical band, so rebuilds cannot collide or reorder.
set(FURNITURE_ATLAS_PNG
	${CMAKE_BINARY_DIR}/resources/buildings/parts/furniture-atlas.png)
set(FURNITURE_ATLAS_MATERIAL
	${CMAKE_BINARY_DIR}/resources/buildings/parts/furniture-atlas.material)
add_custom_command(
	OUTPUT ${FURNITURE_ATLAS_PNG} ${FURNITURE_ATLAS_MATERIAL}
	COMMAND ${CMAKE_COMMAND} -E rm -f
		${FURNITURE_ATLAS_PNG} ${FURNITURE_ATLAS_MATERIAL}
	COMMAND ${BLENDER} --factory-startup -b -P
		${CMAKE_CURRENT_SOURCE_DIR}/merge_furniture_atlases.py --
		${FURNITURE_ATLAS_PNG} ${FURNITURE_ATLAS_MATERIAL}
		${FURNITURE_ATLAS_PARTS}
	COMMAND ${CMAKE_COMMAND} -D FILE=${FURNITURE_ATLAS_PNG}
		-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
	COMMAND ${CMAKE_COMMAND} -D FILE=${FURNITURE_ATLAS_MATERIAL}
		-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
	DEPENDS ${FURNITURE_ATLAS_PARTS}
		${CMAKE_CURRENT_SOURCE_DIR}/merge_furniture_atlases.py)

set(FURNITURE_EXPORT_STAMPS)
foreach(FURNITURE_FILE ${FURNITURE_FILES})
	get_filename_component(FILE_NAME ${FURNITURE_FILE} NAME_WE)
	set(PARTS_OUTPUT_DIR ${CMAKE_BINARY_DIR}/resources/buildings/parts/${FILE_NAME})
	set(BAKED_BLEND ${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}_baked.blend)
	set(EXPORT_SUCCESS ${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}.export_success)
	add_custom_command(
		OUTPUT ${PARTS_OUTPUT_DIR} ${EXPORT_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -E rm -rf ${PARTS_OUTPUT_DIR}
		COMMAND ${CMAKE_COMMAND} -E rm -f ${EXPORT_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -E make_directory ${PARTS_OUTPUT_DIR}
		COMMAND ${BLENDER} -b ${BAKED_BLEND}
			-Y -P
			${CMAKE_CURRENT_SOURCE_DIR}/export_furniture_parts.py
			-- ${PARTS_OUTPUT_DIR} ${EXPORT_SUCCESS}
		COMMAND ${CMAKE_COMMAND} -D FILE=${EXPORT_SUCCESS}
			-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		DEPENDS ${BAKED_BLEND}
			${CMAKE_CURRENT_SOURCE_DIR}/export_furniture_parts.py
			${FURNITURE_ATLAS_PNG} ${FURNITURE_ATLAS_MATERIAL})
	list(APPEND PARTS_OUTPUT_DIRS ${PARTS_OUTPUT_DIR} ${EXPORT_SUCCESS})
	list(APPEND FURNITURE_EXPORT_STAMPS ${EXPORT_SUCCESS})
endforeach()

# Validate the shared-atlas contract after every source has exported.  This
# catches embedded texture copies, UVs escaping the source band and shared
# Blender mesh datablocks changing UVs between furniture variants.
set(FURNITURE_VALIDATION
	${CMAKE_CURRENT_BINARY_DIR}/furniture-export.validated)
add_custom_command(
	OUTPUT ${FURNITURE_VALIDATION}
	COMMAND ${CMAKE_COMMAND} -E rm -f ${FURNITURE_VALIDATION}
	COMMAND ${PYTHON3_EXECUTABLE}
		${CMAKE_CURRENT_SOURCE_DIR}/validate_furniture_export.py
		--root ${CMAKE_BINARY_DIR}/resources/buildings/parts
		--source furniture 0 ${FURNITURE_COUNT}
		--source furniture-sofa 1 ${FURNITURE_COUNT}
	COMMAND ${CMAKE_COMMAND} -E touch ${FURNITURE_VALIDATION}
	DEPENDS ${FURNITURE_EXPORT_STAMPS} ${FURNITURE_ATLAS_PNG}
		${FURNITURE_ATLAS_MATERIAL}
		${CMAKE_CURRENT_SOURCE_DIR}/validate_furniture_export.py)
list(APPEND PARTS_OUTPUT_DIRS ${FURNITURE_VALIDATION}
	${FURNITURE_ATLAS_PNG} ${FURNITURE_ATLAS_MATERIAL})
add_custom_target(import_building_parts ALL DEPENDS ${PARTS_OUTPUT_DIRS})

# Phase 6.5.B: opt-in preview gallery (kept out of the default build
# because rendering every asset is slow).  Renders each root with its
# pivot, physical/collision bounds, occupancy cells and POI markers,
# then writes an HTML index with the corresponding atlas UV rectangles.
set(FURNITURE_GALLERY_DIR
	${CMAKE_BINARY_DIR}/resources/buildings/parts/gallery)
add_custom_target(furniture_gallery
	COMMAND ${CMAKE_COMMAND} -E make_directory ${FURNITURE_GALLERY_DIR}
	COMMAND ${BLENDER} -b
		${CMAKE_CURRENT_BINARY_DIR}/furniture_baked.blend -Y -P
		${CMAKE_CURRENT_SOURCE_DIR}/render_furniture_gallery.py --
		${FURNITURE_GALLERY_DIR}
		${CMAKE_BINARY_DIR}/resources/buildings/parts/furniture
	COMMAND ${BLENDER} -b
		${CMAKE_CURRENT_BINARY_DIR}/furniture-sofa_baked.blend -Y -P
		${CMAKE_CURRENT_SOURCE_DIR}/render_furniture_gallery.py --
		${FURNITURE_GALLERY_DIR}
		${CMAKE_BINARY_DIR}/resources/buildings/parts/furniture-sofa
	COMMAND ${PYTHON3_EXECUTABLE}
		${CMAKE_CURRENT_SOURCE_DIR}/generate_furniture_gallery_index.py
		--root ${FURNITURE_GALLERY_DIR}
	DEPENDS ${FURNITURE_EXPORT_STAMPS} ${FURNITURE_ATLAS_PNG}
		${FURNITURE_ATLAS_MATERIAL}
		${CMAKE_CURRENT_SOURCE_DIR}/render_furniture_gallery.py
		${CMAKE_CURRENT_SOURCE_DIR}/generate_furniture_gallery_index.py)
