basic voxel writing

This commit is contained in:
2017-05-03 21:45:37 -07:00
parent 947185328e
commit 4ae164bd51
2 changed files with 98 additions and 4 deletions

View File

@ -3,7 +3,27 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]]
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/math.numeric-tower "0.0.4"]
[org.clojure/tools.trace "0.7.9"]
;; [net.mikera/core.matrix "0.57.0"]
;;[thi.ng/luxor "0.3.1"]
;; [thi.ng/geom "0.0.1062"]
;; [thi.ng/geom "0.0.908"]
[thi.ng/geom "0.0.815"]
;; [thi.ng/math "0.2.1"]
;; [thi.ng/geom-types "0.0.908"]
;; [thi.ng/geom-core "0.0.908"]
[thi.ng/geom-core "0.0.815"]
;; [thi.ng/geom-meshops "0.0.908"]
;; [thi.ng/xerror "0.1.0"]
;; [thi.ng/geom "0.0.1173-SNAPSHOT"]
;; [thi.ng/geom-voxel "0.0.908"]
;;[seesaw "1.4.5"]
]
:main ^:skip-aot voxelburst.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})

View File

@ -1,7 +1,81 @@
(ns voxelburst.core
(:require
[clojure.java.io :as io]
[clojure.string :as string]
;;[thi.ng.geom.aabb :as a]
[thi.ng.geom.core :as g]
[thi.ng.geom.core.vector :refer [vec3]]
[thi.ng.geom.mesh.io :as mio]
;;[thi.ng.geom.polygon :as p]
;;[thi.ng.geom.rect :as r]
[thi.ng.geom.voxel.isosurface :as iso]
[thi.ng.geom.voxel.svo :as svo]
;;[thi.ng.luxor.core :refer :all]
;;[thi.ng.luxor.io :as lio]
[thi.ng.math.core :as m]
;;[termite.sim :as sim]
;;[termite.ui :as ui]
)
(:gen-class))
(def res (double 1/2))
(def num-holes 30)
(defn voxel-sphere
[tree op origin radius res]
(let [rg (range (- radius) (+ radius res) res)
coll (for [x rg, y rg, z rg
:let [v (vec3 x y z)]
:when (<= (g/mag v) radius)] (g/+ origin v))]
(svo/apply-voxels op tree coll)))
(time
(def v
(reduce
(fn [tree [op o r]] (voxel-sphere tree op o r res))
(svo/voxeltree 32 res)
(concat
;; create big sphere
[[svo/set-at (vec3 15 15 15) 14]]
;; remove several smaller spheres
(repeatedly
num-holes
#(vector
svo/delete-at
(vec3 (m/random 32) (m/random 32) (m/random 32))
(m/random 4 8)))))))
(def construct
(let [tree (svo/voxeltree 8 res)]
(svo/set-at tree (vec3 4 4 4))))
#_(defn frames-to-voxels
"Frame size must be cubic."
[frames & [inside-val]]
(let [size (count frames)
border 4
tree (svo/voxeltree (+ size (* border 2)) res)
coll (for [z (range size)
y (range size)
x (range size)
:let [frame (nth frames (- size z 1))]
:when (sim/inside? (ui/cell-value (:render frame) x y) inside-val)]
(vec3 (+ x border) (+ y border) (+ z border)))]
(svo/apply-voxels svo/set-at tree coll)))
(defn make-tree []
(let [tree (svo/voxeltree 8 (double 1/2))]
(svo/set-at tree (vec3 4 4 4))))
(defn write-ply
[name tree & [resolution inside-val]]
(time
(doseq [i (list resolution)]
(with-open [o (io/output-stream (string/join (list name "-" i ".ply")))]
(mio/write-ply o (g/tessellate (iso/surface-mesh tree i (or inside-val 0.5))))))))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"))
[& [name count grid-size resolution]]
(let [tree (make-tree)]
(write-ply name tree resolution)))