-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
250 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
(in-package #:kons-9) | ||
|
||
;;;; fractal-subdiv-mesh =============================================================== | ||
|
||
;;; subclass of subdiv-mesh which does fractal mesh subdivision | ||
|
||
(defclass-kons-9 fractal-subdiv-mesh (refine-subdiv-mesh) | ||
((vertex-displacement 1.0))) | ||
|
||
(defmethod compute-subdiv-points ((mesh fractal-subdiv-mesh) (subdiv fractal-subdiv-mesh)) | ||
(call-next-method) ;generate refined vertex positions | ||
(setf (points subdiv) (map 'vector #'point (sm-vertices subdiv))) ;update polyhedron points | ||
(compute-normals subdiv) ;update normals | ||
(set-fractal-points mesh subdiv)) | ||
|
||
(defun set-fractal-points (mesh subdiv) | ||
(let ((points (points subdiv)) | ||
(normals (point-normals subdiv)) | ||
(vertices (sm-vertices subdiv)) | ||
(displacement (vertex-displacement mesh))) | ||
(loop for i from (length (sm-vertices mesh)) below (length (sm-vertices subdiv)) | ||
do (let ((p (aref points i)) | ||
(n (aref normals i))) | ||
(setf (point (aref vertices i)) | ||
(p+ p (p* n (rand1 displacement)))))) | ||
(setf (vertex-displacement subdiv) (/ displacement 2.0)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
(in-package #:kons-9) | ||
|
||
;;;; refine-subdiv-mesh =============================================================== | ||
|
||
;;; subclass of subdiv-mesh which does simple mesh refinement | ||
|
||
(defclass-kons-9 refine-subdiv-mesh (subdiv-mesh) | ||
()) | ||
|
||
(defmethod compute-subdiv-points ((mesh refine-subdiv-mesh) (subdiv refine-subdiv-mesh)) | ||
(set-refine-face-vertex-points mesh subdiv) | ||
(set-refine-edge-vertex-points mesh subdiv) | ||
(set-refine-vertex-vertex-points mesh subdiv)) | ||
|
||
;;; the methods below are the same as for smooth-subdiv-mesh paper but simply assume | ||
;;; all edges and vertices are boundary | ||
|
||
(defun set-refine-face-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(let ((m (half-edge-cycle-length mesh h)) | ||
(v (vertex h)) | ||
(i (+ (length (sm-vertices mesh)) (face h)))) | ||
(setf (point (sm-nth-vertex subdiv i)) | ||
(p+ (point (sm-nth-vertex subdiv i)) | ||
(p/ (point (sm-nth-vertex mesh v)) m)))))) | ||
|
||
(defun set-refine-edge-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(let ((v0 (vertex h)) | ||
(v1 (vertex (sm-nth-half-edge mesh (next-half-edge h)))) | ||
(j (+ (length (sm-vertices mesh)) (length (sm-faces mesh)) (edge h)))) | ||
(setf (point (sm-nth-vertex subdiv j)) | ||
(p/ (p+ (point (sm-nth-vertex mesh v0)) | ||
(point (sm-nth-vertex mesh v1))) | ||
2))))) | ||
|
||
(defun set-refine-vertex-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(let ((v (vertex h))) | ||
(setf (point (sm-nth-vertex subdiv v)) | ||
(p:copy (point (sm-nth-vertex mesh v))))))) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
(in-package #:kons-9) | ||
|
||
;;;; smooth-subdiv-mesh ======================================================== | ||
|
||
;;; subclass of subdiv-mesh which does smooth mesh refinement | ||
;;; smoothing based on https://onrendering.com/data/papers/catmark/HalfedgeCatmullClark.pdf | ||
|
||
(defclass-kons-9 smooth-subdiv-mesh (subdiv-mesh) | ||
()) | ||
|
||
(defmethod compute-subdiv-points ((mesh smooth-subdiv-mesh) (subdiv smooth-subdiv-mesh)) | ||
(set-smooth-face-vertex-points mesh subdiv) | ||
(set-smooth-edge-vertex-points mesh subdiv) | ||
(set-smooth-vertex-vertex-points mesh subdiv)) | ||
;; TODO - sharp creases | ||
;; (set-subdiv-edge-vertex-crease-points mesh subdiv) | ||
;; (set-subdiv-vertex-vertex-crease-points mesh subdiv) | ||
;; (set-subdiv-edge-sharpness mesh subdiv) | ||
|
||
(defun set-smooth-face-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(let ((m (half-edge-cycle-length mesh h)) | ||
(v (vertex h)) | ||
(i (+ (length (sm-vertices mesh)) (face h)))) | ||
(setf (point (sm-nth-vertex subdiv i)) | ||
(p+ (point (sm-nth-vertex subdiv i)) | ||
(p/ (point (sm-nth-vertex mesh v)) m)))))) | ||
|
||
(defun set-smooth-edge-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(if (is-boundary-edge? (sm-nth-edge mesh (edge h))) | ||
(let ((v0 (vertex h)) | ||
(v1 (vertex (sm-nth-half-edge mesh (next-half-edge h)))) | ||
(j (+ (length (sm-vertices mesh)) (length (sm-faces mesh)) (edge h)))) | ||
(setf (point (sm-nth-vertex subdiv j)) | ||
(p/ (p+ (point (sm-nth-vertex mesh v0)) | ||
(point (sm-nth-vertex mesh v1))) | ||
2))) | ||
(let ((v (vertex h)) | ||
(i (+ (length (sm-vertices mesh)) (face h))) | ||
(j (+ (length (sm-vertices mesh)) (length (sm-faces mesh)) (edge h)))) | ||
(setf (point (sm-nth-vertex subdiv j)) | ||
(p+ (point (sm-nth-vertex subdiv j)) | ||
(p/ (p+ (point (sm-nth-vertex mesh v)) | ||
(point (sm-nth-vertex subdiv i))) | ||
4))))))) | ||
|
||
;;; TODO - sharp creases | ||
;; (defun set-smooth-edge-vertex-crease-points (mesh subdiv) | ||
;; (do-array (x h (sm-half-edges mesh)) | ||
;; (when (> (sharpness (sm-nth-edge mesh (edge h))) 0) | ||
;; (let ((v0 (vertex h)) | ||
;; (v1 (vertex (sm-nth-half-edge mesh (next-half-edge h)))) | ||
;; (j (+ (length (sm-vertices mesh)) (length (sm-faces mesh)) (edge h)))) | ||
;; (setf (point (sm-nth-vertex subdiv j)) | ||
;; (p:lerp (point (sm-nth-vertex subdiv j)) | ||
;; (p/ (p+ (point (sm-nth-vertex mesh v0)) | ||
;; (point (sm-nth-vertex mesh v1))) | ||
;; 2) | ||
;; (sharpness (sm-nth-edge mesh (edge h))))))))) | ||
|
||
(defun set-smooth-vertex-vertex-points (mesh subdiv) | ||
(do-array (x h (sm-half-edges mesh)) | ||
(let ((v (vertex h))) | ||
(if (is-boundary-vertex? (sm-nth-vertex mesh v)) | ||
(setf (point (sm-nth-vertex subdiv v)) | ||
(p:copy (point (sm-nth-vertex mesh v)))) | ||
(let ((n (half-edge-valence mesh h)) | ||
(i (+ (length (sm-vertices mesh)) (face h))) | ||
(j (+ (length (sm-vertices mesh)) (length (sm-faces mesh)) (edge h)))) | ||
(setf (point (sm-nth-vertex subdiv v)) | ||
(p+ (point (sm-nth-vertex subdiv v)) | ||
(p/ (p+ (p+ (p* (point (sm-nth-vertex subdiv j)) 4) | ||
(p:negate (point (sm-nth-vertex subdiv i)))) | ||
(p* (point (sm-nth-vertex mesh v)) (- n 3))) | ||
(* n n))))))))) | ||
|
||
;;; TODO - sharp creases | ||
;; (defun set-smooth-vertex-vertex-crease-points (mesh subdiv) | ||
;; (do-array (x h (sm-half-edges mesh)) | ||
;; (let* ((v (vertex h)) | ||
;; (sharpness (sm-vertex-sharpness mesh v))) | ||
;; (when (> sharpness 0) | ||
;; (setf (point (sm-nth-vertex subdiv v)) | ||
;; (p:lerp (point (sm-nth-vertex subdiv v)) | ||
;; (point (sm-nth-vertex mesh v)) | ||
;; sharpness)))))) | ||
|
||
;;; TODO - sharp creases | ||
;; (defun set-smooth-edge-sharpness (mesh subdiv) | ||
;; (do-array (i e (sm-edges mesh)) | ||
;; (setf (sharpness (sm-nth-edge subdiv (* 2 i))) (sharpness e)) | ||
;; (setf (sharpness (sm-nth-edge subdiv (+ (* 2 i) 1))) (sharpness e)))) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters