project(vehicles)

set(VEHICLES_SRC boat-big.blend boat.blend
	boat-gobbot.blend boat-sails.blend
	raft.blend tiny-boat.blend
	forklift.blend crate.blend pad.blend
	wall.blend sedan-a.blend sedan-taxi.blend)
set(VEHICLE_OUTPUT_FILES)

foreach(VEHICLE_FILE ${VEHICLES_SRC})
	get_filename_component(FILE_NAME ${VEHICLE_FILE} NAME_WE)
	set(VEHICLE_OUTPUT_FILE ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.glb)
	add_custom_command(
		OUTPUT ${VEHICLE_OUTPUT_FILE} ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene
		COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/resources/vehicles
		COMMAND ${BLENDER} ${CMAKE_CURRENT_SOURCE_DIR}/${VEHICLE_FILE}
			-b -Y -P
			${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_vehicles.py
			-- ${VEHICLE_OUTPUT_FILE}
		COMMAND ${CMAKE_COMMAND} -D FILE=${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.glb -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		COMMAND ${CMAKE_COMMAND} -D FILE=${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		COMMAND touch ${VEHICLE_OUTPUT_FILE}
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${VEHICLE_FILE} ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_vehicles.py)
	list(APPEND VEHICLE_OUTPUT_FILES ${VEHICLE_OUTPUT_FILE} ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene)
endforeach()

# Convention-built drivable vehicles: same mesh/material export plus a
# generated scene-entity JSON fragment (<name>.vehicle.json, see
# assets/blender/scripts/gen_vehicle.py and vehicles/CAR_MODELING.md).
set(VEHICLES_GEN_SRC sedan-v2.blend)

foreach(VEHICLE_FILE ${VEHICLES_GEN_SRC})
	get_filename_component(FILE_NAME ${VEHICLE_FILE} NAME_WE)
	set(VEHICLE_OUTPUT_FILE ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.glb)
	set(VEHICLE_JSON_FILE ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.vehicle.json)
	add_custom_command(
		OUTPUT ${VEHICLE_OUTPUT_FILE} ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene ${VEHICLE_JSON_FILE}
		COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/resources/vehicles
		COMMAND ${BLENDER} ${CMAKE_CURRENT_SOURCE_DIR}/${VEHICLE_FILE}
			-b -Y -P
			${CMAKE_SOURCE_DIR}/assets/blender/scripts/gen_vehicle.py
			-- ${VEHICLE_OUTPUT_FILE} ${VEHICLE_JSON_FILE}
		COMMAND ${CMAKE_COMMAND} -D FILE=${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.glb -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		COMMAND ${CMAKE_COMMAND} -D FILE=${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_file_size.cmake
		COMMAND touch ${VEHICLE_OUTPUT_FILE}
		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${VEHICLE_FILE} ${CMAKE_SOURCE_DIR}/assets/blender/scripts/gen_vehicle.py)
	list(APPEND VEHICLE_OUTPUT_FILES ${VEHICLE_OUTPUT_FILE} ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.scene ${VEHICLE_JSON_FILE})
endforeach()

add_custom_target(import_vehicles ALL DEPENDS ${VEHICLE_OUTPUT_FILES})

# One-step vehicle refresh: re-export changed .blend files (import_vehicles),
# re-stage the resources for the editScene runtime and re-merge the generated
# vehicle entity JSONs into the demo-taxi scenes.  NOTE: the merge step EDITS
# the source scene JSONs under src/features/editScene/demos/demo-taxi (that is
# the point - merge_vehicle.py preserves entity id/name/transform, so hand
# edits to placement survive).  Run after editing a vehicle .blend:
#   cmake --build <build-dir> --target update_vehicles
set(DEMO_TAXI_DIR ${CMAKE_SOURCE_DIR}/src/features/editScene/demos/demo-taxi)
add_custom_target(update_vehicles
	COMMAND ${CMAKE_COMMAND} -E copy_directory
		${CMAKE_BINARY_DIR}/resources
		${CMAKE_BINARY_DIR}/src/features/editScene/resources
	COMMAND python3 merge_vehicle.py demo_scene_vehicletest.json
		${CMAKE_BINARY_DIR}/resources/vehicles/sedan-v2.vehicle.json sedan1
	COMMAND python3 merge_vehicle.py demo_scene_exterior.json
		${CMAKE_BINARY_DIR}/resources/vehicles/sedan-v2.vehicle.json sedan_plain
	WORKING_DIRECTORY ${DEMO_TAXI_DIR}
	DEPENDS import_vehicles)
