Implementing make-mesh
[mixamesh.git] / mixamesh-tests.lisp
blob7fb81ec6fce740c9967eed8ea3f5956b48cf8918
1 (defpackage :mixamesh-tests
2 (:use :cl :iterate :cl-tuples :mixamesh))
4 (in-package :mixamesh-tests)
7 ;; create platonic solids
9 (def-mesh-type wire-mesh (mesh) ())
11 (defun make-cube ()
12 (let ((result (make-instance 'wire-mesh)))
13 (funcall result :add-vertex (make-vertex3d* 4.0 4.0 4.0 1.0))
14 (funcall result :add-vertex (make-vertex3d* 5.0 4.0 4.0 1.0))
15 (funcall result :add-vertex (make-vertex3d* 5.0 5.0 4.0 1.0))
16 (funcall result :add-vertex (make-vertex3d* 4.0 5.0 4.0 1.0))
17 (funcall result :add-vertex (make-vertex3d* 5.0 4.0 5.0 1.0))
18 (funcall result :add-vertex (make-vertex3d* 5.0 5.0 5.0 1.0))
19 (funcall result :add-vertex (make-vertex3d* 4.0 5.0 5.0 1.0))
20 (funcall result :add-vertex (make-vertex3d* 4.0 4.0 5.0 1.0))
21 (funcall result :add-vertex (make-vertex3d* 4.0 5.0 5.0 1.0))
22 (funcall result :add-vertex (make-vertex3d* 4.0 5.0 4.0 1.0))
23 (funcall result :add-vertex (make-vertex3d* 5.0 4.0 5.0 1.0))
24 (funcall result :add-vertex (make-vertex3d* 5.0 4.0 4.0 1.0))
25 (funcall result :add-face (make-triangle* 0 2 1))
26 (funcall result :add-face (make-triangle* 0 3 2))
27 (funcall result :add-face (make-triangle* 1 5 4))
28 (funcall result :add-face (make-triangle* 1 2 5))
29 (funcall result :add-face (make-triangle* 4 6 7))
30 (funcall result :add-face (make-triangle* 4 5 6))
31 (funcall result :add-face (make-triangle* 7 3 0))
32 (funcall result :add-face (make-triangle* 7 6 3))
33 (funcall result :add-face (make-triangle* 9 5 2))
34 (funcall result :add-face (make-triangle* 9 8 5))
35 (funcall result :add-face (make-triangle* 0 11 10))
36 (funcall result :add-face (make-triangle* 0 10 7))
37 result))
39 (defun make-tetrahedron ()
40 (let ((result (make-instance 'wire-mesh)))
41 (funcall result :add-vertex (make-vertex3d* 0.0 -0.525731 0.850651 1.0))
42 (funcall result :add-vertex (make-vertex3d* 0.850651 0.0 0.525731 1.0))
43 (funcall result :add-vertex (make-vertex3d* 0.850651 0.0 -0.525731 1.0))
44 (funcall result :add-vertex (make-vertex3d* -0.850651 0.0 -0.525731 1.0))
45 (funcall result :add-vertex (make-vertex3d* -0.850651 0.0 0.525731 1.0))
46 (funcall result :add-vertex (make-vertex3d* -0.525731 0.850651 0.0 1.0))
47 (funcall result :add-vertex (make-vertex3d* 0.525731 0.850651 0.0 1.0))
48 (funcall result :add-vertex (make-vertex3d* 0.525731 -0.850651 0.0 1.0))
49 (funcall result :add-vertex (make-vertex3d* -0.525731 -0.850651 0.0 1.0))
50 (funcall result :add-vertex (make-vertex3d* 0.0 -0.525731 -0.850651 1.0))
51 (funcall result :add-vertex (make-vertex3d* 0.0 0.525731 -0.850651 1.0))
52 (funcall result :add-vertex (make-vertex3d* 0.0 0.525731 0.850651 1.0))
53 (funcall result :add-face (make-triangle* 6 2 1))
54 (funcall result :add-face (make-triangle* 2 7 1))
55 (funcall result :add-face (make-triangle* 5 4 3))
56 (funcall result :add-face (make-triangle* 8 3 4))
57 (funcall result :add-face (make-triangle* 11 5 6))
58 (funcall result :add-face (make-triangle* 10 6 5))
59 (funcall result :add-face (make-triangle* 2 10 9))
60 (funcall result :add-face (make-triangle* 3 9 10))
61 (funcall result :add-face (make-triangle* 9 8 7))
62 (funcall result :add-face (make-triangle* 0 7 8))
63 (funcall result :add-face (make-triangle* 1 0 11))
64 (funcall result :add-face (make-triangle* 4 11 0))
65 (funcall result :add-face (make-triangle* 10 2 6))
66 (funcall result :add-face (make-triangle* 11 6 1))
67 (funcall result :add-face (make-triangle* 10 5 3))
68 (funcall result :add-face (make-triangle* 11 4 5))
69 (funcall result :add-face (make-triangle* 9 7 2))
70 (funcall result :add-face (make-triangle* 0 1 7))
71 (funcall result :add-face (make-triangle* 8 9 3))
72 (funcall result :add-face (make-triangle* 0 8 4))
73 result))
75 (defun make-icosahedron ()
76 (let ((result (make-instance 'wire-mesh)))
77 (funcall result :add-vertex (make-vertex3d* 0.0 -0.525731 0.850651 1.0))
78 (funcall result :add-vertex (make-vertex3d* 0.850651 0.0 0.525731 1.0))
79 (funcall result :add-vertex (make-vertex3d* 0.850651 0.0 -0.525731 1.0))
80 (funcall result :add-vertex (make-vertex3d* -0.850651 0.0 -0.525731 1.0))
81 (funcall result :add-vertex (make-vertex3d* -0.850651 0.0 0.525731 1.0))
82 (funcall result :add-vertex (make-vertex3d* -0.525731 0.850651 0.0 1.0))
83 (funcall result :add-vertex (make-vertex3d* 0.525731 0.850651 0.0 1.0))
84 (funcall result :add-vertex (make-vertex3d* 0.525731 -0.850651 0.0 1.0))
85 (funcall result :add-vertex (make-vertex3d* -0.525731 -0.850651 0.0 1.0))
86 (funcall result :add-vertex (make-vertex3d* 0.0 -0.525731 -0.850651 1.0))
87 (funcall result :add-vertex (make-vertex3d* 0.0 0.525731 -0.850651 1.0))
88 (funcall result :add-vertex (make-vertex3d* 0.0 0.525731 0.850651 1.0))
89 (funcall result :add-face (make-triangle* 6 2 1 ))
90 (funcall result :add-face (make-triangle* 2 7 1 ))
91 (funcall result :add-face (make-triangle* 5 4 3 ))
92 (funcall result :add-face (make-triangle* 8 3 4 ))
93 (funcall result :add-face (make-triangle* 11 5 6 ))
94 (funcall result :add-face (make-triangle* 10 6 5 ))
95 (funcall result :add-face (make-triangle* 2 10 9 ))
96 (funcall result :add-face (make-triangle* 3 9 10 ))
97 (funcall result :add-face (make-triangle* 9 8 7 ))
98 (funcall result :add-face (make-triangle* 0 7 8 ))
99 (funcall result :add-face (make-triangle* 1 0 11 ))
100 (funcall result :add-face (make-triangle* 4 11 0 ))
101 (funcall result :add-face (make-triangle* 10 2 6 ))
102 (funcall result :add-face (make-triangle* 11 6 1 ))
103 (funcall result :add-face (make-triangle* 10 5 3 ))
104 (funcall result :add-face (make-triangle* 11 4 5 ))
105 (funcall result :add-face (make-triangle* 9 7 2 ))
106 (funcall result :add-face (make-triangle* 0 1 7 ))
107 (funcall result :add-face (make-triangle* 8 9 3 ))
108 (funcall result :add-face (make-triangle* 0 8 4 ))
109 result))
111 (defparameter *platonics*
112 (list (make-cube) (make-tetrahedron) (make-icosahedron)))
114 ;; iterate over vertices and faces
116 (defun write-mesh (stream mesh)
117 (format stream "Faces~%")
118 (iterate
119 (for (values a b c) in-triangles (mixamesh::faces-of mesh))
120 (format stream "A ~A B ~A C ~A~%" a b c))
121 (format stream "Vertices~%")
122 (iterate
123 (for (values x y z w) in-vertices (mixamesh::vertices-of mesh))
124 (format stream "X ~A Y ~A Z ~A W ~A~%" x y z w)))
126 (mapcar #'(lambda (m) (write-mesh *standard-output* m)) *platonics*)