#+TITLE:    Blender 2.8 Reference Card
#+AUTHOR:   Philippe Estival
#+EMAIL: [[mailto:phil.estival@free.fr][   phil.estival@free.fr]]
#+DATE:     [2019-09-17 mar.]
#+KEYWORDS: cheatsheet, blender, latex, header, org-mode
#+OPTIONS:  toc:nil tangle:no
#+EXCLUDE_TAGS: noexport nx
#+SEQ_TODO: ⵝ TODO ? | DONE ✓
:latex:
#+latex_compiler: xelatex
#+LATEX_CLASS_OPTIONS: [a4paper, 8pt, twoside]
#+LATEX_HEADER: \input{header.tex} \input{./Blender2.8-cheatsheet.latex}
#+PROPERTY: header-args :results none
# Call: F5_to_tangle_one_block_and_compile()
# macro for newlines in export to latex, html and ascii
#+macro:  NL @@latex:\\@@ @@html:<br>@@ @@ascii:|@@
:end:
* TODO                                                             :noexport:
- find out why TODO sections gets included
- [2021-04-22 Thu 21:26] the results of a =call= is evaluated
  when exporting : hence the =t= that appears at the begining
  of the document if the call above is left active.
  Blender 2.8 Reference Card still compiles fine today :)
- [2021-04-22 Thu 22:09] apparently, I'm broking the entire
  exporter by modifying the org-export before-hook
  *CAUTION !*

* Quick start To produce the document                                                      :noexport:
activate the call above,
by appending the "+" sign to turn it into a #+Call
Run C-c to execute the corresping lisp block
Turn off the call
Press F5 to output the pdf.
Your viewer should refresh the document automatically.

This setup still suffers from a problem, as it will
break other latex export for this emacs session

- Be very carefull to further unmet call references when exporting
  as #+Calls directives are proceessed by the latex backend
  There might be a way to remove this stage from the stack.

  This inserts a /'t'/ right after \maketitle, resulting from
  the function execution.

- The local [[variables]] need to be loaded for proper utf8 processing.
  Emacs will load them when refreshing the header.
  Some utf code like [ ] <- this large space (U+3000) won't render
  in tablular mode. The left and right pointing arrow neither in texttt

- any modyfication of the local header (/Blender2.8-cheatsheet.latex),
  should be followed by an (org-babel-tangle)

[2019-11-04 lun.] the header is in [[./cs.org]]
There's one defined in this document, inherited
from the previous composition.

** TODO
- [ ] Shall we move header.tex in here ?
- [X] icons
- [ ] request for invert keymap function

* Status of this document                                                :nx:
[2019-09-15 dim.] initial draft
[2019-09-17 mar.] remarques et correction de V.Douzal
[2019-09-23 lun.] Merge of Musa Al-hassy's headers
                  as tex selectable sections
[2019-11-04 lun.] The header has its own file
                  Sections can be activated on demand.

This is two documents in one:

A latex document/header/compilation chain along
its explanations and a nice standardized
reference card for Blender 2.8.

This document was inspired by the work of [[http://www.cas.mcmaster.ca/~alhassm/][Musa
Al-hassy]] 's CheatSheet and still uses pieces
of it's code.
I moved into a more flexible and less scattered
file structure and added the tick/untick system I
wrote for my =init.org=.

You can find refcards provided by the /Free
Software Fundation/ for the software and packages
of your distribution in
: /usr/[local]/share/emacs/26.x/etc/refcards/

They're written in plain \LaTeX and provide sound
typesetting examples.

The other document use for the draft (that is,
before I test every key combination of the sheet)
comes from cgboost.com.

On a side note, regarding the design of a
cheetsheet, I must say that :
- putting capital letter at the begining of every
  word of a card wont make the readers memorize it
  faster or better, and
- don't lose space : two pages double sided
  maximum, one is even better, as the cheatsheet
  can live on the desk or in a book for years.
- even though the keyboard is engraved in capital
  letters, one should indicate distinctively,
  e.g., =r= or =R=. Sicne this is written in agreement
  with Emacs' Manual conventions, there a are
  three exceptions: =C=, =S= and =M= which denotes
  =Ctrl=, =Shif= and =Meta= (or =alt=) when they appear
  prior to an other key. There's no standard
  command build on c,s, ou m capital letters,
  but you're free to add yours.

* Possible improvements                                                  :nx:
When interactive keymaps are provided with an
application -- moreover when its a complex one
making extensive use of the keyboard -- the
learning process and memorization is fairly
improved.

To turn this document into an interactive
application : get into each exported section look
for table, get the second column, characters
between "=" sign.  A parser should understand the
key, and possible prefix (C- M-) The minus and
equal sign gets a special treatment.  Characters,
utfcode and sequence are converted to the
associated keycode.  This translation can be
provided by a standard linux keymap dictionnary
found in xorg configuration.

The target application (a PyQt app for instance)
understands prefix code and will use the generated
dictionary to lookup for a typed key.

Since keymaps are heavily customized by the users,
the next step wouuld be to provide something
compatible with the blender plugin infrastructure,
thus provide this document as learning base, then
to generate the other one from the user keymap.
This would help to provide the plugin in the
blender preference menu.  I don't know if it's
keymap mode can be intercepted.

To build the python =bpy module= : open the shell in
[[~/github/blender]].  then =make bpy=.
# re)run the latter as root if errors like file INSTALL cannot set permissions on [...] occur

#+begin_src python
import bpy
wm = bpy.context.window_manager
for view, keymap in wm.keyconfigs.default.keymaps.items() :
    print("* %s" % view)
    for k in keymap.keymap_items :
        print ( "| %s | =%s= |" % (k.name, k.to_string()))
#+end_src

* Composition ————————————————————————————————————————                   :nx:
** To convert the svg icons to pdf
these two files :
[[./blender-symbol.svg]]
[[./mousebtns.svg]]
[[shell:for files in *.svgz; do inkscape $files -A $(basename $files .svgz).pdf; done]]

** =latex_header_extra=
means put this command at the very end of the
header, right before =\begin{document}=.  This way
the user may invoke =landscapefalse= which will
thus compile to occuring before the following and
so disable the landscape setting.

This directives are mandatory :
# latex_header_extra: \iflandscape \usepackage[landscape, margin=1.5cm]{geometry} \else \usepackage[margin=1.5cm]{geometry} \fi
# latex_header_extra: \def\item{\vspace{\cheatsheetitemsep}\olditem}

I haven't figured out yet if this should go in a
particular section right before the document
begins, it's only one line, but that sort of wild
inclusion can create errors hard to track.

  [2019-11-04 lun.] putting it at the end of the cheatsheet.latex works (header 2)

** _local latex header_

As you are likely to use this kind of commands
over and over again, it is convenient to keep them
in a separate section.

** TODO Quickstart
todo : key binding & customs

Problem here to restore the org-before-processing-hook

This snippet (referenced in the /call/ in the
preamble), tangles only one block — a header file
— before latex'ing.

You can keep editing anywhere in the buffer, and
press F5 to compîle.

This is the preferred way to go if the header is small.

#+Name: F5_to_tangle_one_block_and_compile
#+begin_src elisp :tangle no :result
  (defun org-babel-tangle-block()
    (interactive)
    (let ((current-prefix-arg '(4)))
       (call-interactively 'org-babel-tangle)
  ))
  (defun tangle-header(arg)
      (org-babel-goto-named-src-block "neat-cheatsheet-heeder-header")
      (org-babel-tangle-block))

  (setq org-export-before-processing-hook '(tangle-header))
  (global-set-key (kbd "<f5>") 'org-latex-export-to-pdf)
  (minibuffer-message "<F5> is now bound to document compilation")
#+end_src
(org-latex-export-to-pdf)

To remove the auto inclusion,
in order to save a few hundreth of second on a compilation cycle,
or if the header is finished
: (setq org-export-before-processing-hook nil)
... but it's very unlikely to be
*this breaks the export system*

So we are left with two solutions :
find a way to restore the hook after change


to summarize : this is what we expect to export the file
   #+begin_src elisp
	 (org-babel-goto-named-src-block "neat-cheatsheet-heeder-header")
	 (let ((current-prefix-arg '(4)))
	   (call-interactively 'org-babel-tangle))
	 (org-latex-export-to-pdf)
   #+end_src

** DONE extra header


#+Name:neat-cheatsheet-heeder-header
#+Begin_src latex :tangle Blender2.8-cheatsheet.latex
% this is the neat cheatsheet heeder header tangled from one block
% [2019-09-18 mer.]
\usepackage{ccicons}
\usepackage{setspace}
% The titling package provides various user-friendly ways to modify title pages.
% It provides the macros \thetitle,
% \theauthor and \thedate which can be reused anywhere in your document.
%\usepackage{titling,parskip}
\def\maketitle{}

%\usepackage{eufrak} % for mathfrak fonts
\usepackage{multicol,xparse,newunicodechar}

% parskip gives nice default spacing between paragraphs.

% Obtain “AfterEndPreamble” hook;
% cannot use the “AtBeginDocument” hook since the color package uses that
% and together they would crash.
\usepackage{etoolbox}
\newif\iflandscape
\landscapetrue
%\renewcommand{\baselinestretch}{1}
%\usepackage{showframe}
%\renewcommand*\ShowFrameColor{\color{red}}
\def\cheatsheeturl{https://7d.nz/Blender-2-8-refcard.html}
\def\cheatsheetcols{4}

\landscapetrue
\def\cheatsheetitemsep{-0.5em}

\newunicodechar{𝑻}{\ensuremath{T}}
\newunicodechar{⊕}{\ensuremath{\oplus}}
\newunicodechar{≈}{\ensuremath{\approx}}
\newunicodechar{▲}{\blacktriangle}
\newunicodechar{▼}{\blacktriangledown}
\newunicodechar{►}{\blacktriangleright}
\newunicodechar{◄}{\blacktriangleleft}

\makeatletter
\renewcommand{\@seccntformat}[1]{}
\makeatother
%\theauthor \hfill {\tiny \mbox{\url{\cheatsheeturl}}} \hfill \thedate
%\hrule
% \vspace{1em}
%{\center \large\bf \thetitle \\ }

\pagenumbering{gobble}  % no page numbering

\makeatletter
\renewcommand\section[1]{
  \@startsection {section}{1}{0ex}% Level is 1, and indentation is 0
                 {-0.1ex}%{-3.5ex \@plus -1ex \@minus -.2ex}% space before heading
                 {-0.1em}% space after heading
                 % style:
		 { \color{black}\large\bfseries\hskip-2pt}* {\colorbox{white}{#1}}}

\renewcommand\subsection[1]{
  \@startsection {subsection}{2}{0ex}% Level is 1, and indentation is 0
                 {-0.1ex}%{-3.5ex \@plus -1ex \@minus -.2ex}% space before heading
                 {-0.1em \@plus 0.2em}% space after heading
                 % style:
		 { \color{black}\normalfont\bfseries\hskip 2pt}* {#1\newline \vskip-1.2em}}

%\renewcommand\section[1]{ \newline \vskip{1ex} {\bfseries \large #1 }}
\makeatother
%\fontsize{9}{10}\selectfont

%\newcommand\clipedicon[4]{
%   \makebox[#2]{\raisebox{#3}{\includegraphics[scale=#4,  clip, viewport=0 0 10 12]{\#1}}}}

%\def\LMB{\clipedicon{mousebtns.pdf 10pt -3ex 0.9}}
%\def\RMB{\clipedicon[mousebtns.pdf 10pt -3ex 0.9]}
%\def\MMB{\clipedicon[mousebtns.pdf 10pt -3ex 0.9]}
% TODO : a function for this
\def\raiseMB{-0.5pt}
\def\LMB{\makebox[10pt]{\raisebox{\raiseMB}{\includegraphics[scale=0.7, clip, viewport=0 0 13 12]{mousebtns.pdf}}}}
\def\RMB{\makebox[10pt]{\raisebox{\raiseMB}{\includegraphics[scale=0.7, clip, viewport=30 0 43.5 12]{mousebtns.pdf}}}}
\def\MMB{\makebox[10pt]{\raisebox{\raiseMB}{\includegraphics[scale=0.7, clip, viewport=15.7 0 25.7 12]{mousebtns.pdf}}}}
\def\MMBdrag{\makebox[13pt]{\raisebox{\raiseMB}{\includegraphics[scale=0.7, clip, viewport=78 0 90 12]{mousebtns.pdf}}}}
%\def\LMB{\includegraphics[scale=0.9, clip, viewport=0 1 10 10]{mousebtns.pdf}}}
%\def\LMB{\includegraphics[draft, bb=0 2 10 14, scale=0.9, clip]{mousebtns.pdf}}}
%\def\RMB{\includegraphics[bb=0 1 12 14, clip, viewport=12 0 24 14]{mousebtns.pdf}}}
%\def\RMB{\includegraphics[scale=0.85,bb=0 1 12 14, clip, viewport=10 1 22 14]{RMB.eps}}
%\def\MMB{\includegraphics[scale=0.85,bb=0 1 12 1]{LMB.eps}}
%\def\RMB{\includegraphics[bb=0 1 12 14, clip, viewport=12 1 24 14]{mousebtns.pdf}}}
%\def\MMB{\includegraphics[bb=0 1 12 14, clip, viewport=12 1 24 14]{mousebtns.pdf}}}
%\def\LMB{LMB} % for text

\iflandscape \usepackage[landscape, hmargin={1cm,1cm},vmargin=1cm]{geometry} \else \usepackage[margin=0.5in]{geometry}\fi
\def\item{\vspace{\cheatsheetitemsep}\olditem}
#+end_src

** local header composition
*** Compose header
The next block will act similarly to the above,
but will read the entire document looking for latex source
blocks marked as =:tangle yes=, and output them into the file
=Blender2.8-cheatsheet.latex=, that will get included as a header.
This inclusion is declared in the very first sections of the
document.

This is the preferred way to go when you need to
compose a complex header in a litterate style.

# key as a defcustom please
#+begin_src elisp :tangle no
  (setq org-export-before-processing-hook '(org-babel-tangle))
  (global-set-key (kbd "<f5>") 'org-latex-export-to-pdf)
  (minibuffer-message
    "<F5> is now bound to document compilation (all latex blocks
    forming the header)")
#+end_src

If you don't want include the preprocessing — when the header is
valid and doesn't need further modifications as a common use-case —
then don't forget to *tangle the following block* after you modify it
otherwise, the header wont be written on disc and any
changes would be ignored until next save.

*** *Splitted and commented header*

If you have a more complex header, you would probably
like to break into smaller code pieces

*** notice
#+begin_src latex :tangle yes
% this is the neat cheatsheet heeder header
#+end_src
*** packages
The creative commons icons
#+begin_src latex :tangle yes
\usepackage{ccicons}
#+end_src

*** show frame
Show frame, extremly usefull to understand
and debug the structure of a document
#+begin_src latex :tangle yes
%\usepackage{showframe}
%\renewcommand*\ShowFrameColor{\color{red}}
#+end_src

*** cheetsheep configuration
#+begin_src latex :tangle yes
\def\cheatsheeturl{https://7d.nz/Blender-2-8-refcard.html}
\def\cheatsheetcols{4}
\landscapetrue
\def\cheatsheetitemsep{-0.5em}
#+end_src

*** unicode character translation
The following unicode will be transliterated
to the other latex command on compilation.
#+begin_src  latex :tangle yes
\newunicodechar{𝑻}{\ensuremath{T}}
\newunicodechar{⊕}{\ensuremath{\oplus}}
\newunicodechar{≈}{\ensuremath{\approx}}
\newunicodechar{◄}{\blacktriangleleft} % wont work in the teletype environment
\newunicodechar{►}{\blacktriangleright}
\newunicodechar{▲}{\blacktriangle}
\newunicodechar{▼}{\blacktriangledown}
#+end_src

*** TODO title, pages options
#+begin_src latex :tangle yes
\makeatletter
\renewcommand{\@seccntformat}[1]{}
\makeatother
%\theauthor \hfill {\tiny \mbox{\url{\cheatsheeturl}}} \hfill \thedate
%\hrule
% \vspace{1em}
%{\center \large\bf \thetitle \\ }
\pagenumbering{gobble}  % no page numbering
#+end_src

*** DONE Section formatting
#+begin_src latex :tangle yes
\makeatletter
\renewcommand\section[1]{
  \@startsection {section}{1}{0ex}% Level is 1, and indentation is 0
                 {-0.1ex}%{-3.5ex \@plus -1ex \@minus -.2ex}% space before heading
                 {-0.1em}% space after heading
                 % style:
		 { \color{black}\large\bfseries\hskip-2pt}* {\colorbox{white}{#1}}}

\renewcommand\subsection[1]{
  \@startsection {subsection}{2}{0ex}% Level is 1, and indentation is 0
                 {-0.1ex}%{-3.5ex \@plus -1ex \@minus -.2ex}% space before heading
                 {-0.1em \@plus 0.2em}% space after heading
                 % style:
		 { \color{black}\normalfont\bfseries\hskip 2pt}* {#1\newline \vskip-1.2em}}

%\renewcommand\section[1]{ \newline \vskip{1ex} {\bfseries \large #1 }}
\makeatother
#+end_src


The document begins.



#+RESULTS:
: header.tex

# To tangle everything :
# PROPERTY: header-args :tangle "all.tex"
# To tangle only the block marked :tangle yes
# PROPERTY: header-args:elisp: :tangle "snipet.lisp"
# then (org-tangle-file)


* \vskip-2em\Large Blender 2.8{{{NL}}}Reference Card

\includegraphics[scale=2,viewport=-10 0 21 2]{blender-symbolic.pdf}
# \includegraphics[scale=0.7]{mousebtns.pdf}
# %\Large.\Sun\normalsize
# %\scalebox{0.9}{\medbullet}  \hskip -0.67em \raisebox{0.5em}{\blacksquare \medbullet}
\footnotesize
In agreement with Emacs' Manual conventions,
the modifiers keys =Ctrl=, =Meta= (or =Alt=), and =Shift=,
are denoted as =C-=, =M-= and =S-= ,
the spacebar as =SPC=, the right numeric keypads (or numpads) keys
are enclosed by =[ ]=.
# Left, right, middle-mouse button are =LMB=, =RMB=, =MMB=.

Left, right and middle mouse button are depicted
as \LMB \RMB \MMB, while \MMBdrag means pressing
middle button and dragging.  Like in Blender 2.79,
the right mouse button prevales in the following
configuration.

Toggle command are prefixed by  \normalsize \bullet
\footnotesize
# The function of the spacebar and the inversion of the left and right
# mouse button can be configured in the  preferences/input.

To search in the keymap an item by its key,
go to the preferences (=C-M-u)=,
change the filter to /Key Binding/ and provide some characters
of the key combination.

\small
\vskip -0.5ex
\normalsize
# | =C-key= | Ctrl + key  | =LMB=    | left mouse button |
# | =M-key= | Meta + key  | =RMB=    | right,            |
# | =S-key= | Shift + key | =MMB=    | middle,           |
# | =SPC=   | space       | =kp-key= | keypad [0-9.]     |
# (local-set-key (kbd "<A-u>") 'upcase-char)
# notation

** keys                                                                  :nx:
# ATTR_LATEX: :center nil :align ll|rl
|    | Modifier | Mouse    | button        |
| =C-= | Ctrl     | \LMB \RMB \MMB | left, right, middle |
| =M-= | Meta     | \MMBdrag | middle + drag |
| =S-= | Shift    |

# | =[key]=      numpad =[0-9.+-]= |
# | Toggle command  \bullet    |

** Keys                                                            :noexport:

| =A=   | alt   | =D-=   | Drag (with below)  |
| =S=   | shift | =RMB=  | right mouse button |
| =C=   | ctrl  | =MMB=  | middle-            |
| =SPC= | spâce | =LMB=  | left-              |
|     |       | =N[x]= | numpad [0-9.]      |
\vskip -0.5ex

# (local-set-key (kbd "<A-u>") 'upcase-char)

* General
** Navigation
| rotate | \MMBdrag                 |
| pan    | =S-=\MMBdrag               |
| zoom   | Mousewheel or =C-=\MMBdrag |
| select | \LMB or \RMB             |
** General
| animation playback   | =SPC=          |
| search               | =F3/SPC=        |
| delete               | =x (confirm d)= |
|                      | or =DEL=        |
| join objects         | =C-j=           |
| undo/redo            | =C-z / S-C-z=   |
| rename object        | =F2=            |
| mirror on x/y/z axis | =C-m x/y/z=     |

** View
| views pie menu       | =~=     |
| center selected      | =[.]=    |
| • maximize area      | =C-SPC=   |
| • full screen area   | =C-M-SPC= |
| • X-ray view         | =M-z=     |
| • wireframe view     | =S-z=     |
| shading pie menu     | =z=       |
| relative view        |         |
| \quad axis switching | =M-=\MMBdrag  |
# | walk navigation      | =S-^=     |
#+TBLFM: $2=M-=\MMBdrag

** View change
| front | =[1]= | back   | =C-[1]= |
| right | =[3]= | left   | =C-[3]= |
| top   | =[7]= | bottom | =C-[7]= |

** Transform
\vskip -2pt
| move (grab) / rotate / scale | =g/r/s= |
\vskip -4pt
# | grab/rotate/scale | =g/r/s=        |
| along global axis | =g/r/s x/y/z=    |
| along local axis  | =g/r/s xx/yy/zz= |
\vskip -4pt
| reset                   |         |
| position/scale/rotation | =M-g/r/s= |
\vskip -4pt
| rotate/move around pivot | =S-w= |
\vskip -4pt
| • snapping         | =S-TAB=     |
| free rotate        | =r r=       |
| duplicate / linked | =S-d / M-d= |
| apply transform    | =C-a=       |
| bend angle         | =S-w=       |
** Selection
| select / deselect all | =a / M-a= |
| invert selection      | =C-i=     |

| circle  | =c=   |
| grouped | =S-g= |
| linked  | =S-l= |
[fn:2] you can choose either left click select (default) or right click select in the   |preferences under input.
** Modes
| edit/object mode     |  =TAB= |
| all modes (pie menu) |  =C-TAB= |
** Menus
| toolbar              | =S-SPC= |
| quick favorites      | =q=     |
| add menu             | =S-a=   |
| cursor pie menu      | =S-s=   |
| tool shelf •         | =t=     |
| sidebar •            | =n=     |
| context Menu         | =w=     |
| item context menu    |\RMB   |
| orientation pie menu | =,=     |
| pivot pie menu       | =.=     |
| snapping pie menu    | =S-s=   |

** Hide/show
| hide            | =h=   |
| unhide all      | =M-h= |
| hide unselected | =S-h= |
| local view      | =/=   |
** Editors \hskip 4.5em =S-=
| file browser         | =F1=  |
| movie clip editor    | =F2=  |
| shader editor        | =F3=  |
| texture node editor  | =F3=  |
| python console       | =F4=  |
| 3d viewport          | =F5=  |
| graph editor/drivers | =F6=  |
| properties           | =F7=  |
| video sequencer      | =F8=  |
| outliner             | =F9=  |
| text editor          | =F11= |
| image/UV editor      | =F10= |
| compositing/         |     |
| dope sheet/timeline  | =F12= |

** Collections
| fold/unfold        | =+/-= |
| move               | =m=   |
| create             | =c=   |
| link to collection | =S-m= |


** Relationships
| set parent   |  =C-p= |
| clear parent |  =M-p= |
| make links   |  =C-l= |
# > apply multiple mat to objects
** Camera
| camera view                 | =[0]=     |
| align camera to view        | =C-M-[0]= |
| set active object as camera | =C-[0]=   |


** File
   :PROPERTIES:
   :date:     [2019-11-04 23:55:51]
   :updated:  [2019-11-04 23:55:51]
   :END:
| context menu | =F4=    |
| save         | =C-s=   |
| save as      | =C-S-s= |
| new file     | =C-n=   |
| quit blender | =C-q=   |
** Rendering
| render image            | =F12=   |
| render animation        | =C-F12= |
| play rendered animation | =C-F11= |
| set render region       | =C-b=   |
| reset render region     | =C-M-b= |

* Edit mode
** Selection
| (\bullet) vertex/edge/face | =(S-) 1 2 3= |
| select linked              | =C-l=        |
| select linked under cursor | =l=          |
| grow/shrink selection      | =C-[+]/[-]=  |
| select edge loop           | =M-=\RMB     |
| select edge ring           | =C-M-=\RMB   |
| slide edge selection       | =g g=        |
| select mirror              | =C-S-m=      |
** Tools
| flip normals        | =C-f=     |
| extrude             | =e=       |
| bevel               | =C-b=     |
| loopcut             | =C-r=     |
| knife cut           | =k=       |
| inset face          | =i=       |
| separate            | =p=       |
| unwrap              | =u=       |
| fill face           | =f=       |
| shrink/fatten       | =a s=     |
| rip fill            | =M-v=     |
| shear               | =S-C-M-s= |
| to sphere           | =S-M-s=   |
| split               | =y=       |
| rip                 | =v=       |
| triangulate         | =C-t=     |
| merge selected      | =M-m=     |
| recalculate normals | =s n=     |
** Proportional editing
| edit / connected | =o / M-o= |
** Vertex Groups
| assign to / remove from  | =C-g / C-M-g=  |
# | Remove from | =C-M-g= |

* Sculpting
** Control
| stroke method menu | =e=   |
| angle control      | =r=   |
| brush size         | =f=   |
| brush strength     | =S-f= |
| brush angle        | =C-f= |
** Masking
| mask        | =m=   |
| clear mask  | =M-m= |
| invert mask | =C-i= |
| box mask    | =b=   |
** Brushes
#+ATTR_LATEX: :center nil :align ll|ll
| grab       | =g= | smooth  | =s= or =S-D-= |
| box hide   | =h= | draw    | =x=         |
| inflate    | =i= | clay    | =c=         |
| snake hook | =k= | crease  | =S-c=       |
| layer      | =l= | flatten | =S-t=       |
| pinch      | =p= |         |           |

|             | =S-SPC= |
| clay strips | =1=     |
| blob        | =2=     |
| fill        | =3=     |
| scrape      | =4=     |
| thumb       | =5=     |
| nudge       | =6=     |
| rotate      | =7=     |
| simplify    | =8=     |
* Materials & postproduction
** Shader editor and compositing
| group                 | =C-g=      |
| ungroup               | =C-a g=    |
| edit group •          | =TAB=      |
| join in new frame     | =C-j=      |
| cut links             | =S-SPC, 6= |
| delete with reconnect | =C-x=      |
|                       |          |
|                       |          |
** Compositing
Background image
| move     | =M-=\MMB |
| zoom out | =v=     |
| zoom in  | =M-v=   |

*Image editor*
| new/open/save | =M-n/o/s= |
| save as | =S-s= |

** UV editor
| mark seam             | =C-e=   |
| select split          | =y=     |
| grow/shrink selection | =C-[+]/[-]= |
| stitch                | =v=     |
| pin                   | =p=     |
| unpin                 | =M-p=   |
** Paint (image editor)
| sample color      | =s=   |
| brush size        | =f=   |
| brush strength    | =S-f= |
| brush colors flip | =x=   |
* Animation
| insert keyframe  | =i=   |
| delete keyframes | =M-i= |

** Video sequencer
| next previous strip  | =Page==/=|
| set start/end frame  | =C-home/end= |
| cut strips           | =k=          |
| mute strips          | =h=          |
| unmute strips        | =M-h=        |
| meta-strip •         | =TAB=        |
| make meta-strip      | =C-g=        |
| unmeta-strip         | =C=          |
| view frame           | =[0]=        |
| view selected        | =[.]=        |
| snap strips to frame | =S-s=        |
| trim strips          | =S=          |
** Graph editor
| add f-curve modifier | =S-C-m= |
| hide channels        | =h=     |
| unhide channels      | =M-h=   |
| smooth keys          | =M-o=   |

*Drivers*
| add driver    |  =C-d= |
| remove driver | =C-M-d= |
** Nonlinear animation
| add action strip    | =S-a=      |
| add action strip    | =S-a=      |
| add transition      | =S-t=      |
| add sound clip      | =S-k=      |
| remove meta-strips  | =C-a g=    |
| split strips        | =y=        |
| • muting            | =h=        |
| swap strips         | =M-f=      |
| move strips up/down | =Page==/=|

** Timeline/dopesheet/graph editor
| play/stop animation         | =SPC=     |
| play/stop animation reverse | =C-s SPC= |
| set preview range           | =p= \LMBdrag |
| clear preview range         | =a p=     |
| next/previous frame         |=/=|
| jump to first/last frame    | =S==/=|
| frames/seconds •            | =C-t=     |
| mirror keyframes            | =C-m=     |
| sample keyframes            | =S-a o=   |
| select more/less            | =C-+/-=   |
| select linked               | =l=       |
| jump to keyframes           | =C-g=     |
| set keyframe handle type    | =v=       |
| set keyframe interpolation  | =t=       |
| set keyframe easing type*   | =C-e=     |
| add time marker             | =m=       |
| rename marker               | =C-m=     |
| find channels               | =C-f=     |
| view selected               | =N.=      |
* Grease pencil
| Menu | =S-SPC= |
| brush size             | =f=        |
| brush strength         | =S-f=      |

** Draw Mode
| enable parallel guides | =L=        |
| enable circular guides | =C=        |
| box erase              | =b=        |
** Sculpt mode
| select box     | =b=   |
** Edit mode
| move / rotate / scale | =g/r/s=   |
| extrude | =e=       |
| radius  | =M-s=     |
| bend s  | =w=       |
| shear   | =S-C-M-s= |
* Organisation
** Outliner
| new collection     | =c=   |
| delete collection  | =x=   |
| move to collection | =m=   |
| link to collection | =s m= |
| set exclude        | =e=   |
| clear exclude      | =a e= |
** File browser
| next/previous | =M-==/=|
| parent file          | =M-=|
| create new directory | =i=     |
| add bookmark         | =C-b=   |
\vfill
\onehalfspacing
\sffamily \scriptsize Copyright © 2019 Philippe ESTIVAL \sffamily *[[mailto:phil.estival@free.fr][phil.estival@free.fr]]* \rmfamily\\
Licensed under the \sffamily GFDL 1.3 License. You're free to copy, modify or redistribute
this document.
# Creative Commons Attribution 4.0 International
# (CC-BY 4.0) https://creativecommons.org/licenses/by/4.0/deed.en
# \ccby\quad\ccRemix\ccSampling
\rmfamily\normalsize\singlespacing

* Blender tutorials                                                      :nx:
The BEST Way to Learn Blender 2.8 https://www.youtube.com/watch?v=mdcs8uf7UOs
Blender 2.8 First Steps Playlist: https://www.youtube.com/playlist?list...
Grant Abbitt Beginner Course: https://www.youtube.com/playlist?list...
YanSculpts Beginner Modeling Course: https://www.youtube.com/playlist?list...
Blender Guru Introduction to 2.8: https://www.youtube.com/playlist?list...

* variables                                                              :nx:

# Local Variables:
# org-latex-tables-centered: nil
# eval: (org-display-inline-images t t)
# org-latex-inputenc-alist: (("utf8" . "utf8x"))
# End: