diff --git a/scroll_thick.html b/scroll_thick.html
index 9b0b735..4214d21 100644
--- a/scroll_thick.html
+++ b/scroll_thick.html
@@ -990,6 +990,7 @@
yaw: -Math.PI*0.15,
dampedEvent: { button: 0, movementX: 0, movementY: 0 },
+ hand_grabbing_parchment: false,
cam_pivot_x: 0,
cam_pivot_y: 0,
@@ -1027,14 +1028,14 @@
input.raw_mouse_x = ev.offsetX;
input.raw_mouse_y = ev.offsetY;
+ input.dampedEvent.button = ev.button;
+
if (ev.button == 0) input.lmb_down = input.lmb_clicked = true;
if (ev.button == 2) input.rmb_down = true;
}, opts);
window.addEventListener('mousemove', ev => {
ev.preventDefault();
- input.dampedEvent.button = input.rmb_down ? 2 : 0;
-
if (input.lmb_down || input.rmb_down) {
input.dampedEvent.movementX += ev.movementX;
input.dampedEvent.movementY += ev.movementY;
@@ -1185,6 +1186,17 @@
quill_hovering_parchment &&= Math.abs(-0.15 - vec[1]) < 0.5;
quill_hovering_parchment &&= Math.abs( vec[0]) < 1.1;
+ if (input.mode == INPUT_MODE_GRAB_SCROLL) {
+ quill_hovering_parchment = false;
+
+ if (input.lmb_clicked && quill_hovering_parchment) {
+ input.hand_grabbing_parchment = true;
+ }
+ if (!input.lmb_down && Math.abs(input.dampedEvent.movementY) < 1) {
+ input.hand_grabbing_parchment = false;
+ }
+ }
+
if (!quill_hovering_parchment) {
const p = [-1.50, 0.00, -1.15, 1.0];
mat4_transform_vec4(p, p, u_vp);
@@ -1215,11 +1227,12 @@
if (input.lmb_down || input.rmb_down) document.body.style.cursor = 'grabbing';
if (quill_hovering_parchment) document.body.style.cursor = 'crosshair';
- if (ev.button == 0 && !quill_hovering_parchment) {
+ if (ev.button == 0 && !quill_hovering_parchment && !input.hand_grabbing_parchment) {
input.pitch -= ev.movementX * 0.0005 * zoom_fudge;
input.yaw -= ev.movementY * 0.0005 * zoom_fudge;
input.yaw = Math.max(-Math.PI*0.5 + 0.01, Math.min(Math.PI*0.5 - 0.01, input.yaw));
}
+
if (ev.button == 2) {
const unit = [0, -ev.movementX*0.00075*zoom_fudge, ev.movementY*0.00075*zoom_fudge, 1];
@@ -1247,22 +1260,26 @@
/* scroll parchment or zoom camera, depending */
{
+ /* i like math */
+ const { sqrt, abs, sign, cbrt, pow, min, max } = Math;
/* if hovering parchment, scroll, otherwise zoom camera (and decay scroll input) */
- if (quill_hovering_parchment) {
- const t = Math.sqrt(Math.abs(input.scroll)) * Math.sign(input.scroll);
+ if (quill_hovering_parchment || input.hand_grabbing_parchment) {
+ let t = 0;
+ if (quill_hovering_parchment) t = sqrt(abs(input.scroll)) * sign(input.scroll);
+ if (input.hand_grabbing_parchment) t = input.dampedEvent.movementY * 0.5;
save.scroll_prog += t * 0.05 * deltaTime;
- input.scroll *= Math.pow(1 - 0.20, 60*deltaTime);
+ input.scroll *= pow(1 - 0.20, 60*deltaTime);
/* clamp */
- save.scroll_prog = Math.min(1.0, Math.max(0.0, save.scroll_prog))
+ save.scroll_prog = min(1.0, max(0.0, save.scroll_prog))
} else {
- const t = Math.cbrt(Math.abs(input.scroll)) * Math.sign(input.scroll);
+ const t = cbrt(abs(input.scroll)) * sign(input.scroll);
input.zoom += 0.005*t*input.zoom;
- input.scroll *= Math.pow(1 - 0.5, 60*deltaTime);
- input.zoom = Math.min(20, input.zoom);
+ input.scroll *= pow(1 - 0.5, 60*deltaTime);
+ input.zoom = min(20, input.zoom);
}
}
@@ -1586,8 +1603,8 @@
let hovered;
{
- let norm_mouse_x = -1 + (input.last_mouse_x / window.innerWidth )*2;
- let norm_mouse_y = +1 - (input.last_mouse_y / window.innerHeight)*2;
+ let norm_mouse_x = -1 + (input.raw_mouse_x / window.innerWidth )*2;
+ let norm_mouse_y = +1 - (input.raw_mouse_y / window.innerHeight)*2;
hovered = true;
hovered &&= Math.abs(norm_mouse_x - x) < 0.1;
@@ -1686,7 +1703,7 @@
}
/* drawing pass */
- if (tex_scroll_loaded) {
+ if (tex_scroll_loaded && input.mode != INPUT_MODE_GRAB_SCROLL) {
/* bind to scroll texture */
{
gl.bindFramebuffer(gl.FRAMEBUFFER, tex_scroll_fb);