const flatten = require('../../utils/flatten')
const geom2 = require('../../geometries/geom2')
const geom3 = require('../../geometries/geom3')
const path2 = require('../../geometries/path2')
/**
* Transform the given objects using the given matrix.
* @param {mat4} matrix - a transformation matrix
* @param {...Object} objects - the objects to transform
* @return {Object|Array} the transformed object, or a list of transformed objects
* @alias module:modeling/transforms.transform
*
* @example
* const newsphere = transform(mat4.rotateX(TAU / 8), sphere())
*/
const transform = (matrix, ...objects) => {
// TODO how to check that the matrix is REAL?
objects = flatten(objects)
if (objects.length === 0) throw new Error('wrong number of arguments')
const results = objects.map((object) => {
if (path2.isA(object)) return path2.transform(matrix, object)
if (geom2.isA(object)) return geom2.transform(matrix, object)
if (geom3.isA(object)) return geom3.transform(matrix, object)
return object
})
return results.length === 1 ? results[0] : results
}
module.exports = transform