summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fractiform.js53
-rw-r--r--index.html69
2 files changed, 62 insertions, 60 deletions
diff --git a/fractiform.js b/fractiform.js
index 4817d84..cb31f1d 100644
--- a/fractiform.js
+++ b/fractiform.js
@@ -28,6 +28,8 @@ let ui_div;
let viewport_width, viewport_height;
let shift_key = false, ctrl_key = false;
let html_id = 0;
+let widget_choices;
+let widget_search;
let width = 1920, height = 1920;
@@ -166,6 +168,15 @@ const widget_info = {
},
},
};
+let widget_ids_sorted_by_name = [];
+for (let id in widget_info) {
+ widget_ids_sorted_by_name.push(id);
+}
+widget_ids_sorted_by_name.sort(function (a, b) {
+ a = widget_info[a].name;
+ b = widget_info[b].name;
+ return a.localeCompare(b);
+});
window.addEventListener('load', startup);
@@ -367,6 +378,12 @@ function add_widget(func) {
let title = document.createElement('div');
title.classList.add('widget-title');
title.appendChild(document.createTextNode(info.name));
+ if (func !== 'output') {
+ let name_input = document.createElement('input');
+ name_input.placeholder = 'Name';
+ name_input.classList.add('widget-name');
+ title.appendChild(name_input);
+ }
root.appendChild(title);
}
@@ -560,7 +577,7 @@ function get_shader_source() {
let widgets = {};
let output_widget = null;
for (let widget_div of document.getElementsByClassName('widget')) {
- let names = widget_div.getElementsByClassName('name');
+ let names = widget_div.getElementsByClassName('widget-name');
console.assert(names.length <= 1, 'multiple name inputs for widget');
let name = names.length > 0 ? names[0].value : null;
let func = widget_div.dataset.func;
@@ -595,16 +612,32 @@ function get_shader_source() {
show_error('output color should have type vec3, but it has type ' + output.type);
return null;
}
- state.add_code(`return ${output.code};\n`)
+ state.add_code(`return ${output.code};\n`);
let code = state.get_code();
console.log(code);
return code;
}
+function update_widget_choices() {
+ let search_term = widget_search.value.toLowerCase();
+ let choices = widget_choices.getElementsByClassName('widget-choice');
+ widget_ids_sorted_by_name.forEach(function (id, i) {
+ let name = widget_info[id].name;
+ let choice = choices[i];
+ let shown = name.toLowerCase().indexOf(search_term) !== -1;
+ if (id === 'output') {
+ shown = false;
+ }
+ choice.style.display = shown ? 'block' : 'none';
+ });
+}
+
function startup() {
page = document.getElementById('page');
canvas = document.getElementById('canvas');
ui_div = document.getElementById('ui');
+ widget_choices = document.getElementById('widget-choices');
+ widget_search = document.getElementById('widget-search');
gl = canvas.getContext('webgl');
if (gl === null) {
@@ -694,9 +727,23 @@ void main() {
framebuffer_color_texture = gl.createTexture();
sampler_texture = gl.createTexture();
+ for (let id of widget_ids_sorted_by_name) {
+ let widget = widget_info[id];
+ let button = document.createElement('button');
+ button.classList.add('widget-choice');
+ button.appendChild(document.createTextNode(widget.name));
+ widget_choices.appendChild(button);
+ button.addEventListener('click', function (e) {
+ add_widget(id);
+ });
+ }
+
set_up_framebuffer();
add_widget('output');
- add_widget('mod');
+ update_widget_choices();
+ widget_search.addEventListener('input', function (e) {
+ update_widget_choices();
+ });
frame(0.0);
window.addEventListener('keydown', on_key_press);
diff --git a/index.html b/index.html
index a6b759b..1185e93 100644
--- a/index.html
+++ b/index.html
@@ -124,9 +124,18 @@
margin: 2px;
display: block;
}
- .name {
+ .widget-name {
width: 10em;
}
+ .widget-choice {
+ width: 100%;
+ border-bottom: 0;
+ margin: 0;
+ }
+ #widget-choices {
+ margin: 0.2em;
+ border-bottom: 2px solid white;
+ }
</style>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1" name="viewport">
@@ -142,63 +151,9 @@
</p>
</noscript>
<div id="ui">
- Add <input type="text" placeholder="Name">
- <!--
- <div class="widget" data-func="output">
- <div class="widget-title">Output color</div>
- <div class="in"><input type="text" id="out"> <label for="out">value</label></div>
- </div>
- <div class="widget" data-func="mix">
- <div class="widget-title">Mix <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="src1"> <label for="src1">src1</label></div>
- <div class="in"><input type="text" id="src2"> <label for="src2">src2</label></div>
- <div class="in"><input type="text" id="mix"> <label for="mix">mix</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
- </div>
- <div class="widget" data-func="mix">
- <div class="widget-title">Mix <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="asrc1"> <label for="asrc1">src1</label></div>
- <div class="in"><input type="text" id="asrc2"> <label for="asrc2">src2</label></div>
- <div class="in"><input type="text" id="amix"> <label for="amix">mix</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
- </div>
- <div class="widget" data-func="prev">
- <div class="widget-title">Last frame <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="bpos"> <label for="bpos">pos</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
- </div>
- <div class="widget" data-func="mul">
- <div class="widget-title">Multiply <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="a04"> <label for="a04">a</label></div>
- <div class="in"><input type="text" id="a05"> <label for="a05">b</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
- </div>
- <div class="widget" data-func="square">
- <div class="widget-title">Square selector <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="a02"> <label for="a02">pos</label></div>
- <div class="in"><input type="text" id="a00"> <label for="a00">inside</label></div>
- <div class="in"><input type="text" id="a01"> <label for="a01">outside</label></div>
- <div class="in"><input type="text" id="a03"> <label for="a03">size</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
+ Add <input type="text" id="widget-search" placeholder="Search">
+ <div id="widget-choices">
</div>
- <div class="widget" data-func="mod">
- <div class="widget-title">Modulo <input placeholder="name" class="name" type="text"></div>
- <div class="in"><input type="text" id="a06"> <label for="a06">a</label></div>
- <div class="in"><input type="text" id="a07"> <label for="a07">b</label></div>
- <div class="outs">
- <div class="out">out</div>
- </div>
- </div>-->
</div>
<canvas id="canvas">
<p>