Compare commits
10 Commits
5ac2cf8632
...
5c7af68d91
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c7af68d91 | ||
|
|
f8861b753f | ||
|
|
d098a19af2 | ||
|
|
94310f0f9d | ||
|
|
be54e20811 | ||
|
|
68e1b3c3a2 | ||
|
|
99a68b246f | ||
|
|
45c31eec27 | ||
|
|
e48bc38c85 | ||
|
|
07b140094b |
728
assets/assets/lightgallery.css
Normal file
728
assets/assets/lightgallery.css
Normal file
@ -0,0 +1,728 @@
|
||||
@font-face {
|
||||
font-family: 'lg';
|
||||
src: url("../fonts/lg.woff2?io9a6k") format("woff2"), url("../fonts/lg.ttf?io9a6k") format("truetype"), url("../fonts/lg.woff?io9a6k") format("woff"), url("../fonts/lg.svg?io9a6k#lg") format("svg");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-display: block;
|
||||
}
|
||||
|
||||
.lg-icon {
|
||||
/* use !important to prevent issues with browser extensions that change fonts */
|
||||
font-family: 'lg' !important;
|
||||
speak: never;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.lg-container {
|
||||
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'Liberation Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
}
|
||||
|
||||
.lg-next,
|
||||
.lg-prev {
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
border-radius: 2px;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
font-size: 22px;
|
||||
margin-top: -10px;
|
||||
padding: 8px 10px 9px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
z-index: 1084;
|
||||
outline: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.lg-next.disabled,
|
||||
.lg-prev.disabled {
|
||||
opacity: 0 !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.lg-next:hover:not(.disabled),
|
||||
.lg-prev:hover:not(.disabled) {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.lg-single-item .lg-next, .lg-single-item
|
||||
.lg-prev {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lg-next {
|
||||
right: 20px;
|
||||
}
|
||||
|
||||
.lg-next:before {
|
||||
content: '\e095';
|
||||
}
|
||||
|
||||
.lg-prev {
|
||||
left: 20px;
|
||||
}
|
||||
|
||||
.lg-prev:after {
|
||||
content: '\e094';
|
||||
}
|
||||
|
||||
@-webkit-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-moz-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-ms-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-moz-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@-ms-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.lg-outer.lg-right-end .lg-object {
|
||||
-webkit-animation: lg-right-end 0.3s;
|
||||
-o-animation: lg-right-end 0.3s;
|
||||
animation: lg-right-end 0.3s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lg-outer.lg-left-end .lg-object {
|
||||
-webkit-animation: lg-left-end 0.3s;
|
||||
-o-animation: lg-left-end 0.3s;
|
||||
animation: lg-left-end 0.3s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lg-toolbar {
|
||||
z-index: 1082;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lg-media-overlap .lg-toolbar {
|
||||
background-image: linear-gradient(0deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.4));
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-icon {
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
font-size: 24px;
|
||||
height: 47px;
|
||||
line-height: 27px;
|
||||
padding: 10px 0;
|
||||
text-align: center;
|
||||
width: 50px;
|
||||
text-decoration: none !important;
|
||||
outline: medium none;
|
||||
will-change: color;
|
||||
-webkit-transition: color 0.2s linear;
|
||||
-o-transition: color 0.2s linear;
|
||||
transition: color 0.2s linear;
|
||||
background: none;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-icon.lg-icon-18 {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-icon:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-close:after {
|
||||
content: '\e070';
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-maximize {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-maximize:after {
|
||||
content: '\e90a';
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-download:after {
|
||||
content: '\e0f2';
|
||||
}
|
||||
|
||||
.lg-sub-html {
|
||||
color: #eee;
|
||||
font-size: 16px;
|
||||
padding: 10px 40px;
|
||||
text-align: center;
|
||||
z-index: 1080;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.2s ease-out 0s;
|
||||
-o-transition: opacity 0.2s ease-out 0s;
|
||||
transition: opacity 0.2s ease-out 0s;
|
||||
}
|
||||
|
||||
.lg-sub-html h4 {
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.lg-sub-html p {
|
||||
font-size: 12px;
|
||||
margin: 5px 0 0;
|
||||
}
|
||||
|
||||
.lg-sub-html a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.lg-sub-html a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.lg-media-overlap .lg-sub-html {
|
||||
background-image: linear-gradient(180deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.6));
|
||||
}
|
||||
|
||||
.lg-item .lg-sub-html {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.lg-error-msg {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.lg-counter {
|
||||
color: #999;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
padding-left: 20px;
|
||||
padding-top: 12px;
|
||||
height: 47px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.lg-closing .lg-toolbar,
|
||||
.lg-closing .lg-prev,
|
||||
.lg-closing .lg-next,
|
||||
.lg-closing .lg-sub-html {
|
||||
opacity: 0;
|
||||
-webkit-transition: -webkit-transform 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, color 0.08 linear;
|
||||
-moz-transition: -moz-transform 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, color 0.08 linear;
|
||||
-o-transition: -o-transform 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, color 0.08 linear;
|
||||
transition: transform 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.08 cubic-bezier(0, 0, 0.25, 1) 0s, color 0.08 linear;
|
||||
}
|
||||
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable) .lg-img-wrap,
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable) .lg-video-cont {
|
||||
opacity: 0;
|
||||
-moz-transform: scale3d(0.5, 0.5, 0.5);
|
||||
-o-transform: scale3d(0.5, 0.5, 0.5);
|
||||
-ms-transform: scale3d(0.5, 0.5, 0.5);
|
||||
-webkit-transform: scale3d(0.5, 0.5, 0.5);
|
||||
transform: scale3d(0.5, 0.5, 0.5);
|
||||
will-change: transform, opacity;
|
||||
-webkit-transition: -webkit-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
|
||||
-moz-transition: -moz-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
|
||||
-o-transition: -o-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
|
||||
transition: transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
|
||||
}
|
||||
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable).lg-complete .lg-img-wrap,
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item:not(.lg-zoomable).lg-complete .lg-video-cont {
|
||||
opacity: 1;
|
||||
-moz-transform: scale3d(1, 1, 1);
|
||||
-o-transform: scale3d(1, 1, 1);
|
||||
-ms-transform: scale3d(1, 1, 1);
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
}
|
||||
|
||||
.lg-icon:focus-visible {
|
||||
color: #fff;
|
||||
border-radius: 3px;
|
||||
outline: 1px dashed rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
|
||||
.lg-toolbar .lg-icon:focus-visible {
|
||||
border-radius: 8px;
|
||||
outline-offset: -5px;
|
||||
}
|
||||
|
||||
.lg-group:after {
|
||||
content: '';
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.lg-container {
|
||||
display: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.lg-container.lg-show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.lg-on {
|
||||
scroll-behavior: unset;
|
||||
}
|
||||
|
||||
.lg-overlay-open {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.lg-toolbar,
|
||||
.lg-prev,
|
||||
.lg-next,
|
||||
.lg-pager-outer,
|
||||
.lg-hide-sub-html .lg-sub-html {
|
||||
opacity: 0;
|
||||
will-change: transform, opacity;
|
||||
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-o-transition: -o-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
}
|
||||
|
||||
.lg-show-in .lg-toolbar,
|
||||
.lg-show-in .lg-prev,
|
||||
.lg-show-in .lg-next,
|
||||
.lg-show-in .lg-pager-outer {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-show-in.lg-hide-sub-html .lg-sub-html {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-show-in .lg-hide-items .lg-prev {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(-10px, 0, 0);
|
||||
transform: translate3d(-10px, 0, 0);
|
||||
}
|
||||
|
||||
.lg-show-in .lg-hide-items .lg-next {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(10px, 0, 0);
|
||||
transform: translate3d(10px, 0, 0);
|
||||
}
|
||||
|
||||
.lg-show-in .lg-hide-items .lg-toolbar {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(0, -10px, 0);
|
||||
transform: translate3d(0, -10px, 0);
|
||||
}
|
||||
|
||||
.lg-show-in .lg-hide-items.lg-hide-sub-html .lg-sub-html {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(0, 20px, 0);
|
||||
transform: translate3d(0, 20px, 0);
|
||||
}
|
||||
|
||||
.lg-outer {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1050;
|
||||
text-align: left;
|
||||
opacity: 0.001;
|
||||
outline: none;
|
||||
will-change: auto;
|
||||
overflow: hidden;
|
||||
-webkit-transition: opacity 0.15s ease 0s;
|
||||
-o-transition: opacity 0.15s ease 0s;
|
||||
transition: opacity 0.15s ease 0s;
|
||||
}
|
||||
|
||||
.lg-outer * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.lg-outer.lg-zoom-from-image {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-outer.lg-visible {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-prev-slide, .lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-next-slide, .lg-outer.lg-css3 .lg-item:not(.lg-start-end-progress).lg-current {
|
||||
-webkit-transition-duration: inherit !important;
|
||||
transition-duration: inherit !important;
|
||||
-webkit-transition-timing-function: inherit !important;
|
||||
transition-timing-function: inherit !important;
|
||||
}
|
||||
|
||||
.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-current {
|
||||
-webkit-transition-duration: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-outer.lg-grab img.lg-object {
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: -o-grab;
|
||||
cursor: -ms-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.lg-outer.lg-grabbing img.lg-object {
|
||||
cursor: move;
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: -o-grabbing;
|
||||
cursor: -ms-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.lg-outer .lg-content {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.lg-outer .lg-inner {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
-webkit-transition: opacity 0s;
|
||||
-o-transition: opacity 0s;
|
||||
transition: opacity 0s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item:not(.lg-start-end-progress) {
|
||||
background: url("../images/loading.gif") no-repeat scroll center center transparent;
|
||||
}
|
||||
|
||||
.lg-outer.lg-css3 .lg-prev-slide,
|
||||
.lg-outer.lg-css3 .lg-current,
|
||||
.lg-outer.lg-css3 .lg-next-slide {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.lg-outer.lg-css .lg-current {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item,
|
||||
.lg-outer .lg-img-wrap {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item:before,
|
||||
.lg-outer .lg-img-wrap:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.lg-outer .lg-img-wrap {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
white-space: nowrap;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item.lg-complete {
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.lg-outer .lg-item.lg-current {
|
||||
z-index: 1060;
|
||||
}
|
||||
|
||||
.lg-outer .lg-object {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lg-outer .lg-empty-html.lg-sub-html,
|
||||
.lg-outer .lg-empty-html .lg-sub-html {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lg-outer.lg-hide-download .lg-download {
|
||||
opacity: 0.75;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.lg-outer .lg-first-slide .lg-dummy-img {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
.lg-outer.lg-components-open:not(.lg-zoomed) .lg-components {
|
||||
-webkit-transform: translate3d(0, 0%, 0);
|
||||
transform: translate3d(0, 0%, 0);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-outer.lg-components-open:not(.lg-zoomed) .lg-sub-html {
|
||||
opacity: 1;
|
||||
transition: opacity 0.2s ease-out 0.15s;
|
||||
}
|
||||
|
||||
.lg-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 1040;
|
||||
background-color: #000;
|
||||
opacity: 0;
|
||||
will-change: auto;
|
||||
-webkit-transition: opacity 333ms ease-in 0s;
|
||||
-o-transition: opacity 333ms ease-in 0s;
|
||||
transition: opacity 333ms ease-in 0s;
|
||||
}
|
||||
|
||||
.lg-backdrop.in {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-css3.lg-no-trans .lg-prev-slide,
|
||||
.lg-css3.lg-no-trans .lg-next-slide,
|
||||
.lg-css3.lg-no-trans .lg-current {
|
||||
-webkit-transition: none 0s ease 0s !important;
|
||||
-moz-transition: none 0s ease 0s !important;
|
||||
-o-transition: none 0s ease 0s !important;
|
||||
transition: none 0s ease 0s !important;
|
||||
}
|
||||
|
||||
.lg-css3.lg-use-css3 .lg-item {
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
|
||||
.lg-css3.lg-fade .lg-item {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.lg-css3.lg-fade .lg-item.lg-current {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-css3.lg-fade .lg-item.lg-prev-slide, .lg-css3.lg-fade .lg-item.lg-next-slide, .lg-css3.lg-fade .lg-item.lg-current {
|
||||
-webkit-transition: opacity 0.1s ease 0s;
|
||||
-moz-transition: opacity 0.1s ease 0s;
|
||||
-o-transition: opacity 0.1s ease 0s;
|
||||
transition: opacity 0.1s ease 0s;
|
||||
}
|
||||
|
||||
.lg-css3.lg-use-css3 .lg-item.lg-start-progress {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0s;
|
||||
transition: transform 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) 0s;
|
||||
}
|
||||
|
||||
.lg-css3.lg-use-css3 .lg-item.lg-start-end-progress {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
}
|
||||
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
}
|
||||
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0);
|
||||
}
|
||||
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
}
|
||||
|
||||
.lg-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lg-container.lg-show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.lg-container.lg-dragging-vertical .lg-backdrop {
|
||||
-webkit-transition-duration: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
}
|
||||
|
||||
.lg-container.lg-dragging-vertical .lg-css3 .lg-item.lg-current {
|
||||
-webkit-transition-duration: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-inline .lg-backdrop,
|
||||
.lg-inline .lg-outer {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.lg-inline .lg-backdrop {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.lg-inline .lg-outer {
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.lg-inline .lg-maximize:after {
|
||||
content: '\e909';
|
||||
}
|
||||
|
||||
.lg-components {
|
||||
-webkit-transform: translate3d(0, 100%, 0);
|
||||
transform: translate3d(0, 100%, 0);
|
||||
will-change: transform;
|
||||
-webkit-transition: -webkit-transform 0.35s ease-out 0s;
|
||||
-moz-transition: -moz-transform 0.35s ease-out 0s;
|
||||
-o-transition: -o-transform 0.35s ease-out 0s;
|
||||
transition: transform 0.35s ease-out 0s;
|
||||
z-index: 1080;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
}
|
||||
8
assets/assets/lightgallery.min.js
vendored
Normal file
8
assets/assets/lightgallery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
48
cavelab_notes.txt
Normal file
48
cavelab_notes.txt
Normal file
@ -0,0 +1,48 @@
|
||||
CMH, 2022-09-04
|
||||
|
||||
As the filenames would imply, there are two shortcodes:
|
||||
- gallery, in layouts/shortcodes/gallery.html
|
||||
- figure, in layouts/shortcodes/figure.html
|
||||
|
||||
'gallery' has a single purpose: to wrap multiple items in a
|
||||
photo container. It takes no parameters.
|
||||
|
||||
'figure' inserts pictures, which should be done inside 'gallery'
|
||||
shortcode. Its parameters are:
|
||||
|
||||
- 'resources', a required parameter which will be matched against page
|
||||
resources. This can be a single image name, or it can use globbing,
|
||||
e.g. "figure/**.jpg" to match every JPEG.
|
||||
- 'page', an optional parameter for the name of the page in which to
|
||||
find these page resources. By default this is the current page.
|
||||
- 'linkto', an optional parameter to have the photo's caption (when
|
||||
clicked) also be a link to another Hugo page. This must be a
|
||||
reference Hugo knows how to resolve, e.g. "/about.md". By default,
|
||||
no link is generated.
|
||||
- 'title', an optional parameter to set the caption's text. This
|
||||
caption will be, in order of preference:
|
||||
- The value specified in this parameter
|
||||
- Exif title specified in a corresponding JSON to the image (see
|
||||
the cavelab URL below for how to generate this)
|
||||
- If 'linkto' is specified, that page's title
|
||||
- The filename itself
|
||||
|
||||
Note that if 'resources' specifies multiple photos (e.g. with
|
||||
globbing), then 'linkto' and 'title' will apply to all such photos.
|
||||
Their typical usage is when 'resources' specifies a single file.
|
||||
|
||||
An example usage is something like:
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure resources="image/foo.jpg" title="Foo (a JPEG)" linkto="/about.md">}}
|
||||
{{< figure page="images" resources="figure/**.jpg" >}}
|
||||
{{</ gallery >}}
|
||||
|
||||
This would make a gallery where the first item is the page resource
|
||||
'image/foo.jpg' on the current page, and its caption has "Foo (a
|
||||
JPEG)" as its text, and the text is also a link to the About page.
|
||||
The gallery's following items are every JPEG in the 'figure' directory
|
||||
of the page resources for the 'images' page.
|
||||
|
||||
This started from a setup documented at:
|
||||
https://blog.cavelab.dev/2021/04/photo-gallery-posts/
|
||||
@ -84,6 +84,10 @@ url = "/works/front"
|
||||
title = "Archive"
|
||||
url = "/archive"
|
||||
|
||||
[[params.nav.custom]]
|
||||
title = "Pages"
|
||||
url = "/pages"
|
||||
|
||||
# Disable these for now until I fix the tags/categories a bit:
|
||||
# [[params.nav.custom]]
|
||||
# title = "Tags"
|
||||
|
||||
@ -13,7 +13,7 @@ _Adjectives I wrote:_ Atmospheric, ambient, relaxing
|
||||
|
||||
_Where to get it:_ The SoundLift page. For now.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/innermost.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/innermost.jpg" noresize=1 >}}
|
||||
|
||||
**innermost**
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@ date: "2007-07-25"
|
||||
|
||||
[Kahvi Collective](http://www.kahvi.org/) has been one of my favorite music sites since maybe 2006. Every release I can remember has always been of very good quality and included some interesting album artwork. Any Kahvi link I post is generally going to have a link to a full download of the album in MP3 and Ogg Vorbis.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/balloon_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/balloon_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**"Red Balloon" by General Fuzz**
|
||||
|
||||
@ -15,7 +15,7 @@ This is [kahvi #216](http://www.kahvi.org/releases.php?release_number=216). Here
|
||||
|
||||
- I listened to these before bed; they had some nice imagery and visualizations
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/cryogenic_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/cryogenic_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Dream Lab - Cryogenic EP**
|
||||
|
||||
|
||||
@ -3,13 +3,13 @@ title: "2007-07-25, more backlog (Coax, Workbench, Brioskj)"
|
||||
date: "2007-07-25"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/coax_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/coax_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Coax - Celethyst EP**
|
||||
|
||||
This is [kahvi #185](http://www.kahvi.org/releases.php?release_number=185). I described it as fast-moving and squirrely. It differs a bit from most of the other things I've heard on Kahvi, but I still like it.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/workbench_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/workbench_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Workbench - Detour EP**
|
||||
|
||||
@ -20,7 +20,7 @@ This is [kahvi #171](http://www.kahvi.org/releases.php?release_number=171). This
|
||||
|
||||
I love this entire album. It's extremely relaxing, but without being boring or dull.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/escape_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/escape_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Brioskj - Escape from the City**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-07-30, backlog (Miss Moonlight)"
|
||||
date: "2007-07-30"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/007770053_miss_moonlight_-_save_us.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/007770053_miss_moonlight_-_save_us.jpg" noresize=1 >}}
|
||||
|
||||
**Miss Moonlight - Save Us**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-10-12, backlog (Scann-Tec)"
|
||||
date: "2007-10-12"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/offline_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/offline_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Scann-Tec - The Man Who Lives Offline**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-10-13, backlog (Cardamar, Dream Lab)"
|
||||
date: "2007-10-13"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/011.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/011.jpg" noresize=1 >}}
|
||||
|
||||
**Cardamar - Sequence Breaker EP**
|
||||
|
||||
@ -15,7 +15,7 @@ This is [Cardamar PARO011](http://www.cardamar.com/releases.php?release=PARO011#
|
||||
|
||||
_Where to get it:_ I don't know, because it's no longer sold at Cardamar Music.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/010.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/010.jpg" noresize=1 >}}
|
||||
|
||||
**Dream Lab - Cosmotherapy**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-10-16, backlog (krill minima)"
|
||||
date: "2007-10-16"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/thn098-00-krill.minima_-_urlaub_auf_balkonien.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/thn098-00-krill.minima_-_urlaub_auf_balkonien.jpg" noresize=1 >}}
|
||||
|
||||
**krill minima - urlaub auf balkonien**
|
||||
|
||||
|
||||
@ -3,9 +3,9 @@ title: "2007-11-03, backlog (Eloi Brunelle)"
|
||||
date: "2007-11-03"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/1152891438-2799.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/epsilonlablogo.gif" noresize=1 >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/epsilonlabtext.gif" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/1152891438-2799.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/epsilonlablogo.gif" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/epsilonlabtext.gif" noresize=1 >}}
|
||||
|
||||
**Eloi Brunelle - The Love EP**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-12-11, backlog (various ctgmusic links)"
|
||||
date: "2007-12-11"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/get_pic.jpeg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/get_pic.jpeg" noresize=1 >}}
|
||||
|
||||
**RMS Maryse**
|
||||
|
||||
@ -16,7 +16,7 @@ I must not have liked anything this artist did, because I wrote "Avoid completel
|
||||
|
||||
_Where to get it:_ [Here](http://www.ctgmusic.com/song.php?id=15905) at ctgmusic
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/easterisland.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/easterisland.jpg" noresize=1 >}}
|
||||
|
||||
**Mindmasher - Easter Eyeland**
|
||||
|
||||
@ -27,7 +27,7 @@ I think I vaguely remember this track being good and pretty unique. This artist
|
||||
|
||||
_Where to get it:_ [Here](http://www.ctgmusic.com/song.php?id=15890) at ctgmusic
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/50005856482.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/50005856482.jpg" noresize=1 >}}
|
||||
|
||||
**Fleeticer**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-12-21, backlog (speak, Polaski, coax)"
|
||||
date: "2007-12-21"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/mindsplit_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/mindsplit_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**"Speak" by Mindsplit**
|
||||
|
||||
@ -15,13 +15,13 @@ This is [kahvi #228](http://www.kahvi.org/releases.php?release_number=228). I re
|
||||
|
||||
So I guess I liked it but I can't remember much else.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/planets_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/planets_lrg.jpg" noresize=1 >}}
|
||||
|
||||
I wrote about [kahvi #229](http://www.kahvi.org/releases.php?release_number=229) like coax wrote it, however it seems coax had nothing to do with it, so I am rather confused. But I said: "Flows well, atmospheric/ambient-ish, melodic"
|
||||
|
||||
Whatever.
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/twilight_snow_lrg.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/twilight_snow_lrg.jpg" noresize=1 >}}
|
||||
|
||||
**Coax - Twilight Snow**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2007-12-28, backlog (ultramar)"
|
||||
date: "2007-12-28"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/thn099-00-gaston_arevalo_-_ultramar.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/thn099-00-gaston_arevalo_-_ultramar.jpg" noresize=1 >}}
|
||||
|
||||
**gastón arévalo – ultramar**
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: "2008-01-17, backlog (vortechtral)"
|
||||
date: "2008-01-17"
|
||||
---
|
||||
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2008/03/emrmp0001.jpg" noresize=1 >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2008/03/emrmp0001.jpg" noresize=1 >}}
|
||||
|
||||
**Vortechtral - Technical EP**
|
||||
|
||||
|
||||
@ -14,8 +14,6 @@ tags:
|
||||
- workfest
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
It's quite different.
|
||||
|
||||
People are open. Their groups are open.
|
||||
@ -33,8 +31,8 @@ They're out of that context. They look like they're in the context they belong.
|
||||
|
||||
My Canon camera is probably almost out of battery power, despite efforts. I should have brought the charger. But I have the Kodak too. Maybe it will show some of the picturesque terrain.
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/img_6262.jpg" caption="Camp AJ from one angle">}}
|
||||
{{< figure page="images" resource="2008-03-workfest/img_6253.jpg" caption="Arriving at Camp AJ">}}
|
||||
{{< figure page="images" resource="2008-03-workfest/img_6265.jpg" caption="Playground and climbing wall near entrance road">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/img_6262.jpg" caption="Camp AJ from one angle">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/img_6253.jpg" caption="Arriving at Camp AJ">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/img_6265.jpg" caption="Playground and climbing wall near entrance road">}}
|
||||
|
||||
(Later note: That is [Camp AJ, 2549 Sand Lick Rd, McKee, KY 40447](https://www.google.com/maps/dir/Cincinnati,+Ohio/Berea,+Kentucky/Camp+AJ,+2549+Sand+Lick+Rd,+McKee,+KY+40447/@37.488284,-84.0115257,16z/data=!4m19!4m18!1m5!1m1!1s0x884051b1de3821f9:0x69fb7e8be4c09317!2m2!1d-84.5120196!2d39.1031182!1m5!1m1!1s0x8842e18aa160b579:0xd32df1c2b2266672!2m2!1d-84.2963223!2d37.568694!1m5!1m1!1s0x884315ccbd7d479b:0x28e72c53d5d60a9d!2m2!1d-84.00718!2d37.4887543).)
|
||||
|
||||
@ -14,8 +14,6 @@ tags:
|
||||
- workfest
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Proceed with first work day.
|
||||
|
||||
Due to loud snorers and periodic heater-startup and my cell phone failing to be a usable alarm after its batteries drained in standalone mode for no apparent reason, causing me to believe it was 6 AM when it was probably around 2 AM . . . I had very little sleep, and woke up pretty groggily and felt like eating nothing and doing nothing.
|
||||
@ -30,12 +28,12 @@ A bluegrass band (Phillip Akemon and Flatlick) also came tonight. They were very
|
||||
|
||||
I was talking to Lea and she told me she hated being around some of the Christians here... I don't totally blame her, even if I don't have the same view (yet). My view is that they are having a very positive outcome, and if they have to believe what they believe to achieve it, then so be it. They aren't pushing beliefs on anyone else, so I can't really criticize much.
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6282.jpg" caption="3 PM?" >}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6282.jpg" caption="3 PM?" >}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6285.jpg" caption="Phillip Akemon" >}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6285.jpg" caption="Phillip Akemon" >}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6289.jpg" caption="Mike Morgeson" >}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6289.jpg" caption="Mike Morgeson" >}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/img_6291.jpg" caption="Kevin Amburgey & Phil" >}}
|
||||
{{< figure page="images" resources="2008-03-workfest/img_6291.jpg" caption="Kevin Amburgey & Phil" >}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6292.jpg" caption="Phil & Phil Jr." >}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6292.jpg" caption="Phil & Phil Jr." >}}
|
||||
|
||||
@ -14,8 +14,6 @@ tags:
|
||||
- workfest
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Well, scratch that part in the last entry about not pushing beliefs.
|
||||
|
||||
I slept like a rock (as MJ predicted), woke up groggily, and started another day. Work was a bit slow at first because my wrist was sore and it was hard to hammer, but everyone was pretty productive in general.
|
||||
@ -32,14 +30,14 @@ I took a ton of pictures today... my 512 MB card is almost full in my Canon, but
|
||||
|
||||
I understood some of what Jen Eich said months ago about being able to volunteer for a year without racking up debt - much of the staff lives in a sort of coop under CAP, with most expenses covered (like housing, insurance, and utilities) and a $150/month stipend. It looks very nice - if one is suitably dedicated.
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6306.jpg" caption="Early stages of the deck">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6306.jpg" caption="Early stages of the deck">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6318.jpg" caption="Deck from the other side">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6318.jpg" caption="Deck from the other side">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6310.jpg" caption="Corrie & Christine putting up soffit">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6310.jpg" caption="Corrie & Christine putting up soffit">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6338.jpg" caption="Nearby road">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6338.jpg" caption="Nearby road">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6341.jpg" caption="Family cemetery">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6341.jpg" caption="Family cemetery">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6348.jpg" caption="Some kitten">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6348.jpg" caption="Some kitten">}}
|
||||
|
||||
@ -14,8 +14,6 @@ tags:
|
||||
- workfest
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Typical morning, finishing up of some work, watching a deck get assembled...
|
||||
|
||||
After that we went to a church about 30-40 minutes away and had dinner with the families whose homes we were repairing. Some people got up to talk and expressed a lot of gratitude in general.
|
||||
@ -32,14 +30,14 @@ It's miles apart from other environments I've been in, where I had suspicion tha
|
||||
|
||||
Photos:
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/img_6359.jpg" caption="Sky in the morning">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/img_6359.jpg" caption="Sky in the morning">}}
|
||||
|
||||
We were repairing Connie's house; this photo has Andy (one of the crew leaders), Connie, and Heather (Connie's daughter)
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6389e.jpg" caption="Andy, Connie, Heather">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6389e.jpg" caption="Andy, Connie, Heather">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6369e.jpg" caption="More progress on the deck">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6369e.jpg" caption="More progress on the deck">}}
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6367e.jpg" caption="Random cat with no tail">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6367e.jpg" caption="Random cat with no tail">}}
|
||||
|
||||
Random cat that would hang around
|
||||
|
||||
@ -14,18 +14,16 @@ tags:
|
||||
- workfest
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
I was too busy/asleep to write much of an entry, so I'll just post the few photos I have from the last two days.
|
||||
|
||||
Almost-completed deck:
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6422e.jpg" caption="Deck, almost finished">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6422e.jpg" caption="Deck, almost finished">}}
|
||||
|
||||
Crate of [Ale-8-One](http://www.ale8one.com/) donated by someone whose name I forget:
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/6425e.jpg" caption="Crate of Ale-8-One">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/6425e.jpg" caption="Crate of Ale-8-One">}}
|
||||
|
||||
Pastries which Andy took a lot of time preparing for breakfast:
|
||||
|
||||
{{< figure page="images" resource="2008-03-workfest/k6584e.jpg" caption="Pastries that Andy put a lot of work into">}}
|
||||
{{< figure page="images" resources="2008-03-workfest/k6584e.jpg" caption="Pastries that Andy put a lot of work into">}}
|
||||
|
||||
@ -10,8 +10,6 @@ categories:
|
||||
- Journal
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
1. Declared myself a complete asshat for writing a blog about nothing
|
||||
|
||||
|
||||
@ -21,7 +19,7 @@ categories:
|
||||
3. Broke the printer after two pages
|
||||
|
||||
4. Discovered that while both my managers described the intern who had just left as essentially clueless, she had decorated the cubicle in interesting tiny artworks made with post-its and highlighter, like this:
|
||||
{{< figure page="images" resource="2008-04-work/cubicleart.jpg" >}}
|
||||
{{< figure page="images" resources="2008-04-work/cubicleart.jpg" >}}
|
||||
|
||||
5. Was very glad that I took 2 hours several months ago to document WTF I was doing when I left, because I certainly did not remember
|
||||
|
||||
|
||||
@ -13,8 +13,6 @@ tags:
|
||||
- midi
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
I guess I'll repeat what some other people do, and put up blog entries about what they do with hardware...
|
||||
|
||||
**Alix.1C**
|
||||
@ -23,8 +21,8 @@ My [Alix.1C](http://www.mini-box.com/Alix-1C-Board-1-LAN-1-MINI-PCI?sc=8&categor
|
||||
|
||||
This board is a 500 MHz AMD Geode with 256 MB RAM onboard; it uses about 5 watts and runs from 12VDC. It has a CompactFlash header onboard, so right now I am running Linux from a 128 MB card.
|
||||
|
||||
{{< figure page="images" resource="2008-05-hardware/6547.jpg" caption="Alix.1C" >}}
|
||||
{{< figure page="images" resource="2008-05-hardware/6549.jpg" caption="Alix.1C other view" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6547.jpg" caption="Alix.1C" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6549.jpg" caption="Alix.1C other view" >}}
|
||||
|
||||
**Edirol PCR-M50**
|
||||
|
||||
@ -34,26 +32,26 @@ Some said they'd taken it apart and cleaned it to fix it. So I figured that woul
|
||||
|
||||
Front cover off, after removing like 50 screws:
|
||||
|
||||
{{< figure page="images" resource="2008-05-hardware/6553.jpg" caption="Edirol keyboard 1" >}}
|
||||
{{< figure page="images" resource="2008-05-hardware/6554.jpg" caption="Edirol keyboard 2" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6553.jpg" caption="Edirol keyboard 1" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6554.jpg" caption="Edirol keyboard 2" >}}
|
||||
|
||||
So I started the process of removing keys because I could not see any other way to access the contacts. They grey part on the left in the first picture looks like about the same mechanism as a keyboard or older joystick pad. There are two pads for each key rather than just one, and my guess is that the one nearest the fulcrum is hit slightly sooner than the further one, and the time elapsed between the two hits is used to guess the velocity with which they key was struck.
|
||||
|
||||
Other than that, just a pretty easy-to-understand design. Each key is held up by a tension spring on the opposite side, and keys slide in and out pretty easily once the springs are gone. The only annoying part was all the white grease everywhere that kept getting all over my hands.
|
||||
|
||||
{{< figure page="images" resource="2008-05-hardware/6555.jpg" caption="Edirol keyboard 3" >}}
|
||||
{{< figure page="images" resource="2008-05-hardware/6556.jpg" caption="Edirol keyboard 4" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6555.jpg" caption="Edirol keyboard 3" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6556.jpg" caption="Edirol keyboard 4" >}}
|
||||
|
||||
And it's just connected electrically with a ribbon cable, normal 0.1" pitch, like an IDE header.
|
||||
|
||||
{{< figure page="images" resource="2008-05-hardware/6557.jpg" caption="Edirol keyboard 5" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6557.jpg" caption="Edirol keyboard 5" >}}
|
||||
|
||||
So I proceeded to remove the first dozen or so keys by pulling out the springs, then white keys and black keys.
|
||||
|
||||
The PCB in the next pictures looks almost black, but it should be more of a dark green. The lines are dust that came between the keys. In any case, these show the rubber(ish) part on top that the keys strike, and the gold PCB contacts beneath them.
|
||||
|
||||
{{< figure page="images" resource="2008-05-hardware/6562.jpg" caption="Edirol keyboard 6" >}}
|
||||
{{< figure page="images" resource="2008-05-hardware/6563.jpg" caption="Edirol keyboard 7" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6562.jpg" caption="Edirol keyboard 6" >}}
|
||||
{{< figure page="images" resources="2008-05-hardware/6563.jpg" caption="Edirol keyboard 7" >}}
|
||||
|
||||
Conveniently, there are four rubber sections (one per octave). Each two gold pads correspond to a key, and the holes between each are where the rubber section is secured.
|
||||
|
||||
|
||||
@ -15,9 +15,7 @@ tags:
|
||||
- science
|
||||
---
|
||||
|
||||
**Political/otherwise controversial
|
||||
**
|
||||
|
||||
**Political/otherwise controversial**
|
||||
|
||||
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ So, these are probably more useful here than sitting in a dusty binder...
|
||||
|
||||
|
||||
|
||||
* [](http://www.opencroquet.org/)[Croquet](http://croquetconsortium.org/) (from the Croquet Project, not to be confused with the Croquet Consortium) - by my description, an attempt to extend the original 2-dimensional paradigm for a GUI into 3 dimensions; by their description, "Croquet is a powerful new open source software development environment and software infrastructure for creating and deploying deeply collaborative multi-user online applications and metaverses on and across multiple operating systems and devices."... I think it's an interesting project, anyhow. Check out some of the papers Alan Kay helped write, and look at some of the videos.
|
||||
* [Croquet](http://www.opencroquet.org/) (from the Croquet Project, not to be confused with the [Croquet Consortium](http://croquetconsortium.org/)) - by my description, an attempt to extend the original 2-dimensional paradigm for a GUI into 3 dimensions; by their description, "Croquet is a powerful new open source software development environment and software infrastructure for creating and deploying deeply collaborative multi-user online applications and metaverses on and across multiple operating systems and devices."... I think it's an interesting project, anyhow. Check out some of the papers Alan Kay helped write, and look at some of the videos.
|
||||
|
||||
|
||||
**2005.??**
|
||||
|
||||
@ -12,8 +12,6 @@ categories:
|
||||
- Technobabble
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
[This page](http://geektechnique.org/index.php?id=254) at GeekTechnique discusses how most digital cameras are easily turned into infrared cameras by removing the IR blocking filter in front of the CCD, and replacing it with a filter that blocks visible light but passes IR. As luck would have it, exposed film negatives work very well as such a filter.
|
||||
|
||||
So I attempted this on my Kodak EasyShare CX6200, my first camera, which somehow still works after 6 years of abuse. It was surprisingly easy, minus the part where I had to manually resolder the coil which controls the shutter on the lens because it was attached by single hair-thin strands of uninsulated wire. But I digress...
|
||||
@ -23,23 +21,23 @@ It can generate a gallery from a directory but first I have to get at
|
||||
that directory. -->
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/edit-127.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/edit-128.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/edit-129.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/edit-130.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/edit-132.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-102.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-104.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-109.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-110.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-113.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-114.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-115.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-117.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-120.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-122.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-124.jpg" >}}
|
||||
{{< figure page="images" resource="2007-2008-old-wordpress/2010/04/orig-125.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/edit-127.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/edit-128.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/edit-129.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/edit-130.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/edit-132.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-102.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-104.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-109.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-110.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-113.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-114.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-115.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-117.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-120.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-122.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-124.jpg" >}}
|
||||
{{< figure page="images" resources="2007-2008-old-wordpress/2010/04/orig-125.jpg" >}}
|
||||
{{< /gallery >}}
|
||||
|
||||
I think it's working well. It very clearly passes IR light because the IR pens for the Wii whiteboard showed up quite brightly; it blocks light from LCD monitors and passes sunlight, but red LEDs seem to show up a bit. Trying it on another camera with more manual controls, and perhaps with a sharper filter, might prove interesting.
|
||||
|
||||
@ -6,8 +6,6 @@ tags:
|
||||
- processing
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
I first dabbled with
|
||||
[Diffusion-Limited Aggregation](http://en.wikipedia.org/wiki/Diffusion-limited_aggregation)
|
||||
algorithms some 5 years back when I read about them in a book (later
|
||||
@ -21,7 +19,7 @@ like this:
|
||||
<!-- TODO: Originally:
|
||||
[{width=50%}](../images/dla2c.png)\
|
||||
-->
|
||||
{{< figure resource="dla2c.png" title="Diffusion Limited Aggregation" caption="Don't ask for the source code to this">}}
|
||||
{{< figure resources="dla2c.png" title="Diffusion Limited Aggregation" caption="Don't ask for the source code to this">}}
|
||||
|
||||
After about 3 or 4 failed attempts to optimize this program to not
|
||||
take days to generate images, I finally rewrote it reasonably
|
||||
|
||||
@ -12,15 +12,13 @@ tags:
|
||||
- cincinnati night photo
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Gawd, it's been forever since I've posted. Seeing Mandy post wonderful pictures regularly at http://kalpanasutra.wordpress.com/ has been an inspiration, but alas, I am still incredibly lazy when it comes to blog posting. I'm working on it.
|
||||
|
||||
In the midst of an eggnog party at Venue 222 I found myself on the roof of the 5-story building, and I absolutely loved the view of downtown Cincinnati from up there.
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure page="images" resource="2010-11-venue222/20101113-DSC_1325.jpg" >}}
|
||||
{{< figure page="images" resource="2010-11-venue222/20101113-DSC_1330.jpg" >}}
|
||||
{{< figure page="images" resource="2010-11-venue222/20101113-DSC_1338.jpg" >}}
|
||||
{{< figure page="images" resource="2010-11-venue222/20101113-DSC_1339.jpg" >}}
|
||||
{{< figure page="images" resources="2010-11-venue222/20101113-DSC_1325.jpg" >}}
|
||||
{{< figure page="images" resources="2010-11-venue222/20101113-DSC_1330.jpg" >}}
|
||||
{{< figure page="images" resources="2010-11-venue222/20101113-DSC_1338.jpg" >}}
|
||||
{{< figure page="images" resources="2010-11-venue222/20101113-DSC_1339.jpg" >}}
|
||||
{{< /gallery >}}
|
||||
|
||||
@ -10,8 +10,6 @@ categories:
|
||||
- Project
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Having procrastinated for around a month, I finally got around to acquiring the chemicals for a standard cyanotype (I went with [digitaltruth.com](http://www.digitaltruth.com/)) and followed the method given in "The Book of Alternative Photographic Processes" by Christopher James, which my friend Lea loaned me. I started out with a 1/5 batch of each solution (thus 20 g ferric ammonium citrate & 100 mL water, and 8 g potassium ferricyanide & 100 mL water).
|
||||
|
||||
The book had wonderful, detailed instructions, most of which I ignored for now because I was just trying to get the feel of the cyanotype process...
|
||||
@ -47,13 +45,13 @@ So I tried to follow that advice on the third attempt I made... actually, I want
|
||||
|
||||
Here's the exposed, but not developed, print:
|
||||
|
||||
{{< figure page="images" resource="2010-12-cyanotypes/cyanotype0001.jpg" >}}
|
||||
{{< figure page="images" resources="2010-12-cyanotypes/cyanotype0001.jpg" >}}
|
||||
|
||||
The gradient in the top left is a strip of paper that I moved away at periodic intervals. I placed several strips of paper to the right but they were removed first and aren't visible here. The Hive13 logo also has a faint image to the left, probably from me moving the print early in the exposure and jolting the negative a little.
|
||||
|
||||
I developed the print (just rinsed it in cold water until the water ran clear) and let it dry for maybe 7 hours:
|
||||
|
||||
{{< figure page="images" resource="2010-12-cyanotypes/cyanotype0002.jpg" >}}
|
||||
{{< figure page="images" resources="2010-12-cyanotypes/cyanotype0002.jpg" >}}
|
||||
|
||||
There are a lot of artifacts here. The darker border might be from the edges of the acetate on the negative. The things in the top left are some etching on one of the plates of glass that I used to hold the negative. In the undeveloped print, the strip to the right of that has clearly visible steps of tone, and I find it a little weird that all of these developed to pure white, while areas that are all the same color in the undeveloped print turned into clearly different tones in the developed one. I probably should read up on how to control this better.
|
||||
|
||||
|
||||
@ -8,16 +8,14 @@ title: Cyanotypes & better results
|
||||
wordpress_id: 473
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Lack of some amount of sunshine is rarely a problem here, it seems. I did this next cyanotype outdoors in very overcast light while it was snowing lightly. The snow was minor since a sheet of glass covered everything, and overcast light possibly was perfect because of how even and omnidirectional it was. The contrast that I achieved in this print surprised me; the dark areas just turned out so much darker than the last print.
|
||||
|
||||
{{< figure page="images" resource="2010-12-cyanotypes/20101206-cyanotype0003.jpg" caption="Same paper & solution, but exposed in overcast sunlight." >}}
|
||||
{{< figure page="images" resources="2010-12-cyanotypes/20101206-cyanotype0003.jpg" caption="Same paper & solution, but exposed in overcast sunlight." >}}
|
||||
|
||||
I still had sensitizer left, so I decided to try some prints on fabric as well. These I exposed for almost 2 hours, maybe longer, under a 200 watt bulb. They didn't turn out as even as I'd like, but I was rushing things a bit and some spots of the towel weren't fully dry when I started exposing. However, I'm still impressed with how it turned out.
|
||||
|
||||
{{< figure page="images" resource="2010-12-cyanotypes/20101212-CIMG0269.jpg" caption="Exposure on a towel from Target; exposed ~ 2 hours under 200 W bulb." >}}
|
||||
{{< figure page="images" resources="2010-12-cyanotypes/20101212-CIMG0269.jpg" caption="Exposure on a towel from Target; exposed ~ 2 hours under 200 W bulb." >}}
|
||||
|
||||
{{< figure page="images" resource="2010-12-cyanotypes/20101212-CIMG0270.jpg" caption="Same towel up close(ish)" >}}
|
||||
{{< figure page="images" resources="2010-12-cyanotypes/20101212-CIMG0270.jpg" caption="Same towel up close(ish)" >}}
|
||||
|
||||
Rob next door to the Hive loaned me a halftone negative he had (since I had nothing else on hand in the way of transparencies) and I made a few exposures of this, but had some problems with the highlights. I really should find some negatives that aren't monochrome (as this was, being a halftone image) so I can figure out how to get the tones right.
|
||||
|
||||
@ -11,16 +11,14 @@ categories:
|
||||
- Project
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
I picked up some very cheap extension tubes and a reversing ring for my DSLR, hoping to do some macro photography with them. However, I sort of ignored that both my lenses default to having their apertures at their narrowest setting (rather than their largest, which for some reason I assumed) until instructed otherwise whether electronically or via the aperture lever. This made it a bit more difficult to do a lot of the shots. I have a 49 to 52 mm step-up ring coming in the mail which will let me use the old SMC Pentax 50mm lens, which has an aperture ring, but it appears to be on a slow boat from China so it's not coming anytime soon.
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101208-DSC_1517.jpg" caption="Part of business card" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101208-DSC_1533.jpg" caption="LCD monitor" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101208-DSC_1520.jpg" caption="CFL" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101209-DSC_1535.jpg" caption="Plastic edge in alligator clips" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101209-DSC_1539.jpg" caption="Those same alligator clips" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101209-DSC_1546.jpg" caption="PCB" >}}
|
||||
{{< figure page="images" resource="2010-12-macro/20101209-DSC_1550.jpg" caption="Solder pads" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101208-DSC_1517.jpg" caption="Part of business card" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101208-DSC_1533.jpg" caption="LCD monitor" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101208-DSC_1520.jpg" caption="CFL" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101209-DSC_1535.jpg" caption="Plastic edge in alligator clips" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101209-DSC_1539.jpg" caption="Those same alligator clips" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101209-DSC_1546.jpg" caption="PCB" >}}
|
||||
{{< figure page="images" resources="2010-12-macro/20101209-DSC_1550.jpg" caption="Solder pads" >}}
|
||||
{{< /gallery >}}
|
||||
|
||||
@ -7,8 +7,6 @@ tags:
|
||||
- blender
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
This is about the tenth time I've tried to learn
|
||||
[Blender](http://www.blender.org/). Judging by the notes I've
|
||||
accumulated so far, I've been at it this time for about a month and a
|
||||
@ -62,9 +60,9 @@ too-many-completely-different-versions of Acidity I wrote.
|
||||
[{width=100%}](../images/20110118-sketch_mj2011016e.jpg)
|
||||
-->
|
||||
|
||||
{{< figure resource="hive13-bezier03.png" title="Hive13 bezier splines" caption="What I learned Bezier splines on, and didn't learn enough about texturing.">}}
|
||||
{{< figure resources="hive13-bezier03.png" title="Hive13 bezier splines" caption="What I learned Bezier splines on, and didn't learn enough about texturing.">}}
|
||||
|
||||
{{< figure resource="20110118-sketch_mj2011016e.jpg" title="Processing sketch" caption="This was made directly from some equations. I don't know how I'd do this in Blender.">}}
|
||||
{{< figure resources="20110118-sketch_mj2011016e.jpg" title="Processing sketch" caption="This was made directly from some equations. I don't know how I'd do this in Blender.">}}
|
||||
|
||||
[POV-Ray](http://www.povray.org) was the last program that I
|
||||
3D-rendered extensively in (this was mostly 2004-2005, as my
|
||||
@ -100,6 +98,6 @@ all the precision that I would have had in POV-Ray, but I built them
|
||||
in probably 1/10 the time. That's the case for the two
|
||||
work-in-progress Blender images here:
|
||||
|
||||
{{< figure resource="20110131-mj20110114b.jpg" title="20110131-mj20110114b" caption="This needs a name and a better background">}}
|
||||
{{< figure resources="20110131-mj20110114b.jpg" title="20110131-mj20110114b" caption="This needs a name and a better background">}}
|
||||
|
||||
{{< figure resource="20110205-mj20110202-starburst2.jpg" title="20110205-mj20110202-starburst2" caption="This needs a name and a better background.">}}
|
||||
{{< figure resources="20110205-mj20110202-starburst2.jpg" title="20110205-mj20110202-starburst2" caption="This needs a name and a better background.">}}
|
||||
|
||||
@ -10,28 +10,26 @@ categories:
|
||||
- Photoblog
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Having acquired a Nikon FE and some lenses quite inexpensively and verifying on some cheap Walgreen film that they did indeed work, I picked up some Fuji Velvia RVP50 from Cord Camera in Kenwood back in April (it was expensive compared to what Amazon would have charged, but I wasn't about to waste a trip to Kenwood over $10ish). I'd heard enough lavish praise lumped onto slide film, particularly Velvia for its fine grain and color, so I figured it was worth a try.
|
||||
|
||||
Few places left will process slide film but as luck has it I am really close to [Robin Imaging](http://www.robinimaging.com/) who still processes it (and, it sounds like, might be the only lab left in Cincinnati that does). I had them scan it as well and received a disc of 6 megapixel images which is decent (I'm told you can get much higher resolution than that out of a fine-grained film, but I'm not complaining).
|
||||
|
||||
While, somewhat stupidly, I don't have a slide projector yet and so I've only seen the scans and the 35mm slides themselves, I still am very impressed with the results.
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-008.jpg" caption="Cincinnati (Over-the-Rhine specifically) near Vine" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-008.jpg" caption="Cincinnati (Over-the-Rhine specifically) near Vine" >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-007.jpg" caption="Vine Street in about the same area" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-007.jpg" caption="Vine Street in about the same area" >}}
|
||||
|
||||
Sadly, my favorite image of the bunch is also the only one where I managed to advance the film wrong:
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-006.jpg" caption="E. Liberty & Walnut. I love how well the film brought out the color." >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-006.jpg" caption="E. Liberty & Walnut. I love how well the film brought out the color." >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-005.jpg" caption="Downtown someplace for Taste of Cincinnati" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-005.jpg" caption="Downtown someplace for Taste of Cincinnati" >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-004.jpg" caption="Obligatory country road shot, this one in Indiana near 56 & 156" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-004.jpg" caption="Obligatory country road shot, this one in Indiana near 56 & 156" >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-003.jpg" caption="56 & Thuermer Hollow in Indiana... little boring, but here it is." >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-003.jpg" caption="56 & Thuermer Hollow in Indiana... little boring, but here it is." >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-002.jpg" caption="Cincinnati, near John & Ezzard Charles" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-002.jpg" caption="Cincinnati, near John & Ezzard Charles" >}}
|
||||
|
||||
{{< figure page="images" resource="2011-06-slide-film/20110606-20-001.jpg" caption="Over-the-Rhine & downtown Cincinnati seen from Bellevue Hill Park" >}}
|
||||
{{< figure page="images" resources="2011-06-slide-film/20110606-20-001.jpg" caption="Over-the-Rhine & downtown Cincinnati seen from Bellevue Hill Park" >}}
|
||||
|
||||
@ -8,8 +8,6 @@ tags:
|
||||
- Technobabble
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
After finally deciding to look around for some projects on GitHub, I
|
||||
found a number of very interesting ones in a matter of minutes.
|
||||
|
||||
@ -28,7 +26,7 @@ probably about 30 minutes to put together the code to generate the
|
||||
usual gawdy test algorithm I try when bootstrapping from a new
|
||||
environment:
|
||||
|
||||
{{< figure resource="acidity-standard.png" title="Standard trippy image">}}
|
||||
{{< figure resources="acidity-standard.png" title="Standard trippy image">}}
|
||||
|
||||
(Yeah, it's gaudy. But when you see it animated, it's amazingly trippy
|
||||
and mesmerizing.)
|
||||
|
||||
@ -8,8 +8,6 @@ tags:
|
||||
- Technobabble
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
My [last post](./2011-08-27-isolated-pixel-pushing.html) mentioned a
|
||||
program called [Context Free](http://www.contextfreeart.org/) that I
|
||||
came across via the [Syntopia](http://blog.hvidtfeldts.net/) blog as
|
||||
@ -31,14 +29,14 @@ I downloaded the program, started it, and their welcome image (with
|
||||
the relatively short source code right beside it) greeted me, rendered
|
||||
on-the-spot:
|
||||
|
||||
{{< figure resource="welcome.png" title="welcome.png">}}
|
||||
{{< figure resources="welcome.png" title="welcome.png">}}
|
||||
|
||||
The program was very easy to work with. Their quick reference card was
|
||||
terse but only needed a handful of examples and a few pages of
|
||||
documentation to fill in the gaps. After about 15 minutes, I'd put
|
||||
together this:
|
||||
|
||||
{{< figure resource="spiral-first-20110823.png" title="spiral-first-20110823.png">}}
|
||||
{{< figure resources="spiral-first-20110823.png" title="spiral-first-20110823.png">}}
|
||||
|
||||
Sure, it's mathematical and simple, but I think being able to put it
|
||||
together in 15 minutes in a general program (i.e. not a silly ad-hoc
|
||||
@ -71,9 +69,9 @@ rule SQUARE1 {
|
||||
|
||||
I worked with it some more the next day and had some things like this:
|
||||
|
||||
{{< figure resource="tree3-abg.png" title="tree3-abg.png">}}
|
||||
{{< figure resources="tree3-abg.png" title="tree3-abg.png">}}
|
||||
|
||||
{{< figure resource="tree4-lul.png" title="tree4-lul.png">}}
|
||||
{{< figure resources="tree4-lul.png" title="tree4-lul.png">}}
|
||||
|
||||
I'm not sure what it is. It looks sort of like a tree made of
|
||||
lightning. Some Hive13 people said it looks like a lockpick from
|
||||
|
||||
@ -10,8 +10,6 @@ aliases:
|
||||
- /posts/2011-11-24-obscure-features-of-jpeg.html
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
*(This is a modified version of what I wrote up at work when I saw
|
||||
that progressive JPEGs could be nearly a drop-in replacement that
|
||||
offered some additional functionality and ran some tests on this.)*
|
||||
@ -361,14 +359,14 @@ Examples
|
||||
Here are all 10 scans from a standard progressive JPEG, separated out with the example code:
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure resource="cropphoto1.png" title="Scan 1">}}
|
||||
{{< figure resource="cropphoto2.png" title="Scan 2">}}
|
||||
{{< figure resource="cropphoto3.png" title="Scan 3">}}
|
||||
{{< figure resource="cropphoto4.png" title="Scan 4">}}
|
||||
{{< figure resource="cropphoto5.png" title="Scan 5">}}
|
||||
{{< figure resource="cropphoto6.png" title="Scan 6">}}
|
||||
{{< figure resource="cropphoto7.png" title="Scan 7">}}
|
||||
{{< figure resource="cropphoto8.png" title="Scan 8">}}
|
||||
{{< figure resource="cropphoto9.png" title="Scan 9">}}
|
||||
{{< figure resource="cropphoto10.png" title="Scan 10">}}
|
||||
{{< figure resources="cropphoto1.png" title="Scan 1">}}
|
||||
{{< figure resources="cropphoto2.png" title="Scan 2">}}
|
||||
{{< figure resources="cropphoto3.png" title="Scan 3">}}
|
||||
{{< figure resources="cropphoto4.png" title="Scan 4">}}
|
||||
{{< figure resources="cropphoto5.png" title="Scan 5">}}
|
||||
{{< figure resources="cropphoto6.png" title="Scan 6">}}
|
||||
{{< figure resources="cropphoto7.png" title="Scan 7">}}
|
||||
{{< figure resources="cropphoto8.png" title="Scan 8">}}
|
||||
{{< figure resources="cropphoto9.png" title="Scan 9">}}
|
||||
{{< figure resources="cropphoto10.png" title="Scan 10">}}
|
||||
{{< /gallery >}}
|
||||
|
||||
@ -10,8 +10,6 @@ aliases:
|
||||
- posts/2016-09-25-pi-pan-tilt-1.html
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
Earlier this year I was turning around ideas in my head - perhaps
|
||||
inspired by Dr. Essa's excellent class,
|
||||
[CS6475: Computational Photography][cs6475] - about the possibility of
|
||||
@ -46,7 +44,7 @@ I eventually had something mostly out of laser-cut plywood, hardware
|
||||
store parts, and [cheap steppers][steppers]. It looks something like
|
||||
this, mounted on a small tripod:
|
||||
|
||||
{{< figure page="images" resource="2016-09-25-pi-pan-tilt-1/IMG_20160912_144539.jpg" >}}
|
||||
{{< figure page="images" resources="2016-09-25-pi-pan-tilt-1/IMG_20160912_144539.jpg" >}}
|
||||
|
||||
I am able to move the steppers thanks to [Matt's code][raspi-spy] and
|
||||
capture images with [raspistill][]. The arrangement here provides two
|
||||
@ -68,7 +66,7 @@ picked up a [25mm M12 lens][25mm-lens] - still an angle of view of
|
||||
about 10 degrees on this sensor - and set it up in the park for a test
|
||||
run:
|
||||
|
||||
{{< figure page="images" resource="2016-09-25-pi-pan-tilt-1/IMG_20160918_160857.jpg" caption="My shot's not slanted, the ground is">}}
|
||||
{{< figure page="images" resources="2016-09-25-pi-pan-tilt-1/IMG_20160918_160857.jpg" caption="My shot's not slanted, the ground is">}}
|
||||
|
||||
(*Later note*: I didn't actually use the 25mm lens on that shot. I
|
||||
used a 4mm (or something) lens that looks pretty much the same, and
|
||||
@ -103,7 +101,7 @@ sign.
|
||||
The first results look decent, but fuzzy, as $10 optics are prone to
|
||||
produce:
|
||||
|
||||
{{< figure page="images" resource="2016-09-25-pi-pan-tilt-1/zwIJpFn.jpg" >}}
|
||||
{{< figure page="images" resources="2016-09-25-pi-pan-tilt-1/zwIJpFn.jpg" >}}
|
||||
|
||||
Follow along to [part 2](./2016-10-04-pi-pan-tilt-2.html).
|
||||
|
||||
|
||||
@ -10,8 +10,6 @@ aliases:
|
||||
- posts/2016-10-04-pi-pan-tilt-2.html
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
In my [last post](./2016-09-25-pi-pan-tilt-1.html) I introduced some
|
||||
of the project I've been working on. This post is a little more
|
||||
technical; if you don't care, and just want to see a 91 megapixel
|
||||
@ -81,7 +79,7 @@ With no refining, tweaking, or optimization, only the per-image
|
||||
stepper motor positions and my guess at the lens's FOV, here is how
|
||||
this looks in Hugin's fast preview:
|
||||
|
||||
{{< figure page="images" resource="2016-10-04-pi-pan-tilt-2/hugin-steppers-only.jpg" caption="Hive13" >}}
|
||||
{{< figure page="images" resources="2016-10-04-pi-pan-tilt-2/hugin-steppers-only.jpg" caption="Hive13" >}}
|
||||
|
||||
*(This is a test run that I did inside of [Hive13][], by the way. I
|
||||
used the CS-mount [ArduCam][] and its included lens. Shots were in a
|
||||
@ -106,7 +104,7 @@ screenshots - on the left, the image positions from the stepper
|
||||
motors, and on the right, the optimized positions that Hugin
|
||||
calculated:
|
||||
|
||||
{{< figure page="images" resource="2016-10-04-pi-pan-tilt-2/hugin-comparison.png" caption="Hugin comparison" >}}
|
||||
{{< figure page="images" resources="2016-10-04-pi-pan-tilt-2/hugin-comparison.png" caption="Hugin comparison" >}}
|
||||
|
||||
They sort of match up, though pitch deviates a bit. I believe that's
|
||||
because I shifted the pitch of the entire thing to straighten it out,
|
||||
|
||||
@ -10,8 +10,6 @@ aliases:
|
||||
- posts/2016-10-12-pi-pan-tilt-3.html
|
||||
---
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
This is the third part in this series, continuing on from
|
||||
[part 1][part1] and [part 2][part2]. The last post was about
|
||||
integrating the hardware with Hugin and PanoTools. This one is
|
||||
@ -147,18 +145,18 @@ provide, I took 9 example shots of the same scene, ranging from about
|
||||
full-resolution JPEG image of these shots, normalized - in effect,
|
||||
trying to re-expose them properly:
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/tile_jpg.jpg" >}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/tile_jpg.jpg" >}}
|
||||
|
||||
The below contains the raw sensor data, turned to 8-bit TIFF and then
|
||||
again normalized. It's going to look different than the JPEG due to
|
||||
the lack of whitebalance adjustment, denoising, brightness, contrast,
|
||||
and so on.
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/tile_8bit.jpg" >}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/tile_8bit.jpg" >}}
|
||||
|
||||
These were done with 16-bit TIFFs rather than 8-bit ones:
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/tile_16bit.jpg" >}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/tile_16bit.jpg" >}}
|
||||
|
||||
In theory, the 16-bit ones should be retaining two extra bits of data
|
||||
from the 10-bit sensor data, and thus two extra stops of dynamic
|
||||
@ -178,7 +176,7 @@ I actually paid). Click the preview for a lossless PNG view, as JPEG
|
||||
might eat some of the finer details, or [here][leaves-full] for the
|
||||
full JPEG file (including raw, if you want to look around).
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/leaves_test.png" caption="JPEG & raw comparison" >}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/leaves_test.png" caption="JPEG & raw comparison" >}}
|
||||
|
||||
The JPEG image seems to have some aggressive denoising that cuts into
|
||||
sharper detail somewhat, as denoising algorithms tends to do. Of
|
||||
@ -187,14 +185,14 @@ the same point, and then average them. That's only applicable in a
|
||||
static scene with some sort of rig to hold things in place, which is
|
||||
convenient, since that's what I'm making...
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/IMG_20161016_141826.jpg" >}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/IMG_20161016_141826.jpg" >}}
|
||||
|
||||
I used that (messy) test setup to produce the below comparison between
|
||||
a JPEG image, a single raw image, 4 raw images averaged, and 16 raw
|
||||
images averaged. These are again 1:1 crops from the center to show
|
||||
noise and detail.
|
||||
|
||||
{{< figure page="images" resource="2016-10-12-pi-pan-tilt-3/penguin_compare.png" caption="JPEG, raw, and averaging">}}
|
||||
{{< figure page="images" resources="2016-10-12-pi-pan-tilt-3/penguin_compare.png" caption="JPEG, raw, and averaging">}}
|
||||
|
||||
Click for the lossless version, and take a look around finer details.
|
||||
4X averaging has clearly reduced the noise from the un-averaged raw
|
||||
|
||||
@ -1,206 +0,0 @@
|
||||
---
|
||||
title: "(post on procedural meshes needs a title)"
|
||||
author: Chris Hodapp
|
||||
date: "2021-07-27"
|
||||
tags:
|
||||
- procedural graphics
|
||||
draft: true
|
||||
---
|
||||
|
||||
# (TODO: a note to me, reading later: you don't need to give your entire
|
||||
# life story here.)
|
||||
|
||||
# (TODO: pictures will make this post make a *lot* more sense, and it
|
||||
# may need a lot of them)
|
||||
|
||||
Context Free is one of my favorite projects since I discovered it
|
||||
about 2010. It's one I've written about before (TODO: link to my
|
||||
posts), played around in (TODO: link to images), presented on, as well
|
||||
as re-implemented myself in different ways (see: [[https://github.com/hodapp87/contextual][Contextual]]). That is
|
||||
sometimes because I wanted to do something Context Free couldn't, such
|
||||
as make it realtime and interactive, and sometimes because
|
||||
implementing its system of recursive grammars and replacement rules
|
||||
can be an excellent way to learn things in a new language. (I think
|
||||
it's similar to [[https://en.wikipedia.org/wiki/L-system][L-systems]], but I haven't yet learned those very well.)
|
||||
|
||||
I've also played around in 3D graphics, particularly raytracing, since
|
||||
about 1999 in PolyRay and POV-Ray. POV-Ray is probably what led me to
|
||||
learn about things like implicit surfaces, parametric surfaces, and
|
||||
procedural geometry - its scene language is full of constructs for
|
||||
that. Naturally, this led me to wonder how I might extend Context
|
||||
Free's model to work more generally with 3D geometry, and let me use
|
||||
it to produce procedural geometry.
|
||||
|
||||
[[http://structuresynth.sourceforge.net/index.php][Structure Synth]] of course already exists, and is a straightforward
|
||||
generalization of Context Free's model to 3D (thank you to Mikael
|
||||
Hvidtfeldt Christensen's blog [[http://blog.hvidtfeldts.net/][Syntopia]], another of my favorite things
|
||||
ever, for introducing me to it awhile ago). See also [[https://kronpano.github.io/BrowserSynth/][BrowserSynth]].
|
||||
However, at some point I realized they weren't exactly what I wanted.
|
||||
Structure Synth lets you combine together 3D primitives to build up a
|
||||
more complex scene - but doesn't try to properly handle any sort of
|
||||
*joining* of these primitives in a way that respects many of the
|
||||
'rules' of geometry that are necessary for a lot of tools, like having
|
||||
a well-defined inside/outside, not being self-intersecting, being
|
||||
manifold, and so forth.
|
||||
|
||||
Tools like [[https://openscad.org/][OpenSCAD]], based on [[https://www.cgal.org/][CGAL]], handle the details of this, and I
|
||||
suspect that [[https://www.opencascade.com/][Open CASCADE]] (thus [[https://www.freecadweb.org/][FreeCAD]]) also does. In CAD work, it's
|
||||
crucial. I experimented with similar recursive systems with some of
|
||||
these, but I quickly ran into a problem: they were made for actual
|
||||
practical applications in CAD, not so much for my generative art, and
|
||||
they scaled quite poorly with the sort of recursion I was asking for.
|
||||
|
||||
Implicit surfaces (or one of the many
|
||||
equivalent-except-for-when-it's-not names for this, e.g. F-Reps or
|
||||
distance bounds or SDFs or isosurfaces) handle almost all of this
|
||||
well! They express CSG (TODO: link to CSG) operations, they can be
|
||||
rendered directly on the GPU via shaders, operations like blending
|
||||
shapes or twisting them are easy... for more on this, see [[http://blog.hvidtfeldts.net/][Syntopia]]
|
||||
again, or nearly anything by [[https://iquilezles.org/][Inigo Quilez]], or look up raymarching and
|
||||
sphere tracing, or see [[https://ntopology.com/][nTopology]], or Matt Keeter's work with [[https://www.libfive.com/][libfive]]
|
||||
and [[https://www.mattkeeter.com/research/mpr/][MPR]]. They're pure magic, they're wonderfully elegant, and I'll
|
||||
probably have many other posts on them.
|
||||
|
||||
However, there is one big issue: turning implicit surfaces to good
|
||||
meshes for rendering /is a huge pain/, and while many renderers can
|
||||
handle implicit surfaces directly, Blender's renderers cannot. I will
|
||||
have other posts going into more detail on this subject, but for now,
|
||||
take it on faith. This is why I did not try to use implicit surfaces
|
||||
for this project. (TODO: Make those posts.)
|
||||
|
||||
With these limitations in mind, around 2018 June I had started jotting
|
||||
some ideas down. The gist is that I wanted to create
|
||||
"correct-by-construction" meshes from these recursive grammars. By
|
||||
that, I meant: incrementally producing the desired geometry as a mesh,
|
||||
triangle-by-triangle, in such a way that guaranteed that the resultant
|
||||
mesh had the desired detail level, was a manifold surface, and that it
|
||||
was otherwise a well-behaved mesh (e.g. no degenerate triangles, no
|
||||
self-intersection, no high-degree vertices, no triangles of extreme
|
||||
angles) - rather than attempting to patch up the mesh after its
|
||||
creation, or subdividing it to the necessary detail level. For
|
||||
something similar to what I mean (though I didn't have this in mind at
|
||||
the start), consider the [[https://en.wikipedia.org/wiki/Marching_squares][marching squares]] algorithm, which is
|
||||
guaranteed to produce closed, manifold meshes.
|
||||
|
||||
(TODO: Illustrate this somehow)
|
||||
|
||||
The form it took in my notes was in sort of "growing" or "extruding" a
|
||||
mesh per these recursive rules, building in these guarantees (some of
|
||||
them at least) by way of inductive steps.
|
||||
|
||||
My meandering path to implementing it went something like this:
|
||||
|
||||
- Write some very ad-hoc Python to generate a mesh of a parametric
|
||||
conversion of my annoying spiral isosurface from 2005 by breaking it
|
||||
into planar "slices" or "frames", which move along the geometry and
|
||||
then are connected together at corresponding vertices. (TODO: Add
|
||||
link to the automata_scratch repo, whatever it's renamed to)
|
||||
- Explore [[https://github.com/thi-ng/geom][thi.ng/geom]] and pretty quickly give up - but in the process,
|
||||
discover [[https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.42.8103][Parallel Transport Approach to Curve Framing]].
|
||||
- Implement that paper in Python, reusing the basic model from my
|
||||
prior code. (See [[https://github.com/Hodapp87/parallel_transport][parallel_transport]])
|
||||
- Again continue with this model, allowing more arbitrary operations
|
||||
than parallel frame transport, eventually integrating most of what I
|
||||
wanted with the recursive grammars. (See
|
||||
[[https://github.com/Hodapp87/automata_scratch/tree/master/python_extrude_meshgen][automata_scratch/python_extrude_meshgen]])
|
||||
- Keep running into limitations in python_extrude_meshgen, and start
|
||||
[[https://github.com/Hodapp87/prosha][Prosha]] in Rust - partly as a redesign/rewrite to avoid these
|
||||
limitations, and partly because I just wanted to learn Rust.
|
||||
- Realize that Rust is the wrong tool for the job, and rewrite *again*
|
||||
in Python but with a rather different design and mindset.
|
||||
|
||||
(this is, of course, ignoring many other tangents with things like
|
||||
shaders)
|
||||
|
||||
(TODO: Maybe split these off into sections for each one?)
|
||||
|
||||
I put some serious effort into [[https://github.com/Hodapp87/prosha][Prosha]] and was conflicted on shelving
|
||||
the project indefinitely, but the issues didn't look easily solvable.
|
||||
Part of those issues were implementation issues with Rust - not that
|
||||
Rust could have really done anything "better" here, but that it just
|
||||
wasn't the right tool for what I was doing. In short, I had spent a
|
||||
lot of that effort trying to badly and unintentionally implement/embed
|
||||
a Lisp inside of Rust instead of just picking a Lispier language, or
|
||||
perhaps using an embeddable Rust-based scripting language like [[https://github.com/koto-lang/koto][Koto]] or
|
||||
[[https://github.com/rhaiscript/rhai][Rhai]]. I had ignored that many things that functional programming left
|
||||
me very accustomed to - like first-class functions and closures - were
|
||||
dependent on garbage collection. When I realized this and did a big
|
||||
refactor to remove this entire layer of complexity, I was left with
|
||||
very little "core" code - just a handful of library functions, and the
|
||||
actual recursive rules for the geometry I was trying to generate.
|
||||
That's good and bad: things were much simpler and vastly faster, but
|
||||
also, it felt like I had wasted quite a lot of time and effort. I
|
||||
have some more detailed notes on this in the Prosha repository.
|
||||
|
||||
Part of the issues also weren't Rust implementation issues - they were
|
||||
deeper issues with my original "correct-by-construction" mesh idea
|
||||
being half-broken. It half-worked: I was able to produce closed,
|
||||
manifold meshes this way, and it could be tedious, but not *that*
|
||||
difficult. However, all of my attempts to also produce "good" meshes
|
||||
this way failed miserably.
|
||||
|
||||
(TODO: Can I find examples of this?)
|
||||
|
||||
The crux is that the recursive rules I used for generating geometry
|
||||
(inspired heavily by those in Context Free) were inherently based
|
||||
around discrete steps, generating discrete entities, like vertices,
|
||||
edges, and face, and it made no sense to "partially" apply a rule,
|
||||
especially if that rule involved some kind of branching - but I kept
|
||||
trying to treat it as something continuous for the sake of being able
|
||||
to "refine" the mesh to as fine of detail as I wanted. Further, I was
|
||||
almost never consistent with the nature of this continuity: sometimes
|
||||
I wanted to treat it like a parametric curve (one continuous
|
||||
parameter), sometimes I wanted to treat it like a parametric surface
|
||||
(two continuous parameters), sometimes I wanted to treat it like an
|
||||
implicit surface (with... theoretically two continuous parameters,
|
||||
just not explicit ones?). It was a mess, and it's part of why my
|
||||
Prosha repository is a graveyard of branches.
|
||||
|
||||
The recursive rules were still excellent at expressing arbitrarily
|
||||
complex, branching geometry - and I really wanted to keep this basic
|
||||
model around somehow. After some reflection, I believed that the only
|
||||
way to do this was to completely separate the process of meshing
|
||||
(refinement, subdivision, facetization...) from the recursive rules.
|
||||
|
||||
This would have been obvious if I read the guides from [[https://graphics.pixar.com/opensubdiv/overview.html][OpenSubdiv]]
|
||||
instead of reimplementing it badly. Their [[https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html][subdivision surface]]
|
||||
documentation covers a lot, but I found it incredibly clear and
|
||||
readable. Once I understood how OpenSubdiv was meant to be used, it
|
||||
made a lot of sense: I shouldn't be trying to generate the "final"
|
||||
mesh, I should be generating a mesh as the /control cage/, which
|
||||
guides the final mesh. Further, I didn't even need to bother with
|
||||
OpenSubdiv's C++ API, I just needed to get the geometry into Blender,
|
||||
and Blender would handle the subdivision on-demand via OpenSubdiv.
|
||||
|
||||
# TODO: This definitely needs examples of a control cage, and of edge
|
||||
# creases
|
||||
|
||||
One minor issue is that this control cage isn't just a triangle mesh,
|
||||
but a triangle mesh plus edge creases. I needed a way to get this
|
||||
data into Blender. However, the only format Blender can read edge
|
||||
creases from is [[http://www.alembic.io/][Alembic]]. Annoyingly, its [[http://docs.alembic.io/reference/index.html#alembic-intro][documentation]] is almost
|
||||
completely nonexistent, the [[https://alembic.github.io/cask/][Cask]] bindings still have spotty Python 3.x
|
||||
support, and when I tried to run their example code to produce some
|
||||
files, and Blender was crashing when importing them.... and this is
|
||||
all a yak to shave another day. I instead generated the mesh data
|
||||
directly in Blender (via its Python interpreter), added it to the
|
||||
scene, and then set its creases via its Python API.
|
||||
|
||||
After the aforementioned refactor in Prosha, I was able to quickly
|
||||
translate the Rust code for most of my examples into Python code with
|
||||
the help of some library code I'd accumulated from the past projects.
|
||||
Debugging this mostly inside Blender also made the process vastly
|
||||
faster. Further, because I was letting Blender handle all of the
|
||||
heavy lifting with mesh processing (and it in turn was using things
|
||||
like OpenSubdiv), the extra overhead of Python compared to Rust didn't
|
||||
matter - I was handling so much less data because I was generating
|
||||
only a control cage, not a full mesh.
|
||||
|
||||
I'm still a little stuck at how to build higher 'geometric'
|
||||
abstractions here and compose them. I have felt like most of the
|
||||
model couples me tightly to low-level mesh constructs - while Context
|
||||
Free and Structure Synth definitely don't have this problem. This is
|
||||
particularly annoying because a lot of the power of these recursive
|
||||
grammars comes from their ability to be abstracted away and composed.
|
||||
|
||||
# (TODO: Show some examples)
|
||||
299
content/posts/2021-07-27-procedural-meshes/index.org
Normal file
299
content/posts/2021-07-27-procedural-meshes/index.org
Normal file
@ -0,0 +1,299 @@
|
||||
---
|
||||
title: "(post on procedural meshes needs a title)"
|
||||
author: Chris Hodapp
|
||||
date: "2021-07-27"
|
||||
tags:
|
||||
- procedural graphics
|
||||
draft: true
|
||||
---
|
||||
|
||||
# (TODO: a note to me, reading later: you don't need to give your entire
|
||||
# life story here.)
|
||||
|
||||
# (TODO: pictures will make this post make a *lot* more sense, and it
|
||||
# may need a lot of them)
|
||||
|
||||
[[https://www.contextfreeart.org/][Context Free]] is one of my favorite projects since I discovered it
|
||||
about 2010. It's one I've [[../2011-08-29-context-free/][written about before]], played around in (see
|
||||
some of the images below), presented on, as well as re-implemented
|
||||
myself in different ways (see: [[https://github.com/hodapp87/contextual][Contextual]]). That is sometimes because
|
||||
I wanted to do something Context Free couldn't, such as make it
|
||||
realtime and interactive, and sometimes because implementing its
|
||||
system of recursive grammars and replacement rules can be an excellent
|
||||
way to learn things in a new language. (I think it's similar to
|
||||
[[https://en.wikipedia.org/wiki/L-system][L-systems]], but I haven't yet learned those very well.)
|
||||
|
||||
# TODO: Set captions?
|
||||
{{< gallery >}}
|
||||
{{< figure page="images" resources="placeholder/dream20191115b.jpg" caption="Something">}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-25-electron.jpg">}}
|
||||
{{< figure page="images" resources="portfolio/2011-11-04-crystal1.jpg">}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-03-feather2.jpg">}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-03-feather1.jpg">}}
|
||||
{{< figure page="images" resources="portfolio/2011-09-09-conch.jpg">}}
|
||||
{{< /gallery >}}
|
||||
|
||||
I've also played around in 3D graphics, particularly raytracing, since
|
||||
about 1999 in PolyRay and POV-Ray... though my [[../../images/portfolio/1999-12-22-table.jpg][few surviving]] [[../../images/portfolio/1999-12-21-moo.jpg][renders
|
||||
from 1999]] are mostly garbage. POV-Ray is probably what led me to
|
||||
learn about things like procedural geometry and textures, especially
|
||||
implicit surfaces and parametric surfaces, as its scene language is
|
||||
full of constructs for that. Below is one of my procedural POV-Ray
|
||||
scenes from experimenting back in 2005, and though I hadn't heard of
|
||||
Context Free at that point (if it even existed) I was already trying
|
||||
to do similar things in a sort of ad-hoc way.
|
||||
|
||||
{{< figure page="images" resources="portfolio/2005-08-23-shear6.jpg">}}
|
||||
|
||||
Naturally, this led me to wonder how I might extend Context Free's
|
||||
model to work more generally with 3D geometry, and let me use it to
|
||||
produce procedural geometry.
|
||||
|
||||
# ../2011-02-07-blender-from-a-recovering-pov-ray-user ?
|
||||
|
||||
[[http://structuresynth.sourceforge.net/index.php][Structure Synth]] of course already exists, and is a straightforward
|
||||
generalization of Context Free's model to 3D (thank you to Mikael
|
||||
Hvidtfeldt Christensen's blog [[http://blog.hvidtfeldts.net/][Syntopia]], another of my favorite things
|
||||
ever, for introducing me to it awhile ago). See also [[https://kronpano.github.io/BrowserSynth/][BrowserSynth]].
|
||||
However, at some point I realized they weren't exactly what I wanted.
|
||||
Structure Synth lets you combine together 3D primitives to build up a
|
||||
more complex scene - but doesn't try to properly handle any sort of
|
||||
/joining/ of these primitives in a way that respects many of the
|
||||
'rules' of geometry that are necessary for a lot of tools, like having
|
||||
a well-defined inside/outside, not being self-intersecting, being
|
||||
manifold, and so forth.
|
||||
|
||||
Here are a few images from an hour or two of my dabbling in Structure
|
||||
Synth - one Blender screenshot, and two [[https://appleseedhq.net/][appleseed]] renders from when I
|
||||
was trying to work with it:
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure resources="structure-synth-mesh.png">}}
|
||||
{{< figure page="images" resources="placeholder/appleseed_spiral_thing2.jpg">}}
|
||||
{{< figure page="images" resources="placeholder/appleseed_spiral_thing.jpg">}}
|
||||
{{< /gallery >}}
|
||||
|
||||
That's a "Hello World"-tier design I try out when something gives me
|
||||
geometric transforms and recursion. The first image (the Blender one)
|
||||
should show the bits of unconnected and half-connected and
|
||||
self-intersecting geometry - that is what I wanted to work around.
|
||||
You can look at this and say, "That really makes no difference, and
|
||||
Structure Synth is capable of anything you /practically/ want to
|
||||
create, but you're just searching for something to nitpick and
|
||||
complain about so that you have a justification for why you reinvented
|
||||
it badly," and you're probably more right than wrong, but you're also
|
||||
still reading, so the joke's on you.
|
||||
|
||||
Tools like [[https://openscad.org/][OpenSCAD]], based on [[https://www.cgal.org/][CGAL]], handle the details of this, and I
|
||||
suspect that [[https://www.opencascade.com/][Open CASCADE]] (thus [[https://www.freecadweb.org/][FreeCAD]]) also does. In CAD work, it's
|
||||
crucial. Here's something similar I threw together in OpenSCAD with
|
||||
the help of some automatically generated code:
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure resources="openscad-mesh.png">}}
|
||||
{{< figure resources="openscad-mesh2.png">}}
|
||||
{{< /gallery >}}
|
||||
|
||||
In the second image you can see how it properly handled intersecting
|
||||
geometry, and facetizing the curve I purposely stuck in there. The
|
||||
mesh looks great, but I quickly ran into a problem: OpenSCAD scales
|
||||
pretty poorly with this level of complexity - and as far as that goes,
|
||||
this geometry is even fairly mild. This really isn't surprising, as
|
||||
tools like this were made for practical applications in CAD, and not
|
||||
so much for my silly explorations in procedural art.
|
||||
|
||||
But wait! *Implicit surfaces* handle almost all of this well! (Or see
|
||||
any of the related-but-not-identical things around this, e.g. [[https://en.wikipedia.org/wiki/Function_representation][F-Reps]]
|
||||
or distance bounds or distance fields or [[https://en.wikipedia.org/wiki/Signed_distance_function][SDFs]] or isosurfaces...) They
|
||||
express [[https://en.wikipedia.org/wiki/Constructive_solid_geometry][CSG]] operations, they can be rendered directly on the GPU via
|
||||
shaders, operations like blending shapes or twisting them are easy,
|
||||
and when generalized to things like distance functions, they can be
|
||||
used to render shapes like fractals that are infinitely complex and
|
||||
lack an analytical formula for the surface, like the [[https://www.skytopia.com/project/fractal/mandelbulb.html][Mandelbulb]]. For
|
||||
more on this, see [[http://blog.hvidtfeldts.net/][Syntopia]] again, or nearly anything by [[https://iquilezles.org/][Inigo Quilez]],
|
||||
or look up raymarching and sphere tracing, or see [[https://ntopology.com/][nTopology]], or Matt
|
||||
Keeter's work with [[https://www.libfive.com/][libfive]] and [[https://www.mattkeeter.com/research/mpr/][MPR]]. They're pure magic, they're
|
||||
wonderfully elegant, and I'll probably have many other posts on them.
|
||||
(TODO: Link to my CS6460 stuff)
|
||||
|
||||
Many renderers can render implicit surfaces directly. [[https://www.shadertoy.com/][Shadertoy]] is
|
||||
full of user-created examples of ad-hoc realtime rendering of implicit
|
||||
surfaces, mostly in the form of sphere tracers, done completely in
|
||||
[[https://en.wikipedia.org/wiki/OpenGL_Shading_Language][GLSL]]. Keeter's work on [[https://www.mattkeeter.com/research/mpr/][MPR]] is all about realtime rendering of a
|
||||
similar sort, but in a much more scalable way. The [[https://appleseedhq.net/][appleseed]] renderer
|
||||
can do it via a [[https://github.com/appleseedhq/appleseed/blob/master/sandbox/examples/cpp/distancefieldobject/distancefieldobject.cpp][custom object via a plugin]]. POV-Ray, as mentioned
|
||||
before, also handles them nicely with its [[https://www.povray.org/documentation/view/3.6.1/300/][Isosurface Object]]. That is
|
||||
what I used below in yet another of my 2005 experiments:
|
||||
|
||||
{{< figure page="images" resources="portfolio/2005-07-05-spiral-isosurface2.jpg">}}
|
||||
|
||||
Many renderers don't handle implicit surfaces at all. Blender's
|
||||
renderers, [[https://www.cycles-renderer.org/][Cycles]] and [[https://docs.blender.org/manual/en/latest/render/eevee/introduction.html][Eevee]], are among them. Using implicit surfaces
|
||||
there means converting them to a form of geometry that Blender /can/
|
||||
handle - typically a polygon mesh.
|
||||
|
||||
This leads to a pretty big issue: turning implicit surfaces to good
|
||||
meshes for rendering /is a huge pain/. If you don't believe me,
|
||||
believe Matt Keeter in [[https://www.mattkeeter.com/research/mpr/keeter_mpr20.pdf][his paper on MPR]] when he says, "There is
|
||||
significant literature on converting implicit surfaces into meshes for
|
||||
visualization. Having implemented many of these algorithms, we've
|
||||
found it extremely difficult to make them robust." I'd love to tell
|
||||
you that I saw this advice before wasting my time trying to turn
|
||||
implicit surfaces to meshes, first with various libraries and then
|
||||
with ad-hoc conversions and optimizations of my own, but I didn't.
|
||||
For comparison, POV-Ray raytraced the above example comfortably on a
|
||||
machine with 512 MB of RAM, and that's at 4000x3000 resolution - while
|
||||
I've had very limited success at turning this particular implicit
|
||||
surface to a polygon mesh good enough to produce anywhere near a
|
||||
comparable render, and that fits in 32 GB of RAM.
|
||||
|
||||
I may have other posts talking about my failures here, but for now,
|
||||
take it on faith: things like this are why I gave up trying to use
|
||||
implicit surfaces for this project. (TODO: Make those posts.)
|
||||
|
||||
# TODO: Perhaps make a note here on explicit vs. implicit, maybe try
|
||||
# to explain generative/procedural/algorithmic/parametric?
|
||||
#
|
||||
# https://en.wikipedia.org/wiki/Parametric_equation#Computer-aided_design -
|
||||
# note explicit vs. implicit vs. parametric.
|
||||
|
||||
With these limitations in mind, around 2018 June I had started jotting
|
||||
some ideas down. The gist is that I wanted to create
|
||||
"correct-by-construction" meshes from these recursive grammars. By
|
||||
that, I meant: incrementally producing the desired geometry as a mesh,
|
||||
polygon-by-polygon, in such a way that guarantees that the resultant
|
||||
mesh has the desired detail level, is a manifold surface, and that it
|
||||
is otherwise a well-behaved mesh (e.g. no degenerate triangles, no
|
||||
self-intersection, no high-degree vertices, no triangles of extreme
|
||||
angles) - rather than attempting to patch up the mesh after its
|
||||
creation, or subdividing it to the necessary detail level. For
|
||||
something similar to what I mean (though I didn't have this in mind at
|
||||
the start), consider the [[https://en.wikipedia.org/wiki/Marching_cubes][marching cubes]] algorithm, which is guaranteed
|
||||
to produce closed, manifold meshes.
|
||||
|
||||
(TODO: Illustrate this somehow)
|
||||
|
||||
The form it took in my notes was in sort of "growing" or "extruding" a
|
||||
mesh per these recursive rules, building in these guarantees (some of
|
||||
them at least) by way of inductive steps.
|
||||
|
||||
My meandering path to implementing it went something like this:
|
||||
|
||||
- Wrote some very ad-hoc Python to generate a mesh of a parametric
|
||||
conversion of my annoying spiral isosurface from 2005 by breaking it
|
||||
into planar "slices" or "frames", which move along the geometry and
|
||||
then are connected together at corresponding vertices. (TODO: Add
|
||||
link to the automata_scratch repo, whatever it's renamed to)
|
||||
- Explored [[https://github.com/thi-ng/geom][thi.ng/geom]] and pretty quickly gave up - but in the
|
||||
process, discovered [[https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.42.8103][Parallel Transport Approach to Curve Framing]].
|
||||
- Implemented that paper in Python, reusing the basic model from my
|
||||
prior code. (See [[https://github.com/Hodapp87/parallel_transport][parallel_transport]])
|
||||
- Again continued with this model, allowing more arbitrary operations
|
||||
than parallel frame transport, eventually integrating most of what I
|
||||
wanted with the recursive grammars. (See
|
||||
[[https://github.com/Hodapp87/automata_scratch/tree/master/python_extrude_meshgen][automata_scratch/python_extrude_meshgen]])
|
||||
- Kept running into limitations in python_extrude_meshgen, and start
|
||||
[[https://github.com/Hodapp87/prosha][Prosha]] in Rust - partly as a redesign/rewrite to avoid these
|
||||
limitations, and partly because I just wanted to learn Rust.
|
||||
- Realized that Rust is the wrong tool for the job, and rewrote
|
||||
*again* in Python but with a rather different design and mindset.
|
||||
|
||||
(this is, of course, ignoring many other tangents with things like
|
||||
shaders)
|
||||
|
||||
(TODO: Maybe split these off into sections for each one? That'd make
|
||||
explanations/pictures easier.)
|
||||
|
||||
(TODO: The whole blog post is about my meandering path and should
|
||||
probably include some Structure Synth things as part of this)
|
||||
|
||||
I put some serious effort into [[https://github.com/Hodapp87/prosha][Prosha]] and was conflicted on shelving
|
||||
the project indefinitely, but the issues didn't look easily solvable.
|
||||
Part of those issues were implementation issues with Rust - not that
|
||||
Rust could have really done anything "better" here, but that it just
|
||||
wasn't the right tool for what I was doing. In short, I had spent a
|
||||
lot of that effort trying to badly and unintentionally implement/embed
|
||||
a Lisp inside of Rust instead of just picking a Lispier language, or
|
||||
perhaps using an embeddable Rust-based scripting language like [[https://github.com/koto-lang/koto][Koto]] or
|
||||
[[https://github.com/rhaiscript/rhai][Rhai]]. I had ignored that many things that functional programming left
|
||||
me very accustomed to - like first-class functions and closures - were
|
||||
dependent on garbage collection. When I realized this and did a big
|
||||
refactor to remove this entire layer of complexity, I was left with
|
||||
very little "core" code - just a handful of library functions, and the
|
||||
actual recursive rules for the geometry I was trying to generate.
|
||||
That's good and bad: things were much simpler and vastly faster, but
|
||||
also, it felt like I had wasted quite a lot of time and effort. I
|
||||
have some more detailed notes on this in the Prosha repository.
|
||||
|
||||
Part of the issues also weren't Rust implementation issues - they were
|
||||
deeper issues with my original "correct-by-construction" mesh idea
|
||||
being half-broken. It half-worked: I was able to produce closed,
|
||||
manifold meshes this way, and it could be tedious, but not *that*
|
||||
difficult. However, all of my attempts to also produce "good" meshes
|
||||
this way failed miserably.
|
||||
|
||||
(TODO: Can I find examples of this?)
|
||||
|
||||
The crux is that the recursive rules I used for generating geometry
|
||||
(inspired heavily by those in Context Free) were inherently based
|
||||
around discrete steps, generating discrete entities, like vertices,
|
||||
edges, and face, and it made no sense to "partially" apply a rule,
|
||||
especially if that rule involved some kind of branching - but I kept
|
||||
trying to treat it as something continuous for the sake of being able
|
||||
to "refine" the mesh to as fine of detail as I wanted. Further, I was
|
||||
almost never consistent with the nature of this continuity: sometimes
|
||||
I wanted to treat it like a parametric curve (one continuous
|
||||
parameter), sometimes I wanted to treat it like a parametric surface
|
||||
(two continuous parameters), sometimes I wanted to treat it like an
|
||||
implicit surface (with... theoretically two continuous parameters,
|
||||
just not explicit ones?). It was a mess, and it's part of why my
|
||||
Prosha repository is a graveyard of branches.
|
||||
|
||||
The recursive rules were still excellent at expressing arbitrarily
|
||||
complex, branching geometry - and I really wanted to keep this basic
|
||||
model around somehow. After some reflection, I believed that the only
|
||||
way to do this was to completely separate the process of meshing
|
||||
(refinement, subdivision, facetization...) from the recursive rules.
|
||||
|
||||
This would have been obvious if I read the guides from [[https://graphics.pixar.com/opensubdiv/overview.html][OpenSubdiv]]
|
||||
instead of reimplementing it badly. Their [[https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html][subdivision surface]]
|
||||
documentation covers a lot, but I found it incredibly clear and
|
||||
readable. Once I understood how OpenSubdiv was meant to be used, it
|
||||
made a lot of sense: I shouldn't be trying to generate the "final"
|
||||
mesh, I should be generating a mesh as the /control cage/, which
|
||||
guides the final mesh. Further, I didn't even need to bother with
|
||||
OpenSubdiv's C++ API, I just needed to get the geometry into Blender,
|
||||
and Blender would handle the subdivision on-demand via OpenSubdiv.
|
||||
|
||||
# TODO: This definitely needs examples of a control cage, and of edge
|
||||
# creases
|
||||
|
||||
One minor issue is that this control cage isn't just a triangle mesh,
|
||||
but a triangle mesh plus edge creases. I needed a way to get this
|
||||
data into Blender. However, the only format Blender can read edge
|
||||
creases from is [[http://www.alembic.io/][Alembic]]. Annoyingly, its [[http://docs.alembic.io/reference/index.html#alembic-intro][documentation]] is almost
|
||||
completely nonexistent, the [[https://alembic.github.io/cask/][Cask]] bindings still have spotty Python 3.x
|
||||
support, and when I tried to run their example code to produce some
|
||||
files, and Blender was crashing when importing them.... and this is
|
||||
all a yak to shave another day. I instead generated the mesh data
|
||||
directly in Blender (via its Python interpreter), added it to the
|
||||
scene, and then set its creases via its Python API.
|
||||
|
||||
After the aforementioned refactor in Prosha, I was able to quickly
|
||||
translate the Rust code for most of my examples into Python code with
|
||||
the help of some library code I'd accumulated from the past projects.
|
||||
Debugging this mostly inside Blender also made the process vastly
|
||||
faster. Further, because I was letting Blender handle all of the
|
||||
heavy lifting with mesh processing (and it in turn was using things
|
||||
like OpenSubdiv), the extra overhead of Python compared to Rust didn't
|
||||
matter - I was handling so much less data because I was generating
|
||||
only a control cage, not a full mesh.
|
||||
|
||||
I'm still a little stuck at how to build higher 'geometric'
|
||||
abstractions here and compose them. I have felt like most of the
|
||||
model couples me tightly to low-level mesh constructs - while Context
|
||||
Free and Structure Synth definitely don't have this problem. This is
|
||||
particularly annoying because a lot of the power of these recursive
|
||||
grammars comes from their ability to be abstracted away and composed.
|
||||
|
||||
# (TODO: Show some examples)
|
||||
@ -2,45 +2,43 @@
|
||||
title: "Gallery?"
|
||||
author: Chris Hodapp
|
||||
tags:
|
||||
type: "photos"
|
||||
---
|
||||
|
||||
This page structure is a work-in-progress. The thumbnails below are
|
||||
supposed to link to individual pages - but I have not yet coded that
|
||||
part in.
|
||||
|
||||
{{< load-photoswipe >}}
|
||||
|
||||
<!-- link2 is to the actual page (until I can figure out how to link this properly) -->
|
||||
<!-- class="no-photoswipe" to make a figure just link to 'link' but only if it's an image -->
|
||||
{{< gallery >}}
|
||||
{{< figure page="images" resource="placeholder/screw0006" title="Screw (April 12, 2020)" >}}
|
||||
{{< figure page="images" resource="placeholder/cinquefoil0010" title="Cinquefoil (November 16, 2019)" caption="Foo">}}
|
||||
{{< figure page="images" resource="placeholder/dream20191115b_1000" title="Dream (November 15, 2019)" >}}
|
||||
{{< figure page="images" resource="placeholder/ramhorn_branch_0002" title="ramhorn_branch? (December 16, 2019)" >}}
|
||||
{{< figure page="images" resource="portfolio/ramhorn-0004" title="Ram's Horn (September 15, 2019)" link2="../2019-09-15-rams-horns.md" >}}
|
||||
{{< figure page="images" resource="placeholder/iso_draft_0017" title="Isosurface try 2 (August 24, 2019)" >}}
|
||||
{{< figure page="images" resource="placeholder/appleseed_spiral_thing" title="Appleseed spiral thing (August 20, 2018)" >}}
|
||||
{{< figure page="images" resource="placeholder/appleseed_spiral_thing2" title="Appleseed spiral thing 2 (June 25, 2018)" >}}
|
||||
{{< figure page="images" resource="placeholder/2011-11-25-electron" title="Electron (November 25, 2011)" >}}
|
||||
{{< figure page="images" resource="portfolio/2011-11-04-crystal1" title="Crystal #1 (November 4, 2011)" link2="../2011-11-04-crystal1.md" >}}
|
||||
{{< figure page="images" resource="placeholder/2011-11-03-feather2" title="Feather #2 (November 3, 2011)" >}}
|
||||
{{< figure page="images" resource="placeholder/2011-11-03-feather1" title="Feather #1 (November 3, 2011)" >}}
|
||||
{{< figure page="images" resource="portfolio/2011-09-09-conch" title="Conch (September 9, 2011)" link2="../2011-09-11-conch.md" >}}
|
||||
{{< figure page="images" resource="placeholder/2011-09-09-flow1" title="Flow? (September 9, 2011)" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-08-23-shear6" title="Shear #6 (August 23, 2005)" link2="../2005-08-23-shear6.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-08-19-beach" title="Beach (August 19, 2005)" link2="../2005-08-19-beach.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-08-06-tears" title="Tears (August 6, 2005)" link2="../2005-08-06-tears.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-08-05-oasis" title="Oasis (August 5, 2005)" link2="../2005-08-05-oasis.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-07-08-vaguely-celtic-metalwork" title="Vaguely Celtic Metalwork (July 8, 2005)" link2="../2005-07-08-vaguely-celtic-metalwork.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-07-05-spiral-isosurface2" title="Spiral Isosurface (July 5, 2005)" link2="../2005-07-05-spiral.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-06-09-superellipsoids" title="Superellipsoids (June 9, 2005)" link2="../2005-06-09-superellipsoids.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-05-11-unknown-planet" title="Unknown Planet (May 11, 2005)" link2="../2005-05-11-unknown-planet.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2005-05-10-haze" title="Haze 3 (May 10, 2005)" link2="../2005-05-10-haze.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2004-12-23-butterfly" title="Butterfly (December 23, 2004)" link2="../2004-12-23-butterfly.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2004-09-28-m4c-intro" title="M4C intro (September 28, 2004)" link2="../2004-09-28-m4c-intro.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2004-09-19-roses" title="Roses (September 19, 2004)" link2="../2004-09-19-roses.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2004-07-16-crunchy-bubbles" title="Crunchy Bubbles (July 16, 2004)" link2="../2004-07-16-crunchy-bubbles.md" >}}
|
||||
{{< figure page="images" resource="portfolio/2004-07-15-kpovmodeler-test" title="KPovModeler test (?) (July 15, 2004)" link2="../2004-07-15-kpovmodeler.md" >}}
|
||||
{{< figure page="images" resource="portfolio/1999-12-22-table" title="'Table' or something (Dec 22, 1999)" link2="../1999-12-22-table-polyray.md" >}}
|
||||
{{< figure page="images" resource="portfolio/1999-12-21-moo" caption="*Foo* [link](./link)" title="Moo (Dec 21, 1999)" caption="*Foo* [link](./link)" link2="../1999-12-21-moo-polyray/">}}
|
||||
{{< figure page="images" resources="placeholder/screw0006.jpg" title="Screw (April 12, 2020) " >}}
|
||||
{{< figure page="images" resources="placeholder/cinquefoil0010.jpg" title="Cinquefoil (November 16, 2019)" >}}
|
||||
{{< figure page="images" resources="placeholder/dream20191115b_1000.jpg" title="Dream (November 15, 2019)" >}}
|
||||
{{< figure page="images" resources="placeholder/ramhorn_branch_0002.jpg" title="ramhorn_branch? (December 16, 2019)" >}}
|
||||
{{< figure page="images" resources="portfolio/ramhorn-0004.jpg" title="Ram's Horn (September 15, 2019)" linkto="/works/2019-09-15-rams-horns" >}}
|
||||
{{< figure page="images" resources="placeholder/iso_draft_0017.jpg" title="Isosurface try 2 (August 24, 2019)" >}}
|
||||
{{< figure page="images" resources="placeholder/appleseed_spiral_thing.jpg" title="Appleseed spiral thing (August 20, 2018)" >}}
|
||||
{{< figure page="images" resources="placeholder/appleseed_spiral_thing2.jpg" title="Appleseed spiral thing 2 (June 25, 2018)" >}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-25-electron.jpg" title="Electron (November 25, 2011)" >}}
|
||||
{{< figure page="images" resources="portfolio/2011-11-04-crystal1.jpg" title="Crystal #1 (November 4, 2011)" linkto="/works/2011-11-04-crystal1" >}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-03-feather2.jpg" title="Feather #2 (November 3, 2011)" >}}
|
||||
{{< figure page="images" resources="placeholder/2011-11-03-feather1.jpg" title="Feather #1 (November 3, 2011)" >}}
|
||||
{{< figure page="images" resources="portfolio/2011-09-09-conch.jpg" title="Conch (September 9, 2011)" linkto="/works/2011-09-11-conch" >}}
|
||||
{{< figure page="images" resources="placeholder/2011-09-09-flow1.jpg" title="Flow? (September 9, 2011)" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-08-23-shear6.jpg" title="Shear #6 (August 23, 2005)" linkto="/works/2005-08-23-shear6" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-08-19-beach.jpg" title="Beach (August 19, 2005)" linkto="/works/2005-08-19-beach" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-08-06-tears.jpg" title="Tears (August 6, 2005)" linkto="/works/2005-08-06-tears" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-08-05-oasis.jpg" title="Oasis (August 5, 2005)" linkto="/works/2005-08-05-oasis" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-07-08-vaguely-celtic-metalwork.jpg" title="Vaguely Celtic Metalwork (July 8, 2005)" linkto="/works/2005-07-08-vaguely-celtic-metalwork" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-07-05-spiral-isosurface2.jpg" title="Spiral Isosurface (July 5, 2005)" linkto="/works/2005-07-05-spiral" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-06-09-superellipsoids.jpg" title="Superellipsoids (June 9, 2005)" linkto="/works/2005-06-09-superellipsoids" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-05-11-unknown-planet.jpg" title="Unknown Planet (May 11, 2005)" linkto="/works/2005-05-11-unknown-planet" >}}
|
||||
{{< figure page="images" resources="portfolio/2005-05-10-haze.jpg" title="Haze 3 (May 10, 2005)" linkto="/works/2005-05-10-haze" >}}
|
||||
{{< figure page="images" resources="portfolio/2004-12-23-butterfly.jpg" title="Butterfly (December 23, 2004)" linkto="/works/2004-12-23-butterfly" >}}
|
||||
{{< figure page="images" resources="portfolio/2004-09-28-m4c-intro.jpg" title="M4C intro (September 28, 2004)" linkto="/works/2004-09-28-m4c-intro" >}}
|
||||
{{< figure page="images" resources="portfolio/2004-09-19-roses.jpg" title="Roses (September 19, 2004)" linkto="/works/2004-09-19-roses" >}}
|
||||
{{< figure page="images" resources="portfolio/2004-07-16-crunchy-bubbles.jpg" title="Crunchy Bubbles (July 16, 2004)" linkto="/works/2004-07-16-crunchy-bubbles" >}}
|
||||
{{< figure page="images" resources="portfolio/2004-07-15-kpovmodeler-test.jpg" title="KPovModeler test (?) (July 15, 2004)" linkto="/works/2004-07-15-kpovmodeler" >}}
|
||||
{{< figure page="images" resources="portfolio/1999-12-22-table.jpg" title="'Table' or something (Dec 22, 1999)" linkto="/works/1999-12-22-table-polyray" >}}
|
||||
{{< figure page="images" resources="portfolio/1999-12-21-moo.jpg" title="Moo (Dec 21, 1999)" linkto="/works/1999-12-21-moo-polyray">}}
|
||||
|
||||
{{< /gallery >}}
|
||||
|
||||
@ -4,3 +4,5 @@ emacs -q --batch -l util.el -f filter-org
|
||||
echo "Calling org_fix_links.py..."
|
||||
./org_fix_links.py < ./_tmp_filtered.org > ./_tmp_filtered2.org
|
||||
emacs -q --batch -l util.el -f export-run
|
||||
|
||||
#sed -i -e "s/^- /- /g" log.md
|
||||
|
||||
8
layouts/partials/footer_local.html
Normal file
8
layouts/partials/footer_local.html
Normal file
@ -0,0 +1,8 @@
|
||||
<!-- From https://blog.cavelab.dev/2021/04/photo-gallery-posts/ -->
|
||||
|
||||
{{- if and (eq .Type "photos") (eq .Kind "page") -}}
|
||||
<script src="{{ (resources.Get "assets/lightgallery.min.js" | fingerprint).Permalink }}"></script>
|
||||
<script>lightGallery(document.getElementById('lightgallery'), {selector: '.photo-item'});</script>
|
||||
{{- end -}}
|
||||
|
||||
<!-- lightgallery is: https://github.com/sachinchoolur/lightGallery -->
|
||||
8
layouts/partials/header_local.html
Normal file
8
layouts/partials/header_local.html
Normal file
@ -0,0 +1,8 @@
|
||||
<!-- From https://blog.cavelab.dev/2021/04/photo-gallery-posts/ -->
|
||||
{{- if and (eq .Type "photos") (eq .Kind "page") -}}
|
||||
<link rel="stylesheet" href="{{ (resources.Get "assets/lightgallery.css" | fingerprint).Permalink }}" />
|
||||
{{- end -}}
|
||||
<!-- lightgallery is: https://github.com/sachinchoolur/lightGallery -->
|
||||
|
||||
<link rel="stylesheet" href="{{ .Site.BaseURL }}css/custom.css">
|
||||
|
||||
@ -1,25 +1,9 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/figure.html
|
||||
NB this overrides Hugo's built-in "figure" shortcode but is backwards compatible
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
<!-- See cavelab_notes.txt at root of repo. -->
|
||||
|
||||
<!-- count how many times we've called this shortcode; load the css if it's the first time -->
|
||||
{{- if not ($.Page.Scratch.Get "figurecount") -}}<link rel="stylesheet" href="/css/hugo-easy-gallery.css" />{{- end -}}
|
||||
{{- $.Page.Scratch.Add "figurecount" 1 -}}
|
||||
<!-- Started from: https://blog.cavelab.dev/2021/04/photo-gallery-posts/ -->
|
||||
|
||||
<!-- if 'resource' is given, look for a page resource by that name. -->
|
||||
<!-- if 'page' is given, find the page resource there. -->
|
||||
<!-- if not, find the page resource in the current page. -->
|
||||
<!-- (yes, my description is probably at least 50% wrong) -->
|
||||
|
||||
<!-- Thumbnail image size/type -->
|
||||
{{- $resize_opts := "600x jpg" -}}
|
||||
<!-- TODO: This isn't generating a JPEG on my configuration. Not sure
|
||||
why. Hugo version issue? -->
|
||||
{{- $thumb := "" -}}
|
||||
{{- $href := "" -}}
|
||||
{{- if .Get "resource" -}}
|
||||
<!-- if 'page' is given, find page resources there. -->
|
||||
<!-- if not, find page resources in the current page. -->
|
||||
{{- $page := $.Page -}}
|
||||
{{- with .Get "page" -}}
|
||||
{{- $page = $.Site.GetPage . -}}
|
||||
@ -27,45 +11,97 @@ Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
{{- if not $page -}}
|
||||
{{- errorf "Error: Can't find page %s" (.Get "page") -}}
|
||||
{{- end -}}
|
||||
{{- $resource := (.Get "resource") -}}
|
||||
{{- $original := $page.Resources.GetMatch (printf "*%s*" $resource) -}}
|
||||
{{- if eq $original nil -}}
|
||||
{{- errorf "Error: Can't find resource %s on page %s" $resource (.Get "page") -}}
|
||||
|
||||
{{- $linkto := .Get "linkto" -}}
|
||||
{{- $linktitle := "" -}}
|
||||
{{- if $linkto -}}
|
||||
{{- $linktitle = ($.Site.GetPage $linkto).Title -}}
|
||||
{{- end -}}
|
||||
{{- if .Get "noresize" -}}
|
||||
{{- .Scratch.Set "image" $original -}}
|
||||
{{- else -}}
|
||||
{{- .Scratch.Set "image" ($original.Resize $resize_opts) -}}
|
||||
{{- end -}}
|
||||
{{- $image := .Scratch.Get "image" -}}
|
||||
{{- $thumb = $image.RelPermalink -}}
|
||||
{{- $href = $original.RelPermalink -}}
|
||||
{{- else -}}
|
||||
<!-- use either src or link-thumb for thumbnail image -->
|
||||
{{- $thumb = .Get "src" | default (printf "%s." (.Get "thumb") | replace (.Get "link") ".") -}}
|
||||
{{- $href = .Get "link" | default (.Get "src") -}}
|
||||
{{- $title := .Get "title" -}}
|
||||
|
||||
{{- $resources := .Get "resources" -}}
|
||||
{{- if not $resources -}}
|
||||
{{- errorf "Error: 'resources' must be given" -}}
|
||||
{{- end -}}
|
||||
|
||||
<div class="box{{ with .Get "caption-position" }} fancy-figure caption-position-{{.}}{{end}}{{ with .Get "caption-effect" }} caption-effect-{{.}}{{end}}" {{ with .Get "width" }}style="max-width:{{.}}"{{end}}>
|
||||
<figure {{ with .Get "class" }}class="{{.}}"{{ end }} itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<!-- Prepending ../.. below is a hack to get around
|
||||
https://github.com/gohugoio/hugo/issues/2744 when I don't
|
||||
feel like setting baseURL and using absolute URLs. -->
|
||||
<div class="img"{{ if .Parent }} style="background-image: url('../..{{ $thumb }}');"{{ end }}{{ with .Get "size" }} data-size="{{.}}"{{ end }}>
|
||||
<img itemprop="thumbnail" src="{{ $thumb }}" {{ with .Get "alt" | default (.Get "caption" | markdownify) }}alt="{{.}}"{{ end }}/><!-- <img> hidden if in .gallery -->
|
||||
</div>
|
||||
{{- range $src := $page.Resources.Match $resources -}}
|
||||
{{- $exifJson := $page.Resources.GetMatch (printf "%s.json" .Name) -}}
|
||||
|
||||
<a href="{{ $href }}" itemprop="contentUrl"></a>
|
||||
{{- if or (or (.Get "title") (.Get "caption" | markdownify)) (.Get "attr") -}}
|
||||
<figcaption>
|
||||
{{- with .Get "title" -}}<h4>{{.}}</h4>{{ end }}
|
||||
{{- if or (.Get "caption" | markdownify) (.Get "attr")}}
|
||||
<p>
|
||||
{{- .Get "caption" -}}
|
||||
{{- with .Get "attrlink"}}<a href="{{.}}">{{ .Get "attr" }}</a>{{ else }}{{ .Get "attr"}}{{ end -}}
|
||||
</p>
|
||||
{{- $exif := slice -}}
|
||||
{{- with $exifJson -}}
|
||||
{{- with (index (.Content | unmarshal) 0) -}}
|
||||
{{- with .Title -}}
|
||||
<!-- If user gave no title, but Exif has one, use that: -->
|
||||
{{- if not $title -}}
|
||||
{{- $title = . -}}
|
||||
{{- end -}}
|
||||
</figcaption>
|
||||
{{- end -}}
|
||||
</figure>
|
||||
{{- with .Make2 -}}{{- $exif = $exif | append (printf "Make: %s" .) -}}{{- end -}}
|
||||
{{- with .Model -}}{{- $exif = $exif | append (printf "Camera: %s" .) -}}{{- end -}}
|
||||
{{- with .LensSpec -}}{{- $exif = $exif | append (printf "Lens: %s" .) -}}{{- end -}}
|
||||
{{- with .FocalLength -}}{{- $exif = $exif | append (printf "Focal length: %s" .) -}}{{- end -}}
|
||||
{{- with .FNumber -}}{{- $exif = $exif | append (printf "Aperture: ƒ/%.1f" .) -}}{{- end -}}
|
||||
{{- with .ExposureTime -}}
|
||||
{{- if eq (printf "%T" .) "float64" -}}
|
||||
{{- $exif = $exif | append (printf "Exposure time: %.1f s" .) -}}
|
||||
{{- else -}}
|
||||
{{- $exif = $exif | append (printf "Exposure time: %s s" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- with .ISO -}}{{- $exif = $exif | append (printf "ISO: %.0f" .) -}}{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
<!-- If still no title, just use the filename: -->
|
||||
{{- if not $title -}}
|
||||
{{- $title = .Title -}}
|
||||
{{- end -}}
|
||||
|
||||
<!-- If *still* no title, but a link was given, use page title from link: -->
|
||||
{{- $text := $title -}}
|
||||
{{- if $linkto -}}
|
||||
{{- if not $title -}}
|
||||
{{- $title = $linktitle -}}
|
||||
{{- end -}}
|
||||
{{- $text = (printf "<a href=\"%s\">%s</a>" (relref $.Page $linkto) $title) -}}
|
||||
{{- end -}}
|
||||
|
||||
<div class="photo-item" data-src="{{ .Permalink }}" data-sub-html="<h4>{{ $text }}</h4><p>{{ delimit $exif " | " }}</p>">
|
||||
{{- $crop := default "smart" -}}
|
||||
{{- $tinyw := printf "500x375 %s Lanczos q85" $crop -}}
|
||||
{{- $smallw := printf "800x600 %s Lanczos q80" $crop -}}
|
||||
{{- $mediumw := printf "1200x900 %s Lanczos q40" $crop -}}
|
||||
{{- $largew := printf "1600x1200 %s Lanczos q30" $crop -}}
|
||||
|
||||
{{- $srcset := slice -}}
|
||||
|
||||
{{- $tiny := ($src.Fill $tinyw) -}}
|
||||
{{- $srcset = $srcset | append (printf "%s 500w" $tiny.Permalink) -}}
|
||||
{{- $img := dict "src" $tiny.RelPermalink "w" $tiny.Width "h" $src.Height -}}
|
||||
|
||||
{{- if and (ge $src.Width "800") (ne $src.MediaType.SubType "png") -}}
|
||||
{{- $small := ($src.Fill $smallw) -}}
|
||||
{{- $srcset = $srcset | append (printf "%s 800w" $small.Permalink) -}}
|
||||
{{- $img = dict "src" $small.RelPermalink "w" $small.Width "h" $small.Height -}}
|
||||
{{- end -}}
|
||||
{{- if and (ge $src.Width "1200") (ne $src.MediaType.SubType "png") -}}
|
||||
{{- $medium := ($src.Fill $mediumw) -}}
|
||||
{{- $srcset = $srcset | append (printf "%s 1200w" $medium.Permalink) -}}
|
||||
{{- end -}}
|
||||
{{- if and (ge $src.Width "1600") (ne $src.MediaType.SubType "png") -}}
|
||||
{{- $large := ($src.Fill $largew) -}}
|
||||
{{- $srcset = $srcset | append (printf "%s 1600w" $large.Permalink) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $sizes := "(min-width: 900px) 420px, (min-width: 684px) 310px, calc(100vw - 40px)" -}}
|
||||
|
||||
<a href="{{ .Permalink }}">
|
||||
<picture>
|
||||
<source type="{{ $src.MediaType }}" sizes="{{ $sizes }}" srcset='{{ delimit $srcset ", " }}'>
|
||||
<img loading="lazy" class="center"
|
||||
src="{{ $img.src }}" width="{{ $img.w }}" height="{{ $img.h }}" alt="{{ $title }}">
|
||||
<!-- CMH: img was missing closing tag on his website -->
|
||||
</picture>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
@ -1,41 +1,4 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/gallery.html
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
<!-- count how many times we've called this shortcode; load the css if it's the first time -->
|
||||
{{- if not ($.Page.Scratch.Get "figurecount") }}<link rel="stylesheet" href="/css/hugo-easy-gallery.css" />{{ end }}
|
||||
{{- $.Page.Scratch.Add "figurecount" 1 }}
|
||||
{{ $baseURL := .Site.BaseURL }}
|
||||
<div class="gallery caption-position-{{ with .Get "caption-position" | default "bottom" }}{{.}}{{end}} caption-effect-{{ with .Get "caption-effect" | default "slide" }}{{.}}{{end}} hover-effect-{{ with .Get "hover-effect" | default "zoom" }}{{.}}{{end}} {{ if ne (.Get "hover-transition") "none" }}hover-transition{{end}}" itemscope itemtype="http://schema.org/ImageGallery">
|
||||
{{- with (.Get "dir") -}}
|
||||
<!-- If a directory was specified, generate figures for all of the images in the directory -->
|
||||
{{- $files := readDir (print "/static/" .) }}
|
||||
{{- range $files -}}
|
||||
<!-- skip files that aren't images, or that inlcude the thumb suffix in their name -->
|
||||
{{- $thumbext := $.Get "thumb" | default "-thumb" }}
|
||||
{{- $isthumb := .Name | findRE ($thumbext | printf "%s\\.") }}<!-- is the current file a thumbnail image? -->
|
||||
{{- $isimg := lower .Name | findRE "\\.(gif|jpg|jpeg|tiff|png|bmp)" }}<!-- is the current file an image? -->
|
||||
{{- if and $isimg (not $isthumb) }}
|
||||
{{- $caption := .Name | replaceRE "\\..*" "" | humanize }}<!-- humanized filename without extension -->
|
||||
{{- $linkURL := print $baseURL ($.Get "dir") "/" .Name | absURL }}<!-- absolute URL to hi-res image -->
|
||||
{{- $thumb := .Name | replaceRE "(\\.)" ($thumbext | printf "%s.") }}<!-- filename of thumbnail image -->
|
||||
{{- $thumbexists := where $files "Name" $thumb }}<!-- does a thumbnail image exist? -->
|
||||
{{- $thumbURL := print $baseURL ($.Get "dir") "/" $thumb | absURL }}<!-- absolute URL to thumbnail image -->
|
||||
<div class="box">
|
||||
<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<div class="img" style="background-image: url('{{ if $thumbexists }}{{ $thumbURL }}{{ else }}{{ $linkURL }}{{ end }}');" >
|
||||
<img itemprop="thumbnail" src="{{ if $thumbexists }}{{ $thumbURL }}{{ else }}{{ $linkURL }}{{ end }}" alt="{{ $caption }}" /><!-- <img> hidden if in .gallery -->
|
||||
</div>
|
||||
<figcaption>
|
||||
<p>{{ $caption }}</p>
|
||||
</figcaption>
|
||||
<a href="{{ $linkURL }}" itemprop="contentUrl"></a><!-- put <a> last so it is stacked on top -->
|
||||
</figure>
|
||||
</div>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else -}}
|
||||
<!-- If no directory was specified, include any figure shortcodes called within the gallery -->
|
||||
<!-- See cavelab_notes.txt at root of repo. -->
|
||||
<div class="photo-container" id="lightgallery">
|
||||
{{ .Inner }}
|
||||
{{- end }}
|
||||
</div>
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
<!--
|
||||
Put this file in /layouts/shortcodes/load-photoswipe.html
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
-->
|
||||
|
||||
<!-- prevent this shortcode from being loaded more than once per page -->
|
||||
{{ if not ($.Page.Scratch.Get "photoswipeloaded") }}
|
||||
{{ $.Page.Scratch.Set "photoswipeloaded" 1 }}
|
||||
|
||||
<!--
|
||||
*** jQuery must be loaded before load-photoswipe.js ***
|
||||
- If your template already loads jQuery in the header then you don't need to load it again here.
|
||||
- If your template already loads jQuery in the footer, then you could load load-photoswipe.js from the footer instead
|
||||
-->
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
<script src="/js/load-photoswipe.js"></script>
|
||||
|
||||
<!-- Photoswipe css/js libraries -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js" integrity="sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js" integrity="sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=" crossorigin="anonymous"></script>
|
||||
|
||||
<!-- Root element of PhotoSwipe. Must have class pswp. -->
|
||||
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<!-- Background of PhotoSwipe.
|
||||
It's a separate element, as animating opacity is faster than rgba(). -->
|
||||
<div class="pswp__bg"></div>
|
||||
<!-- Slides wrapper with overflow:hidden. -->
|
||||
<div class="pswp__scroll-wrap">
|
||||
<!-- Container that holds slides.
|
||||
PhotoSwipe keeps only 3 of them in DOM to save memory.
|
||||
Don't modify these 3 pswp__item elements, data is added later on. -->
|
||||
<div class="pswp__container">
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
</div>
|
||||
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
|
||||
<div class="pswp__ui pswp__ui--hidden">
|
||||
<div class="pswp__top-bar">
|
||||
<!-- Controls are self-explanatory. Order can be changed. -->
|
||||
<div class="pswp__counter"></div>
|
||||
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
|
||||
<button class="pswp__button pswp__button--share" title="Share"></button>
|
||||
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
|
||||
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
|
||||
<!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
|
||||
<!-- element will get class pswp__preloader--active when preloader is running -->
|
||||
<div class="pswp__preloader">
|
||||
<div class="pswp__preloader__icn">
|
||||
<div class="pswp__preloader__cut">
|
||||
<div class="pswp__preloader__donut"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
|
||||
<div class="pswp__share-tooltip"></div>
|
||||
</div>
|
||||
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
|
||||
</button>
|
||||
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
|
||||
</button>
|
||||
<div class="pswp__caption">
|
||||
<div class="pswp__caption__center"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
@ -6,3 +6,23 @@ code {
|
||||
background-color: #EEE
|
||||
}
|
||||
*/
|
||||
|
||||
/* From https://blog.cavelab.dev/2021/04/photo-gallery-posts
|
||||
and then run through sass: */
|
||||
.photo-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin: 0 -40px; }
|
||||
@media (max-width: 899px) {
|
||||
.photo-container {
|
||||
margin: 0; } }
|
||||
.photo-container img {
|
||||
height: auto; /* CMH: needed to add this manually */
|
||||
border-radius: 8px; }
|
||||
.photo-container .photo-item {
|
||||
padding: 2px;
|
||||
width: 50%; }
|
||||
@media (max-width: 683px) {
|
||||
.photo-container .photo-item {
|
||||
width: 100%; } }
|
||||
|
||||
|
||||
@ -1,160 +0,0 @@
|
||||
/*
|
||||
Put this file in /static/css/hugo-easy-gallery.css
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Grid Layout Styles
|
||||
*/
|
||||
.gallery {
|
||||
overflow: hidden;
|
||||
margin: 10px;
|
||||
max-width: 768px;
|
||||
}
|
||||
.gallery .box {
|
||||
float: left;
|
||||
position: relative;
|
||||
/* Default: 1 tile wide */
|
||||
width: 100%;
|
||||
padding-bottom: 100%;
|
||||
}
|
||||
@media only screen and (min-width : 365px) {
|
||||
/* Tablet view: 2 tiles */
|
||||
.gallery .box {
|
||||
width: 50%;
|
||||
padding-bottom: 50%;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width : 480px) {
|
||||
/* Small desktop / ipad view: 3 tiles */
|
||||
.gallery .box {
|
||||
width: 33.3%;
|
||||
padding-bottom: 33.3%; /* */
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width : 9999px) {
|
||||
/* Medium desktop: 4 tiles */
|
||||
.box {
|
||||
width: 25%;
|
||||
padding-bottom: 25%;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Transition styles
|
||||
*/
|
||||
.gallery.hover-transition figure,
|
||||
.gallery.hover-effect-zoom .img,
|
||||
.gallery:not(.caption-effect-appear) figcaption,
|
||||
.fancy-figure:not(.caption-effect-appear) figcaption {
|
||||
-webkit-transition: all 0.3s ease-in-out;
|
||||
-moz-transition: all 0.3s ease-in-out;
|
||||
-o-transition: all 0.3s ease-in-out;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
/*
|
||||
figure styles
|
||||
*/
|
||||
figure {
|
||||
position:relative; /* purely to allow absolution positioning of figcaption */
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
}
|
||||
.gallery figure {
|
||||
position: absolute;
|
||||
left: 5px;
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
bottom: 5px;
|
||||
}
|
||||
.gallery.hover-effect-grow figure:hover {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
.gallery.hover-effect-shrink figure:hover {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
.gallery.hover-effect-slidedown figure:hover {
|
||||
transform: translateY(5px);
|
||||
}
|
||||
.gallery.hover-effect-slideup figure:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
/*
|
||||
img / a styles
|
||||
*/
|
||||
|
||||
.gallery .img {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background-size: cover;
|
||||
background-position: 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.gallery.hover-effect-zoom figure:hover .img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
.gallery img {
|
||||
display: none; /* only show the img if not inside a gallery */
|
||||
}
|
||||
figure a {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
figcaption styles
|
||||
*/
|
||||
.gallery figcaption,
|
||||
.fancy-figure figcaption {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #000;
|
||||
color: #FFF;
|
||||
text-align: center;
|
||||
font-size: 75%; /* change this if you want bigger text */
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
}
|
||||
.gallery.caption-position-none figcaption,
|
||||
.fancy-figure.caption-position-none figcaption {
|
||||
display: none;
|
||||
}
|
||||
.gallery.caption-position-center figcaption,
|
||||
.fancy-figure.caption-position-center figcaption {
|
||||
top: 0;
|
||||
padding: 40% 5px;
|
||||
}
|
||||
.gallery.caption-position-bottom figcaption,
|
||||
.fancy-figure.caption-position-bottom figcaption {
|
||||
padding: 5px;
|
||||
}
|
||||
.gallery.caption-effect-fade figure:not(:hover) figcaption,
|
||||
.gallery.caption-effect-appear figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-fade figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-appear figure:not(:hover) figcaption {
|
||||
background: rgba(0, 0, 0, 0);
|
||||
opacity: 0;
|
||||
}
|
||||
.gallery.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-slide.caption-position-bottom figure:not(:hover) figcaption {
|
||||
margin-bottom: -100%;
|
||||
}
|
||||
.gallery.caption-effect-slide.caption-position-center figure:not(:hover) figcaption,
|
||||
.fancy-figure.caption-effect-slide.caption-position-center figure:not(:hover) figcaption {
|
||||
top: 100%;
|
||||
}
|
||||
figcaption p {
|
||||
margin: auto; /* override style in theme */
|
||||
}
|
||||
|
||||
54
static/fonts/lg.svg
Normal file
54
static/fonts/lg.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
<json>
|
||||
<![CDATA[
|
||||
{
|
||||
"fontFamily": "lg",
|
||||
"majorVersion": 2,
|
||||
"minorVersion": 0,
|
||||
"fontURL": "",
|
||||
"copyright": "",
|
||||
"license": "",
|
||||
"licenseURL": "",
|
||||
"description": "Font generated by IcoMoon.",
|
||||
"version": "Version 2.0",
|
||||
"fontId": "lg",
|
||||
"psName": "lg",
|
||||
"subFamily": "Regular",
|
||||
"fullName": "lg"
|
||||
}
|
||||
]]>
|
||||
</json>
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="lg" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" glyph-name="pause_circle_outline" data-tags="pause_circle_outline" d="M554 256.667v340h86v-340h-86zM512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM384 256.667v340h86v-340h-86z" />
|
||||
<glyph unicode="" glyph-name="play_circle_outline" data-tags="play_circle_outline" d="M512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM426 234.667v384l256-192z" />
|
||||
<glyph unicode="" glyph-name="stack-2" data-tags="stack-2" d="M384 853.334h426.667q53 0 90.5-37.5t37.5-90.5v-426.667q0-53-37.5-90.5t-90.5-37.5h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 53 37.5 90.5t90.5 37.5zM170.667 675.334v-547.333q0-17.667 12.5-30.167t30.167-12.5h547.333q-13.333-37.667-46.333-61.5t-74.333-23.833h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 41.333 23.833 74.333t61.5 46.333zM810.667 768h-426.667q-17.667 0-30.167-12.5t-12.5-30.167v-426.667q0-17.667 12.5-30.167t30.167-12.5h426.667q17.667 0 30.167 12.5t12.5 30.167v426.667q0 17.667-12.5 30.167t-30.167 12.5z" />
|
||||
<glyph unicode="" glyph-name="clear" data-tags="clear" d="M810 664.667l-238-238 238-238-60-60-238 238-238-238-60 60 238 238-238 238 60 60 238-238 238 238z" />
|
||||
<glyph unicode="" glyph-name="arrow-left" data-tags="arrow-left" d="M426.667 768q17.667 0 30.167-12.5t12.5-30.167q0-18-12.667-30.333l-225.667-225.667h665q17.667 0 30.167-12.5t12.5-30.167-12.5-30.167-30.167-12.5h-665l225.667-225.667q12.667-12.333 12.667-30.333 0-17.667-12.5-30.167t-30.167-12.5q-18 0-30.333 12.333l-298.667 298.667q-12.333 13-12.333 30.333t12.333 30.333l298.667 298.667q12.667 12.333 30.333 12.333z" />
|
||||
<glyph unicode="" glyph-name="arrow-right" data-tags="arrow-right" d="M597.333 768q18 0 30.333-12.333l298.667-298.667q12.333-12.333 12.333-30.333t-12.333-30.333l-298.667-298.667q-12.333-12.333-30.333-12.333-18.333 0-30.5 12.167t-12.167 30.5q0 18 12.333 30.333l226 225.667h-665q-17.667 0-30.167 12.5t-12.5 30.167 12.5 30.167 30.167 12.5h665l-226 225.667q-12.333 12.333-12.333 30.333 0 18.333 12.167 30.5t30.5 12.167z" />
|
||||
<glyph unicode="" glyph-name="vertical_align_bottom" data-tags="vertical_align_bottom" d="M170 128.667h684v-86h-684v86zM682 384.667l-170-172-170 172h128v426h84v-426h128z" />
|
||||
<glyph unicode="" glyph-name="apps" data-tags="apps" d="M682 84.667v172h172v-172h-172zM682 340.667v172h172v-172h-172zM426 596.667v172h172v-172h-172zM682 768.667h172v-172h-172v172zM426 340.667v172h172v-172h-172zM170 340.667v172h172v-172h-172zM170 84.667v172h172v-172h-172zM426 84.667v172h172v-172h-172zM170 596.667v172h172v-172h-172z" />
|
||||
<glyph unicode="" glyph-name="fullscreen" data-tags="fullscreen" d="M598 724.667h212v-212h-84v128h-128v84zM726 212.667v128h84v-212h-212v84h128zM214 512.667v212h212v-84h-128v-128h-84zM298 340.667v-128h128v-84h-212v212h84z" />
|
||||
<glyph unicode="" glyph-name="fullscreen_exit" data-tags="fullscreen_exit" d="M682 596.667h128v-84h-212v212h84v-128zM598 128.667v212h212v-84h-128v-128h-84zM342 596.667v128h84v-212h-212v84h128zM214 256.667v84h212v-212h-84v128h-128z" />
|
||||
<glyph unicode="" glyph-name="zoom_in" data-tags="zoom_in" d="M512 512.667h-86v-86h-42v86h-86v42h86v86h42v-86h86v-42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
<glyph unicode="" glyph-name="zoom_out" data-tags="zoom_out" d="M298 554.667h214v-42h-214v42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
<glyph unicode="" glyph-name="share" data-tags="share" d="M768 252.667c68 0 124-56 124-124s-56-126-124-126-124 58-124 126c0 10 0 20 2 28l-302 176c-24-22-54-34-88-34-70 0-128 58-128 128s58 128 128 128c34 0 64-12 88-34l300 174c-2 10-4 20-4 30 0 70 58 128 128 128s128-58 128-128-58-128-128-128c-34 0-64 14-88 36l-300-176c2-10 4-20 4-30s-2-20-4-30l304-176c22 20 52 32 84 32z" />
|
||||
<glyph unicode="" glyph-name="rotate_left" data-tags="rotate_left" d="M554 764.667q126-16 213-112t87-226-87-226-213-112v86q92 16 153 87t61 165-61 165-153 87v-166l-194 190 194 194v-132zM302 156.667l62 62q46-34 106-44v-86q-96 12-168 68zM260 384.667q10-58 42-106l-60-60q-56 74-68 166h86zM304 574.667q-36-52-44-106h-86q12 90 70 166z" />
|
||||
<glyph unicode="" glyph-name="rotate_right" data-tags="rotate_right" d="M720 278.667q34 46 44 106h86q-12-92-68-166zM554 174.667q60 10 106 44l62-62q-72-56-168-68v86zM850 468.667h-86q-10 60-44 106l62 60q58-72 68-166zM664 702.667l-194-190v166q-92-16-153-87t-61-165 61-165 153-87v-86q-126 16-213 112t-87 226 87 226 213 112v132z" />
|
||||
<glyph unicode="" glyph-name="swap_horiz" data-tags="swap_horiz" d="M896 554.667l-170-170v128h-300v84h300v128zM298 468.667v-128h300v-84h-300v-128l-170 170z" />
|
||||
<glyph unicode="" glyph-name="swap_vert" data-tags="swap_vert" d="M384 810.667l170-170h-128v-300h-84v300h-128zM682 212.667h128l-170-170-170 170h128v300h84v-300z" />
|
||||
<glyph unicode="" glyph-name="facebook-with-circle" data-tags="facebook-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM628.429 612.659h-73.882c-8.755 0-18.483-11.52-18.483-26.829v-53.35h92.416l-13.978-76.083h-78.438v-228.403h-87.194v228.403h-79.104v76.083h79.104v44.749c0 64.205 44.544 116.378 105.677 116.378h73.882v-80.947z" />
|
||||
<glyph unicode="" glyph-name="google-with-circle" data-tags="google+-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM483.686 249.805c-30.874-15.002-64.102-16.589-76.954-16.589-2.458 0-3.84 0-3.84 0s-1.178 0-2.765 0c-20.070 0-119.962 4.608-119.962 95.59 0 89.395 108.8 96.41 142.131 96.41h0.87c-19.251 25.702-15.258 51.61-15.258 51.61-1.69-0.102-4.147-0.205-7.168-0.205-12.544 0-36.762 1.997-57.549 15.411-25.498 16.384-38.4 44.288-38.4 82.893 0 109.107 119.142 113.51 120.32 113.613h118.989v-2.611c0-13.312-23.91-15.923-40.192-18.125-5.53-0.819-16.64-1.894-19.763-3.482 30.157-16.128 35.021-41.421 35.021-79.104 0-42.906-16.794-65.587-34.611-81.51-11.059-9.882-19.712-17.613-19.712-28.006 0-10.189 11.878-20.582 25.702-32.717 22.579-19.917 53.555-47.002 53.555-92.723 0-47.258-20.326-81.050-60.416-100.454zM742.4 460.8h-76.8v-76.8h-51.2v76.8h-76.8v51.2h76.8v76.8h51.2v-76.8h76.8v-51.2zM421.018 401.92c-2.662 0-5.325-0.102-8.038-0.307-22.733-1.69-43.725-10.189-58.88-24.013-15.053-13.619-22.733-30.822-21.658-48.179 2.304-36.403 41.37-57.702 88.832-54.323 46.694 3.379 77.824 30.31 75.571 66.714-2.15 34.202-31.898 60.109-75.827 60.109zM465.766 599.808c-12.39 43.52-32.358 56.422-63.386 56.422-3.328 0-6.707-0.512-9.933-1.382-13.466-3.84-24.166-15.053-30.106-31.744-6.093-16.896-6.451-34.509-1.229-54.579 9.472-35.891 34.97-61.901 60.672-61.901 3.379 0 6.758 0.41 9.933 1.382 28.109 7.885 45.722 50.79 34.048 91.802z" />
|
||||
<glyph unicode="" glyph-name="pinterest-with-circle" data-tags="pinterest-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM545.638 344.32c-31.539 2.406-44.749 18.022-69.427 32.973-13.568-71.219-30.157-139.52-79.309-175.206-15.206 107.725 22.221 188.518 39.629 274.381-29.645 49.92 3.533 150.323 66.099 125.645 76.954-30.515-66.662-185.6 29.747-205.005 100.659-20.173 141.773 174.694 79.36 237.978-90.214 91.494-262.502 2.099-241.306-128.87 5.12-32 38.246-41.728 13.21-85.914-57.702 12.8-74.957 58.317-72.704 118.989 3.533 99.328 89.242 168.909 175.155 178.483 108.698 12.083 210.688-39.885 224.819-142.182 15.821-115.405-49.101-240.282-165.274-231.27z" />
|
||||
<glyph unicode="" glyph-name="twitter-with-circle" data-tags="twitter-with-circle" d="M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM711.936 549.683c0.205-4.198 0.256-8.397 0.256-12.493 0-128-97.331-275.507-275.405-275.507-54.682 0-105.574 15.974-148.378 43.52 7.526-0.922 15.258-1.28 23.091-1.28 45.363 0 87.091 15.411 120.218 41.421-42.342 0.819-78.080 28.774-90.419 67.174 5.888-1.075 11.93-1.69 18.176-1.69 8.806 0 17.408 1.178 25.498 3.379-44.288 8.909-77.67 48.026-77.67 94.925v1.178c13.056-7.219 28.006-11.622 43.878-12.134-26.010 17.408-43.059 47.002-43.059 80.64 0 17.715 4.762 34.406 13.107 48.691 47.77-58.573 119.040-97.075 199.526-101.222-1.69 7.117-2.509 14.49-2.509 22.118 0 53.402 43.315 96.819 96.819 96.819 27.802 0 52.992-11.776 70.656-30.618 22.067 4.403 42.752 12.39 61.44 23.501-7.219-22.579-22.528-41.574-42.547-53.606 19.61 2.406 38.246 7.578 55.603 15.309-12.954-19.405-29.389-36.506-48.282-50.125z" />
|
||||
<glyph unicode="" glyph-name="message-circle" data-tags="message-circle" d="M938.667 448.128v21.205c0 0.725-0.043 1.621-0.085 2.475-5.803 99.755-47.488 190.336-112.725 258.176-68.352 71.125-162.731 117.419-268.843 123.264-0.683 0.043-1.536 0.085-2.347 0.085h-20.864c-59.947 0.683-122.965-13.227-181.931-43.008-52.181-26.496-97.749-63.488-133.931-108.16-56.405-69.717-89.899-158.080-89.941-253.696-0.597-54.4 10.795-111.36 35.157-165.419l-75.605-226.859c-2.816-8.363-3.072-17.835 0-26.965 7.467-22.357 31.616-34.432 53.973-26.965l226.731 75.563c49.493-22.485 105.984-35.243 165.376-35.115 58.539 0.384 115.797 13.141 168.149 36.949 81.579 37.163 151.040 101.248 193.749 186.667 27.477 53.291 43.307 115.84 43.136 181.803zM853.333 447.872c0.128-52.267-12.459-101.333-33.664-142.464-34.176-68.352-88.832-118.827-153.259-148.139-41.387-18.859-86.827-28.971-133.376-29.269-52.096-0.128-101.163 12.459-142.293 33.664-10.624 5.504-22.528 6.059-33.067 2.56l-162.261-54.101 54.101 162.261c3.755 11.221 2.56 22.912-2.389 32.725-23.552 46.677-34.304 96.171-33.792 142.421 0.043 76.331 26.411 145.92 70.955 200.917 28.629 35.371 64.768 64.725 106.24 85.76 46.592 23.552 96.085 34.304 142.336 33.792h19.456c83.712-4.565 158.037-41.003 212.011-97.152 51.285-53.376 84.139-124.416 89.003-202.795z" />
|
||||
<glyph unicode="" glyph-name="maximize-2" data-tags="maximize-2" d="M793.003 768l-225.835-225.835c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0l225.835 225.835v-153.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v256c0 5.803-1.152 11.307-3.243 16.341s-5.163 9.728-9.216 13.781c-0.043 0.043-0.043 0.043-0.085 0.085-3.925 3.925-8.619 7.083-13.781 9.216-5.035 2.091-10.539 3.243-16.341 3.243h-256c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667zM230.997 85.334l225.835 225.835c16.683 16.683 16.683 43.691 0 60.331s-43.691 16.683-60.331 0l-225.835-225.835v153.003c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-256c0-23.552 19.115-42.667 42.667-42.667h256c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667z" />
|
||||
<glyph unicode="" glyph-name="minimize-2" data-tags="minimize-2" d="M700.331 554.667l225.835 225.835c16.683 16.683 16.683 43.691 0 60.331s-43.691 16.683-60.331 0l-225.835-225.835v153.003c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-256c0-5.803 1.152-11.307 3.243-16.341s5.163-9.728 9.216-13.781c0.043-0.043 0.043-0.043 0.085-0.085 3.925-3.925 8.619-7.083 13.781-9.216 5.035-2.091 10.539-3.243 16.341-3.243h256c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667zM158.165 12.502l225.835 225.835v-153.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v256c0 5.803-1.152 11.307-3.243 16.341s-5.163 9.728-9.216 13.781c-0.043 0.043-0.043 0.043-0.085 0.085-4.096 4.053-8.789 7.125-13.781 9.216-5.035 2.091-10.539 3.243-16.341 3.243h-256c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h153.003l-225.835-225.835c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
BIN
static/fonts/lg.ttf
Normal file
BIN
static/fonts/lg.ttf
Normal file
Binary file not shown.
BIN
static/fonts/lg.woff
Normal file
BIN
static/fonts/lg.woff
Normal file
Binary file not shown.
BIN
static/fonts/lg.woff2
Normal file
BIN
static/fonts/lg.woff2
Normal file
Binary file not shown.
@ -1,80 +0,0 @@
|
||||
/*
|
||||
Put this file in /static/js/load-photoswipe.js
|
||||
Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/
|
||||
*/
|
||||
|
||||
/* Show an alert if this js file has been loaded twice */
|
||||
if (window.loadphotoswipejs) {
|
||||
window.alert("You've loaded load-photoswipe.js twice. See https://github.com/liwenyip/hugo-easy-gallery/issues/6")
|
||||
}
|
||||
var loadphotoswipejs = 1
|
||||
|
||||
/* TODO: Make the share function work */
|
||||
$( document ).ready(function() {
|
||||
/*
|
||||
Initialise Photoswipe
|
||||
*/
|
||||
var items = []; // array of slide objects that will be passed to PhotoSwipe()
|
||||
// for every figure element on the page:
|
||||
$('figure').each( function() {
|
||||
if ($(this).attr('class') == 'no-photoswipe') return true; // ignore any figures where class="no-photoswipe"
|
||||
// get properties from child a/img/figcaption elements,
|
||||
var $figure = $(this),
|
||||
$a = $figure.find('a'),
|
||||
$img = $figure.find('img'),
|
||||
$src = $a.attr('href'),
|
||||
$title = $img.attr('alt'),
|
||||
$msrc = $img.attr('src');
|
||||
// if data-size on <a> tag is set, read it and create an item
|
||||
if ($a.data('size')) {
|
||||
var $size = $a.data('size').split('x');
|
||||
var item = {
|
||||
src : $src,
|
||||
w : $size[0],
|
||||
h : $size[1],
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
console.log("Using pre-defined dimensions for " + $src);
|
||||
// if not, set temp default size then load the image to check actual size
|
||||
} else {
|
||||
var item = {
|
||||
src : $src,
|
||||
w : 800, // temp default size
|
||||
h : 600, // temp default size
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
console.log("Using default dimensions for " + $src);
|
||||
// load the image to check its dimensions
|
||||
// update the item as soon as w and h are known (check every 30ms)
|
||||
var img = new Image();
|
||||
img.src = $src;
|
||||
var wait = setInterval(function() {
|
||||
var w = img.naturalWidth,
|
||||
h = img.naturalHeight;
|
||||
if (w && h) {
|
||||
clearInterval(wait);
|
||||
item.w = w;
|
||||
item.h = h;
|
||||
console.log("Got actual dimensions for " + img.src);
|
||||
}
|
||||
}, 30);
|
||||
}
|
||||
// Save the index of this image then add it to the array
|
||||
var index = items.length;
|
||||
items.push(item);
|
||||
// Event handler for click on a figure
|
||||
$figure.on('click', function(event) {
|
||||
event.preventDefault(); // prevent the normal behaviour i.e. load the <a> hyperlink
|
||||
// Get the PSWP element and initialise it with the desired options
|
||||
var $pswp = $('.pswp')[0];
|
||||
var options = {
|
||||
index: index,
|
||||
bgOpacity: 0.8,
|
||||
showHideOpacity: true
|
||||
}
|
||||
new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options).init();
|
||||
});
|
||||
});
|
||||
});
|
||||
9
util.el
9
util.el
@ -67,3 +67,12 @@
|
||||
(write-file "./log.md"))
|
||||
;; TODO: use command-line-args so that I can pass in the filename
|
||||
;; instead of hard-code it
|
||||
|
||||
(defun export-all-run ()
|
||||
(let* ((fname "/mnt/share/syncthing/notes/log_pub.org"))
|
||||
(princ (format "Open %s...\n" fname))
|
||||
(find-file fname)
|
||||
(princ "Export with ox-hugo...\n")
|
||||
(org-hugo-export-wim-to-md :all-subtrees)))
|
||||
;; TODO: use command-line-args so that I can pass in the filename
|
||||
;; instead of hard-code it
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user