Skip to content

Commit 0b65c0c

Browse files
committed
finish export embed
1 parent e56adc8 commit 0b65c0c

File tree

53 files changed

+188
-155
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+188
-155
lines changed

src/cli/helpers.janet

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,23 @@
5959
(defn- calry [f & args]
6060
(if f (f ;args)))
6161

62-
(defn render-image [shader-source &named resolution origin orbit zoom t slices
62+
(defn render-image [shader-source &named
63+
dimensions
64+
animated?
65+
free-camera?
66+
resolution
67+
origin
68+
orbit
69+
zoom
70+
t
71+
slices
6372
on-render-start
6473
on-slice-start
6574
on-slice-end
6675
on-render-end]
6776
(default slices [1 1])
6877
(default zoom 1)
69-
(default origin [0 0 0])
78+
(default origin (if (= dimensions 2) [0 0] [0 0 0]))
7079
(default orbit [0 0])
7180
(default t 0)
7281
(def frame-buffer (ray/make-fbo resolution :point))
@@ -75,14 +84,18 @@
7584
(defn set-uniform [name type value]
7685
(jaylib/set-shader-value shader (jaylib/get-shader-location shader name) value type))
7786

78-
(set-uniform "free_camera_origin" :vec3 origin)
79-
(set-uniform "free_camera_orbit" :vec2 orbit)
80-
(set-uniform "free_camera_zoom" :float zoom)
81-
(set-uniform "origin_2d" :vec2 [0 0])
82-
(set-uniform "camera_type" :int 0)
83-
(set-uniform "t" :float t)
87+
(when free-camera?
88+
(set-uniform "free_camera_zoom" :float zoom)
89+
(case dimensions
90+
2 (do
91+
(set-uniform "free_camera_origin" :vec2 origin))
92+
3 (do
93+
(set-uniform "free_camera_origin" :vec3 origin)
94+
(set-uniform "free_camera_orbit" :vec2 orbit))
95+
0 (do)
96+
(error "invalid dimension")))
97+
(when animated? (set-uniform "t" :float t))
8498
(set-uniform "viewport" :vec4 [0 0 ;resolution])
85-
(set-uniform "crosshairs_3d" :vec4 [0 0 0 0])
8699

87100
(def slice-size (map |(math/floor (/ $0 $1)) resolution slices))
88101
(def residution (map - resolution (map |(* $0 $1) slice-size slices)))

src/cli/init.janet

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@
2525
--slices (optional vec2 [1 1]) "draw the image in multiple passes, e.g. 4x2 = 8 total draw calls"]
2626
(def source (read-input input))
2727
(def env (bauble/evaluator/evaluate source))
28-
(def [shader-source dimension animated? has-custom-camera?]
29-
(bauble/compile-to-glsl default-render-type false env "330"))
28+
(def [shader-source dimensions animated? has-custom-camera?]
29+
(bauble/compile-to-glsl default-render-type false false env "330"))
3030
(init-jaylib)
3131
(defn vec2 [[x y]] (string/format "%dx%d" x y))
3232
(def image (render-image shader-source
33+
:dimensions dimensions
34+
:free-camera? (not has-custom-camera?)
35+
:animated? animated?
3336
:resolution resolution
3437
:orbit [0.125 -0.125]
3538
:t t
@@ -49,7 +52,7 @@
4952
(def source (read-input input))
5053
(def env (bauble/evaluator/evaluate source))
5154
(def [shader-source dimension animated? has-custom-camera?]
52-
(bauble/compile-to-glsl default-render-type false env "330"))
55+
(bauble/compile-to-glsl default-render-type false false env "330"))
5356
(if outfile
5457
(spit outfile shader-source)
5558
(print shader-source)))

src/lib/init.janet

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
(import ./completer :export true)
66
(import ./environment/uniforms-private)
77

8-
(defn compile-to-glsl [render-type crosshairs env glsl-version]
8+
(defn compile-to-glsl [render-type crosshairs dynamic-camera? env glsl-version]
99
(renderer/render env glsl-version
1010
:render-type render-type
11-
:crosshairs crosshairs))
11+
:crosshairs crosshairs
12+
:dynamic-camera? dynamic-camera?))
1213

1314
(defn- type-to-string [type]
1415
(jlsl/type/match type

src/lib/renderer/init.janet

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
(truthy? (some |(= dynvars/t (jlsl/param/var $))
1515
(jlsl/function/implicit-params (in program :main)))))
1616

17+
(def @not not)
18+
1719
(use ../environment)
1820

1921
(defn render [env glsl-version &keys options]
@@ -35,7 +37,7 @@
3537
(assertf (camera? camera) "%q is not a camera")
3638
camera))
3739

38-
(assertf (or (nil? subject) (shape? subject)) "%q is not a shape" subject)
40+
(assertf (@or (nil? subject) (shape? subject)) "%q is not a shape" subject)
3941

4042
(def dimension (if subject
4143
(case (shape/type subject)
@@ -44,7 +46,10 @@
4446
(error "BUG"))
4547
0))
4648

47-
(def aa-grid-size (jlsl/coerce-expr (int/u64 (or (get-var stdenv 'aa-grid-size) 1))))
49+
(if (@and camera (= dimension 2))
50+
(error "custom cameras not supported in 2D yet"))
51+
52+
(def aa-grid-size (jlsl/coerce-expr (int/u64 (@or (get-var stdenv 'aa-grid-size) 1))))
4853

4954
(jlsl/jlsl/implement :float nearest-distance [] (return ,(@or (@and subject (shape/distance subject)) 0)))
5055
(def sample
@@ -55,16 +60,18 @@
5560
(error "BUG"))
5661
(jlsl/fn :vec4 sample [] (return background-color))))
5762
(def frag-color (jlsl/variable/new "frag-color" jlsl/type/vec4))
63+
(def free-camera? (@or (options :dynamic-camera?) (@not camera)))
5864
(def program (jlsl/program/new*
5965
:pragmas ['(precision highp float)]
6066
:uniforms
6167
(filter truthy? [
6268
;custom-uniforms
63-
camera-type
64-
free-camera-target
65-
free-camera-orbit
66-
free-camera-zoom
67-
origin-2d
69+
(if (options :dynamic-camera?) camera-type)
70+
;(if free-camera?
71+
(if (= dimension 2)
72+
[free-camera-zoom free-camera-target-2d]
73+
[free-camera-zoom free-camera-target-3d free-camera-orbit])
74+
[])
6875
t
6976
viewport
7077
(if (in options :crosshairs) crosshairs-3d)])

src/lib/renderer/samplers.janet

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
(use judge)
66

77
(jlsl/jlsl/defdyn camera-type :int "")
8-
(jlsl/jlsl/defdyn free-camera-target :vec3 "")
8+
(def free-camera-target-3d (jlsl/variable/new "free_camera_target" jlsl/type/vec3))
9+
(def free-camera-target-2d (jlsl/variable/new "free_camera_target" jlsl/type/vec2))
910
(jlsl/jlsl/defdyn free-camera-orbit :vec2 "")
1011
(jlsl/jlsl/defdyn free-camera-zoom :float "")
1112
(jlsl/jlsl/defdyn crosshairs-3d :vec4 "")
1213

13-
(jlsl/jlsl/defdyn origin-2d :vec2 "")
14-
1514
# TODO: these should probably be somewhere else
1615
(def- MAX_STEPS 256:u)
1716
(def- MINIMUM_HIT_DISTANCE 0.1)
@@ -42,7 +41,7 @@
4241
(defn make-sample-2d [options nearest-distance <background-color> <default-color> <color-field>]
4342
(def {:render-type render-type :crosshairs crosshairs} options)
4443
(jlsl/fn :vec4 sample []
45-
(with [Q (frag-coord * ortho-base-zoom-distance * free-camera-zoom + origin-2d)
44+
(with [Q (frag-coord * ortho-base-zoom-distance * free-camera-zoom + free-camera-target-2d)
4645
q Q
4746
dist (nearest-distance)
4847
gradient (calculate-gradient (nearest-distance))]
@@ -97,45 +96,58 @@
9796

9897
# TODO: okay, so, theoretically we have nearest-distance in the current environment already
9998
(defn make-sample-3d [options nearest-distance <camera> <background-color> <default-color> <color-field>]
100-
(def {:render-type render-type :crosshairs crosshairs} options)
99+
(def {:render-type render-type :crosshairs crosshairs :dynamic-camera? dynamic-camera?} options)
101100
(def march (make-march nearest-distance))
102101
(def ortho-distance 1024)
103102

104103
(jlsl/fn :vec4 sample []
105104
(var ray* (Ray [0 0 0] [0 0 1]))
106-
(var ortho-quad [ortho-distance (* frag-coord ortho-base-zoom-distance free-camera-zoom)])
107-
(var ortho-scale (* ortho-base-zoom-distance free-camera-zoom))
105+
(var ortho-quad [0 0 0])
106+
(var ortho-scale 0)
108107
(var fov 0)
109-
(case camera-type
110-
0:s ,(if <camera>
111-
(jlsl/statement
112-
(var camera <camera>)
113-
(set ray* (camera/ray camera))
114-
,(if (has-fov? <camera>)
115-
(jlsl/statement (set fov camera.fov))
116-
(jlsl/statement (set ortho-scale camera.scale)))
117-
(break))
108+
,(if dynamic-camera?
109+
(jlsl/statement
110+
(set ortho-quad [ortho-distance (* frag-coord ortho-base-zoom-distance free-camera-zoom)])
111+
(set ortho-scale (* ortho-base-zoom-distance free-camera-zoom))
112+
(case camera-type
113+
0:s ,(if <camera>
114+
(jlsl/statement
115+
(var camera <camera>)
116+
(set ray* (camera/ray camera))
117+
,(if (has-fov? <camera>)
118+
(jlsl/statement (set fov camera.fov))
119+
(jlsl/statement (set ortho-scale camera.scale)))
120+
(break))
121+
(jlsl/statement
122+
# just fall through
123+
))
124+
1:s (do
125+
(var camera-rotation-matrix
126+
(* (rotation-y (* tau free-camera-orbit.x))
127+
(rotation-x (* tau free-camera-orbit.y))))
128+
(set ray* (Ray
129+
(camera-rotation-matrix * [0 0 (base-zoom-distance * free-camera-zoom)] + free-camera-target-3d)
130+
(camera-rotation-matrix * (perspective-vector free-camera-fov * [1 1 -1]))))
131+
(set fov free-camera-fov)
132+
(break))
133+
2:s (do # XZ
134+
(set ray* (Ray (ortho-quad.yxz + free-camera-target-3d) [0 -1 0]))
135+
(break))
136+
3:s (do # XY
137+
(set ray* (Ray (ortho-quad.yzx + free-camera-target-3d) [0 0 -1]))
138+
(break))
139+
4:s (do # ZY
140+
(set ray* (Ray (ortho-quad.xzy + free-camera-target-3d) [-1 0 0]))
141+
(break))))
142+
(if <camera>
143+
(jlsl/statement (set ray* (camera/ray <camera>)))
118144
(jlsl/statement
119-
# just fall through
120-
))
121-
1:s (do
122-
(var camera-rotation-matrix
123-
(* (rotation-y (* tau free-camera-orbit.x))
124-
(rotation-x (* tau free-camera-orbit.y))))
125-
(set ray* (Ray
126-
(camera-rotation-matrix * [0 0 (base-zoom-distance * free-camera-zoom)] + free-camera-target)
127-
(camera-rotation-matrix * (perspective-vector free-camera-fov * [1 1 -1]))))
128-
(set fov free-camera-fov)
129-
(break))
130-
2:s (do # XZ
131-
(set ray* (Ray (ortho-quad.yxz + free-camera-target) [0 -1 0]))
132-
(break))
133-
3:s (do # XY
134-
(set ray* (Ray (ortho-quad.yzx + free-camera-target) [0 0 -1]))
135-
(break))
136-
4:s (do # ZY
137-
(set ray* (Ray (ortho-quad.xzy + free-camera-target) [-1 0 0]))
138-
(break)))
145+
(var camera-rotation-matrix
146+
(* (rotation-y (* tau free-camera-orbit.x))
147+
(rotation-x (* tau free-camera-orbit.y))))
148+
(set ray* (Ray
149+
(camera-rotation-matrix * [0 0 (base-zoom-distance * free-camera-zoom)] + free-camera-target-3d)
150+
(camera-rotation-matrix * (perspective-vector free-camera-fov * [1 1 -1])))))))
139151

140152
(var steps 0:u)
141153

studio/bauble.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ const ExportEmbedDialog = (props: {
122122

123123
const regenOutput = async () => {
124124
const script = props.getScript();
125-
const request = {tag: 'compile', script, renderType: RenderType.Normal, crosshairs: false};
125+
const request = {tag: 'compile', script, renderType: RenderType.Normal, crosshairs: false, dynamicCamera: false};
126126
// TODO: do something with result.outputs?
127127
const result: any = await props.wasmBox.send(request);
128128
if (result.isError) {
@@ -133,7 +133,7 @@ const ExportEmbedDialog = (props: {
133133
options.dimensions = result.dimension;
134134
}
135135
if (result.isAnimated) {
136-
options.animate = true;
136+
options.animation = true;
137137
}
138138
if (!result.hasCustomCamera) {
139139
options.freeCamera = true;
@@ -472,7 +472,7 @@ const Bauble = (props: BaubleProps) => {
472472
return {width: dpr * size.width, height: dpr * size.height};
473473
});
474474
const renderType = Signal.create(RenderType.Normal);
475-
const dimension = Signal.create(0);
475+
const dimensions = Signal.create(0);
476476
const prefersFreeCamera = Signal.create(false);
477477
const quadView = Signal.create(false);
478478
const quadSplitPoint = Signal.create(vec2.fromValues(0.5, 0.5));
@@ -524,7 +524,7 @@ const Bauble = (props: BaubleProps) => {
524524
const recompile = (script: string, renderType: RenderType) => {
525525
compileQueue.schedule(async () => {
526526
Signal.set(evaluationState, EvaluationState.Unknown);
527-
const request = {tag: 'compile', script, renderType, crosshairs: true};
527+
const request = {tag: 'compile', script, renderType, crosshairs: true, dynamicCamera: true};
528528
const result: any = await wasmBox.send(request);
529529

530530
if (result.isError) {
@@ -534,7 +534,7 @@ const Bauble = (props: BaubleProps) => {
534534
try {
535535
//console.log(result.shaderSource);
536536
const shaderRecompilationTimeMs = await renderer.recompileShader(result.shaderSource) as number | undefined;
537-
Signal.set(dimension, result.dimension);
537+
Signal.set(dimensions, result.dimensions);
538538
Signal.set(isAnimated, result.isAnimated);
539539
Signal.set(hasCustomCamera, result.hasCustomCamera);
540540
Signal.set(evaluationState, EvaluationState.Success);
@@ -592,6 +592,7 @@ const Bauble = (props: BaubleProps) => {
592592
return Signal.get(quadView) ? focusVec_ : null;
593593
});
594594
renderer = new AsyncRenderer(renderBox, canvas, {
595+
dimensions: Signal.getter(dimensions),
595596
time: Signal.getter(timer.t),
596597
isVisible: Signal.getter(isVisible),
597598
rotation: Signal.getter(rotation),
@@ -668,7 +669,7 @@ const Bauble = (props: BaubleProps) => {
668669
};
669670

670671
const getMainViewInteraction = () => {
671-
if (Signal.get(dimension) === 2) {
672+
if (Signal.get(dimensions) === 2) {
672673
return Interaction.Pan2D;
673674
}
674675
if (usingFreeCamera()) {

0 commit comments

Comments
 (0)