adds docs for new geonodes corners_of_edge #104464

Merged
Hans Goudey merged 12 commits from F_Scociety/blender-manual:corners_of_edge into main 2023-06-06 16:06:44 +02:00
105 changed files with 10575 additions and 1022 deletions
Showing only changes of commit 1e1e3e2559 - Show all commits

View File

@ -1,2 +0,0 @@
build
locale

View File

@ -22,6 +22,13 @@ Checking
- check_structure to check the structure of all .rst files. - check_structure to check the structure of all .rst files.
- check_syntax to check the syntax of all .rst files. - check_syntax to check the syntax of all .rst files.
- check_spelling to check spelling for text in RST files. - check_spelling to check spelling for text in RST files.
Utilities
---------
- update to update the repository to the most recent version.
- format_py to auto-format Python scripts.
endef endef
# HELP_TEXT (end) # HELP_TEXT (end)
@ -117,6 +124,12 @@ report_po_progress:
@python3 tools_report/report_translation_progress.py --quiet \ @python3 tools_report/report_translation_progress.py --quiet \
`find locale/ -maxdepth 1 -mindepth 1 -type d -not -iwholename '*.git*' -printf 'locale/%f\n' | sort` `find locale/ -maxdepth 1 -mindepth 1 -type d -not -iwholename '*.git*' -printf 'locale/%f\n' | sort`
update:
@git pull --rebase
format_py:
@autopep8 --in-place --recursive .
# ---------------------- # ----------------------
# Help for build targets # Help for build targets

View File

@ -63,6 +63,11 @@ if "%1" == "help" (
echo - check_structure to check the structure of all .rst files echo - check_structure to check the structure of all .rst files
echo - check_syntax to check the syntax of all .rst files echo - check_syntax to check the syntax of all .rst files
echo - check_spelling to check spelling for text in RST files echo - check_spelling to check spelling for text in RST files
echo.
echo Utilities
echo ---------
echo.
echo - update to update the repository to the most recent version.
goto EOF goto EOF
) )
@ -109,6 +114,10 @@ if "%1" == "check_structure" (
python tools_rst\rst_check_images.py python tools_rst\rst_check_images.py
goto EOF goto EOF
if "%1" == "update" (
git pull --rebase
goto EOF
) else ( ) else (
%SPHINXBUILD% -M %1 "%SOURCEDIR%" "%BUILDDIR%" %SPHINXOPTS% %O% %SPHINXBUILD% -M %1 "%SOURCEDIR%" "%BUILDDIR%" %SPHINXOPTS% %O%
goto EOF goto EOF

View File

@ -8,9 +8,10 @@ In this case you need only enable the Add-on in the Add-on Preferences.
However, the latest releases can be found on our GitHub. However, the latest releases can be found on our GitHub.
Downloads should only be taken the from the official releases page: Downloads should only be taken the from the
`official releases page <https://github.com/Clockmender/Precision-Drawing-Tools/releases>`__.
https://github.com/Clockmender/Precision-Drawing-Tools/releases
Patches and Commits, that may add new features and/or bug fixes may be downloaded Patches and Commits, that may add new features and/or bug fixes may be downloaded
from the Commits to the Master branch, no development code should be used from the Commits to the Master branch, no development code should be used
@ -55,6 +56,6 @@ again only edit the message section in quotes, not the PDT assignments.
Issues Issues
====== ======
Please report any issues, or feature request, etc. using the Issues section Please report any issues, or feature request, etc. using the Issues section of the
of the PDT Repository (https://github.com/Clockmender/Precision-Drawing-Tools/issues), `PDT Repository <https://github.com/Clockmender/Precision-Drawing-Tools/issues>`__,
that way they can be properly tracked, actioned and incorporated into the add-on. that way they can be properly tracked, actioned and incorporated into the add-on.

View File

@ -0,0 +1,11 @@
#############
Baking
#############
These add-ons add UI elements for faster baking access.
.. toctree::
:maxdepth: 1
vdm_brush_baker.rst

View File

@ -0,0 +1,36 @@
*******
VDM Brush Baker
*******
This is a small add-on that makes it easy to create vector displacement map (aka VDM) brushes in Blender.
Sculpting setups and the brushes can be created with one click.
Activation
==========
- Open Blender and go to Preferences then the Add-ons tab.
- Switch the category to "Baking"
- Enable the "VDM Brush Baker" addon.
Interface
=========
Located in the :menuselection:`3D Viewport --> Sidebar --> Tools`.
Usage
=====
Use the "Create Sculpting Plane" button for an optimal startign setup for sculpting your own VDM brush.
Use the "Render and Create VDM Brush" button to covnert bake the plane into a new brush.
The brush will be added with all relevant options and a vector displacement map
is saved near the blender file as an Open EXR file (or a 'tmp' folder if the blender file wasn't saved).
New brushes can be found as Draw brushes in sculpt mode.
The add-on won't create any preview images for these brushes.
Tips
----
- While Sculpting make sure to mask the borders of the plane for a better result.
- If your VDM brush gets cut off at the corners, you can increase the size inside the texture panel of the brush settings to 1.1 or 1.2 for each axis.
- A vdm-resolution of 512 px or lower is usually enough. Unless you have extremely detailed sculptings

View File

@ -42,14 +42,15 @@ See `Examples`_ at the end of this page.
- A list of software that deals with PDB in different ways can be found on - A list of software that deals with PDB in different ways can be found on
the `RCSB site <https://www.rcsb.org/docs/additional-resources/molecular-graphics-software>`__. There also is the `RCSB site <https://www.rcsb.org/docs/additional-resources/molecular-graphics-software>`__. There also is
`Vesta <https://jp-minerals.org/vesta/en/>`__, `ASE <https://wiki.fysik.dtu.dk/ase/>`__ and all the `Vesta <https://jp-minerals.org/vesta/en/>`__, `ASE <https://wiki.fysik.dtu.dk/ase/>`__ and all the
`quantum chemical calculators <https://en.wikipedia.org/wiki/List_of_quantum_chemistry_and_solid-state_physics_ `quantum chemical calculators
software>`__ used in research, which can create or even calculate atomic structures and store them in PDB/XYZ <https://en.wikipedia.org/wiki/List_of_quantum_chemistry_and_solid-state_physics_software>`__
files. used in research, which can create or even calculate atomic structures and store them in PDB/XYZ files.
.. seealso:: **Forum** .. seealso:: **Forum**
- Please, use the `Blender Artists forum <https://blenderartists.org/t/atomic-blender-pdb-xyz-for-blender-2-8-and- - Please, use the `Blender Artists forum
higher/1197801>`__ for comments and questions or directly the `Blender chat <https://blender.chat/home>`__. <https://blenderartists.org/t/atomic-blender-pdb-xyz-for-blender-2-8-and-higher/1197801>`__
for comments and questions or directly the `Blender chat <https://blender.chat/home>`__.
- There also is the possibility to ask questions on `Stack Exchange <https://blender.stackexchange.com/>`__. - There also is the possibility to ask questions on `Stack Exchange <https://blender.stackexchange.com/>`__.
However, note that some of the developers like Blendphys don't have enough credits, which are, however, needed to However, note that some of the developers like Blendphys don't have enough credits, which are, however, needed to
have the permission for giving answers on Stack Exchange. have the permission for giving answers on Stack Exchange.

View File

@ -7,7 +7,7 @@ Autodesk 3DS
:Category: Import-Export :Category: Import-Export
:Menu: :menuselection:`File --> Import/Export --> 3D Studio (.3ds)` :Menu: :menuselection:`File --> Import/Export --> 3D Studio (.3ds)`
:Version: 2.3.4 :Version: 2.4.1
:Blender: 3.6 :Blender: 3.6
:Authors: Bob Holcomb, Campbell Barton, Sebastian Schrand :Authors: Bob Holcomb, Campbell Barton, Sebastian Schrand
:Maintainer: Sebastian Sille (NRGSille) :Maintainer: Sebastian Sille (NRGSille)
@ -36,7 +36,7 @@ Image Search
This enables a recursive file search if an image file can't be found. This enables a recursive file search if an image file can't be found.
Read Keyframe Read Keyframe
Reads the keyframe tracks from a 3ds file and transforms the objects to the data wich was found. Reads the keyframe tracks from a 3ds file and transforms the objects to the data which was found.
Usually only one frame is found in static scenes, it will be imported to the timeline. Usually only one frame is found in static scenes, it will be imported to the timeline.
If the 3ds scene is animated, the complete animation will be imported to the timeline. If the 3ds scene is animated, the complete animation will be imported to the timeline.
@ -60,7 +60,7 @@ Apply Transform
World Space World Space
Use world matrix instead of local matrix to transform the objects. Use world matrix instead of local matrix to transform the objects.
This is useful for older 3ds files from 3D Studio DOS wich only used world space to transform the objects. This is useful for older 3ds files from 3D Studio DOS which only used world space to transform the objects.
It is also useful if the object was exported without apply transform. It is also useful if the object was exported without apply transform.
@ -73,6 +73,10 @@ Include
Selection Only Selection Only
When checked, only selected objects are exported. Otherwise export all objects in the scene. When checked, only selected objects are exported. Otherwise export all objects in the scene.
Write Keyframe
Writes the keyframe section of a 3ds file and exports the animation if an action was found.
The animation can be imported the same way, un-check if any importer crashes,
not every application can handle the keyframe section.
Transform Transform
^^^^^^^^^ ^^^^^^^^^
@ -88,11 +92,11 @@ Forward / Up
Materials Materials
========= =========
Materials in 3ds are defined in various color and percent chunks wich can include Materials in 3ds are defined in various color and percent chunks which can include
either integer percent and 24bit color values or float color and percent values, either integer percent and 24bit color values or float color and percent values,
both can be read by the importer and will be converted to blender values. both can be read by the importer and will be converted to blender values.
The exporter uses the integer values, since this is used from 3ds version 3 and above. The exporter uses the integer values, since this is used from 3ds version 3 and above.
The material definitions wich Blender can use are the following: The material definitions which Blender can use are the following:
- 3ds Diffuse Color <-> blender Base Color - 3ds Diffuse Color <-> blender Base Color
- 3ds Specular Color <-> blender Specular Color - 3ds Specular Color <-> blender Specular Color
@ -101,8 +105,8 @@ The material definitions wich Blender can use are the following:
- 3ds Mat Shin2 <-> blender Specular Intensity - 3ds Mat Shin2 <-> blender Specular Intensity
- 3ds Mat Shin3 <-> blender Metallic - 3ds Mat Shin3 <-> blender Metallic
- 3ds Mat Opacity <-> blender Alpha inverted - 3ds Mat Opacity <-> blender Alpha inverted
- 3ds Mat Bump PCT <-> blender Normalmap Strength - 3ds Mat Bump PCT <-> blender Normal-map Strength
- 3ds Self Illum PCT <-> blender Emission Strength - 3ds Self Illumination PCT <-> blender Emission Strength
Textures Textures
@ -111,8 +115,8 @@ Textures
Each 3ds material can include different texture mappings, Each 3ds material can include different texture mappings,
which are all imported to Blender material nodes including texture coordinates. which are all imported to Blender material nodes including texture coordinates.
The 3ds exporter basically takes the images and coordinates, The 3ds exporter basically takes the images and coordinates,
wich are directly connected to the Principled BSDF shader, which are directly connected to the Principled BSDF shader,
if an image is connected to a colormix shader, it will exported as secondary texture. if an image is connected to a color-mix shader, it will exported as secondary texture.
Shininess maps to roughness and opacity to the alpha channel, Shininess maps to roughness and opacity to the alpha channel,
they must be color inverted afterwards to match with Blender definition. they must be color inverted afterwards to match with Blender definition.
The material mappings are defined as following: The material mappings are defined as following:
@ -122,9 +126,9 @@ The material mappings are defined as following:
- 3ds Shininess Map <-> blender Roughness Texture - 3ds Shininess Map <-> blender Roughness Texture
- 3ds Reflection Map <-> blender Metallic Texture - 3ds Reflection Map <-> blender Metallic Texture
- 3ds Opacity Map <-> blender Alpha Texture - 3ds Opacity Map <-> blender Alpha Texture
- 3ds Self Illum Map <-> blender Emission Texture - 3ds Self Illumination Map <-> blender Emission Texture
- 3ds Bump Map <-> blender Normal Map (tangent space) - 3ds Bump Map <-> blender Normal Map (tangent space)
- 3ds Tex2 Map <-> blender Color Texture (connect to mixshader) - 3ds Tex2 Map <-> blender Color Texture (connect to mix-shader)
.. figure:: /images/addons_io_3ds_material-nodes.jpg .. figure:: /images/addons_io_3ds_material-nodes.jpg
@ -140,12 +144,12 @@ Meshes
====== ======
Meshes are made of triangles only, no quads are supported, Meshes are made of triangles only, no quads are supported,
3ds Studio uses edge visibilty flags to hide and show edges, many 3ds files use them to mark the quads. 3ds Studio uses edge visibility flags to hide and show edges, many 3ds files use them to mark the quads.
The Blender 3ds importer and exporter will use those flags to mark edges sharp, The Blender 3ds importer and exporter will use those flags to mark edges sharp,
this can be used to convert the triangles back to quads. this can be used to convert the triangles back to quads.
The importer can read the smoothchunk and shades a face smooth if it belongs to a smoothgroup, The importer can read the smooth-chunk and shades a face smooth if it belongs to a smooth-group,
the exporter creates a smooth chunk if the mesh contains any smooth faces. the exporter creates a smooth chunk if the mesh contains any smooth faces.
3ds only supports one pair of UV coordinates per vertex. If any vertex has more UVs, it will be dublicated. 3ds only supports one pair of UV coordinates per vertex. If any vertex has more UVs, it will be duplicated.
Ambient Ambient
@ -178,3 +182,4 @@ Keyframes
The importer can read the keyframes, they will be added to the timeline. The importer can read the keyframes, they will be added to the timeline.
Most animations will play, but the transformations may not be correct, Most animations will play, but the transformations may not be correct,
some axes or rotations can be inverted. It depends on how it was exported from other applications. some axes or rotations can be inverted. It depends on how it was exported from other applications.
The exporter can write the keyframes of the timeline to an animated 3ds file.

View File

@ -6,7 +6,7 @@ AutoCAD DXF
.. reference:: .. reference::
:Category: Import-Export :Category: Import-Export
:Menu: :menuselection:`File --> Import/Export --> AutoCAD DXF` :Menu: :menuselection:`File --> Import/Export --> AutoCAD DXF (.dxf)`
.. _dxf-import: .. _dxf-import:

View File

@ -27,6 +27,7 @@ Add-ons Category Listings
add_curve/index.rst add_curve/index.rst
add_mesh/index.rst add_mesh/index.rst
animation/index.rst animation/index.rst
baking/index.rst
camera/index.rst camera/index.rst
development/index.rst development/index.rst
import_export/index.rst import_export/index.rst

View File

@ -330,7 +330,7 @@ Timeline Extra Info
Display amount of frames left until Frame End, very handy especially when rendering an animation or OpenGL preview. Display amount of frames left until Frame End, very handy especially when rendering an animation or OpenGL preview.
Display current/end time in `SMPTE <https://en.wikipedia.org/wiki/SMPTE_timecode>`_. Display current/end time in `SMPTE <https://en.wikipedia.org/wiki/SMPTE_timecode>`__.
Usage: Find it in the Timeline Editor's header. Usage: Find it in the Timeline Editor's header.
@ -381,7 +381,7 @@ Sequencer: Display Image File Name
When seeking through an image sequence, display the active strips' When seeking through an image sequence, display the active strips'
file name for the current frame, and its playhead (in square brackets). file name for the current frame, and its playhead (in square brackets).
Usage: Find it in the VSE header. Usage: Find it in the sequencer header.
EXR Render: Warn when Z not connected EXR Render: Warn when Z not connected

View File

@ -414,8 +414,8 @@ that generate the various patterns of many living organisms.
See `this video <https://youtu.be/J-0NzU1TmIY>`__ for an example of the Reaction-Diffusion simulation with Tissue. See `this video <https://youtu.be/J-0NzU1TmIY>`__ for an example of the Reaction-Diffusion simulation with Tissue.
Radom Materials Random Materials
--------------- ----------------
(To Do) (To Do)

View File

@ -76,7 +76,7 @@ Timeline Scrub
Call a timeline popup at mouse position to scrub without leaving the 3D viewport. Call a timeline popup at mouse position to scrub without leaving the 3D viewport.
Default shortcut to call the timeline is :kbd:`Alt-MMB`. Default shortcut to call the timeline is :kbd:`Alt-MMB`.
The shortcut enable the scrubbing when hovering timeline editors as well (dopesheet, sequencer, etc). The shortcut enable the scrubbing when hovering timeline editors as well (dope-sheet, sequencer, etc).
Scene start/end and keyframes are represented with symbols on the timeline. Scene start/end and keyframes are represented with symbols on the timeline.

View File

@ -43,7 +43,7 @@ Presets
*This will work even without the UI template list patch.* *This will work even without the UI template list patch.*
Set Scale/Clear Scale Set Scale/Clear Scale
Copy the render scale setting (below resolution controls, in *Dimensions* panel). Copy the render scale setting (below resolution controls, in *Format* panel).
Highly useful to do preview renders! Highly useful to do preview renders!
Set Resolution/Clear Resolution Set Resolution/Clear Resolution

View File

@ -1,6 +1,5 @@
.. DO NOT EDIT THIS FILE, GENERATED BY 'blender_help_extract.py' .. DO NOT EDIT THIS FILE, GENERATED BY 'blender_help_extract.py'
CHANGES TO THIS FILE MUST BE MADE IN BLENDER'S SOURCE CODE, SEE: CHANGES TO THIS FILE MUST BE MADE IN BLENDER'S SOURCE CODE, SEE:
https://projects.blender.org/blender/blender/src/branch/main/source/creator/creator_args.c https://projects.blender.org/blender/blender/src/branch/main/source/creator/creator_args.c
@ -10,10 +9,8 @@
Command Line Arguments Command Line Arguments
********************** **********************
| Blender |BLENDER_VERSION|
Blender |BLENDER_VERSION| | Usage: ``blender [args ...] [file] [args ...]``
Usage: blender [args ...] [file] [args ...]
.. _command-line-args-render-options: .. _command-line-args-render-options:
@ -22,10 +19,13 @@ Render Options
``-b``, ``--background`` ``-b``, ``--background``
Run in background (often used for UI-less rendering). Run in background (often used for UI-less rendering).
``-a``, ``--render-anim`` ``-a``, ``--render-anim``
Render frames from start to end (inclusive). Render frames from start to end (inclusive).
``-S``, ``--scene`` ``<name>`` ``-S``, ``--scene`` ``<name>``
Set the active scene ``<name>`` for rendering. Set the active scene ``<name>`` for rendering.
``-f``, ``--render-frame`` ``<frame>`` ``-f``, ``--render-frame`` ``<frame>``
Render frame ``<frame>`` and save it. Render frame ``<frame>`` and save it.
@ -33,12 +33,16 @@ Render Options
* A comma separated list of frames can also be used (no spaces). * A comma separated list of frames can also be used (no spaces).
* A range of frames can be expressed using ``..`` separator between the first and last frames (inclusive). * A range of frames can be expressed using ``..`` separator between the first and last frames (inclusive).
``-s``, ``--frame-start`` ``<frame>`` ``-s``, ``--frame-start`` ``<frame>``
Set start to frame ``<frame>``, supports +/- for relative frames too. Set start to frame ``<frame>``, supports +/- for relative frames too.
``-e``, ``--frame-end`` ``<frame>`` ``-e``, ``--frame-end`` ``<frame>``
Set end to frame ``<frame>``, supports +/- for relative frames too. Set end to frame ``<frame>``, supports +/- for relative frames too.
``-j``, ``--frame-jump`` ``<frames>`` ``-j``, ``--frame-jump`` ``<frames>``
Set number of frames to step forward after each rendered frame. Set number of frames to step forward after each rendered frame.
``-o``, ``--render-output`` ``<path>`` ``-o``, ``--render-output`` ``<path>``
Set the render path and file name. Set the render path and file name.
Use ``//`` at the start of the path to render relative to the blend-file. Use ``//`` at the start of the path to render relative to the blend-file.
@ -57,13 +61,36 @@ Render Options
blender -b animation.blend -o //render_ -F PNG -x 1 -a blender -b animation.blend -o //render_ -F PNG -x 1 -a
``//render_`` becomes ``//render_####``, writing frames as ``//render_0001.png`` ``//render_`` becomes ``//render_####``, writing frames as ``//render_0001.png``
``-E``, ``--engine`` ``<engine>`` ``-E``, ``--engine`` ``<engine>``
Specify the render engine. Specify the render engine.
Use ``-E help`` to list available engines. Use ``-E help`` to list available engines.
``-t``, ``--threads`` ``<threads>`` ``-t``, ``--threads`` ``<threads>``
Use amount of ``<threads>`` for rendering and other operations Use amount of ``<threads>`` for rendering and other operations
[1-1024], 0 for systems processor count. [1-1024], 0 for systems processor count.
.. _command-line-args-cycles-render-options:
Cycles Render Options
=====================
Cycles add-on options must be specified following a double dash.
``--cycles-device`` ``<device>``
Set the device used for rendering.
Valid options are: ``CPU`` ``CUDA`` ``OPTIX`` ``HIP`` ``ONEAPI`` ``METAL``.
Append +CPU to a GPU device to render on both CPU and GPU.
Example:
.. code-block:: sh
blender -b file.blend -f 20 -- --cycles-device OPTIX
``--cycles-print-stats``
Log statistics about render memory and time usage.
.. _command-line-args-format-options: .. _command-line-args-format-options:
@ -73,10 +100,11 @@ Format Options
``-F``, ``--render-format`` ``<format>`` ``-F``, ``--render-format`` ``<format>``
Set the render format. Set the render format.
Valid options are: Valid options are:
``TGA`` ``RAWTGA`` ``JPEG`` ``IRIS`` ``IRIZ`` ``AVIRAW`` ``AVIJPEG`` ``PNG`` ``BMP`` ``TGA`` ``RAWTGA`` ``JPEG`` ``IRIS`` ``IRIZ`` ``AVIRAW`` ``AVIJPEG`` ``PNG`` ``BMP``.
Formats that can be compiled into Blender, not available on all systems: Formats that can be compiled into Blender, not available on all systems:
``HDR`` ``TIFF`` ``OPEN_EXR`` ``OPEN_EXR_MULTILAYER`` ``MPEG`` ``CINEON`` ``DPX`` ``DDS`` ``JP2`` ``WEBP`` ``HDR`` ``TIFF`` ``OPEN_EXR`` ``OPEN_EXR_MULTILAYER`` ``MPEG`` ``CINEON`` ``DPX`` ``DDS`` ``JP2`` ``WEBP``.
``-x``, ``--use-extension`` ``<bool>`` ``-x``, ``--use-extension`` ``<bool>``
Set option to add the file extension to the end of the file. Set option to add the file extension to the end of the file.
@ -96,7 +124,7 @@ Animation Playback Options
Open with lower left corner at ``<sx>``, ``<sy>``. Open with lower left corner at ``<sx>``, ``<sy>``.
``-m`` ``-m``
Read from disk (Do not buffer). Read from disk (Do not buffer).
``-f`` ``<fps>`` ``<fps-base>`` ``-f`` ``<fps>`` ``<fps_base>``
Specify FPS to start with. Specify FPS to start with.
``-j`` ``<frame>`` ``-j`` ``<frame>``
Set frame step to ``<frame>``. Set frame step to ``<frame>``.
@ -116,16 +144,22 @@ Window Options
``-w``, ``--window-border`` ``-w``, ``--window-border``
Force opening with borders. Force opening with borders.
``-W``, ``--window-fullscreen`` ``-W``, ``--window-fullscreen``
Force opening in fullscreen mode. Force opening in fullscreen mode.
``-p``, ``--window-geometry`` ``<sx>`` ``<sy>`` ``<w>`` ``<h>`` ``-p``, ``--window-geometry`` ``<sx>`` ``<sy>`` ``<w>`` ``<h>``
Open with lower left corner at ``<sx>``, ``<sy>`` and width and height as ``<w>``, ``<h>``. Open with lower left corner at ``<sx>``, ``<sy>`` and width and height as ``<w>``, ``<h>``.
``-M``, ``--window-maximized`` ``-M``, ``--window-maximized``
Force opening maximized. Force opening maximized.
``-con``, ``--start-console`` ``-con``, ``--start-console``
Start with the console window open (ignored if ``-b`` is set), (Windows only). Start with the console window open (ignored if ``-b`` is set), (Windows only).
``--no-native-pixels`` ``--no-native-pixels``
Do not use native pixel size, for high resolution displays (MacBook ``Retina``). Do not use native pixel size, for high resolution displays (MacBook ``Retina``).
``--no-window-focus`` ``--no-window-focus``
Open behind other windows and without taking focus. Open behind other windows and without taking focus.
@ -136,23 +170,31 @@ Python Options
============== ==============
``-y``, ``--enable-autoexec`` ``-y``, ``--enable-autoexec``
Enable automatic Python script execution (default). Enable automatic Python script execution.
``-Y``, ``--disable-autoexec`` ``-Y``, ``--disable-autoexec``
Disable automatic Python script execution (pydrivers & startup scripts). Disable automatic Python script execution (pydrivers & startup scripts), (default).
``-P``, ``--python`` ``<filepath>`` ``-P``, ``--python`` ``<filepath>``
Run the given Python script file. Run the given Python script file.
``--python-text`` ``<name>`` ``--python-text`` ``<name>``
Run the given Python script text block. Run the given Python script text block.
``--python-expr`` ``<expression>`` ``--python-expr`` ``<expression>``
Run the given expression as a Python script. Run the given expression as a Python script.
``--python-console`` ``--python-console``
Run Blender with an interactive console. Run Blender with an interactive console.
``--python-exit-code`` ``<code>`` ``--python-exit-code`` ``<code>``
Set the exit-code in [0..255] to exit if a Python exception is raised Set the exit-code in [0..255] to exit if a Python exception is raised
(only for scripts executed from the command line), zero disables. (only for scripts executed from the command line), zero disables.
``--python-use-system-env`` ``--python-use-system-env``
Allow Python to use system environment variables such as ``PYTHONPATH`` and the user site-packages directory. Allow Python to use system environment variables such as ``PYTHONPATH`` and the user site-packages directory.
``--addons`` ``<addon(s)>`` ``--addons`` ``<addon(s)>``
Comma separated list (no spaces) of add-ons to enable in addition to any default add-ons. Comma separated list (no spaces) of add-ons to enable in addition to any default add-ons.
@ -170,15 +212,20 @@ Logging Options
so ``--log "*undo*"`` logs every kind of undo-related message. so ``--log "*undo*"`` logs every kind of undo-related message.
Use "^" prefix to ignore, so ``--log "*,^wm.operator.*"`` logs all except for ``wm.operators.*`` Use "^" prefix to ignore, so ``--log "*,^wm.operator.*"`` logs all except for ``wm.operators.*``
Use "*" to log everything. Use "*" to log everything.
``--log-level`` ``<level>`` ``--log-level`` ``<level>``
Set the logging verbosity level (higher for more details) defaults to 1, Set the logging verbosity level (higher for more details) defaults to 1,
use -1 to log all levels. use -1 to log all levels.
``--log-show-basename`` ``--log-show-basename``
Only show file name in output (not the leading path). Only show file name in output (not the leading path).
``--log-show-backtrace`` ``--log-show-backtrace``
Show a back trace for each log message (debug builds only). Show a back trace for each log message (debug builds only).
``--log-show-timestamp`` ``--log-show-timestamp``
Show a timestamp for each log message in seconds since start. Show a timestamp for each log message in seconds since start.
``--log-file`` ``<filepath>`` ``--log-file`` ``<filepath>``
Set a file to output the log to. Set a file to output the log to.
@ -194,73 +241,109 @@ Debug Options
* Enables memory error detection * Enables memory error detection
* Disables mouse grab (to interact with a debugger in some cases) * Disables mouse grab (to interact with a debugger in some cases)
* Keeps Python's ``sys.stdin`` rather than setting it to None * Keeps Python's ``sys.stdin`` rather than setting it to None
``--debug-value`` ``<value>`` ``--debug-value`` ``<value>``
Set debug value of ``<value>`` on startup. Set debug value of ``<value>`` on startup.
``--debug-events`` ``--debug-events``
Enable debug messages for the event system. Enable debug messages for the event system.
``--debug-ffmpeg`` ``--debug-ffmpeg``
Enable debug messages from FFmpeg library. Enable debug messages from FFmpeg library.
``--debug-handlers`` ``--debug-handlers``
Enable debug messages for event handling. Enable debug messages for event handling.
``--debug-libmv`` ``--debug-libmv``
Enable debug messages from libmv library. Enable debug messages from libmv library.
``--debug-cycles`` ``--debug-cycles``
Enable debug messages from Cycles. Enable debug messages from Cycles.
``--debug-memory`` ``--debug-memory``
Enable fully guarded memory allocation and debugging. Enable fully guarded memory allocation and debugging.
``--debug-jobs`` ``--debug-jobs``
Enable time profiling for background jobs. Enable time profiling for background jobs.
``--debug-python`` ``--debug-python``
Enable debug messages for Python. Enable debug messages for Python.
``--debug-depsgraph`` ``--debug-depsgraph``
Enable all debug messages from dependency graph. Enable all debug messages from dependency graph.
``--debug-depsgraph-eval`` ``--debug-depsgraph-eval``
Enable debug messages from dependency graph related on evaluation. Enable debug messages from dependency graph related on evaluation.
``--debug-depsgraph-build`` ``--debug-depsgraph-build``
Enable debug messages from dependency graph related on graph construction. Enable debug messages from dependency graph related on graph construction.
``--debug-depsgraph-tag`` ``--debug-depsgraph-tag``
Enable debug messages from dependency graph related on tagging. Enable debug messages from dependency graph related on tagging.
``--debug-depsgraph-no-threads`` ``--debug-depsgraph-no-threads``
Switch dependency graph to a single threaded evaluation. Switch dependency graph to a single threaded evaluation.
``--debug-depsgraph-time`` ``--debug-depsgraph-time``
Enable debug messages from dependency graph related on timing. Enable debug messages from dependency graph related on timing.
``--debug-depsgraph-pretty`` ``--debug-depsgraph-pretty``
Enable colors for dependency graph debug messages. Enable colors for dependency graph debug messages.
``--debug-depsgraph-uuid`` ``--debug-depsgraph-uuid``
Verify validness of session-wide identifiers assigned to ID datablocks. Verify validness of session-wide identifiers assigned to ID datablocks.
``--debug-ghost`` ``--debug-ghost``
Enable debug messages for Ghost (Linux only). Enable debug messages for Ghost (Linux only).
``--debug-wintab`` ``--debug-wintab``
Enable debug messages for Wintab. Enable debug messages for Wintab.
``--debug-gpu`` ``--debug-gpu``
Enable GPU debug context and information for OpenGL 4.3+. Enable GPU debug context and information for OpenGL 4.3+.
``--debug-gpu-force-workarounds`` ``--debug-gpu-force-workarounds``
Enable workarounds for typical GPU issues and disable all GPU extensions. Enable workarounds for typical GPU issues and disable all GPU extensions.
``--debug-gpu-disable-ssbo`` ``--debug-gpu-disable-ssbo``
Disable usage of shader storage buffer objects. Disable usage of shader storage buffer objects.
``--debug-gpu-renderdoc`` ``--debug-gpu-renderdoc``
Enable Renderdoc integration for GPU frame grabbing and debugging. Enable Renderdoc integration for GPU frame grabbing and debugging.
``--debug-wm`` ``--debug-wm``
Enable debug messages for the window manager, shows all operators in search, shows keymap errors. Enable debug messages for the window manager, shows all operators in search, shows keymap errors.
``--debug-xr`` ``--debug-xr``
Enable debug messages for virtual reality contexts. Enable debug messages for virtual reality contexts.
Enables the OpenXR API validation layer, (OpenXR) debug messages and general information prints. Enables the OpenXR API validation layer, (OpenXR) debug messages and general information prints.
``--debug-xr-time`` ``--debug-xr-time``
Enable debug messages for virtual reality frame rendering times. Enable debug messages for virtual reality frame rendering times.
``--debug-all`` ``--debug-all``
Enable all debug messages. Enable all debug messages.
``--debug-io`` ``--debug-io``
Enable debug messages for I/O (Collada, ...). Enable debug messages for I/O (Collada, ...).
``--debug-fpe`` ``--debug-fpe``
Enable floating-point exceptions. Enable floating-point exceptions.
``--debug-exit-on-error`` ``--debug-exit-on-error``
Immediately exit when internal errors are detected. Immediately exit when internal errors are detected.
``--debug-freestyle``
Enable debug messages for Freestyle.
``--disable-crash-handler`` ``--disable-crash-handler``
Disable the crash handler. Disable the crash handler.
``--disable-abort-handler`` ``--disable-abort-handler``
Disable the abort handler. Disable the abort handler.
``--verbose`` ``<verbose>`` ``--verbose`` ``<verbose>``
Set the logging verbosity level for debug messages that support it. Set the logging verbosity level for debug messages that support it.
@ -281,49 +364,60 @@ Misc Options
``--open-last`` ``--open-last``
Open the most recently opened blend file, instead of the default startup file. Open the most recently opened blend file, instead of the default startup file.
``--app-template`` ``<template>`` ``--app-template`` ``<template>``
Set the application template (matching the directory name), use ``default`` for none. Set the application template (matching the directory name), use ``default`` for none.
``--factory-startup`` ``--factory-startup``
Skip reading the startup.blend in the users home directory. Skip reading the ``startup.blend`` in the users home directory.
``--enable-event-simulate`` ``--enable-event-simulate``
Enable event simulation testing feature ``bpy.types.Window.event_simulate``. Enable event simulation testing feature ``bpy.types.Window.event_simulate``.
``--env-system-datafiles`` ``--env-system-datafiles``
Set the ``BLENDER_SYSTEM_DATAFILES`` environment variable. Set the ``BLENDER_SYSTEM_DATAFILES`` environment variable.
``--env-system-scripts`` ``--env-system-scripts``
Set the ``BLENDER_SYSTEM_SCRIPTS`` environment variable. Set the ``BLENDER_SYSTEM_SCRIPTS`` environment variable.
``--env-system-python`` ``--env-system-python``
Set the ``BLENDER_SYSTEM_PYTHON`` environment variable. Set the ``BLENDER_SYSTEM_PYTHON`` environment variable.
``-noaudio`` ``-noaudio``
Force sound system to None. Force sound system to None.
``-setaudio`` ``-setaudio``
Force sound system to a specific device. Force sound system to a specific device.
``None`` ``SDL`` ``OpenAL`` ``CoreAudio`` ``JACK`` ``PulseAudio`` ``WASAPI``. ``None`` ``SDL`` ``OpenAL`` ``CoreAudio`` ``JACK`` ``PulseAudio`` ``WASAPI``.
``-h``, ``--help`` ``-h``, ``--help``
Print this help text and exit. Print this help text and exit.
``/?`` ``/?``
Print this help text and exit (Windows only). Print this help text and exit (Windows only).
``-R``
Register blend-file extension, then exit (Windows only). ``-r``, ``--register``
``-r`` Register blend-file extension for current user, then exit (Windows only).
Silently register blend-file extension, then exit (Windows only).
``--register-allusers``
Register blend-file extension for all users, then exit (Windows only).
``--unregister``
Unregister blend-file extension for current user, then exit (Windows only).
``--unregister-allusers``
Unregister blend-file extension for all users, then exit (Windows only).
``-v``, ``--version`` ``-v``, ``--version``
Print Blender version and exit. Print Blender version and exit.
``--`` ``--``
End option processing, following arguments passed unchanged. Access via Python's ``sys.argv``. End option processing, following arguments passed unchanged. Access via Python's ``sys.argv``.
.. _command-line-args-other-options:
Other Options
=============
``--debug-freestyle``
Enable debug messages for Freestyle.
.. _command-line-args-argument-parsing: .. _command-line-args-argument-parsing:
Argument Parsing Argument Parsing
@ -337,7 +431,6 @@ Arguments must be separated by white space, eg:
...will exit since ``-ba`` is an unknown argument. ...will exit since ``-ba`` is an unknown argument.
.. _command-line-args-argument-order: .. _command-line-args-argument-order:
Argument Order Argument Order
@ -347,7 +440,7 @@ Arguments are executed in the order they are given. eg:
.. code-block:: sh .. code-block:: sh
blender --background test.blend --render-frame 1 --render-output '/tmp' blender --background test.blend --render-frame 1 --render-output "/tmp"
...will not render to ``/tmp`` because ``--render-frame 1`` renders before the output path is set. ...will not render to ``/tmp`` because ``--render-frame 1`` renders before the output path is set.
@ -363,7 +456,6 @@ Arguments are executed in the order they are given. eg:
...works as expected. ...works as expected.
.. _command-line-args-environment-variables: .. _command-line-args-environment-variables:
Environment Variables Environment Variables
@ -381,5 +473,5 @@ Environment Variables
:BLENDER_SYSTEM_DATAFILES: Directory for system wide data files. :BLENDER_SYSTEM_DATAFILES: Directory for system wide data files.
:BLENDER_SYSTEM_PYTHON: Directory for system Python libraries. :BLENDER_SYSTEM_PYTHON: Directory for system Python libraries.
:OCIO: Path to override the OpenColorIO config file. :OCIO: Path to override the OpenColorIO config file.
:TEMP: Store temporary files here. :TEMP: Store temporary files here (MS-Windows).
:TMP: or $TMPDIR Store temporary files here. :TMP: or $TMPDIR Store temporary files here (UNIX Systems).

View File

@ -14,13 +14,14 @@ and consequently we can render via a remote shell (typically SSH).
- See :doc:`Command Line Arguments </advanced/command_line/arguments>` - See :doc:`Command Line Arguments </advanced/command_line/arguments>`
for a full list of arguments for a full list of arguments
(for example to specify which scene to render, the end frame number, etc.), or simply run: (for example to specify which scene to render, the end frame number, etc.), or simply run:
- See :ref:`Command Line Launching <command_line-launch-index>`
for specific instructions on launching Blender from the command line.
.. code-block:: sh .. code-block:: sh
blender --help blender --help
- See :ref:`Command Line Launching <command_line-launch-index>`
for specific instructions on launching Blender from the command line.
.. note:: .. note::
Arguments are executed in the order they are given! Arguments are executed in the order they are given!
@ -98,20 +99,4 @@ Cycles
In addition to the options above, which apply to all render engines, In addition to the options above, which apply to all render engines,
Cycles has additional options to further control its behavior. Cycles has additional options to further control its behavior.
See :ref:`Cycles Render Options <command-line-args-cycles-render-options>`
.. code-block:: sh
blender -b file.blend -f 20 -- --cycles-device CPU
.. note::
Unlike the generic options, the Cycles-specific ones must be passed on
the end of the command line, following a double dash.
``--cycles-device CPU``
Override the device that is used to render frames.
Currently supported options are ``CPU``, ``CUDA``, ``OPTIX``, ``HIP``, ``ONEAPI``, and ``METAL``.
Additionally, you can append ``+CPU`` to any GPU type for hybrid rendering.
``--cycles-print-stats``
Show detailed statistics about memory and time usage for Cycles renders on the console.

View File

@ -1,3 +1,4 @@
.. _bpy.ops.poselib: .. _bpy.ops.poselib:
************ ************
@ -70,13 +71,9 @@ True to its name, the *Create Pose Asset* button automatically marks the Action
Not only does this make it available in the pose library, it will also act as a *fake user* Not only does this make it available in the pose library, it will also act as a *fake user*
to ensure the Action isn't lost after you unassign it from the armature. to ensure the Action isn't lost after you unassign it from the armature.
The *Create Pose Asset* button is also available in the 3D Viewport sidebar. The pose asset can be renamed in the Asset Browser. There you can also right
This button acts almost the same as the one in the Action Editor, except for one thing: click on the thumbnail, then choose Assign Action to assign the Action to the
it will not assign the newly created Action. Doing so would be invisible, active Object (see description above).
as the pose doesn't change and the name of the current Action is not shown in the viewport.
The pose asset can still be renamed in the Asset Browser.
There you can also click the *Assign Action* button to explicitly assign
the selected pose asset as the armature's active Action.
.. note:: .. note::
@ -127,8 +124,7 @@ data to the currently open blend-file. To copy a pose from some other file into
a pose library file, see the following steps: a pose library file, see the following steps:
- Pose the character and select the relevant bones. - Pose the character and select the relevant bones.
- Click the **Copy Pose as Asset button**, which is available in the Action Editor - Click the **Copy Pose as Asset button**, which is available in the Action Editor. This will create the pose asset
as well as the 3D Viewport Sidebar. This will create the pose asset
(including its thumbnail) and store it in a temporary file somewhere. (including its thumbnail) and store it in a temporary file somewhere.
- Choose an existing pose asset, and open its context menu. Click the **Open Blend File** option. - Choose an existing pose asset, and open its context menu. Click the **Open Blend File** option.
- A new Blender process will start, and automatically open the asset library - A new Blender process will start, and automatically open the asset library
@ -213,14 +209,6 @@ The **Pose Library panels will appear** when the active object is an armature
and in Pose Mode. The :doc:`catalog system </files/asset_libraries/catalogs>` and in Pose Mode. The :doc:`catalog system </files/asset_libraries/catalogs>`
and the filter bar at the top can be used to search for specific poses. and the filter bar at the top can be used to search for specific poses.
.. _bpy.types.WindowManager.poselib_flipped:
Flip Pose
Will mirror the pose from left to right and vice versa.
This makes it possible, for example, to apply a left-hand pose to the right hand,
reducing the number of poses you have to put into the library.
This can of course also be applied for asymmetrical facial expressions
that depend on the camera angle.
The following operators can be accessed by :kbd:`RMB` on a pose: The following operators can be accessed by :kbd:`RMB` on a pose:
@ -233,13 +221,23 @@ Apply Pose
and then an "open hand" pose for only the index finger and thumb. and then an "open hand" pose for only the index finger and thumb.
Double-clicking a pose will also apply it. Double-clicking a pose will also apply it.
Apply Pose Flipped
Will mirror the pose from left to right and vice versa. This makes it
possible, for example, to apply a left-hand pose to the right hand, reducing
the number of poses you have to put into the library. This can of course also
be applied for asymmetrical facial expressions that depend on the camera
angle. While blending (see below), keep :kbd:`Ctrl` pressed to blend the flipped pose.
.. _bpy.ops.poselib.blend_pose_asset: .. _bpy.ops.poselib.blend_pose_asset:
Blend Pose Blend Pose
Allows you to gradually blend a pose from the library into the character's pose. Allows you to gradually blend a pose from the library into the character's pose.
Click the button, then move the mouse left/right to determine the desired blend. Click the button, then move the mouse left/right to determine the desired blend.
While blending, you can use the Tab key to toggle between the original and the blended pose. A pose asset can be "subtracted" while blending. Drag to the right to blend as usual, drag to the left to subtract
As usual in Blender, left-click or press Enter to confirm; right-click or press Escape to cancel the operator. the pose. While blending, you can use :kbd:`Tab` to toggle between the original and the blended pose.
As usual in Blender, :kbd:`LMB` or press :kbd:`Return` to confirm; :kbd:`RMB` or press :kbd:`Esc` to cancel the
operator. Blending can also exaggerate a pose, by pressing :kbd:`E` (for Extrapolate) and applying a pose for more
than 100%.
.. _bpy.ops.poselib.pose_asset_select_bones: .. _bpy.ops.poselib.pose_asset_select_bones:
@ -266,8 +264,6 @@ This means that it can allow faster interaction.
You can also select and apply a pose via the cursor keys. You can also select and apply a pose via the cursor keys.
This allows for fast exploration of the poses, This allows for fast exploration of the poses,
to directly see the result on the active character. to directly see the result on the active character.
Of course the *Flip Pose* checkbox is available here as well --
it works the same as described in the previous section.
**Drag the pose thumbnail left to right to blend it** into the character's current pose. **Drag the pose thumbnail left to right to blend it** into the character's current pose.
Just release the mouse button to confirm. Just release the mouse button to confirm.

View File

@ -85,7 +85,7 @@ When nodes receive inputs with differently sized Images, these rules apply:
So each node in a composite can operate on different sized images as defined by its inputs. So each node in a composite can operate on different sized images as defined by its inputs.
Only the *Composite* output node has a fixed size, Only the *Composite* output node has a fixed size,
as defined by the settings in Properties :menuselection:`Render --> Dimensions`. as defined by the settings in :menuselection:`Output Properties --> Render --> Format`.
The *Viewer* node always shows the size from its input, but when not linked The *Viewer* node always shows the size from its input, but when not linked
(or linked to a value) it shows a small 320×256 pixel image. (or linked to a value) it shows a small 320×256 pixel image.

View File

@ -184,9 +184,9 @@ If an input image to a node is not perfectly aligned with the operation domain o
different size in pixels, the node would typically need to do a process called Interpolation, where different size in pixels, the node would typically need to do a process called Interpolation, where
the input image is read at the exact positions of the pixels of the operation domain. This can be the input image is read at the exact positions of the pixels of the operation domain. This can be
done using different interpolation methods, including Nearest-Neighbor, Bilinear, and Bicubic done using different interpolation methods, including Nearest-Neighbor, Bilinear, and Bicubic
interpolations. Those interpolation methods are demonstrated in the following `Wikipedia gallery interpolations. Those interpolation methods are demonstrated in the following
<https://en.wikipedia.org/wiki/Comparison_gallery_of_image_scaling_algorithms>`_. Transformation `Wikipedia gallery <https://en.wikipedia.org/wiki/Comparison_gallery_of_image_scaling_algorithms>`__.
nodes like the :ref:`Transform <bpy.types.CompositorNodeTransform>` and :ref:`Rotate Transformation nodes like the :ref:`Transform <bpy.types.CompositorNodeTransform>` and :ref:`Rotate
<bpy.types.CompositorNodeRotate>` nodes include an interpolation option to set how they prefer their <bpy.types.CompositorNodeRotate>` nodes include an interpolation option to set how they prefer their
output image to be read and interpolated. output image to be read and interpolated.

View File

@ -1,4 +1,4 @@
.. index:: Compositor Nodes; Hue Saturation Value .. index:: Compositor Nodes; Hue/Saturation/Value
.. _bpy.types.CompositorNodeHueSat: .. _bpy.types.CompositorNodeHueSat:
.. Editor's Note: This page gets copied into: .. Editor's Note: This page gets copied into:
.. - :doc:`</render/cycles/nodes/types/color/hue_saturation>` .. - :doc:`</render/cycles/nodes/types/color/hue_saturation>`
@ -6,14 +6,14 @@
.. --- copy below this line --- .. --- copy below this line ---
************************* *************************
Hue Saturation Value Node Hue/Saturation/Value Node
************************* *************************
.. figure:: /images/compositing_node-types_CompositorNodeHueSat.webp .. figure:: /images/compositing_node-types_CompositorNodeHueSat.webp
:align: right :align: right
:alt: Hue Saturation Node. :alt: Hue/Saturation/Value Node.
The *Hue Saturation Value Node* applies a color transformation in the HSV :term:`Color Model`. The *Hue/Saturation/Value Node* applies a color transformation in the HSV :term:`Color Model`.
Inputs Inputs

View File

@ -18,7 +18,7 @@ overlaying another image, etc.
gamma.rst gamma.rst
hue_correct.rst hue_correct.rst
hue_saturation.rst hue_saturation.rst
invert.rst invert_color.rst
mix.rst mix.rst
posterize.rst posterize.rst
rgb_curves.rst rgb_curves.rst

View File

@ -1,19 +1,19 @@
.. index:: Compositor Nodes; Invert .. index:: Compositor Nodes; Invert Color
.. _bpy.types.CompositorNodeInvert: .. _bpy.types.CompositorNodeInvert:
.. Editor's Note: This page gets copied into: .. Editor's Note: This page gets copied into:
.. - :doc:`</render/cycles/nodes/types/color/invert>` .. - :doc:`</render/cycles/nodes/types/color/invert>`
.. --- copy below this line --- .. --- copy below this line ---
*********** *****************
Invert Node Invert Color Node
*********** *****************
.. figure:: /images/compositing_node-types_CompositorNodeInvert.webp .. figure:: /images/compositing_node-types_CompositorNodeInvert.webp
:align: right :align: right
:alt: Invert Node. :alt: Invert Color Node.
The *Invert Node* inverts the colors in the input image, producing a negative. The *Invert Color Node* inverts the colors in the input image, producing a negative.
Inputs Inputs

View File

@ -9,8 +9,6 @@ Color Space Node
:align: right :align: right
:alt: Color Space Node. :alt: Color Space Node.
:guilabel:`CPU Compositor Only`
The *Color Space Node* converts images from one :term:`color spaces <Color Space>`. The *Color Space Node* converts images from one :term:`color spaces <Color Space>`.
.. note:: .. note::

View File

@ -9,8 +9,6 @@ ID Mask Node
:align: right :align: right
:alt: ID Mask Node. :alt: ID Mask Node.
:guilabel:`CPU Compositor Only`
The *ID Mask Node* can be used to access an alpha mask per object or per material. The *ID Mask Node* can be used to access an alpha mask per object or per material.
.. seealso:: .. seealso::

View File

@ -9,8 +9,6 @@ Plane Track Deform Node
:align: right :align: right
:alt: Plane Track Deform Node. :alt: Plane Track Deform Node.
:guilabel:`CPU Compositor Only`
The Plane Track Deform Node is used to incorporate the special "plane track" in your composite by checking areas The Plane Track Deform Node is used to incorporate the special "plane track" in your composite by checking areas
which are planes, and replacing their footage with some other image. which are planes, and replacing their footage with some other image.

View File

@ -9,8 +9,6 @@ Denoise Node
:align: right :align: right
:alt: Denoise Node. :alt: Denoise Node.
:guilabel:`CPU Compositor Only`
The Denoise node is used to denoise renders from :doc:`Cycles </render/cycles/index>` The Denoise node is used to denoise renders from :doc:`Cycles </render/cycles/index>`
and other ray tracing renderers. This helps to significantly reduce render time by and other ray tracing renderers. This helps to significantly reduce render time by
rendering with fewer samples. rendering with fewer samples.

View File

@ -237,7 +237,7 @@ epub_publisher = 'Blender Foundation'
# The language of the text. It defaults to the language option # The language of the text. It defaults to the language option
# or 'en' if the language is not set. # or 'en' if the language is not set.
#epub_language = '' # epub_language = ''
epub_copyright = 'This manual is licensed under a CC-BY-SA 4.0 Int. License.' epub_copyright = 'This manual is licensed under a CC-BY-SA 4.0 Int. License.'
@ -330,17 +330,17 @@ latex_logo = "../resources/theme/blender-logo.svg"
# This value determines the topmost sectioning unit. It should be chosen from # This value determines the topmost sectioning unit. It should be chosen from
# 'part', 'chapter' or 'section'. # 'part', 'chapter' or 'section'.
#latex_toplevel_sectioning = 'None' # latex_toplevel_sectioning = 'None'
# A list of document names to append as an appendix to all manuals. # A list of document names to append as an appendix to all manuals.
#latex_appendices = [] # latex_appendices = []
# If true, generate domain-specific indices in addition to the general index. # If true, generate domain-specific indices in addition to the general index.
#latex_domain_indices = True # latex_domain_indices = True
# If true, add page references after internal references. # If true, add page references after internal references.
# This is very useful for printed copies of the manual. # This is very useful for printed copies of the manual.
#latex_show_pagerefs = False # latex_show_pagerefs = False
# Control whether to display URL addresses. # Control whether to display URL addresses.
latex_show_urls = "no" latex_show_urls = "no"
@ -415,17 +415,17 @@ texinfo_documents = [
] ]
# A list of document names to append as an appendix to all manuals. # A list of document names to append as an appendix to all manuals.
#texinfo_appendices = [] # texinfo_appendices = []
# If true, generate domain-specific indices in addition to the general index. # If true, generate domain-specific indices in addition to the general index.
#texinfo_domain_indices = True # texinfo_domain_indices = True
# Control how to display URL addresses. # Control how to display URL addresses.
#texinfo_show_urls = 'footnote' # texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the “Top” nodes menu # If true, do not generate a @detailmenu in the “Top” nodes menu
# containing entries for each sub-node in the document. # containing entries for each sub-node in the document.
#texinfo_no_detailmenu = False # texinfo_no_detailmenu = False
# -- Extension configuration ------------------------------------------------- # -- Extension configuration -------------------------------------------------

View File

@ -18,7 +18,7 @@ Update
Firstly, make sure that your local copy of the manual is up to date with the online repository using:: Firstly, make sure that your local copy of the manual is up to date with the online repository using::
git pull --rebase make update
Writing Writing
@ -40,7 +40,7 @@ Bigger Changes
If you are going to add or overhaul a section, be sure to check carefully that it does not already exist. If you are going to add or overhaul a section, be sure to check carefully that it does not already exist.
In some places, the docs are so disorganized that sections may be duplicated or in a strange location. In some places, the docs are so disorganized that sections may be duplicated or in a strange location.
In the case that you find a duplicate or out of place section, In the case that you find a duplicate or out of place section,
`create a task <https://projects.blender.org/blender/documentation/issues/new>`__ `create an issue <https://projects.blender.org/blender/documentation/issues/new>`__
explaining the issue, and optionally include a revision (actual changes). explaining the issue, and optionally include a revision (actual changes).
Before you make any edits that are not simple and plainly justified (for example, moving folders around), Before you make any edits that are not simple and plainly justified (for example, moving folders around),

View File

@ -20,7 +20,7 @@ If you leave out ``-m "message"``, you will be prompted to type the message in a
You should make sure you are always on the latest revision before committing. You should make sure you are always on the latest revision before committing.
You may not be able to commit directly if there are conflicting changes in the latest revision. You may not be able to commit directly if there are conflicting changes in the latest revision.
To avoid this run ``git pull --rebase`` before committing. To avoid this update your local repository before committing (run ``make update``).
.. seealso:: .. seealso::

View File

@ -52,7 +52,7 @@ Setting up the Build Environment
================================ ================================
- Open a Command Prompt. (Run as Administrator) - Open a Command Prompt. (Run as Administrator)
- Enter the ``blender-manual`` folder which was just added by the SVN checkout:: - Enter the ``blender-manual`` folder which was just added by `git clone`::
cd C:\blender-manual cd C:\blender-manual

View File

@ -73,8 +73,7 @@ Guidelines for Reviewers
``WIP:`` prefix in the title, indicating the author considers the pull request not ready to be merged. ``WIP:`` prefix in the title, indicating the author considers the pull request not ready to be merged.
No review is expected unless the author specifically asks for it. No review is expected unless the author specifically asks for it.
- Writers are expected to reply to pull requests in 3 working days. - Writers are expected to reply to pull requests in 3 working days.
- Add relevant modules/projects to tags. - Add relevant modules/projects to the labels.
- Assign individuals (instead of modules/projects) for reviewers, to avoid too much noise.
- Encourage new writes to do review, it's a good way to learn and important to grow the project. - Encourage new writes to do review, it's a good way to learn and important to grow the project.

View File

@ -24,7 +24,7 @@ This will give you a foundation environment for:
Below examples show the process to create a new set of files for French, language code ``fr``, on Linux platform. Below examples show the process to create a new set of files for French, language code ``fr``, on Linux platform.
Other platforms might vary slightly but should be mainly the same. Other platforms might vary slightly but should be mainly the same.
#. `Create a Blender ID <https://id.blender.org/register/>` if you have not done so already #. `Create a Blender ID <https://id.blender.org/register/>`__ if you have not done so already
#. Log into `projects.blender.org <https://projects.blender.org/>`__ and #. Log into `projects.blender.org <https://projects.blender.org/>`__ and
`Create an Issue <https://projects.blender.org/blender/documentation/issues/new>`__ `Create an Issue <https://projects.blender.org/blender/documentation/issues/new>`__
requesting for commit access in order to transfer changes to the central repository of the translation team. requesting for commit access in order to transfer changes to the central repository of the translation team.

View File

@ -84,8 +84,13 @@ Annotations
Objects Objects
------- -------
Extra Extras
Show objects that don't have geometry (such as empties, cameras and lights). Show objects that don't have geometry (such as empties, cameras and lights).
.. _bpy.types.View3DOverlay.show_light_colors:
Light Colors
Shades the outline of light objects to the color the light produces.
Relationship Lines Relationship Lines
Show dashed lines indicating parent or constraint relationships. Show dashed lines indicating parent or constraint relationships.
Outline Selected Outline Selected
@ -183,27 +188,31 @@ Seams
Shading Shading
------- -------
Hidden Wire .. _bpy.types.View3DOverlay.show_retopology:
Show only front-facing wireframes.
This is useful for a retopology workflow.
.. tip:: Retopology
Hide the solid mesh and offset the overlay towards the view.
Selection is occluded by inactive geometry, unless X-Ray is enabled
Optimally this could be combined with the *X-Ray* display setting. .. _bpy.types.View3DOverlay.retopology_offset:
Offset
Amount to offset edit mesh in front of other geometry.
.. _bpy.types.View3DOverlay.show_weight:
Vertex Groups Weights Vertex Groups Weights
Display weights in Edit Mode. Display weights in Edit Mode.
.. _bpy.types.ToolSettings.vertex_group_user:
Zero Weights Zero Weights
Display unreferenced and zero-weighted areas in black. Display unreferenced and zero-weighted areas in black.
This helps to identify areas with very low weights that have been painted onto. This helps to identify areas with very low weights that have been painted onto.
None :None: Vertices are displayed in the usual way.
Vertices are displayed in the usual way. :Active: Vertices are shown in black if they have no weight in the active vertex group.
Active :All: Vertices are shown in black if they have no weight in any vertex group.
Vertices are shown in black if they have no weight in the active vertex group.
All
Vertices are shown in black if they have no weight in any vertex group.
Mesh Analysis Mesh Analysis

View File

@ -54,7 +54,8 @@ Selecting
--------- ---------
- Select channel (text in white/black): :kbd:`LMB` - Select channel (text in white/black): :kbd:`LMB`
- Multi Select/Deselect: :kbd:`Shift-LMB` - Multi Select/Deselect: :kbd:`Ctrl-LMB`
- Range Select: :kbd:`Shift-LMB`
- Select All: :kbd:`A` - Select All: :kbd:`A`
- Deselect All: :kbd:`Alt-A` - Deselect All: :kbd:`Alt-A`
- Box Select: (:kbd:`LMB` drag) or :kbd:`B` (:kbd:`LMB` drag) - Box Select: (:kbd:`LMB` drag) or :kbd:`B` (:kbd:`LMB` drag)

View File

@ -150,14 +150,14 @@ Copy/Paste
.. admonition:: Reference .. admonition:: Reference
:Menu: :menuselection:`Key --> Copy Keyframes`, :menuselection:`Key --> Paste Keyframes` :Menu: :menuselection:`Key --> Copy`, :menuselection:`Key --> Paste`
:Shortcut: :kbd:`Ctrl-C`, :kbd:`Ctrl-V` :Shortcut: :kbd:`Ctrl-C`, :kbd:`Ctrl-V`
Use :kbd:`Ctrl-C` to copy selected keyframes and :kbd:`Ctrl-V` to paste the previously copied keyframes. Use :kbd:`Ctrl-C` to copy selected keyframes and :kbd:`Ctrl-V` to paste the previously copied keyframes.
During the paste action, the :ref:`bpy.ops.screen.redo_last` panel provides some options in During the paste action, the :ref:`bpy.ops.screen.redo_last` panel provides some options in
how the paste is applied. how the paste is applied.
Offset Frame Offset
:No Offset: :No Offset:
Pastes the keyframes in the location they were copied from. Pastes the keyframes in the location they were copied from.
:Frame Relative: :Frame Relative:
@ -167,6 +167,19 @@ Offset
Pastes the keyframes with the first keyframe of the copied set placed at the current frame. Pastes the keyframes with the first keyframe of the copied set placed at the current frame.
:Frame End: :Frame End:
Pastes the keyframes with the last keyframe of the copied set placed at the current frame. Pastes the keyframes with the last keyframe of the copied set placed at the current frame.
Value Offset
:No Offset:
Pastes the keyframes with the value they were copied from.
:Cursor Value:
Paste the keyframes at the 2D cursor as a starting point.
:Current Frame Value:
Paste keyframes relative to the value of the curve under the cursor.
:Right Key:
Paste keyframes such that the last frame matches the key value right of the cursor.
:Left Key:
Paste keyframes such that the first key matches the key value left of the cursor.
Type Type
:Mix: :Mix:
Integrates the pasted keyframes in with existing keyframes only overwriting keyframes that share a frame. Integrates the pasted keyframes in with existing keyframes only overwriting keyframes that share a frame.
@ -442,3 +455,31 @@ seem to be never modified by this tool.
- .. figure:: /images/editors_graph-editor_fcurves_editing_smooth.png - .. figure:: /images/editors_graph-editor_fcurves_editing_smooth.png
F-Curve after smoothing. F-Curve after smoothing.
.. _bpy.ops.graph.gaussian_smooth:
Smooth (Gaussian)
-----------------
.. reference::
:Menu: :menuselection:`Key --> Smooth --> Smooth (Gaussian)`
Smooths the selected keyframes using a Gaussian kernel. It can handle gaps in the keyframe data.
The operator is modal with a blend factor, making it possible to tweak the strength of the filter.
Factor
A blend factor from original to filtered curve.
Sigma
The shape of the gaussian distribution. Lower values mean a sharper curve, giving keys that are close to each
other more weight. A high value behaves like a simple average filter.
Filter Width
A wider filter looks at more keyframes, producing a smoother result.
At a size of 1 the filter only looks at the keyframes to the immediate left and right for a weighted average.
.. figure:: /images/editors_graph-editor_gaussian_smooth.jpg
F-Curve after applying the Gaussian Smooth with the original curve overlayed.

View File

@ -163,8 +163,9 @@ Interpolation
.. seealso:: .. seealso::
For more info and a few live demos, see https://easings.net and For more info and a few live demos,
http://robertpenner.com/easing/ see `easings.net <https://easings.net>`__ and
`Robert Penner's Easing Functions <http://robertpenner.com/easing>`__.
.. rubric:: Dynamic Effects .. rubric:: Dynamic Effects

View File

@ -14,7 +14,7 @@ New
:Menu: :menuselection:`Image --> New` :Menu: :menuselection:`Image --> New`
:Shortcut: :kbd:`Alt-N` :Shortcut: :kbd:`Alt-N`
Creates a new :ref:`image-generated` Image. Create a new :ref:`image-generated` Image.
.. _bpy.ops.image.open: .. _bpy.ops.image.open:
@ -28,7 +28,7 @@ Open
:Menu: :menuselection:`Image --> Open` :Menu: :menuselection:`Image --> Open`
:Shortcut: :kbd:`Alt-O` :Shortcut: :kbd:`Alt-O`
Load image from a file. Load an image from a file.
.. _bpy.ops.image.read_viewlayers: .. _bpy.ops.image.read_viewlayers:

View File

@ -43,7 +43,7 @@ You can set the editor's display options in this panel.
Aspect Ratio Aspect Ratio
Display aspect for this image. Does not affect rendering. Display aspect for this image. Does not affect rendering.
Repeat Image Repeat Image
Tiles the image so it completely fills the editor. Tile the image so it completely fills the editor.
Annotations Annotations
@ -78,7 +78,7 @@ A predominantly dark image would have the highest values toward the left side of
Use this mode to balance out the tonal range in an image. Use this mode to balance out the tonal range in an image.
A well-balanced image should have a nice smooth distribution of color values. A well-balanced image should have a nice smooth distribution of color values.
You can drag the mouse in the histogram to adjust its vertical zoom. You can drag :kbd:`LMB` in the histogram to adjust its vertical zoom.
Luma Luma
Shows a luminosity histogram. Shows a luminosity histogram.

View File

@ -12,9 +12,6 @@ the bottom layer first, to the top, last.
NLA Tracks and Strips. NLA Tracks and Strips.
Solo (star icon)
Toggling *Solo Track* causes only the selected tracks effects to be visible when animating.
This is very useful for debugging complex animations.
Mute (checkbox) Mute (checkbox)
Keeps the track from having an effect on the animation. (Mute only applies when *Solo* is not used.) Keeps the track from having an effect on the animation. (Mute only applies when *Solo* is not used.)
All strips in that track are shown as being muted (dashed outline). All strips in that track are shown as being muted (dashed outline).
@ -22,6 +19,9 @@ Lock (padlock icon)
Prevents changes from being made to this layer. Prevents changes from being made to this layer.
This is useful, for example, if you want to select several strips and move them; This is useful, for example, if you want to select several strips and move them;
but you want to keep a few tracks excluded from the change. but you want to keep a few tracks excluded from the change.
Solo (star icon)
Toggling *Solo Track* causes only the selected tracks effects to be visible when animating.
This is very useful for debugging complex animations.
Action Track Action Track

View File

@ -34,10 +34,10 @@ Data API
Library Overrides Library Overrides
Display library override data in the current blend-file. Separated further into two view modes: Display library override data in the current blend-file. Separated further into two view modes:
Properties: :Properties:
Display data-blocks with overridden properties. The overridden properties are listed together with widgets to Display data-blocks with overridden properties. The overridden properties are listed together with widgets to
modify the value of the properties. modify the value of the properties.
Hierarchies: :Hierarchies:
Visualize the hierarchical dependencies between data-blocks with library overrides. For example, to create a Visualize the hierarchical dependencies between data-blocks with library overrides. For example, to create a
library override of a mesh used by an object inside of a linked collection, Blender automatically creates library override of a mesh used by an object inside of a linked collection, Blender automatically creates
(disabled) library overrides for the object and the collection, resulting in a collection > object > mesh (disabled) library overrides for the object and the collection, resulting in a collection > object > mesh
@ -137,19 +137,19 @@ Object State
List the objects based on their state or restrictions. List the objects based on their state or restrictions.
The results can be inverted using the *Invert* button. The results can be inverted using the *Invert* button.
All :All:
The default option, no restrictions. The default option, no restrictions.
Visible :Visible:
List only the objects visible in the viewports. List only the objects visible in the viewports.
The global and temporary visibility settings are taken into consideration. The global and temporary visibility settings are taken into consideration.
Invisible :Invisible:
List only the objects not visible in the viewports. List only the objects not visible in the viewports.
Selected :Selected:
Lists the object(s) that are currently selected in the 3D Viewport. Lists the object(s) that are currently selected in the 3D Viewport.
See :doc:`selecting in the 3D Viewport </scene_layout/object/selecting>` for more information. See :doc:`selecting in the 3D Viewport </scene_layout/object/selecting>` for more information.
Active :Active:
Lists only the active (often last selected) object. Lists only the active (often last selected) object.
Selectable :Selectable:
List all objects whose :ref:`Selectability <bpy.types.Collection.hide_select>` option is enabled. List all objects whose :ref:`Selectability <bpy.types.Collection.hide_select>` option is enabled.
.. _bpy.types.SpaceOutliner.use_filter_object_content: .. _bpy.types.SpaceOutliner.use_filter_object_content:
@ -167,6 +167,7 @@ Object Children
.. _bpy.types.SpaceOutliner.use_filter_object_mesh: .. _bpy.types.SpaceOutliner.use_filter_object_mesh:
.. _bpy.types.SpaceOutliner.use_filter_object_light: .. _bpy.types.SpaceOutliner.use_filter_object_light:
.. _bpy.types.SpaceOutliner.use_filter_object_camera: .. _bpy.types.SpaceOutliner.use_filter_object_camera:
.. _bpy.types.SpaceOutliner.use_filter_object_grease_pencil:
.. _bpy.types.SpaceOutliner.use_filter_object_empty: .. _bpy.types.SpaceOutliner.use_filter_object_empty:
.. _bpy.types.SpaceOutliner.use_filter_object_others: .. _bpy.types.SpaceOutliner.use_filter_object_others:

View File

@ -46,10 +46,10 @@ Distribute Memory Across Devices
Currently only NVLink on Nvidia GPUs is supported. Currently only NVLink on Nvidia GPUs is supported.
MetalRT (Experimental) Embree on GPU
MetalRT for ray tracing uses less memory for scenes which use curves extensively, Enables the use of hardware ray tracing on Intel GPUs, providing better overall performance.
and can give better performance in specific cases.
This feature is experimental and some scenes may render incorrectly. Only supported with oneAPI rendering devices..
HIP RT (Experimental) HIP RT (Experimental)
Speeds up rendering by enabling AMD hardware ray tracing on RDNA2 and above, with shader fallback on older cards. Speeds up rendering by enabling AMD hardware ray tracing on RDNA2 and above, with shader fallback on older cards.
@ -57,6 +57,11 @@ HIP RT (Experimental)
This feature is only available when using a *HIP* render device. This feature is only available when using a *HIP* render device.
MetalRT (Experimental)
MetalRT for ray tracing uses less memory for scenes which use curves extensively,
and can give better performance in specific cases.
This feature is experimental and some scenes may render incorrectly.
Operating System Settings Operating System Settings
========================= =========================

View File

@ -7,7 +7,7 @@
:maxdepth: 1 :maxdepth: 1
combine_color.rst combine_color.rst
invert.rst invert_color.rst
mix_rgb.rst mix_rgb.rst
rgb_curves.rst rgb_curves.rst
hue_saturation.rst hue_saturation.rst

View File

@ -1,4 +1,4 @@
.. _bpy.types.TextureNodeInvert: .. _bpy.types.TextureNodeInvert:
.. DO NOT EDIT FILE. This is simply a stub which copies everything from the link below. .. DO NOT EDIT FILE. This is simply a stub which copies everything from the link below.
.. include:: /compositing/types/color/invert.rst .. include:: /compositing/types/color/invert_color.rst
:start-after: .. --- copy below this line --- :start-after: .. --- copy below this line ---

View File

@ -302,7 +302,7 @@ Cache
Show Cache Show Cache
Show all enabled types. Show all enabled types.
Soft Body, Particles, Cloth, Smoke, Dynamic Paint, Rigid Body. Soft Body, Particles, Cloth, Simulation Nodes, Smoke, Dynamic Paint, Rigid Body.
.. figure:: /images/editors_timeline_cache.png .. figure:: /images/editors_timeline_cache.png

View File

@ -3,6 +3,13 @@
Snapping Snapping
******** ********
Snapping lets you easily align UV elements to others.
It can be toggled by clicking the magnet icon in the UV Editor's header,
or more temporarily by holding :kbd:`Ctrl`.
This page is about the Snap header button; for the Snap menu,
see :ref:`UV Editing <bpy.ops.uv.snap_selected>`.
.. _bpy.types.ToolSettings.snap_uv_element: .. _bpy.types.ToolSettings.snap_uv_element:
Snap To Snap To
@ -14,23 +21,20 @@ Snap To
:Shortcut: :kbd:`Shift-Ctrl-Tab` :Shortcut: :kbd:`Shift-Ctrl-Tab`
Increment Increment
Snap elements along points on a fixed scale. Snaps to grid points.
These points are defined by the intersection points of the grid
and the scale of the increments depending on zoom level,
unless using :ref:`Fixed Subdivisions <bpy.types.SpaceUVEditor.custom_grid_subdivisions>`.
The Custom Grid can also be used to define a set distance of the scale.
.. note:: .. note::
In this context the grid does not mean the visual grid cue displayed. By default, this option won't snap to the grid that's displayed in the editor,
Snapping will use the resolution of the displayed grid, but an imaginary grid with the same resolution that starts at the selection's
but all transformations are relative to the initial position (before the snap operation). original location. In other words, it lets you move the selection in "increments" of the
grid cell size.
Note, the behavior can be disabled by using *Absolute Grid Snap*. If you want to snap to the viewport grid instead, you can enable *Absolute Grid Snap*
(see below).
Vertex Vertex
Snap to UV vertices. Snaps to the vertex that's closest to the mouse cursor.
Additional Options Additional Options
@ -38,15 +42,16 @@ Additional Options
.. _bpy.types.ToolSettings.use_snap_uv_grid_absolute: .. _bpy.types.ToolSettings.use_snap_uv_grid_absolute:
Absolute Grid Snap Absolute Grid Snap :guilabel:`Increment`
Available only for the *Increment* option. Snaps to the grid, instead of snapping in increments relative to the current location.
Snap to the visual grid, instead of snapping in increments relative to the current location.
Target Target :guilabel:`Vertex`
See :ref:`3D Viewport Snapping <bpy.types.ToolSettings.snap_target>` for more information. See :ref:`3D Viewport Snapping <bpy.types.ToolSettings.snap_target>` for more information.
Affect Affect
====== ======
Limits the effect of the snap to the transformation type. Specifies which transformations are affected by snapping.
By default, snapping only happens while moving something,
but you can also enable it for rotating and scaling.

View File

@ -4,41 +4,42 @@
Introduction Introduction
************ ************
The UV Editor is used to map 2D assets like images/textures The UV Editor is used for editing UV maps, which describe how a 2D image should be mapped
onto 3D objects and edit what are called UVs. onto a 3D object.
.. figure:: /images/editors_uv_introduction_main.png .. figure:: /images/editors_uv_introduction_main.png
UV Editor with a UV map and a test grid texture. UV Editor with a UV map and a test grid texture.
The most flexible way of mapping a 2D texture over a 3D object is a process called "UV mapping". Image textures are typically needed when the desired look is hard to achieve with procedural textures,
In this process, you take your three-dimensional (X, Y & Z) mesh and unwrap it to a flat two-dimensional or if the texture is not uniform. For example, a car would only have scratches in a few places where they make sense,
(X & Y ... or rather, as we shall soon see, "U & V") image. Colors in the image are thus mapped to your mesh, not in random places all over its body.
and show up as the color of the faces of the mesh. Use UV texturing to provide realism to your objects that
procedural materials and textures cannot do, and better details than Vertex Painting can provide. Blender offers a number of projections (Box, Sphere...) that automatically apply a 2D image to a 3D object,
but these tend to only work for simple meshes. For more complex ones, you need to create a UV map instead.
This is a flat area where each face of the 3D object is laid out on the 2D image, specifying which part of the
image it should be textured with. This gives you complete control over the mapping process.
The name "UV" refers to the axes of the map: U for horizontal, V for vertical. These letters were chosen to
avoid confusion with "X" and "Y", which refer to axes in 3D space instead.
UVs Explained UVs Explained
============= =============
The best analogy to understanding UV mapping is cutting up a cardboard box. The best analogy to understand UV mapping is cutting up a cardboard box.
The box is a three-dimensional (3D) object, just like the mesh cube you add to your scene. If you were to take a pair of scissors and cut along its edges,
you would be able to spread it out flat on a tabletop. As you are looking down at the table,
If you were to take a pair of scissors and cut a seam or fold of the box,
you would be able to lay it flat on a tabletop. As you are looking down at the box on the table,
we could say that U is the left-right direction, and V is the up-down direction. we could say that U is the left-right direction, and V is the up-down direction.
This image is thus in two dimensions (2D). We use U and V to refer to these
"texture-space coordinates" instead of the normal X and Y, which are always used
(along with Z) to refer to the three-dimensional space (3D).
When the box is reassembled, a certain UV location on the paper is transferred to an (X, Y, Z) As a next step, you could put the spread-out box on top of a poster, cut the poster
location on the box. This is what the computer does with a 2D image in wrapping it around a 3D object. to match its shape, glue the poster to the box, and finally reassemble the box.
You now have a 3D box textured with a 2D image.
During the UV unwrapping process, you tell Blender exactly how to map the faces of your object (in this case, a box) A UV map describes how the box is cut up, and how it's laid out on the poster.
to a flat image in the UV Editor. You have complete freedom in how to do this. You have complete freedom in how to do this: if you wanted to, you could cut each individual
(Continuing our previous example, imagine that, having initially laid the box flat on the tabletop, side of the box and position, rotate, scale, and even skew it on the poster
you now cut it into smaller pieces, somehow stretch and/or shrink those pieces, independently of the other sides.
and then arrange them in some way upon a photograph that is also lying on that tabletop.)
Example Example
@ -49,46 +50,19 @@ Example
3D space (XYZ) versus UV space. 3D space (XYZ) versus UV space.
In this image you can easily see that the shape and In the above image, a dome in 3D space is flattened into a disc in UV space.
size of the marked face in 3D space is different in UV space. Each 3D face is then textured with the part of the image it covers in the UV map.
This difference is caused by the "stretching" (technically called mapping)
of the 3D part (XYZ) onto a 2D plane (i.e. the UV map).
If a 3D object has a UV map, then, in addition to the 3D coordinates X, Y, and Z, The image also demonstrates a common problem in UV maps: distortion. Notice how,
each point on the object will have corresponding U and V coordinates. even though the checkered squares in the 2D texture are all the same size,
they get different sizes when applied to the 3D dome (they're smaller at the base
than at the top). This is because the faces in the UV map have different relative
sizes than in 3D space, which is a result of the flattening process.
.. note:: You'll typically want to minimize this distortion by manually guiding and tweaking
the flattening, using :doc:`seams </modeling/meshes/uv/unwrapping/seams>` for example.
However, it's not always possible to eliminate it completely.
On more complex models (like seen in the sphere above)
there pops up an issue where the faces cannot be cut,
but instead they are stretched in order to make them flat.
This helps making easier UV maps, but sometimes adds distortion to the final mapped texture.
Advantages of UVs
=================
While procedural textures are useful -- they never repeat themselves and always "fit" 3D objects
-- they are not sufficient for more complex or natural objects.
For instance, the skin on a human head will never look quite right when procedurally generated.
Wrinkles on a human head, or scratches on a car do not occur in random places,
but depend on the shape of the model and its usage. Manually-painted images,
or images captured from the real world gives more control and realism.
For details such as book covers, tapestry, rugs, stains, and detailed props,
artists are able to control every pixel on the surface using a UV texture.
A UV map describes what part of the texture should be attached to each polygon in the model.
Each polygon's vertex gets assigned to 2D coordinates that define which part of the image gets mapped.
These 2D coordinates are called UVs (compare this to the XYZ coordinates in 3D).
The operation of generating these UV maps is also called "unwrap",
since it is as if the mesh were unfolded onto a 2D plane.
For most simple 3D models, Blender has an automatic set of unwrapping algorithms that you can easily apply.
For more complex 3D models, regular Cubic, Cylindrical or Spherical mapping, is usually not sufficient.
For even and accurate projection, use :doc:`seams </modeling/meshes/uv/unwrapping/seams>` to guide the UV mapping.
This can be used to apply textures to arbitrary and complex shapes,
like human heads or animals. Often these textures are painted images,
created in applications like the Gimp, Krita, or your favorite painting application.
Interface Interface
@ -104,7 +78,7 @@ Header
The header contains several menus and options for working with UVs. The header contains several menus and options for working with UVs.
Sync Selection Sync Selection
Syncs selection between the UV Editor and the 3D Viewport. Synchronizes the selection between the UV Editor and the 3D Viewport.
See :ref:`Sync Selection <bpy.types.ToolSettings.use_uv_select_sync>` for more details. See :ref:`Sync Selection <bpy.types.ToolSettings.use_uv_select_sync>` for more details.
Selection Mode Selection Mode
@ -112,7 +86,7 @@ Selection Mode
See :ref:`Selection Mode <bpy.types.ToolSettings.uv_select_mode>` for more details. See :ref:`Selection Mode <bpy.types.ToolSettings.uv_select_mode>` for more details.
Sticky Selection Mode Sticky Selection Mode
Option to automatically expand selection. Which other vertices to select automatically.
See :ref:`Sticky Selection Mode <bpy.types.ToolSettings.uv_sticky_select_mode>` for more details. See :ref:`Sticky Selection Mode <bpy.types.ToolSettings.uv_sticky_select_mode>` for more details.
View View
@ -120,59 +94,62 @@ View
See :doc:`/editors/uv/navigating`. See :doc:`/editors/uv/navigating`.
Select Select
Tools for :doc:`Selecting UVs </editors/uv/selecting>`. Tools for :doc:`selecting UVs </editors/uv/selecting>`.
Image Image
Tools for opening and manipulating images. Tools for opening and manipulating images.
See :doc:`/editors/image/editing`. See :doc:`/editors/image/editing`.
UV UV
Contains tools for :doc:`Unwrapping Meshes </modeling/meshes/uv/unwrapping/index>` Contains tools for :doc:`Unwrapping Meshes </modeling/meshes/uv/unwrapping/introduction>`
and :doc:`Editing UVs </modeling/meshes/uv/editing>`. and :doc:`Editing UVs </modeling/meshes/uv/editing>`.
Pivot :kbd:`Period`
See :doc:`/editors/3dview/controls/pivot_point/index`.
Snap :kbd:`Shift-Tab`
See :doc:`/editors/uv/controls/snapping`.
Proportional Editing :kbd:`O`
See :doc:`Proportional Editing </editors/3dview/controls/proportional_editing>`.
Image Image
A :ref:`data-block menu <ui-data-block>` used for selecting images. A :ref:`data-block menu <ui-data-block>` used for selecting images.
When an image has been loaded or created in the Image editor, When an image has been loaded or created in the UV Editor,
the Image panel appears in the *Sidebar region*. the :doc:`Image panel </editors/image/image_settings>` appears in the Sidebar region.
See :doc:`/editors/image/image_settings`.
Image Pin Image Pin
Todo. When enabled the current image remains visible regardless of the object selection.
This switching only happens if the 3D Viewport is in Edit Mode or Texture Paint Mode.
This can be useful to enable when an image is used as a reference.
Show Gizmo
Lets you show/hide all gizmos using the toggle button, or specific gizmos using
the drop-down arrow.
Navigate
Enable/disable the gizmos used to pan or zoom the 2D viewport.
See :ref:`Navigation Gizmos <editors-uv-navigate-gizmos>` for more information.
Show Overlays
Lets you show/hide all overlays using the toggle button, or specific overlays
using the drop-down arrow. See :doc:`/editors/uv/overlays`.
Active UV Loop Layer Active UV Loop Layer
Select which UV map to use. Select which UV map to use.
Viewport Gizmos
Selectively show or hide specific gizmo controls that are displayed in the 2D viewport.
All gizmos can be hidden or shown at once with the toggle next to the pop-over arrow.
Navigate
Enable/disable the gizmos used to pan or zoom the 2D viewport,
see :ref:`Navigation Gizmos <editors-uv-navigate-gizmos>` for more information.
Display Channels Display Channels
Select what color channels are displayed. Select what color channels are displayed.
:Color & Alpha: :Color & Alpha:
Replaces transparent pixels with background checkerboard, denoting the alpha channel. Enables transparency and shows a checkerboard behind the image.
:Color: :Color:
Display the colored image, without alpha channel. Displays the colored image, without alpha channel.
:Alpha: :Alpha:
Displays the Alpha channel a grayscale image. Displays the alpha channel as a grayscale image. White areas are opaque, black areas are transparent.
White areas are opaque, black areas have an alpha of 0.
:Z-Buffer: :Z-Buffer:
Display the depth from the camera, from Clip Start to Clip End, Displays the depth from the camera, from Clip Start to Clip End,
as specified in the :doc:`Camera settings </render/cameras>`. as specified in the :doc:`Camera settings </render/cameras>`.
:Red, Green, Blue: :Red, Green, Blue:
Single Color Channel visualized as a grayscale image. Single color channel visualized as a grayscale image.
Tool Settings
-------------
Pivot
Similar to working with pivot points in the 3D Viewport.
:doc:`UV Snapping </editors/uv/controls/snapping>`
Controls to snap UV points, similar to snapping in the 3D Viewport.
Proportional Editing
See :doc:`Proportional Editing </editors/3dview/controls/proportional_editing>`.

View File

@ -3,20 +3,12 @@
Navigating Navigating
********** **********
The UV Editor has a 2D cursor. Its position can be changed by :kbd:`LMB` clicking in the UV editor
while the cursor tool is active. You can also manually adjust its position in the Sidebar region.
The range by default is from 0.0 to 1.0 starting from the lower left corner.
By enabling :ref:`Pixel Coordinates <bpy.types.SpaceUVEditor.show_pixel_coords>`,
the coordinates match the pixels in your image with XY(0, 0) located in the lower left corner.
2D Viewport 2D Viewport
=========== ===========
Panning can be done by clicking the :kbd:`MMB` and dragging. Panning can be done by dragging with :kbd:`MMB`.
Zooming can be done by scrolling :kbd:`Wheel` up or down. Zooming can be done using :kbd:`Wheel` or :kbd:`NumpadPlus`/:kbd:`NumpadMinus`.
Also, as in the 3D Viewport, you can use :kbd:`NumpadPlus` or :kbd:`NumpadMinus` to zoom.
.. _editors-uv-navigate-gizmos: .. _editors-uv-navigate-gizmos:
@ -31,7 +23,24 @@ and zooming more comfortably when e.g. no mouse wheel is available.
View Menu View Menu
========= =========
Also see :doc:`/editors/image/navigating` in the Image editor. Also see :doc:`/editors/image/navigating` in the Image Editor.
Frame Selected :kbd:`NumpadPeriod` Frame Selected :kbd:`NumpadPeriod`
Change view so that all selected UV vertices are visible. Change the view so that all selected UV vertices are visible.
2D Cursor
=========
Just like the :doc:`3D Viewport </editors/3dview/3d_cursor>`, the UV Editor has a Cursor
that you can jump to (:menuselection:`View --> Center View to Cursor`). It can also serve as
a :doc:`pivot point </editors/3dview/controls/pivot_point/index>` and a
:ref:`snapping target <bpy.ops.uv.snap_selected>`.
To change the Cursor's position, either press :kbd:`LMB` with the Cursor tool selected,
or :kbd:`Shift-RMB` with any tool selected. You can also change the "Location X/Y" fields
in the *View* tab of the Sidebar, in either relative coordinates (0 to 1) or
:ref:`pixel coordinates <bpy.types.SpaceUVEditor.show_pixel_coords>`.
In both cases, the lower left corner of the image serves as the origin (0, 0).
You can press :kbd:`Shift-C` to move the Cursor to the center.

View File

@ -3,14 +3,17 @@
Overlays Overlays
******** ********
The Overlays popover configures the overlays that are displayed on top of images. .. figure:: /images/editors_uv_overlays.png
:align: right
The Overlays pop-over.
In the header, there is a button to turn off all overlays for the UV Editor. In the header, there is a button to turn off all overlays for the UV Editor.
This option also toggles the visibility of :doc:`/modeling/meshes/uv/workflows/udims` tile information. This option also toggles the visibility of :doc:`UDIM </modeling/meshes/uv/workflows/udims>`
The options that are visible in the pop-over depend on the UV Editor mode. tile information.
.. seealso:: The drop-down button opens a pop-over with more detailed settings.
The following categories are available:
Additional :doc:`View Properties </editors/uv/sidebar>` can be configured in the Sidebar.
Guides Guides
@ -19,26 +22,26 @@ Guides
.. _bpy.types.SpaceImageOverlay.show_grid_background: .. _bpy.types.SpaceImageOverlay.show_grid_background:
Grid Grid
Show the grid background and borders. Show the grid.
.. _bpy.types.SpaceUVEditor.show_grid_over_image: .. _bpy.types.SpaceUVEditor.show_grid_over_image:
Over Image Over Image
Allows the grid overlay to be shown on top of the image rather than behind it. Show the grid on top of the image rather than behind it.
.. _bpy.types.SpaceUVEditor.grid_shape_source: .. _bpy.types.SpaceUVEditor.grid_shape_source:
Grid Shape Source Grid Shape Source
How the size/subdivisions of grid cells are determined. How the row and column counts are determined.
:Dynamic: The grid subdivisions changes based on the zoom level. :Dynamic: The grid starts at 8×8 cells that are automatically subdivided further as you zoom in.
:Fixed: The grid subdivisions stays consistent based off the *Fixed Subdivisions* property. :Fixed: The row and column counts are fixed and can be configured manually.
:Pixel: The grid aligns with pixels from image so each grid cell represents one pixel. :Pixel: Each grid cell matches one image pixel.
.. _bpy.types.SpaceUVEditor.custom_grid_subdivisions: .. _bpy.types.SpaceUVEditor.custom_grid_subdivisions:
Fixed Subdivisions X, Y Fixed Subdivisions X, Y
Number of grid units in UV space that make one UV Unit. Number of columns/rows in the grid.
.. _bpy.types.SpaceUVEditor.tile_grid_shape: .. _bpy.types.SpaceUVEditor.tile_grid_shape:
@ -54,9 +57,9 @@ UV Editing
.. _bpy.types.SpaceUVEditor.show_stretch: .. _bpy.types.SpaceUVEditor.show_stretch:
Display Stretch Display Stretch
Shows how much of a difference there is between UV coordinates and 3D coordinates. Show how much of a shape difference there is between UV space and 3D space.
Blue means low distortion, while Red means high distortion. Blue means low distortion, red means high.
Choose to display the distortion of *Angles* or the *Area*. You can choose whether to display the distortion based on *Angle* or *Area*.
Geometry Geometry
@ -65,22 +68,22 @@ Geometry
.. _bpy.types.SpaceUVEditor.uv_opacity: .. _bpy.types.SpaceUVEditor.uv_opacity:
UV Opacity UV Opacity
Opacity of the above UV overlays. Opacity of edges and faces.
.. _bpy.types.SpaceUVEditor.edge_display_type: .. _bpy.types.SpaceUVEditor.edge_display_type:
Display As Display As
Controls how edges are shown. Control how edges are shown.
:Outline: Display white edges with black outline. :Outline: Display edges in gray with a black outline.
:Dash: Display dashed black-white edges. :Dash: Display edges as dashed black-gray lines.
:Black: Display black edges. :Black: Display edges in black.
:White: Display white edges. :White: Display edges in white.
.. _bpy.types.SpaceUVEditor.show_modified_edges: .. _bpy.types.SpaceUVEditor.show_modified_edges:
Modified Edges Modified Edges
Show results of modifiers in the UV display. Additionally show the edges as they look after applying modifiers (in gray).
.. _bpy.types.SpaceUVEditor.show_faces: .. _bpy.types.SpaceUVEditor.show_faces:
@ -92,4 +95,5 @@ Image
===== =====
Show Metadata Show Metadata
Displays the metadata if they were set in the render tab's :doc:`/render/output/properties/metadata` panel. Display metadata about the selected Render Result. See the Output tab's
:doc:`/render/output/properties/metadata` panel to change what metadata to include.

View File

@ -4,52 +4,39 @@
Selecting Selecting
********* *********
Selection tools are available in the *Select Menu* in the header, Much like the 3D Viewport, the UV Editor has selection mode buttons in the header,
and the shortcuts listed below. as well as a *Select* menu.
.. _bpy.types.ToolSettings.use_uv_select_sync: .. _bpy.types.ToolSettings.use_uv_select_sync:
Sync Selection Sync Selection
============== ==============
Turning on the *Sync Selection* button causes selection of components If turned off (the default), the UV Editor only shows the faces that are selected in the
in the 3D Viewport to sync with their corresponding elements in the UV editor. 3D Viewport. Selecting an item in one editor does not automatically select it in the other.
If off only the selected faces are displayed in the UV editor. If one 3D vertex/edge corresponds to multiple UV vertices/edges, you can select each
These two modes have very different results when transforming components in the UV editor. of those individually.
.. seealso::
:doc:`Selecting in the 3D Viewport </editors/3dview/selecting>`.
If turned on, the UV Editor always shows all faces. Selecting an item in one editor also
selects it in the other. If one 3D vertex/edge corresponds to multiple UV vertices/edges,
you can't select those individually (you can only select all of them).
.. _bpy.ops.uv.select_mode: .. _bpy.ops.uv.select_mode:
.. _bpy.types.ToolSettings.uv_select_mode: .. _bpy.types.ToolSettings.uv_select_mode:
Selection Modes Selection Mode
=============== ==============
Select Modes dependent on the Sync Selection. :Vertex: :kbd:`1` Select vertices.
:Edge: :kbd:`2` Select edges.
:Face: :kbd:`3` Select faces.
:Island: :kbd:`4` Select contiguous groups of faces. Only available if *Sync Selection* is disabled.
If *Sync Selection* is enabled, you can hold :kbd:`Shift` while clicking a selection mode to
activate multiple ones at the same time, or :kbd:`Ctrl` to expand/contract the selection.
Sync Selection Off .. seealso::
------------------ :doc:`Mesh Selection </modeling/meshes/selecting/introduction>`
:Vertex: Select individual vertices.
:Edge: Select edges.
:Face: Select faces.
:Island: Select contiguous groups of faces.
Sync Selection On
-----------------
When selecting UVs or Edges, it behaves like the *Shared Vertex* option of the *Sticky Selection Mode*.
When selecting Faces, it behaves like the *Disabled* option of the *Sticky Selection Mode*.
:Vertex: Select individual vertices.
:Edge: Select edges.
:Face: Select faces.
.. _bpy.types.ToolSettings.uv_sticky_select_mode: .. _bpy.types.ToolSettings.uv_sticky_select_mode:
@ -57,98 +44,100 @@ When selecting Faces, it behaves like the *Disabled* option of the *Sticky Selec
Sticky Selection Mode Sticky Selection Mode
===================== =====================
This selector lets you enable automatic additional selection. Options for automatically selecting additional UV vertices. Only available if *Sync Selection* is disabled.
:Shared Vertex: Disabled
Selects UVs that share a mesh vertex, even if they are in different UV locations. Each UV vertex can be selected independently of the others.
:Shared Location: Shared Location
Selects UVs that are in the same UV location and share a mesh vertex. Automatically select UV vertices that correspond to the same mesh vertex and have the same UV coordinates.
:Disabled: This is the default and gives the illusion that multiple faces in a UV map can share the same vertex;
Disables Sticky Selection. in reality, they have separate vertices that overlap.
When you move a UV in this mode, each face owns its own UVs, allowing them to be separated. Shared Vertex
Automatically select UV vertices that correspond to the same mesh vertex,
even if they have different UV coordinates.
This is also the behavior when *Sync Selection* is enabled.
Select Menu
===========
Menu All :kbd:`A`
==== Selects all UV elements.
None :kbd:`Alt-A`
Box Select :kbd:`B` Deselects all UV elements.
Click and drag to box select UV coordinates. Invert :kbd:`Ctrl-I`
Alternatively, use :kbd:`B` to start :ref:`box selection <tool-select-box>`.
Box Select Pinned :kbd:`Ctrl-B`
Use the box lasso to select only pinned UV coordinates.
Circle Select
See :ref:`tool-select-circle`.
Select All :kbd:`A`
Selects all UV coordinates.
Select None :kbd:`Alt-A`
Deselects all UV coordinate.
Inverse :kbd:`Ctrl-I`
Inverts the current selection. Inverts the current selection.
Box Select :kbd:`B`
See :ref:`Box Select <bpy.ops.*.select_box>`.
Box Select Pinned :kbd:`Ctrl-B`
Like *Box Select*, but only selects :ref:`pinned <bpy.ops.uv.pin>` UV vertices.
Circle Select
See :ref:`Circle Select <bpy.ops.*.select_circle>`.
More/Less :kbd:`Ctrl-NumpadPlus`, :kbd:`Ctrl-NumpadMinus` More/Less :kbd:`Ctrl-NumpadPlus`, :kbd:`Ctrl-NumpadMinus`
Expands/Contracts the selection to/from the adjacent elements of the selection type. Expands/contracts the selection to/from the adjacent elements.
Select Pinned :kbd:`Shift-P` Select Pinned :kbd:`Shift-P`
Selects all :ref:`pinned <bpy.ops.uv.pin>` UVs. Selects all pinned UVs.
Select Linked Select Linked
Linked :kbd:`Ctrl-L` Linked :kbd:`Ctrl-L`
This operator selects all UVs that are connected to currently selected UVs. Selects all elements that are connected to the currently selected ones.
This works similarly to the tools in 3D Viewport.
Shortest Path Shortest Path
Path between two selected elements. Selects the path between two selected elements. (See below)
.. _bpy.ops.uv.select_similar: .. _bpy.ops.uv.select_similar:
Select Similar :kbd:`Shift-G` Select Similar :kbd:`Shift-G`
Selects UV vertices that have certain similar properties to the :term:`Active` vertex. Selects UV elements that are similar to the :term:`active` one in some way.
The :ref:`bpy.ops.screen.redo_last` panel provides several selection options: The :ref:`bpy.ops.screen.redo_last` panel provides several options:
Type Type
The property to compare against the active vertex. The property to compare. Which properties are available depends on the
The properties that are shown depend on the :ref:`Selection Mode <bpy.types.ToolSettings.uv_select_mode>`. :ref:`Selection Mode <bpy.types.ToolSettings.uv_select_mode>`.
Vertex Selection Mode: Vertex Selection Mode
:Pinned: Selects vertices with the same :ref:`pinned <bpy.ops.uv.pin>` state.
:Pinned: Selects vertices with the same :ref:`pinned <bpy.ops.uv.pin>` state as the active vertex. Edge Selection Mode
:Length: Selects edges with a similar length in the UV map.
:Length 3D: Selects edges with a similar length in the 3D mesh.
:Pinned: Selects edges with the same pinned state.
Edge Selection Mode: Face Selection Mode
:Area: Selects faces with a similar area in the UV map.
:Length: Selects edges with a similar length. :Area 3D: Selects faces with a similar area in the 3D mesh.
:Length 3D: Selects edges with a similar length in world space coordinates.
:Pinned:
Selects edges whose both vertices have the same
:ref:`pinned <bpy.ops.uv.pin>` state as the active vertex.
Face Selection Mode:
:Area: Selects faces with a similar area.
:Area 3D: Selects faces with a similar area in world space coordinates.
:Material: Selects faces that have the same :doc:`Material </render/materials/index>`. :Material: Selects faces that have the same :doc:`Material </render/materials/index>`.
:Object: :Object:
Selects faces which have the same object. This is useful when multiple objects are in Edit mode at once. Selects faces that belong to the same object.
:Polygon Sides: Selects faces with the same number of edges per face. This is useful when multiple objects are in Edit mode at once.
:Winding: Select faces which are facing the same as the current face i.e. upwards or downwards. :Polygon Sides: Selects faces with a similar number of edges.
:Winding: Select faces that have the same orientation (facing upwards or downwards in the UV map).
Island Selection Mode: Island Selection Mode
:Area: Selects islands with a similar area in the UV map.
:Area: Selects islands with a similar area. :Area 3D: Selects islands with a similar area in the 3D mesh.
:Area 3D: Selects islands with a similar area in world space coordinates. :Amount of Faces in Island: Selects islands with a similar number of faces.
:Amount of Face in Island: Selects islands with a similar number of faces per each island.
Compare Compare
For quantitative properties, this property selects the type of comparison to between the two numerical values. The comparison operator.
:Equal: Select items with the same value as the active item's chosen property. :Equal: Select elements whose value is equal.
:Greater: Select items with a larger value as the active item's chosen property. :Greater: Select elements whose value is greater or equal.
:Less: Select items with a smaller value as the active item's chosen property. :Less: Select elements whose value is less or equal.
Threshold Threshold
For quantitative properties, this property controls how Tolerance for values that are almost, but not quite the same. A higher threshold will select more elements.
close the property's values have to be in the comparison.
Select Split :kbd:`Y` Select Split :kbd:`Y`
Cuts apart the selected UVs from the map. Only those UVs which belong to "Detaches" the selected faces so they can be moved elsewhere without affecting their neighbors.
fully selected faces remain selected. As the name implies, this is particularly useful to
unlink faces and move them elsewhere. The hotkey is analogous to the mesh Split tool. .. hint::
Unlike :doc:`Split Selection </modeling/meshes/editing/mesh/split>` for meshes, which physically disconnects
faces, this is a pure selection operator. In UV space, the faces were never connected to begin with;
it only seemed that way because *Sticky Selection* automatically selected the vertices of the neighboring faces.
*Select Split* deselects those vertices again.
As an alternative to *Select Split*, you can set the *Sticky Selection Mode* to *Disabled*.
Select Overlap Select Overlap
Selects any UVs that are extended over other UVs while also selecting any underlying UVs. Selects all UV faces that overlap each other.
.. _bpy.ops.uv.shortest_path_select: .. _bpy.ops.uv.shortest_path_select:
@ -163,46 +152,73 @@ Shortest Path
:Menu: :menuselection:`Select --> Select Linked --> Shortest Path` :Menu: :menuselection:`Select --> Select Linked --> Shortest Path`
:Shortcut: :kbd:`Ctrl-LMB` :Shortcut: :kbd:`Ctrl-LMB`
Selects all UV components along the shortest path from Selects all the UV elements along the shortest path between two elements: the two selected elements when
the active component to the one which was selected. activated using the menu, or the active one and the clicked one when activated using the shortcut.
Face Stepping Face Stepping
Supports diagonal paths for vertices and faces, and For vertices: allows the path to step across faces, following their diagonal rather than
selects edge rings with edges. their edges.
For edges: selects disconnected edges that are perpendicular to the path (edge ring),
rather than connected edges along the path (edge loop).
For faces: allows the path to go through faces that only share a vertex, rather than an edge.
Topological Distance Topological Distance
Only takes into account the number of edges of the path and Calculates the distance by simply counting edges rather than measuring their lengths.
not the length of the edges to calculate the distances.
Fill Region :kbd:`Shift-Ctrl-LMB` Fill Region :kbd:`Shift-Ctrl-LMB`
Selects all elements in the shortest paths from the active selection to the clicked area. Selects all shortest paths (rather than just one).
Checker Deselect Options Dashed Line Options
Allows to quickly select alternate elements in a path. Allows to only select elements at regular intervals, creating a "dashed line" rather
than a continuous one.
Deselected Deselected
The number of deselected elements in the repetitive sequence. The number of deselected elements in the repetitive sequence.
Selected Selected
The number of selected elements in the repetitive sequence. The number of selected elements in the repetitive sequence.
Offset Offset
Offset from the starting point. The number of elements to offset the sequence by.
.. seealso:: .. seealso::
Mesh edit :ref:`Select Shortest Path <bpy.ops.mesh.shortest_path_select>`. Mesh edit :ref:`Select Shortest Path <bpy.ops.mesh.shortest_path_select>`.
.. _bpy.ops.uv.select_edge_loop:
.. _bpy.ops.uv.select_edge_ring: Select Edge Loop
================
Select Edge Loops
=================
.. reference:: .. reference::
:Mode: Edit Mode :Mode: Edit Mode
:Shortcut: :kbd:`Ctrl-Alt-LMB`, or :kbd:`Shift-Ctrl-Alt-LMB` for modifying existing selection. :Shortcut: :kbd:`Alt-LMB`, or :kbd:`Shift-Alt-LMB` for extending the existing selection.
Holding :kbd:`Ctrl-Alt` while selecting a UV component selects a loop of edges that are connected in Holding :kbd:`Alt` while clicking an edge selects that edge and then expands the selection as far as
a line end-to-end, passing through the edge under the mouse pointer. possible in the two directions parallel to it. (While this of course works for selecting edge "loops"
Holding :kbd:`Shift-Ctrl-Alt` while clicking adds to the current selection. that go all the way around a mesh, it also works if there's no loop.)
You can additionally hold :kbd:`Shift` to extend the current selection rather than replacing it.
.. seealso:: .. seealso::
Mesh edit :ref:`Select Edge Loops <bpy.ops.mesh.loop_multi_select>`. Mesh edit :ref:`Select Edge Loops <bpy.ops.mesh.loop_select>`.
.. _bpy.ops.uv.select_edge_ring:
Select Edge Ring
================
.. reference::
:Mode: Edit Mode
:Shortcut: :kbd:`Ctrl-Alt-LMB`, or :kbd:`Shift-Ctrl-Alt-LMB` for extending the existing selection.
Holding :kbd:`Ctrl-Alt` while clicking an edge selects that edge and then expands the selection
as far as possible in the two directions perpendicular to it. (While this of course works for selecting
edge "rings" that go all the way around a mesh, it also works if there's no ring.)
You can additionally hold :kbd:`Shift` to extend the current selection rather than replacing it.
.. seealso::
Mesh edit :ref:`Select Edge Rings <bpy.ops.mesh.select_edge_ring>`.

View File

@ -9,7 +9,7 @@ Image Tab
UV Vertex UV Vertex
--------- ---------
Transform Properties :doc:`Selecting UVs </modeling/meshes/uv/editing>`. The averaged-out position of the selected UV vertices.
Image Image
@ -21,7 +21,7 @@ See :doc:`/editors/image/image_settings`.
UDIM Tiles UDIM Tiles
---------- ----------
Allows you to manage :doc:`UDIM Tiles </modeling/meshes/uv/workflows/udims>`. See :doc:`UDIM Tiles </modeling/meshes/uv/workflows/udims>`.
Tool Tab Tool Tab
@ -36,40 +36,34 @@ View Tab
Display Display
------- -------
You can set the editors display options in this panel. You can set the editor's display options in this panel.
.. figure:: /images/editors_uv_sidebar_display-panel.png Aspect Ratio X, Y
:align: right Display aspect for this image. Does not affect rendering.
Display panel: With both an image and UVs selected.
Aspect Ratio
Display Aspect for this image. Does not affect rendering.
Repeat Image Repeat Image
Duplicate the image until it is repeated to fill the main view. Tile the image so it completely fills the editor.
.. _bpy.types.SpaceUVEditor.show_pixel_coords: .. _bpy.types.SpaceUVEditor.show_pixel_coords:
Pixel Coordinates Pixel Coordinates
Display UV coordinates in pixels rather than from 0.0 to 1.0 Use pixel coordinates rather than relative coordinates (0 to 1) for the UV Vertex
and 2D Cursor Location fields.
2D Cursor 2D Cursor
--------- ---------
Location X, Y Location X, Y
Control 2D cursor location. View and change the location of the 2D Cursor.
Annotations Annotations
----------- -----------
Options for the :doc:`annotation tool </interface/annotate_tool>`. Options for the :doc:`Annotate tool </interface/annotate_tool>`.
.. (TODO add) images per type
Scopes Scopes
====== ======

View File

@ -23,7 +23,7 @@ The gizmos however are unique for the Preview.
.. figure:: /images/editors_vse_type.svg .. figure:: /images/editors_vse_type.svg
:alt: Preview window :alt: Preview window
Figure 1: Preview window of VSE. Figure 1: Preview window of Video Sequencer.
Sequencer preview is used to display result of rendering Sequencer timeline. Sequencer preview is used to display result of rendering Sequencer timeline.
This can be further configured to display output from certain channel, overlay or image analyzer (scope). This can be further configured to display output from certain channel, overlay or image analyzer (scope).

View File

@ -89,6 +89,9 @@ Materials
See `USD issue #542 <https://github.com/PixarAnimationStudios/USD/issues/542>`__ See `USD issue #542 <https://github.com/PixarAnimationStudios/USD/issues/542>`__
for more information. for more information.
Root Prim
If set, add a transform primitive with the given path to the stage as the parent of all exported data.
Use Settings for Use Settings for
Determines the whether to use *Viewport* or *Render* visibility of collection, modifiers, Determines the whether to use *Viewport* or *Render* visibility of collection, modifiers,
or any other property that can be set for both the *Viewport* and *Render*. or any other property that can be set for both the *Viewport* and *Render*.

View File

@ -61,6 +61,13 @@ Disable Wayland (forcing X11)
WAYLAND_DISPLAY="" blender WAYLAND_DISPLAY="" blender
Disable ``libdecor`` (forcing borderless windows under Gnome-Shell)
Uninstall ``libdecor``, then run Blender with an empty X11 display variable.
.. code-block:: sh
DISPLAY="" blender
Environment Variables Environment Variables
--------------------- ---------------------
@ -75,14 +82,11 @@ Environment Variables
Known Limitations Known Limitations
----------------- -----------------
Gnome Shell's Fractional Scaling Gnome Shell's Fractional Scaling (before version 44)
While Blender supports fractional scaling on KDE & WLROOT's based compositors, Versions of Gnome-Shell prior to 44 don't fully support fractional scaling.
gnome-shell-43 has an experimental fractional scaling which is enabled by default on Ubuntu
internally this renders a larger buffer then down-scales it and may cause minor glitches such as a
`small cursor size <https://projects.blender.org/blender/blender/issues/105895>`__.
Wayland now has an API handle fractional scaling (``wp-fractional-scale-v1``), Using fractional under older versions of Gnome-Shell may result in glitches such as a
which should eventually resolve this issue. `small cursor size <https://projects.blender.org/blender/blender/issues/105895>`__.
NVidia GPU NVidia GPU
Currently NVidia drivers don't fully support features needed for Wayland. Graphical glitches and flickering are Currently NVidia drivers don't fully support features needed for Wayland. Graphical glitches and flickering are
@ -127,17 +131,11 @@ Feature Comparison
- |cross| :sup:`*2` - |cross| :sup:`*2`
- | Needed for dragging between windows and - | Needed for dragging between windows and
| restoring window positions on file load. | restoring window positions on file load.
* - Window Raise/Lower
- |tick|
- |cross| :sup:`*2`
- | Used to bring the render window
| to the foreground.
Other features which both systems support such as Hi-DPI, 3D-mouse, tablet input, ... etc. Other features which both systems support such as Hi-DPI, 3D-mouse, tablet input, ... etc.
have been left out of this list. have been left out of this list.
| :sup:`*1` In X11 fast cursor motion may exit the window bounds while the cursor is grabbed (transforming for e.g.). | :sup:`*1` In X11 fast cursor motion may exit the window bounds while the cursor is grabbed (transforming for e.g.).
| :sup:`*2` Wayland doesn't support setting the window position & depth, | :sup:`*2` Wayland doesn't support setting the window position,
as this is a design decision it's unlikely to be supported (see issues for as this is a design decision it's unlikely to be supported
`position <https://projects.blender.org/blender/blender/issues/98928>`__ and (see issues for `position <https://projects.blender.org/blender/blender/issues/98928>`__).
`depth <https://projects.blender.org/blender/blender/issues/102985>`__).

View File

@ -58,13 +58,13 @@ Adjust the levels of Color Attributes.
.. _bpy.ops.gpencil.vertex_color_hsv: .. _bpy.ops.gpencil.vertex_color_hsv:
Hue Saturation Value Hue/Saturation/Value
==================== ====================
.. reference:: .. reference::
:Mode: Vertex Paint Mode :Mode: Vertex Paint Mode
:Menu: :menuselection:`Paint --> Hue Saturation Value` :Menu: :menuselection:`Paint --> Hue/Saturation/Value`
Adjust the color's HSV values. Adjust the color's HSV values.

View File

@ -8,5 +8,5 @@
introduction.rst introduction.rst
tools.rst tools.rst
tool_settings/brush.rst tool_settings/index.rst
weights_menu.rst weights_menu.rst

View File

@ -1,8 +1,8 @@
.. _tool-grease-pencil-weight-paint-weight: .. _tool-grease-pencil-weight-paint-weight:
***** **************
Brush Brush Settings
***** **************
Painting needs paint brushes and Blender provides a Brush panel within the Toolbar Painting needs paint brushes and Blender provides a Brush panel within the Toolbar
when in *Weight Paint Mode*. when in *Weight Paint Mode*.
@ -11,12 +11,17 @@ Brush
In the :ref:`Data-Block menu <ui-data-block>` you find predefined Brush presets. In the :ref:`Data-Block menu <ui-data-block>` you find predefined Brush presets.
And you can create your own custom presets as needed. And you can create your own custom presets as needed.
Radius Radius :kbd:`F`
The radius defines the area of influence of the brush. The radius defines the area of influence of the brush.
Strength Strength
This is the amount of paint to be applied per brush stroke. This is the amount of paint to be applied per brush stroke.
Use Falloff Use Falloff
When enabled, use Strength falloff for the brush. When enabled, use Strength falloff for the brush.
Brush Strength decays with the distance from the center of the brush. Brush Strength decays with the distance from the center of the brush.
Weight Weight :kbd:`Ctrl-F`
The weight (visualized as a color) to be used by the brush. The weight (visualized as a color) to be used by the brush.
Using :kbd:`Ctrl-RMB` you can set the weight to the value thats under the cursor.
Direction :kbd:`D`
Brush direction toggle, *Add* adds weight value while *Subtract* removes weight value.
This setting can be toggled with :kbd:`D`.

View File

@ -0,0 +1,10 @@
#################
Tool Settings
#################
.. toctree::
:maxdepth: 2
brush.rst
options.rst

View File

@ -0,0 +1,16 @@
*******
Options
*******
Auto Normalize
Ensures that all deforming vertex groups add up to one while painting.
When this option is turned off, then all weights of a point can have any value between 0 and 1.
However, when vertex groups are used as deform groups for character animation
then Blender always interprets the weight values relative to each other.
That is, Blender always does a normalization over all deform bones.
Hence in practice it is not necessary to maintain a strict normalization and
further normalizing weights should not affect animation at all.
This option works most intuitively when used to maintain normalization while
painting on top of weights that are already normalized with another tool.

View File

@ -14,6 +14,17 @@ See :doc:`Brush </grease_pencil/modes/weight_paint/tool_settings/brush>` for mor
Draw Draw
Paints a specified weight over the strokes. Paints a specified weight over the strokes.
Blur
Smooths out the weighting of adjacent points. In this mode the Weight
Value is ignored. The strength defines how much the smoothing is applied.
Average
Smooths weights by painting the average resulting weight from all weights under the brush.
Smear
Smudges weights by grabbing the weights under the brush and "dragging" them.
This can be imagined as a finger painting tool.
:ref:`Annotate <tool-annotate-freehand>` :ref:`Annotate <tool-annotate-freehand>`
Draw free-hand annotation. Draw free-hand annotation.

View File

@ -92,12 +92,9 @@ Contour
Where the edge becomes the separation line of front/backfacing faces. Where the edge becomes the separation line of front/backfacing faces.
The silhouette can also be inverted by clicking the invert button. The silhouette can also be inverted by clicking the invert button.
:None: Not filtering any lines based on illumination region. :Contour: Generate lines from contour.
:Illuminated: Only selecting lines from illuminated regions. :Silhouette: Only generate lines from the silhouette of the source objects as a whole.
:Shaded: Only selecting lines from shaded regions. :Individual Silhouette: Generate lines from the individual silhouettes of the source objects.
:Illuminated (Enclosed Shapes):
Selecting lines from lit regions, and make the combination of contour,
light contour and shadow lines into enclosed shapes.
.. _bpy.types.LineartGpencilModifier.use_crease: .. _bpy.types.LineartGpencilModifier.use_crease:
@ -145,7 +142,7 @@ Cast Shadow
.. _bpy.types.LineartGpencilModifier.use_overlap_edge_type_support: .. _bpy.types.LineartGpencilModifier.use_overlap_edge_type_support:
Allow Overlap Allow Overlapping Types
Allow an edge to have multiple overlapping types. Allow an edge to have multiple overlapping types.
This will create a separate stroke for each overlapping type. This will create a separate stroke for each overlapping type.

Binary file not shown.

BIN
manual/images/editors_uv_overlays.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -32,12 +32,12 @@ Outputs
Mesh Mesh
Mesh component of the input geometry. Mesh component of the input geometry.
Point Cloud
Point cloud component of the input geometry.
Curve Curve
Curve component of the input geometry. Curve component of the input geometry.
Point Cloud
Point cloud component of the input geometry.
Volume Volume
Volume component of the input geometry. Volume component of the input geometry.

View File

@ -4,7 +4,7 @@
Smooth Hair Curves Smooth Hair Curves
****************** ******************
Smoothes the shape of hair curves. Smooths the shape of hair curves.
.. peertube:: 7fpUB2eRT6zjMyHRzJ2ZoJ .. peertube:: 7fpUB2eRT6zjMyHRzJ2ZoJ

View File

@ -193,10 +193,8 @@ Follow Active Quads
:Menu: :menuselection:`UV --> Follow Active Quads` :Menu: :menuselection:`UV --> Follow Active Quads`
:Shortcut: :kbd:`U` :Shortcut: :kbd:`U`
The Follow Active Quads tool takes the selected faces and lays them out Extrapolate UV's based on the active quad by following continuous face loops,
by following continuous face loops, even if the mesh face is irregularly-shaped. even if the mesh face is irregularly-shaped.
Note that it does not respect the image size,
so you may have to scale them all down a bit to fit the image area.
Options Options
@ -205,16 +203,27 @@ Options
Edge Length Mode Edge Length Mode
Method to space UV edge loops. Method to space UV edge loops.
:Even: Space all UVs evenly. :Even:
:Length: Todo. Space all UVs evenly, where the shape of the quad in the 3D viewport is ignored.
:Length Average: Average space UVs edge length of each loop. :Length:
Each face's UV's are calculated based on the edge length.
While this minimizes distortion, adjacent loops may become disconnected.
:Length Average:
Average space UVs edge length of each loop.
This has the benefit of minimizing distortion, while keeping UV's connected.
.. note:: .. note::
Please note that it is the shape of the active quad in UV space that is being followed, For a clean 90-degree unwrap it's typically best to first make sure the quad a rectangle in UV space.
not its shape in 3D space. To get a clean 90-degree unwrap make sure the active quad is
a rectangle in UV space before using "Follow active quad".
Otherwise any distortion in the active UV is extended which doesn't result in a useful grid-layout.
.. note::
The resulting unwrap is not clamped within the UV bounds,
you may wish to scale down the active quad's UV's so the result is in a usable range.
.. _bpy.ops.uv.cube_project: .. _bpy.ops.uv.cube_project:

View File

@ -5,6 +5,10 @@
Volume Displace Modifier Volume Displace Modifier
************************ ************************
.. reference::
This modifier is only available for :doc:`Volume Objects </modeling/volumes/index>`.
The *Volume Displace* modifier displaces existing volume grids based on a 3D texture. The *Volume Displace* modifier displaces existing volume grids based on a 3D texture.
It uses the RGB color channels of the texture to displace the volume into the X, Y and Z direction. It uses the RGB color channels of the texture to displace the volume into the X, Y and Z direction.

View File

@ -5,6 +5,10 @@
Mesh to Volume Modifier Mesh to Volume Modifier
*********************** ***********************
.. reference::
This modifier is only available for :doc:`Volume Objects </modeling/volumes/index>`.
The *Mesh to Volume* modifier uses a mesh to create a new volume grid. The *Mesh to Volume* modifier uses a mesh to create a new volume grid.
All previously existing volume grids on the volume object are discarded. All previously existing volume grids on the volume object are discarded.
So this modifier is usually added to an empty volume object. So this modifier is usually added to an empty volume object.

View File

@ -15,9 +15,12 @@ That particle system will control how the mesh is exploded.
Both the number of emitted particles and number of faces determine how granular the *Explode* modifier is. Both the number of emitted particles and number of faces determine how granular the *Explode* modifier is.
More of each faces and particles will mean more individual pieces. More of each faces and particles will mean more individual pieces.
Here is a `demo video <https://archive.blender.org/wiki/index.php/File:Manual_-_Explode_Modifier_-_Exploding_Cube_-_ Here is a
2.5.ogg/>`__ showing a cube with a particle system and *Explode* modifier. (`blend-file <https://archive.blender.org/ `demo video <https://archive.blender.org/wiki/index.php/File:Manual_-_Explode_Modifier_-_Exploding_Cube_
wiki/index.php/File:Manual_-_Explode_Modifier_-_Exploding_Cube_-_2.5.blend>`__). -_2.5.ogg/>`__
showing a cube with a particle system and *Explode* modifier.
(`blend-file <https://archive.blender.org/wiki/index.php/File:Manual_-_Explode_Modifier_-_Exploding_Cube_
-_2.5.blend>`__).
.. note:: .. note::

View File

@ -15,6 +15,8 @@ Most of the settings in the *Shape* panel are shared with those of
:doc:`Curves </modeling/curves/properties/shape>` :doc:`Curves </modeling/curves/properties/shape>`
data-blocks, please refer to those for details. data-blocks, please refer to those for details.
.. _bpy.types.TextCurve.use_fast_edit:
Fast Editing Fast Editing
Does not fill the letters in Edit Mode, only show their outline. Does not fill the letters in Edit Mode, only show their outline.
@ -101,18 +103,39 @@ but you have to choose between different styles of a same font, or different fon
Blender has a number of typographic controls for changing the style and layout of text, Blender has a number of typographic controls for changing the style and layout of text,
found in the *Font* panel. found in the *Font* panel.
.. _bpy.types.TextCharacterFormat.use_bold:
Bold Bold
Toggled with the *Bold* button before typing. Text can also be set to With no text selected, toggles new text to be **bold**.
**bold** by selecting it then using the *Bold* entry in the *Text* menu of With text selected, toggles the selected text to be **bold**.
the 3D Viewport. Text can also be set to bold by selecting it then using the *Bold*
Italics entry in the *Text* menu of the 3D Viewport.
Toggled with the *Italic* button before typing. Text can also be set to
*italic* by selecting it then using the *Italic* entry in the *Text* menu of .. _bpy.types.TextCharacterFormat.use_italic:
the 3D Viewport.
Italic
With no text selected, toggles new text to be *italic*.
With text selected, toggles the selected text to be *italic*.
Text can also be set to italic by selecting it then using the *Bold*
entry in the *Text* menu of the 3D Viewport.
.. _bpy.types.TextCharacterFormat.use_underline:
Underline Underline
Enables underlining, as controlled by the :ref:`underline settings <modeling-text-character-underline>` below. With no text selected, toggles new text to be underline.
With text selected, toggles the selected text to be underline.
Text can also be set to underline by selecting it then using the *Underline*
entry in the *Text* menu of the 3D Viewport.
See also :ref:`underline settings <modeling-text-character-underline>` below.
.. _bpy.types.TextCharacterFormat.use_small_caps:
Small Caps Small Caps
Enable this option to type characters as small caps. With no text selected, toggles new text to be small capitals.
With text selected, toggles the selected text to be small capitals.
Text can also be set to small caps by selecting it then using the *Small Caps*
entry in the *Text* menu of the 3D Viewport.
The size of the *Small Caps* can be changed with The size of the *Small Caps* can be changed with
the :ref:`Small Caps Scale setting <modeling-text-character-underline>`. the :ref:`Small Caps Scale setting <modeling-text-character-underline>`.
@ -121,9 +144,14 @@ Small Caps
Transform Transform
--------- ---------
.. _bpy.types.TextCurve.size:
Size Size
Controls the size of the whole text (no way to control each char size independently). Controls the size of the whole text (no way to control each char size independently).
Note however, that chars with different fonts (different styles, see below) might have different visible sizes. Note however, that chars with different fonts (different styles, see below) might have different visible sizes.
.. _bpy.types.TextCurve.shear:
Shear Shear
Controls the inclination of the whole text. Controls the inclination of the whole text.
As similar as it may seem, this is not the same thing as italics style. As similar as it may seem, this is not the same thing as italics style.
@ -133,6 +161,8 @@ Shear
Shear example. Shear example.
.. _bpy.types.TextCurve.family:
Object Font Object Font
Allows individual objects to be used to render fonts, you can create/model your own complex font inside Blender! Allows individual objects to be used to render fonts, you can create/model your own complex font inside Blender!
This field is used to select the objects prefix name (object "family") to be used This field is used to select the objects prefix name (object "family") to be used
@ -153,6 +183,8 @@ Object Font
The objects are duplicated so that their center is positioned at The objects are duplicated so that their center is positioned at
the *lower right corner* of the corresponding characters. the *lower right corner* of the corresponding characters.
.. _bpy.types.TextCurve.follow_curve:
Text on Curve Text on Curve
Select a curve object for the text object to follow. Select a curve object for the text object to follow.
@ -167,15 +199,18 @@ Text on Curve
which offers more control, and is the standard way to achieve such effects in modern Blender. which offers more control, and is the standard way to achieve such effects in modern Blender.
.. _modeling-text-character-underline: .. _modeling-text-character-underline:
.. _bpy.types.TextCurve.underline_position:
Underline
Toggled with the *Underline* button before typing.
Text can also be set to Underlined by selecting it
then using the *Underline* entry in the *Text* menu of the 3D Viewport.
Underline Position Underline Position
This allows you to shift vertically the position of the underline. This allows you to shift vertically the position of the underline.
.. _py.types.TextCurve.underline_height:
Underline Thickness Underline Thickness
This controls the thickness of the underline. This controls the thickness of the underline.
.. _bpy.types.TextCurve.small_caps_scale:
Small Caps Scale Small Caps Scale
The scaling applied to capital letters to turn them into small caps. The scaling applied to capital letters to turn them into small caps.
@ -198,6 +233,8 @@ The *Paragraph* Panel has settings for the alignment and spacing of text.
Alignment Alignment
--------- ---------
.. _bpy.types.TextCurve.align_x:
Horizontal Horizontal
:Left: :Left:
Aligns text to the left of the frames when using them, Aligns text to the left of the frames when using them,
@ -218,6 +255,8 @@ Horizontal
.. note:: Both *Justify* and *Flush* only work within frames. .. note:: Both *Justify* and *Flush* only work within frames.
.. _bpy.types.TextCurve.align_y:
Vertical Vertical
:Top: :Top:
- With text boxes, aligns the top of the text to the top of the frames. - With text boxes, aligns the top of the text to the top of the frames.
@ -247,16 +286,27 @@ Vertical
Spacing Spacing
------- -------
.. _bpy.types.TextCurve.space_character:
Character Spacing Character Spacing
A factor by which space between each character (kerning) is scaled in width. A factor by which space between each character (kerning) is scaled in width.
In Edit Mode in the 3D Viewport, you can also control individual kerning In Edit Mode in the 3D Viewport, you can also control individual kerning
at text cursor position by pressing :kbd:`Alt-Left` / :kbd:`Alt-Right` to decrease/increase it. at text cursor position by pressing :kbd:`Alt-Left` / :kbd:`Alt-Right` to decrease/increase it.
.. _bpy.types.TextCurve.space_word:
Word Spacing Word Spacing
A factor by which whitespace between words is scaled in width. A factor by which whitespace between words is scaled in width.
.. _bpy.types.TextCurve.space_line:
Line Spacing Line Spacing
A factor by which the vertical space between lines is scaled. A factor by which the vertical space between lines is scaled.
.. _bpy.types.TextCurve.offset_x:
.. _bpy.types.TextCurve.offset_y:
Offset X, Y Offset X, Y
These settings control the X and Y offset of the text position within the object. These settings control the X and Y offset of the text position within the object.
This applies relatively to the object's origin, either to the whole text or, when using text boxes, to each frame. This applies relatively to the object's origin, either to the whole text or, when using text boxes, to each frame.
@ -284,13 +334,19 @@ If the last frame is reached, text overflows out of it (by default, see options
Text Boxes panel. Text Boxes panel.
.. _bpy.ops.font.textbox_add:
Add Textbox Add Textbox
Inserts a new frame, just after the current one (in text flow order). Inserts a new frame, just after the current one (in text flow order).
The new frame will have the same size and position as the selected one. The new frame will have the same size and position as the selected one.
.._bpy.ops.font.textbox_remove:
Delete ``X`` Delete ``X``
Delete the current frame. Delete the current frame.
.. _bpy.types.TextCurve.overflow:
Overflow Overflow
How to handle text overflowing available space in the defined boxes. How to handle text overflowing available space in the defined boxes.
@ -306,10 +362,15 @@ Overflow
It will only truncate in *Object Mode*, It will only truncate in *Object Mode*,
in *Edit Mode* the whole text remains visible (and overflows as needed). in *Edit Mode* the whole text remains visible (and overflows as needed).
.. _bpy.types.TextBox.width:
Size X, Y Size X, Y
Specifies the width and height of the text box, if set to **zero** no word wrapping happens Specifies the width and height of the text box, if set to **zero** no word wrapping happens
(it is ignored, and the whole text box system is disabled if all are set to a null size). (it is ignored, and the whole text box system is disabled if all are set to a null size).
.. _bpy.types.TextBox.x:
.. _bpy.types.TextBox.y:
Offset X, Y Offset X, Y
Controls the *X* and *Y* offset of the frame, i.e. its position. Controls the *X* and *Y* offset of the frame, i.e. its position.

View File

@ -15,6 +15,8 @@ it determines where new chars will be inserted.
Select All :kbd:`Ctrl-A` Select All :kbd:`Ctrl-A`
Selects the full text. Selects the full text.
Top/Bottom :kbd:`Shift-Ctrl-Home`/ :kbd:`Shift-Ctrl-End`
Moves the cursor to the start or end of the text object.
Next/Previous Character :kbd:`Left`/ :kbd:`Right` Next/Previous Character :kbd:`Left`/ :kbd:`Right`
You can move the cursor with the arrow keys. You can move the cursor with the arrow keys.
Next/Previous Word :kbd:`Ctrl-Left`/ :kbd:`Ctrl-Right` Next/Previous Word :kbd:`Ctrl-Left`/ :kbd:`Ctrl-Right`

View File

@ -49,8 +49,8 @@ Soft bodies are well suited for:
The following videos may give you some more ideas: The following videos may give you some more ideas:
- https://www.youtube.com/watch?v=hLnY-OFUBzM - `New Penguoen <https://www.youtube.com/watch?v=hLnY-OFUBzM>`__.
- https://www.youtube.com/watch?v=qdusMZlBbQ4 - `Blender Softbody Simulations <https://www.youtube.com/watch?v=qdusMZlBbQ4>`__.
Creating a Soft Body Creating a Soft Body

View File

@ -246,8 +246,7 @@ but the only real solution is to use separate graphics cards for display and ren
Another solution can be to increase the time-out, Another solution can be to increase the time-out,
although this will make the user interface less responsive when rendering heavy scenes. although this will make the user interface less responsive when rendering heavy scenes.
`Learn More Here <https://learn.microsoft.com/en-us/windows-hardware/drivers/display/timeout-detection-and- `Learn More Here <https://learn.microsoft.com/en-us/windows-hardware/drivers/display/timeout-detection-and-recovery>`__.
recovery>`__.
CUDA error: Unknown error in cuCtxSynchronize() CUDA error: Unknown error in cuCtxSynchronize()

View File

@ -175,7 +175,7 @@ Training Samples
.. _bpy.types.CyclesRenderSettings.use_surface_guiding: .. _bpy.types.CyclesRenderSettings.use_surface_guiding:
Surface Surface
Enable path guiding for the diffuse component of surfaces. Enable path guiding for the diffuse and glossy components of surfaces.
.. _bpy.types.CyclesRenderSettings.use_volume_guiding: .. _bpy.types.CyclesRenderSettings.use_volume_guiding:

View File

@ -53,8 +53,8 @@ Falloff
.. figure:: /images/render_cycles_world-settings_mist-example1-BI.jpg .. figure:: /images/render_cycles_world-settings_mist-example1-BI.jpg
Mist example (`blend-file <https://archive.blender.org/wiki/index.php/File:25-Manual-World-Mist- Mist example
Example1.blend>`__). (`blend-file <https://archive.blender.org/wiki/index.php/File:25-Manual-World-Mist-Example1.blend>`__).
.. _bpy.types.CyclesVisibilitySettings.camera: .. _bpy.types.CyclesVisibilitySettings.camera:

View File

@ -91,7 +91,7 @@ Frame Sequence Workflow
======================= =======================
#. First prepare your animation. #. First prepare your animation.
#. In the *Dimensions* panel, choose the render size, Pixel Aspect Ratio, and the Range of Frames to use, #. In the *Format* panel, choose the render size, Pixel Aspect Ratio, and the Range of Frames to use,
as well as the frame rate, which should already be set. as well as the frame rate, which should already be set.
#. In the Output panel set up your animation to be rendered out as images, #. In the Output panel set up your animation to be rendered out as images,
generally using a format that does not compromise any quality. generally using a format that does not compromise any quality.

View File

@ -9,7 +9,7 @@
bright_contrast.rst bright_contrast.rst
gamma.rst gamma.rst
hue_saturation.rst hue_saturation.rst
invert.rst invert_color.rst
light_falloff.rst light_falloff.rst
mix.rst mix.rst
rgb_curves.rst rgb_curves.rst

View File

@ -1,4 +1,4 @@
.. _bpy.types.ShaderNodeInvert: .. _bpy.types.ShaderNodeInvert:
.. DO NOT EDIT FILE. This is simply a stub which copies everything from the link below. .. DO NOT EDIT FILE. This is simply a stub which copies everything from the link below.
.. include:: /compositing/types/color/invert.rst .. include:: /compositing/types/color/invert_color.rst
:start-after: .. --- copy below this line --- :start-after: .. --- copy below this line ---

View File

@ -157,14 +157,19 @@ Other
Attributes Attributes
========== ==========
Some object, particle and mesh attributes are available to the built-in ``getattribute()`` function. Geometry attributes can be read through the ``getattribute()`` function.
UV maps and Color Attributes can be retrieved using their name. This includes UV maps, color attributes and any attributes output from geometry nodes.
Other attributes are listed below:
The following built-in attributes are available through ``getattribute()`` as well.
``geom:generated`` ``geom:generated``
Generated texture coordinates. Automatically generated texture coordinates, from undeformed mesh.
``geom:uv`` ``geom:uv``
Default render UV map. Default render UV map.
``geom:tangent``
Default tangent vector along surface, in object space.
``geom:undisplaced``
Position before displacement, in object space.
``geom:dupli_generated`` ``geom:dupli_generated``
For instances, generated coordinate from instancer object. For instances, generated coordinate from instancer object.
``geom:dupli_uv`` ``geom:dupli_uv``
@ -177,26 +182,38 @@ Other attributes are listed below:
Vertex coordinates array of the polygon (always three vertices currently). Vertex coordinates array of the polygon (always three vertices currently).
``geom:name`` ``geom:name``
Name of the object. Name of the object.
``geom:is_smooth``
Is mesh face smooth or flat shaded.
``geom:is_curve`` ``geom:is_curve``
Is object a strand or not. Is object a curve or not.
``geom:curve_intercept`` ``geom:curve_intercept``
Point along the strand, from root to tip. 0..1 coordinate for point along the curve, from root to tip.
``geom:curve_thickness`` ``geom:curve_thickness``
Thickness of the strand. Thickness of the curve in object space.
``geom:curve_length``
Length of the curve in object space.
``geom:curve_tangent_normal`` ``geom:curve_tangent_normal``
Tangent Normal of the strand. Tangent Normal of the strand.
``geom:is_point``
Is point in a point cloud or not.
``geom:point_radius``
Radius of point in point cloud.
``geom:point_position``
Center position of point in point cloud.
``geom:point_random``
Random number, different for every point in point cloud.
``path:ray_length`` ``path:ray_length``
Ray distance since last hit. Ray distance since last hit.
``object:random``
Random number, different for every object instance.
``object:index``
Object unique instance index.
``object:location`` ``object:location``
Object location. Object location.
``object:index``
Object index number.
``object:random``
Per object random number generated from object index and name.
``material:index`` ``material:index``
Material index number. Material unique index number.
``particle:index`` ``particle:index``
Particle instance number. Particle unique instance number.
``particle:age`` ``particle:age``
Particle age in frames. Particle age in frames.
``particle:lifetime`` ``particle:lifetime``
@ -226,3 +243,16 @@ This function cannot be used instead of lighting;
the main purpose is to allow shaders to "probe" nearby geometry, the main purpose is to allow shaders to "probe" nearby geometry,
for example to apply a projected texture that can be blocked by geometry, for example to apply a projected texture that can be blocked by geometry,
apply more "wear" to exposed geometry, or make other ambient occlusion-like effects. apply more "wear" to exposed geometry, or make other ambient occlusion-like effects.
Metadata
========
Metadata on parameters controls their display in the user interface. The following
metadata is supported:
``[[ string label = "My Label" ]]``
Name of parameter in in the user interface
``[[ string widget = "null" ]]``
Hide parameter in the user interface.
``[[ string widget = "boolean" ]]`` and ``[[ string widget = "checkbox" ]]``
Display integer parameter as a boolean checkbox.

View File

@ -63,7 +63,7 @@ Projection
this origin onto this sphere. This projection is, of course, perfect for spherical objects this origin onto this sphere. This projection is, of course, perfect for spherical objects
such as planets, and is also useful for organic objects. such as planets, and is also useful for organic objects.
:Tube: :Tube:
Wrap the image around a cylinder with origin (0.5, 0.5, 0) and height 1, and project the Wrap the image around a cylinder with base (0.5, 0.5, 0) and height 1, and project the
*Vector* horizontally from the central axis onto this cylinder. This projection is useful for *Vector* horizontally from the central axis onto this cylinder. This projection is useful for
a label on a bottle, for example. However, it's not suited for the top or bottom side of objects. a label on a bottle, for example. However, it's not suited for the top or bottom side of objects.

View File

@ -135,7 +135,7 @@ Size X, Y, Z
Sample Bias :guilabel:`Sculpt Mode` Sample Bias :guilabel:`Sculpt Mode`
Value added to texture samples. Value added to texture samples.
This can be used if the midlevel of a height map is not correct. This can be used if the mid-level of a height map is not correct.
.. _bpy.types.Brush.use_color_as_displacement: .. _bpy.types.Brush.use_color_as_displacement:

View File

@ -12,7 +12,7 @@ When executed, it uniformly expand outwards a pattern from the vertex under the
These operators are meant to be used interactively through the shortcut. These operators are meant to be used interactively through the shortcut.
There is also a `full showcase of the Expand features and use cases <https://www.youtube.com/watch?v=XT7h6lmE5bc>`_. There is also a `full showcase of the Expand features and use cases <https://www.youtube.com/watch?v=XT7h6lmE5bc>`__.
.. figure:: /images/sculpt-paint_sculpting_expand_example.png .. figure:: /images/sculpt-paint_sculpting_expand_example.png

View File

@ -27,4 +27,4 @@ but other transform brushes like :doc:`Pose </sculpt_paint/sculpting/tools/pose>
:doc:`Boundary </sculpt_paint/sculpting/tools/boundary>` also support cloth sculpting in the brush settings. :doc:`Boundary </sculpt_paint/sculpting/tools/boundary>` also support cloth sculpting in the brush settings.
A demo file for trying out the various brushes and tools is available A demo file for trying out the various brushes and tools is available
`here <https://www.blender.org/download/demo-files/#sculpting>`_. `here <https://www.blender.org/download/demo-files/#sculpting>`__.

View File

@ -34,10 +34,11 @@ to displace geometry in three directions instead of just one.
.. figure:: /images/sculpt-paint_sculpt_vdm_example.png .. figure:: /images/sculpt-paint_sculpt_vdm_example.png
:width: 580px :width: 580px
An example of various VDM brushes used on a smooth head from the offical demo file. An example of various VDM brushes used on a smooth head from the official demo file.
`Download the demo file <https://www.blender.org/download/demo-files/#sculpting>`_ for more information and to try For easy creation of VDM brushes, enable the :doc:`VDM Brush Baker </addons/baking/vdm_brush_baker>` addon.
the feature out. `Download the demo file <https://www.blender.org/download/demo-files/#sculpting>`__
for more information and to try the feature out.
To use this feature, enable :ref:`Vector Displacement <bpy.types.Brush.use_color_as_displacement>` in the texture To use this feature, enable :ref:`Vector Displacement <bpy.types.Brush.use_color_as_displacement>` in the texture
panel. All :ref:`stroke methods <bpy.types.Brush.stroke_method>` are supported, but the recommended behavior is panel. All :ref:`stroke methods <bpy.types.Brush.stroke_method>` are supported, but the recommended behavior is

View File

@ -58,7 +58,7 @@ Levels
.. _bpy.ops.paint.vertex_color_hsv: .. _bpy.ops.paint.vertex_color_hsv:
Hue Saturation Value Hue/Saturation/Value
Adjust the HSV values of the selected vertices. Adjust the HSV values of the selected vertices.
.. _bpy.ops.paint.vertex_color_brightness_contrast: .. _bpy.ops.paint.vertex_color_brightness_contrast:

View File

@ -28,7 +28,7 @@ Expand
Snapping Snapping
^^^^^^^^ ^^^^^^^^
It is possible to enable snapping in the header of the VSE. It is possible to enable snapping in the header of the Video Sequencer.
The snapping behavior can be configured as follows: The snapping behavior can be configured as follows:
.. _bpy.types.SequencerToolSettings.snap_to_current_frame: .. _bpy.types.SequencerToolSettings.snap_to_current_frame:

41
pyproject.toml Normal file
View File

@ -0,0 +1,41 @@
# SPDX-License-Identifier: GPL-2.0-or-later
[tool.autopep8]
# Configuration for `autopep8`, allowing the command: autopep8 .
# to reformat all source files.
#
# NOTE: the settings defined here map directly to command line arguments
# which will override these settings when passed in to autopep8.
max_line_length = 120
ignore = [
# Info: Use `isinstance()` instead of comparing types directly.
# Why disable? Changes code logic, in rare cases we want to compare exact types.
"E721",
# Info: Fix bare except.
# Why disable? Disruptive, leave our exceptions alone.
"E722",
# Info: Fix module level import not at top of file.
# Why disable? Re-ordering imports is disruptive and breaks some scripts
# that need to check if a module has already been loaded in the case of reloading.
"E402",
# Info: Fix various deprecated code (via lib2to3)
# Why disable? Does nothing besides incorrectly adding a duplicate import,
# could be reported as a bug except this is likely to be removed soon, see:
# https://github.com/python/cpython/issues/84540.
"W690",
]
# Use aggressive as many useful edits are disabled unless it's enabled.
# Any edits which are overly disruptive or risky can be removed in the `ignore` list.
aggressive = 2
# Exclude:
# - `./tools/svn_rev_map` because it's a large data-file.
exclude = """
./tools/svn_rev_map/sha1_to_rev.py,
"""
# Omit settings such as `jobs`, `in_place` & `recursive` as they can cause editor utilities that auto-format on save
# to fail if the STDIN/STDOUT is used for formatting (which isn't compatible with these options).

View File

@ -144,3 +144,7 @@ RedirectMatch "^/manual/{lang}/{version}/modeling/geometry_nodes/utilities/align
RedirectMatch "^/manual/{lang}/{version}/modeling/geometry_nodes/utilities/rotate_euler.html" "/manual/{lang}/{version}/modeling/geometry_nodes/utilities/rotation/rotate_euler.html" RedirectMatch "^/manual/{lang}/{version}/modeling/geometry_nodes/utilities/rotate_euler.html" "/manual/{lang}/{version}/modeling/geometry_nodes/utilities/rotation/rotate_euler.html"
RedirectMatch "^/manual/{lang}/{version}/editors/graph_editor/channels.html" "/manual/{lang}/{version}/editors/graph_editor/channels/index.html" RedirectMatch "^/manual/{lang}/{version}/editors/graph_editor/channels.html" "/manual/{lang}/{version}/editors/graph_editor/channels/index.html"
RedirectMatch "^/manual/{lang}/{version}/compositing/types/color/invert.html" "^/manual/{lang}/{version}/compositing/types/color/invert_color.html"
RedirectMatch "^/manual/{lang}/{version}/editors/texture_node/types/color/invert.html" "^/manual/{lang}/{version}/editors/texture_node/types/color/invert_color.html"
RedirectMatch "^/manual/{lang}/{version}/render/shader_nodes/color/invert.html" "^/manual/{lang}/{version}/render/shader_nodes/color/invert_color.html"

File diff suppressed because it is too large Load Diff

View File

@ -1,325 +1,188 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# <pep8 compliant>
"""
This script extracts RST fro Blender's "--help",
using simple conventions & REGEX parsing.
Example:
python tools_maintenance/blender_help_extract.py /path/to/blender manual/advanced/command_line/arguments.rst
"""
# Conversion from There are some cases which aren't handled (and aren't needed at the moment),
# noting for completeness.
#
# - Multi-line code-blocks as each block is currently only a single line.
# - Skip parsing text inside comment blocks (literal quoting single brackets for e.g.).
import os import os
import re import re
import subprocess
# This script extracts the '--help' message from Blender's source code,
# using primitive regex parsing.
#
# e.g:
# python tools_maintenance/blender_help_extract.py \
# ../blender/source/creator/creator_args.c \
# manual/advanced/command_line/arguments.rst
def text_remove_comments(text): def help_text_make_version_and_usage_substitution(text: str) -> str:
def replacer(match): text = re.sub(
s = match.group(0) re.compile(r"^(Blender) +\d.*\n(Usage:) +(.*)$", flags=re.MULTILINE),
if s.startswith('/'): lambda x: (
return " " "| {:s} |BLENDER_VERSION|\n"
else: "| {:s} ``{:s}``"
return s ).format(x.group(1), x.group(2), x.group(3)),
pattern = re.compile( text,
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
re.DOTALL | re.MULTILINE
)
return re.sub(pattern, replacer, text)
def text_remove_preprocess(text):
lines = text.split("\n")
non_comment_lines = [line for line in lines if not line.strip().startswith("#")]
return "\n".join(non_comment_lines)
def text_join_lines(text):
lines = text.split("\n")
lines_out = [[]]
for l in lines:
lines_out[-1].append(l)
if l.endswith((";", "{", ")", "}")) or l.lstrip().startswith("#"):
lines_out.append([])
text = "\n".join(
[
" ".join(l.lstrip() if i != 0 else l for i, l in enumerate(l_group))
for l_group in lines_out
]
) )
return text return text
def text_expand_macros(text): def help_text_make_args_literal(text: str) -> str:
# CB() macro
def replacer_CB(match):
return match.group(2) + "_doc, " + match.group(2)
pattern_CB = re.compile( re_content_table = (
r'\b(CB)\s*\(([^\,]+)\)', (
re.DOTALL | re.MULTILINE re.compile(r"(\-+[A-Za-z\-]+)"),
lambda x: "``" + x.group(1) + "``",
),
) )
# CB_EX() macro re_argument_line = re.compile(r"^(\s*)(\-+[A-Za-z\-]+.*)$", flags=re.MULTILINE)
def replacer_CB_EX(match):
return match.group(2) + "_doc_" + match.group(3) + ", " + match.group(2)
pattern_CB_EX = re.compile( def re_argument_line_fn(x: re.Match[str]) -> str:
r'\b(CB_EX)\s*\(([^\,]+),\s*([^\)]+)\)', indent = x.group(1)
re.DOTALL | re.MULTILINE content = x.group(2)
for re_expr, re_fn in re_content_table:
content = re.sub(re_expr, re_fn, content)
# Weak but works to replace or's with commas.
content = content.replace("`` or ``-", "``, ``-", 1)
return indent + content
text = re.sub(re_argument_line, re_argument_line_fn, text)
return text
def help_text_make_single_quotes_literal(text: str) -> str:
re_table = (
(
re.compile(r"(\s+)'([^\']+)'"),
lambda x: x.group(1) + "``" + x.group(2) + "``",
),
(
re.compile(r"([-+]?<[A-Za-z_0-9\(\)]+>)"),
lambda x: "``" + x.group(1) + "``",
),
) )
# STRINGIFY_ARG() macro for re_expr, re_fn in re_table:
def replacer_STRINGIFY_ARG(match): text = re.sub(re_expr, re_fn, text)
return "\"``" + match.group(2) + "``\""
pattern_STRINGIFY_ARG = re.compile(
r'\b(STRINGIFY_ARG)\s*\(([^\)]+)\)',
re.DOTALL | re.MULTILINE
)
text = re.sub(pattern_CB, replacer_CB, text)
text = re.sub(pattern_CB_EX, replacer_CB_EX, text)
text = re.sub(pattern_STRINGIFY_ARG, replacer_STRINGIFY_ARG, text)
return text return text
def text_extract_args(text): def help_text_make_title_and_dedent(text: str) -> str:
re_title = re.compile(r"\n\n([A-Z][^:]+):$", flags=re.MULTILINE)
title_char = "="
args = {} def re_title_fn(x: re.Match[str]) -> str:
# use replace to scan (misuse!) heading = x.group(1)
return (
def replacer(match):
fn = match.group(1)
s = match.group(2)
# remove first 2 args
s = s.split(',', 1)[-1]
# remove last 2 args
s = s.rsplit(',', 2)[0]
if fn == "BLI_args_add":
# get first 2 args
arg_short, arg_long, s = [w.strip() for w in s.split(",", 2)]
elif fn == "BLI_args_add_case":
# get first 2 args
arg_short, _, arg_long, _, s = [w.strip() for w in s.split(",", 4)]
del _
else:
# should never happen
raise Exception("Bad function call %r" % fn)
if arg_short == "NULL":
arg_short = None
else:
arg_short = eval(arg_short, {})
if arg_long == "NULL":
arg_long = None
else:
arg_long = eval(arg_long, {})
args[arg_short, arg_long] = s
# print(arg_short, arg_long, s)
pattern = re.compile(
r'\b(BLI_args_add[_case]*)\s*\(((?:(?!\)\s*;).)*?)\)\s*;',
re.DOTALL | re.MULTILINE
)
re.sub(pattern, replacer, text)
return args
def text_extract_strings(text):
strings = {}
# use replace to scan (misuse!)
text = (
text
).replace(
"PY_ENABLE_AUTO", " \" (default)\""
).replace(
"PY_DISABLE_AUTO", " \"\""
).replace(
"STRINGIFY(BLENDER_STARTUP_FILE)", "\"startup.blend\""
).replace(
"STRINGIFY(BLENDER_MAX_THREADS)", "\"1024\""
)
def replacer(match):
var = match.group(1).strip()
s = match.group(2)
s = " ".join([w.strip() for w in s.split("\n")])
s = eval(s, {})
strings[var] = s
pattern = re.compile(
r'\bstatic\s+const\s+char\s+([A-Za-z0-9_]+)\[\]\s*=\s*((?:(?!"\s*;).)*?")\s*;',
re.DOTALL | re.MULTILINE
)
re.sub(pattern, replacer, text)
return strings
def text_extract_help(text, args, static_strings):
func_id = 'static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)\n'
index_start = text.find(func_id)
assert(index_start != -1)
index_end = text.find("exit(0);", index_start)
# print(index_start, index_end)
body = text[index_start + len(func_id):index_end]
body = [l for l in body.split("\n") if not l.strip().startswith("#")]
body = [l.strip() for l in body]
body = [l for l in body if l]
# args dicts
args_short = {}
args_long = {}
args_used = set()
for (arg_short, arg_long), value in args.items():
if arg_short is not None:
args_short[arg_short] = (arg_short, arg_long), value
if arg_long is not None:
args_long[arg_long] = (arg_short, arg_long), value
# there is some overlap in short/long args, second pass to fix
# by assigning long-only
for (arg_short, arg_long), value in args.items():
if arg_short is not None:
if arg_long is None:
args_short[arg_short] = (arg_short, arg_long), value
def args_get(arg):
value = args_long.get(arg)
if value is None:
value = args_short.get(arg)
if value is None:
raise Exception("Can't find %r" % arg)
return value
text_rst = []
# execute the code!
other_vars = {
"BKE_blender_version_string": lambda: "|BLENDER_VERSION|",
}
def write_arg(arg):
(arg_short, arg_long), arg_text = args_get(arg)
args_used.add((arg_short, arg_long))
# replacement table
arg_text = re.sub(r"\"\s*STRINGIFY_ARG\s*\(([a-zA-Z0-9_]+)\)\"", r"``\1``", arg_text)
arg_text = arg_text.replace('" STRINGIFY(BLENDER_MAX_THREADS) "', "64")
arg_text = arg_text.replace('" STRINGIFY(BLENDER_STARTUP_FILE) "', "startup.blend")
arg_text = arg_text.replace('" PY_ENABLE_AUTO', '\"')
arg_text = arg_text.replace('" PY_DISABLE_AUTO', ', (default).\"')
# print(arg_text)
arg_text = eval(arg_text, static_strings)
arg_text = arg_text.replace("\t", " ")
text_rst.append("``" + "``, ``".join([w for w in (arg_short, arg_long) if w is not None]) + "`` ")
text_rst.append(arg_text + "\n")
ind_re = None
for l in body:
if l.startswith("printf"):
l = eval(l.replace("printf(", "").replace(");", ""), other_vars)
if type(l) is tuple:
# Run the C-style string format.
l = l[0] % l[1:]
if l.lstrip() == l and l.strip("\n").endswith(":"):
# Create RST heading & unique reference target.
l = l.strip(":\n")
l = (
"\n" "\n"
"\n" "\n"
".. _command-line-args-%s:\n" ".. _command-line-args-{:s}:\n"
"\n" "\n"
"%s\n" "{:s}\n"
"%s\n" "{:s}\n"
"\n" ).format(
) % ( "".join([(c if c.isalpha() else "-") for c in heading.lower()]),
# Create reference so each heading can be linked to. heading,
"".join([(c if c.isalpha() else "-") for c in l.lower()]), (title_char * len(heading)),
# The heading.
l,
# Heading underline.
len(l) * "=",
) )
ind_re = None
text = re.sub(re_title, re_title_fn, text)
# Un-indent entirely indented blocks (directly after the title).
lines = text.splitlines(keepends=False)
i = 0
while i < len(lines):
if not (lines[i].startswith(title_char) and lines[i].strip(title_char) == ""):
# Not a title, continue.
i += 1
continue
# We have a title, check the next non-blank line.
i_next = i + 1
while lines[i_next] == "":
i_next += 1
if not lines[i_next].startswith(" "):
# No indentation, continue.
i = i_next
continue
# Measure indent and de-dent until indentation not met.
indent_len = len(lines[i_next]) - len(lines[i_next].lstrip())
indent = " " * indent_len
while i_next < len(lines):
if lines[i_next].startswith(indent):
lines[i_next] = lines[i_next][indent_len:]
elif lines[i_next] == "":
pass
else: else:
# unindent to the previous min indent
for _ in range(2):
if ind_re is None:
ind_re = r"\A\t{0,}"
ind_m = re.match(ind_re, l)
if ind_m:
ind_re = r"\A\t{" + str(ind_m.end(0)) + r"}"
l = re.sub(ind_re, '', l)
break break
else: i_next += 1
# indent is less than before
ind_re = None
l = l.replace("\t", " ") i = i_next
text_rst.append(l) text = "\n".join(lines)
elif l.startswith("BLI_args_print_arg_doc("):
arg = l.split(",")[-1].strip(");\n")
arg = eval(arg, {})
write_arg(arg)
elif l.startswith("BLI_args_print_other_doc("):
items = list(args.items())
# sort as strings since we can't order (None <> str)
items.sort(key=lambda i: str(i[0]))
for key, value in items:
if key not in args_used:
write_arg(key[0] or key[1])
text_rst = "".join(text_rst) return text
# not essential, but nice to have <word> as ``<word>``
text_rst = re.sub(r"([\+\-]*<[a-zA-Z0-9\(\)_\-]+>)", r"``\1``", text_rst)
# ------ def help_text_make_environment_variables(text: str) -> str:
# Post process (formatting) env_vars = []
# text_rst = re.split(r"\\n|[()]", text_rst)
text_rst = text_rst.splitlines()
for i, l in enumerate(text_rst): # Single lines.
# detect env var list re_env = re.compile(r"^(\s*)\$([A-Z][A-Z0-9_]*)(\s+)", flags=re.MULTILINE)
l_strip = l.lstrip()
if l_strip.startswith("$"):
l_strip, l_tail = l_strip.lstrip("$").split(" ", 1)
if l_strip.isupper():
l = ":%s: %s" % (l_strip, l_tail)
del l_tail
elif l_strip.startswith("#"):
indent = l[:len(l) - len(l_strip)]
l = "\n" + indent + ".. code-block:: sh\n\n" + indent + " " + l.lstrip("# ") + "\n"
else:
# use "'" as "``", except when used as plural, e.g. "Python's"
l = re.sub("(?<![a-z])'|'(?![st])", "``", l)
del l_strip
text_rst[i] = l.rstrip(" ") def re_env_fn(x: re.Match[str]) -> str:
env_var = x.group(2)
env_vars.append(env_var)
return x.group(1) + ":" + env_var + ":" + x.group(3)
# finally, make switches literal if they proceed literal args text = re.sub(re_env, re_env_fn, text)
# or have their own line.
# -a ``<b>`` ... --> ``-a`` ``<b>``
# and...
# -a --> ``-a``
for i, l in enumerate(text_rst):
if l.lstrip().startswith("-"):
l = re.sub(r"(\s+)(\-[a-z])(\s+``)", r"\1``\2``\3", l)
l = re.sub(r"^(\s+)(\-[a-z])$", r"\1``\2``", l)
text_rst[i] = l
text_rst = [ def re_env_var_quote_fn(x: re.Match[str]) -> str:
".. DO NOT EDIT THIS FILE, GENERATED BY %r\n" % os.path.basename(__file__), beg, end = x.span(1)
# Ignore environment variables that were just converted into field definitions.
if x.string[beg - 1] == ":" and x.string[end] == ":":
# Do nothing.
return x.group(1)
return "``" + x.group(1) + "``"
# Now literal quote all environment variables.
re_env_var_quote = re.compile(r"\b({:s}\b)".format("|".join(env_vars)))
text = re.sub(re_env_var_quote, re_env_var_quote_fn, text)
return text
def help_text_make_code_blocks(text: str) -> str:
re_code_block = re.compile(r"^(\s*)(# .*)$", flags=re.MULTILINE)
def re_code_block_fn(x: re.Match[str]) -> str:
indent = x.group(1)
content = x.group(2)
return (
"\n"
"{:s}.. code-block:: sh\n"
"\n"
"{:s} {:s}\n"
).format(indent, indent, content[1:].lstrip())
text = re.sub(re_code_block, re_code_block_fn, text)
return text
def help_text_as_rst(text: str) -> str:
text_header = (
".. DO NOT EDIT THIS FILE, GENERATED BY '{:s}'\n"
"\n" "\n"
" CHANGES TO THIS FILE MUST BE MADE IN BLENDER'S SOURCE CODE, SEE:\n" " CHANGES TO THIS FILE MUST BE MADE IN BLENDER'S SOURCE CODE, SEE:\n"
" https://projects.blender.org/blender/blender/src/branch/main/source/creator/creator_args.c\n" " https://projects.blender.org/blender/blender/src/branch/main/source/creator/creator_args.c\n"
@ -330,46 +193,69 @@ def text_extract_help(text, args, static_strings):
"Command Line Arguments\n" "Command Line Arguments\n"
"**********************\n" "**********************\n"
"\n" "\n"
] + text_rst ).format(os.path.basename(__file__))
text_rst = "\n".join(text_rst) # Expand tabs & strip trailing space.
text_rst = text_rst + "\n" text = text.expandtabs(3)
text_rst = text_rst.replace("\n\n\n\n", "\n\n\n") text = "\n".join([line.rstrip() for line in text.splitlines()]) + "\n"
return text_rst text = help_text_make_version_and_usage_substitution(text)
text = help_text_make_args_literal(text)
text = help_text_make_single_quotes_literal(text)
text = help_text_make_title_and_dedent(text)
text = help_text_make_environment_variables(text)
text = help_text_make_code_blocks(text)
# Hack: `/?` is a special case.
text = text.replace("\n/?\n", "\n``/?``\n", 1)
# Apply the header last (no need for it to be parsed).
return text_header + text
def main(): def main() -> None:
import sys import sys
source_file = sys.argv[-2] blender_bin = sys.argv[-2]
output_file = sys.argv[-1] output_file = sys.argv[-1]
if not source_file.endswith("creator_args.c"):
print("Expected 'creator_args.c' to be passed as the second last argument")
return
if not output_file.endswith(".rst"): if not output_file.endswith(".rst"):
print("Expected an '.rst' file to be passed as the last argument") print("Expected an '.rst' file to be passed as the last argument")
return return
with open(source_file, 'r') as f: env = os.environ.copy()
text = f.read() env["ASAN_OPTIONS"] = (
env.get("ASAN_OPTIONS", "") +
":exitcode=0:check_initialization_order=0:strict_init_order=0:detect_leaks=0"
)
text = text_remove_comments(text) text_beg = "BEGIN_BLOCK"
text = text_remove_preprocess(text) text_end = "END_BLOCK"
# join ',\n' - function args split across lines. text = subprocess.check_output(
text = text_join_lines(text) [
# expand CB macros blender_bin,
text = text_expand_macros(text) "--factory-startup",
# first pass, extract 'BLI_args_add' "--background",
"--python-exit-code", "1",
"--python-expr",
# Code begin/end text because of Blender's chatty reporting of version and that it quit.
(
"print("
"'{:s}\\n' + "
"__import__('bpy').app.help_text(all=True) + "
"'\\n{:s}'"
")"
).format(text_beg, text_end),
],
env=env,
).decode("utf-8")
args = text_extract_args(text) # Extract between begin/end markers.
text = text[text.find(text_beg) + len(text_beg) + 1: text.find(text_end)]
static_strings = text_extract_strings(text) text_rst = help_text_as_rst(text)
text_rst = text_extract_help(text, args, static_strings) with open(output_file, "w", encoding="utf-8") as fh:
fh.write(text_rst)
with open(output_file, 'w') as f:
f.write(text_rst)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -6,7 +6,7 @@
# when updating PO files, automatically inserting name of author and revision time, # when updating PO files, automatically inserting name of author and revision time,
# which should save you some times. # which should save you some times.
# Recommend to copy this to your $HOME/bin directory and add executable flag (chmod u+x), # Recommend to copy this to your $HOME/bin directory and add executable flag (chmod u+x),
# then use it with the directory of your local repository (svn or git), ie. # then use it with the directory of your local repository, ie.
# $HOME/bin/change_placeholders.sh $BLENDER_MAN_EN # $HOME/bin/change_placeholders.sh $BLENDER_MAN_EN
# Windows users can try to install Linux on Windows following this guide (https://docs.microsoft.com/en-us/windows/wsl/install-win10) # Windows users can try to install Linux on Windows following this guide (https://docs.microsoft.com/en-us/windows/wsl/install-win10)
# Author: Hoang Duy Tran <hoangduytran1960@googlemail.com> # Author: Hoang Duy Tran <hoangduytran1960@googlemail.com>

View File

@ -6,20 +6,6 @@
# It looks more complex then it really is, since we do multi-processing # It looks more complex then it really is, since we do multi-processing
# to update the PO files, to save some time. # to update the PO files, to save some time.
# Subversion Checkout Location
# ============================
#
# Note: this script supports subversion repositories at these locations:
#
# ./local/(.svn) All languages in one checkout.
# ./local/{LANG}/(.svn) Each language in it's own checkout.
#
# All commands run from the project root, passing in paths
# without changing directories.
#
# This works since subversion will detect the parent directories ".svn"
# path without us having to change directories.
import os import os
import sys import sys
import shutil import shutil
@ -33,8 +19,8 @@ VERBOSE = False
USE_MULTI_PROCESS = True USE_MULTI_PROCESS = True
def run_svn(args, with_output=False): def run_git(args, with_output=False):
cmd = ["svn", *args] cmd = ["git", *args]
if VERBOSE: if VERBOSE:
print(">>> ", cmd) print(">>> ", cmd)
@ -84,7 +70,8 @@ def run_multiprocess__multi(arg_list, job_total=1):
sys.stdout.flush() sys.stdout.flush()
sys.stderr.flush() sys.stderr.flush()
processes.append((args_index, subprocess.Popen(["sphinx-intl", *args]))) processes.append(
(args_index, subprocess.Popen(["sphinx-intl", *args])))
while processes: while processes:
processes_clear_finished() processes_clear_finished()
@ -122,42 +109,21 @@ LOCALE_DIR = os.path.join(ROOT_DIR, "locale")
POT_FILE = os.path.join(LOCALE_DIR, "blender_manual.pot") POT_FILE = os.path.join(LOCALE_DIR, "blender_manual.pot")
# When we cannot use portable API's.
IS_WIN32 = (os.name == "nt")
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Main Function # Main Function
def main(): def main():
# True when all languages are checked out under "locale/".
has_complete_locale_checkout = os.path.exists(os.path.join(LOCALE_DIR, ".svn"))
# All directories containing '.svn' (the parent directory).
svn_dirs_all = []
for svn_dir in os.listdir(LOCALE_DIR):
if not svn_dir.startswith((".", "_")):
svn_dir = os.path.join(LOCALE_DIR, svn_dir)
if os.path.isdir(svn_dir):
svn_dirs_all.append(svn_dir)
# Only for reproducible execution.
svn_dirs_all.sort()
# --------------------- # ---------------------
# Update the Locale Dir # Update the Locale Dir
# status = run_git(["-C", LOCALE_DIR, "status"], True)
# It's easy to accidentally have a repository in an invalid state,
# and it's not always obvious that this is the cause of failure to commit.
# Play it safe and cleanup every time.
if has_complete_locale_checkout: if b"nothing to commit, working tree clean" not in status:
run_svn(["cleanup", LOCALE_DIR]) sys.exit(
run_svn(["up", LOCALE_DIR]) "Locale directory has uncommitted changes, please stash or comment them")
else:
for svn_dir in svn_dirs_all: run_git(["-C", LOCALE_DIR, "pull", "--rebase"])
run_svn(["cleanup", svn_dir])
run_svn(["up", svn_dir])
# --------------- # ---------------
# Create PO Files # Create PO Files
@ -214,58 +180,23 @@ def main():
print("Warning, the following commands returned non-zero exit codes:") print("Warning, the following commands returned non-zero exit codes:")
for returncode, arg in zip(sphinx_intl_return_codes, sphinx_intl_arg_list): for returncode, arg in zip(sphinx_intl_return_codes, sphinx_intl_arg_list):
if returncode != 0: if returncode != 0:
print("returncode:", returncode, "from command:", "sphinx-intl", arg) print("returncode:", returncode,
"from command:", "sphinx-intl", arg)
print("Some manual corrections might need to be done.") print("Some manual corrections might need to be done.")
del sphinx_intl_return_codes, sphinx_intl_arg_list del sphinx_intl_return_codes, sphinx_intl_arg_list
# ----------
# Handle SVN
# Add newly created PO files:
for svn_dir in svn_dirs_all:
# Multiple args, don't quote.
svn_files_new = []
svn_dirs_new = []
for line in run_svn(("status", svn_dir), True).decode("utf-8").splitlines():
if line.startswith("?"):
line = line.strip()
line = line.split()[-1]
if line.endswith(".po"):
svn_files_new.append(line)
elif os.path.isdir(line):
svn_dirs_new.append(line)
if svn_files_new:
run_svn(["add", *svn_files_new, *svn_dirs_new])
del svn_files_new, svn_dirs_new
# --------------------- # ---------------------
# Print Commit Messages # Print Commit Messages
# #
# Use space prefix as shell's (bash/zsh/fish) uses this as a hint not to store in the users history. # Use space prefix as shell's (bash/zsh/fish) uses this as a hint not to store in the users history.
revision = re.findall( revision = run_git(["-C", ROOT_DIR, "rev-parse",
r"^Revision:\s([\d]+)", "--short", "HEAD"], True).decode('utf8').strip()
run_svn(["info", ROOT_DIR], True).decode('utf8'), revision = revision if revision else "Unknown"
flags=re.MULTILINE, print("\nPo files updated, commit files using the following commands:")
) print("cd locale")
revision = revision[0] if revision else "Unknown" print("git add -A")
print(
# Note that when 'has_complete_locale_checkout == True' we _could_ commit all languages at once, "git commit -m \"Update po-files ({:s})\"".format(revision))
# however this can cause commits that are so large, they take a long time and risk hanging.
# So commit every language on it's own.
for svn_dir in svn_dirs_all:
# 'shlex.quote' causes path separator to be converted to forward slashes,
# causing the command to fail.
if IS_WIN32:
print(" " + subprocess.list2cmdline(["svn", "ci", svn_dir, "-m", "Update r" + revision]))
else:
print(" svn ci {:s} -m \"Update r{:s}\"".format(quote(svn_dir), revision))
if IS_WIN32:
print(" " + subprocess.list2cmdline(["svn", "ci", POT_FILE, "-m", "Update r" + revision]))
else:
print(" svn ci {:s} -m \"Update r{:s}\"".format(quote(POT_FILE), revision))
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# Copyright 2015 Anton Felix Lorenzen <anfelor@web.de> # Copyright 2015 Anton Felix Lorenzen <anfelor@web.de>
# <pep8 compliant>
''' '''
Module of Translation Tracker: report the number of complete strings in a file. Module of Translation Tracker: report the number of complete strings in a file.

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# Copyright 2015 Anton Felix Lorenzen <anfelor@web.de> # Copyright 2015 Anton Felix Lorenzen <anfelor@web.de>
# <pep8 compliant>
''' '''
Translation Tracker: report the number of complete translations. Translation Tracker: report the number of complete translations.

View File

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# <pep8 compliant>
# DEVELOPER NOTE: # DEVELOPER NOTE:
# #

View File

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# <pep8 compliant>
""" """
This utility checks naming conventions (Blender specific). This utility checks naming conventions (Blender specific).

View File

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# <pep8 compliant>
""" """
This utility checks image paths: This utility checks image paths:

View File

@ -49,39 +49,74 @@ def check_word(w):
return dict_spelling.check(w) return dict_spelling.check(w)
def regex_key_raise(x):
raise Exception("Unknown role! " + "".join(x.groups()))
# A table of regex and their replacement functions.
#
# This is used to clean up text from `docutils.nodes.NodeVisitor.visit_Text` which doesn't remove inline markup.
# Note that in some cases the order matters, especially with include/excluding roles.
RE_TEXT_REPLACE_ROLES_INCLUDE = ("menuselection", "guilabel")
RE_TEXT_REPLACE_ROLES_EXCLUDE = ("kbd", "ref", "doc", "abbr")
RE_TEXT_REPLACE_TABLE = (
# Match HTML link: `Text <url>`__
# A URL may span multiple lines.
(
re.compile(r"(`)([^`<]+)(<[^`>]+>)(`)(__)", re.MULTILINE),
lambda x: x.groups()[1].strip(),
),
# Roles with plain-text: :some_role:`Text <ref>`
(
re.compile(r"(:[A-Za-z_]+:)(`)([^`<]+)(<[^`>]+>)(`)", flags=re.MULTILINE),
lambda x: x.groups()[2].strip(),
),
# Roles to always include.
(
re.compile(r"(:(" + ("|".join(RE_TEXT_REPLACE_ROLES_INCLUDE)) + r"):)(`)([^`]+)(`)", flags=re.MULTILINE),
lambda x: x.groups()[3].strip(),
),
# Roles to always exclude.
(
re.compile(r"(:(" + ("|".join(RE_TEXT_REPLACE_ROLES_EXCLUDE)) + r"):)(`)([^`]+)(`)", flags=re.MULTILINE),
lambda _: " ",
),
# Ensure all roles are handled.
(
re.compile(r"(:[A-Za-z_]+:)(`)([^`]+)(`)", flags=re.MULTILINE),
regex_key_raise,
),
# Match substitution for removal: `|identifier|`
(
re.compile(r"\|[a-zA-Z0-9_]+\|"),
lambda _: " ",
),
)
RE_WORDS = re.compile(
r"\b("
# Capital words, with optional '-' and "'".
r"[A-Z]+[\-'A-Z]*[A-Z]|"
# Lowercase words, with optional '-' and "'".
r"[A-Za-z][\-'a-z]*[a-z]+"
r")\b"
)
def check_spelling_body(text): def check_spelling_body(text):
for w in text.split():
# skip directive args (e.g. figure target), could do differently?
if w.startswith(":") and w.endswith(":"):
continue
if w.startswith("<") and w.endswith(">"):
continue
w = w.strip("{}[](),.!?;\"'1234567890-_*") # Wash text or inline RST.
for re_expr, re_replace_fn in RE_TEXT_REPLACE_TABLE:
text = re.sub(re_expr, re_replace_fn, text)
if w.startswith(":") and w.endswith(":"): for re_match in RE_WORDS.finditer(text):
continue w = re_match.group(0)
if w.startswith("<") and w.endswith(">"):
continue
# skip character and name entities # Skip entirely uppercase words.
if w.startswith("\\") or w.startswith("|"): # These are typically used for acronyms: XYZ, UDIM, API ... etc.
continue if w.isupper():
# now we've gotten rid of typical roles, strip other chars
w = w.strip(":`()<>{}")
# skip python references
if w.startswith("bpy."):
continue
# skip document references and keyboard shortcuts
if w.startswith("doc:") or w.startswith("kbd:") or w.startswith("menuselection:") or w.startswith("ref:"):
continue
w_ = w
for w in w_.split("/"):
if not w:
continue continue
w_lower = w.lower() w_lower = w.lower()
@ -192,6 +227,7 @@ directives.register_directive('highlight', directive_ignore_recursive)
directives.register_directive('parsed-literal', directive_ignore_recursive) directives.register_directive('parsed-literal', directive_ignore_recursive)
# Custom directives from extensions # Custom directives from extensions
directives.register_directive('youtube', directive_ignore_recursive) directives.register_directive('youtube', directive_ignore_recursive)
directives.register_directive('peertube', directive_ignore_recursive)
directives.register_directive('vimeo', directive_ignore_recursive) directives.register_directive('vimeo', directive_ignore_recursive)
directives.register_directive('todolist', directive_ignore_recursive) directives.register_directive('todolist', directive_ignore_recursive)
@ -223,7 +259,7 @@ def role_ignore_recursive(
name, rawtext, text, lineno, inliner, name, rawtext, text, lineno, inliner,
options={}, content=[], options={}, content=[],
): ):
return [RoleIgnore("", '', *(), **{})], [] return [RoleIgnoreRecursive("", '', *(), **{})], []
roles.register_canonical_role('abbr', role_ignore) roles.register_canonical_role('abbr', role_ignore)
@ -306,13 +342,21 @@ def check_spelling(filename):
doc.walkabout(visitor) doc.walkabout(visitor)
RST_CONTEXT_FLAG_LITERAL = 1 << 0
RST_CONTEXT_FLAG_LITERAL_BLOCK = 1 << 1
RST_CONTEXT_FLAG_MATH = 1 << 2
RST_CONTEXT_FLAG_COMMENT = 1 << 3
class RstSpellingVisitor(docutils.nodes.NodeVisitor): class RstSpellingVisitor(docutils.nodes.NodeVisitor):
__slots__ = ( __slots__ = (
"document", "document",
"skip_context",
) )
def __init__(self, doc): def __init__(self, doc):
self.document = doc self.document = doc
self.skip_context = 0
# ----------------------------- # -----------------------------
# Visitors (docutils callbacks) # Visitors (docutils callbacks)
@ -400,8 +444,10 @@ class RstSpellingVisitor(docutils.nodes.NodeVisitor):
# check_spelling_body(text) # check_spelling_body(text)
def visit_Text(self, node): def visit_Text(self, node):
# Visiting text in a sipped context (literal for example).
if self.skip_context:
return
text = node.astext() text = node.astext()
# print(text)
check_spelling_body(text) check_spelling_body(text)
def depart_Text(self, node): def depart_Text(self, node):
@ -420,37 +466,48 @@ class RstSpellingVisitor(docutils.nodes.NodeVisitor):
self.is_emphasis = False self.is_emphasis = False
def visit_math(self, node): def visit_math(self, node):
self.skip_context |= RST_CONTEXT_FLAG_MATH
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode
def depart_math(self, node): def depart_math(self, node):
pass self.skip_context &= ~RST_CONTEXT_FLAG_MATH
def visit_literal(self, node): def visit_literal(self, node):
self.skip_context |= RST_CONTEXT_FLAG_LITERAL
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode
def depart_literal(self, node): def depart_literal(self, node):
pass self.skip_context &= ~RST_CONTEXT_FLAG_LITERAL
def visit_literal_block(self, node): def visit_literal_block(self, node):
self.skip_context |= RST_CONTEXT_FLAG_LITERAL_BLOCK
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode
def depart_literal_block(self, node): def depart_literal_block(self, node):
self.skip_context &= ~RST_CONTEXT_FLAG_LITERAL_BLOCK
pass pass
def visit_code_block(self, node): def visit_code_block(self, node):
# No need to flag.
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode
def depart_code_block(self, node): def depart_code_block(self, node):
pass pass
def visit_reference(self, node): def visit_reference(self, node):
raise docutils.nodes.SkipNode pass
def depart_reference(self, node): def depart_reference(self, node):
pass pass
def visit_title_reference(self, node):
pass
def depart_title_reference(self, node):
pass
def visit_download_reference(self, node): def visit_download_reference(self, node):
raise docutils.nodes.SkipNode pass
def depart_download_reference(self, node): def depart_download_reference(self, node):
pass pass
@ -458,7 +515,7 @@ class RstSpellingVisitor(docutils.nodes.NodeVisitor):
def visit_date(self, node): def visit_date(self, node):
# date = datetime.date(*( # date = datetime.date(*(
# map(int, unicode(node[0]).split('-')))) # map(int, unicode(node[0]).split('-'))))
#metadata['creation_date'] = date # metadata['creation_date'] = date
pass pass
# def visit_document(self, node): # def visit_document(self, node):
@ -466,10 +523,11 @@ class RstSpellingVisitor(docutils.nodes.NodeVisitor):
# # metadata['searchable_text'] = node.astext() # # metadata['searchable_text'] = node.astext()
def visit_comment(self, node): def visit_comment(self, node):
self.skip_context |= RST_CONTEXT_FLAG_COMMENT
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode
def depart_comment(self, node): def depart_comment(self, node):
pass self.skip_context &= ~RST_CONTEXT_FLAG_COMMENT
def visit_raw(self, node): def visit_raw(self, node):
raise docutils.nodes.SkipNode raise docutils.nodes.SkipNode

View File

@ -180,7 +180,6 @@ dict_custom = {
"redhat", "redhat",
"renderman", "renderman",
"sgi", "sgi",
"tortoisesvn",
"unix", "unix",
"xinerama", "xinerama",

View File

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Apache License, Version 2.0 # Apache License, Version 2.0
# <pep8 compliant>
import os import os
import sys import sys

Some files were not shown because too many files have changed in this diff Show More