1
1
package main
2
2
3
3
import (
4
- "bytes "
4
+ "flag "
5
5
"fmt"
6
6
"log"
7
7
"runtime"
8
- "time"
9
8
10
9
"os"
11
10
@@ -14,52 +13,78 @@ import (
14
13
"github.com/soypat/gsdf"
15
14
"github.com/soypat/gsdf/forge/threads"
16
15
"github.com/soypat/gsdf/glbuild"
17
- "github.com/soypat/gsdf/gleval"
18
- "github.com/soypat/gsdf/glrender"
16
+ "github.com/soypat/gsdf/gsdfaux"
19
17
)
20
18
21
- // Showerhead parameters as defined by showerhead design.
22
19
const (
23
- threadExtDiameter = 65.
24
- threadedLength = 5.
25
- threadTurns = 3.
26
- threadPitch = threadedLength / threadTurns
27
- )
28
-
29
- // Constructuive parameters defined by our design.
30
- const (
31
- showerheadBaseThick = 2.5
32
- showerheadWall = 4.
33
- threadheight = 5.
34
- )
35
-
36
- var (
37
- showerThread = threads.PlasticButtress {
38
- D : threadExtDiameter ,
39
- P : threadPitch ,
40
- }
20
+ stl = "showerhead.stl"
21
+ visualization = "showerhead.glsl"
41
22
)
42
23
43
24
func init () {
44
25
runtime .LockOSThread () // In case we wish to use OpenGL.
45
26
}
46
27
47
- func main () {
48
- watch := stopwatch ()
28
+ func run () error {
29
+ useGPU := flag .Bool ("gpu" , false , "Enable GPU usage" )
30
+ flag .Parse ()
49
31
object , err := scene ()
50
32
if err != nil {
51
- log .Fatalf ("creating 3D object: %s" , err )
33
+ return err
34
+ }
35
+ fpstl , err := os .Create (stl )
36
+ if err != nil {
37
+ return err
38
+ }
39
+ defer fpstl .Close ()
40
+ fpvis , err := os .Create (visualization )
41
+ if err != nil {
42
+ return err
52
43
}
53
- fmt .Println ("created object in" , watch ())
54
- useGPU := true
55
- err = render (object , useGPU )
44
+ defer fpvis .Close ()
45
+
46
+ err = gsdfaux .Render (object , gsdfaux.RenderConfig {
47
+ STLOutput : fpstl ,
48
+ VisualOutput : fpvis ,
49
+ Resolution : object .Bounds ().Diagonal () / 200 ,
50
+ UseGPU : * useGPU ,
51
+ })
52
+
53
+ return err
54
+ }
55
+
56
+ func main () {
57
+ err := run ()
56
58
if err != nil {
57
59
log .Fatal (err )
58
60
}
61
+ fmt .Println ("showerhead example done" )
59
62
}
60
63
61
64
// scene returns the showerhead object.
62
65
func scene () (glbuild.Shader3D , error ) {
66
+
67
+ // Showerhead parameters as defined by showerhead geometry.
68
+ const (
69
+ threadExtDiameter = 65.
70
+ threadedLength = 5.
71
+ threadTurns = 3.
72
+ threadPitch = threadedLength / threadTurns
73
+ )
74
+
75
+ // Constructuive parameters defined by our design.
76
+ const (
77
+ showerheadBaseThick = 2.5
78
+ showerheadWall = 4.
79
+ threadheight = 5.
80
+ )
81
+
82
+ var (
83
+ showerThread = threads.PlasticButtress {
84
+ D : threadExtDiameter ,
85
+ P : threadPitch ,
86
+ }
87
+ )
63
88
// Object accumulates the showerhead sdf.
64
89
var object glbuild.Shader3D
65
90
@@ -94,64 +119,6 @@ func scene() (glbuild.Shader3D, error) {
94
119
return object , nil
95
120
}
96
121
97
- func render (s glbuild.Shader3D , useGPU bool ) (err error ) {
98
- err = glbuild .ShortenNames3D (& s , 6 )
99
- if err != nil {
100
- return fmt .Errorf ("shortening shader names: %s" , err )
101
- }
102
- bb := s .Bounds ()
103
- var sdf gleval.SDF3
104
- watch := stopwatch ()
105
- if useGPU {
106
- fmt .Println ("using GPU" )
107
- {
108
- terminate , err := gleval .Init1x1GLFW ()
109
- if err != nil {
110
- return err
111
- }
112
- defer terminate ()
113
- }
114
- source := new (bytes.Buffer )
115
- _ , err = glbuild .NewDefaultProgrammer ().WriteComputeSDF3 (source , s )
116
- if err != nil {
117
- return err
118
- }
119
- sdf , err = gleval .NewComputeGPUSDF3 (source , bb )
120
- } else {
121
- sdf , err = gleval .NewCPUSDF3 (s )
122
- }
123
-
124
- if err != nil || sdf == nil {
125
- return fmt .Errorf ("instantiating SDF: %s" , err )
126
- }
127
-
128
- fmt .Println ("instantiating evaluation SDF took" , watch ())
129
- const size = 1 << 12
130
- renderer , err := glrender .NewOctreeRenderer (sdf , bb .Size ().Max ()/ 350 , size )
131
- if err != nil {
132
- return err
133
- }
134
-
135
- fp , err := os .Create ("showerhead.stl" )
136
- if err != nil {
137
- return fmt .Errorf ("creating file: %s" , err )
138
- }
139
- watch = stopwatch ()
140
- triangles , err := glrender .RenderAll (renderer )
141
- if err != nil {
142
- return fmt .Errorf ("rendering triangles: %s" , err )
143
- }
144
- e := sdf .(interface { Evaluations () uint64 })
145
- fmt .Println ("evaluated SDF" , e .Evaluations (), "times and rendered" , len (triangles ), "triangles in" , watch ())
146
- watch = stopwatch ()
147
- _ , err = glrender .WriteBinarySTL (fp , triangles )
148
- if err != nil {
149
- return fmt .Errorf ("writing STL file: %s" , err )
150
- }
151
- fmt .Println ("wrote STL file in" , watch ())
152
- return nil
153
- }
154
-
155
122
func fibonacci (n int ) ms2.Vec {
156
123
// Angle of divergence is very sensitive- 137.3 to 137.5 varies pattern greatly.
157
124
const angleOfDivergence = 137.3
@@ -162,10 +129,3 @@ func fibonacci(n int) ms2.Vec {
162
129
sa , ca := math .Sincos (a )
163
130
return ms2.Vec {X : r * ca , Y : r * sa }
164
131
}
165
-
166
- func stopwatch () func () time.Duration {
167
- start := time .Now ()
168
- return func () time.Duration {
169
- return time .Since (start )
170
- }
171
- }
0 commit comments