Disabled external gits

This commit is contained in:
2022-04-07 18:46:57 +02:00
parent 88cb3426ad
commit 15e7120d6d
5316 changed files with 4563444 additions and 6 deletions

View File

@@ -0,0 +1,862 @@
/*
Icon Font: entypo
*/
@font-face {
font-family: "entypo";
src: url("./entypo.eot");
src: url("./entypo.eot?#iefix") format("embedded-opentype"),
url("./entypo.woff2") format("woff2"),
url("./entypo.woff") format("woff"),
url("./entypo.ttf") format("truetype"),
url("./entypo.svg#entypo") format("svg");
font-weight: normal;
font-style: normal;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: "entypo";
src: url("./entypo.svg#entypo") format("svg");
}
}
[data-icon]:before { content: attr(data-icon); }
[data-icon]:before,
.entypo-icon-500px:before,
.entypo-icon-500px-with-circle:before,
.entypo-icon-add-to-list:before,
.entypo-icon-add-user:before,
.entypo-icon-address:before,
.entypo-icon-adjust:before,
.entypo-icon-air:before,
.entypo-icon-aircraft:before,
.entypo-icon-aircraft-landing:before,
.entypo-icon-aircraft-take-off:before,
.entypo-icon-align-bottom:before,
.entypo-icon-align-horizontal-middle:before,
.entypo-icon-align-left:before,
.entypo-icon-align-right:before,
.entypo-icon-align-top:before,
.entypo-icon-align-vertical-middle:before,
.entypo-icon-app-store:before,
.entypo-icon-archive:before,
.entypo-icon-area-graph:before,
.entypo-icon-arrow-bold-down:before,
.entypo-icon-arrow-bold-left:before,
.entypo-icon-arrow-bold-right:before,
.entypo-icon-arrow-bold-up:before,
.entypo-icon-arrow-down:before,
.entypo-icon-arrow-left:before,
.entypo-icon-arrow-long-down:before,
.entypo-icon-arrow-long-left:before,
.entypo-icon-arrow-long-right:before,
.entypo-icon-arrow-long-up:before,
.entypo-icon-arrow-right:before,
.entypo-icon-arrow-up:before,
.entypo-icon-arrow-with-circle-down:before,
.entypo-icon-arrow-with-circle-left:before,
.entypo-icon-arrow-with-circle-right:before,
.entypo-icon-arrow-with-circle-up:before,
.entypo-icon-attachment:before,
.entypo-icon-awareness-ribbon:before,
.entypo-icon-back:before,
.entypo-icon-back-in-time:before,
.entypo-icon-baidu:before,
.entypo-icon-bar-graph:before,
.entypo-icon-basecamp:before,
.entypo-icon-battery:before,
.entypo-icon-beamed-note:before,
.entypo-icon-behance:before,
.entypo-icon-bell:before,
.entypo-icon-blackboard:before,
.entypo-icon-block:before,
.entypo-icon-book:before,
.entypo-icon-bookmark:before,
.entypo-icon-bookmarks:before,
.entypo-icon-bowl:before,
.entypo-icon-box:before,
.entypo-icon-briefcase:before,
.entypo-icon-browser:before,
.entypo-icon-brush:before,
.entypo-icon-bucket:before,
.entypo-icon-bug:before,
.entypo-icon-cake:before,
.entypo-icon-calculator:before,
.entypo-icon-calendar:before,
.entypo-icon-camera:before,
.entypo-icon-ccw:before,
.entypo-icon-chat:before,
.entypo-icon-check:before,
.entypo-icon-chevron-down:before,
.entypo-icon-chevron-left:before,
.entypo-icon-chevron-right:before,
.entypo-icon-chevron-small-down:before,
.entypo-icon-chevron-small-left:before,
.entypo-icon-chevron-small-right:before,
.entypo-icon-chevron-small-up:before,
.entypo-icon-chevron-thin-down:before,
.entypo-icon-chevron-thin-left:before,
.entypo-icon-chevron-thin-right:before,
.entypo-icon-chevron-thin-up:before,
.entypo-icon-chevron-up:before,
.entypo-icon-chevron-with-circle-down:before,
.entypo-icon-chevron-with-circle-left:before,
.entypo-icon-chevron-with-circle-right:before,
.entypo-icon-chevron-with-circle-up:before,
.entypo-icon-circle:before,
.entypo-icon-circle-with-cross:before,
.entypo-icon-circle-with-minus:before,
.entypo-icon-circle-with-plus:before,
.entypo-icon-circular-graph:before,
.entypo-icon-clapperboard:before,
.entypo-icon-classic-computer:before,
.entypo-icon-clipboard:before,
.entypo-icon-clock:before,
.entypo-icon-cloud:before,
.entypo-icon-code:before,
.entypo-icon-cog:before,
.entypo-icon-colours:before,
.entypo-icon-compass:before,
.entypo-icon-controller-fast-backward:before,
.entypo-icon-controller-fast-forward:before,
.entypo-icon-controller-jump-to-start:before,
.entypo-icon-controller-next:before,
.entypo-icon-controller-paus:before,
.entypo-icon-controller-play:before,
.entypo-icon-controller-record:before,
.entypo-icon-controller-stop:before,
.entypo-icon-controller-volume:before,
.entypo-icon-copy:before,
.entypo-icon-creative-cloud:before,
.entypo-icon-creative-commons:before,
.entypo-icon-creative-commons-attribution:before,
.entypo-icon-creative-commons-noderivs:before,
.entypo-icon-creative-commons-noncommercial-eu:before,
.entypo-icon-creative-commons-noncommercial-us:before,
.entypo-icon-creative-commons-public-domain:before,
.entypo-icon-creative-commons-remix:before,
.entypo-icon-creative-commons-share:before,
.entypo-icon-creative-commons-sharealike:before,
.entypo-icon-credit:before,
.entypo-icon-credit-card:before,
.entypo-icon-crop:before,
.entypo-icon-cross:before,
.entypo-icon-cup:before,
.entypo-icon-cw:before,
.entypo-icon-cycle:before,
.entypo-icon-database:before,
.entypo-icon-dial-pad:before,
.entypo-icon-direction:before,
.entypo-icon-document:before,
.entypo-icon-document-landscape:before,
.entypo-icon-documents:before,
.entypo-icon-dot-single:before,
.entypo-icon-dots-three-horizontal:before,
.entypo-icon-dots-three-vertical:before,
.entypo-icon-dots-two-horizontal:before,
.entypo-icon-dots-two-vertical:before,
.entypo-icon-download:before,
.entypo-icon-dribbble:before,
.entypo-icon-dribbble-with-circle:before,
.entypo-icon-drink:before,
.entypo-icon-drive:before,
.entypo-icon-drop:before,
.entypo-icon-dropbox:before,
.entypo-icon-edit:before,
.entypo-icon-email:before,
.entypo-icon-emoji-flirt:before,
.entypo-icon-emoji-happy:before,
.entypo-icon-emoji-neutral:before,
.entypo-icon-emoji-sad:before,
.entypo-icon-erase:before,
.entypo-icon-eraser:before,
.entypo-icon-evernote:before,
.entypo-icon-export:before,
.entypo-icon-eye:before,
.entypo-icon-eye-with-line:before,
.entypo-icon-facebook:before,
.entypo-icon-facebook-with-circle:before,
.entypo-icon-feather:before,
.entypo-icon-fingerprint:before,
.entypo-icon-flag:before,
.entypo-icon-flash:before,
.entypo-icon-flashlight:before,
.entypo-icon-flat-brush:before,
.entypo-icon-flattr:before,
.entypo-icon-flickr:before,
.entypo-icon-flickr-with-circle:before,
.entypo-icon-flow-branch:before,
.entypo-icon-flow-cascade:before,
.entypo-icon-flow-line:before,
.entypo-icon-flow-parallel:before,
.entypo-icon-flow-tree:before,
.entypo-icon-flower:before,
.entypo-icon-folder:before,
.entypo-icon-folder-images:before,
.entypo-icon-folder-music:before,
.entypo-icon-folder-video:before,
.entypo-icon-forward:before,
.entypo-icon-foursquare:before,
.entypo-icon-funnel:before,
.entypo-icon-game-controller:before,
.entypo-icon-gauge:before,
.entypo-icon-github:before,
.entypo-icon-github-with-circle:before,
.entypo-icon-globe:before,
.entypo-icon-google-drive:before,
.entypo-icon-google-hangouts:before,
.entypo-icon-google-play:before,
.entypo-icon-google-plus:before,
.entypo-icon-google-plus-with-circle:before,
.entypo-icon-graduation-cap:before,
.entypo-icon-grid:before,
.entypo-icon-grooveshark:before,
.entypo-icon-hair-cross:before,
.entypo-icon-hand:before,
.entypo-icon-heart:before,
.entypo-icon-heart-outlined:before,
.entypo-icon-help:before,
.entypo-icon-help-with-circle:before,
.entypo-icon-home:before,
.entypo-icon-hour-glass:before,
.entypo-icon-houzz:before,
.entypo-icon-icloud:before,
.entypo-icon-image:before,
.entypo-icon-image-inverted:before,
.entypo-icon-images:before,
.entypo-icon-inbox:before,
.entypo-icon-infinity:before,
.entypo-icon-info:before,
.entypo-icon-info-with-circle:before,
.entypo-icon-instagram:before,
.entypo-icon-instagram-with-circle:before,
.entypo-icon-install:before,
.entypo-icon-key:before,
.entypo-icon-keyboard:before,
.entypo-icon-lab-flask:before,
.entypo-icon-landline:before,
.entypo-icon-language:before,
.entypo-icon-laptop:before,
.entypo-icon-lastfm:before,
.entypo-icon-lastfm-with-circle:before,
.entypo-icon-layers:before,
.entypo-icon-leaf:before,
.entypo-icon-level-down:before,
.entypo-icon-level-up:before,
.entypo-icon-lifebuoy:before,
.entypo-icon-light-bulb:before,
.entypo-icon-light-down:before,
.entypo-icon-light-up:before,
.entypo-icon-line-graph:before,
.entypo-icon-link:before,
.entypo-icon-linkedin:before,
.entypo-icon-linkedin-with-circle:before,
.entypo-icon-list:before,
.entypo-icon-location:before,
.entypo-icon-location-pin:before,
.entypo-icon-lock:before,
.entypo-icon-lock-open:before,
.entypo-icon-log-out:before,
.entypo-icon-login:before,
.entypo-icon-loop:before,
.entypo-icon-magnet:before,
.entypo-icon-magnifying-glass:before,
.entypo-icon-mail:before,
.entypo-icon-mail-with-circle:before,
.entypo-icon-man:before,
.entypo-icon-map:before,
.entypo-icon-mask:before,
.entypo-icon-medal:before,
.entypo-icon-medium:before,
.entypo-icon-medium-with-circle:before,
.entypo-icon-megaphone:before,
.entypo-icon-menu:before,
.entypo-icon-merge:before,
.entypo-icon-message:before,
.entypo-icon-mic:before,
.entypo-icon-minus:before,
.entypo-icon-mixi:before,
.entypo-icon-mobile:before,
.entypo-icon-modern-mic:before,
.entypo-icon-moon:before,
.entypo-icon-mouse:before,
.entypo-icon-mouse-pointer:before,
.entypo-icon-music:before,
.entypo-icon-network:before,
.entypo-icon-new:before,
.entypo-icon-new-message:before,
.entypo-icon-news:before,
.entypo-icon-newsletter:before,
.entypo-icon-note:before,
.entypo-icon-notification:before,
.entypo-icon-notifications-off:before,
.entypo-icon-old-mobile:before,
.entypo-icon-old-phone:before,
.entypo-icon-onedrive:before,
.entypo-icon-open-book:before,
.entypo-icon-palette:before,
.entypo-icon-paper-plane:before,
.entypo-icon-paypal:before,
.entypo-icon-pencil:before,
.entypo-icon-phone:before,
.entypo-icon-picasa:before,
.entypo-icon-pie-chart:before,
.entypo-icon-pin:before,
.entypo-icon-pinterest:before,
.entypo-icon-pinterest-with-circle:before,
.entypo-icon-plus:before,
.entypo-icon-popup:before,
.entypo-icon-power-plug:before,
.entypo-icon-price-ribbon:before,
.entypo-icon-price-tag:before,
.entypo-icon-print:before,
.entypo-icon-progress-empty:before,
.entypo-icon-progress-full:before,
.entypo-icon-progress-one:before,
.entypo-icon-progress-two:before,
.entypo-icon-publish:before,
.entypo-icon-qq:before,
.entypo-icon-qq-with-circle:before,
.entypo-icon-quote:before,
.entypo-icon-radio:before,
.entypo-icon-raft:before,
.entypo-icon-raft-with-circle:before,
.entypo-icon-rainbow:before,
.entypo-icon-rdio:before,
.entypo-icon-rdio-with-circle:before,
.entypo-icon-remove-user:before,
.entypo-icon-renren:before,
.entypo-icon-reply:before,
.entypo-icon-reply-all:before,
.entypo-icon-resize-100-percent:before,
.entypo-icon-resize-full-screen:before,
.entypo-icon-retweet:before,
.entypo-icon-rocket:before,
.entypo-icon-round-brush:before,
.entypo-icon-rss:before,
.entypo-icon-ruler:before,
.entypo-icon-save:before,
.entypo-icon-scissors:before,
.entypo-icon-scribd:before,
.entypo-icon-select-arrows:before,
.entypo-icon-share:before,
.entypo-icon-share-alternative:before,
.entypo-icon-shareable:before,
.entypo-icon-shield:before,
.entypo-icon-shop:before,
.entypo-icon-shopping-bag:before,
.entypo-icon-shopping-basket:before,
.entypo-icon-shopping-cart:before,
.entypo-icon-shuffle:before,
.entypo-icon-signal:before,
.entypo-icon-sina-weibo:before,
.entypo-icon-skype:before,
.entypo-icon-skype-with-circle:before,
.entypo-icon-slideshare:before,
.entypo-icon-smashing:before,
.entypo-icon-sound:before,
.entypo-icon-sound-mix:before,
.entypo-icon-sound-mute:before,
.entypo-icon-soundcloud:before,
.entypo-icon-sports-club:before,
.entypo-icon-spotify:before,
.entypo-icon-spotify-with-circle:before,
.entypo-icon-spreadsheet:before,
.entypo-icon-squared-cross:before,
.entypo-icon-squared-minus:before,
.entypo-icon-squared-plus:before,
.entypo-icon-star:before,
.entypo-icon-star-outlined:before,
.entypo-icon-stopwatch:before,
.entypo-icon-stumbleupon:before,
.entypo-icon-stumbleupon-with-circle:before,
.entypo-icon-suitcase:before,
.entypo-icon-swap:before,
.entypo-icon-swarm:before,
.entypo-icon-sweden:before,
.entypo-icon-switch:before,
.entypo-icon-tablet:before,
.entypo-icon-tablet-mobile-combo:before,
.entypo-icon-tag:before,
.entypo-icon-text:before,
.entypo-icon-text-document:before,
.entypo-icon-text-document-inverted:before,
.entypo-icon-thermometer:before,
.entypo-icon-thumbs-down:before,
.entypo-icon-thumbs-up:before,
.entypo-icon-thunder-cloud:before,
.entypo-icon-ticket:before,
.entypo-icon-time-slot:before,
.entypo-icon-tools:before,
.entypo-icon-traffic-cone:before,
.entypo-icon-trash:before,
.entypo-icon-tree:before,
.entypo-icon-triangle-down:before,
.entypo-icon-triangle-left:before,
.entypo-icon-triangle-right:before,
.entypo-icon-triangle-up:before,
.entypo-icon-tripadvisor:before,
.entypo-icon-trophy:before,
.entypo-icon-tumblr:before,
.entypo-icon-tumblr-with-circle:before,
.entypo-icon-tv:before,
.entypo-icon-twitter:before,
.entypo-icon-twitter-with-circle:before,
.entypo-icon-typing:before,
.entypo-icon-uninstall:before,
.entypo-icon-unread:before,
.entypo-icon-untag:before,
.entypo-icon-upload:before,
.entypo-icon-upload-to-cloud:before,
.entypo-icon-user:before,
.entypo-icon-users:before,
.entypo-icon-v-card:before,
.entypo-icon-video:before,
.entypo-icon-video-camera:before,
.entypo-icon-vimeo:before,
.entypo-icon-vimeo-with-circle:before,
.entypo-icon-vine:before,
.entypo-icon-vine-with-circle:before,
.entypo-icon-vinyl:before,
.entypo-icon-vk:before,
.entypo-icon-vk-alternitive:before,
.entypo-icon-vk-with-circle:before,
.entypo-icon-voicemail:before,
.entypo-icon-wallet:before,
.entypo-icon-warning:before,
.entypo-icon-water:before,
.entypo-icon-windows-store:before,
.entypo-icon-xing:before,
.entypo-icon-xing-with-circle:before,
.entypo-icon-yelp:before,
.entypo-icon-youko:before,
.entypo-icon-youko-with-circle:before,
.entypo-icon-youtube:before,
.entypo-icon-youtube-with-circle:before {
display: inline-block;
font-family: "entypo";
font-style: normal;
font-weight: normal;
font-variant: normal;
line-height: 1;
text-decoration: inherit;
text-rendering: optimizeLegibility;
text-transform: none;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
}
.entypo-icon-500px:before { content: "\f100"; }
.entypo-icon-500px-with-circle:before { content: "\f101"; }
.entypo-icon-add-to-list:before { content: "\f102"; }
.entypo-icon-add-user:before { content: "\f103"; }
.entypo-icon-address:before { content: "\f104"; }
.entypo-icon-adjust:before { content: "\f105"; }
.entypo-icon-air:before { content: "\f106"; }
.entypo-icon-aircraft:before { content: "\f107"; }
.entypo-icon-aircraft-landing:before { content: "\f108"; }
.entypo-icon-aircraft-take-off:before { content: "\f109"; }
.entypo-icon-align-bottom:before { content: "\f10a"; }
.entypo-icon-align-horizontal-middle:before { content: "\f10b"; }
.entypo-icon-align-left:before { content: "\f10c"; }
.entypo-icon-align-right:before { content: "\f10d"; }
.entypo-icon-align-top:before { content: "\f10e"; }
.entypo-icon-align-vertical-middle:before { content: "\f10f"; }
.entypo-icon-app-store:before { content: "\f110"; }
.entypo-icon-archive:before { content: "\f111"; }
.entypo-icon-area-graph:before { content: "\f112"; }
.entypo-icon-arrow-bold-down:before { content: "\f113"; }
.entypo-icon-arrow-bold-left:before { content: "\f114"; }
.entypo-icon-arrow-bold-right:before { content: "\f115"; }
.entypo-icon-arrow-bold-up:before { content: "\f116"; }
.entypo-icon-arrow-down:before { content: "\f117"; }
.entypo-icon-arrow-left:before { content: "\f118"; }
.entypo-icon-arrow-long-down:before { content: "\f119"; }
.entypo-icon-arrow-long-left:before { content: "\f11a"; }
.entypo-icon-arrow-long-right:before { content: "\f11b"; }
.entypo-icon-arrow-long-up:before { content: "\f11c"; }
.entypo-icon-arrow-right:before { content: "\f11d"; }
.entypo-icon-arrow-up:before { content: "\f11e"; }
.entypo-icon-arrow-with-circle-down:before { content: "\f11f"; }
.entypo-icon-arrow-with-circle-left:before { content: "\f120"; }
.entypo-icon-arrow-with-circle-right:before { content: "\f121"; }
.entypo-icon-arrow-with-circle-up:before { content: "\f122"; }
.entypo-icon-attachment:before { content: "\f123"; }
.entypo-icon-awareness-ribbon:before { content: "\f124"; }
.entypo-icon-back:before { content: "\f125"; }
.entypo-icon-back-in-time:before { content: "\f126"; }
.entypo-icon-baidu:before { content: "\f127"; }
.entypo-icon-bar-graph:before { content: "\f128"; }
.entypo-icon-basecamp:before { content: "\f129"; }
.entypo-icon-battery:before { content: "\f12a"; }
.entypo-icon-beamed-note:before { content: "\f12b"; }
.entypo-icon-behance:before { content: "\f12c"; }
.entypo-icon-bell:before { content: "\f12d"; }
.entypo-icon-blackboard:before { content: "\f12e"; }
.entypo-icon-block:before { content: "\f12f"; }
.entypo-icon-book:before { content: "\f130"; }
.entypo-icon-bookmark:before { content: "\f131"; }
.entypo-icon-bookmarks:before { content: "\f132"; }
.entypo-icon-bowl:before { content: "\f133"; }
.entypo-icon-box:before { content: "\f134"; }
.entypo-icon-briefcase:before { content: "\f135"; }
.entypo-icon-browser:before { content: "\f136"; }
.entypo-icon-brush:before { content: "\f137"; }
.entypo-icon-bucket:before { content: "\f138"; }
.entypo-icon-bug:before { content: "\f139"; }
.entypo-icon-cake:before { content: "\f13a"; }
.entypo-icon-calculator:before { content: "\f13b"; }
.entypo-icon-calendar:before { content: "\f13c"; }
.entypo-icon-camera:before { content: "\f13d"; }
.entypo-icon-ccw:before { content: "\f13e"; }
.entypo-icon-chat:before { content: "\f13f"; }
.entypo-icon-check:before { content: "\f140"; }
.entypo-icon-chevron-down:before { content: "\f141"; }
.entypo-icon-chevron-left:before { content: "\f142"; }
.entypo-icon-chevron-right:before { content: "\f143"; }
.entypo-icon-chevron-small-down:before { content: "\f144"; }
.entypo-icon-chevron-small-left:before { content: "\f145"; }
.entypo-icon-chevron-small-right:before { content: "\f146"; }
.entypo-icon-chevron-small-up:before { content: "\f147"; }
.entypo-icon-chevron-thin-down:before { content: "\f148"; }
.entypo-icon-chevron-thin-left:before { content: "\f149"; }
.entypo-icon-chevron-thin-right:before { content: "\f14a"; }
.entypo-icon-chevron-thin-up:before { content: "\f14b"; }
.entypo-icon-chevron-up:before { content: "\f14c"; }
.entypo-icon-chevron-with-circle-down:before { content: "\f14d"; }
.entypo-icon-chevron-with-circle-left:before { content: "\f14e"; }
.entypo-icon-chevron-with-circle-right:before { content: "\f14f"; }
.entypo-icon-chevron-with-circle-up:before { content: "\f150"; }
.entypo-icon-circle:before { content: "\f151"; }
.entypo-icon-circle-with-cross:before { content: "\f152"; }
.entypo-icon-circle-with-minus:before { content: "\f153"; }
.entypo-icon-circle-with-plus:before { content: "\f154"; }
.entypo-icon-circular-graph:before { content: "\f155"; }
.entypo-icon-clapperboard:before { content: "\f156"; }
.entypo-icon-classic-computer:before { content: "\f157"; }
.entypo-icon-clipboard:before { content: "\f158"; }
.entypo-icon-clock:before { content: "\f159"; }
.entypo-icon-cloud:before { content: "\f15a"; }
.entypo-icon-code:before { content: "\f15b"; }
.entypo-icon-cog:before { content: "\f15c"; }
.entypo-icon-colours:before { content: "\f15d"; }
.entypo-icon-compass:before { content: "\f15e"; }
.entypo-icon-controller-fast-backward:before { content: "\f15f"; }
.entypo-icon-controller-fast-forward:before { content: "\f160"; }
.entypo-icon-controller-jump-to-start:before { content: "\f161"; }
.entypo-icon-controller-next:before { content: "\f162"; }
.entypo-icon-controller-paus:before { content: "\f163"; }
.entypo-icon-controller-play:before { content: "\f164"; }
.entypo-icon-controller-record:before { content: "\f165"; }
.entypo-icon-controller-stop:before { content: "\f166"; }
.entypo-icon-controller-volume:before { content: "\f167"; }
.entypo-icon-copy:before { content: "\f168"; }
.entypo-icon-creative-cloud:before { content: "\f169"; }
.entypo-icon-creative-commons:before { content: "\f16a"; }
.entypo-icon-creative-commons-attribution:before { content: "\f16b"; }
.entypo-icon-creative-commons-noderivs:before { content: "\f16c"; }
.entypo-icon-creative-commons-noncommercial-eu:before { content: "\f16d"; }
.entypo-icon-creative-commons-noncommercial-us:before { content: "\f16e"; }
.entypo-icon-creative-commons-public-domain:before { content: "\f16f"; }
.entypo-icon-creative-commons-remix:before { content: "\f170"; }
.entypo-icon-creative-commons-share:before { content: "\f171"; }
.entypo-icon-creative-commons-sharealike:before { content: "\f172"; }
.entypo-icon-credit:before { content: "\f173"; }
.entypo-icon-credit-card:before { content: "\f174"; }
.entypo-icon-crop:before { content: "\f175"; }
.entypo-icon-cross:before { content: "\f176"; }
.entypo-icon-cup:before { content: "\f177"; }
.entypo-icon-cw:before { content: "\f178"; }
.entypo-icon-cycle:before { content: "\f179"; }
.entypo-icon-database:before { content: "\f17a"; }
.entypo-icon-dial-pad:before { content: "\f17b"; }
.entypo-icon-direction:before { content: "\f17c"; }
.entypo-icon-document:before { content: "\f17d"; }
.entypo-icon-document-landscape:before { content: "\f17e"; }
.entypo-icon-documents:before { content: "\f17f"; }
.entypo-icon-dot-single:before { content: "\f180"; }
.entypo-icon-dots-three-horizontal:before { content: "\f181"; }
.entypo-icon-dots-three-vertical:before { content: "\f182"; }
.entypo-icon-dots-two-horizontal:before { content: "\f183"; }
.entypo-icon-dots-two-vertical:before { content: "\f184"; }
.entypo-icon-download:before { content: "\f185"; }
.entypo-icon-dribbble:before { content: "\f186"; }
.entypo-icon-dribbble-with-circle:before { content: "\f187"; }
.entypo-icon-drink:before { content: "\f188"; }
.entypo-icon-drive:before { content: "\f189"; }
.entypo-icon-drop:before { content: "\f18a"; }
.entypo-icon-dropbox:before { content: "\f18b"; }
.entypo-icon-edit:before { content: "\f18c"; }
.entypo-icon-email:before { content: "\f18d"; }
.entypo-icon-emoji-flirt:before { content: "\f18e"; }
.entypo-icon-emoji-happy:before { content: "\f18f"; }
.entypo-icon-emoji-neutral:before { content: "\f190"; }
.entypo-icon-emoji-sad:before { content: "\f191"; }
.entypo-icon-erase:before { content: "\f192"; }
.entypo-icon-eraser:before { content: "\f193"; }
.entypo-icon-evernote:before { content: "\f194"; }
.entypo-icon-export:before { content: "\f195"; }
.entypo-icon-eye:before { content: "\f196"; }
.entypo-icon-eye-with-line:before { content: "\f197"; }
.entypo-icon-facebook:before { content: "\f198"; }
.entypo-icon-facebook-with-circle:before { content: "\f199"; }
.entypo-icon-feather:before { content: "\f19a"; }
.entypo-icon-fingerprint:before { content: "\f19b"; }
.entypo-icon-flag:before { content: "\f19c"; }
.entypo-icon-flash:before { content: "\f19d"; }
.entypo-icon-flashlight:before { content: "\f19e"; }
.entypo-icon-flat-brush:before { content: "\f19f"; }
.entypo-icon-flattr:before { content: "\f1a0"; }
.entypo-icon-flickr:before { content: "\f1a1"; }
.entypo-icon-flickr-with-circle:before { content: "\f1a2"; }
.entypo-icon-flow-branch:before { content: "\f1a3"; }
.entypo-icon-flow-cascade:before { content: "\f1a4"; }
.entypo-icon-flow-line:before { content: "\f1a5"; }
.entypo-icon-flow-parallel:before { content: "\f1a6"; }
.entypo-icon-flow-tree:before { content: "\f1a7"; }
.entypo-icon-flower:before { content: "\f1a8"; }
.entypo-icon-folder:before { content: "\f1a9"; }
.entypo-icon-folder-images:before { content: "\f1aa"; }
.entypo-icon-folder-music:before { content: "\f1ab"; }
.entypo-icon-folder-video:before { content: "\f1ac"; }
.entypo-icon-forward:before { content: "\f1ad"; }
.entypo-icon-foursquare:before { content: "\f1ae"; }
.entypo-icon-funnel:before { content: "\f1af"; }
.entypo-icon-game-controller:before { content: "\f1b0"; }
.entypo-icon-gauge:before { content: "\f1b1"; }
.entypo-icon-github:before { content: "\f1b2"; }
.entypo-icon-github-with-circle:before { content: "\f1b3"; }
.entypo-icon-globe:before { content: "\f1b4"; }
.entypo-icon-google-drive:before { content: "\f1b5"; }
.entypo-icon-google-hangouts:before { content: "\f1b6"; }
.entypo-icon-google-play:before { content: "\f1b7"; }
.entypo-icon-google-plus:before { content: "\f1b8"; }
.entypo-icon-google-plus-with-circle:before { content: "\f1b9"; }
.entypo-icon-graduation-cap:before { content: "\f1ba"; }
.entypo-icon-grid:before { content: "\f1bb"; }
.entypo-icon-grooveshark:before { content: "\f1bc"; }
.entypo-icon-hair-cross:before { content: "\f1bd"; }
.entypo-icon-hand:before { content: "\f1be"; }
.entypo-icon-heart:before { content: "\f1bf"; }
.entypo-icon-heart-outlined:before { content: "\f1c0"; }
.entypo-icon-help:before { content: "\f1c1"; }
.entypo-icon-help-with-circle:before { content: "\f1c2"; }
.entypo-icon-home:before { content: "\f1c3"; }
.entypo-icon-hour-glass:before { content: "\f1c4"; }
.entypo-icon-houzz:before { content: "\f1c5"; }
.entypo-icon-icloud:before { content: "\f1c6"; }
.entypo-icon-image:before { content: "\f1c7"; }
.entypo-icon-image-inverted:before { content: "\f1c8"; }
.entypo-icon-images:before { content: "\f1c9"; }
.entypo-icon-inbox:before { content: "\f1ca"; }
.entypo-icon-infinity:before { content: "\f1cb"; }
.entypo-icon-info:before { content: "\f1cc"; }
.entypo-icon-info-with-circle:before { content: "\f1cd"; }
.entypo-icon-instagram:before { content: "\f1ce"; }
.entypo-icon-instagram-with-circle:before { content: "\f1cf"; }
.entypo-icon-install:before { content: "\f1d0"; }
.entypo-icon-key:before { content: "\f1d1"; }
.entypo-icon-keyboard:before { content: "\f1d2"; }
.entypo-icon-lab-flask:before { content: "\f1d3"; }
.entypo-icon-landline:before { content: "\f1d4"; }
.entypo-icon-language:before { content: "\f1d5"; }
.entypo-icon-laptop:before { content: "\f1d6"; }
.entypo-icon-lastfm:before { content: "\f1d7"; }
.entypo-icon-lastfm-with-circle:before { content: "\f1d8"; }
.entypo-icon-layers:before { content: "\f1d9"; }
.entypo-icon-leaf:before { content: "\f1da"; }
.entypo-icon-level-down:before { content: "\f1db"; }
.entypo-icon-level-up:before { content: "\f1dc"; }
.entypo-icon-lifebuoy:before { content: "\f1dd"; }
.entypo-icon-light-bulb:before { content: "\f1de"; }
.entypo-icon-light-down:before { content: "\f1df"; }
.entypo-icon-light-up:before { content: "\f1e0"; }
.entypo-icon-line-graph:before { content: "\f1e1"; }
.entypo-icon-link:before { content: "\f1e2"; }
.entypo-icon-linkedin:before { content: "\f1e3"; }
.entypo-icon-linkedin-with-circle:before { content: "\f1e4"; }
.entypo-icon-list:before { content: "\f1e5"; }
.entypo-icon-location:before { content: "\f1e6"; }
.entypo-icon-location-pin:before { content: "\f1e7"; }
.entypo-icon-lock:before { content: "\f1e8"; }
.entypo-icon-lock-open:before { content: "\f1e9"; }
.entypo-icon-log-out:before { content: "\f1ea"; }
.entypo-icon-login:before { content: "\f1eb"; }
.entypo-icon-loop:before { content: "\f1ec"; }
.entypo-icon-magnet:before { content: "\f1ed"; }
.entypo-icon-magnifying-glass:before { content: "\f1ee"; }
.entypo-icon-mail:before { content: "\f1ef"; }
.entypo-icon-mail-with-circle:before { content: "\f1f0"; }
.entypo-icon-man:before { content: "\f1f1"; }
.entypo-icon-map:before { content: "\f1f2"; }
.entypo-icon-mask:before { content: "\f1f3"; }
.entypo-icon-medal:before { content: "\f1f4"; }
.entypo-icon-medium:before { content: "\f1f5"; }
.entypo-icon-medium-with-circle:before { content: "\f1f6"; }
.entypo-icon-megaphone:before { content: "\f1f7"; }
.entypo-icon-menu:before { content: "\f1f8"; }
.entypo-icon-merge:before { content: "\f1f9"; }
.entypo-icon-message:before { content: "\f1fa"; }
.entypo-icon-mic:before { content: "\f1fb"; }
.entypo-icon-minus:before { content: "\f1fc"; }
.entypo-icon-mixi:before { content: "\f1fd"; }
.entypo-icon-mobile:before { content: "\f1fe"; }
.entypo-icon-modern-mic:before { content: "\f1ff"; }
.entypo-icon-moon:before { content: "\f200"; }
.entypo-icon-mouse:before { content: "\f201"; }
.entypo-icon-mouse-pointer:before { content: "\f202"; }
.entypo-icon-music:before { content: "\f203"; }
.entypo-icon-network:before { content: "\f204"; }
.entypo-icon-new:before { content: "\f205"; }
.entypo-icon-new-message:before { content: "\f206"; }
.entypo-icon-news:before { content: "\f207"; }
.entypo-icon-newsletter:before { content: "\f208"; }
.entypo-icon-note:before { content: "\f209"; }
.entypo-icon-notification:before { content: "\f20a"; }
.entypo-icon-notifications-off:before { content: "\f20b"; }
.entypo-icon-old-mobile:before { content: "\f20c"; }
.entypo-icon-old-phone:before { content: "\f20d"; }
.entypo-icon-onedrive:before { content: "\f20e"; }
.entypo-icon-open-book:before { content: "\f20f"; }
.entypo-icon-palette:before { content: "\f210"; }
.entypo-icon-paper-plane:before { content: "\f211"; }
.entypo-icon-paypal:before { content: "\f212"; }
.entypo-icon-pencil:before { content: "\f213"; }
.entypo-icon-phone:before { content: "\f214"; }
.entypo-icon-picasa:before { content: "\f215"; }
.entypo-icon-pie-chart:before { content: "\f216"; }
.entypo-icon-pin:before { content: "\f217"; }
.entypo-icon-pinterest:before { content: "\f218"; }
.entypo-icon-pinterest-with-circle:before { content: "\f219"; }
.entypo-icon-plus:before { content: "\f21a"; }
.entypo-icon-popup:before { content: "\f21b"; }
.entypo-icon-power-plug:before { content: "\f21c"; }
.entypo-icon-price-ribbon:before { content: "\f21d"; }
.entypo-icon-price-tag:before { content: "\f21e"; }
.entypo-icon-print:before { content: "\f21f"; }
.entypo-icon-progress-empty:before { content: "\f220"; }
.entypo-icon-progress-full:before { content: "\f221"; }
.entypo-icon-progress-one:before { content: "\f222"; }
.entypo-icon-progress-two:before { content: "\f223"; }
.entypo-icon-publish:before { content: "\f224"; }
.entypo-icon-qq:before { content: "\f225"; }
.entypo-icon-qq-with-circle:before { content: "\f226"; }
.entypo-icon-quote:before { content: "\f227"; }
.entypo-icon-radio:before { content: "\f228"; }
.entypo-icon-raft:before { content: "\f229"; }
.entypo-icon-raft-with-circle:before { content: "\f22a"; }
.entypo-icon-rainbow:before { content: "\f22b"; }
.entypo-icon-rdio:before { content: "\f22c"; }
.entypo-icon-rdio-with-circle:before { content: "\f22d"; }
.entypo-icon-remove-user:before { content: "\f22e"; }
.entypo-icon-renren:before { content: "\f22f"; }
.entypo-icon-reply:before { content: "\f230"; }
.entypo-icon-reply-all:before { content: "\f231"; }
.entypo-icon-resize-100-percent:before { content: "\f232"; }
.entypo-icon-resize-full-screen:before { content: "\f233"; }
.entypo-icon-retweet:before { content: "\f234"; }
.entypo-icon-rocket:before { content: "\f235"; }
.entypo-icon-round-brush:before { content: "\f236"; }
.entypo-icon-rss:before { content: "\f237"; }
.entypo-icon-ruler:before { content: "\f238"; }
.entypo-icon-save:before { content: "\f239"; }
.entypo-icon-scissors:before { content: "\f23a"; }
.entypo-icon-scribd:before { content: "\f23b"; }
.entypo-icon-select-arrows:before { content: "\f23c"; }
.entypo-icon-share:before { content: "\f23d"; }
.entypo-icon-share-alternative:before { content: "\f23e"; }
.entypo-icon-shareable:before { content: "\f23f"; }
.entypo-icon-shield:before { content: "\f240"; }
.entypo-icon-shop:before { content: "\f241"; }
.entypo-icon-shopping-bag:before { content: "\f242"; }
.entypo-icon-shopping-basket:before { content: "\f243"; }
.entypo-icon-shopping-cart:before { content: "\f244"; }
.entypo-icon-shuffle:before { content: "\f245"; }
.entypo-icon-signal:before { content: "\f246"; }
.entypo-icon-sina-weibo:before { content: "\f247"; }
.entypo-icon-skype:before { content: "\f248"; }
.entypo-icon-skype-with-circle:before { content: "\f249"; }
.entypo-icon-slideshare:before { content: "\f24a"; }
.entypo-icon-smashing:before { content: "\f24b"; }
.entypo-icon-sound:before { content: "\f24c"; }
.entypo-icon-sound-mix:before { content: "\f24d"; }
.entypo-icon-sound-mute:before { content: "\f24e"; }
.entypo-icon-soundcloud:before { content: "\f24f"; }
.entypo-icon-sports-club:before { content: "\f250"; }
.entypo-icon-spotify:before { content: "\f251"; }
.entypo-icon-spotify-with-circle:before { content: "\f252"; }
.entypo-icon-spreadsheet:before { content: "\f253"; }
.entypo-icon-squared-cross:before { content: "\f254"; }
.entypo-icon-squared-minus:before { content: "\f255"; }
.entypo-icon-squared-plus:before { content: "\f256"; }
.entypo-icon-star:before { content: "\f257"; }
.entypo-icon-star-outlined:before { content: "\f258"; }
.entypo-icon-stopwatch:before { content: "\f259"; }
.entypo-icon-stumbleupon:before { content: "\f25a"; }
.entypo-icon-stumbleupon-with-circle:before { content: "\f25b"; }
.entypo-icon-suitcase:before { content: "\f25c"; }
.entypo-icon-swap:before { content: "\f25d"; }
.entypo-icon-swarm:before { content: "\f25e"; }
.entypo-icon-sweden:before { content: "\f25f"; }
.entypo-icon-switch:before { content: "\f260"; }
.entypo-icon-tablet:before { content: "\f261"; }
.entypo-icon-tablet-mobile-combo:before { content: "\f262"; }
.entypo-icon-tag:before { content: "\f263"; }
.entypo-icon-text:before { content: "\f264"; }
.entypo-icon-text-document:before { content: "\f265"; }
.entypo-icon-text-document-inverted:before { content: "\f266"; }
.entypo-icon-thermometer:before { content: "\f267"; }
.entypo-icon-thumbs-down:before { content: "\f268"; }
.entypo-icon-thumbs-up:before { content: "\f269"; }
.entypo-icon-thunder-cloud:before { content: "\f26a"; }
.entypo-icon-ticket:before { content: "\f26b"; }
.entypo-icon-time-slot:before { content: "\f26c"; }
.entypo-icon-tools:before { content: "\f26d"; }
.entypo-icon-traffic-cone:before { content: "\f26e"; }
.entypo-icon-trash:before { content: "\f26f"; }
.entypo-icon-tree:before { content: "\f270"; }
.entypo-icon-triangle-down:before { content: "\f271"; }
.entypo-icon-triangle-left:before { content: "\f272"; }
.entypo-icon-triangle-right:before { content: "\f273"; }
.entypo-icon-triangle-up:before { content: "\f274"; }
.entypo-icon-tripadvisor:before { content: "\f275"; }
.entypo-icon-trophy:before { content: "\f276"; }
.entypo-icon-tumblr:before { content: "\f277"; }
.entypo-icon-tumblr-with-circle:before { content: "\f278"; }
.entypo-icon-tv:before { content: "\f279"; }
.entypo-icon-twitter:before { content: "\f27a"; }
.entypo-icon-twitter-with-circle:before { content: "\f27b"; }
.entypo-icon-typing:before { content: "\f27c"; }
.entypo-icon-uninstall:before { content: "\f27d"; }
.entypo-icon-unread:before { content: "\f27e"; }
.entypo-icon-untag:before { content: "\f27f"; }
.entypo-icon-upload:before { content: "\f280"; }
.entypo-icon-upload-to-cloud:before { content: "\f281"; }
.entypo-icon-user:before { content: "\f282"; }
.entypo-icon-users:before { content: "\f283"; }
.entypo-icon-v-card:before { content: "\f284"; }
.entypo-icon-video:before { content: "\f285"; }
.entypo-icon-video-camera:before { content: "\f286"; }
.entypo-icon-vimeo:before { content: "\f287"; }
.entypo-icon-vimeo-with-circle:before { content: "\f288"; }
.entypo-icon-vine:before { content: "\f289"; }
.entypo-icon-vine-with-circle:before { content: "\f28a"; }
.entypo-icon-vinyl:before { content: "\f28b"; }
.entypo-icon-vk:before { content: "\f28c"; }
.entypo-icon-vk-alternitive:before { content: "\f28d"; }
.entypo-icon-vk-with-circle:before { content: "\f28e"; }
.entypo-icon-voicemail:before { content: "\f28f"; }
.entypo-icon-wallet:before { content: "\f290"; }
.entypo-icon-warning:before { content: "\f291"; }
.entypo-icon-water:before { content: "\f292"; }
.entypo-icon-windows-store:before { content: "\f293"; }
.entypo-icon-xing:before { content: "\f294"; }
.entypo-icon-xing-with-circle:before { content: "\f295"; }
.entypo-icon-yelp:before { content: "\f296"; }
.entypo-icon-youko:before { content: "\f297"; }
.entypo-icon-youko-with-circle:before { content: "\f298"; }
.entypo-icon-youtube:before { content: "\f299"; }
.entypo-icon-youtube-with-circle:before { content: "\f29a"; }

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,330 @@
Compilation
========================================================================================
NanoGUI uses a CMake build system to ensure portability. All dependencies are
cloned and compiled in one batch, which should generally reduce the amount of
configuration effort to zero. Assuming that NanoGUI was cloned into the current
working directory, the following commands need to be executed:
.. code-block:: bash
# enter the top-level NanoGUI directory
$ cd nanogui
# make a build directory and enter that
$ mkdir build
$ cd build
# generate your Makefile
$ cmake ..
# now that you have a Makefile, use that to build
$ make -j 4
For Windows, the process is nearly the same:
.. code-block:: bash
# enter the top-level NanoGUI directory
$ cd nanogui
# make a build directory and enter that
$ mkdir build
$ cd build
# Specify VS Version AND 64bit, otherwise it defaults to 32.
# The version number and year may be different for you, Win64
# can be appended to any of them. Execute `cmake -G` to get
# a listing of the available generators.
#
# 32 bit Windows builds are /not/ supported
$ cmake -G "Visual Studio 14 2015 Win64" ..
# Either open the .sln with Visual Studio, or run
$ cmake --build . --config Release
Default Configurations
----------------------------------------------------------------------------------------
By default, NanoGUI will
+---------------------------------+---------------------------+
| Impact / effect | CMake Option |
+=================================+===========================+
| Build the example programs. | ``NANOGUI_BUILD_EXAMPLE`` |
+---------------------------------+---------------------------+
| Build as a *shared* library. | ``NANOGUI_BUILD_SHARED`` |
+---------------------------------+---------------------------+
| Build the Python plugins. | ``NANOGUI_BUILD_PYTHON`` |
+---------------------------------+---------------------------+
| Use GLAD if on Windows. | ``NANOGUI_USE_GLAD`` |
+---------------------------------+---------------------------+
| Generate an ``install`` target. | ``NANOGUI_INSTALL`` |
+---------------------------------+---------------------------+
Users developing projects that reference NanoGUI as a ``git submodule`` (this
is **strongly** encouraged) can set up the parent project's CMake configuration
file as follows (this assumes that ``nanogui`` lives in the directory
``ext/nanogui`` relative to the parent project):
.. code-block:: cmake
# Disable building extras we won't need (pure C++ project)
set(NANOGUI_BUILD_EXAMPLE OFF CACHE BOOL " " FORCE)
set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL " " FORCE)
set(NANOGUI_INSTALL OFF CACHE BOOL " " FORCE)
# Add the configurations from nanogui
add_subdirectory(ext/nanogui)
# For reliability of parallel build, make the NanoGUI targets dependencies
set_property(TARGET glfw glfw_objects nanogui PROPERTY FOLDER "dependencies")
Required Variables Exposed
----------------------------------------------------------------------------------------
Due to the nature of building an OpenGL application for different platforms, three
variables are populated to allow for easy incorporation with your CMake build. After
you have executed ``add_subdirectory`` as shown above, you will need to add the
following (assuming the target you are building is called ``myTarget``):
.. code-block:: cmake
# Various preprocessor definitions have been generated by NanoGUI
add_definitions(${NANOGUI_EXTRA_DEFS})
# On top of adding the path to nanogui/include, you may need extras
include_directories(${NANOGUI_EXTRA_INCS})
# Compile a target using NanoGUI
add_executable(myTarget myTarget.cpp)
# Lastly, additional libraries may have been built for you. In addition to linking
# against NanoGUI, we need to link against those as well.
target_link_libraries(myTarget nanogui ${NANOGUI_EXTRA_LIBS})
Advanced Compilation Details
----------------------------------------------------------------------------------------
NanoGUI and Python
****************************************************************************************
Although it is |year|, you may still for example wish to build the Python bindings for
Python 2.7. The variable you would set **before** ``add_subdirectory`` is
``NANOGUI_PYTHON_VERSION``. For example,
.. code-block:: cmake
set(NANOGUI_PYTHON_VERSION "2.7")
# can also use minor versions
set(NANOGUI_PYTHON_VERSION "3.6.2")
NanoGUI and Eigen
****************************************************************************************
NanoGUI uses Eigen_ internally for various vector types. Eigen is an advanced header
only template library, which NanoGUI vendors in the ``ext`` folder. It is important to
understand the implication of Eigen being header only: **only one version of Eigen can
be included**.
There is a CMake bypass variable available in NanoGUI: ``NANOGUI_EIGEN_INCLUDE_DIR``.
You would set this variable **before** ``add_subdirectory``. Since you will want to
provide the same kind of bypass for users of your library, the following snippet is a
good starting point. For this example code:
1. The parent CMake project is called ``myproj``. A good CMake practice to adopt is to
prefix your project's name to any variables you intend to expose. This allows parent
projects to know where the variable came from, and avoids name collisions.
2. First ``find_package`` is used to try and find Eigen. The philosophy is that the
user is responsible for ensuring that the version of Eigen they want to use will be
found.
3. Since NanoGUI needs to remain self-contained, the side-effect is that even if the
user does *not* have Eigen installed, you can fallback and use the one vendored with
NanoGUI.
4. The following directory structure:
.. code-block:: none
myproj/
CMakeLists.txt <- Where this example code is
ext/
nanogui/
CMakeLists.txt <- NanoGUI's build system
ext/
eigen/ <- NanoGUI's internal copy of Eigen
.. code-block:: cmake
# `if NOT` is what enables the same bypass for your project
if(NOT MYPROJ_EIGEN3_INCLUDE_DIR)
# Grab or find the Eigen3 include directory.
find_package(Eigen3 QUIET)
if(EIGEN3_INCLUDE_DIR)
set(MYPROJ_EIGEN3_INCLUDE_DIR ${EIGEN3_INCLUDE_DIR})
else()
# use the internal NanoGUI copy of Eigen
set(MYPROJ_EIGEN3_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui/ext/eigen)
endif()
endif()
message(STATUS "Using Eigen3 from directory: ${MYPROJ_EIGEN3_INCLUDE_DIR}")
set(NANOGUI_EIGEN_INCLUDE_DIR ${EIGEN3_INCLUDE_DIR} CACHE BOOL " " FORCE)
# set any other NanoGUI specific variables you need (shown in above sections)
add_subdirectory(ext/nanogui)
# include it for your project as well (or append to a list
# and include that list later, depending on your setup)
include_directories(${MYPROJ_EIGEN3_INCLUDE_DIR})
.. _Eigen: https://eigen.tuxfamily.org/dox/
NanoGUI, GLFW, and Other Projects
****************************************************************************************
Suppose you want to use NanoGUI as your GUI toolkit, but you also have another library
you want to use that depends on ``glfw``. Call the second library Foo. Generally
speaking, it is unlikely that library Foo will provide you with mechanisms to explicitly
specify where ``glfw`` comes from. You could try to work on a patch with the developers
of library Foo to allow this to be overridden, but you may need to maintain your own
fork of library Foo. There is just as much justification to allow the bypass as there
is to not want it in a build system.
Since NanoGUI merges the ``glfw`` objects into the library being built, you can actually
just specify ``nanogui`` as the ``glfw`` dependency directly. So lets suppose that
library Foo was looking for ``glfw`` like this:
.. code-block:: cmake
find_package(GLFW3)
if(GLFW3_FOUND)
include_directories(${GLFW3_INCLUDE_DIRS})
target_link_libraries(foo ${GLFW3_LIBRARIES})
endif()
You can cheat around this pretty easily. For the modification to library Foo's build
system, all we do is wrap ``find_package``:
.. code-block:: diff
+ if(NOT GLFW3_FOUND)
find_package(GLFW3)
+ endif()
if(GLFW3_FOUND)
include_directories(${GLFW3_INCLUDE_DIRS})
target_link_libraries(foo ${GLFW3_LIBRARIES})
endif()
Now that ``find_package`` will only execute if ``NOT GLFW3_FOUND``, in your build system
you make sure to set all three ``glfw`` variables (found, include, and libraries). It
might look something like this:
.. code-block:: cmake
# ... any other nanogui configs ...
# same directory structure as Eigen example
add_subdirectory(ext/nanogui)
# nanogui needs to be added first so the 'nanogui' target is defined
# and can be used in the generator expression for the libraries
set(GLFW3_FOUND ON)
set(GLFW3_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui/ext/glfw/include)
set(GLFW3_LIBRARIES $<TARGET_FILE:nanogui>)
add_subdirectory(ext/foo)
# IMPORTANT! You need to force NanoGUI to build first
# Assuming their library target is called 'foo'
add_dependencies(foo nanogui)
Depending on what you need to do, the above may not be sufficient. But it is at least
a starting point to being able to "share" NanoGUI as the vendor of ``glfw``.
.. _nanogui_including_custom_fonts:
Including Custom Fonts
****************************************************************************************
NanoGUI uses the Roboto_ font for text, and Entypo_ font for icons. If you wish to add
your own custom font, all you need is a True Type file (a ``.ttf`` extension). NanoGUI
will glob all fonts found in ``resources`` by expanding ``resources/*.ttf``. So if you
had the directory structure
.. code-block:: none
myproject/
CMakeLists.txt <- where this code is
fonts/
superfont.ttf
ext/
nanogui/
resources/
You simply need to copy the ``superfont.ttf`` to NanoGUI's resources directory:
.. code-block:: cmake
file(
COPY ${CMAKE_CURRENT_SOURCE_DIR}/fonts/superfont.ttf
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui/resources/superfont.ttf
)
When you build the code, there should be a file ``nanogui_resources.h`` generated. If
everything worked, your new font should have been included.
.. note::
Since NanoGUI can support images as icons, you will want to make sure that the
*codepoint* for any *icon* fonts you create is greater than ``1024``. See
:func:`nanogui::nvgIsImageIcon`.
.. tip::
Some widgets allow you to set fonts directly, but if you want to apply the font
globally, you should create a sub-class of :class:`nanogui::Theme` and explicitly
call :func:`nanogui::Widget::setTheme` for each widget you create.
.. _Roboto: https://fonts.google.com/specimen/Roboto
.. _Entypo: http://www.entypo.com
.. _utf8: http://www.utf8-chartable.de/
.. _nanogui_compiling_the_docs:
Compiling the Documentation
----------------------------------------------------------------------------------------
The documentation system relies on 'Doxygen', 'Sphinx', 'Breathe', and
'Exhale'. It uses the 'Read the Docs' theme for the layout of the generated
html. So you will need to first
1. Install Doxygen for your operating system. On Unix based systems, this
should be available through your package manager (apt-get, brew, dnf, etc).
2. Install Sphinx, Breathe, Exhale, and the theme:
.. code-block:: py
pip3 install -r <path/to/nanogui>/docs/requirements.txt
Now that you have the relevant tools, you can build the documentation with
.. code-block:: bash
# Enter the documentation directory
$ cd <path/to/nanogui>/docs
# Build the documentation
$ make html
The output will be generated in ``_build``, the root html document is located
at ``_build/html/index.html``.
.. note::
When building the documentation locally, there can be subtle differences in
the rendered pages than what is hosted online. You should largely be able
to ignore this.

View File

@@ -0,0 +1,372 @@
# -*- coding: utf-8 -*-
#
# NanoGUI documentation build configuration file, created by
# sphinx-quickstart on Mon Aug 22 20:05:54 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
import textwrap
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.ifconfig',
'breathe',
'exhale'
]
# Setup the `breathe` extension
breathe_projects = { "NanoGUI": "./doxyoutput/xml" }
breathe_default_project = "NanoGUI"
# Setup the `exhale` extension
exhale_args = {
############################################################################
# These arguments are required. #
############################################################################
"containmentFolder": "./api",
"rootFileName": "library_root.rst",
"rootFileTitle": "Library API",
"doxygenStripFromPath": "../include",
############################################################################
# Suggested optional arguments. #
############################################################################
"createTreeView": True,
"exhaleExecutesDoxygen": True,
"exhaleDoxygenStdin": textwrap.dedent('''
# Tell Doxygen where the source code is (yours may be different).
INPUT = ../include
# Doxygen chokes on `NAMESPACE_BEGIN`, predfine all of these
PREDEFINED += NAMESPACE_BEGIN(nanogui)="namespace nanogui {"
PREDEFINED += NAMESPACE_END(nanogui)="}"
PREDEFINED += NAMESPACE_BEGIN(detail)="namespace detail {"
PREDEFINED += NAMESPACE_END(detail)="}"
PREDEFINED += DOXYGEN_SHOULD_SKIP_THIS
PREDEFINED += DOXYGEN_DOCUMENTATION_BUILD
PREDEFINED += NANOGUI_EXPORT
'''),
############################################################################
# HTML Theme specific configurations. #
############################################################################
# Fix broken Sphinx RTD Theme 'Edit on GitHub' links
# Search for 'Edit on GitHub' on the FAQ:
# http://exhale.readthedocs.io/en/latest/faq.html
"pageLevelConfigMeta": ":github_url: https://github.com/wjakob/nanogui",
############################################################################
# Main library page layout example configuration. #
############################################################################
"afterTitleDescription": textwrap.dedent(u'''
Welcome to the developer reference to NanoGUI. The documentation is
actively being developed / updated. If you would like to help document
any part of the project you may be familiar with, please refer to the
:ref:`developer_contribution` page.
.. note::
Presented below is only the C++ API. If you are using the Python API,
the contents below are still applicable for understanding what
methods are available. While the documentation for the C++ API is
useful as a reference for understanding what a given class does, the
Python API does differ. Please refer to the more concise
:ref:`nanogui_example_2` for comparing the differences between the
C++ and Python interfaces.
'''),
############################################################################
# Individual page layout example configuration. #
############################################################################
# Example of adding contents directives on custom kinds with custom title
"contentsTitle": "Page Contents",
"kindsWithContentsDirectives": ["class", "file", "namespace", "struct"],
############################################################################
# useful to see ;)
# "verboseBuild": True
}
# Tell sphinx what the primary language being documented is.
primary_domain = 'cpp'
# Tell sphinx what the pygments highlight language should be.
highlight_language = 'cpp'
# Add any paths that contain templates here, relative to this directory.
# templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'NanoGUI'
copyright = u'2017, Wenzel Jakob'
author = u'Wenzel Jakob'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.1.0'
# The full version, including alpha/beta/rc tags.
release = '0.1.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
html_favicon = '../resources/icons/icon6.ico'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'NanoGUIdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'NanoGUI.tex', u'NanoGUI Documentation',
u'Wenzel Jakob', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'nanogui', u'NanoGUI Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'NanoGUI', u'NanoGUI Documentation',
author, 'NanoGUI', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
import datetime
rst_epilog = textwrap.dedent('''
.. |year| replace:: {year}
'''.format(
year=datetime.datetime.now().year
))
# auto-magically called by sphinx-build
def setup(app):
# this looks in html_static_path (_static directory as set above)
app.add_stylesheet("entypo.css")

View File

@@ -0,0 +1,346 @@
.. _developer_contribution:
Contributing
========================================================================================
Thank you for your interest in this project! Please refer to the following sections on
how to contribute code and bug reports.
Reporting bugs
----------------------------------------------------------------------------------------
At the moment, this project is run in the spare time of a single person
(`Wenzel Jakob <http://rgl.epfl.ch/people/wjakob>`_) with very limited resources for
issue tracker tickets. Thus, before submitting a question or bug report, please take a
moment of your time and ensure that your issue isn't already discussed in the project
documentation elsewhere on this site.
Feature requests are generally closed unless they come with a pull request
that implements the desired functionality.
Assuming that you have identified a previously unknown problem or an important question,
it's essential that you submit a self-contained and minimal piece of code that
reproduces the problem. In other words: no external dependencies, isolate the
function(s) that cause breakage, submit matched and complete C++ or Python snippets
(depending on how you are using NanoGUI) that can be easily compiled and run on my end.
Pull requests
----------------------------------------------------------------------------------------
Contributions are submitted, reviewed, and accepted using Github pull requests. Please
refer to `this article <https://help.github.com/articles/using-pull-requests>`_ for
details and adhere to the following rules to make the process as smooth as possible:
- Make a new branch for every feature you're working on.
- Make small and clean pull requests that are easy to review but make sure they do add
value by themselves.
- Make sure you have tested any new functionality (e.g. if you made a new Widget).
- This project has a strong focus on providing general solutions using a minimal amount
of code, thus small pull requests are greatly preferred.
- Read the remainder of this document, adhering to the bindings and documentation
requirements.
- If making a purely documentation PR, please prefix the commit with ``[docs]``
- E.g. ``[docs] Adding documentation for class X.``
Python Binding Requirements
----------------------------------------------------------------------------------------
Since NanoGUI builds for both C++, as well as produces Python bindings, you **must**
account for both sides of the API regardless of how you use the project. If you are
adding a new method, class, etc (not fixing an existing one), you must write the code
to produce the relevant binding in ``python/python.cpp``.
Code Style Requirements
----------------------------------------------------------------------------------------
- Tabs are 4 spaces -- please do not submit PRs with *tab* characters.
- Most code follows an 80 column ruler, wherever reasonable.
- Pointers and references have modifiers next to variable name, not the type:
- **Yes**: ``void *p``, **No**: ``void* p``
- **Yes**: ``Color &c``, **No**: ``Color& c``
- Template classes / functions: ``template <typename T> method()``
- Space between template and ``<``, on same line where reasonable
- Opening curly braces for definitions / loops / ifs are on the same line as the statement
- **Yes**:
.. code-block:: cpp
for (auto &&c : myVec) {
// ... computation ...
}
- **No**:
.. code-block:: cpp
for(auto &&c : myVec)
{
// ... computation ...
}
Code Documentation Requirements
----------------------------------------------------------------------------------------
When adding new classes, methods, etc please provide meaningful and well formatted
documentation of the new functionality. We use Doxygen comments to document the code,
using the "JavaDoc" style. For consistency, please do not use the QT or other formats.
If you are familiar with how to use Doxygen-style comments:
- You should indent by four spaces for things like ``param``, etc.
- ``\brief``: a brief description.
- ``\tparam``: a template parameter.
- ``\param``: a parameter.
- ``\return``: what the return value represents (where applicable).
For a quick crash-course on documenting using Doxygen:
1. If you are adding a new file, please include the disclaimer at the top **immediately**
followed by ``/** \file */``. So if you are creating the file ``nanogui/file.h``
.. code-block:: cpp
/*
nanogui/file.h -- A brief description of what the file contains.
NanoGUI was developed by Wenzel Jakob <wenzel.jakob@epfl.ch>.
The widget drawing code is based on the NanoVG demo application
by Mikko Mononen.
All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE.txt file.
*/
/** \file */
changing the first line to the right name / description of your file.
2. Documenting a newly added Struct or Class requires special attention. If you are
adding a class ``Thing`` in file ``nanogui/thing.h``, the class level documentation
needs to explicitly declare the location for Doxygen to parse everything correctly.
.. code-block:: cpp
/**
* \class Thing thing.h nanogui/thing.h
*
* This is the actual documentation for the thing.
*/
class Thing { ... };
This simply tells Doxygen how to format the various ``include`` directives. If you
are writing a Struct, replace ``\class`` with ``\struct``.
3. Please fully document all parameters, template parameters, and return types where
applicable. In some cases it is sufficient to include just a brief one-line
documentation string, e.g. the for the :func:`nanogui::Screen::caption` method, it
is simple enough that the following is sufficient (note the **three** ``///``):
.. code-block:: cpp
/// Get the window title bar caption
const std::string &caption() const { return mCaption; }
However, more complicated methods should be thoroughly documented. As an example,
this method demonstrates template parameters, parameters, and return value documentation:
.. code-block:: cpp
/**
* \brief A useless function for getting sizes.
*
* This method has specific things that must be pointed out, but they
* were too long to include in the 'brief' documentation.
*
* \tparam T
* The type we are evaluating the size of.
*
* \param returnFake
* If set to true, a random positive number will be returned. This
* comment is a bit longer and can span multiple lines, making sure
* to indent each new line.
*
* Warning: this had an empty line before it and will NOT appear in
* the documentation of this parameter, but instead it will appear
* in the documentation of the method!
*
* \return
* The result of ``sizeof(T)``.
*/
template <typename T>
size_t exampleTemplateFunction(bool returnFake = false) { ... }
Styling the Code
----------------------------------------------------------------------------------------
Since we are using both Doxygen and Sphinx, we have access to a wealth of interesting
documentation styling.
:From Doxygen:
You can use things like ``\throws``, ``\remark``, and even ``\ref`` to generate html
links to other items.
:From Sphinx:
On the Sphinx side, you now have access to full reStructuredText syntax. This
includes:
- ``**bold**`` to make **bold** text
- ``*italics*`` for *italics*
- ````teletype```` for ``teletype`` text.
You can additionally include more complex reStructuredText such as grid tables, as
well as Sphinx directives. You will need to use the ``\rst`` and ``\endrst``
commands for these:
.. code-block:: cpp
/**
* \brief Some method you are documenting.
*
* \rst
* I am now in a verbatim reStructuredText environment, and can create a grid table.
*
* I could create a python code listing using
*
* .. code-block:: py
*
* print("Some python code.")
*
* You can also use the note or warning directives to highlight important concepts:
*
* .. note::
* You may or may not segfault.
*
* .. warning::
* I guarantee you will segfault.
* \endrst
*/
.. warning::
In normal reStructuredText, if you simply indent a block of code by four spaces
it will render as a code listing. While this will build as expected for the
C++ documentation on RTD, it will **fail** to build ``py_doc.h`` correctly.
For code listings, **always** begin an ``\rst`` section and use ``.. code-block``
as shown above.
TODO
----------------------------------------------------------------------------------------
Documentation Completion
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Already familiar with NanoGUI or a subset of its classes? The documentation for the
following files is incomplete, waiting for your PR. Document a whole class, or even
just a method of a given class.
If you make progress on / complete an item with your PR, please update / remove it from
the table on this page (``docs/contributing.rst``).
.. note::
The NanoGUI documentation hosted online does not include ``private`` methods or
member variables at this time. However, documentation for these is welcome!
.. warning::
In some of these files, you will see preprocessor blocks like
.. code-block:: cpp
#ifndef DOXYGEN_SHOULD_SKIP_THIS
... code that the breaks the documentation ...
#endif // DOXYGEN_SHOULD_SKIP_THIS
Please take care not to remove these!
+-----------------+------------------------------------------------------------+
| Filename | Action Item |
+=================+============================================================+
| button.h | - Most member methods. |
| | - All member variables. |
+-----------------+------------------------------------------------------------+
| checkbox.h | - All member methods and variables. |
+-----------------+------------------------------------------------------------+
| colorpicker.h | - Constructor and callback. |
| | - All member variables. |
+-----------------+------------------------------------------------------------+
| colorwheel.h | - Most methods and member variables. |
+-----------------+------------------------------------------------------------+
| combobox.h | - Most member methods and variables. |
+-----------------+------------------------------------------------------------+
| formhelper.h | - More detailed documentation explaining parameters |
| | for ``FormHelper`` methods. |
| | - Most member variables. |
+-----------------+------------------------------------------------------------+
| graph.h | - All member methods and variables. |
+-----------------+------------------------------------------------------------+
| imagepanel.h | - All member methods and variables. |
+-----------------+------------------------------------------------------------+
| imageview.h | - Most member methods. |
+-----------------+------------------------------------------------------------+
| label.h | - Some member methods and variables. |
+-----------------+------------------------------------------------------------+
| layout.h | - Nearly everything. |
+-----------------+------------------------------------------------------------+
| popup.h | - Some member methods and variables. |
| | - Explicit parameter documentation would be very useful. |
+-----------------+------------------------------------------------------------+
| popupbutton.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| progressbar.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| screen.h | - Documentation for the manual GLFW API. |
| | - All member variables. |
+-----------------+------------------------------------------------------------+
| slider.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| stackedwidget.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| tabheader.h | - Some member methods. |
| | - Some reformatting of existing documentation to |
| | use ``\param`` or ``\return`` etc. |
+-----------------+------------------------------------------------------------+
| tabwidget.h | - Some member methods. |
| | - Some reformatting of existing documentation to |
| | use ``\param`` or ``\return`` etc. |
+-----------------+------------------------------------------------------------+
| textbox.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| theme.h | - Explicit documentation for what these all represent. |
+-----------------+------------------------------------------------------------+
| toolbutton.h | - Documentation of the constructor explaining the range of |
| | values that can be used for ``icon``. Or at least where |
| | to look for that? |
+-----------------+------------------------------------------------------------+
| vscrollpanel.h | - Almost everything. |
+-----------------+------------------------------------------------------------+
| widget.h | - Member variables. |
+-----------------+------------------------------------------------------------+
| window.h | - Some member methods. |
| | - All member variables. |
+-----------------+------------------------------------------------------------+
Advanced Contribution Opportunity
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Currently, all partial and full template specializations are skipped. Specifically,
nearly everything in ``include/nanogui/serializer/*``. According to the
`Breathe documentation <https://breathe.readthedocs.io/en/latest/doxygen.html#template>`_
this should be possible. The likely cause of this issue is that the version of Breathe
packaged for use with ``pip`` is not up to date. Your task would be to find a way
to use ``docs/requirements.txt`` to install the **current source** from the master
branch of Breathe instead of using PyPi.
You can test locally by making sure you do not have Breathe installed with ``pip``, and
compiling it yourself (make sure you add it to your ``PATH`` so you can use it in
Python).
Then try moving the ``#ifndef DOXYGEN_SHOULD_SKIP_THIS`` to expose a single template
specialization in a file of your choice, and try and get the documentation to build.
If you succeed with this, the next step will be to find a way to get Read the Docs to
build the current source of Breathe rather than using PyPi.
In theory, all of these are possible.

View File

@@ -0,0 +1,88 @@
.. _nanogui_example_programs:
Examples
========================================================================================
There are example programs available for you to play with / understand how the different
pieces fit together. The C++ examples are in ``nanogui/src/``, and the equivalent
Python examples are in ``nanogui/python``.
.. _nanogui_example_1:
Example 1
----------------------------------------------------------------------------------------
.. image:: ../resources/screenshot.png
:alt: Screenshot of Example 1.
:align: center
The first example program is rather long, but not altogether complicated. It
is effectively an enumeration of how one would go about adding various different kinds
of Widgets to the window being displayed.
- `Example 1 in C++ <https://github.com/wjakob/nanogui/blob/master/src/example1.cpp>`_
- `Example 1 in Python <https://github.com/wjakob/nanogui/blob/master/python/example1.py>`_
.. _nanogui_example_2:
Example 2
----------------------------------------------------------------------------------------
.. image:: ../resources/screenshot2.png
:alt: Screenshot of Example 2.
:align: center
The second program demonstrates how simple label/editor widget-type layouts can
be written in a very concise manner.
- `Example 2 in C++ <https://github.com/wjakob/nanogui/blob/master/src/example2.cpp>`_
- `Example 2 in Python <https://github.com/wjakob/nanogui/blob/master/python/example2.py>`_
.. _nanogui_example_3:
Example 3
----------------------------------------------------------------------------------------
The third example program demonstrates how to manage OpenGL / GLFW on your own for the
C++ side, and how to detach the NanoGUI ``mainloop()`` on the Python side.
- `Example 3 in C++ <https://github.com/wjakob/nanogui/blob/master/src/example3.cpp>`_
- `Example 3 in Python <https://github.com/wjakob/nanogui/blob/master/python/example3.py>`_
.. _nanogui_example_4:
Example 4
----------------------------------------------------------------------------------------
The fourth example program demonstrates the GLCanvas widget, which renders an
arbitrary sequence of OpenGL commands into a NanoGUI widget.
- `Example 4 in C++ <https://github.com/wjakob/nanogui/blob/master/src/example4.cpp>`_
- `Example 4 in Python <https://github.com/wjakob/nanogui/blob/master/python/example4.py>`_
.. _nanogui_example_icons:
Example Icons
----------------------------------------------------------------------------------------
NanoGUI includes various icons made available from :ref:`file_nanogui_entypo.h`,
courtesy of `Daniel Bruce's Entypo <http://www.entypo.com/>`_ glyphs. The file level
documentation is useful as a reference for selecting an icon, but the web rendering may
be misleading --- NanoGUI uses a dark background for widgets by default.
Run the ``exampleIcon`` executable to see what the icons look like in NanoGUI. The
setup of this file may also be helpful in understanding how to control the
:class:`nanogui::VScrollPanel`.
- `Example Icons in C++ <https://github.com/wjakob/nanogui/blob/master/src/example_icons.cpp>`_
- `Example Icons in Python <https://github.com/wjakob/nanogui/blob/master/python/example_icons.py>`_
.. _nanogui_example_repository:
Example Repository
----------------------------------------------------------------------------------------
Darren Mothersele has put together a compact and informative example repository that
demonstrates how easy it is to include NanoGUI into your project. You download / browse
the source on `GitHub <https://github.com/darrenmothersele/nanogui-test.git>`_.

View File

@@ -0,0 +1,63 @@
NanoGUI
========================================================================================
.. include:: ../README.rst
:start-after: begin_brief_description
:end-before: end_brief_description
Example Screenshot
----------------------------------------------------------------------------------------
.. image:: ../resources/screenshot.png
:alt: Screenshot of Example 1.
:align: center
Description
----------------------------------------------------------------------------------------
.. include:: ../README.rst
:start-after: begin_long_description
:end-before: end_long_description
"Simple mode"
----------------------------------------------------------------------------------------
Christian Schüller contributed a convenience class that makes it possible to create
AntTweakBar-style variable manipulators using just a few lines of code. Refer to
:ref:`nanogui_example_2` for how to create the image below.
.. image:: ../resources/screenshot2.png
:alt: Screenshot of Example 2.
:align: center
License
----------------------------------------------------------------------------------------
.. include:: ../README.rst
:start-after: begin_license
:end-before: end_license
.. note::
The CC BY-SA 4.0 license should not be an issue for most projects. However, you can
adopt a different font for icons if you need. See :ref:`nanogui_including_custom_fonts`.
Contents
========================================================================================
.. toctree::
:maxdepth: 2
usage
compilation
examples
api/library_root
contributing
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@@ -0,0 +1,36 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=python -msphinx
)
set SOURCEDIR=.
set BUILDDIR=_build
set SPHINXPROJ=NanoGUI
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The Sphinx module was not found. Make sure you have Sphinx installed,
echo.then set the SPHINXBUILD environment variable to point to the full
echo.path of the 'sphinx-build' executable. Alternatively you may add the
echo.Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:end
popd

View File

@@ -0,0 +1,4 @@
# Breathe and Sphinx 2.x are incompatible at this time
Sphinx==1.8.5
exhale
sphinx_rtd_theme

View File

@@ -0,0 +1,49 @@
Usage
========================================================================================
C++
----------------------------------------------------------------------------------------
There are effectively two ways that you can use NanoGUI in C++: have NanoGUI initialize
and manage the OpenGL context (and GLFW), or you do it manually.
1. If you are letting NanoGUI take over, you **must** call :ref:`function_nanogui__init`
before trying to do anything else. If you are managing OpenGL / GLFW yourself, make
sure you **avoid** calling this method.
2. Create an instance of :ref:`class_nanogui__Screen` (or a derivative class you have
written).
- NanoGUI managed OpenGL: call the explicit constructor.
- Self managed OpenGL: call the empty constructor.
- You must call the :func:`nanogui::Screen::initialize` method.
3. Add any Widgets, Buttons, etc. you want to the screen instance, and call the
:func:`nanogui::Screen::setVisible` and :func:`nanogui::Screen::performLayout`
methods of your instance.
4. Now that everything is ready, call :ref:`function_nanogui__mainloop`.
5. When all windows are closed, this function will exit, and you should follow it up
with a call to :ref:`function_nanogui__shutdown`.
:NanoGUI Managed OpenGL / GLFW:
Refer to :ref:`nanogui_example_2` for a concise example of what that all looks like.
:Self Managed OpenGL / GLFW:
Refer to :ref:`nanogui_example_3` for an as concise as possible example of what you
will need to do to get the :ref:`class_nanogui__Screen` to work.
Python
----------------------------------------------------------------------------------------
The Python interface is very similar to the C++ API. When you build NanoGUI with CMake,
a ``python`` folder is created with the library you ``import nanogui`` from. Though
there are implementation details that differ greatly, the documentation and build
process for the Python side is roughly the same. Refer to the
:ref:`nanogui_example_programs` and compare the source code for the two.
:ref:`nanogui_example_3` highlights the more notable differences between the APIs.
Specifically, that managing GLFW from Python has no meaning, as well as the main loop
for Python can easily be detached.