You can get things pretty generic by writing a conversion layer, likely using matrix transformations. You're already thinking along these lines with the pre-processing stage.
At a high level, this would look like:
LoadModel(Model modelData)
CoordinateSystem modelCoordSystem = DetectModelCoordinatesSystem(modelData);
if(modelCoordSystem != engineCoordSystem)
modelData = ConvertModelCoordinates(modelCoordSystem, modelData)
AddModelToDatabase(modelData)
ConvertModelCoordinates(CoordinateSystem current, Model data)
Transform transform = GetTransform(current, engineCoordSystem)
return ApplyTransform(transform , data)
Where GetTransform
would select the correct Matrix Transform to convert from the current orientation to the desired orientation. This implementation does provide for a change in engine system down the road, but it won't be as simple elsewhere in the engine to switch, or it'll mean considerably more work to code every method that assumes a certain coordinate system to be coordinate system agnostic.
As for what happens if you change your mind later. If you were to change your mind, you'd just modify your conversion layer at the same time.
However, if your design is so up in the air you're thinking your coordinate system might change in the future, you might want to nail some things down before going too much further. Remember that it's very difficult to finish something like a game engine. Worrying about making it flexible enough to accept foundational changes later down the road is going to stretch your development time to infinity.