summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2023-01-26 14:49:38 -0500
committerpommicket <pommicket@gmail.com>2023-01-26 14:49:38 -0500
commit6b85f294821dcb8373adb2cc47f9c9b2b554fef9 (patch)
treebd45818cf56bd2145c30d89e4450de144d26de3d
parentafe515fd6dab94573b0bd9c6a1e0b64a0796883b (diff)
multiplex functions
-rw-r--r--README.md3
-rw-r--r--analysis/analysis.tex16
-rw-r--r--src/sdf.rs23
3 files changed, 40 insertions, 2 deletions
diff --git a/README.md b/README.md
index 008c3d2..c2bb147 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,9 @@ a263736466a1634d696e82a1634d697883a1634d697883a16c564c696e655365676d656e74a16454
a263736466a16653696e436f7382a16c564c696e655365676d656e74a16454696d6582fabd6f12dafa3f601600a167436f6d706f736583a167436f6d706f736582a1695472616e736c61746583a16454696d6582fabd1eb54dfa3e66a640a16454696d6582fabd8a51a4fa3f25632aa16454696d6582fabbadc0a0fa3f0f7794a1695472616e736c61746583a16454696d6582fa3da911fdfa3ea7fdd4a16454696d6582fa3d04bdf2fa3f6cae42a16454696d6582fa3ce2d374fa3f3716f6a1634d696e82a168547269507269736d82a16454696d6582fa3dab2981fa3f3b4b96a16454696d6582fabd7c9badfa3f7558faa165546f727573a266726164697573a16454696d6582fabdaad43efa3e84f9e469746869636b6e657373a16454696d6582fabc61bdcdfa3c4d3880684964656e746974796e636f6c6f725f66756e6374696f6ea1634d697883a166526f7461746583a16454696d6582fabdc72393fa3e34f9d8a16454696d6582fabc813218fa3f675278a16454696d6582fa3ca4e728fa3f59b236a167436f6d706f736582a16353696ea16454696d6582fabdbce95dfa3f374964a16f496e66696e6974654d6972726f7273a16454696d6582fa3c50ad30fa3e06c2e8a16454696d6582fabd549d60fa3f2584a8
a263736466a16653696e436f7382a167436f6d706f736583a165537153696ea16454696d6582fa3be21a30fa3ef85110a169536d6f6f74684d696e82a16443756265a16454696d6582fabcbd91a8fa3ec68354a166537068657265a16454696d6582fabd8d45cafa3f45f8c8684964656e74697479a1634d696e82a169536d6f6f74684d696e82a166537068657265a16454696d6582fa3b6a4c00fa3f476626a168426f784672616d65a26473697a65a16454696d6582fa3e458346fa4007694a69746869636b6e657373a16454696d6582fa3c0dac9bfa3daf70a7a1634d697883a168426f784672616d65a26473697a65a16454696d6582fabd26ef4efa4017a0e269746869636b6e657373a16454696d6582fabc003f71fa3e4706d0a16443756265a16454696d6582fa3d8330c3fa3f43448aa16454696d6582fabd565d0dfa3f3b8da66e636f6c6f725f66756e6374696f6ea167436f6d706f736582a16641726374616ea16454696d6582fa3d17bdc2fa3f09ec7ca167436f6d706f736582a166526f7461746583a16454696d6582fabce58528fa3e8bdbf0a16454696d6582fa3d06c2a6fa3f05c282a16454696d6582fa3d13eaaefa3e411148a166526f7461746583a16454696d6582fa3cc0bdd8fa3efc278ca16454696d6582fa3cf95bc4fa3f7868faa16454696d6582fa3d3f2342fa3f585f32
a263736466a16653696e436f7382a1634d697883a167436f6d706f736583a16353696ea16454696d6582fabd9ebb46fa3f18eb88a165546f727573a266726164697573a16454696d6582fa3e6d0eb4fa402fbf0669746869636b6e657373a16454696d6582fa3c752fc2fa3e4cc7e7684964656e74697479a167436f6d706f736583a1695472616e736c61746583a16454696d6582fa3db691c1fa3ef9dc24a16454696d6582fa3d903c57fa3f6b36caa16454696d6582fa3d21edbafa3f3406246850726f6a6563745a684964656e74697479a16454696d6582fabb5f1200fa3f0cd1f4a167436f6d706f736583a165537153696ea16454696d6582fabd2f45a7fa3f0a677aa167436f6d706f736583675369676d6f6964a16c564c696e655365676d656e74a16454696d6582fabc772098fa3ed113c8684964656e74697479684964656e746974796e636f6c6f725f66756e6374696f6ea167436f6d706f736582a1634d697883a1695472616e736c61746583a16454696d6582fabd066e06fa3f05798aa16454696d6582fa3dba9733fa3f0c084aa16454696d6582fabdc95d37fa3e81ed3866576962626c79a16454696d6582fabc5ec830fa3f202cb2a166526f7461746583a16454696d6582fabd0966f4fa3e27ba20a16454696d6582fabd94f970fa3e2f19b8a16454696d6582fabd588d27fa3e633d18
+a263736466a167436f6d706f736583a167436f6d706f736582a167436f6d706f736582a1634d697883a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fabc62a468fa3eb47d24a1695472616e736c61746583a16454696d6582fabd6f31f3fa3dc1dfd0a16454696d6582fa3d3409a2fa3f789600a16454696d6582fabda414fafa3ead4f00a16454696d6582fabd856996fa3f0ca420a166526f7461746583a16454696d6582fa3d0206a6fa3f6ab128a16454696d6582fabdb1764afa3f37e130a16454696d6582fa3d080572fa3f16642ca1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fabd928746fa3e1b9850a167436f6d706f736583a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fabd487d53fa3f4f3e7aa167436f6d706f736583a16c506572436f6d706f6e656e7483a1644e546f4e66576962626c79684964656e74697479684964656e74697479a16653696e436f7382a166537068657265a16454696d6582fa3d9c80a1fa3ebba6c46850726f6a65637458684964656e74697479a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fa3d90c4b3fa3f73b616a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fa3d276692fa3e6b2ba06e636f6c6f725f66756e6374696f6ea167436f6d706f736582a16c506572436f6d706f6e656e7483684964656e74697479a1644e546f4e675369676d6f6964a1644e546f4ea16453717274a16454696d6582fa3c231730fa3f69f97ca16c506572436f6d706f6e656e7483684964656e74697479a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fabd0f078cfa3f2ce428a1644e546f4ea16641726374616ea16454696d6582fa3dc9389dfa3e1bea30
+a263736466a1634d696e82a1634d696e82a169536d6f6f74684d696e82a167436f6d706f736583a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fa3cd10fa4fa3e7a7ee0a166537068657265a16454696d6582fa3d3a8352fa3f10627ea1644e546f4e66576962626c79a1634d6978836850726f6a656374586850726f6a6563745aa16454696d6582fa3ca53034fa3ed7ec00a169536d6f6f74684d696e82a1634d696e826850726f6a65637458a16c564c696e655365676d656e74a16454696d6582fabdb2bbeafa3d3a98a0a167436f6d706f736583a1644e546f4ea16353696ea16454696d6582fa3d2bf786fa3e6f8800a166537068657265a16454696d6582fa3d1f17fafa3edaed58684964656e74697479a169536d6f6f74684d696e82a166537068657265a16454696d6582fabcb6f0d8fa3e14d9a8a16653696e436f7382a1634d697883a168547269507269736d82a16454696d6582fabb07e060fa3e89038ca16454696d6582fa3da7736dfa3e76b8006850726f6a65637459a16454696d6582fa3d5c6dfafa3f69e29aa167436f6d706f736583a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fa3dc9b8f9fa3e7f5ca8a168426f784672616d65a26473697a65a16454696d6582fa3ddf9047fa401c9a4069746869636b6e657373a16454696d6582fabc95e1cffa3dcb43b3684964656e746974796e636f6c6f725f66756e6374696f6ea1634d697883a167436f6d706f736582a1644e546f4e675369676d6f6964a1644e546f4e675369676d6f6964a167436f6d706f736582a1644e546f4ea16453717274a16454696d6582fa3d9753c9fa3f2c7994a1644e546f4ea16f496e66696e6974654d6972726f7273a16454696d6582fabda5722dfa3f665366a16454696d6582fa3d87d6bdfa3f52c068
+a263736466a169536d6f6f74684d696e82a169536d6f6f74684d696e82a167436f6d706f736583a1634d697883a1644e546f4ea165537153696ea16454696d6582fa3d03783afa3f66c584a1644e546f4e66576962626c79a16454696d6582fa3d35b64efa3e8d3e54a16653696e436f7382a168547269507269736d82a16454696d6582fabcb3b380fa3ded0d30a16454696d6582fabd473693fa3f62abcea16c564c696e655365676d656e74a16454696d6582fa3d6f5f4efa3e554e88684964656e746974796850726f6a6563745aa16653696e436f7382a16653696e436f7382a1634d6978836850726f6a6563745aa168547269507269736d82a16454696d6582fabd047d06fa3d7c4480a16454696d6582fa3d075c2efa3f00dafaa16454696d6582fabc130be8fa3e6719f8a16653696e436f73826850726f6a65637458a16843796c696e64657282a16454696d6582fa3da6e611fa3f32bf2ea16454696d6582fabcc34b4cfa3f6442a2a167436f6d706f736583a16c506572436f6d706f6e656e7483684964656e74697479684964656e74697479a1644e546f4ea16353696ea16454696d6582fa3d6ba5aefa3ebd1940a1634d697883a168547269507269736d82a16454696d6582fabd7237cdfa3e2b8f98a16454696d6582fa3c897b98fa3f325384a166537068657265a16454696d6582fabc273750fa3e589c48a16454696d6582fabdb6fa17fa3f6faf82684964656e746974796e636f6c6f725f66756e6374696f6ea167436f6d706f736582a167436f6d706f736582a1634d697883a1644e546f4ea165537153696ea16454696d6582fabd611013fa3ef150b8a1644e546f4ea16353696ea16454696d6582fabd782740fa3e7c98a8a16454696d6582fabd240767fa3f091296a1644e546f4e66576962626c79a1644e546f4ea16353696ea16454696d6582fa3d9b1683fa3f048970
```
## building from source
diff --git a/analysis/analysis.tex b/analysis/analysis.tex
index d3aa0e6..516f59d 100644
--- a/analysis/analysis.tex
+++ b/analysis/analysis.tex
@@ -1,3 +1,4 @@
+
\documentclass{article}
\usepackage{amssymb}
\usepackage{amsmath}
@@ -145,6 +146,19 @@ and $f_i:\bb R\to\bb R$ is $K$-Lipschitz for all $i$ then $f$ is $K$-Lipschitz.
\end{proof}
\end{theorem}
+\begin{theorem}
+\label{multiplex}
+If $f:\bb R^n\to\bb R^n$, $f(\vec x) = (f_1(\vec x) , f_2(\vec x), \dots, f_n(\vec x))$
+and $f_i:\bb R^n\to\bb R$ is $K$-Lipschitz for all $i$ then $f$ is $K\sqrt{n}$-Lipschitz.
+\begin{proof}
+\begin{align*}
+||f(\vec x) - f(\vec y)||^2 &= \sum_{i=1}^n (f_i(\vec x) - f_i(\vec y))^2\\
+&\leq \sum_{i=1}^n (K||\vec x-\vec y||)^2\\
+&= nK^2||\vec x-\vec y||^2
+\end{align*}
+\end{proof}
+\end{theorem}
+
\begin{theorem}
\label{dim-reduction}
@@ -263,7 +277,7 @@ Given $f,g:\bb R^n \to \bb R$ 1-Lipschitz and differentiable, define
$$h(\vec x) = \sin (f(\vec x))\cos(g(\vec x))$$
Clearly $h$ is also differentiable, we will show that it is 1-Lipschitz.
$$\pp h{x_i} = \cos(f(\vec x))\cos(g(\vec x)) \pp{f(\vec x)}{x_i}- \sin(f(\vec x))\sin(g(\vec x)) \pp{g(\vec x)}{x_i}$$
-so letting $f(\vec x) = a,~g(\vec x)= b,~p = \cos a\cos b,~q = \sin a\sin b,~\pp{f(\vec x)}{x_i} = s_i,~\pp{g(\vec x)}{x_i} = t_i$, we have
+so letting $a=f(\vec x),~b=g(\vec x),~p = \cos a\cos b,~q = \sin a\sin b,~\pp{f(\vec x)}{x_i} = s_i,~\pp{g(\vec x)}{x_i} = t_i$, we have
\begin{align*}
||Dh(\vec x)||^2 &= \sum_{i=1}^n \left[ps_i - qt_i\right]^2\\
&=p^2\l(\sum_{i=1}^n s_i^2\r) + q^2\l(\sum_{i=1}^n t_i^2\r)- 2pq\l(\sum_{i=1}^n s_it_i\r)\\
diff --git a/src/sdf.rs b/src/sdf.rs
index c140d1b..2b0d297 100644
--- a/src/sdf.rs
+++ b/src/sdf.rs
@@ -221,9 +221,13 @@ pub enum R3ToR3 {
#[only_if(params.max_depth >= 0)]
Compose(Box<R3ToR3>, Box<R3ToR3>),
/// f(x, y, z) = (f₁(x), f₂(y), f₃(z))
- #[prob(4)]
+ #[prob(3)]
#[only_if(params.max_depth >= 0)]
PerComponent(Box<RToR>, Box<RToR>, Box<RToR>),
+ /// f(x) = (f₁(x), f₂(x), f₃(x))
+ #[prob(3)]
+ #[only_if(params.max_depth >= 0)]
+ Multiplex(Box<R3ToR>, Box<R3ToR>, Box<R3ToR>),
/// a linear interpolation between two functions
#[prob(4)]
#[only_if(params.max_depth >= 0)]
@@ -669,6 +673,23 @@ impl Function for R3ToR3 {
);
output
}
+ Multiplex(fx, fy, fz) => {
+ // we need to scale by 1/sqrt(3) to get a valid SDF
+ let a = var.next();
+ write_str!(
+ code,
+ "vec3 {a} = {input} * (1.0 / sqrt(3.0));\n"
+ );
+ let output = var.next();
+ let x_output = fx.to_glsl(a, code, var);
+ let y_output = fy.to_glsl(a, code, var);
+ let z_output = fz.to_glsl(a, code, var);
+ write_str!(
+ code,
+ "vec3 {output} = vec3({x_output}, {y_output}, {z_output});\n"
+ );
+ output
+ }
Mix(a, b, t) => {
let a_output = a.to_glsl(input, code, var);
let b_output = b.to_glsl(input, code, var);