basic voxel writing
This commit is contained in:
22
project.clj
22
project.clj
@ -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}})
|
||||
|
||||
@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user