diff --git a/src/kernel/matrix.lisp b/src/kernel/matrix.lisp index 79a4aa9..ba926f7 100644 --- a/src/kernel/matrix.lisp +++ b/src/kernel/matrix.lisp @@ -310,6 +310,6 @@ (p-set! point tx ty tz)))) (defun transform-points! (points matrix) - (mapc #'(lambda (p) (transform-point! p matrix)) points) - points) + (loop for p across points + do (transform-point! p matrix))) diff --git a/src/kernel/point-cloud.lisp b/src/kernel/point-cloud.lisp index 1ab6b69..bd8b729 100644 --- a/src/kernel/point-cloud.lisp +++ b/src/kernel/point-cloud.lisp @@ -23,6 +23,10 @@ (defun make-point-cloud (points) (make-instance 'point-cloud :points points)) +(defmethod freeze-transform ((p-cloud point-cloud)) + (transform-points! (points p-cloud) (transform-matrix (transform p-cloud))) + (reset-transform (transform p-cloud))) + ;;; point generator functions -------------------------------------------------- (defun make-line-points (p1 p2 num-segments) diff --git a/src/kernel/polyhedron.lisp b/src/kernel/polyhedron.lisp index 59abe6c..358b61c 100644 --- a/src/kernel/polyhedron.lisp +++ b/src/kernel/polyhedron.lisp @@ -309,7 +309,7 @@ :name name :mesh-type mesh-type))) -(defun make-cut-cube-polyhedron (side &key (name nil) (mesh-type 'polyhedron)) +(defun make-cut-cube (side &key (name nil) (mesh-type 'polyhedron)) (let ((r (* side 0.5)) (-r (* side -0.5)) (b (* side 0.3))) diff --git a/test/demo-kernel.lisp b/test/demo-kernel.lisp index a30892f..8105ef9 100644 --- a/test/demo-kernel.lisp +++ b/test/demo-kernel.lisp @@ -722,6 +722,40 @@ Display shape bounds, face-normals, and axes. (setf (show-bounds? sphere) t) (add-shapes *scene* (list circle sphere icos)))) +#| +(Demo 21 kernel) freezing shapes =============================================== + +Freeze a shape by transforming its points. +|# +(progn + (defparameter *cube* (make-cube 2.0)) + (with-clear-scene + (add-shapes *scene* (list + (translate-by + (make-group + (list (rotate-by + (make-group + (list + (translate-by + *cube* + (p! 2.5 0 0)))) + (p! 0 45 0)))) + (p! 0 2 0)))) + (setf (show-axis *cube*) 3.0))) + +#| +Hints: +- Press 1 to turn off shaded view so you can see cube axis better. +- Press 7 to turn off global axes display. + +Local freezing: transforms a point-based shape's points by its transform matrix +and resets the transform. +|# +(progn + (format t "~%~%Before freeze: ~a~%" (points *cube*)) + (freeze-transform *cube*) + (format t "After freeze: ~a~%" (points *cube*))) + #| END ============================================================================ |#