Compare commits
11 Commits
73d714832e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40298b66da | ||
|
|
74586023fb | ||
|
|
88c2c67ae4 | ||
|
|
3de61b7f7f | ||
|
|
e259769e9d | ||
|
|
cc44420912 | ||
|
|
4340d5fff9 | ||
|
|
829c6a7b98 | ||
|
|
a003b27244 | ||
|
|
e1ca851276 | ||
|
|
316fe67295 |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m375.5 201a.50005.50005 0 0 0 -.47852.35547c-.97912 3.26329-1.65795 6.01658-2.41406 7.89453-.37805.93897-.77714 1.65307-1.20117 2.10156-.42403.4485-.83753.64844-1.40625.64844-.81989 0-1.77194-.85368-2.74219-1.84961-.48512-.49796-.97309-1.01146-1.49609-1.41992-.52301-.40846-1.09998-.73047-1.76172-.73047h-.5a.50005.50005 0 1 0 0 1h.5c.32338 0 .70916.17799 1.14648.51953s.9074.82804 1.39649 1.33008c.97818 1.00407 2.04085 2.15039 3.45703 2.15039.83577 0 1.56694-.36242 2.13281-.96094.56587-.59851 1.00027-1.41738 1.40235-2.41601.7683-1.90825 1.43134-4.57357 2.33398-7.62305h.63086a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -36200 -19999.998)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_other"><path d="m375.5 201a.50005.50005 0 0 0 -.47852.35547c-.97912 3.26329-1.65795 6.01658-2.41406 7.89453-.37805.93897-.77714 1.65307-1.20117 2.10156-.42403.4485-.83753.64844-1.40625.64844-.81989 0-1.77194-.85368-2.74219-1.84961-.48512-.49796-.97309-1.01146-1.49609-1.41992-.52301-.40846-1.09998-.73047-1.76172-.73047h-.5a.50005.50005 0 1 0 0 1h.5c.32338 0 .70916.17799 1.14648.51953s.9074.82804 1.39649 1.33008c.97818 1.00407 2.04085 2.15039 3.45703 2.15039.83577 0 1.56694-.36242 2.13281-.96094.56587-.59851 1.00027-1.41738 1.40235-2.41601.7683-1.90825 1.43134-4.57357 2.33398-7.62305h.63086a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -36200 -19999.998)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m321.5 201a.50005.50005 0 1 0 0 1h.5c.11714 0 .21825.0354.36133.1582.14308.12279.30922.33684.46875.63282.31905.59195.61443 1.49542.87109 2.55468.51334 2.11854.89163 4.86411 1.30664 7.24024a.50005.50005 0 0 0 .98242.008c.24141-1.26736.60565-2.19557.98829-2.76953s.74023-.76172 1.02148-.76172.63884.18776 1.02148.76172.74688 1.50217.98829 2.76953a.50005.50005 0 0 0 .96093.0762c.24086-.66235.48023-1.14224.6836-1.42187.20337-.27964.32487-.31055.3457-.31055.0208 0 .14233.0309.3457.31055.20337.27963.44274.75952.6836 1.42187a.50005.50005 0 0 0 .4707.32986h1a.50005.50005 0 1 0 0-1h-.69141c-.20925-.52074-.41629-1.01454-.65429-1.3418-.29663-.40786-.67513-.7207-1.1543-.7207s-.85767.31284-1.1543.7207c-.10194.14017-.18655.39972-.28125.57422-.21984-.70238-.40285-1.50076-.71093-1.96289-.49236-.73854-1.13477-1.20703-1.85352-1.20703s-1.36116.46849-1.85352 1.20703c-.20879.3132-.31334.90706-.48242 1.33008-.30463-1.87209-.5915-3.83467-.99218-5.48828-.26658-1.10016-.56623-2.0626-.96094-2.79492-.19736-.36617-.41893-.67716-.69727-.91602s-.63359-.40039-1.01367-.40039z" transform="matrix(100 0 0 100 -32000 -20000)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_other"><path d="m321.5 201a.50005.50005 0 1 0 0 1h.5c.11714 0 .21825.0354.36133.1582.14308.12279.30922.33684.46875.63282.31905.59195.61443 1.49542.87109 2.55468.51334 2.11854.89163 4.86411 1.30664 7.24024a.50005.50005 0 0 0 .98242.008c.24141-1.26736.60565-2.19557.98829-2.76953s.74023-.76172 1.02148-.76172.63884.18776 1.02148.76172.74688 1.50217.98829 2.76953a.50005.50005 0 0 0 .96093.0762c.24086-.66235.48023-1.14224.6836-1.42187.20337-.27964.32487-.31055.3457-.31055.0208 0 .14233.0309.3457.31055.20337.27963.44274.75952.6836 1.42187a.50005.50005 0 0 0 .4707.32986h1a.50005.50005 0 1 0 0-1h-.69141c-.20925-.52074-.41629-1.01454-.65429-1.3418-.29663-.40786-.67513-.7207-1.1543-.7207s-.85767.31284-1.1543.7207c-.10194.14017-.18655.39972-.28125.57422-.21984-.70238-.40285-1.50076-.71093-1.96289-.49236-.73854-1.13477-1.20703-1.85352-1.20703s-1.36116.46849-1.85352 1.20703c-.20879.3132-.31334.90706-.48242 1.33008-.30463-1.87209-.5915-3.83467-.99218-5.48828-.26658-1.10016-.56623-2.0626-.96094-2.79492-.19736-.36617-.41893-.67716-.69727-.91602s-.63359-.40039-1.01367-.40039z" transform="matrix(100 0 0 100 -32000 -20000)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m312.5 201a.50005.50005 0 0 0 -.5.5c0 3.43021-1.19149 5.7903-3.2168 7.45898-2.0253 1.66869-4.93239 2.63003-8.34375 3.04493a.50005.50005 0 1 0 .1211.99218c3.52614-.42885 6.61905-1.41978 8.85937-3.26562 2.13154-1.75622 3.41037-4.32825 3.5332-7.73047h.54688a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -29899.525 -20000.101)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_other"><path d="m312.5 201a.50005.50005 0 0 0 -.5.5c0 3.43021-1.19149 5.7903-3.2168 7.45898-2.0253 1.66869-4.93239 2.63003-8.34375 3.04493a.50005.50005 0 1 0 .1211.99218c3.52614-.42885 6.61905-1.41978 8.85937-3.26562 2.13154-1.75622 3.41037-4.32825 3.5332-7.73047h.54688a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -29899.525 -20000.101)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 780 B After Width: | Height: | Size: 804 B |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m118.5 201a.50005.50005 0 0 0 -.5.5v10.5h-6.5a.50005.50005 0 1 0 0 1h7a.50005.50005 0 0 0 .5-.5v-10.5h5.5a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -11000 -20000)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_constant"><path d="m118.5 201a.50005.50005 0 0 0 -.5.5v10.5h-6.5a.50005.50005 0 1 0 0 1h7a.50005.50005 0 0 0 .5-.5v-10.5h5.5a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -11000 -20000)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 623 B After Width: | Height: | Size: 650 B |
@@ -1 +1 @@
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -21500 -19899.802)"><path d="m228.5 201a.50005.50005 0 0 0 -.47461.3418c-.75176 2.25527-1.61792 4.94183-3.29101 7.0332-1.6731 2.09137-4.11183 3.625-8.23438 3.625a.50005.50005 0 1 0 0 1c4.37745 0 7.18872-1.71637 9.01562-4 1.74159-2.17699 2.6089-4.81175 3.33594-7h.64844a.50005.50005 0 1 0 0-1z"/><path d="m218.99805 199.99609c-.79172 0-1.70536.42738-1.98047 1.35938a.50005.50005 0 1 0 .95898.2832c.12417-.42064.57962-.64258 1.02149-.64258.26387 0 .51715.0894.69531.24805.17816.15864.30325.37905.30664.75586.001.39768-.25396.75725-.76367 1.07422a.50005.50005 0 0 0 0 .84766c.51034.31737.7656.67798.76367 1.07617-.004.37528-.12888.59561-.30664.7539-.17816.15864-.43144.24805-.69531.24805-.44187 0-.89732-.21999-1.02149-.64062a.50005.50005 0 1 0 -.95898.28124c.27511.93201 1.18875 1.35938 1.98047 1.35938.48612 0 .97796-.16058 1.36133-.50195.38336-.34137.63501-.871.64062-1.49414a.50005.50005 0 0 0 0-.002c.003-.61795-.34308-1.09989-.77734-1.5039.43425-.40402.78027-.88601.77734-1.50391a.50005.50005 0 0 0 0-.002c-.006-.62314-.25726-1.15277-.64062-1.49414-.38337-.34137-.87521-.50196-1.36133-.50196z"/></g></g></svg>
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -21500 -19899.802)"><g fill="#fff" id="blender_ipo_other"><path d="m228.5 201a.50005.50005 0 0 0 -.47461.3418c-.75176 2.25527-1.61792 4.94183-3.29101 7.0332-1.6731 2.09137-4.11183 3.625-8.23438 3.625a.50005.50005 0 1 0 0 1c4.37745 0 7.18872-1.71637 9.01562-4 1.74159-2.17699 2.6089-4.81175 3.33594-7h.64844a.50005.50005 0 1 0 0-1z"/></g><g fill="#fff" id="blender_text"><path opacity="0.8" d="m218.99805 199.99609c-.79172 0-1.70536.42738-1.98047 1.35938a.50005.50005 0 1 0 .95898.2832c.12417-.42064.57962-.64258 1.02149-.64258.26387 0 .51715.0894.69531.24805.17816.15864.30325.37905.30664.75586.001.39768-.25396.75725-.76367 1.07422a.50005.50005 0 0 0 0 .84766c.51034.31737.7656.67798.76367 1.07617-.004.37528-.12888.59561-.30664.7539-.17816.15864-.43144.24805-.69531.24805-.44187 0-.89732-.21999-1.02149-.64062a.50005.50005 0 1 0 -.95898.28124c.27511.93201 1.18875 1.35938 1.98047 1.35938.48612 0 .97796-.16058 1.36133-.50195.38336-.34137.63501-.871.64062-1.49414a.50005.50005 0 0 0 0-.002c.003-.61795-.34308-1.09989-.77734-1.5039.43425-.40402.78027-.88601.77734-1.50391a.50005.50005 0 0 0 0-.002c-.006-.62314-.25726-1.15277-.64062-1.49414-.38337-.34137-.87521-.50196-1.36133-.50196z"/></g></g></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m342.45117 201a.50059574.50059574 0 0 0 .0488 1c.0215.00002.18225-.00017.33398 0 .0105.42607.0502 2.52232.33594 5.05664.15671 1.39002.37504 2.78188.69727 3.86719.16111.54265.34457 1.00922.59179 1.38086.24723.37163.61429.69531 1.09375.69531.39174 0 .74881-.20864.97657-.48047.22775-.27182.37091-.59987.48632-.96289.23084-.72603.34622-1.61436.46876-2.48828.12253-.87392.25275-1.73314.44921-2.31641.0982-.29163.21467-.50852.31446-.62109.09982-.11257.14484-.13086.25198-.13086.16824 0 .2932.0848.48633.39062.19312.30582.37727.78401.5625 1.28321.18523.49919.37171 1.01992.64453 1.46289.27281.44297.71019.86328 1.30664.86328.41993 0 .77613-.23568.99219-.49219.21606-.2565.34747-.53797.4707-.78906s.23849-.47074.33594-.58984c.09745-.11911.11768-.12891.20117-.12891.0859 0 .18647.0811.39844.32617.10598.12255.22449.26923.39453.40625.17003.13703.41807.26758.70703.26758.008 0 .14542-.00028.27539 0 .065.00014.13031.00006.18164 0 .0513-.00006.0312.005.12109 0a.50080138.50080138 0 1 0 -.0566-1c.0748-.004-.0172-.00005-.0664 0s-.11331.00014-.17774 0c-.12885-.00028-.25041 0-.27734 0-.0108 0-.0173.004-.0801-.0469-.0628-.0506-.15527-.15364-.26562-.28124-.22074-.25519-.57045-.67186-1.15432-.67186-.4167 0-.76719.23824-.97656.49414s-.33683.53625-.45899.78516c-.12215.24891-.23808.46744-.33789.58593-.09981.1185-.12821.13477-.22656.13477-.14972 0-.26794-.0816-.45703-.38867-.18909-.30703-.37082-.78435-.55664-1.28516-.18583-.5008-.37575-1.02457-.65625-1.46875s-.72872-.85742-1.33008-.85742c-.39664 0-.76041.19848-1 .46875s-.39279.60017-.51562.96484c-.24567.72934-.36739 1.61988-.49024 2.4961-.12285.87621-.24515 1.73764-.43164 2.32422-.0933.29328-.20581.51202-.29883.62304-.093.11102-.1237.12305-.21094.12305-.027 0-.10877-.0201-.26171-.25-.15295-.22991-.31979-.62276-.46485-1.11133-.29011-.97714-.5088-2.33541-.66211-3.69531-.30662-2.7198-.36328-5.45313-.36328-5.45313a.50005.50005 0 0 0 -.5-.49023c-.0468 0-.74734.00005-.80078 0a.50005.50005 0 0 0 -.0488 0z" transform="matrix(100 0 0 100 -34101.37600000001 -19999.97)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_other"><path d="m342.45117 201a.50059574.50059574 0 0 0 .0488 1c.0215.00002.18225-.00017.33398 0 .0105.42607.0502 2.52232.33594 5.05664.15671 1.39002.37504 2.78188.69727 3.86719.16111.54265.34457 1.00922.59179 1.38086.24723.37163.61429.69531 1.09375.69531.39174 0 .74881-.20864.97657-.48047.22775-.27182.37091-.59987.48632-.96289.23084-.72603.34622-1.61436.46876-2.48828.12253-.87392.25275-1.73314.44921-2.31641.0982-.29163.21467-.50852.31446-.62109.09982-.11257.14484-.13086.25198-.13086.16824 0 .2932.0848.48633.39062.19312.30582.37727.78401.5625 1.28321.18523.49919.37171 1.01992.64453 1.46289.27281.44297.71019.86328 1.30664.86328.41993 0 .77613-.23568.99219-.49219.21606-.2565.34747-.53797.4707-.78906s.23849-.47074.33594-.58984c.09745-.11911.11768-.12891.20117-.12891.0859 0 .18647.0811.39844.32617.10598.12255.22449.26923.39453.40625.17003.13703.41807.26758.70703.26758.008 0 .14542-.00028.27539 0 .065.00014.13031.00006.18164 0 .0513-.00006.0312.005.12109 0a.50080138.50080138 0 1 0 -.0566-1c.0748-.004-.0172-.00005-.0664 0s-.11331.00014-.17774 0c-.12885-.00028-.25041 0-.27734 0-.0108 0-.0173.004-.0801-.0469-.0628-.0506-.15527-.15364-.26562-.28124-.22074-.25519-.57045-.67186-1.15432-.67186-.4167 0-.76719.23824-.97656.49414s-.33683.53625-.45899.78516c-.12215.24891-.23808.46744-.33789.58593-.09981.1185-.12821.13477-.22656.13477-.14972 0-.26794-.0816-.45703-.38867-.18909-.30703-.37082-.78435-.55664-1.28516-.18583-.5008-.37575-1.02457-.65625-1.46875s-.72872-.85742-1.33008-.85742c-.39664 0-.76041.19848-1 .46875s-.39279.60017-.51562.96484c-.24567.72934-.36739 1.61988-.49024 2.4961-.12285.87621-.24515 1.73764-.43164 2.32422-.0933.29328-.20581.51202-.29883.62304-.093.11102-.1237.12305-.21094.12305-.027 0-.10877-.0201-.26171-.25-.15295-.22991-.31979-.62276-.46485-1.11133-.29011-.97714-.5088-2.33541-.66211-3.69531-.30662-2.7198-.36328-5.45313-.36328-5.45313a.50005.50005 0 0 0 -.5-.49023c-.0468 0-.74734.00005-.80078 0a.50005.50005 0 0 0 -.0488 0z" transform="matrix(100 0 0 100 -34101.37600000001 -19999.97)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m291.5 201a.50005.50005 0 0 0 -.5.5c0 2.47889-.15954 4.38104-.52734 5.8125-.36781 1.43146-.92559 2.38009-1.74024 3.05273-1.6293 1.3453-4.51671 1.63477-9.23242 1.63477a.50005.50005 0 1 0 0 1c4.75093 0 7.86511-.21053 9.86914-1.86523 1.00202-.82736 1.66924-2.00373 2.07227-3.57227.36978-1.43916.48747-3.33151.51171-5.5625h.54688a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -27800 -20000)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_other"><path d="m291.5 201a.50005.50005 0 0 0 -.5.5c0 2.47889-.15954 4.38104-.52734 5.8125-.36781 1.43146-.92559 2.38009-1.74024 3.05273-1.6293 1.3453-4.51671 1.63477-9.23242 1.63477a.50005.50005 0 1 0 0 1c4.75093 0 7.86511-.21053 9.86914-1.86523 1.00202-.82736 1.66924-2.00373 2.07227-3.57227.36978-1.43916.48747-3.33151.51171-5.5625h.54688a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -27800 -20000)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 843 B After Width: | Height: | Size: 867 B |
@@ -1 +1 @@
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><path d="m144.5 201a.50005.50005 0 0 0 -.35352.14648l-10.85351 10.85352h-.79297a.50005.50005 0 1 0 0 1h1a.50005.50005 0 0 0 .35352-.14648l10.85351-10.85352h.79297a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -13100 -20000)"/></g></svg>
|
||||
<svg height="1400" viewBox="0 0 1600 1400" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff" id="blender_ipo_linear"><path d="m144.5 201a.50005.50005 0 0 0 -.35352.14648l-10.85351 10.85352h-.79297a.50005.50005 0 1 0 0 1h1a.50005.50005 0 0 0 .35352-.14648l10.85351-10.85352h.79297a.50005.50005 0 1 0 0-1z" transform="matrix(100 0 0 100 -13100 -20000)"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 671 B After Width: | Height: | Size: 696 B |
@@ -1 +1 @@
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -19400 -19899.805)"><path d="m207.5 201a.50005.50005 0 0 0 -.40039.19922c-1.548 2.064-2.85356 4.80197-4.58594 6.99023-1.73238 2.18827-3.81151 3.81055-7.01367 3.81055a.50005.50005 0 1 0 0 1c3.54784 0 5.96871-1.87772 7.79883-4.18945 1.7781-2.24603 3.06678-4.88493 4.4707-6.81055h.73047a.50005.50005 0 1 0 0-1z"/><path d="m197 199.99609c-.79172 0-1.70536.42738-1.98047 1.35938a.50090117.50090117 0 1 0 .96094.2832c.12417-.42064.57767-.64258 1.01953-.64258.26308 0 .50603.0889.67773.2461.17133.15683.29488.38005.29883.75976.001.2095-.10056.41777-.33789.6875s-.59584.56699-.97656.90235c-.76143.67072-1.65792 1.5571-1.66211 2.90234a.50005.50005 0 0 0 .5.50195h3a.50005.50005 0 1 0 0-1h-2.33398c.18416-.62502.58645-1.15066 1.1582-1.65429.36326-.31999.74752-.62977 1.0664-.99219.31889-.36243.58851-.81103.58594-1.35156a.50005.50005 0 0 0 0-.002c-.006-.61869-.24656-1.14755-.62304-1.49218-.37648-.34464-.8666-.50782-1.35352-.50782z"/></g></g></svg>
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -19400 -19899.805)"><g fill="#fff" id="blender_ipo_other"><path d="m207.5 201a.50005.50005 0 0 0 -.40039.19922c-1.548 2.064-2.85356 4.80197-4.58594 6.99023-1.73238 2.18827-3.81151 3.81055-7.01367 3.81055a.50005.50005 0 1 0 0 1c3.54784 0 5.96871-1.87772 7.79883-4.18945 1.7781-2.24603 3.06678-4.88493 4.4707-6.81055h.73047a.50005.50005 0 1 0 0-1z"/></g><g fill="#fff" id="blender_text"><path opacity="0.8" d="m197 199.99609c-.79172 0-1.70536.42738-1.98047 1.35938a.50090117.50090117 0 1 0 .96094.2832c.12417-.42064.57767-.64258 1.01953-.64258.26308 0 .50603.0889.67773.2461.17133.15683.29488.38005.29883.75976.001.2095-.10056.41777-.33789.6875s-.59584.56699-.97656.90235c-.76143.67072-1.65792 1.5571-1.66211 2.90234a.50005.50005 0 0 0 .5.50195h3a.50005.50005 0 1 0 0-1h-2.33398c.18416-.62502.58645-1.15066 1.1582-1.65429.36326-.31999.74752-.62977 1.0664-.99219.31889-.36243.58851-.81103.58594-1.35156a.50005.50005 0 0 0 0-.002c-.006-.61869-.24656-1.14755-.62304-1.49218-.37648-.34464-.8666-.50782-1.35352-.50782z"/></g></g></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -23600 -19899.649)"><path d="m249.5 201a.50005.50005 0 0 0 -.49805.45508c-.24047 2.64524-1.32572 5.28945-3.23633 7.25976-1.9106 1.97032-4.63784 3.28516-8.26562 3.28516a.50005.50005 0 1 0 0 1c3.87222 0 6.89498-1.43516 8.98438-3.58984 1.97612-2.03788 3.06007-4.712 3.39843-7.41016h.61719a.50005.50005 0 1 0 0-1z"/><path d="m238.4668 199.99414c-.21842.0156-.40126.17156-.45118.38477l-1 4c-.0786.31522.15949.62057.48438.62109h2.5v1.5c-.01.67616 1.00956.67616 1 0v-4c-.009-.6573-.9907-.6573-1 0v1.5h-1.85938l.84376-3.37891c.0877-.33109-.17587-.65038-.51758-.62695z"/></g></g></svg>
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -23600 -19899.649)"><g fill="#fff" id="blender_ipo_other"><path d="m249.5 201a.50005.50005 0 0 0 -.49805.45508c-.24047 2.64524-1.32572 5.28945-3.23633 7.25976-1.9106 1.97032-4.63784 3.28516-8.26562 3.28516a.50005.50005 0 1 0 0 1c3.87222 0 6.89498-1.43516 8.98438-3.58984 1.97612-2.03788 3.06007-4.712 3.39843-7.41016h.61719a.50005.50005 0 1 0 0-1z"/></g><g fill="#fff" id="blender_text"><path opacity="0.8" d="m238.4668 199.99414c-.21842.0156-.40126.17156-.45118.38477l-1 4c-.0786.31522.15949.62057.48438.62109h2.5v1.5c-.01.67616 1.00956.67616 1 0v-4c-.009-.6573-.9907-.6573-1 0v1.5h-1.85938l.84376-3.37891c.0877-.33109-.17587-.65038-.51758-.62695z"/></g></g></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1 +1 @@
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -25699.895 -19899.804)"><path d="m270.5 201a.50005.50005 0 0 0 -.5.5c0 3.44341-1.07548 6.03173-3.02344 7.79102-1.94795 1.75928-4.81327 2.70898-8.47656 2.70898a.50005.50005 0 1 0 0 1c3.83671 0 6.97139-1.00062 9.14844-2.9668 2.06597-1.86586 3.15029-4.63736 3.26367-8.0332h.58789a.50005.50005 0 1 0 0-1z"/><path d="m258.5 199.99609a.50005.50005 0 0 0 -.5.5v2.00391a.50005.50005 0 0 0 .5.5h1.5c.41667 0 1 .45 1 1.5 0 1.04998-.58056 1.4941-1.00195 1.49609-.52634.003-.86013-.33871-1.05078-.72265a.50005.50005 0 1 0 -.89454.44531c.30945.62316.97566 1.28254 1.94922 1.27734 1.07859-.0051 1.99805-1.04607 1.99805-2.49609 0-1.45-.91667-2.5-2-2.5h-1v-1.00391h2.5a.50005.50005 0 1 0 0-1z"/></g></g></svg>
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -25699.895 -19899.804)"><g fill="#fff" id="blender_ipo_other"><path d="m270.5 201a.50005.50005 0 0 0 -.5.5c0 3.44341-1.07548 6.03173-3.02344 7.79102-1.94795 1.75928-4.81327 2.70898-8.47656 2.70898a.50005.50005 0 1 0 0 1c3.83671 0 6.97139-1.00062 9.14844-2.9668 2.06597-1.86586 3.15029-4.63736 3.26367-8.0332h.58789a.50005.50005 0 1 0 0-1z"/></g><g fill="#fff" id="blender_text"><path opacity="0.8" d="m258.5 199.99609a.50005.50005 0 0 0 -.5.5v2.00391a.50005.50005 0 0 0 .5.5h1.5c.41667 0 1 .45 1 1.5 0 1.04998-.58056 1.4941-1.00195 1.49609-.52634.003-.86013-.33871-1.05078-.72265a.50005.50005 0 1 0 -.89454.44531c.30945.62316.97566 1.28254 1.94922 1.27734 1.07859-.0051 1.99805-1.04607 1.99805-2.49609 0-1.45-.91667-2.5-2-2.5h-1v-1.00391h2.5a.50005.50005 0 1 0 0-1z"/></g></g></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1 +1 @@
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -17299.999 -19899.795)"><path d="m186.5 201a.50005.50005 0 0 0 -.40039.19922c-1.548 2.064-2.85356 4.80197-4.58594 6.99023-1.73238 2.18827-3.81151 3.81055-7.01367 3.81055a.50005.50005 0 1 0 0 1c3.54784 0 5.96871-1.87772 7.79883-4.18945 1.7781-2.24603 3.06678-4.88493 4.4707-6.81055h.73047a.50005.50005 0 1 0 0-1z"/><path d="m176.48438 199.99609a.50005.50005 0 0 0 -.3379.14649l-2 2a.50005.50005 0 1 0 .70704.70703l1.14648-1.14649v4.79688a.50005.50005 0 1 0 1 0v-6.00391a.50005.50005 0 0 0 -.51562-.5z"/></g></g></svg>
|
||||
<svg height="1500" viewBox="0 0 1600 1500" width="1600" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"><sodipodi:namedview pagecolor="#303030" showgrid="true"><inkscape:grid id="grid5" units="px" spacingx="100" spacingy="100" color="#4772b3" opacity="0.2" visible="true" /></sodipodi:namedview><g fill="#fff"><g enable-background="new" transform="matrix(100 0 0 100 -17299.999 -19899.795)"><g fill="#fff" id="blender_ipo_other"><path d="m186.5 201a.50005.50005 0 0 0 -.40039.19922c-1.548 2.064-2.85356 4.80197-4.58594 6.99023-1.73238 2.18827-3.81151 3.81055-7.01367 3.81055a.50005.50005 0 1 0 0 1c3.54784 0 5.96871-1.87772 7.79883-4.18945 1.7781-2.24603 3.06678-4.88493 4.4707-6.81055h.73047a.50005.50005 0 1 0 0-1z"/></g><g fill="#fff" id="blender_text"><path opacity="0.8" d="m176.48438 199.99609a.50005.50005 0 0 0 -.3379.14649l-2 2a.50005.50005 0 1 0 .70704.70703l1.14648-1.14649v4.79688a.50005.50005 0 1 0 1 0v-6.00391a.50005.50005 0 0 0 -.51562-.5z"/></g></g></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 999 B After Width: | Height: | Size: 1.1 KiB |
@@ -289,7 +289,7 @@ const bTheme U_theme_default = {
|
||||
},
|
||||
.regions = {
|
||||
.asset_shelf = {
|
||||
.back = RGBA(0x303030ff),
|
||||
.back = RGBA(0x303030e6),
|
||||
.header_back = RGBA(0x1d1d1dff),
|
||||
},
|
||||
.channels = {
|
||||
@@ -298,10 +298,10 @@ const bTheme U_theme_default = {
|
||||
.text_selected = RGBA(0xffaf23ff),
|
||||
},
|
||||
.scrubbing = {
|
||||
.back = RGBA(0x161616ff),
|
||||
.text = RGBA(0xc3c3c3ff),
|
||||
.time_marker = RGBA(0xffffff4d),
|
||||
.time_marker_selected = RGBA(0xffffffb3),
|
||||
.back = RGBA(0x1d1d1dff),
|
||||
.text = RGBA(0x808080ff),
|
||||
.time_marker = RGBA(0xffffff80),
|
||||
.time_marker_selected = RGBA(0xffffffff),
|
||||
},
|
||||
.sidebars = {
|
||||
.back = RGBA(0x30303000),
|
||||
@@ -312,7 +312,6 @@ const bTheme U_theme_default = {
|
||||
.anim = {
|
||||
.playhead = RGBA(0x4772b3ff),
|
||||
.preview_range = RGBA(0xa14d0066),
|
||||
.scene_strip_range = RGBA(0x00000080),
|
||||
.channels = RGBA(0x194e8080),
|
||||
.channels_sub = RGBA(0x0f2c4d80),
|
||||
.channel_group = RGBA(0x1a332d37),
|
||||
@@ -333,6 +332,7 @@ const bTheme U_theme_default = {
|
||||
.keyframe_generated_selected = RGBA(0xa28962ff),
|
||||
.long_key = RGBA(0xffffff1f),
|
||||
.long_key_selected = RGBA(0xff8c0099),
|
||||
.scene_strip_range = RGBA(0x00000080),
|
||||
},
|
||||
.curves = {
|
||||
.handle_free = RGBA(0x745900ff),
|
||||
@@ -648,15 +648,15 @@ const bTheme U_theme_default = {
|
||||
.row_alternate = RGBA(0xffffff04),
|
||||
},
|
||||
.space_node = {
|
||||
.back = RGBA(0x1d1d1d00),
|
||||
.back = RGBA(0x1a1a1a00),
|
||||
.title = RGBA(0xeeeeeeff),
|
||||
.text = RGBA(0xe6e6e6ff),
|
||||
.text_hi = RGBA(0xffffffff),
|
||||
.header = RGBA(0x1d1d1db3),
|
||||
.header = RGBA(0x1a1a1ab3),
|
||||
.header_text = RGBA(0xeeeeeeff),
|
||||
.header_text_hi = RGBA(0xffffffff),
|
||||
.shade2 = RGBA(0x7f7f7f64),
|
||||
.grid = RGBA(0x28282800),
|
||||
.grid = RGBA(0x30303000),
|
||||
.wire = RGBA(0x1a1a1aff),
|
||||
.select = RGBA(0xed5700ff),
|
||||
.active = RGBA(0xffffffff),
|
||||
|
||||
@@ -1135,11 +1135,30 @@ void copy_attributes_group_to_group(const AttributeAccessor src_attributes,
|
||||
return;
|
||||
}
|
||||
const GVArraySpan src = *iter.get(src_domain);
|
||||
const bool dst_already_exists = dst_attributes.contains(iter.name);
|
||||
GSpanAttributeWriter dst = dst_attributes.lookup_or_add_for_write_only_span(
|
||||
iter.name, dst_domain, iter.data_type);
|
||||
if (!dst) {
|
||||
return;
|
||||
}
|
||||
if (!dst_already_exists) {
|
||||
/* Skip filling with the default value if all of the data is going to be filled. */
|
||||
if (!(dst_offsets.total_size() == dst.span.size() && selection.size() == dst_offsets.size()))
|
||||
{
|
||||
const CPPType &type = dst.span.type();
|
||||
if (dst_attributes.is_builtin(iter.name)) {
|
||||
if (const GPointer value = dst_attributes.get_builtin_default(iter.name)) {
|
||||
type.fill_construct_n(value.get(), dst.span.data(), dst.span.size());
|
||||
}
|
||||
else {
|
||||
type.fill_construct_n(type.default_value(), dst.span.data(), dst.span.size());
|
||||
}
|
||||
}
|
||||
else {
|
||||
type.fill_construct_n(type.default_value(), dst.span.data(), dst.span.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
array_utils::copy_group_to_group(src_offsets, dst_offsets, selection, src, dst.span);
|
||||
dst.finish();
|
||||
});
|
||||
|
||||
@@ -390,6 +390,26 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
|
||||
FROM_DEFAULT_V4_UCHAR(common.anim.scene_strip_range);
|
||||
}
|
||||
|
||||
/* Reset the theme due to compatibility breaking changes in 5.0. */
|
||||
if (!USER_VERSION_ATLEAST(500, 111)) {
|
||||
MEMCPY_STRUCT_AFTER(btheme, &U_theme_default, name);
|
||||
/* Update text styles to match. */
|
||||
LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
|
||||
style->paneltitle.points = 11.0f;
|
||||
style->paneltitle.shadow = 3;
|
||||
style->paneltitle.shadowalpha = 0.5f;
|
||||
style->paneltitle.shadowcolor = 0.0f;
|
||||
style->widget.points = 11.0f;
|
||||
style->widget.shadow = 1;
|
||||
style->widget.shadowalpha = 0.5f;
|
||||
style->widget.shadowcolor = 0.0f;
|
||||
style->tooltip.shadow = 1;
|
||||
style->tooltip.points = 11.0f;
|
||||
style->tooltip.shadowalpha = 0.5f;
|
||||
style->tooltip.shadowcolor = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (!USER_VERSION_ATLEAST(501, 3)) {
|
||||
FROM_DEFAULT_V4_UCHAR(space_action.anim_interpolation_other);
|
||||
FROM_DEFAULT_V4_UCHAR(space_action.anim_interpolation_constant);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2024 Blender Authors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
set(INC_GLSL
|
||||
.
|
||||
..
|
||||
@@ -11,6 +12,7 @@ set(INC_GLSL
|
||||
../../gpu/shaders/common
|
||||
../../gpu/shaders/infos
|
||||
)
|
||||
|
||||
set(SRC_GLSL_COMP
|
||||
# TODO: Port to C++ compilation
|
||||
# compositor_alpha_crop.glsl
|
||||
@@ -86,7 +88,7 @@ set(SRC_GLSL_COMP
|
||||
# compositor_movie_distortion.glsl
|
||||
# compositor_normalize.glsl
|
||||
# compositor_pad.glsl
|
||||
# compositor_parallel_reduction.glsl
|
||||
compositor_parallel_reduction.glsl
|
||||
# compositor_pixelate.glsl
|
||||
# compositor_plane_deform_anisotropic.glsl
|
||||
# compositor_plane_deform_mask.glsl
|
||||
@@ -123,14 +125,17 @@ set(SRC_GLSL_COMP
|
||||
# compositor_z_combine_simple_depth.glsl
|
||||
# compositor_z_combine_simple_image.glsl
|
||||
)
|
||||
|
||||
set(SRC_GLSL_LIB
|
||||
library/gpu_shader_compositor_texture_utilities.glsl
|
||||
)
|
||||
|
||||
# Compile shaders with shader code.
|
||||
if(WITH_GPU_SHADER_CPP_COMPILATION)
|
||||
with_shader_cpp_compilation_config()
|
||||
#compile_sources_as_cpp(compositor_cpp_shaders_comp "${SRC_GLSL_COMP}" "GPU_COMPUTE_SHADER")
|
||||
|
||||
compile_sources_as_cpp(compositor_cpp_shaders_comp "${SRC_GLSL_COMP}" "GPU_COMPUTE_SHADER")
|
||||
# Only enable to make sure they compile on their own.
|
||||
# Otherwise it creates a warning about `pragma once`.
|
||||
compile_sources_as_cpp(compositor_cpp_shaders_lib "${SRC_GLSL_LIB}" "GPU_LIBRARY_SHADER")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -48,15 +48,229 @@
|
||||
* expected to define the TYPE macro to be a float or a vec4, depending on the type of data being
|
||||
* reduced. */
|
||||
|
||||
#include "infos/compositor_parallel_reduction_infos.hh"
|
||||
|
||||
COMPUTE_SHADER_CREATE_INFO(compositor_parallel_reduction_shared)
|
||||
COMPUTE_SHADER_CREATE_INFO(compositor_parallel_reduction_output_float4)
|
||||
|
||||
#include "gpu_shader_compositor_texture_utilities.glsl"
|
||||
#include "gpu_shader_math_base_lib.glsl"
|
||||
#include "gpu_shader_math_vector_lib.glsl"
|
||||
#include "gpu_shader_math_vector_reduce_lib.glsl"
|
||||
#include "gpu_shader_utildefines_lib.glsl"
|
||||
|
||||
#define reduction_size (gl_WorkGroupSize.x * gl_WorkGroupSize.y)
|
||||
shared TYPE reduction_data[reduction_size];
|
||||
|
||||
void main()
|
||||
/* Operations */
|
||||
|
||||
template<typename T> struct Min {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
return min(lhs, rhs);
|
||||
}
|
||||
};
|
||||
template struct Min<float>;
|
||||
|
||||
template<typename T> struct Max {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
return max(lhs, rhs);
|
||||
}
|
||||
};
|
||||
template struct Max<float>;
|
||||
template struct Max<float2>;
|
||||
template struct Max<float4>;
|
||||
|
||||
template<typename T> struct Sum {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
return lhs + rhs;
|
||||
}
|
||||
};
|
||||
template struct Sum<float>;
|
||||
template struct Sum<float4>;
|
||||
|
||||
template<typename T> struct MaxVelocity {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
return float4(dot(lhs.xy, lhs.xy) > dot(rhs.xy, rhs.xy) ? lhs.xy : rhs.xy,
|
||||
dot(lhs.zw, lhs.zw) > dot(rhs.zw, rhs.zw) ? lhs.zw : rhs.zw);
|
||||
}
|
||||
};
|
||||
template struct MaxVelocity<float4>;
|
||||
|
||||
template<typename T> struct MaxInRange {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
float max = push_constant_get(compositor_maximum_float_in_range, upper_bound);
|
||||
float min = push_constant_get(compositor_maximum_float_in_range, lower_bound);
|
||||
return ((value <= max) && (value >= min)) ? value : min;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
float max = push_constant_get(compositor_maximum_float_in_range, upper_bound);
|
||||
return ((rhs > lhs) && (rhs <= max)) ? rhs : lhs;
|
||||
}
|
||||
};
|
||||
template struct MaxInRange<float>;
|
||||
|
||||
template<typename T> struct MinInRange {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
float max = push_constant_get(compositor_minimum_float_in_range, upper_bound);
|
||||
float min = push_constant_get(compositor_minimum_float_in_range, lower_bound);
|
||||
return ((value <= max) && (value >= min)) ? value : max;
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
float min = push_constant_get(compositor_minimum_float_in_range, lower_bound);
|
||||
return ((rhs < lhs) && (rhs >= min)) ? rhs : lhs;
|
||||
}
|
||||
};
|
||||
template struct MinInRange<float>;
|
||||
|
||||
template<typename T> struct SumSquareDifference {
|
||||
static T identity()
|
||||
{
|
||||
return T(0);
|
||||
}
|
||||
|
||||
static T initialize(T value)
|
||||
{
|
||||
float sub = push_constant_get(compositor_sum_squared_difference_float_shared, subtrahend);
|
||||
return square(value - sub);
|
||||
}
|
||||
|
||||
static T reduce(T lhs, T rhs)
|
||||
{
|
||||
return lhs + rhs;
|
||||
}
|
||||
};
|
||||
template struct SumSquareDifference<float>;
|
||||
|
||||
/* ChannelMix */
|
||||
struct ChannelR {};
|
||||
struct ChannelG {};
|
||||
struct ChannelB {};
|
||||
struct ChannelRG {};
|
||||
struct ChannelRGBA {};
|
||||
struct ChannelLuma {};
|
||||
struct ChannelLogLuma {};
|
||||
struct ChannelMax {};
|
||||
|
||||
template<typename T, typename ChannelMix> T channel_mix(float4 value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
template float4 channel_mix<float4, ChannelRGBA>(float4);
|
||||
/* clang-format off */
|
||||
template<> float channel_mix<float, ChannelR>(float4 value) { return value.r; }
|
||||
template<> float channel_mix<float, ChannelG>(float4 value) { return value.g; }
|
||||
template<> float channel_mix<float, ChannelB>(float4 value) { return value.b; }
|
||||
template<> float channel_mix<float, ChannelMax>(float4 value) { return reduce_max(value.rgb); }
|
||||
template<> float2 channel_mix<float2, ChannelRG>(float4 value) { return value.rg; }
|
||||
/* clang-format on */
|
||||
template<> float channel_mix<float, ChannelLuma>(float4 value)
|
||||
{
|
||||
float3 coefficients = push_constant_get(compositor_luminance_shared, luminance_coefficients);
|
||||
return dot(value.rgb, coefficients);
|
||||
}
|
||||
template<> float channel_mix<float, ChannelLogLuma>(float4 value)
|
||||
{
|
||||
float3 coefficients = push_constant_get(compositor_luminance_shared, luminance_coefficients);
|
||||
return log(max(dot(value.rgb, coefficients), 1e-5f));
|
||||
}
|
||||
|
||||
/* clang-format off */
|
||||
template<typename T> T load(float4 value) { return value; }
|
||||
template float4 load<float4>(float4);
|
||||
template<> float load<float>(float4 value) { return value.x; }
|
||||
template<> float2 load<float2>(float4 value) { return value.xy; }
|
||||
|
||||
float4 to_float4(float value) { return float4(value); }
|
||||
float4 to_float4(float2 value) { return value.xyyy; }
|
||||
float4 to_float4(float4 value) { return value; }
|
||||
/* clang-format on */
|
||||
|
||||
void load_shared_data(uint index, float &r_data)
|
||||
{
|
||||
r_data = shared_variable_get(compositor_parallel_reduction_float_shared, reduction_data)[index];
|
||||
}
|
||||
void load_shared_data(uint index, float2 &r_data)
|
||||
{
|
||||
r_data = shared_variable_get(compositor_parallel_reduction_float2_shared, reduction_data)[index];
|
||||
}
|
||||
void load_shared_data(uint index, float4 &r_data)
|
||||
{
|
||||
r_data = shared_variable_get(compositor_parallel_reduction_float4_shared, reduction_data)[index];
|
||||
}
|
||||
|
||||
void store_shared_data(uint index, float data)
|
||||
{
|
||||
shared_variable_get(compositor_parallel_reduction_float_shared, reduction_data)[index] = data;
|
||||
}
|
||||
void store_shared_data(uint index, float2 data)
|
||||
{
|
||||
shared_variable_get(compositor_parallel_reduction_float2_shared, reduction_data)[index] = data;
|
||||
}
|
||||
void store_shared_data(uint index, float4 data)
|
||||
{
|
||||
shared_variable_get(compositor_parallel_reduction_float4_shared, reduction_data)[index] = data;
|
||||
}
|
||||
|
||||
template<typename T, typename Operation, typename ChannelMix> void reduction()
|
||||
{
|
||||
int2 texel = int2(gl_GlobalInvocationID.xy);
|
||||
|
||||
@@ -65,7 +279,7 @@ void main()
|
||||
* not affect the output of the reduction. For instance, sum reductions have an identity of 0.0,
|
||||
* while max value reductions have an identity of FLT_MIN */
|
||||
if (any(lessThan(texel, int2(0))) || any(greaterThanEqual(texel, texture_size(input_tx)))) {
|
||||
reduction_data[gl_LocalInvocationIndex] = IDENTITY;
|
||||
store_shared_data(gl_LocalInvocationIndex, Operation::identity());
|
||||
}
|
||||
else {
|
||||
float4 value = texture_load_unbound(input_tx, texel);
|
||||
@@ -82,8 +296,9 @@ void main()
|
||||
* will be loaded directly and reduced without extra processing. So the developer is expected
|
||||
* to define the INITIALIZE and LOAD macros to be expressions that derive the needed value from
|
||||
* the loaded value for the initial reduction pass and latter ones respectively. */
|
||||
reduction_data[gl_LocalInvocationIndex] = is_initial_reduction ? INITIALIZE(value) :
|
||||
LOAD(value);
|
||||
T data = is_initial_reduction ? Operation::initialize(channel_mix<T, ChannelMix>(value)) :
|
||||
load<T>(value);
|
||||
store_shared_data(gl_LocalInvocationIndex, data);
|
||||
}
|
||||
|
||||
/* Reduce the reduction data by half on every iteration until only one element remains. See the
|
||||
@@ -101,8 +316,11 @@ void main()
|
||||
* lower index, as can be seen in the diagram above. The developer is expected to define the
|
||||
* REDUCE macro to be a commutative and associative binary operator suitable for parallel
|
||||
* reduction. */
|
||||
reduction_data[gl_LocalInvocationIndex] = REDUCE(
|
||||
reduction_data[gl_LocalInvocationIndex], reduction_data[gl_LocalInvocationIndex + stride]);
|
||||
T lhs, rhs;
|
||||
load_shared_data(gl_LocalInvocationIndex, lhs);
|
||||
load_shared_data(gl_LocalInvocationIndex + stride, rhs);
|
||||
T result = Operation::reduce(lhs, rhs);
|
||||
store_shared_data(gl_LocalInvocationIndex, result);
|
||||
}
|
||||
|
||||
/* Finally, the result of the reduction is available as the first element in the reduction data,
|
||||
@@ -110,12 +328,117 @@ void main()
|
||||
* it. */
|
||||
barrier();
|
||||
if (gl_LocalInvocationIndex == 0) {
|
||||
/* If no WRITE macro is provided, we assume the reduction type can be passed to the float4
|
||||
* constructor. If not, WRITE is expected to be defined to construct the output value. */
|
||||
#if defined(WRITE)
|
||||
imageStore(output_img, int2(gl_WorkGroupID.xy), WRITE(reduction_data[0]));
|
||||
#else
|
||||
imageStore(output_img, int2(gl_WorkGroupID.xy), float4(reduction_data[0]));
|
||||
#endif
|
||||
T data;
|
||||
load_shared_data(0, data);
|
||||
imageStore(output_img, int2(gl_WorkGroupID.xy), to_float4(data));
|
||||
}
|
||||
}
|
||||
|
||||
template void reduction<float, Min<float>, ChannelLuma>();
|
||||
template void reduction<float, Min<float>, ChannelR>();
|
||||
|
||||
template void reduction<float, Max<float>, ChannelLuma>();
|
||||
template void reduction<float, Max<float>, ChannelMax>();
|
||||
template void reduction<float, Max<float>, ChannelR>();
|
||||
template void reduction<float2, Max<float2>, ChannelRG>();
|
||||
|
||||
template void reduction<float, Sum<float>, ChannelR>();
|
||||
template void reduction<float, Sum<float>, ChannelG>();
|
||||
template void reduction<float, Sum<float>, ChannelB>();
|
||||
template void reduction<float, Sum<float>, ChannelLuma>();
|
||||
template void reduction<float, Sum<float>, ChannelLogLuma>();
|
||||
template void reduction<float4, Sum<float4>, ChannelRGBA>();
|
||||
|
||||
template void reduction<float, SumSquareDifference<float>, ChannelR>();
|
||||
template void reduction<float, SumSquareDifference<float>, ChannelG>();
|
||||
template void reduction<float, SumSquareDifference<float>, ChannelB>();
|
||||
template void reduction<float, SumSquareDifference<float>, ChannelLuma>();
|
||||
|
||||
template void reduction<float, MaxInRange<float>, ChannelR>();
|
||||
|
||||
template void reduction<float, MinInRange<float>, ChannelR>();
|
||||
|
||||
template void reduction<float4, MaxVelocity<float4>, ChannelRGBA>();
|
||||
|
||||
void reduce_sum_red()
|
||||
{
|
||||
reduction<float, Sum<float>, ChannelR>();
|
||||
}
|
||||
void reduce_sum_green()
|
||||
{
|
||||
reduction<float, Sum<float>, ChannelG>();
|
||||
}
|
||||
void reduce_sum_blue()
|
||||
{
|
||||
reduction<float, Sum<float>, ChannelB>();
|
||||
}
|
||||
void reduce_sum_luminance()
|
||||
{
|
||||
reduction<float, Sum<float>, ChannelLuma>();
|
||||
}
|
||||
void reduce_sum_log_luminance()
|
||||
{
|
||||
reduction<float, Sum<float>, ChannelLogLuma>();
|
||||
}
|
||||
void reduce_sum_color()
|
||||
{
|
||||
reduction<float4, Sum<float4>, ChannelRGBA>();
|
||||
}
|
||||
|
||||
void reduce_sum_red_squared_difference()
|
||||
{
|
||||
reduction<float, SumSquareDifference<float>, ChannelR>();
|
||||
}
|
||||
void reduce_sum_green_squared_difference()
|
||||
{
|
||||
reduction<float, SumSquareDifference<float>, ChannelG>();
|
||||
}
|
||||
void reduce_sum_blue_squared_difference()
|
||||
{
|
||||
reduction<float, SumSquareDifference<float>, ChannelB>();
|
||||
}
|
||||
void reduce_sum_luminance_squared_difference()
|
||||
{
|
||||
reduction<float, SumSquareDifference<float>, ChannelLuma>();
|
||||
}
|
||||
|
||||
void reduce_maximum_luminance()
|
||||
{
|
||||
reduction<float, Max<float>, ChannelLuma>();
|
||||
}
|
||||
void reduce_maximum_brightness()
|
||||
{
|
||||
reduction<float, Max<float>, ChannelMax>();
|
||||
}
|
||||
void reduce_maximum_float()
|
||||
{
|
||||
reduction<float, Max<float>, ChannelR>();
|
||||
}
|
||||
void reduce_maximum_float2()
|
||||
{
|
||||
reduction<float2, Max<float2>, ChannelRG>();
|
||||
}
|
||||
|
||||
void reduce_maximum_float_in_range()
|
||||
{
|
||||
reduction<float, MaxInRange<float>, ChannelR>();
|
||||
}
|
||||
|
||||
void reduce_minimum_luminance()
|
||||
{
|
||||
reduction<float, Min<float>, ChannelLuma>();
|
||||
}
|
||||
void reduce_minimum_float()
|
||||
{
|
||||
reduction<float, Min<float>, ChannelR>();
|
||||
}
|
||||
|
||||
void reduce_minimum_float_in_range()
|
||||
{
|
||||
reduction<float, MinInRange<float>, ChannelR>();
|
||||
}
|
||||
|
||||
void reduce_max_velocity()
|
||||
{
|
||||
reduction<float4, MaxVelocity<float4>, ChannelRGBA>();
|
||||
}
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef GPU_SHADER
|
||||
# include "gpu_shader_compat.hh"
|
||||
#endif
|
||||
|
||||
#include "gpu_shader_create_info.hh"
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_shared)
|
||||
@@ -11,62 +17,89 @@ SAMPLER(0, sampler2D, input_tx)
|
||||
COMPUTE_SOURCE("compositor_parallel_reduction.glsl")
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_luminance_shared)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_float_shared)
|
||||
GROUP_SHARED(float, reduction_data[gl_WorkGroupSize.x * gl_WorkGroupSize.y])
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_float2_shared)
|
||||
GROUP_SHARED(float2, reduction_data[gl_WorkGroupSize.x * gl_WorkGroupSize.y])
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_float4_shared)
|
||||
GROUP_SHARED(float4, reduction_data[gl_WorkGroupSize.x * gl_WorkGroupSize.y])
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_half4_shared)
|
||||
GROUP_SHARED(float4, reduction_data[gl_WorkGroupSize.x * gl_WorkGroupSize.y])
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_output_float)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_output_float2)
|
||||
IMAGE(0, SFLOAT_32_32, write, image2D, output_img)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_output_float4)
|
||||
IMAGE(0, SFLOAT_32_32_32_32, write, image2D, output_img)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_parallel_reduction_output_half4)
|
||||
IMAGE(0, SFLOAT_16_16_16_16, write, image2D, output_img)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Sum Reductions.
|
||||
*/
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "lhs + rhs")
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_float_shared)
|
||||
ADDITIONAL_INFO(compositor_sum_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "0.0f")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_red)
|
||||
COMPUTE_FUNCTION("reduce_sum_red")
|
||||
ADDITIONAL_INFO(compositor_sum_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.r")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_green)
|
||||
COMPUTE_FUNCTION("reduce_sum_green")
|
||||
ADDITIONAL_INFO(compositor_sum_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.g")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_blue)
|
||||
COMPUTE_FUNCTION("reduce_sum_blue")
|
||||
ADDITIONAL_INFO(compositor_sum_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.b")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_luminance)
|
||||
COMPUTE_FUNCTION("reduce_sum_luminance")
|
||||
ADDITIONAL_INFO(compositor_sum_float_shared)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "dot(value.rgb, luminance_coefficients)")
|
||||
ADDITIONAL_INFO(compositor_luminance_shared)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_log_luminance)
|
||||
COMPUTE_FUNCTION("reduce_sum_log_luminance")
|
||||
ADDITIONAL_INFO(compositor_sum_float_shared)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "log(max(dot(value.rgb, luminance_coefficients), 1e-5f))")
|
||||
ADDITIONAL_INFO(compositor_luminance_shared)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_color)
|
||||
ADDITIONAL_INFO(compositor_sum_shared)
|
||||
IMAGE(0, SFLOAT_32_32_32_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "vec4")
|
||||
DEFINE_VALUE("IDENTITY", "vec4(0.0f)")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value")
|
||||
DEFINE_VALUE("LOAD(value)", "value")
|
||||
COMPUTE_FUNCTION("reduce_sum_color")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float4)
|
||||
GROUP_SHARED(float4, reduction_data[gl_WorkGroupSize.x * gl_WorkGroupSize.y])
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
@@ -76,36 +109,33 @@ GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_squared_difference_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
PUSH_CONSTANT(float, subtrahend)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "0.0f")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "lhs + rhs")
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_red_squared_difference)
|
||||
COMPUTE_FUNCTION("reduce_sum_red_squared_difference")
|
||||
ADDITIONAL_INFO(compositor_sum_squared_difference_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "pow(value.r - subtrahend, 2.0f)")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_green_squared_difference)
|
||||
COMPUTE_FUNCTION("reduce_sum_green_squared_difference")
|
||||
ADDITIONAL_INFO(compositor_sum_squared_difference_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "pow(value.g - subtrahend, 2.0f)")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_blue_squared_difference)
|
||||
COMPUTE_FUNCTION("reduce_sum_blue_squared_difference")
|
||||
ADDITIONAL_INFO(compositor_sum_squared_difference_float_shared)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "pow(value.b - subtrahend, 2.0f)")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_sum_luminance_squared_difference)
|
||||
COMPUTE_FUNCTION("reduce_sum_luminance_squared_difference")
|
||||
ADDITIONAL_INFO(compositor_sum_squared_difference_float_shared)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
DEFINE_VALUE("INITIALIZE(value)", "pow(dot(value.rgb, luminance_coefficients) - subtrahend, 2.0f)")
|
||||
ADDITIONAL_INFO(compositor_luminance_shared)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
@@ -114,61 +144,45 @@ GPU_SHADER_CREATE_END()
|
||||
*/
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_maximum_luminance)
|
||||
COMPUTE_FUNCTION("reduce_maximum_luminance")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "FLT_MIN")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "dot(value.rgb, luminance_coefficients)")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "max(lhs, rhs)")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
ADDITIONAL_INFO(compositor_luminance_shared)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_maximum_brightness)
|
||||
COMPUTE_FUNCTION("reduce_maximum_brightness")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "FLT_MIN")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "reduce_max(value.rgb)")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "max(lhs, rhs)")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_maximum_float)
|
||||
COMPUTE_FUNCTION("reduce_maximum_float")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "FLT_MIN")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.x")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "max(rhs, lhs)")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_maximum_float2)
|
||||
COMPUTE_FUNCTION("reduce_maximum_float2")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "vec2")
|
||||
DEFINE_VALUE("IDENTITY", "vec2(FLT_MIN)")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.xy")
|
||||
DEFINE_VALUE("LOAD(value)", "value.xy")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "max(rhs, lhs)")
|
||||
DEFINE_VALUE("WRITE(value)", "vec4(value, vec2(0.0f))")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float2_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float2)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_maximum_float_in_range)
|
||||
COMPUTE_FUNCTION("reduce_maximum_float_in_range")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
PUSH_CONSTANT(float, lower_bound)
|
||||
PUSH_CONSTANT(float, upper_bound)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "lower_bound")
|
||||
DEFINE_VALUE("INITIALIZE(v)", "((v.x <= upper_bound) && (v.x >= lower_bound)) ? v.x : lower_bound")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "((rhs > lhs) && (rhs <= upper_bound)) ? rhs : lhs")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
@@ -177,38 +191,29 @@ GPU_SHADER_CREATE_END()
|
||||
*/
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_minimum_luminance)
|
||||
COMPUTE_FUNCTION("reduce_minimum_luminance")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
PUSH_CONSTANT(float3, luminance_coefficients)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "FLT_MAX")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "dot(value.rgb, luminance_coefficients)")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "min(lhs, rhs)")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
ADDITIONAL_INFO(compositor_luminance_shared)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_minimum_float)
|
||||
COMPUTE_FUNCTION("reduce_minimum_float")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "FLT_MAX")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value.x")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "min(rhs, lhs)")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_minimum_float_in_range)
|
||||
COMPUTE_FUNCTION("reduce_minimum_float_in_range")
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_shared)
|
||||
IMAGE(0, SFLOAT_32, write, image2D, output_img)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_float)
|
||||
PUSH_CONSTANT(float, lower_bound)
|
||||
PUSH_CONSTANT(float, upper_bound)
|
||||
DEFINE_VALUE("TYPE", "float")
|
||||
DEFINE_VALUE("IDENTITY", "upper_bound")
|
||||
DEFINE_VALUE("INITIALIZE(v)", "((v.x <= upper_bound) && (v.x >= lower_bound)) ? v.x : upper_bound")
|
||||
DEFINE_VALUE("LOAD(value)", "value.x")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)", "((rhs < lhs) && (rhs >= lower_bound)) ? rhs : lhs")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
@@ -217,17 +222,12 @@ GPU_SHADER_CREATE_END()
|
||||
*/
|
||||
|
||||
GPU_SHADER_CREATE_INFO(compositor_max_velocity)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_float4_shared)
|
||||
ADDITIONAL_INFO(compositor_parallel_reduction_output_half4)
|
||||
COMPUTE_FUNCTION("reduce_max_velocity")
|
||||
LOCAL_GROUP_SIZE(32, 32)
|
||||
PUSH_CONSTANT(bool, is_initial_reduction)
|
||||
SAMPLER(0, sampler2D, input_tx)
|
||||
IMAGE(0, SFLOAT_16_16_16_16, write, image2D, output_img)
|
||||
DEFINE_VALUE("TYPE", "vec4")
|
||||
DEFINE_VALUE("IDENTITY", "vec4(0.0f)")
|
||||
DEFINE_VALUE("INITIALIZE(value)", "value")
|
||||
DEFINE_VALUE("LOAD(value)", "value")
|
||||
DEFINE_VALUE("REDUCE(lhs, rhs)",
|
||||
"vec4(dot(lhs.xy, lhs.xy) > dot(rhs.xy, rhs.xy) ? lhs.xy : rhs.xy,"
|
||||
" dot(lhs.zw, lhs.zw) > dot(rhs.zw, rhs.zw) ? lhs.zw : rhs.zw)")
|
||||
COMPUTE_SOURCE("compositor_parallel_reduction.glsl")
|
||||
DO_STATIC_COMPILATION()
|
||||
GPU_SHADER_CREATE_END()
|
||||
|
||||
@@ -437,6 +437,7 @@ void remove_selected_points(Span<PointsRange> ranges_selected)
|
||||
IndexMaskMemory memory;
|
||||
const IndexMask combined_mask = IndexMask::from_union(item.value, memory);
|
||||
dst_curves.remove_points(combined_mask, {});
|
||||
item.key->tag_topology_changed();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -593,22 +593,22 @@ DEF_ICON(HANDLE_AUTO)
|
||||
DEF_ICON(HANDLE_AUTOCLAMPED)
|
||||
DEF_ICON(HANDLE_FREE)
|
||||
DEF_ICON(HANDLE_VECTOR)
|
||||
DEF_ICON(IPO_BACK)
|
||||
DEF_ICON_COLOR(IPO_BACK)
|
||||
DEF_ICON(IPO_BEZIER)
|
||||
DEF_ICON(IPO_BOUNCE)
|
||||
DEF_ICON(IPO_CIRC)
|
||||
DEF_ICON(IPO_CONSTANT)
|
||||
DEF_ICON(IPO_CUBIC)
|
||||
DEF_ICON_COLOR(IPO_BOUNCE)
|
||||
DEF_ICON_COLOR(IPO_CIRC)
|
||||
DEF_ICON_COLOR(IPO_CONSTANT)
|
||||
DEF_ICON_COLOR(IPO_CUBIC)
|
||||
DEF_ICON(IPO_EASE_IN_OUT)
|
||||
DEF_ICON(IPO_EASE_IN)
|
||||
DEF_ICON(IPO_EASE_OUT)
|
||||
DEF_ICON(IPO_ELASTIC)
|
||||
DEF_ICON(IPO_EXPO)
|
||||
DEF_ICON(IPO_LINEAR)
|
||||
DEF_ICON(IPO_QUAD)
|
||||
DEF_ICON(IPO_QUART)
|
||||
DEF_ICON(IPO_QUINT)
|
||||
DEF_ICON(IPO_SINE)
|
||||
DEF_ICON_COLOR(IPO_ELASTIC)
|
||||
DEF_ICON_COLOR(IPO_EXPO)
|
||||
DEF_ICON_COLOR(IPO_LINEAR)
|
||||
DEF_ICON_COLOR(IPO_QUAD)
|
||||
DEF_ICON_COLOR(IPO_QUART)
|
||||
DEF_ICON_COLOR(IPO_QUINT)
|
||||
DEF_ICON_COLOR(IPO_SINE)
|
||||
DEF_ICON(KEY_DEHLT)
|
||||
DEF_ICON(KEY_HLT)
|
||||
DEF_ICON(KEYFRAME_HLT)
|
||||
|
||||
@@ -1614,13 +1614,13 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol,
|
||||
}
|
||||
|
||||
/* calculate offset and zoom */
|
||||
const float zoomx = (BLI_rcti_size_x(rect) - 2.0f) / clip_size_x;
|
||||
const float zoomy = (BLI_rcti_size_y(rect) - 2.0f) / clip_size_y;
|
||||
const float zoomx = (BLI_rcti_size_x(rect) - 1.0f) / clip_size_x;
|
||||
const float zoomy = (BLI_rcti_size_y(rect) - 1.0f) / clip_size_y;
|
||||
const float offsx = cumap->curr.xmin - (1.0f / zoomx);
|
||||
const float offsy = cumap->curr.ymin - (1.0f / zoomy);
|
||||
|
||||
/* exit early if too narrow */
|
||||
if (zoomx == 0.0f) {
|
||||
if (zoomx <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1827,16 +1827,13 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol,
|
||||
|
||||
/* Reset state for fill & line. */
|
||||
GPU_line_smooth(false);
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
GPU_blend(GPU_BLEND_ALPHA);
|
||||
immUnbindProgram();
|
||||
|
||||
/* The points, use aspect to make them visible on edges. */
|
||||
format = immVertexFormat();
|
||||
pos = GPU_vertformat_attr_add(format, "pos", blender::gpu::VertAttrType::SFLOAT_32_32);
|
||||
const uint col = GPU_vertformat_attr_add(
|
||||
format, "color", blender::gpu::VertAttrType::SFLOAT_32_32_32_32);
|
||||
const uint size = GPU_vertformat_attr_add(format, "size", blender::gpu::VertAttrType::SFLOAT_32);
|
||||
immBindBuiltinProgram(GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR);
|
||||
immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
|
||||
|
||||
GPU_program_point_size(true);
|
||||
|
||||
@@ -1850,37 +1847,82 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol,
|
||||
|
||||
cmp = cuma->curve;
|
||||
const float point_size = max_ff(U.pixelsize * 2.0f,
|
||||
min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f));
|
||||
GPU_blend(GPU_BLEND_ALPHA);
|
||||
min_ff(UI_SCALE_FAC / but->block->aspect * 6.0f, 20.0f));
|
||||
|
||||
int selected = 0;
|
||||
/* Find the total number of selected points. */
|
||||
for (int i = 0; i < cuma->totpoint; i++) {
|
||||
if (cmp[i].flag & CUMA_SELECT) {
|
||||
selected++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Curve widgets using a gradient background (such as Hue Correct), draw
|
||||
* an additional point in the back, forming an outline so they stand out. */
|
||||
if (but_cumap->gradient_type == UI_GRAD_H) {
|
||||
immBegin(GPU_PRIM_POINTS, cuma->totpoint);
|
||||
if ((cuma->totpoint - selected) > 0) {
|
||||
/* Background (outline) for unselected points. */
|
||||
immUniform4fv("color", color_point_outline);
|
||||
immUniform1f("size", point_size * 1.4f);
|
||||
immBegin(GPU_PRIM_POINTS, cuma->totpoint - selected);
|
||||
for (int a = 0; a < cuma->totpoint; a++) {
|
||||
if (cmp[a].flag & CUMA_SELECT) {
|
||||
continue;
|
||||
}
|
||||
const float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
|
||||
const float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
if (selected > 0) {
|
||||
/* Background (outline) for selected points. */
|
||||
immUniform1f("size", point_size * 1.8f);
|
||||
immBegin(GPU_PRIM_POINTS, selected);
|
||||
for (int a = 0; a < cuma->totpoint; a++) {
|
||||
if (!(cmp[a].flag & CUMA_SELECT)) {
|
||||
continue;
|
||||
}
|
||||
const float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
|
||||
const float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
}
|
||||
|
||||
if ((cuma->totpoint - selected) > 0) {
|
||||
/* Unselected points. */
|
||||
immUniform1f("size", point_size);
|
||||
immUniform4fv("color", color_point);
|
||||
immBegin(GPU_PRIM_POINTS, cuma->totpoint - selected);
|
||||
for (int a = 0; a < cuma->totpoint; a++) {
|
||||
if (cmp[a].flag & CUMA_SELECT) {
|
||||
continue;
|
||||
}
|
||||
const float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
|
||||
const float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
|
||||
const float size_factor = (cmp[a].flag & CUMA_SELECT) ? 1.4f : 1.2f;
|
||||
|
||||
/* First the point the back, slightly larger so it makes an outline. */
|
||||
immAttr4fv(col, color_point_outline);
|
||||
immAttr1f(size, point_size * size_factor);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
|
||||
immBegin(GPU_PRIM_POINTS, cuma->totpoint);
|
||||
for (int a = 0; a < cuma->totpoint; a++) {
|
||||
const float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
|
||||
const float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
|
||||
|
||||
/* The point in front. */
|
||||
immAttr4fv(col, (cmp[a].flag & CUMA_SELECT) ? color_point_select : color_point);
|
||||
immAttr1f(size, point_size);
|
||||
immVertex2f(pos, fx, fy);
|
||||
if (selected > 0) {
|
||||
/* Selected points. */
|
||||
immUniform1f("size", point_size * 1.2f);
|
||||
immUniform4fv("color", color_point_select);
|
||||
immBegin(GPU_PRIM_POINTS, selected);
|
||||
for (int a = 0; a < cuma->totpoint; a++) {
|
||||
if (!(cmp[a].flag & CUMA_SELECT)) {
|
||||
continue;
|
||||
}
|
||||
const float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
|
||||
const float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
immEnd();
|
||||
|
||||
immUnbindProgram();
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
|
||||
@@ -1920,13 +1962,13 @@ void ui_draw_but_CURVEPROFILE(ARegion *region,
|
||||
but_profile->edit_profile;
|
||||
|
||||
/* Calculate offset and zoom. */
|
||||
const float zoomx = (BLI_rcti_size_x(rect) - 2.0f) / BLI_rctf_size_x(&profile->view_rect);
|
||||
const float zoomy = (BLI_rcti_size_y(rect) - 2.0f) / BLI_rctf_size_y(&profile->view_rect);
|
||||
const float zoomx = (BLI_rcti_size_x(rect) - 1.0f) / BLI_rctf_size_x(&profile->view_rect);
|
||||
const float zoomy = (BLI_rcti_size_y(rect) - 1.0f) / BLI_rctf_size_y(&profile->view_rect);
|
||||
const float offsx = profile->view_rect.xmin - (1.0f / zoomx);
|
||||
const float offsy = profile->view_rect.ymin - (1.0f / zoomy);
|
||||
|
||||
/* Exit early if too narrow. */
|
||||
if (zoomx == 0.0f) {
|
||||
if (zoomx <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2106,62 +2148,116 @@ void ui_draw_but_CURVEPROFILE(ARegion *region,
|
||||
/* New GPU instructions for control points and sampled points. */
|
||||
format = immVertexFormat();
|
||||
pos = GPU_vertformat_attr_add(format, "pos", blender::gpu::VertAttrType::SFLOAT_32_32);
|
||||
const uint col = GPU_vertformat_attr_add(
|
||||
format, "color", blender::gpu::VertAttrType::SFLOAT_32_32_32_32);
|
||||
const uint size = GPU_vertformat_attr_add(format, "size", blender::gpu::VertAttrType::SFLOAT_32);
|
||||
immBindBuiltinProgram(GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR);
|
||||
immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
|
||||
|
||||
GPU_program_point_size(true);
|
||||
|
||||
float color_point[4], color_point_select[4], color_point_outline[4], color_sample[4];
|
||||
float color_point[4], color_point_select[4], color_sample[4];
|
||||
rgba_uchar_to_float(color_point, wcol->text);
|
||||
color_point[3] = 1.0f;
|
||||
rgba_uchar_to_float(color_point_select, wcol->text_sel);
|
||||
rgba_uchar_to_float(color_point_outline, wcol->inner_sel);
|
||||
color_point_select[3] = 1.0f;
|
||||
color_sample[0] = float(wcol->item[0]) / 255.0f;
|
||||
color_sample[1] = float(wcol->item[1]) / 255.0f;
|
||||
color_sample[2] = float(wcol->item[2]) / 255.0f;
|
||||
color_sample[3] = float(wcol->item[3]) / 255.0f;
|
||||
|
||||
float point_size;
|
||||
int selected = 0;
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (pts[i].flag & PROF_SELECT) {
|
||||
selected++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw the control points. */
|
||||
GPU_line_smooth(false);
|
||||
if (path_len > 0) {
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
point_size = max_ff(U.pixelsize * 2.0f,
|
||||
min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f));
|
||||
GPU_blend(GPU_BLEND_ALPHA);
|
||||
const float point_size = max_ff(U.pixelsize * 2.0f,
|
||||
min_ff(UI_SCALE_FAC / but->block->aspect * 6.0f, 20.0f));
|
||||
|
||||
immBegin(GPU_PRIM_POINTS, path_len);
|
||||
if ((path_len - selected) > 0) {
|
||||
/* Unselected control points. */
|
||||
immUniform4fv("color", color_point);
|
||||
immUniform1f("size", point_size);
|
||||
immBegin(GPU_PRIM_POINTS, path_len - selected);
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (pts[i].flag & PROF_SELECT) {
|
||||
continue;
|
||||
}
|
||||
fx = rect->xmin + zoomx * (pts[i].x - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].y - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
if (selected > 0) {
|
||||
/* Selected control points. */
|
||||
immUniform4fv("color", color_point_select);
|
||||
immUniform1f("size", point_size * 1.2f);
|
||||
immBegin(GPU_PRIM_POINTS, selected);
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (!(pts[i].flag & PROF_SELECT)) {
|
||||
continue;
|
||||
}
|
||||
fx = rect->xmin + zoomx * (pts[i].x - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].y - offsy);
|
||||
const float size_factor = (pts[i].flag & PROF_SELECT) ? 1.5f : 1.0f;
|
||||
|
||||
immAttr1f(size, point_size * size_factor);
|
||||
immAttr4fv(col, (pts[i].flag & PROF_SELECT) ? color_point_select : color_point);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
|
||||
/* Draw the handle points. */
|
||||
if (selected_free_points > 0) {
|
||||
GPU_line_smooth(false);
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
point_size = max_ff(U.pixelsize * 2.0f,
|
||||
min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f));
|
||||
immBegin(GPU_PRIM_POINTS, selected_free_points * 2);
|
||||
/* Find the total number of selected handles. */
|
||||
selected = 0;
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (point_draw_handles(&pts[i])) {
|
||||
if (pts[i].flag & PROF_H1_SELECT) {
|
||||
selected++;
|
||||
}
|
||||
if (pts[i].flag & PROF_H2_SELECT) {
|
||||
selected++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (((selected_free_points * 2) - selected) > 0) {
|
||||
/* Unselected handles. */
|
||||
immUniform4fv("color", color_point);
|
||||
immUniform1f("size", point_size);
|
||||
immBegin(GPU_PRIM_POINTS, (selected_free_points * 2) - selected);
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (point_draw_handles(&pts[i])) {
|
||||
fx = rect->xmin + zoomx * (pts[i].h1_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h1_loc[1] - offsy);
|
||||
immAttr1f(size, point_size);
|
||||
immAttr4fv(col, (pts[i].flag & PROF_H1_SELECT) ? color_point_select : color_point);
|
||||
immVertex2f(pos, fx, fy);
|
||||
fx = rect->xmin + zoomx * (pts[i].h2_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h2_loc[1] - offsy);
|
||||
immAttr4fv(col, (pts[i].flag & PROF_H2_SELECT) ? color_point_select : color_point);
|
||||
immVertex2f(pos, fx, fy);
|
||||
if (!(pts[i].flag & PROF_H1_SELECT)) {
|
||||
fx = rect->xmin + zoomx * (pts[i].h1_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h1_loc[1] - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
if (!(pts[i].flag & PROF_H2_SELECT)) {
|
||||
fx = rect->xmin + zoomx * (pts[i].h2_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h2_loc[1] - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
}
|
||||
}
|
||||
immEnd();
|
||||
}
|
||||
|
||||
if (selected > 0) {
|
||||
/* Selected Handles. */
|
||||
immUniform4fv("color", color_point_select);
|
||||
immUniform1f("size", point_size * 1.2f);
|
||||
immBegin(GPU_PRIM_POINTS, selected);
|
||||
for (int i = 0; i < path_len; i++) {
|
||||
if (point_draw_handles(&pts[i])) {
|
||||
if (pts[i].flag & PROF_H1_SELECT) {
|
||||
fx = rect->xmin + zoomx * (pts[i].h1_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h1_loc[1] - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
if (pts[i].flag & PROF_H2_SELECT) {
|
||||
fx = rect->xmin + zoomx * (pts[i].h2_loc[0] - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].h2_loc[1] - offsy);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
}
|
||||
}
|
||||
immEnd();
|
||||
@@ -2171,13 +2267,12 @@ void ui_draw_but_CURVEPROFILE(ARegion *region,
|
||||
pts = profile->segments;
|
||||
const int segments_len = uint(profile->segments_len);
|
||||
if (segments_len > 0 && pts) {
|
||||
point_size = max_ff(2.0f, min_ff(UI_SCALE_FAC / but->block->aspect * 3.0f, 3.0f));
|
||||
immUniform4fv("color", color_sample);
|
||||
immUniform1f("size", point_size);
|
||||
immBegin(GPU_PRIM_POINTS, segments_len);
|
||||
for (int i = 0; i < segments_len; i++) {
|
||||
fx = rect->xmin + zoomx * (pts[i].x - offsx);
|
||||
fy = rect->ymin + zoomy * (pts[i].y - offsy);
|
||||
immAttr1f(size, point_size);
|
||||
immAttr4fv(col, color_sample);
|
||||
immVertex2f(pos, fx, fy);
|
||||
}
|
||||
immEnd();
|
||||
@@ -2195,6 +2290,7 @@ void ui_draw_but_CURVEPROFILE(ARegion *region,
|
||||
immUniformColor3ubv((const uchar *)wcol->outline);
|
||||
imm_draw_box_wire_2d(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
|
||||
immUnbindProgram();
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
}
|
||||
|
||||
void ui_draw_but_TRACKPREVIEW(ARegion *region,
|
||||
|
||||
@@ -1517,6 +1517,9 @@ static void svg_replace_color_attributes(std::string &svg,
|
||||
{"blender_crease", nullptr, TH_CREASE},
|
||||
{"blender_seam", nullptr, TH_SEAM},
|
||||
{"blender_sharp", nullptr, TH_SHARP},
|
||||
{"blender_ipo_linear", btheme->space_action.anim_interpolation_linear},
|
||||
{"blender_ipo_constant", btheme->space_action.anim_interpolation_constant},
|
||||
{"blender_ipo_other", btheme->space_action.anim_interpolation_other},
|
||||
};
|
||||
|
||||
for (const ColorItem &item : items) {
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include "BKE_context.hh"
|
||||
#include "BKE_library.hh"
|
||||
#include "BKE_main_invariants.hh"
|
||||
#include "BKE_node_tree_interface.hh"
|
||||
|
||||
@@ -332,6 +333,9 @@ class NodeTreeInterfaceView : public AbstractTreeView {
|
||||
|
||||
std::unique_ptr<AbstractViewItemDragController> NodeSocketViewItem::create_drag_controller() const
|
||||
{
|
||||
if (!ID_IS_EDITABLE(&nodetree_.id)) {
|
||||
return nullptr;
|
||||
}
|
||||
return std::make_unique<NodeTreeInterfaceDragController>(
|
||||
static_cast<NodeTreeInterfaceView &>(this->get_tree_view()), socket_.item, nodetree_);
|
||||
}
|
||||
@@ -343,6 +347,9 @@ std::unique_ptr<TreeViewItemDropTarget> NodeSocketViewItem::create_drop_target()
|
||||
|
||||
std::unique_ptr<AbstractViewItemDragController> NodePanelViewItem::create_drag_controller() const
|
||||
{
|
||||
if (!ID_IS_EDITABLE(&nodetree_.id)) {
|
||||
return nullptr;
|
||||
}
|
||||
return std::make_unique<NodeTreeInterfaceDragController>(
|
||||
static_cast<NodeTreeInterfaceView &>(this->get_tree_view()), panel_.item, nodetree_);
|
||||
}
|
||||
|
||||
@@ -1921,7 +1921,7 @@ static void area_calc_totrct(const bScreen *screen, ScrArea *area, const rcti *w
|
||||
/**
|
||||
* Update the `ARegion::visible` flag.
|
||||
*/
|
||||
static void region_evaulate_visibility(ARegion *region)
|
||||
static void region_evaluate_visibility(ARegion *region)
|
||||
{
|
||||
bool hidden = (region->flag & (RGN_FLAG_POLL_FAILED | RGN_FLAG_HIDDEN | RGN_FLAG_TOO_SMALL)) !=
|
||||
0;
|
||||
@@ -2067,7 +2067,7 @@ void ED_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *ar
|
||||
if (region->flag & RGN_FLAG_POLL_FAILED) {
|
||||
continue;
|
||||
}
|
||||
region_evaulate_visibility(region);
|
||||
region_evaluate_visibility(region);
|
||||
|
||||
/* region size may have changed, init does necessary adjustments */
|
||||
if (region->runtime->type->init) {
|
||||
@@ -2178,7 +2178,7 @@ void ED_area_init(bContext *C, const wmWindow *win, ScrArea *area)
|
||||
|
||||
/* region windows, default and own handlers */
|
||||
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
|
||||
region_evaulate_visibility(region);
|
||||
region_evaluate_visibility(region);
|
||||
|
||||
if (region->runtime->visible) {
|
||||
/* default region handlers */
|
||||
@@ -2303,7 +2303,7 @@ void ED_region_floating_init(ARegion *region)
|
||||
BLI_assert(region->alignment == RGN_ALIGN_FLOAT);
|
||||
|
||||
/* refresh can be called before window opened */
|
||||
region_evaulate_visibility(region);
|
||||
region_evaluate_visibility(region);
|
||||
|
||||
region_update_rect(region);
|
||||
}
|
||||
|
||||