From 4ae164bd5168e9494eac0e6bf96bca6f0ff4acc7 Mon Sep 17 00:00:00 2001 From: Sasha Kovar Date: Wed, 3 May 2017 21:45:37 -0700 Subject: [PATCH] basic voxel writing --- project.clj | 22 +++++++++++- src/voxelburst/core.clj | 80 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/project.clj b/project.clj index a161b60..662ab99 100644 --- a/project.clj +++ b/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}}) diff --git a/src/voxelburst/core.clj b/src/voxelburst/core.clj index 83fc997..82ad0cf 100644 --- a/src/voxelburst/core.clj +++ b/src/voxelburst/core.clj @@ -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)))