Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534"
ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19"
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
ImplicitBVH = "932a18dc-bb55-4cd5-bdd6-1368ec9cea29"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
MeshIO = "7269a6da-0436-5bbc-96c2-40638cbb6118"
NearestNeighbors = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
StructTypes = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"

[compat]
Adapt = "4"
Expand All @@ -25,13 +26,14 @@ GeometryBasics = "0.5"
ImageCore = "0.10"
ImageIO = "0.6"
ImageMagick = "1"
ImplicitBVH = "0.7.0"
JSON = "1"
LinearAlgebra = "1"
MeshIO = "0.5"
NearestNeighbors = "0.4"
StaticArrays = "1"
StructTypes = "1.11.0"
Test = "1"
TimerOutputs = "0.5.29"
julia = "1"

[extras]
Expand Down
39 changes: 35 additions & 4 deletions dev_script.jl
Original file line number Diff line number Diff line change
@@ -1,12 +1,43 @@
using GeometryBasics
using ImplicitBVH
using Slicey
using StaticArrays
using TimerOutputs

# geometry = read_geometry("test/stl_files/Stanford_Bunny.stl")
geometry = read_geometry("test/stl_files/cube.stl")

x_min = 200.0 * (1920 / 1080)
build_stage = Slicey.DLPBuildStage((0.0, x_min), (0.0, 200.0), (1920, 1080))
printer = Slicey.DLPPrinter(build_stage)
slicer = Slicey.DLPSlicer(geometry, printer)
build_stage = BuildStage((0.0, x_min), (0.0, 200.0))
projector = Slicey.DLPProjector(build_stage, (1920, 1080))
printer = Slicey.DLPPrinter(build_stage, projector)
slicer = Slicey.DLPSlicer(geometry, printer, TimerOutput())
Slicey.center_geometry!(slicer)
Slicey.slice(slicer, 0.1)

bvh = Slicey.build_triangle_bvh(slicer.geometry)
pixel_centroids = Slicey.build_pixel_centroids(slicer.printer, 20.0)
dirs = zeros(eltype(pixel_centroids), size(pixel_centroids)...)
# dirs[1, :] .= 1f0
for n in axes(dirs, 2)
dirs[:, n] .= Slicey.RAY_DIR
end
# dirs

trav = traverse_rays(bvh, pixel_centroids, dirs)

counts = zeros(Int, size(dirs, 2))
vs = slicer.geometry.vertices

for (ray_idx, leaf_idx) in trav.contacts
@show leaf_idx
tri = slicer.geometry.faces[leaf_idx]
p0 = SVector{3, Float32}(@views pixel_centroids[:, ray_idx]...)
v0 = SVector{3, Float32}(vs[tri[1]]...)
v1 = SVector{3, Float32}(vs[tri[2]]...)
v2 = SVector{3, Float32}(vs[tri[3]]...)
if Slicey.ray_intersects_triangle(p0, Slicey.RAY_DIR, v0, v1, v2)
counts[ray_idx] += 1
end
end
# Slicey.slice(slicer, 0.1; sample_method = :bvh)
# slicer.timer
68 changes: 65 additions & 3 deletions src/Geometry.jl
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,20 @@ function build_face_centroid_kdtree(geometry::STLGeometry)
return kdtree
end

function build_triangle_bvh(
geometry::STLGeometry;
volume_type = ImplicitBVH.BBox{Float32}
)
vs = geometry.vertices
bs = Vector{ImplicitBVH.BoundingVolume{volume_type, Int32, UInt32}}(undef, length(geometry.faces))
for (i, face) in enumerate(geometry.faces)
# @show face
bs[i] = ImplicitBVH.BoundingVolume(volume_type(vs[face[1]], vs[face[2]], vs[face[3]]), Int32(i), UInt32(0))
# @show sphere
end
return BVH(bs, ImplicitBVH.BBox{Float32})
end

function centroid(geometry::STLGeometry)
bb = bounding_box(geometry)
return (bb.origin + (bb.origin + bb.widths)) / 2
Expand All @@ -91,12 +105,46 @@ end

function point_in_mesh(
geometry::STLGeometry,
tree,
bvh::BVH,
p::SVector{3, T}
) where T <: Number
face_pts = face_points(geometry)
# Fixed ray direction
dir = Vec3{Float32}(1f0, 0f0, 0f0)
invdir = Vec3{Float32}(1f0 / dir[1], Inf32, Inf32)
hits = 0
traverse(bvh) do node
if node.isleaf
for i in node.indices
# tri = triangles[idx]
v0 = SVector{3, T}(face_pts[1, i]...)
v1 = SVector{3, T}(face_pts[2, i]...)
v2 = SVector{3, T}(face_pts[3, i]...)

if ray_triangle_intersect(p, dir, v0, v1, v2)
hits += 1
end
end
else
ray_bbox_intersect(p, invdir, node.bbox)
end
end

return isodd(hits)
end

function point_in_mesh(
geometry::STLGeometry,
tree, idxs, dists,
p::SVector{3, T};
radius=T(Inf)
# k_nearest_neighbors = 3,
radius = T(Inf)
) where T <: Number
# all allocations are coming from this guy below
idxs = inrange(tree, p, radius)
# idxs = inrange(tree, p, radius)
# inrange!(idxs, tree, p, radius)
knn!(idxs, dists, tree, p, length(idxs))
# @show size(idxs)
face_pts = face_points(geometry)
hits = 0
for i in idxs
Expand All @@ -109,6 +157,20 @@ function point_in_mesh(
isodd(hits)
end

@inline function ray_bbox_intersect(
origin::Vec3{Float32},
invdir::Vec3{Float32},
bbox::ImplicitBVH.BBox{Float32},
)::Bool
t1 = (bbox.min .- origin) .* invdir
t2 = (bbox.max .- origin) .* invdir

tmin = maximum(min.(t1, t2))
tmax = minimum(max.(t1, t2))

return tmax ≥ max(tmin, 0f0)
end

@inline function ray_intersects_triangle(
orig::SVector{3, T},
dir::SVector{3, T},
Expand Down
49 changes: 49 additions & 0 deletions src/Settings.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
module Settings

using JSON

struct Units
length::String
speed::String
time::String
end

struct BuildStage
length::Float32
width::Float32
end

struct Geometry
default_type::String
default_parallelism_method::String
default_search_method::String
end

struct Projector
resolution::String
end

struct DLPPrinterSettings
build_stage::BuildStage
projector::Projector
end

const PrinterSettings = Union{
DLPPrinterSettings
}

struct SlicerSettings
geometry::Geometry
printer::PrinterSettings
units::Units
end

function parse_settings(settings_file::String)
return open(settings_file) do f
str = read(f, String)
settings = JSON.parse(str, SlicerSettings)
return settings
end
end

end # module PrinterSettings
6 changes: 4 additions & 2 deletions src/Slicey.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module Slicey
# read_geometry(...) instead of
# Slicey.read_geometry(...)
# you have to be careful of conflicting names though
export BuildStage
export read_geometry

using Adapt
Expand All @@ -12,20 +13,21 @@ using GeometryBasics
using ImageCore
using ImageIO
using ImageMagick
using ImplicitBVH
using JSON
using LinearAlgebra
using MeshIO
using NearestNeighbors
using StaticArrays
using StructTypes
using TimerOutputs

# will this fully evaluate the file? will the init_mssg show?
include("Geometry.jl")
include("InitializeMessage.jl")
# re-incroporate TODO
# include("Slicing_Prep.jl")
# include("Slicing.jl")
include("parsers/PrinterSettings.jl")
include("Settings.jl")
include("slicers/Slicers.jl")

# Need to include a settings file, something with all the
Expand Down
47 changes: 0 additions & 47 deletions src/parsers/PrinterSettings.jl

This file was deleted.

Loading