WIP: Brush assets project #106303
30
AUTHORS
30
AUTHORS
|
@ -26,8 +26,10 @@ Aaron Franke <arnfranke@yahoo.com>
|
||||||
Adam Nydahl <Loginer>
|
Adam Nydahl <Loginer>
|
||||||
Adi Sage <adisage.connect@gmail.com>
|
Adi Sage <adisage.connect@gmail.com>
|
||||||
Aditya Y Jeppu <quantimoney>
|
Aditya Y Jeppu <quantimoney>
|
||||||
|
Adrian Bibby Walther <adrianbibbywalther@gmail.com>
|
||||||
Adrian Newton <TFS>
|
Adrian Newton <TFS>
|
||||||
AgAmemnno <kaz380@hotmail.co.jp>
|
AgAmemnno <kaz380@hotmail.co.jp>
|
||||||
|
Ahmad Rifai <riff.blend@gmail.com>
|
||||||
Aidan Davey <ShadowDragon>
|
Aidan Davey <ShadowDragon>
|
||||||
Aidan Haile <tactical_fluke>
|
Aidan Haile <tactical_fluke>
|
||||||
Alan Babu <alanaman>
|
Alan Babu <alanaman>
|
||||||
|
@ -69,7 +71,7 @@ Andrej730 <azhilenkov@gmail.com>
|
||||||
Andres Stephens <ondraise15@hotmail.com>
|
Andres Stephens <ondraise15@hotmail.com>
|
||||||
Andrew Buttery <axb2035@gmail.com>
|
Andrew Buttery <axb2035@gmail.com>
|
||||||
Andrew Hale <TrumanBlending@gmail.com>
|
Andrew Hale <TrumanBlending@gmail.com>
|
||||||
Andrew Oates <aoates>
|
Andrew Oates <andrew@andrewoates.com>
|
||||||
Andrew Wiggin <ender79bl@gmail.com>
|
Andrew Wiggin <ender79bl@gmail.com>
|
||||||
Andrew Williams <sobakasu>
|
Andrew Williams <sobakasu>
|
||||||
Andrii Symkin <pembem22>
|
Andrii Symkin <pembem22>
|
||||||
|
@ -96,10 +98,12 @@ Arystanbek Dyussenov <arystan.d@gmail.com>
|
||||||
Asad-ullah Khan <kh4n>
|
Asad-ullah Khan <kh4n>
|
||||||
Asher <ThatAsherGuy>
|
Asher <ThatAsherGuy>
|
||||||
Ashley Ruglys <ashley.ruglys@gmail.com>
|
Ashley Ruglys <ashley.ruglys@gmail.com>
|
||||||
|
Attila Afra <attila.t.afra@intel.com>
|
||||||
Aurel Wildfellner <aurel.w@gmail.com>
|
Aurel Wildfellner <aurel.w@gmail.com>
|
||||||
Aurelien Jarno <aurel32>
|
Aurelien Jarno <aurel32>
|
||||||
Azeem Bande-Ali <azeemba>
|
Azeem Bande-Ali <azeemba>
|
||||||
Baardaap <blender@aaltjegron.nl>
|
Baardaap <blender@aaltjegron.nl>
|
||||||
|
Bartosz Kosiorek <gang65@poczta.onet.pl>
|
||||||
Bartosz Moniewski <monio>
|
Bartosz Moniewski <monio>
|
||||||
Bassam Kurdali <bassam@urchn.org>
|
Bassam Kurdali <bassam@urchn.org>
|
||||||
Bastien Montagne <bastien@blender.org>
|
Bastien Montagne <bastien@blender.org>
|
||||||
|
@ -197,6 +201,7 @@ Dorian <BD3D>
|
||||||
Doug Hammond <doughammond@hamsterfight.co.uk>
|
Doug Hammond <doughammond@hamsterfight.co.uk>
|
||||||
Douglas Paul <douglas.w.paul@gmail.com>
|
Douglas Paul <douglas.w.paul@gmail.com>
|
||||||
Dyvine57 <dulana57@gmail.com>
|
Dyvine57 <dulana57@gmail.com>
|
||||||
|
ESASHIKA Kaoru <git@pluser.dev>
|
||||||
Ed Halley <ed@halley.cc>
|
Ed Halley <ed@halley.cc>
|
||||||
Edgar Roman Cervantes <redvant>
|
Edgar Roman Cervantes <redvant>
|
||||||
Edmund Kapusniak <edmundmk>
|
Edmund Kapusniak <edmundmk>
|
||||||
|
@ -207,6 +212,7 @@ Ejner Fergo <ejnersan@gmail.com>
|
||||||
Elia Sarti <vekoon@gmail.com>
|
Elia Sarti <vekoon@gmail.com>
|
||||||
Emanuel Claesson <emanuel.claesson@gmail.com>
|
Emanuel Claesson <emanuel.claesson@gmail.com>
|
||||||
Enrico Fracasso <enrico.fracasso@email.it>
|
Enrico Fracasso <enrico.fracasso@email.it>
|
||||||
|
Enrique-de-la-Calle <encalle@ucm.es>
|
||||||
Eric Bickle <ShadowChaser>
|
Eric Bickle <ShadowChaser>
|
||||||
Eric Cosky <eric_cosky>
|
Eric Cosky <eric_cosky>
|
||||||
Erik Abrahamsson <ecke101@gmail.com>
|
Erik Abrahamsson <ecke101@gmail.com>
|
||||||
|
@ -231,6 +237,7 @@ Fulk33 <spaceshipwars@gmx.de>
|
||||||
Fynn Grotehans <fynngr@noreply.localhost>
|
Fynn Grotehans <fynngr@noreply.localhost>
|
||||||
Félix <Miadim>
|
Félix <Miadim>
|
||||||
Gaia Clary <gaia.clary@machinimatrix.org>
|
Gaia Clary <gaia.clary@machinimatrix.org>
|
||||||
|
Gangneron <clementgangneron@gmail.com>
|
||||||
Garry R. Osgood <grosgood>
|
Garry R. Osgood <grosgood>
|
||||||
Gavin Li <gav@developer.blender.org>
|
Gavin Li <gav@developer.blender.org>
|
||||||
Geoffrey Bantle <hairbat@yahoo.com>
|
Geoffrey Bantle <hairbat@yahoo.com>
|
||||||
|
@ -323,6 +330,7 @@ John Quillan <jquillan>
|
||||||
Johnny Matthews <johnny.matthews@gmail.com>
|
Johnny Matthews <johnny.matthews@gmail.com>
|
||||||
Joilnen Leite <joilnen.leite@gmail.com>
|
Joilnen Leite <joilnen.leite@gmail.com>
|
||||||
Jonas Holzman <jonas@holzman.fr>
|
Jonas Holzman <jonas@holzman.fr>
|
||||||
|
JonasDichelle <jonasdichelle@gmail.com>
|
||||||
Jonathan Williamson <jonathan@cgcookie.com>
|
Jonathan Williamson <jonathan@cgcookie.com>
|
||||||
Jorge Bernal <jbernalmartinez@gmail.com>
|
Jorge Bernal <jbernalmartinez@gmail.com>
|
||||||
Jorijn de Graaf <bonj@noreply.localhost>
|
Jorijn de Graaf <bonj@noreply.localhost>
|
||||||
|
@ -345,7 +353,7 @@ Julian Eisel <julian@blender.org>
|
||||||
Julian Plak <julian.plak@live.nl>
|
Julian Plak <julian.plak@live.nl>
|
||||||
Julian Squires <julian@cipht.net>
|
Julian Squires <julian@cipht.net>
|
||||||
Julien Kaspar <julien@blender.org>
|
Julien Kaspar <julien@blender.org>
|
||||||
Jun Mizutani <jmztn@noreply.localhost>
|
Jun Mizutani <mizutani.jun@nifty.ne.jp>
|
||||||
Jung Jaeyun <cube-c>
|
Jung Jaeyun <cube-c>
|
||||||
Jure Triglav <juretriglav@gmail.com>
|
Jure Triglav <juretriglav@gmail.com>
|
||||||
Justin Dailey <dail8859@yahoo.com>
|
Justin Dailey <dail8859@yahoo.com>
|
||||||
|
@ -356,7 +364,7 @@ Kai Jægersen <kaio>
|
||||||
Karsten Schwenk <macnihilist@gmx.net>
|
Karsten Schwenk <macnihilist@gmx.net>
|
||||||
Karthik Rangasai Sivaraman <rangasai>
|
Karthik Rangasai Sivaraman <rangasai>
|
||||||
Kaspian Jakobsson <kaspian.jakobsson@gmail.com>
|
Kaspian Jakobsson <kaspian.jakobsson@gmail.com>
|
||||||
Kazashi Yoshioka <vnapdv@noreply.localhost>
|
Kazashi Yoshioka <kaz380@hotmail.co.jp>
|
||||||
Kdaf <Kdaf>
|
Kdaf <Kdaf>
|
||||||
Keir Mierle <mierle@gmail.com>
|
Keir Mierle <mierle@gmail.com>
|
||||||
Keith Boshoff <wahooney>
|
Keith Boshoff <wahooney>
|
||||||
|
@ -373,6 +381,7 @@ Kevin Mackay <mackay.ka@gmail.com>
|
||||||
Khanh Ha <khanhhh89@gmail.com>
|
Khanh Ha <khanhhh89@gmail.com>
|
||||||
Konrad Kleine <konrad.wilhelm.kleine@gmail.com>
|
Konrad Kleine <konrad.wilhelm.kleine@gmail.com>
|
||||||
Konrad Puklicki <puklicki>
|
Konrad Puklicki <puklicki>
|
||||||
|
Koranir <101683475+Koranir@users.noreply.github.com>
|
||||||
Kris <Metricity>
|
Kris <Metricity>
|
||||||
Krzysztof Recko <yetioszek@gmail.com>
|
Krzysztof Recko <yetioszek@gmail.com>
|
||||||
Kévin Dietrich <kevin.dietrich@mailoo.org>
|
Kévin Dietrich <kevin.dietrich@mailoo.org>
|
||||||
|
@ -484,6 +493,7 @@ Nick Milios <semaphore>
|
||||||
Nick Samarin <nicks1987@bigmir.net>
|
Nick Samarin <nicks1987@bigmir.net>
|
||||||
Nicola De Mitri <nicolasap>
|
Nicola De Mitri <nicolasap>
|
||||||
Nicolas Fauvet <droune2001>
|
Nicolas Fauvet <droune2001>
|
||||||
|
Nika Kutsniashvili <nickberckley@gmail.com>
|
||||||
Nikhil Shringarpurey <Nikhil.Net>
|
Nikhil Shringarpurey <Nikhil.Net>
|
||||||
Nikita Sirgienko <nikita.sirgienko@intel.com>
|
Nikita Sirgienko <nikita.sirgienko@intel.com>
|
||||||
Nikolaus Leopold <nikolaus.leopold@gmail.com>
|
Nikolaus Leopold <nikolaus.leopold@gmail.com>
|
||||||
|
@ -512,6 +522,7 @@ Paul Golter <paulgolter>
|
||||||
Paul Melis <paulmelis>
|
Paul Melis <paulmelis>
|
||||||
PaulKristoffersson <57681017+PaulKristoffersson@users.noreply.github.com>
|
PaulKristoffersson <57681017+PaulKristoffersson@users.noreply.github.com>
|
||||||
Pawel Franitza <Rongix>
|
Pawel Franitza <Rongix>
|
||||||
|
Pedro A <povmaniac@noreply.localhost>
|
||||||
Pedro Reis <veryprofessionaldodo>
|
Pedro Reis <veryprofessionaldodo>
|
||||||
Peng Yan <1105012124@qq.com>
|
Peng Yan <1105012124@qq.com>
|
||||||
Petar Dosev <pdosev@gmail.com>
|
Petar Dosev <pdosev@gmail.com>
|
||||||
|
@ -532,8 +543,10 @@ Phoenix Katsch <phoenixkatsch>
|
||||||
Pi Lanningham <Quantumplation>
|
Pi Lanningham <Quantumplation>
|
||||||
Pierluigi Grassi <pierluigi@tukano.it>
|
Pierluigi Grassi <pierluigi@tukano.it>
|
||||||
Pierre Risch <prisch>
|
Pierre Risch <prisch>
|
||||||
|
Pierrick Bouvier <pierrick.bouvier@linaro.org>
|
||||||
Piotr Makal <pmakal>
|
Piotr Makal <pmakal>
|
||||||
Piotr Ostrowski <postrowski>
|
Piotr Ostrowski <postrowski>
|
||||||
|
Prakhar Singh Chouhan <tunealso@gmail.com>
|
||||||
Pratik Borhade <pratikborhade302@gmail.com>
|
Pratik Borhade <pratikborhade302@gmail.com>
|
||||||
Prikshit singh <prikshitsingh79@gmail.com>
|
Prikshit singh <prikshitsingh79@gmail.com>
|
||||||
Quentin Wenger <matpi@protonmail.ch>
|
Quentin Wenger <matpi@protonmail.ch>
|
||||||
|
@ -545,6 +558,7 @@ Rajesh Malviya <rajveer0malviya@gmail.com>
|
||||||
Ralf Hölzemer <r.hoelzemer@googlemail.com>
|
Ralf Hölzemer <r.hoelzemer@googlemail.com>
|
||||||
Ramil Roosileht <Limarest>
|
Ramil Roosileht <Limarest>
|
||||||
Rateeb Riyasat <bmollusc>
|
Rateeb Riyasat <bmollusc>
|
||||||
|
Raul Fernandez <farsthary84@gmail.com>
|
||||||
Rawalanche <rawalanche@gmail.com>
|
Rawalanche <rawalanche@gmail.com>
|
||||||
Ray Molenkamp <github@lazydodo.com>
|
Ray Molenkamp <github@lazydodo.com>
|
||||||
Rebecca Dengate <beckyd>
|
Rebecca Dengate <beckyd>
|
||||||
|
@ -573,15 +587,18 @@ Ryan Inch <Imaginer>
|
||||||
S J Bennett (quollism) <quollism@ii.net>
|
S J Bennett (quollism) <quollism@ii.net>
|
||||||
Sahar A. Kashi <sahar.alipourkashi@amd.com>
|
Sahar A. Kashi <sahar.alipourkashi@amd.com>
|
||||||
Sam Miller <samuelmiller>
|
Sam Miller <samuelmiller>
|
||||||
|
Samuel Bilek <samuel-bilek-1@noreply.localhost>
|
||||||
Sandy Carter <bwrsandman@gmail.com>
|
Sandy Carter <bwrsandman@gmail.com>
|
||||||
Sayak Biswas <sayakAMD>
|
Sayak Biswas <sayakAMD>
|
||||||
Scott Petrovic <scottpetrovic@gmail.com>
|
Scott Petrovic <scottpetrovic@gmail.com>
|
||||||
Scott Spadea <scottspadea>
|
Scott Spadea <scottspadea>
|
||||||
Scott Wilson <propersquid>
|
Scott Wilson <propersquid>
|
||||||
Scurest <scurest>
|
Scurest <scurest>
|
||||||
|
Sean Kim <SeanCTKim@protonmail.com>
|
||||||
Sebastian Herholz <sebastian.herholz@intel.com>
|
Sebastian Herholz <sebastian.herholz@intel.com>
|
||||||
Sebastian Koenig <sebastiankoenig@posteo.de>
|
Sebastian Koenig <sebastiankoenig@posteo.de>
|
||||||
Sebastian Parborg <darkdefende@gmail.com>
|
Sebastian Parborg <sebastian@blender.org>
|
||||||
|
SebastianWitt <w.basti@gmx.de>
|
||||||
Sebastiano Barrera <bars>
|
Sebastiano Barrera <bars>
|
||||||
Sebastián Barschkis <sebbas@sebbas.org>
|
Sebastián Barschkis <sebbas@sebbas.org>
|
||||||
Sergej Reich <sergej.reich@googlemail.com>
|
Sergej Reich <sergej.reich@googlemail.com>
|
||||||
|
@ -629,6 +646,7 @@ Thomas Beck <software@plasmasolutions.de>
|
||||||
Thomas Dinges <thomas@blender.org>
|
Thomas Dinges <thomas@blender.org>
|
||||||
Thomas Lachmann <TL>
|
Thomas Lachmann <TL>
|
||||||
Thomas Szepe <HG1_public@gmx.net>
|
Thomas Szepe <HG1_public@gmx.net>
|
||||||
|
Thomas Wilshaw <thomaswilshaw@gmail.com>
|
||||||
Tiago Chaves <laurelkeys>
|
Tiago Chaves <laurelkeys>
|
||||||
Tianwei Shen <shentianweipku@gmail.com>
|
Tianwei Shen <shentianweipku@gmail.com>
|
||||||
Tim Stullich <tstullich>
|
Tim Stullich <tstullich>
|
||||||
|
@ -677,6 +695,7 @@ Willian Padovani Germano <wpgermano@gmail.com>
|
||||||
Wouter <waterflames>
|
Wouter <waterflames>
|
||||||
Wouter van Heyst <larstiq-bforge@larstiq.dyndns.org>
|
Wouter van Heyst <larstiq-bforge@larstiq.dyndns.org>
|
||||||
Wybren van Keulen <wybren>
|
Wybren van Keulen <wybren>
|
||||||
|
XDzZyq <xiaodouzizyq@gmail.com>
|
||||||
Xavier Cho <mysticfall>
|
Xavier Cho <mysticfall>
|
||||||
Xavier Hallade <xavier.hallade@intel.com>
|
Xavier Hallade <xavier.hallade@intel.com>
|
||||||
Xavier Thomas <xavier.thomas.1980@gmail.com>
|
Xavier Thomas <xavier.thomas.1980@gmail.com>
|
||||||
|
@ -697,12 +716,14 @@ Zijun Zhou <eary@noreply.localhost>
|
||||||
andreas atteneder <atti>
|
andreas atteneder <atti>
|
||||||
ariva00 <ariva00.it@gmail.com>
|
ariva00 <ariva00.it@gmail.com>
|
||||||
b-init <b-init>
|
b-init <b-init>
|
||||||
|
bartus <bartus@noreply.localhost>
|
||||||
bird_d <bird_d>
|
bird_d <bird_d>
|
||||||
brunoT <drehuwann@gmail.com>
|
brunoT <drehuwann@gmail.com>
|
||||||
cgtinker <Denys.Hsu@gmail.com>
|
cgtinker <Denys.Hsu@gmail.com>
|
||||||
coyo_t <constachugga@gmail.com>
|
coyo_t <constachugga@gmail.com>
|
||||||
dupoxy <dupoxy@noreply.localhost>
|
dupoxy <dupoxy@noreply.localhost>
|
||||||
fiord <hyoga_quasar@yahoo.co.jp>
|
fiord <hyoga_quasar@yahoo.co.jp>
|
||||||
|
grady <mgradysaunders@gmail.com>
|
||||||
himisa <himisa@noreply.localhost>
|
himisa <himisa@noreply.localhost>
|
||||||
jim man <jimman2003>
|
jim man <jimman2003>
|
||||||
jon denning <gfxcoder@gmail.com>
|
jon denning <gfxcoder@gmail.com>
|
||||||
|
@ -718,6 +739,7 @@ nBurn <nbwashburn@gmail.com>
|
||||||
nutti <nutti.metro@gmail.com>
|
nutti <nutti.metro@gmail.com>
|
||||||
ok_what <ip1149a@gmail.com>
|
ok_what <ip1149a@gmail.com>
|
||||||
persun <perplexing.sun@gmail.com>
|
persun <perplexing.sun@gmail.com>
|
||||||
|
rifai.id <arifai.dev@gmail.com>
|
||||||
swann <slumber>
|
swann <slumber>
|
||||||
unclezeiv <davide.vercelli@gmail.com>
|
unclezeiv <davide.vercelli@gmail.com>
|
||||||
yves <valfeur>
|
yves <valfeur>
|
||||||
|
|
|
@ -129,7 +129,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
The minimum supported version of CLANG is 8.0, found ${CMAKE_C_COMPILER_VERSION}"
|
The minimum supported version of CLANG is 8.0, found ${CMAKE_C_COMPILER_VERSION}"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
if(MSVC_VERSION VERSION_LESS "1928")
|
if(MSVC_VERSION VERSION_LESS "1928")
|
||||||
# MSVC_VERSION is an internal version number, it doesn't map to something
|
# MSVC_VERSION is an internal version number, it doesn't map to something
|
||||||
# the end user would recognize as a version. Because of this, for MSVC we do
|
# the end user would recognize as a version. Because of this, for MSVC we do
|
||||||
|
@ -645,7 +645,7 @@ mark_as_advanced(WITH_CYCLES_PRECOMPUTE)
|
||||||
mark_as_advanced(CYCLES_TEST_DEVICES)
|
mark_as_advanced(CYCLES_TEST_DEVICES)
|
||||||
|
|
||||||
# NVIDIA CUDA & OptiX
|
# NVIDIA CUDA & OptiX
|
||||||
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES ARM64))
|
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64"))
|
||||||
option(WITH_CYCLES_DEVICE_CUDA "Enable Cycles NVIDIA CUDA compute support" ON)
|
option(WITH_CYCLES_DEVICE_CUDA "Enable Cycles NVIDIA CUDA compute support" ON)
|
||||||
option(WITH_CYCLES_DEVICE_OPTIX "Enable Cycles NVIDIA OptiX support" ON)
|
option(WITH_CYCLES_DEVICE_OPTIX "Enable Cycles NVIDIA OptiX support" ON)
|
||||||
mark_as_advanced(WITH_CYCLES_DEVICE_CUDA)
|
mark_as_advanced(WITH_CYCLES_DEVICE_CUDA)
|
||||||
|
@ -680,7 +680,7 @@ When set, this path will be used at runtime to compile OptiX kernels."
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# AMD HIP
|
# AMD HIP
|
||||||
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES ARM64))
|
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64"))
|
||||||
option(WITH_CYCLES_DEVICE_HIP "Enable Cycles AMD HIP support" ON)
|
option(WITH_CYCLES_DEVICE_HIP "Enable Cycles AMD HIP support" ON)
|
||||||
option(WITH_CYCLES_HIP_BINARIES "Build Cycles AMD HIP binaries" OFF)
|
option(WITH_CYCLES_HIP_BINARIES "Build Cycles AMD HIP binaries" OFF)
|
||||||
# Radeon VII (gfx906) not currently working with HIP SDK, so left out of the list.
|
# Radeon VII (gfx906) not currently working with HIP SDK, so left out of the list.
|
||||||
|
@ -707,7 +707,7 @@ if(APPLE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# oneAPI
|
# oneAPI
|
||||||
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES ARM64))
|
if(NOT APPLE AND NOT (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64"))
|
||||||
option(WITH_CYCLES_DEVICE_ONEAPI "Enable Cycles oneAPI compute support" OFF)
|
option(WITH_CYCLES_DEVICE_ONEAPI "Enable Cycles oneAPI compute support" OFF)
|
||||||
option(WITH_CYCLES_ONEAPI_BINARIES "\
|
option(WITH_CYCLES_ONEAPI_BINARIES "\
|
||||||
Enable Ahead-Of-Time compilation for Cycles oneAPI device"
|
Enable Ahead-Of-Time compilation for Cycles oneAPI device"
|
||||||
|
@ -797,9 +797,19 @@ endif()
|
||||||
|
|
||||||
# Unit testing
|
# Unit testing
|
||||||
option(WITH_GTESTS "Enable GTest unit testing" OFF)
|
option(WITH_GTESTS "Enable GTest unit testing" OFF)
|
||||||
option(WITH_GPU_RENDER_TESTS "Enable GPU render related unit testing (EEVEE, Workbench and Grease Pencil)" OFF)
|
option(WITH_GPU_RENDER_TESTS "\
|
||||||
option(WITH_GPU_RENDER_TESTS_SILENT "Run GPU render tests silently (finished tests will pass). Generated report will show failing tests" ON)
|
Enable GPU render related unit testing (EEVEE, Workbench and Grease Pencil)"
|
||||||
option(WITH_GPU_DRAW_TESTS "Enable GPU drawing related unit testing (GPU backends and draw manager)" OFF)
|
OFF
|
||||||
|
)
|
||||||
|
option(WITH_GPU_RENDER_TESTS_SILENT "\
|
||||||
|
Run GPU render tests silently (finished tests will pass). \
|
||||||
|
Generated report will show failing tests"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
option(WITH_GPU_DRAW_TESTS "\
|
||||||
|
Enable GPU drawing related unit testing (GPU backends and draw manager)"
|
||||||
|
OFF
|
||||||
|
)
|
||||||
option(WITH_COMPOSITOR_REALTIME_TESTS "Enable regression testing for realtime compositor" OFF)
|
option(WITH_COMPOSITOR_REALTIME_TESTS "Enable regression testing for realtime compositor" OFF)
|
||||||
if(UNIX AND NOT (APPLE OR HAIKU))
|
if(UNIX AND NOT (APPLE OR HAIKU))
|
||||||
option(WITH_UI_TESTS "\
|
option(WITH_UI_TESTS "\
|
||||||
|
@ -816,7 +826,10 @@ endif()
|
||||||
# Enabled by default for typical use cases to speed up development cycles. However, when looking
|
# Enabled by default for typical use cases to speed up development cycles. However, when looking
|
||||||
# into threading or memory related issues (in dependency graph, out-of-bounds, etc) forcing single
|
# into threading or memory related issues (in dependency graph, out-of-bounds, etc) forcing single
|
||||||
# test per Blender instance could give much better clues about the root of the problem.
|
# test per Blender instance could give much better clues about the root of the problem.
|
||||||
option(WITH_TESTS_BATCHED "Run multiple tests in a single Blender invocation, for faster test execution" ON)
|
option(WITH_TESTS_BATCHED "\
|
||||||
|
Run multiple tests in a single Blender invocation, for faster test execution"
|
||||||
|
ON
|
||||||
|
)
|
||||||
mark_as_advanced(WITH_TESTS_BATCHED)
|
mark_as_advanced(WITH_TESTS_BATCHED)
|
||||||
|
|
||||||
option(WITH_TESTS_SINGLE_BINARY "\
|
option(WITH_TESTS_SINGLE_BINARY "\
|
||||||
|
@ -1354,7 +1367,7 @@ if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
|
||||||
# affect on the printed backtrace, and exception handling was correct as well.
|
# affect on the printed backtrace, and exception handling was correct as well.
|
||||||
#
|
#
|
||||||
# Related discussion:
|
# Related discussion:
|
||||||
# https://stackoverflow.com/questions/26300819/why-gcc-compiled-c-program-needs-eh-frame-section
|
# https://stackoverflow.com/questions/26300819
|
||||||
add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-unwind-tables>")
|
add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-unwind-tables>")
|
||||||
add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-asynchronous-unwind-tables>")
|
add_compile_options("$<${_is_CONFIG_DEBUG}:-fno-asynchronous-unwind-tables>")
|
||||||
|
|
||||||
|
@ -1675,12 +1688,14 @@ if("${CMAKE_GENERATOR}" MATCHES "Ninja" AND WITH_NINJA_POOL_JOBS)
|
||||||
# but this also accounts for the part of the physical RAM being used by other unrelated
|
# but this also accounts for the part of the physical RAM being used by other unrelated
|
||||||
# processes on the system, and the part being used by the 'regular' compile and linking jobs.
|
# processes on the system, and the part being used by the 'regular' compile and linking jobs.
|
||||||
#
|
#
|
||||||
# Also always cap heavy jobs amount to `number of available threads - 1`, to ensure that even if
|
# Also always cap heavy jobs amount to `number of available threads - 1`,
|
||||||
# there would be enough RAM, the machine never ends up handling only heavy jobs at some point.
|
# to ensure that even if there would be enough RAM, the machine never ends up
|
||||||
# This can have annoying sides effects, like lack of output in the console for several minutes,
|
# handling only heavy jobs at some point.
|
||||||
# which can lead to a wrong detection of 'unresponsive' state by the buildbots e.g.
|
# This can have annoying sides effects, like lack of output in the console for several
|
||||||
|
# minutes, which can lead to a wrong detection of 'unresponsive' state by the build-bots e.g.
|
||||||
#
|
#
|
||||||
# Currently, these settings applied to a 64GB/16threads linux machine will use, for a full build:
|
# Currently, these settings applied to a 64GB/16threads linux machine will use,
|
||||||
|
# for a full build:
|
||||||
# - release build:
|
# - release build:
|
||||||
# * RAM: typically less than 20%, with some peaks at 25%.
|
# * RAM: typically less than 20%, with some peaks at 25%.
|
||||||
# * CPU: over 90% of usage on average over the whole build time.
|
# * CPU: over 90% of usage on average over the whole build time.
|
||||||
|
@ -1927,6 +1942,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
# Matches both "Clang" & "AppleClang" on macOS.
|
||||||
|
|
||||||
add_check_c_compiler_flags(
|
add_check_c_compiler_flags(
|
||||||
C_WARNINGS
|
C_WARNINGS
|
||||||
|
@ -2034,7 +2050,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
CXX_WARN_NO_UNDEF_PREFIX -Wno-undef-prefix
|
CXX_WARN_NO_UNDEF_PREFIX -Wno-undef-prefix
|
||||||
)
|
)
|
||||||
|
|
||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||||
|
|
||||||
add_check_c_compiler_flags(
|
add_check_c_compiler_flags(
|
||||||
C_WARNINGS
|
C_WARNINGS
|
||||||
|
@ -2055,7 +2071,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
||||||
# Disable numbered, false positives.
|
# Disable numbered, false positives.
|
||||||
string(APPEND C_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
|
string(APPEND C_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
|
||||||
string(APPEND CXX_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
|
string(APPEND CXX_WARNINGS " -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
|
||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||||
# most msvc warnings are C & C++
|
# most msvc warnings are C & C++
|
||||||
set(_WARNINGS
|
set(_WARNINGS
|
||||||
# warning level:
|
# warning level:
|
||||||
|
@ -2149,7 +2165,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
# This is because sse2neon requires it.
|
# This is because sse2neon requires it.
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
string(APPEND CMAKE_CXX_FLAGS " /Zc:__cplusplus")
|
string(APPEND CMAKE_CXX_FLAGS " /Zc:__cplusplus")
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
string(APPEND CMAKE_CXX_FLAGS " /Zc:preprocessor")
|
string(APPEND CMAKE_CXX_FLAGS " /Zc:preprocessor")
|
||||||
string(APPEND CMAKE_C_FLAGS " /Zc:preprocessor")
|
string(APPEND CMAKE_C_FLAGS " /Zc:preprocessor")
|
||||||
endif()
|
endif()
|
||||||
|
@ -2160,7 +2176,7 @@ endif()
|
||||||
if(
|
if(
|
||||||
CMAKE_COMPILER_IS_GNUCC OR
|
CMAKE_COMPILER_IS_GNUCC OR
|
||||||
(CMAKE_C_COMPILER_ID MATCHES "Clang" AND (NOT MSVC)) OR
|
(CMAKE_C_COMPILER_ID MATCHES "Clang" AND (NOT MSVC)) OR
|
||||||
(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
(CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||||
)
|
)
|
||||||
# Use C11 + GNU extensions, works with GCC, Clang, ICC
|
# Use C11 + GNU extensions, works with GCC, Clang, ICC
|
||||||
string(APPEND CMAKE_C_FLAGS " -std=gnu11")
|
string(APPEND CMAKE_C_FLAGS " -std=gnu11")
|
||||||
|
|
|
@ -116,7 +116,8 @@ if(NOT BLENDER_PLATFORM_WINDOWS_ARM)
|
||||||
endif()
|
endif()
|
||||||
# Embree needs to be included after dpcpp as it uses it for compiling with GPU support
|
# Embree needs to be included after dpcpp as it uses it for compiling with GPU support
|
||||||
if(BLENDER_PLATFORM_WINDOWS_ARM)
|
if(BLENDER_PLATFORM_WINDOWS_ARM)
|
||||||
# WoA needs embree to be built with the VS Generator + LLVM, put it in it's own file to avoid clutter
|
# WoA needs embree to be built with the VS Generator + LLVM,
|
||||||
|
# put it in it's own file to avoid clutter.
|
||||||
include(cmake/embree_windows_arm.cmake)
|
include(cmake/embree_windows_arm.cmake)
|
||||||
else()
|
else()
|
||||||
include(cmake/embree.cmake)
|
include(cmake/embree.cmake)
|
||||||
|
|
|
@ -15,7 +15,8 @@ foreach(_variableName ${_variableNames})
|
||||||
# First see if DEP_HOMEPAGE is set, if it is use that.
|
# First see if DEP_HOMEPAGE is set, if it is use that.
|
||||||
set(DEP_HOMEPAGE ${${DEP_NAME}_HOMEPAGE})
|
set(DEP_HOMEPAGE ${${DEP_NAME}_HOMEPAGE})
|
||||||
if(NOT DEP_HOMEPAGE)
|
if(NOT DEP_HOMEPAGE)
|
||||||
# If the xxx_HOMEPAGE is not set but the URI for the archive is a known github format extract the reprository/project from the URI
|
# If the xxx_HOMEPAGE is not set but the URI for the archive is a known github format
|
||||||
|
# extract the repository/project from the URI.
|
||||||
string(REGEX MATCH "https:\/\/(.*)github\.com\/(.+)\/(archive|releases|release|tar.gz)\/(.*)" DEP_PROJECT "${${_variableName}}")
|
string(REGEX MATCH "https:\/\/(.*)github\.com\/(.+)\/(archive|releases|release|tar.gz)\/(.*)" DEP_PROJECT "${${_variableName}}")
|
||||||
if(CMAKE_MATCH_2)
|
if(CMAKE_MATCH_2)
|
||||||
set(DEP_HOMEPAGE "https://www.github.com/${CMAKE_MATCH_2}")
|
set(DEP_HOMEPAGE "https://www.github.com/${CMAKE_MATCH_2}")
|
||||||
|
|
|
@ -43,15 +43,18 @@ set(EMBREE_EXTRA_ARGS
|
||||||
|
|
||||||
# We want the VS2019 tools for embree, as they are stable.
|
# We want the VS2019 tools for embree, as they are stable.
|
||||||
# We cannot use VS2022 easily, unless we specify an older (unsupported) toolset such as 17.35,
|
# We cannot use VS2022 easily, unless we specify an older (unsupported) toolset such as 17.35,
|
||||||
# as the newer toolsets mandate LLVM 16, which we cannot use currently, due to lack of support in OSL and ISPC.
|
# as the newer toolsets mandate LLVM 16, which we cannot use currently,
|
||||||
|
# due to lack of support in OSL and ISPC.
|
||||||
set(EMBREE_VCTOOLS_REQUIRED_VERSION 14.29)
|
set(EMBREE_VCTOOLS_REQUIRED_VERSION 14.29)
|
||||||
|
|
||||||
# Extract the list of installed tools that match the required version from the `VCToolsInstallDir` env var
|
# Extract the list of installed tools that match the required version from the
|
||||||
|
# `VCToolsInstallDir` env var
|
||||||
file(TO_CMAKE_PATH $ENV{VCToolsInstallDir} EMBREE_VCTOOLSINSTALLDIR_PATH)
|
file(TO_CMAKE_PATH $ENV{VCToolsInstallDir} EMBREE_VCTOOLSINSTALLDIR_PATH)
|
||||||
cmake_path(GET EMBREE_VCTOOLSINSTALLDIR_PATH PARENT_PATH EMBREE_VCTOOLSDIR_PATH)
|
cmake_path(GET EMBREE_VCTOOLSINSTALLDIR_PATH PARENT_PATH EMBREE_VCTOOLSDIR_PATH)
|
||||||
file(GLOB EMBREE_INSTALLED_VCTOOLS RELATIVE ${EMBREE_VCTOOLSDIR_PATH} ${EMBREE_VCTOOLSDIR_PATH}/${EMBREE_VCTOOLS_REQUIRED_VERSION}*)
|
file(GLOB EMBREE_INSTALLED_VCTOOLS RELATIVE ${EMBREE_VCTOOLSDIR_PATH} ${EMBREE_VCTOOLSDIR_PATH}/${EMBREE_VCTOOLS_REQUIRED_VERSION}*)
|
||||||
|
|
||||||
# Check that at least one the installed tool versions (there may be different subversions) is present
|
# Check that at least one the installed tool versions
|
||||||
|
# (there may be different subversions) is present.
|
||||||
if(NOT EMBREE_INSTALLED_VCTOOLS)
|
if(NOT EMBREE_INSTALLED_VCTOOLS)
|
||||||
message(FATAL_ERROR "When building for Windows ARM64 platforms, embree requires VC Tools ${EMBREE_VCTOOLS_REQUIRED_VERSION} to be installed alongside the current version.")
|
message(FATAL_ERROR "When building for Windows ARM64 platforms, embree requires VC Tools ${EMBREE_VCTOOLS_REQUIRED_VERSION} to be installed alongside the current version.")
|
||||||
endif()
|
endif()
|
||||||
|
@ -60,15 +63,26 @@ endif()
|
||||||
list(SORT EMBREE_INSTALLED_VCTOOLS)
|
list(SORT EMBREE_INSTALLED_VCTOOLS)
|
||||||
list(GET EMBREE_INSTALLED_VCTOOLS -1 EMBREE_VCTOOLS_VERSION)
|
list(GET EMBREE_INSTALLED_VCTOOLS -1 EMBREE_VCTOOLS_VERSION)
|
||||||
|
|
||||||
# Configure our in file and temporarily store it in the build dir (with modified extension so nothing else picks it up)
|
# Configure our in file and temporarily store it in the build dir
|
||||||
# This feels icky, but boost does something similar, and we haven't called ExternalProject_Add yet, so the embree dir does not yet exist
|
# (with modified extension so nothing else picks it up)
|
||||||
configure_file(${PATCH_DIR}/embree_Directory.Build.Props.in ${BUILD_DIR}/embree_Directory.Build.Props_temp)
|
# This feels icky, but boost does something similar, and we haven't called
|
||||||
|
# `ExternalProject_Add` yet, so the embree dir does not yet exist.
|
||||||
|
configure_file(
|
||||||
|
${PATCH_DIR}/embree_Directory.Build.Props.in
|
||||||
|
${BUILD_DIR}/embree_Directory.Build.Props_temp
|
||||||
|
)
|
||||||
|
|
||||||
# Update the patch command to copy the configured build props file in
|
# Update the patch command to copy the configured build props file in
|
||||||
set(EMBREE_PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${BUILD_DIR}/embree_Directory.Build.Props_temp ${BUILD_DIR}/embree/src/external_embree-build/Directory.Build.Props && ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff)
|
set(EMBREE_PATCH_COMMAND
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
${BUILD_DIR}/embree_Directory.Build.Props_temp
|
||||||
|
${BUILD_DIR}/embree/src/external_embree-build/Directory.Build.Props &&
|
||||||
|
${PATCH_CMD} -p 1 -d ${BUILD_DIR}/embree/src/external_embree < ${PATCH_DIR}/embree.diff
|
||||||
|
)
|
||||||
|
|
||||||
# This all only works if we use the VS generator (with clangcl toolset), so switch back to that
|
# This all only works if we use the VS generator (with `clangcl` toolset), so switch back to that
|
||||||
# Note: there is literally no way to get ninja to use a different toolset other than manually overwriting every env var, or calling a nested vcvarsall, both of which are *messy*
|
# Note: there is literally no way to get ninja to use a different toolset other than manually
|
||||||
|
# overwriting every env var, or calling a nested `vcvarsall`, both of which are *messy*.
|
||||||
set(EMBREE_GENERATOR ${CMAKE_GENERATOR})
|
set(EMBREE_GENERATOR ${CMAKE_GENERATOR})
|
||||||
set(EMBREE_GENERATOR_TOOLSET ClangCL)
|
set(EMBREE_GENERATOR_TOOLSET ClangCL)
|
||||||
|
|
||||||
|
@ -99,16 +113,30 @@ add_dependencies(
|
||||||
|
|
||||||
if(BUILD_MODE STREQUAL Release)
|
if(BUILD_MODE STREQUAL Release)
|
||||||
ExternalProject_Add_Step(external_embree after_install
|
ExternalProject_Add_Step(external_embree after_install
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/include ${HARVEST_TARGET}/embree/include
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/lib ${HARVEST_TARGET}/embree/lib
|
${LIBDIR}/embree/include
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree/share ${HARVEST_TARGET}/embree/share
|
${HARVEST_TARGET}/embree/include
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/bin/embree4.dll ${HARVEST_TARGET}/embree/bin/embree4.dll
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
|
${LIBDIR}/embree/lib
|
||||||
|
${HARVEST_TARGET}/embree/lib
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
|
${LIBDIR}/embree/share
|
||||||
|
${HARVEST_TARGET}/embree/share
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
${LIBDIR}/embree/bin/embree4.dll
|
||||||
|
${HARVEST_TARGET}/embree/bin/embree4.dll
|
||||||
|
|
||||||
DEPENDEES install
|
DEPENDEES install
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
ExternalProject_Add_Step(external_embree after_install
|
ExternalProject_Add_Step(external_embree after_install
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/bin/embree4_d.dll ${HARVEST_TARGET}/embree/bin/embree4_d.dll
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree4_d.lib ${HARVEST_TARGET}/embree/lib/embree4_d.lib
|
${LIBDIR}/embree/bin/embree4_d.dll
|
||||||
|
${HARVEST_TARGET}/embree/bin/embree4_d.dll
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
${LIBDIR}/embree/lib/embree4_d.lib
|
||||||
|
${HARVEST_TARGET}/embree/lib/embree4_d.lib
|
||||||
|
|
||||||
DEPENDEES install
|
DEPENDEES install
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
# Generated configuration files use an old `aclocal-1.15` on RockyLinux8.
|
# Generated configuration files use an old `aclocal-1.15` on RockyLinux8.
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
set(_autoconf_cmd_optional ./autogen.sh &&)
|
set(_autoconf_cmd_optional ./autogen.sh &&)
|
||||||
else()
|
else()
|
||||||
set(_autoconf_cmd_optional)
|
set(_autoconf_cmd_optional)
|
||||||
|
|
|
@ -59,6 +59,21 @@ else()
|
||||||
set(OIDN_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS})
|
set(OIDN_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(ODIN_PATCH_COMMAND
|
||||||
|
${PATCH_CMD} --verbose -p 1 -N -d
|
||||||
|
${BUILD_DIR}/openimagedenoise/src/external_openimagedenoise <
|
||||||
|
${PATCH_DIR}/oidn.diff
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
# Replace `attrib.memoryType` with `attrib.type`.
|
||||||
|
# See: https://github.com/ROCm/HIP/pull/2164
|
||||||
|
set(ODIN_PATCH_COMMAND ${ODIN_PATCH_COMMAND} &&
|
||||||
|
sed -i "s/(attrib\\.memoryType)/(attrib.type)/g"
|
||||||
|
${BUILD_DIR}/openimagedenoise/src/external_openimagedenoise/devices/hip/hip_device.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
ExternalProject_Add(external_openimagedenoise
|
ExternalProject_Add(external_openimagedenoise
|
||||||
URL file://${PACKAGE_DIR}/${OIDN_FILE}
|
URL file://${PACKAGE_DIR}/${OIDN_FILE}
|
||||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||||
|
@ -71,13 +86,12 @@ ExternalProject_Add(external_openimagedenoise
|
||||||
${OIDN_CMAKE_FLAGS}
|
${OIDN_CMAKE_FLAGS}
|
||||||
${OIDN_EXTRA_ARGS}
|
${OIDN_EXTRA_ARGS}
|
||||||
|
|
||||||
PATCH_COMMAND ${PATCH_CMD} --verbose -p 1 -N -d
|
PATCH_COMMAND ${ODIN_PATCH_COMMAND}
|
||||||
${BUILD_DIR}/openimagedenoise/src/external_openimagedenoise <
|
|
||||||
${PATCH_DIR}/oidn.diff
|
|
||||||
|
|
||||||
INSTALL_DIR ${LIBDIR}/openimagedenoise
|
INSTALL_DIR ${LIBDIR}/openimagedenoise
|
||||||
)
|
)
|
||||||
|
|
||||||
|
unset(ODIN_PATCH_COMMAND)
|
||||||
|
|
||||||
add_dependencies(
|
add_dependencies(
|
||||||
external_openimagedenoise
|
external_openimagedenoise
|
||||||
external_tbb
|
external_tbb
|
||||||
|
|
|
@ -41,7 +41,7 @@ message("PATCH_DIR = ${PATCH_DIR}")
|
||||||
message("BUILD_DIR = ${BUILD_DIR}")
|
message("BUILD_DIR = ${BUILD_DIR}")
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
set(BLENDER_PLATFORM_ARM ON)
|
set(BLENDER_PLATFORM_ARM ON)
|
||||||
set(BLENDER_PLATFORM_WINDOWS_ARM ON)
|
set(BLENDER_PLATFORM_WINDOWS_ARM ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -116,12 +116,14 @@ else()
|
||||||
endif()
|
endif()
|
||||||
set(PYTHON_BINARY ${LIBDIR}/python/bin/python${PYTHON_SHORT_VERSION})
|
set(PYTHON_BINARY ${LIBDIR}/python/bin/python${PYTHON_SHORT_VERSION})
|
||||||
|
|
||||||
# Various flags to convince Python to use our own versions of ffi, sqlite, ssl, bzip2, lzma and zlib.
|
# Various flags to convince Python to use our own versions of:
|
||||||
|
# `ffi`, `sqlite`, `ssl`, `bzip2`, `lzma` and `zlib`.
|
||||||
# Using pkg-config is only supported for some, and even then we need to work around issues.
|
# Using pkg-config is only supported for some, and even then we need to work around issues.
|
||||||
set(PYTHON_CONFIGURE_EXTRA_ARGS --with-openssl=${LIBDIR}/ssl)
|
set(PYTHON_CONFIGURE_EXTRA_ARGS --with-openssl=${LIBDIR}/ssl)
|
||||||
set(PYTHON_CFLAGS "${PLATFORM_CFLAGS} ")
|
set(PYTHON_CFLAGS "${PLATFORM_CFLAGS} ")
|
||||||
# Manually specify some library paths. For ffi there is no other way, for sqlite is needed because
|
# Manually specify some library paths. For ffi there is no other way,
|
||||||
# LIBSQLITE3_LIBS does not work, and ssl because it uses the wrong ssl/lib dir instead of ssl/lib64.
|
# for sqlite is needed because LIBSQLITE3_LIBS does not work,
|
||||||
|
# and ssl because it uses the wrong ssl/lib dir instead of ssl/lib64.
|
||||||
set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/ssl/lib -L${LIBDIR}/ssl/lib64 ${PLATFORM_LDFLAGS} ")
|
set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/ssl/lib -L${LIBDIR}/ssl/lib64 ${PLATFORM_LDFLAGS} ")
|
||||||
set(PYTHON_CONFIGURE_EXTRA_ENV
|
set(PYTHON_CONFIGURE_EXTRA_ENV
|
||||||
export CFLAGS=${PYTHON_CFLAGS} &&
|
export CFLAGS=${PYTHON_CFLAGS} &&
|
||||||
|
|
|
@ -87,7 +87,8 @@ if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/perl.exe")
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Strip out the copy of link that comes with some packages if it exists, otherwise meson builds break
|
# Strip out the copy of link that comes with some packages if it exists,
|
||||||
|
# otherwise meson builds break.
|
||||||
if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe")
|
if(EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe")
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -E rm ${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe
|
COMMAND ${CMAKE_COMMAND} -E rm ${DOWNLOAD_DIR}/msys2/msys64/usr/bin/link.exe
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
set(SSL_CONFIGURE_COMMAND ./Configure)
|
set(SSL_CONFIGURE_COMMAND ./Configure)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
# Python will build this with its preferred build options and patches. We only need to unpack openssl
|
# Python will build this with its preferred build options and patches.
|
||||||
|
# We only need to unpack openssl.
|
||||||
ExternalProject_Add(external_ssl
|
ExternalProject_Add(external_ssl
|
||||||
URL file://${PACKAGE_DIR}/${SSL_FILE}
|
URL file://${PACKAGE_DIR}/${SSL_FILE}
|
||||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||||
|
|
|
@ -41,7 +41,8 @@ if(NOT WIN32)
|
||||||
INSTALL_DIR ${LIBDIR}/theora
|
INSTALL_DIR ${LIBDIR}/theora
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
# We are kind of naughty here and steal vorbis' FindOgg.cmake, but given it's a dependency anyway...
|
# We are kind of naughty here and steal vorbis' `FindOgg.cmake`,
|
||||||
|
# but given it's a dependency anyway.
|
||||||
ExternalProject_Add(external_theora
|
ExternalProject_Add(external_theora
|
||||||
URL file://${PACKAGE_DIR}/${THEORA_FILE}
|
URL file://${PACKAGE_DIR}/${THEORA_FILE}
|
||||||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||||
|
|
|
@ -554,7 +554,7 @@ macro(TEST_SSE_SUPPORT
|
||||||
set(${_sse_flags} "/arch:SSE")
|
set(${_sse_flags} "/arch:SSE")
|
||||||
set(${_sse2_flags} "/arch:SSE2")
|
set(${_sse2_flags} "/arch:SSE2")
|
||||||
endif()
|
endif()
|
||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||||
set(${_sse_flags} "") # icc defaults to -msse
|
set(${_sse_flags} "") # icc defaults to -msse
|
||||||
set(${_sse2_flags} "") # icc defaults to -msse2
|
set(${_sse2_flags} "") # icc defaults to -msse2
|
||||||
else()
|
else()
|
||||||
|
@ -766,7 +766,7 @@ endmacro()
|
||||||
macro(remove_cc_flag_unsigned_char)
|
macro(remove_cc_flag_unsigned_char)
|
||||||
if(CMAKE_COMPILER_IS_GNUCC OR
|
if(CMAKE_COMPILER_IS_GNUCC OR
|
||||||
(CMAKE_C_COMPILER_ID MATCHES "Clang") OR
|
(CMAKE_C_COMPILER_ID MATCHES "Clang") OR
|
||||||
(CMAKE_C_COMPILER_ID MATCHES "Intel"))
|
(CMAKE_C_COMPILER_ID STREQUAL "Intel"))
|
||||||
remove_cc_flag("-funsigned-char")
|
remove_cc_flag("-funsigned-char")
|
||||||
elseif(MSVC)
|
elseif(MSVC)
|
||||||
remove_cc_flag("/J")
|
remove_cc_flag("/J")
|
||||||
|
|
|
@ -62,7 +62,7 @@ else()
|
||||||
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME_LOWER}-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-git${CPACK_DATE}.${BUILD_REV}-${PACKAGE_ARCH})
|
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME_LOWER}-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-git${CPACK_DATE}.${BUILD_REV}-${PACKAGE_ARCH})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
# RPM packages
|
# RPM packages
|
||||||
include(build_files/cmake/RpmBuild.cmake)
|
include(build_files/cmake/RpmBuild.cmake)
|
||||||
if(RPMBUILD_FOUND)
|
if(RPMBUILD_FOUND)
|
||||||
|
|
|
@ -649,7 +649,7 @@ if(CMAKE_DL_LIBS)
|
||||||
list(APPEND PLATFORM_LINKLIBS ${CMAKE_DL_LIBS})
|
list(APPEND PLATFORM_LINKLIBS ${CMAKE_DL_LIBS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
if(NOT WITH_PYTHON_MODULE)
|
if(NOT WITH_PYTHON_MODULE)
|
||||||
# binreloc is linux only
|
# binreloc is linux only
|
||||||
set(BINRELOC_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/binreloc/include)
|
set(BINRELOC_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/binreloc/include)
|
||||||
|
@ -1043,7 +1043,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Intel C++ Compiler
|
# Intel C++ Compiler
|
||||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||||
# think these next two are broken
|
# think these next two are broken
|
||||||
find_program(XIAR xiar)
|
find_program(XIAR xiar)
|
||||||
if(XIAR)
|
if(XIAR)
|
||||||
|
@ -1136,8 +1136,12 @@ if(PLATFORM_BUNDLED_LIBRARIES)
|
||||||
|
|
||||||
# Environment variables to run precompiled executables that needed libraries.
|
# Environment variables to run precompiled executables that needed libraries.
|
||||||
list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ":" _library_paths)
|
list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ":" _library_paths)
|
||||||
set(PLATFORM_ENV_BUILD "LD_LIBRARY_PATH=\"${_library_paths}:$LD_LIBRARY_PATH\"")
|
set(PLATFORM_ENV_BUILD
|
||||||
set(PLATFORM_ENV_INSTALL "LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/lib/;$LD_LIBRARY_PATH")
|
"LD_LIBRARY_PATH=\"${_library_paths}:$LD_LIBRARY_PATH\""
|
||||||
|
)
|
||||||
|
set(PLATFORM_ENV_INSTALL
|
||||||
|
"LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/lib/;$LD_LIBRARY_PATH"
|
||||||
|
)
|
||||||
unset(_library_paths)
|
unset(_library_paths)
|
||||||
else()
|
else()
|
||||||
# Quiet unused variable warnings, unfortunately this can't be empty.
|
# Quiet unused variable warnings, unfortunately this can't be empty.
|
||||||
|
|
|
@ -119,7 +119,11 @@ remove_cc_flag("/GR")
|
||||||
add_definitions(-D_WIN32_WINNT=0x603)
|
add_definitions(-D_WIN32_WINNT=0x603)
|
||||||
|
|
||||||
# First generate the manifest for tests since it will not need the dependency on the CRT.
|
# First generate the manifest for tests since it will not need the dependency on the CRT.
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/tests.exe.manifest @ONLY)
|
configure_file(
|
||||||
|
${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/tests.exe.manifest
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
# Always detect CRT paths, but only manually install with WITH_WINDOWS_BUNDLE_CRT.
|
# Always detect CRT paths, but only manually install with WITH_WINDOWS_BUNDLE_CRT.
|
||||||
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
||||||
|
@ -152,7 +156,11 @@ endif()
|
||||||
if(NOT WITH_PYTHON_MODULE)
|
if(NOT WITH_PYTHON_MODULE)
|
||||||
set(BUNDLECRT "${BUNDLECRT}<dependency><dependentAssembly><assemblyIdentity type=\"win32\" name=\"blender.shared\" version=\"1.0.0.0\" /></dependentAssembly></dependency>")
|
set(BUNDLECRT "${BUNDLECRT}<dependency><dependentAssembly><assemblyIdentity type=\"win32\" name=\"blender.shared\" version=\"1.0.0.0\" /></dependentAssembly></dependency>")
|
||||||
endif()
|
endif()
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/blender.exe.manifest @ONLY)
|
configure_file(
|
||||||
|
${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/blender.exe.manifest
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
remove_cc_flag(
|
remove_cc_flag(
|
||||||
"/MDd"
|
"/MDd"
|
||||||
|
@ -257,7 +265,7 @@ set(PLATFORM_LINKFLAGS_RELEASE "${PLATFORM_LINKFLAGS} ${PDB_INFO_OVERRIDE_LINKER
|
||||||
string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221")
|
string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221")
|
||||||
|
|
||||||
if(CMAKE_CL_64)
|
if(CMAKE_CL_64)
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:ARM64 ")
|
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:ARM64 ")
|
||||||
else()
|
else()
|
||||||
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ")
|
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ")
|
||||||
|
@ -270,7 +278,7 @@ if(NOT DEFINED LIBDIR)
|
||||||
# Setup 64bit and 64bit windows systems
|
# Setup 64bit and 64bit windows systems
|
||||||
if(CMAKE_CL_64)
|
if(CMAKE_CL_64)
|
||||||
message(STATUS "64 bit compiler detected.")
|
message(STATUS "64 bit compiler detected.")
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
set(LIBDIR_BASE "windows_arm64")
|
set(LIBDIR_BASE "windows_arm64")
|
||||||
else()
|
else()
|
||||||
set(LIBDIR_BASE "windows_x64")
|
set(LIBDIR_BASE "windows_x64")
|
||||||
|
@ -328,7 +336,10 @@ foreach(child ${children})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(WITH_PUGIXML)
|
if(WITH_PUGIXML)
|
||||||
set(PUGIXML_LIBRARIES optimized ${LIBDIR}/pugixml/lib/pugixml.lib debug ${LIBDIR}/pugixml/lib/pugixml_d.lib)
|
set(PUGIXML_LIBRARIES
|
||||||
|
optimized ${LIBDIR}/pugixml/lib/pugixml.lib
|
||||||
|
debug ${LIBDIR}/pugixml/lib/pugixml_d.lib
|
||||||
|
)
|
||||||
set(PUGIXML_INCLUDE_DIR ${LIBDIR}/pugixml/include)
|
set(PUGIXML_INCLUDE_DIR ${LIBDIR}/pugixml/include)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -386,7 +397,10 @@ if(WITH_HARFBUZZ)
|
||||||
windows_find_package(Harfbuzz)
|
windows_find_package(Harfbuzz)
|
||||||
if(NOT Harfbuzz_FOUND)
|
if(NOT Harfbuzz_FOUND)
|
||||||
set(LIBHARFBUZZ_INCLUDE_DIRS ${LIBDIR}/harfbuzz/include)
|
set(LIBHARFBUZZ_INCLUDE_DIRS ${LIBDIR}/harfbuzz/include)
|
||||||
set(LIBHARFBUZZ_LIBRARIES optimized ${LIBDIR}/harfbuzz/lib/libharfbuzz.lib debug ${LIBDIR}/harfbuzz/lib/libharfbuzz_d.lib)
|
set(LIBHARFBUZZ_LIBRARIES
|
||||||
|
optimized ${LIBDIR}/harfbuzz/lib/libharfbuzz.lib
|
||||||
|
debug ${LIBDIR}/harfbuzz/lib/libharfbuzz_d.lib
|
||||||
|
)
|
||||||
set(Harfbuzz_FOUND ON)
|
set(Harfbuzz_FOUND ON)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
@ -522,7 +536,11 @@ if(WITH_IMAGE_OPENEXR)
|
||||||
warn_hardcoded_paths(OpenEXR)
|
warn_hardcoded_paths(OpenEXR)
|
||||||
set(OPENEXR ${LIBDIR}/openexr)
|
set(OPENEXR ${LIBDIR}/openexr)
|
||||||
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
|
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
|
||||||
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${IMATH_INCLUDE_DIRS} ${OPENEXR_INCLUDE_DIR}/OpenEXR)
|
set(OPENEXR_INCLUDE_DIRS
|
||||||
|
${OPENEXR_INCLUDE_DIR}
|
||||||
|
${IMATH_INCLUDE_DIRS}
|
||||||
|
${OPENEXR_INCLUDE_DIR}/OpenEXR
|
||||||
|
)
|
||||||
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
|
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
|
||||||
# Check if the blender 3.3 lib static library eixts
|
# Check if the blender 3.3 lib static library eixts
|
||||||
# if not assume this is a 3.4+ dynamic version.
|
# if not assume this is a 3.4+ dynamic version.
|
||||||
|
@ -558,7 +576,10 @@ if(WITH_JACK)
|
||||||
${LIBDIR}/jack/include/jack
|
${LIBDIR}/jack/include/jack
|
||||||
${LIBDIR}/jack/include
|
${LIBDIR}/jack/include
|
||||||
)
|
)
|
||||||
set(JACK_LIBRARIES optimized ${LIBDIR}/jack/lib/libjack.lib debug ${LIBDIR}/jack/lib/libjack_d.lib)
|
set(JACK_LIBRARIES
|
||||||
|
optimized ${LIBDIR}/jack/lib/libjack.lib
|
||||||
|
debug ${LIBDIR}/jack/lib/libjack_d.lib
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(_PYTHON_VERSION "3.11")
|
set(_PYTHON_VERSION "3.11")
|
||||||
|
@ -592,7 +613,10 @@ if(WITH_PYTHON)
|
||||||
set(NUMPY_FOUND ON)
|
set(NUMPY_FOUND ON)
|
||||||
# uncached vars
|
# uncached vars
|
||||||
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
|
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
|
||||||
set(PYTHON_LIBRARIES debug "${PYTHON_LIBRARY_DEBUG}" optimized "${PYTHON_LIBRARY}" )
|
set(PYTHON_LIBRARIES
|
||||||
|
debug "${PYTHON_LIBRARY_DEBUG}"
|
||||||
|
optimized "${PYTHON_LIBRARY}"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT WITH_WINDOWS_FIND_MODULES)
|
if(NOT WITH_WINDOWS_FIND_MODULES)
|
||||||
|
@ -612,7 +636,7 @@ if(NOT WITH_WINDOWS_FIND_MODULES)
|
||||||
if(NOT BOOST_VERSION)
|
if(NOT BOOST_VERSION)
|
||||||
message(FATAL_ERROR "Unable to determine Boost version")
|
message(FATAL_ERROR "Unable to determine Boost version")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
set(BOOST_POSTFIX "vc143-mt-a64-${BOOST_VERSION}")
|
set(BOOST_POSTFIX "vc143-mt-a64-${BOOST_VERSION}")
|
||||||
set(BOOST_DEBUG_POSTFIX "vc143-mt-gyd-a64-${BOOST_VERSION}")
|
set(BOOST_DEBUG_POSTFIX "vc143-mt-gyd-a64-${BOOST_VERSION}")
|
||||||
set(BOOST_PREFIX "")
|
set(BOOST_PREFIX "")
|
||||||
|
@ -696,8 +720,14 @@ if(NOT OpenImageIO_FOUND)
|
||||||
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
||||||
set(OPENIMAGEIO_INCLUDE_DIR ${OPENIMAGEIO}/include)
|
set(OPENIMAGEIO_INCLUDE_DIR ${OPENIMAGEIO}/include)
|
||||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIR})
|
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIR})
|
||||||
set(OIIO_OPTIMIZED optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib)
|
set(OIIO_OPTIMIZED
|
||||||
set(OIIO_DEBUG debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib)
|
optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib
|
||||||
|
optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib
|
||||||
|
)
|
||||||
|
set(OIIO_DEBUG
|
||||||
|
debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib
|
||||||
|
debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib
|
||||||
|
)
|
||||||
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
||||||
set(OPENIMAGEIO_TOOL "${OPENIMAGEIO}/bin/oiiotool.exe")
|
set(OPENIMAGEIO_TOOL "${OPENIMAGEIO}/bin/oiiotool.exe")
|
||||||
endif()
|
endif()
|
||||||
|
@ -761,7 +791,10 @@ if(WITH_OPENVDB)
|
||||||
set(OPENVDB ${LIBDIR}/openVDB)
|
set(OPENVDB ${LIBDIR}/openVDB)
|
||||||
set(OPENVDB_LIBPATH ${OPENVDB}/lib)
|
set(OPENVDB_LIBPATH ${OPENVDB}/lib)
|
||||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
||||||
set(OPENVDB_LIBRARIES optimized ${OPENVDB_LIBPATH}/openvdb.lib debug ${OPENVDB_LIBPATH}/openvdb_d.lib )
|
set(OPENVDB_LIBRARIES
|
||||||
|
optimized ${OPENVDB_LIBPATH}/openvdb.lib
|
||||||
|
debug ${OPENVDB_LIBPATH}/openvdb_d.lib
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
|
set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
|
||||||
endif()
|
endif()
|
||||||
|
@ -785,7 +818,10 @@ if(WITH_OPENIMAGEDENOISE)
|
||||||
get_target_property(OPENIMAGEDENOISE_LIBRARIES_RELEASE OpenImageDenoise IMPORTED_IMPLIB_RELEASE)
|
get_target_property(OPENIMAGEDENOISE_LIBRARIES_RELEASE OpenImageDenoise IMPORTED_IMPLIB_RELEASE)
|
||||||
get_target_property(OPENIMAGEDENOISE_LIBRARIES_DEBUG OpenImageDenoise IMPORTED_IMPLIB_DEBUG)
|
get_target_property(OPENIMAGEDENOISE_LIBRARIES_DEBUG OpenImageDenoise IMPORTED_IMPLIB_DEBUG)
|
||||||
if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_DEBUG})
|
if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_DEBUG})
|
||||||
set(OPENIMAGEDENOISE_LIBRARIES optimized ${OPENIMAGEDENOISE_LIBRARIES_RELEASE} debug ${OPENIMAGEDENOISE_LIBRARIES_DEBUG})
|
set(OPENIMAGEDENOISE_LIBRARIES
|
||||||
|
optimized ${OPENIMAGEDENOISE_LIBRARIES_RELEASE}
|
||||||
|
debug ${OPENIMAGEDENOISE_LIBRARIES_DEBUG}
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_RELEASE})
|
if(EXISTS ${OPENIMAGEDENOISE_LIBRARIES_RELEASE})
|
||||||
set(OPENIMAGEDENOISE_LIBRARIES ${OPENIMAGEDENOISE_LIBRARIES_RELEASE})
|
set(OPENIMAGEDENOISE_LIBRARIES ${OPENIMAGEDENOISE_LIBRARIES_RELEASE})
|
||||||
|
@ -820,7 +856,10 @@ if(WITH_ALEMBIC)
|
||||||
set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include)
|
set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include)
|
||||||
set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
|
set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
|
||||||
set(ALEMBIC_LIBPATH ${ALEMBIC}/lib)
|
set(ALEMBIC_LIBPATH ${ALEMBIC}/lib)
|
||||||
set(ALEMBIC_LIBRARIES optimized ${ALEMBIC}/lib/Alembic.lib debug ${ALEMBIC}/lib/Alembic_d.lib)
|
set(ALEMBIC_LIBRARIES
|
||||||
|
optimized ${ALEMBIC}/lib/Alembic.lib
|
||||||
|
debug ${ALEMBIC}/lib/Alembic_d.lib
|
||||||
|
)
|
||||||
set(ALEMBIC_FOUND 1)
|
set(ALEMBIC_FOUND 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -870,11 +909,17 @@ endif()
|
||||||
if(WITH_TBB)
|
if(WITH_TBB)
|
||||||
windows_find_package(TBB)
|
windows_find_package(TBB)
|
||||||
if(NOT TBB_FOUND)
|
if(NOT TBB_FOUND)
|
||||||
set(TBB_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbb.lib debug ${LIBDIR}/tbb/lib/tbb_debug.lib)
|
set(TBB_LIBRARIES
|
||||||
|
optimized ${LIBDIR}/tbb/lib/tbb.lib
|
||||||
|
debug ${LIBDIR}/tbb/lib/tbb_debug.lib
|
||||||
|
)
|
||||||
set(TBB_INCLUDE_DIR ${LIBDIR}/tbb/include)
|
set(TBB_INCLUDE_DIR ${LIBDIR}/tbb/include)
|
||||||
set(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR})
|
set(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR})
|
||||||
if(WITH_TBB_MALLOC_PROXY)
|
if(WITH_TBB_MALLOC_PROXY)
|
||||||
set(TBB_MALLOC_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbbmalloc.lib debug ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib)
|
set(TBB_MALLOC_LIBRARIES
|
||||||
|
optimized ${LIBDIR}/tbb/lib/tbbmalloc.lib
|
||||||
|
debug ${LIBDIR}/tbb/lib/tbbmalloc_debug.lib
|
||||||
|
)
|
||||||
add_definitions(-DWITH_TBB_MALLOC)
|
add_definitions(-DWITH_TBB_MALLOC)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
@ -1126,9 +1171,15 @@ if(WITH_XR_OPENXR)
|
||||||
# support the transition between the old and new lib versions
|
# support the transition between the old and new lib versions
|
||||||
# this can be removed after the next lib update.
|
# this can be removed after the next lib update.
|
||||||
if(EXISTS ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib)
|
if(EXISTS ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib)
|
||||||
set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib)
|
set(XR_OPENXR_SDK_LIBRARIES
|
||||||
|
optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib
|
||||||
|
debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loader_d.lib
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
set(XR_OPENXR_SDK_LIBRARIES optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loaderd.lib)
|
set(XR_OPENXR_SDK_LIBRARIES
|
||||||
|
optimized ${XR_OPENXR_SDK_LIBPATH}/openxr_loader.lib
|
||||||
|
debug ${XR_OPENXR_SDK_LIBPATH}/openxr_loaderd.lib
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -1139,7 +1190,10 @@ if(WITH_GMP)
|
||||||
else()
|
else()
|
||||||
set(GMP_DLL_LIB_NAME libgmp-10.lib)
|
set(GMP_DLL_LIB_NAME libgmp-10.lib)
|
||||||
endif()
|
endif()
|
||||||
set(GMP_LIBRARIES ${LIBDIR}/gmp/lib/${GMP_DLL_LIB_NAME} optimized ${LIBDIR}/gmp/lib/libgmpxx.lib debug ${LIBDIR}/gmp/lib/libgmpxx_d.lib)
|
set(GMP_LIBRARIES ${LIBDIR}/gmp/lib/${GMP_DLL_LIB_NAME}
|
||||||
|
optimized ${LIBDIR}/gmp/lib/libgmpxx.lib
|
||||||
|
debug ${LIBDIR}/gmp/lib/libgmpxx_d.lib
|
||||||
|
)
|
||||||
set(GMP_ROOT_DIR ${LIBDIR}/gmp)
|
set(GMP_ROOT_DIR ${LIBDIR}/gmp)
|
||||||
set(GMP_FOUND ON)
|
set(GMP_FOUND ON)
|
||||||
endif()
|
endif()
|
||||||
|
@ -1193,7 +1247,10 @@ if(WITH_CYCLES AND WITH_CYCLES_PATH_GUIDING)
|
||||||
if(openpgl_FOUND)
|
if(openpgl_FOUND)
|
||||||
get_target_property(OPENPGL_LIBRARIES_RELEASE openpgl::openpgl LOCATION_RELEASE)
|
get_target_property(OPENPGL_LIBRARIES_RELEASE openpgl::openpgl LOCATION_RELEASE)
|
||||||
get_target_property(OPENPGL_LIBRARIES_DEBUG openpgl::openpgl LOCATION_DEBUG)
|
get_target_property(OPENPGL_LIBRARIES_DEBUG openpgl::openpgl LOCATION_DEBUG)
|
||||||
set(OPENPGL_LIBRARIES optimized ${OPENPGL_LIBRARIES_RELEASE} debug ${OPENPGL_LIBRARIES_DEBUG})
|
set(OPENPGL_LIBRARIES
|
||||||
|
optimized ${OPENPGL_LIBRARIES_RELEASE}
|
||||||
|
debug ${OPENPGL_LIBRARIES_DEBUG}
|
||||||
|
)
|
||||||
get_target_property(OPENPGL_INCLUDE_DIR openpgl::openpgl INTERFACE_INCLUDE_DIRECTORIES)
|
get_target_property(OPENPGL_INCLUDE_DIR openpgl::openpgl INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
else()
|
else()
|
||||||
set(WITH_CYCLES_PATH_GUIDING OFF)
|
set(WITH_CYCLES_PATH_GUIDING OFF)
|
||||||
|
@ -1232,7 +1289,10 @@ if(WITH_CYCLES AND (WITH_CYCLES_DEVICE_ONEAPI OR (WITH_CYCLES_EMBREE AND EMBREE_
|
||||||
list(APPEND PLATFORM_BUNDLED_LIBRARIES ${_sycl_runtime_libraries})
|
list(APPEND PLATFORM_BUNDLED_LIBRARIES ${_sycl_runtime_libraries})
|
||||||
unset(_sycl_runtime_libraries)
|
unset(_sycl_runtime_libraries)
|
||||||
|
|
||||||
set(SYCL_LIBRARIES optimized ${SYCL_LIBRARY} debug ${SYCL_LIBRARY_DEBUG})
|
set(SYCL_LIBRARIES
|
||||||
|
optimized ${SYCL_LIBRARY}
|
||||||
|
debug ${SYCL_LIBRARY_DEBUG}
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
@ -1240,6 +1300,7 @@ endif()
|
||||||
list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ";" _library_paths)
|
list(JOIN PLATFORM_BUNDLED_LIBRARY_DIRS ";" _library_paths)
|
||||||
set(PLATFORM_ENV_BUILD_DIRS "${LIBDIR}/epoxy/bin\;${LIBDIR}/tbb/bin\;${LIBDIR}/OpenImageIO/bin\;${LIBDIR}/boost/lib\;${LIBDIR}/openexr/bin\;${LIBDIR}/imath/bin\;${LIBDIR}/shaderc/bin\;${PATH}")
|
set(PLATFORM_ENV_BUILD_DIRS "${LIBDIR}/epoxy/bin\;${LIBDIR}/tbb/bin\;${LIBDIR}/OpenImageIO/bin\;${LIBDIR}/boost/lib\;${LIBDIR}/openexr/bin\;${LIBDIR}/imath/bin\;${LIBDIR}/shaderc/bin\;${PATH}")
|
||||||
set(PLATFORM_ENV_BUILD "PATH=${PLATFORM_ENV_BUILD_DIRS}")
|
set(PLATFORM_ENV_BUILD "PATH=${PLATFORM_ENV_BUILD_DIRS}")
|
||||||
# Install needs the additional folders from PLATFORM_ENV_BUILD_DIRS as well, as tools like idiff and abcls use the release mode dlls
|
# Install needs the additional folders from PLATFORM_ENV_BUILD_DIRS as well, as tools like:
|
||||||
|
# `idiff` and `abcls` use the release mode dlls.
|
||||||
set(PLATFORM_ENV_INSTALL "PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/blender.shared/\;${PLATFORM_ENV_BUILD_DIRS}\;$ENV{PATH}")
|
set(PLATFORM_ENV_INSTALL "PATH=${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/blender.shared/\;${PLATFORM_ENV_BUILD_DIRS}\;$ENV{PATH}")
|
||||||
unset(_library_paths)
|
unset(_library_paths)
|
||||||
|
|
|
@ -27,8 +27,8 @@ function(blender_test_set_envvars testname envvars_list)
|
||||||
if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
|
if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
|
||||||
if(WITH_COMPILER_ASAN)
|
if(WITH_COMPILER_ASAN)
|
||||||
set(_lsan_options "LSAN_OPTIONS=print_suppressions=false:suppressions=${CMAKE_SOURCE_DIR}/tools/config/analysis/lsan.supp")
|
set(_lsan_options "LSAN_OPTIONS=print_suppressions=false:suppressions=${CMAKE_SOURCE_DIR}/tools/config/analysis/lsan.supp")
|
||||||
# FIXME That `allocator_may_return_null=true` ASAN option is only needed for the `guardedalloc` test,
|
# FIXME: That `allocator_may_return_null=true` ASAN option is only needed for the
|
||||||
# would be nice to allow tests definition to pass extra envvars better.
|
# `guardedalloc` test, would be nice to allow tests definition to pass extra envvars better.
|
||||||
set(_asan_options "ASAN_OPTIONS=allocator_may_return_null=true")
|
set(_asan_options "ASAN_OPTIONS=allocator_may_return_null=true")
|
||||||
if(DEFINED ENV{LSAN_OPTIONS})
|
if(DEFINED ENV{LSAN_OPTIONS})
|
||||||
set(_lsan_options "${_lsan_options}:$ENV{LSAN_OPTIONS}")
|
set(_lsan_options "${_lsan_options}:$ENV{LSAN_OPTIONS}")
|
||||||
|
|
|
@ -95,7 +95,8 @@ elseif(WIN32 AND MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
# grained control and the speedup we get here is too big to ignore.
|
# grained control and the speedup we get here is too big to ignore.
|
||||||
set(CYCLES_KERNEL_FLAGS "/fp:fast -D_CRT_SECURE_NO_WARNINGS /GS-")
|
set(CYCLES_KERNEL_FLAGS "/fp:fast -D_CRT_SECURE_NO_WARNINGS /GS-")
|
||||||
|
|
||||||
# "jumptablerdata" improves performance when there is contention in large switch statements such as in svm.h
|
# "jumptablerdata" improves performance when there is contention in large switch statements
|
||||||
|
# such as in `svm.h`.
|
||||||
# This flag is supported starting with MSVC 17.7 preview 3:
|
# This flag is supported starting with MSVC 17.7 preview 3:
|
||||||
# https://learn.microsoft.com/en-us/cpp/build/reference/jump-table-rdata
|
# https://learn.microsoft.com/en-us/cpp/build/reference/jump-table-rdata
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.37.32820)
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.37.32820)
|
||||||
|
@ -149,7 +150,7 @@ elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
|
||||||
string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_KERNEL_FLAGS}")
|
string(APPEND CMAKE_CXX_FLAGS " ${CYCLES_KERNEL_FLAGS}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
elseif(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
elseif(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
||||||
check_cxx_compiler_flag(/QxSSE4.2 CXX_HAS_SSE42)
|
check_cxx_compiler_flag(/QxSSE4.2 CXX_HAS_SSE42)
|
||||||
check_cxx_compiler_flag(/arch:AVX CXX_HAS_AVX)
|
check_cxx_compiler_flag(/arch:AVX CXX_HAS_AVX)
|
||||||
check_cxx_compiler_flag(/QxCORE-AVX2 CXX_HAS_AVX2)
|
check_cxx_compiler_flag(/QxCORE-AVX2 CXX_HAS_AVX2)
|
||||||
|
@ -161,7 +162,7 @@ elseif(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
||||||
set(CYCLES_AVX2_KERNEL_FLAGS "/QxCORE-AVX2")
|
set(CYCLES_AVX2_KERNEL_FLAGS "/QxCORE-AVX2")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
||||||
check_cxx_compiler_flag(-xsse4.2 CXX_HAS_SSE42)
|
check_cxx_compiler_flag(-xsse4.2 CXX_HAS_SSE42)
|
||||||
check_cxx_compiler_flag(-xavx CXX_HAS_AVX)
|
check_cxx_compiler_flag(-xavx CXX_HAS_AVX)
|
||||||
check_cxx_compiler_flag(-xcore-avx2 CXX_HAS_AVX2)
|
check_cxx_compiler_flag(-xcore-avx2 CXX_HAS_AVX2)
|
||||||
|
|
|
@ -35,14 +35,22 @@ static const char *oidn_device_type_to_string(const OIDNDeviceType type)
|
||||||
return "DEFAULT";
|
return "DEFAULT";
|
||||||
case OIDN_DEVICE_TYPE_CPU:
|
case OIDN_DEVICE_TYPE_CPU:
|
||||||
return "CPU";
|
return "CPU";
|
||||||
|
|
||||||
|
/* The initial GPU support was added in OIDN 2.0. */
|
||||||
|
# if OIDN_VERSION_MAJOR >= 2
|
||||||
case OIDN_DEVICE_TYPE_SYCL:
|
case OIDN_DEVICE_TYPE_SYCL:
|
||||||
return "SYCL";
|
return "SYCL";
|
||||||
case OIDN_DEVICE_TYPE_CUDA:
|
case OIDN_DEVICE_TYPE_CUDA:
|
||||||
return "CUDA";
|
return "CUDA";
|
||||||
case OIDN_DEVICE_TYPE_HIP:
|
case OIDN_DEVICE_TYPE_HIP:
|
||||||
return "HIP";
|
return "HIP";
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* The Metal support was added in OIDN 2.2.*/
|
||||||
|
# if (OIDN_VERSION_MAJOR > 2) || ((OIDN_VERSION_MAJOR == 2) && (OIDN_VERSION_MINOR >= 2))
|
||||||
case OIDN_DEVICE_TYPE_METAL:
|
case OIDN_DEVICE_TYPE_METAL:
|
||||||
return "METAL";
|
return "METAL";
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1217,7 +1217,9 @@ typedef enum KernelBVHLayout {
|
||||||
} KernelBVHLayout;
|
} KernelBVHLayout;
|
||||||
|
|
||||||
/* Specialized struct that can become constants in dynamic compilation. */
|
/* Specialized struct that can become constants in dynamic compilation. */
|
||||||
#define KERNEL_STRUCT_BEGIN(name, parent) ccl_align(16) struct name {
|
#define KERNEL_STRUCT_BEGIN(name, parent) \
|
||||||
|
struct ccl_align(16) name \
|
||||||
|
{
|
||||||
#define KERNEL_STRUCT_END(name) \
|
#define KERNEL_STRUCT_END(name) \
|
||||||
} \
|
} \
|
||||||
; \
|
; \
|
||||||
|
@ -1259,7 +1261,8 @@ typedef struct KernelLightLinkSet {
|
||||||
uint light_tree_root;
|
uint light_tree_root;
|
||||||
} KernelLightLinkSet;
|
} KernelLightLinkSet;
|
||||||
|
|
||||||
typedef ccl_align(16) struct KernelData {
|
typedef struct ccl_align(16) KernelData
|
||||||
|
{
|
||||||
/* Features and limits. */
|
/* Features and limits. */
|
||||||
uint kernel_features;
|
uint kernel_features;
|
||||||
uint max_closures;
|
uint max_closures;
|
||||||
|
@ -1294,7 +1297,8 @@ typedef ccl_align(16) struct KernelData {
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
int pad2, pad3;
|
int pad2, pad3;
|
||||||
} KernelData;
|
}
|
||||||
|
KernelData;
|
||||||
static_assert_align(KernelData, 16);
|
static_assert_align(KernelData, 16);
|
||||||
|
|
||||||
/* Kernel data structures. */
|
/* Kernel data structures. */
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#include "GPU_immediate.h"
|
#include "GPU_immediate.h"
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "gpu_shader_create_info.hh"
|
#include "gpu_shader_create_info.hh"
|
||||||
|
|
||||||
|
|
|
@ -1434,10 +1434,7 @@ def brush_basic_gpencil_paint_settings(layout, context, brush, *, compact=False)
|
||||||
|
|
||||||
|
|
||||||
def brush_basic_grease_pencil_paint_settings(layout, context, brush, *, compact=False):
|
def brush_basic_grease_pencil_paint_settings(layout, context, brush, *, compact=False):
|
||||||
tool_settings = context.tool_settings
|
|
||||||
settings = tool_settings.gpencil_paint
|
|
||||||
gp_settings = brush.gpencil_settings
|
gp_settings = brush.gpencil_settings
|
||||||
tool = context.workspace.tools.from_space_view3d_mode(context.mode, create=False)
|
|
||||||
if gp_settings is None:
|
if gp_settings is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -330,7 +330,6 @@ class VIEWLAYER_PT_filter(ViewLayerButtonsPanel, Panel):
|
||||||
layout.use_property_decorate = False
|
layout.use_property_decorate = False
|
||||||
|
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
rd = scene.render
|
|
||||||
view_layer = context.view_layer
|
view_layer = context.view_layer
|
||||||
|
|
||||||
col = layout.column(heading="Include")
|
col = layout.column(heading="Include")
|
||||||
|
|
|
@ -17,8 +17,6 @@ class NLA_HT_header(Header):
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
st = context.space_data
|
|
||||||
|
|
||||||
layout.template_header()
|
layout.template_header()
|
||||||
|
|
||||||
NLA_MT_editor_menus.draw_collapsible(context, layout)
|
NLA_MT_editor_menus.draw_collapsible(context, layout)
|
||||||
|
|
|
@ -2669,7 +2669,7 @@ class SEQUENCER_PT_modifiers(SequencerButtonsPanel, Panel):
|
||||||
col.prop(mod, "gamma")
|
col.prop(mod, "gamma")
|
||||||
else:
|
else:
|
||||||
if mod.type == 'SOUND_EQUALIZER':
|
if mod.type == 'SOUND_EQUALIZER':
|
||||||
eq_row = box.row()
|
# eq_row = box.row()
|
||||||
# eq_graphs = eq_row.operator_menu_enum("sequencer.strip_modifier_equalizer_redefine", "graphs")
|
# eq_graphs = eq_row.operator_menu_enum("sequencer.strip_modifier_equalizer_redefine", "graphs")
|
||||||
# eq_graphs.name = mod.name
|
# eq_graphs.name = mod.name
|
||||||
flow = box.grid_flow(
|
flow = box.grid_flow(
|
||||||
|
|
|
@ -2664,7 +2664,6 @@ class VIEW3D_PT_tools_grease_pencil_v3_brush_mix_palette(View3DPanel, Panel):
|
||||||
layout.use_property_decorate = False
|
layout.use_property_decorate = False
|
||||||
tool_settings = context.tool_settings
|
tool_settings = context.tool_settings
|
||||||
settings = tool_settings.gpencil_paint
|
settings = tool_settings.gpencil_paint
|
||||||
brush = settings.brush
|
|
||||||
|
|
||||||
col = layout.column()
|
col = layout.column()
|
||||||
col.enabled = settings.color_mode == 'VERTEXCOLOR'
|
col.enabled = settings.color_mode == 'VERTEXCOLOR'
|
||||||
|
|
|
@ -0,0 +1,297 @@
|
||||||
|
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup animrig
|
||||||
|
*
|
||||||
|
* \brief Animation data-block functionality.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ANIM_fcurve.hh"
|
||||||
|
|
||||||
|
#include "DNA_anim_types.h"
|
||||||
|
|
||||||
|
#include "BLI_math_vector.hh"
|
||||||
|
#include "BLI_set.hh"
|
||||||
|
#include "BLI_string_ref.hh"
|
||||||
|
|
||||||
|
struct AnimationEvalContext;
|
||||||
|
struct FCurve;
|
||||||
|
struct ID;
|
||||||
|
struct Main;
|
||||||
|
struct PointerRNA;
|
||||||
|
|
||||||
|
namespace blender::animrig {
|
||||||
|
|
||||||
|
/* Forward declarations for the types defined later in this file. */
|
||||||
|
class Layer;
|
||||||
|
class Strip;
|
||||||
|
class Binding;
|
||||||
|
|
||||||
|
/* Use an alias for the Binding handle type to help disambiguate function parameters. */
|
||||||
|
using binding_handle_t = decltype(::AnimationBinding::handle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container of animation data for one or more animated IDs.
|
||||||
|
*
|
||||||
|
* Broadly an Animation consists of Layers, each Layer has Strips, and it's the
|
||||||
|
* Strips that eventually contain the animation data.
|
||||||
|
*
|
||||||
|
* Temporary limitation: each Animation can only contain one Layer.
|
||||||
|
*
|
||||||
|
* Which sub-set of that data drives the animation of which ID is determined by
|
||||||
|
* which Binding is associated with that ID.
|
||||||
|
*
|
||||||
|
* \see AnimData::animation
|
||||||
|
* \see AnimData::binding_handle
|
||||||
|
*/
|
||||||
|
class Animation : public ::Animation {
|
||||||
|
public:
|
||||||
|
Animation() = default;
|
||||||
|
/**
|
||||||
|
* Copy constructor is deleted, as code should use regular ID library
|
||||||
|
* management functions to duplicate this data-block.
|
||||||
|
*/
|
||||||
|
Animation(const Animation &other) = delete;
|
||||||
|
|
||||||
|
/* Animation Layers access. */
|
||||||
|
blender::Span<const Layer *> layers() const;
|
||||||
|
blender::MutableSpan<Layer *> layers();
|
||||||
|
const Layer *layer(int64_t index) const;
|
||||||
|
Layer *layer(int64_t index);
|
||||||
|
|
||||||
|
/* Animation Binding access. */
|
||||||
|
blender::Span<const Binding *> bindings() const;
|
||||||
|
blender::MutableSpan<Binding *> bindings();
|
||||||
|
const Binding *binding(int64_t index) const;
|
||||||
|
Binding *binding(int64_t index);
|
||||||
|
|
||||||
|
/** Free all data in the `Animation`. Doesn't delete the `Animation` itself. */
|
||||||
|
void free_data();
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Animation) == sizeof(::Animation),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strips contain the actual animation data.
|
||||||
|
*
|
||||||
|
* Although the data model allows for different strip types, currently only a
|
||||||
|
* single type is implemented: keyframe strips.
|
||||||
|
*/
|
||||||
|
class Strip : public ::AnimationStrip {
|
||||||
|
public:
|
||||||
|
Strip() = default;
|
||||||
|
/**
|
||||||
|
* Strip cannot be duplicated via the copy constructor. Either use a concrete
|
||||||
|
* strip type's copy constructor, or use Strip::duplicate().
|
||||||
|
*
|
||||||
|
* The reason why the copy constructor won't work is due to the double nature
|
||||||
|
* of the inheritance at play here:
|
||||||
|
*
|
||||||
|
* C-style inheritance: `KeyframeAnimationStrip` "inherits" `AnimationStrip"
|
||||||
|
* by embedding the latter. This means that any `KeyframeAnimationStrip *`
|
||||||
|
* can be reinterpreted as `AnimationStrip *`.
|
||||||
|
*
|
||||||
|
* C++-style inheritance: the C++ wrappers inherit the DNA structs, so
|
||||||
|
* `animrig::Strip` inherits `::AnimationStrip`, and
|
||||||
|
* `animrig::KeyframeStrip` inherits `::KeyframeAnimationStrip`.
|
||||||
|
*/
|
||||||
|
Strip(const Strip &other) = delete;
|
||||||
|
~Strip();
|
||||||
|
|
||||||
|
Strip *duplicate(StringRefNull allocation_name) const;
|
||||||
|
|
||||||
|
enum class Type : int8_t { Keyframe = 0 };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip type, so it's known which subclass this can be wrapped in without
|
||||||
|
* having to rely on C++ RTTI.
|
||||||
|
*/
|
||||||
|
Type type() const
|
||||||
|
{
|
||||||
|
return Type(this->strip_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> bool is() const;
|
||||||
|
template<typename T> T &as();
|
||||||
|
template<typename T> const T &as() const;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Strip) == sizeof(::AnimationStrip),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Layers can be stacked on top of each other to define the animation. Each
|
||||||
|
* layer has a mix mode and an influence (0-1), which define how it is mixed
|
||||||
|
* with the layers below it.
|
||||||
|
*
|
||||||
|
* Layers contain one or more Strips, which in turn contain the animation data
|
||||||
|
* itself.
|
||||||
|
*
|
||||||
|
* Temporary limitation: at most one strip may exist on a layer, and it extends
|
||||||
|
* from negative to positive infinity.
|
||||||
|
*/
|
||||||
|
class Layer : public ::AnimationLayer {
|
||||||
|
public:
|
||||||
|
Layer() = default;
|
||||||
|
Layer(const Layer &other);
|
||||||
|
~Layer();
|
||||||
|
|
||||||
|
enum class Flags : uint8_t {
|
||||||
|
/* Set by default, cleared to mute. */
|
||||||
|
Enabled = (1 << 0),
|
||||||
|
/* When adding/removing a flag, also update the ENUM_OPERATORS() invocation below. */
|
||||||
|
};
|
||||||
|
|
||||||
|
Flags flags() const
|
||||||
|
{
|
||||||
|
return static_cast<Flags>(this->layer_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class MixMode : int8_t {
|
||||||
|
/** Channels in this layer override the same channels from underlying layers. */
|
||||||
|
Replace = 0,
|
||||||
|
/** Channels in this layer are added to underlying layers as sequential operations. */
|
||||||
|
Offset = 1,
|
||||||
|
/** Channels in this layer are added to underlying layers on a per-channel basis. */
|
||||||
|
Add = 2,
|
||||||
|
/** Channels in this layer are subtracted to underlying layers on a per-channel basis. */
|
||||||
|
Subtract = 3,
|
||||||
|
/** Channels in this layer are multiplied with underlying layers on a per-channel basis. */
|
||||||
|
Multiply = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
MixMode mix_mode() const
|
||||||
|
{
|
||||||
|
return static_cast<MixMode>(this->layer_mix_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip access. */
|
||||||
|
blender::Span<const Strip *> strips() const;
|
||||||
|
blender::MutableSpan<Strip *> strips();
|
||||||
|
const Strip *strip(int64_t index) const;
|
||||||
|
Strip *strip(int64_t index);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Layer) == sizeof(::AnimationLayer),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
ENUM_OPERATORS(Layer::Flags, Layer::Flags::Enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifier for a sub-set of the animation data inside an Animation data-block.
|
||||||
|
*
|
||||||
|
* An animatable ID specifies both an `Animation*` and an `AnimationBinding::handle`
|
||||||
|
* to identify which F-Curves (and in the future other animation data) it will
|
||||||
|
* be animated by.
|
||||||
|
*
|
||||||
|
* This is called an 'binding' because it acts like an binding socket of the
|
||||||
|
* Animation data-block, into which an animatable ID can be noodled.
|
||||||
|
*
|
||||||
|
* \see AnimData::binding_handle
|
||||||
|
*/
|
||||||
|
class Binding : public ::AnimationBinding {
|
||||||
|
public:
|
||||||
|
Binding() = default;
|
||||||
|
Binding(const Binding &other) = default;
|
||||||
|
~Binding() = default;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Binding) == sizeof(::AnimationBinding),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KeyframeStrips effectively contain a bag of F-Curves for each Binding.
|
||||||
|
*/
|
||||||
|
class KeyframeStrip : public ::KeyframeAnimationStrip {
|
||||||
|
public:
|
||||||
|
KeyframeStrip() = default;
|
||||||
|
KeyframeStrip(const KeyframeStrip &other);
|
||||||
|
~KeyframeStrip();
|
||||||
|
|
||||||
|
/* ChannelBag array access. */
|
||||||
|
blender::Span<const ChannelBag *> channelbags() const;
|
||||||
|
blender::MutableSpan<ChannelBag *> channelbags();
|
||||||
|
const ChannelBag *channelbag(int64_t index) const;
|
||||||
|
ChannelBag *channelbag(int64_t index);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(KeyframeStrip) == sizeof(::KeyframeAnimationStrip),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
template<> KeyframeStrip &Strip::as<KeyframeStrip>();
|
||||||
|
template<> const KeyframeStrip &Strip::as<KeyframeStrip>() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of F-Curves, intended for a specific Binding handle.
|
||||||
|
*/
|
||||||
|
class ChannelBag : public ::AnimationChannelBag {
|
||||||
|
public:
|
||||||
|
ChannelBag() = default;
|
||||||
|
ChannelBag(const ChannelBag &other);
|
||||||
|
~ChannelBag();
|
||||||
|
|
||||||
|
/* FCurves access. */
|
||||||
|
blender::Span<const FCurve *> fcurves() const;
|
||||||
|
blender::MutableSpan<FCurve *> fcurves();
|
||||||
|
const FCurve *fcurve(int64_t index) const;
|
||||||
|
FCurve *fcurve(int64_t index);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(ChannelBag) == sizeof(::AnimationChannelBag),
|
||||||
|
"DNA struct and its C++ wrapper must have the same size");
|
||||||
|
|
||||||
|
} // namespace blender::animrig
|
||||||
|
|
||||||
|
/* Wrap functions for the DNA structs. */
|
||||||
|
|
||||||
|
inline blender::animrig::Animation &Animation::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::Animation *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::Animation &Animation::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::Animation *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline blender::animrig::Layer &AnimationLayer::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::Layer *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::Layer &AnimationLayer::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::Layer *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline blender::animrig::Binding &AnimationBinding::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::Binding *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::Binding &AnimationBinding::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::Binding *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline blender::animrig::Strip &AnimationStrip::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::Strip *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::Strip &AnimationStrip::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::Strip *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline blender::animrig::KeyframeStrip &KeyframeAnimationStrip::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::KeyframeStrip *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::KeyframeStrip &KeyframeAnimationStrip::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::KeyframeStrip *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline blender::animrig::ChannelBag &AnimationChannelBag::wrap()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<blender::animrig::ChannelBag *>(this);
|
||||||
|
}
|
||||||
|
inline const blender::animrig::ChannelBag &AnimationChannelBag::wrap() const
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const blender::animrig::ChannelBag *>(this);
|
||||||
|
}
|
|
@ -21,6 +21,7 @@ set(INC_SYS
|
||||||
set(SRC
|
set(SRC
|
||||||
intern/action.cc
|
intern/action.cc
|
||||||
intern/anim_rna.cc
|
intern/anim_rna.cc
|
||||||
|
intern/animation.cc
|
||||||
intern/animdata.cc
|
intern/animdata.cc
|
||||||
intern/bone_collections.cc
|
intern/bone_collections.cc
|
||||||
intern/bonecolor.cc
|
intern/bonecolor.cc
|
||||||
|
@ -31,6 +32,7 @@ set(SRC
|
||||||
intern/visualkey.cc
|
intern/visualkey.cc
|
||||||
|
|
||||||
ANIM_action.hh
|
ANIM_action.hh
|
||||||
|
ANIM_animation.hh
|
||||||
ANIM_animdata.hh
|
ANIM_animdata.hh
|
||||||
ANIM_armature_iter.hh
|
ANIM_armature_iter.hh
|
||||||
ANIM_bone_collections.hh
|
ANIM_bone_collections.hh
|
||||||
|
@ -50,6 +52,7 @@ set(LIB
|
||||||
bf::dna
|
bf::dna
|
||||||
PRIVATE bf_editor_interface
|
PRIVATE bf_editor_interface
|
||||||
PRIVATE bf::intern::guardedalloc
|
PRIVATE bf::intern::guardedalloc
|
||||||
|
PRIVATE bf::intern::atomic
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,260 @@
|
||||||
|
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
#include "DNA_anim_defaults.h"
|
||||||
|
#include "DNA_anim_types.h"
|
||||||
|
#include "DNA_defaults.h"
|
||||||
|
|
||||||
|
#include "BLI_listbase.h"
|
||||||
|
#include "BLI_listbase_wrapper.hh"
|
||||||
|
#include "BLI_math_base.h"
|
||||||
|
#include "BLI_string.h"
|
||||||
|
#include "BLI_string_utf8.h"
|
||||||
|
#include "BLI_string_utils.hh"
|
||||||
|
|
||||||
|
#include "BKE_anim_data.hh"
|
||||||
|
#include "BKE_animation.hh"
|
||||||
|
#include "BKE_fcurve.hh"
|
||||||
|
#include "BKE_lib_id.hh"
|
||||||
|
#include "BKE_main.hh"
|
||||||
|
|
||||||
|
#include "ED_keyframing.hh"
|
||||||
|
|
||||||
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
|
#include "atomic_ops.h"
|
||||||
|
|
||||||
|
#include "ANIM_animation.hh"
|
||||||
|
#include "ANIM_fcurve.hh"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace blender::animrig {
|
||||||
|
|
||||||
|
/* ----- Animation implementation ----------- */
|
||||||
|
|
||||||
|
blender::Span<const Layer *> Animation::layers() const
|
||||||
|
{
|
||||||
|
return blender::Span<Layer *>{reinterpret_cast<Layer **>(this->layer_array),
|
||||||
|
this->layer_array_num};
|
||||||
|
}
|
||||||
|
blender::MutableSpan<Layer *> Animation::layers()
|
||||||
|
{
|
||||||
|
return blender::MutableSpan<Layer *>{reinterpret_cast<Layer **>(this->layer_array),
|
||||||
|
this->layer_array_num};
|
||||||
|
}
|
||||||
|
const Layer *Animation::layer(const int64_t index) const
|
||||||
|
{
|
||||||
|
return &this->layer_array[index]->wrap();
|
||||||
|
}
|
||||||
|
Layer *Animation::layer(const int64_t index)
|
||||||
|
{
|
||||||
|
return &this->layer_array[index]->wrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
blender::Span<const Binding *> Animation::bindings() const
|
||||||
|
{
|
||||||
|
return blender::Span<Binding *>{reinterpret_cast<Binding **>(this->binding_array),
|
||||||
|
this->binding_array_num};
|
||||||
|
}
|
||||||
|
blender::MutableSpan<Binding *> Animation::bindings()
|
||||||
|
{
|
||||||
|
return blender::MutableSpan<Binding *>{reinterpret_cast<Binding **>(this->binding_array),
|
||||||
|
this->binding_array_num};
|
||||||
|
}
|
||||||
|
const Binding *Animation::binding(const int64_t index) const
|
||||||
|
{
|
||||||
|
return &this->binding_array[index]->wrap();
|
||||||
|
}
|
||||||
|
Binding *Animation::binding(const int64_t index)
|
||||||
|
{
|
||||||
|
return &this->binding_array[index]->wrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Animation::free_data()
|
||||||
|
{
|
||||||
|
/* Free layers. */
|
||||||
|
for (Layer *layer : this->layers()) {
|
||||||
|
MEM_delete(layer);
|
||||||
|
}
|
||||||
|
MEM_SAFE_FREE(this->layer_array);
|
||||||
|
this->layer_array_num = 0;
|
||||||
|
|
||||||
|
/* Free bindings. */
|
||||||
|
for (Binding *binding : this->bindings()) {
|
||||||
|
MEM_delete(binding);
|
||||||
|
}
|
||||||
|
MEM_SAFE_FREE(this->binding_array);
|
||||||
|
this->binding_array_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----- AnimationLayer implementation ----------- */
|
||||||
|
|
||||||
|
Layer::Layer(const Layer &other)
|
||||||
|
{
|
||||||
|
memcpy(this, &other, sizeof(*this));
|
||||||
|
|
||||||
|
/* Strips. */
|
||||||
|
this->strip_array = MEM_cnew_array<AnimationStrip *>(other.strip_array_num, __func__);
|
||||||
|
for (int i : other.strips().index_range()) {
|
||||||
|
this->strip_array[i] = other.strip(i)->duplicate(__func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Layer::~Layer()
|
||||||
|
{
|
||||||
|
for (Strip *strip : this->strips()) {
|
||||||
|
MEM_delete(strip);
|
||||||
|
}
|
||||||
|
MEM_SAFE_FREE(this->strip_array);
|
||||||
|
this->strip_array_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
blender::Span<const Strip *> Layer::strips() const
|
||||||
|
{
|
||||||
|
return blender::Span<Strip *>{reinterpret_cast<Strip **>(this->strip_array),
|
||||||
|
this->strip_array_num};
|
||||||
|
}
|
||||||
|
blender::MutableSpan<Strip *> Layer::strips()
|
||||||
|
{
|
||||||
|
return blender::MutableSpan<Strip *>{reinterpret_cast<Strip **>(this->strip_array),
|
||||||
|
this->strip_array_num};
|
||||||
|
}
|
||||||
|
const Strip *Layer::strip(const int64_t index) const
|
||||||
|
{
|
||||||
|
return &this->strip_array[index]->wrap();
|
||||||
|
}
|
||||||
|
Strip *Layer::strip(const int64_t index)
|
||||||
|
{
|
||||||
|
return &this->strip_array[index]->wrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----- AnimationBinding implementation ----------- */
|
||||||
|
|
||||||
|
/* ----- AnimationStrip implementation ----------- */
|
||||||
|
|
||||||
|
Strip *Strip::duplicate(const StringRefNull allocation_name) const
|
||||||
|
{
|
||||||
|
switch (this->type()) {
|
||||||
|
case Type::Keyframe: {
|
||||||
|
const KeyframeStrip &source = this->as<KeyframeStrip>();
|
||||||
|
KeyframeStrip *copy = MEM_new<KeyframeStrip>(allocation_name.c_str(), source);
|
||||||
|
return ©->strip.wrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BLI_assert_unreachable();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Strip::~Strip()
|
||||||
|
{
|
||||||
|
switch (this->type()) {
|
||||||
|
case Type::Keyframe:
|
||||||
|
this->as<KeyframeStrip>().~KeyframeStrip();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BLI_assert_unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----- KeyframeAnimationStrip implementation ----------- */
|
||||||
|
|
||||||
|
KeyframeStrip::KeyframeStrip(const KeyframeStrip &other)
|
||||||
|
{
|
||||||
|
memcpy(this, &other, sizeof(*this));
|
||||||
|
|
||||||
|
this->channelbags_array = MEM_cnew_array<AnimationChannelBag *>(other.channelbags_array_num,
|
||||||
|
__func__);
|
||||||
|
Span<const ChannelBag *> channelbags_src = other.channelbags();
|
||||||
|
for (int i : channelbags_src.index_range()) {
|
||||||
|
this->channelbags_array[i] = MEM_new<animrig::ChannelBag>(__func__, *other.channelbag(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyframeStrip::~KeyframeStrip()
|
||||||
|
{
|
||||||
|
for (ChannelBag *channelbag_for_binding : this->channelbags()) {
|
||||||
|
MEM_delete(channelbag_for_binding);
|
||||||
|
}
|
||||||
|
MEM_SAFE_FREE(this->channelbags_array);
|
||||||
|
this->channelbags_array_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> bool Strip::is<KeyframeStrip>() const
|
||||||
|
{
|
||||||
|
return this->type() == Type::Keyframe;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> KeyframeStrip &Strip::as<KeyframeStrip>()
|
||||||
|
{
|
||||||
|
BLI_assert_msg(this->is<KeyframeStrip>(), "Strip is not a KeyframeStrip");
|
||||||
|
return *reinterpret_cast<KeyframeStrip *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> const KeyframeStrip &Strip::as<KeyframeStrip>() const
|
||||||
|
{
|
||||||
|
BLI_assert_msg(this->is<KeyframeStrip>(), "Strip is not a KeyframeStrip");
|
||||||
|
return *reinterpret_cast<const KeyframeStrip *>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
blender::Span<const ChannelBag *> KeyframeStrip::channelbags() const
|
||||||
|
{
|
||||||
|
return blender::Span<ChannelBag *>{reinterpret_cast<ChannelBag **>(this->channelbags_array),
|
||||||
|
this->channelbags_array_num};
|
||||||
|
}
|
||||||
|
blender::MutableSpan<ChannelBag *> KeyframeStrip::channelbags()
|
||||||
|
{
|
||||||
|
return blender::MutableSpan<ChannelBag *>{
|
||||||
|
reinterpret_cast<ChannelBag **>(this->channelbags_array), this->channelbags_array_num};
|
||||||
|
}
|
||||||
|
const ChannelBag *KeyframeStrip::channelbag(const int64_t index) const
|
||||||
|
{
|
||||||
|
return &this->channelbags_array[index]->wrap();
|
||||||
|
}
|
||||||
|
ChannelBag *KeyframeStrip::channelbag(const int64_t index)
|
||||||
|
{
|
||||||
|
return &this->channelbags_array[index]->wrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* AnimationChannelBag implementation. */
|
||||||
|
|
||||||
|
ChannelBag::ChannelBag(const ChannelBag &other)
|
||||||
|
{
|
||||||
|
this->binding_handle = other.binding_handle;
|
||||||
|
this->fcurve_array_num = other.fcurve_array_num;
|
||||||
|
|
||||||
|
this->fcurve_array = MEM_cnew_array<FCurve *>(other.fcurve_array_num, __func__);
|
||||||
|
for (int i = 0; i < other.fcurve_array_num; i++) {
|
||||||
|
const FCurve *fcu_src = other.fcurve_array[i];
|
||||||
|
this->fcurve_array[i] = BKE_fcurve_copy(fcu_src);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ChannelBag::~ChannelBag()
|
||||||
|
{
|
||||||
|
for (FCurve *fcu : this->fcurves()) {
|
||||||
|
BKE_fcurve_free(fcu);
|
||||||
|
}
|
||||||
|
MEM_SAFE_FREE(this->fcurve_array);
|
||||||
|
this->fcurve_array_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
blender::Span<const FCurve *> ChannelBag::fcurves() const
|
||||||
|
{
|
||||||
|
return blender::Span<FCurve *>{this->fcurve_array, this->fcurve_array_num};
|
||||||
|
}
|
||||||
|
blender::MutableSpan<FCurve *> ChannelBag::fcurves()
|
||||||
|
{
|
||||||
|
return blender::MutableSpan<FCurve *>{this->fcurve_array, this->fcurve_array_num};
|
||||||
|
}
|
||||||
|
const FCurve *ChannelBag::fcurve(const int64_t index) const
|
||||||
|
{
|
||||||
|
return this->fcurve_array[index];
|
||||||
|
}
|
||||||
|
FCurve *ChannelBag::fcurve(const int64_t index)
|
||||||
|
{
|
||||||
|
return this->fcurve_array[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::animrig
|
|
@ -43,20 +43,24 @@ class RuntimeAssetLibrary;
|
||||||
class AssetLibraryService {
|
class AssetLibraryService {
|
||||||
static std::unique_ptr<AssetLibraryService> instance_;
|
static std::unique_ptr<AssetLibraryService> instance_;
|
||||||
|
|
||||||
/** Identify libraries with the library type, and the absolute path of the library's root path
|
/**
|
||||||
|
* Identify libraries with the library type, and the absolute path of the library's root path
|
||||||
* (normalize with #normalize_directory_path()!). The type is relevant since the current file
|
* (normalize with #normalize_directory_path()!). The type is relevant since the current file
|
||||||
* library may point to the same path as a custom library. */
|
* library may point to the same path as a custom library.
|
||||||
|
*/
|
||||||
using OnDiskLibraryIdentifier = std::pair<eAssetLibraryType, std::string>;
|
using OnDiskLibraryIdentifier = std::pair<eAssetLibraryType, std::string>;
|
||||||
/* Mapping of a (type, root path) pair to the AssetLibrary instance. */
|
/** Mapping of a (type, root path) pair to the AssetLibrary instance. */
|
||||||
Map<OnDiskLibraryIdentifier, std::unique_ptr<OnDiskAssetLibrary>> on_disk_libraries_;
|
Map<OnDiskLibraryIdentifier, std::unique_ptr<OnDiskAssetLibrary>> on_disk_libraries_;
|
||||||
/** Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If
|
/**
|
||||||
|
* Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If
|
||||||
* the file was saved, a valid path for the library can be determined and #on_disk_libraries_
|
* the file was saved, a valid path for the library can be determined and #on_disk_libraries_
|
||||||
* above should be used. */
|
* above should be used.
|
||||||
|
*/
|
||||||
std::unique_ptr<RuntimeAssetLibrary> current_file_library_;
|
std::unique_ptr<RuntimeAssetLibrary> current_file_library_;
|
||||||
/** The "all" asset library, merging all other libraries into one. */
|
/** The "all" asset library, merging all other libraries into one. */
|
||||||
std::unique_ptr<AllAssetLibrary> all_library_;
|
std::unique_ptr<AllAssetLibrary> all_library_;
|
||||||
|
|
||||||
/* Handlers for managing the life cycle of the AssetLibraryService instance. */
|
/** Handlers for managing the life cycle of the AssetLibraryService instance. */
|
||||||
bCallbackFuncStore on_load_callback_store_;
|
bCallbackFuncStore on_load_callback_store_;
|
||||||
static bool atexit_handler_registered_;
|
static bool atexit_handler_registered_;
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ bool AssetStorage::remove_asset(AssetRepresentation &asset)
|
||||||
|
|
||||||
void AssetStorage::remap_ids_and_remove_invalid(const blender::bke::id::IDRemapper &mappings)
|
void AssetStorage::remap_ids_and_remove_invalid(const blender::bke::id::IDRemapper &mappings)
|
||||||
{
|
{
|
||||||
Set<AssetRepresentation *> removed_assets{};
|
Set<AssetRepresentation *> removed_assets;
|
||||||
|
|
||||||
for (auto &asset_ptr : local_id_assets_) {
|
for (auto &asset_ptr : local_id_assets_) {
|
||||||
AssetRepresentation &asset = *asset_ptr;
|
AssetRepresentation &asset = *asset_ptr;
|
||||||
|
|
|
@ -49,7 +49,7 @@ static blender::Vector<uint8_t> filtered_rows_from_thumb(const Thumbnail *thumb)
|
||||||
/* In the image data sent to the compression step, each scan-line is preceded by a filter type
|
/* In the image data sent to the compression step, each scan-line is preceded by a filter type
|
||||||
* byte containing the numeric code of the filter algorithm used for that scan-line. */
|
* byte containing the numeric code of the filter algorithm used for that scan-line. */
|
||||||
const size_t line_size = thumb->width * 4;
|
const size_t line_size = thumb->width * 4;
|
||||||
blender::Vector<uint8_t> filtered{};
|
blender::Vector<uint8_t> filtered;
|
||||||
size_t final_size = thumb->height * (line_size + 1);
|
size_t final_size = thumb->height * (line_size + 1);
|
||||||
filtered.reserve(final_size);
|
filtered.reserve(final_size);
|
||||||
for (int i = 0; i < thumb->height; i++) {
|
for (int i = 0; i < thumb->height; i++) {
|
||||||
|
@ -88,7 +88,7 @@ std::optional<blender::Vector<uint8_t>> blendthumb_create_png_data_from_thumb(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create `IDAT` chunk data. */
|
/* Create `IDAT` chunk data. */
|
||||||
blender::Vector<uint8_t> image_data{};
|
blender::Vector<uint8_t> image_data;
|
||||||
{
|
{
|
||||||
auto image_data_opt = zlib_compress(filtered_rows_from_thumb(thumb));
|
auto image_data_opt = zlib_compress(filtered_rows_from_thumb(thumb));
|
||||||
if (image_data_opt == std::nullopt) {
|
if (image_data_opt == std::nullopt) {
|
||||||
|
@ -98,7 +98,7 @@ std::optional<blender::Vector<uint8_t>> blendthumb_create_png_data_from_thumb(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the IHDR chunk data. */
|
/* Create the IHDR chunk data. */
|
||||||
blender::Vector<uint8_t> ihdr_data{};
|
blender::Vector<uint8_t> ihdr_data;
|
||||||
{
|
{
|
||||||
const size_t ihdr_data_final_size = 4 + 4 + 5;
|
const size_t ihdr_data_final_size = 4 + 4 + 5;
|
||||||
ihdr_data.reserve(ihdr_data_final_size);
|
ihdr_data.reserve(ihdr_data_final_size);
|
||||||
|
@ -115,7 +115,7 @@ std::optional<blender::Vector<uint8_t>> blendthumb_create_png_data_from_thumb(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Join it all together to create a PNG image. */
|
/* Join it all together to create a PNG image. */
|
||||||
blender::Vector<uint8_t> png_buf{};
|
blender::Vector<uint8_t> png_buf;
|
||||||
{
|
{
|
||||||
const size_t png_buf_final_size = (
|
const size_t png_buf_final_size = (
|
||||||
/* Header. */
|
/* Header. */
|
||||||
|
|
|
@ -88,11 +88,11 @@ void BKE_animdata_foreach_id(AnimData *adt, LibraryForeachIDData *data);
|
||||||
/**
|
/**
|
||||||
* Make a copy of the given AnimData - to be used when copying data-blocks.
|
* Make a copy of the given AnimData - to be used when copying data-blocks.
|
||||||
*
|
*
|
||||||
* \note: Regarding handling of IDs managed by the #AnimData struct, this function follows the
|
* \note Regarding handling of IDs managed by the #AnimData struct, this function follows the
|
||||||
* behaviors of the generic #BKE_id_copy_ex, please see its documetation for more details.
|
* behaviors of the generic #BKE_id_copy_ex, please see its documentation for more details.
|
||||||
*
|
*
|
||||||
* \param flag: Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in
|
* \param flag: Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in
|
||||||
* #BKE_lib_id.hh
|
* `BKE_lib_id.hh`.
|
||||||
*
|
*
|
||||||
* \return The copied animdata.
|
* \return The copied animdata.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
* \ingroup bke
|
||||||
|
*
|
||||||
|
* This file only contains the memory management functions for the Animation
|
||||||
|
* data-block. For all other functionality, see `source/blender/animrig`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct Animation;
|
||||||
|
struct Main;
|
||||||
|
|
||||||
|
Animation *BKE_animation_add(Main *bmain, const char name[]);
|
|
@ -273,6 +273,7 @@ extern IDTypeInfo IDType_ID_CV;
|
||||||
extern IDTypeInfo IDType_ID_PT;
|
extern IDTypeInfo IDType_ID_PT;
|
||||||
extern IDTypeInfo IDType_ID_VO;
|
extern IDTypeInfo IDType_ID_VO;
|
||||||
extern IDTypeInfo IDType_ID_GP;
|
extern IDTypeInfo IDType_ID_GP;
|
||||||
|
extern IDTypeInfo IDType_ID_AN;
|
||||||
|
|
||||||
/** Empty shell mostly, but needed for read code. */
|
/** Empty shell mostly, but needed for read code. */
|
||||||
extern IDTypeInfo IDType_ID_LINK_PLACEHOLDER;
|
extern IDTypeInfo IDType_ID_LINK_PLACEHOLDER;
|
||||||
|
|
|
@ -128,7 +128,7 @@ void BKE_lib_libblock_session_uid_renew(ID *id);
|
||||||
*/
|
*/
|
||||||
void *BKE_id_new(Main *bmain, short type, const char *name);
|
void *BKE_id_new(Main *bmain, short type, const char *name);
|
||||||
/**
|
/**
|
||||||
* Same as for #BKE_id_new, but allows creating a data-block for (whithin) a given owner library.
|
* Same as for #BKE_id_new, but allows creating a data-block for (within) a given owner library.
|
||||||
*
|
*
|
||||||
* \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID
|
* \param owner_library the Library to 'assign' the newly created ID to. Use `nullptr` to make ID
|
||||||
* not use any library (i.e. become a local ID). Use `std::nullopt` for default behavior (i.e.
|
* not use any library (i.e. become a local ID). Use `std::nullopt` for default behavior (i.e.
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "BLI_compiler_attrs.h"
|
#include "BLI_compiler_attrs.h"
|
||||||
|
#include "BLI_function_ref.hh"
|
||||||
#include "BLI_map.hh"
|
#include "BLI_map.hh"
|
||||||
#include "BLI_set.hh"
|
#include "BLI_set.hh"
|
||||||
#include "BLI_span.hh"
|
#include "BLI_span.hh"
|
||||||
|
@ -265,14 +266,14 @@ using IDTypeFilter = uint64_t;
|
||||||
namespace blender::bke::id {
|
namespace blender::bke::id {
|
||||||
|
|
||||||
class IDRemapper {
|
class IDRemapper {
|
||||||
blender::Map<ID *, ID *> mappings_;
|
Map<ID *, ID *> mappings_;
|
||||||
IDTypeFilter source_types_ = 0;
|
IDTypeFilter source_types_ = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store all IDs using another ID with the 'NEVER_NULL' flag, which have (or
|
* Store all IDs using another ID with the 'NEVER_NULL' flag, which have (or
|
||||||
* should have been) remapped to `nullptr`.
|
* should have been) remapped to `nullptr`.
|
||||||
*/
|
*/
|
||||||
blender::Set<ID *> never_null_users_;
|
Set<ID *> never_null_users_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
@ -282,14 +283,14 @@ class IDRemapper {
|
||||||
bool allow_idtype_mismatch = false;
|
bool allow_idtype_mismatch = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void clear(void)
|
void clear()
|
||||||
{
|
{
|
||||||
mappings_.clear();
|
mappings_.clear();
|
||||||
never_null_users_.clear();
|
never_null_users_.clear();
|
||||||
source_types_ = 0;
|
source_types_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_empty(void) const
|
bool is_empty() const
|
||||||
{
|
{
|
||||||
return mappings_.is_empty();
|
return mappings_.is_empty();
|
||||||
}
|
}
|
||||||
|
@ -326,24 +327,24 @@ class IDRemapper {
|
||||||
never_null_users_.add(id);
|
never_null_users_.add(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const blender::Set<ID *> &never_null_users(void) const
|
const Set<ID *> &never_null_users() const
|
||||||
{
|
{
|
||||||
return never_null_users_;
|
return never_null_users_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Iterate over all remapping pairs in the remapper, and call the callback function on them. */
|
/** Iterate over all remapping pairs in the remapper, and call the callback function on them. */
|
||||||
void iter(IDRemapperIterFunction func, void *user_data) const
|
void iter(FunctionRef<void(ID *old_id, ID *new_id)> func) const
|
||||||
{
|
{
|
||||||
for (auto item : mappings_.items()) {
|
for (auto item : mappings_.items()) {
|
||||||
func(item.key, item.value, user_data);
|
func(item.key, item.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return a readable string for the given result. Can be used for debugging purposes. */
|
/** Return a readable string for the given result. Can be used for debugging purposes. */
|
||||||
static const blender::StringRefNull result_to_string(const IDRemapperApplyResult result);
|
static const StringRefNull result_to_string(const IDRemapperApplyResult result);
|
||||||
|
|
||||||
/** Print out the rules inside the given id_remapper. Can be used for debugging purposes. */
|
/** Print out the rules inside the given id_remapper. Can be used for debugging purposes. */
|
||||||
void print(void) const;
|
void print() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace blender::bke::id
|
} // namespace blender::bke::id
|
||||||
|
|
|
@ -223,6 +223,7 @@ struct Main {
|
||||||
ListBase collections;
|
ListBase collections;
|
||||||
ListBase armatures;
|
ListBase armatures;
|
||||||
ListBase actions;
|
ListBase actions;
|
||||||
|
ListBase animations;
|
||||||
ListBase nodetrees;
|
ListBase nodetrees;
|
||||||
ListBase brushes;
|
ListBase brushes;
|
||||||
ListBase particles;
|
ListBase particles;
|
||||||
|
|
|
@ -55,6 +55,7 @@ set(SRC
|
||||||
intern/anim_path.cc
|
intern/anim_path.cc
|
||||||
intern/anim_sys.cc
|
intern/anim_sys.cc
|
||||||
intern/anim_visualization.cc
|
intern/anim_visualization.cc
|
||||||
|
intern/animation.cc
|
||||||
intern/anonymous_attribute_id.cc
|
intern/anonymous_attribute_id.cc
|
||||||
intern/appdir.cc
|
intern/appdir.cc
|
||||||
intern/armature.cc
|
intern/armature.cc
|
||||||
|
@ -68,8 +69,8 @@ set(SRC
|
||||||
intern/attribute_access.cc
|
intern/attribute_access.cc
|
||||||
intern/attribute_math.cc
|
intern/attribute_math.cc
|
||||||
intern/autoexec.cc
|
intern/autoexec.cc
|
||||||
intern/bake_geometry_nodes_modifier.cc
|
|
||||||
intern/bake_data_block_map.cc
|
intern/bake_data_block_map.cc
|
||||||
|
intern/bake_geometry_nodes_modifier.cc
|
||||||
intern/bake_items.cc
|
intern/bake_items.cc
|
||||||
intern/bake_items_paths.cc
|
intern/bake_items_paths.cc
|
||||||
intern/bake_items_serialize.cc
|
intern/bake_items_serialize.cc
|
||||||
|
@ -327,6 +328,7 @@ set(SRC
|
||||||
BKE_anim_data.hh
|
BKE_anim_data.hh
|
||||||
BKE_anim_path.h
|
BKE_anim_path.h
|
||||||
BKE_anim_visualization.h
|
BKE_anim_visualization.h
|
||||||
|
BKE_animation.hh
|
||||||
BKE_animsys.h
|
BKE_animsys.h
|
||||||
BKE_anonymous_attribute_id.hh
|
BKE_anonymous_attribute_id.hh
|
||||||
BKE_appdir.hh
|
BKE_appdir.hh
|
||||||
|
@ -336,8 +338,8 @@ set(SRC
|
||||||
BKE_attribute.hh
|
BKE_attribute.hh
|
||||||
BKE_attribute_math.hh
|
BKE_attribute_math.hh
|
||||||
BKE_autoexec.hh
|
BKE_autoexec.hh
|
||||||
BKE_bake_geometry_nodes_modifier.hh
|
|
||||||
BKE_bake_data_block_map.hh
|
BKE_bake_data_block_map.hh
|
||||||
|
BKE_bake_geometry_nodes_modifier.hh
|
||||||
BKE_bake_items.hh
|
BKE_bake_items.hh
|
||||||
BKE_bake_items_paths.hh
|
BKE_bake_items_paths.hh
|
||||||
BKE_bake_items_serialize.hh
|
BKE_bake_items_serialize.hh
|
||||||
|
|
|
@ -292,6 +292,7 @@ void BKE_animdata_foreach_id(AnimData *adt, LibraryForeachIDData *data)
|
||||||
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcu, data));
|
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcu, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->animation, IDWALK_CB_USER);
|
||||||
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->action, IDWALK_CB_USER);
|
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->action, IDWALK_CB_USER);
|
||||||
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->tmpact, IDWALK_CB_USER);
|
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, adt->tmpact, IDWALK_CB_USER);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,255 @@
|
||||||
|
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
/** \file Animation data-block.
|
||||||
|
* \ingroup bke
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BLI_map.hh"
|
||||||
|
#include "BLI_string_utf8.h"
|
||||||
|
|
||||||
|
#include "BLO_read_write.hh"
|
||||||
|
|
||||||
|
#include "BKE_animation.hh"
|
||||||
|
#include "BKE_fcurve.hh"
|
||||||
|
#include "BKE_idtype.hh"
|
||||||
|
#include "BKE_lib_id.hh"
|
||||||
|
#include "BKE_lib_query.hh"
|
||||||
|
#include "BKE_main.hh"
|
||||||
|
|
||||||
|
#include "ANIM_animation.hh"
|
||||||
|
|
||||||
|
#include "DNA_anim_types.h"
|
||||||
|
#include "DNA_defaults.h"
|
||||||
|
|
||||||
|
#include "BLT_translation.hh"
|
||||||
|
|
||||||
|
struct BlendWriter;
|
||||||
|
struct BlendDataReader;
|
||||||
|
|
||||||
|
namespace blender::bke {
|
||||||
|
|
||||||
|
static void animation_copy_data(Main * /*bmain*/,
|
||||||
|
std::optional<Library *> /*owner_library*/,
|
||||||
|
ID *id_dst,
|
||||||
|
const ID *id_src,
|
||||||
|
const int /*flag*/)
|
||||||
|
{
|
||||||
|
Animation *dna_anim_dst = reinterpret_cast<Animation *>(id_dst);
|
||||||
|
animrig::Animation &anim_dst = dna_anim_dst->wrap();
|
||||||
|
|
||||||
|
const Animation *dna_anim_src = reinterpret_cast<const Animation *>(id_src);
|
||||||
|
const animrig::Animation &anim_src = dna_anim_src->wrap();
|
||||||
|
|
||||||
|
/* Copy all simple properties. */
|
||||||
|
anim_dst.layer_array_num = anim_src.layer_array_num;
|
||||||
|
anim_dst.layer_active_index = anim_src.layer_active_index;
|
||||||
|
anim_dst.binding_array_num = anim_src.binding_array_num;
|
||||||
|
anim_dst.last_binding_handle = anim_src.last_binding_handle;
|
||||||
|
|
||||||
|
/* Layers. */
|
||||||
|
anim_dst.layer_array = MEM_cnew_array<AnimationLayer *>(anim_src.layer_array_num, __func__);
|
||||||
|
for (int i : anim_src.layers().index_range()) {
|
||||||
|
anim_dst.layer_array[i] = MEM_new<animrig::Layer>(__func__, *anim_src.layer(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bindings. */
|
||||||
|
anim_dst.binding_array = MEM_cnew_array<AnimationBinding *>(anim_src.binding_array_num,
|
||||||
|
__func__);
|
||||||
|
for (int i : anim_src.bindings().index_range()) {
|
||||||
|
anim_dst.binding_array[i] = MEM_new<animrig::Binding>(__func__, *anim_src.binding(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Free (or release) any data used by this animation (does not free the animation itself). */
|
||||||
|
static void animation_free_data(ID *id)
|
||||||
|
{
|
||||||
|
reinterpret_cast<Animation *>(id)->wrap().free_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void animation_foreach_id(ID *id, LibraryForeachIDData *data)
|
||||||
|
{
|
||||||
|
animrig::Animation &anim = reinterpret_cast<Animation *>(id)->wrap();
|
||||||
|
|
||||||
|
for (animrig::Layer *layer : anim.layers()) {
|
||||||
|
for (animrig::Strip *strip : layer->strips()) {
|
||||||
|
switch (strip->type()) {
|
||||||
|
case animrig::Strip::Type::Keyframe: {
|
||||||
|
auto &key_strip = strip->as<animrig::KeyframeStrip>();
|
||||||
|
for (animrig::ChannelBag *channelbag_for_binding : key_strip.channelbags()) {
|
||||||
|
for (FCurve *fcurve : channelbag_for_binding->fcurves()) {
|
||||||
|
BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data, BKE_fcurve_foreach_id(fcurve, data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_channelbag(BlendWriter *writer, animrig::ChannelBag &channelbag)
|
||||||
|
{
|
||||||
|
BLO_write_struct(writer, AnimationChannelBag, &channelbag);
|
||||||
|
|
||||||
|
Span<FCurve *> fcurves = channelbag.fcurves();
|
||||||
|
BLO_write_pointer_array(writer, fcurves.size(), fcurves.data());
|
||||||
|
|
||||||
|
for (FCurve *fcurve : fcurves) {
|
||||||
|
BLO_write_struct(writer, FCurve, fcurve);
|
||||||
|
BKE_fcurve_blend_write_data(writer, fcurve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_keyframe_strip(BlendWriter *writer, animrig::KeyframeStrip &key_strip)
|
||||||
|
{
|
||||||
|
BLO_write_struct(writer, KeyframeAnimationStrip, &key_strip);
|
||||||
|
|
||||||
|
auto channelbags = key_strip.channelbags();
|
||||||
|
BLO_write_pointer_array(writer, channelbags.size(), channelbags.data());
|
||||||
|
|
||||||
|
for (animrig::ChannelBag *channelbag : channelbags) {
|
||||||
|
write_channelbag(writer, *channelbag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_strips(BlendWriter *writer, Span<animrig::Strip *> strips)
|
||||||
|
{
|
||||||
|
BLO_write_pointer_array(writer, strips.size(), strips.data());
|
||||||
|
|
||||||
|
for (animrig::Strip *strip : strips) {
|
||||||
|
switch (strip->type()) {
|
||||||
|
case animrig::Strip::Type::Keyframe: {
|
||||||
|
auto &key_strip = strip->as<animrig::KeyframeStrip>();
|
||||||
|
write_keyframe_strip(writer, key_strip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_layers(BlendWriter *writer, Span<animrig::Layer *> layers)
|
||||||
|
{
|
||||||
|
BLO_write_pointer_array(writer, layers.size(), layers.data());
|
||||||
|
|
||||||
|
for (animrig::Layer *layer : layers) {
|
||||||
|
BLO_write_struct(writer, AnimationLayer, layer);
|
||||||
|
write_strips(writer, layer->strips());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_bindings(BlendWriter *writer, Span<animrig::Binding *> bindings)
|
||||||
|
{
|
||||||
|
BLO_write_pointer_array(writer, bindings.size(), bindings.data());
|
||||||
|
for (animrig::Binding *binding : bindings) {
|
||||||
|
BLO_write_struct(writer, AnimationBinding, binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void animation_blend_write(BlendWriter *writer, ID *id, const void *id_address)
|
||||||
|
{
|
||||||
|
animrig::Animation &anim = reinterpret_cast<Animation *>(id)->wrap();
|
||||||
|
|
||||||
|
BLO_write_id_struct(writer, Animation, id_address, &anim.id);
|
||||||
|
BKE_id_blend_write(writer, &anim.id);
|
||||||
|
|
||||||
|
write_layers(writer, anim.layers());
|
||||||
|
write_bindings(writer, anim.bindings());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_channelbag(BlendDataReader *reader, animrig::ChannelBag &channelbag)
|
||||||
|
{
|
||||||
|
BLO_read_pointer_array(reader, reinterpret_cast<void **>(&channelbag.fcurve_array));
|
||||||
|
|
||||||
|
for (int i = 0; i < channelbag.fcurve_array_num; i++) {
|
||||||
|
BLO_read_data_address(reader, &channelbag.fcurve_array[i]);
|
||||||
|
BKE_fcurve_blend_read_data(reader, channelbag.fcurve_array[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_keyframe_strip(BlendDataReader *reader, animrig::KeyframeStrip &strip)
|
||||||
|
{
|
||||||
|
BLO_read_pointer_array(reader, reinterpret_cast<void **>(&strip.channelbags_array));
|
||||||
|
|
||||||
|
for (int i = 0; i < strip.channelbags_array_num; i++) {
|
||||||
|
BLO_read_data_address(reader, &strip.channelbags_array[i]);
|
||||||
|
AnimationChannelBag *channelbag = strip.channelbags_array[i];
|
||||||
|
read_channelbag(reader, channelbag->wrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_animation_layers(BlendDataReader *reader, animrig::Animation &anim)
|
||||||
|
{
|
||||||
|
BLO_read_pointer_array(reader, reinterpret_cast<void **>(&anim.layer_array));
|
||||||
|
|
||||||
|
for (int layer_idx = 0; layer_idx < anim.layer_array_num; layer_idx++) {
|
||||||
|
BLO_read_data_address(reader, &anim.layer_array[layer_idx]);
|
||||||
|
AnimationLayer *layer = anim.layer_array[layer_idx];
|
||||||
|
|
||||||
|
BLO_read_pointer_array(reader, reinterpret_cast<void **>(&layer->strip_array));
|
||||||
|
for (int strip_idx = 0; strip_idx < layer->strip_array_num; strip_idx++) {
|
||||||
|
BLO_read_data_address(reader, &layer->strip_array[strip_idx]);
|
||||||
|
AnimationStrip *dna_strip = layer->strip_array[strip_idx];
|
||||||
|
animrig::Strip &strip = dna_strip->wrap();
|
||||||
|
|
||||||
|
switch (strip.type()) {
|
||||||
|
case animrig::Strip::Type::Keyframe: {
|
||||||
|
read_keyframe_strip(reader, strip.as<animrig::KeyframeStrip>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_animation_bindings(BlendDataReader *reader, animrig::Animation &anim)
|
||||||
|
{
|
||||||
|
BLO_read_pointer_array(reader, reinterpret_cast<void **>(&anim.binding_array));
|
||||||
|
|
||||||
|
for (int i = 0; i < anim.binding_array_num; i++) {
|
||||||
|
BLO_read_data_address(reader, &anim.binding_array[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void animation_blend_read_data(BlendDataReader *reader, ID *id)
|
||||||
|
{
|
||||||
|
animrig::Animation &animation = reinterpret_cast<Animation *>(id)->wrap();
|
||||||
|
read_animation_layers(reader, animation);
|
||||||
|
read_animation_bindings(reader, animation);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::bke
|
||||||
|
|
||||||
|
IDTypeInfo IDType_ID_AN = {
|
||||||
|
/*id_code*/ ID_AN,
|
||||||
|
/*id_filter*/ FILTER_ID_AN,
|
||||||
|
/*dependencies_id_types*/ 0,
|
||||||
|
/*main_listbase_index*/ INDEX_ID_AN,
|
||||||
|
/*struct_size*/ sizeof(Animation),
|
||||||
|
/*name*/ "Animation",
|
||||||
|
/*name_plural*/ N_("animations"),
|
||||||
|
/*translation_context*/ BLT_I18NCONTEXT_ID_ANIMATION,
|
||||||
|
/*flags*/ IDTYPE_FLAGS_NO_ANIMDATA,
|
||||||
|
/*asset_type_info*/ nullptr,
|
||||||
|
|
||||||
|
/*init_data*/ nullptr,
|
||||||
|
/*copy_data*/ blender::bke::animation_copy_data,
|
||||||
|
/*free_data*/ blender::bke::animation_free_data,
|
||||||
|
/*make_local*/ nullptr,
|
||||||
|
/*foreach_id*/ blender::bke::animation_foreach_id,
|
||||||
|
/*foreach_cache*/ nullptr,
|
||||||
|
/*foreach_path*/ nullptr,
|
||||||
|
/*owner_pointer_get*/ nullptr,
|
||||||
|
|
||||||
|
/*blend_write*/ blender::bke::animation_blend_write,
|
||||||
|
/*blend_read_data*/ blender::bke::animation_blend_read_data,
|
||||||
|
/*blend_read_after_liblink*/ nullptr,
|
||||||
|
|
||||||
|
/*blend_read_undo_preserve*/ nullptr,
|
||||||
|
|
||||||
|
/*lib_override_apply_post*/ nullptr,
|
||||||
|
};
|
||||||
|
|
||||||
|
Animation *BKE_animation_add(Main *bmain, const char name[])
|
||||||
|
{
|
||||||
|
Animation *anim = static_cast<Animation *>(BKE_id_new(bmain, ID_AN, name));
|
||||||
|
return anim;
|
||||||
|
}
|
|
@ -474,7 +474,7 @@ static void build_mesh_positions(const CurvesInfo &curves_info,
|
||||||
}
|
}
|
||||||
const Span<float3> tangents = curves_info.main.evaluated_tangents();
|
const Span<float3> tangents = curves_info.main.evaluated_tangents();
|
||||||
const Span<float3> normals = curves_info.main.evaluated_normals();
|
const Span<float3> normals = curves_info.main.evaluated_normals();
|
||||||
Span<float> radii_eval = {};
|
Span<float> radii_eval;
|
||||||
if (const GVArray radii = *curves_info.main.attributes().lookup("radius", AttrDomain::Point)) {
|
if (const GVArray radii = *curves_info.main.attributes().lookup("radius", AttrDomain::Point)) {
|
||||||
radii_eval = evaluate_attribute(radii, curves_info.main, eval_buffer).typed<float>();
|
radii_eval = evaluate_attribute(radii, curves_info.main, eval_buffer).typed<float>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ static void id_type_init()
|
||||||
INIT_TYPE(ID_GR);
|
INIT_TYPE(ID_GR);
|
||||||
INIT_TYPE(ID_AR);
|
INIT_TYPE(ID_AR);
|
||||||
INIT_TYPE(ID_AC);
|
INIT_TYPE(ID_AC);
|
||||||
|
INIT_TYPE(ID_AN);
|
||||||
INIT_TYPE(ID_NT);
|
INIT_TYPE(ID_NT);
|
||||||
INIT_TYPE(ID_BR);
|
INIT_TYPE(ID_BR);
|
||||||
INIT_TYPE(ID_PA);
|
INIT_TYPE(ID_PA);
|
||||||
|
@ -225,6 +226,7 @@ int BKE_idtype_idcode_to_index(const short idcode)
|
||||||
|
|
||||||
switch ((ID_Type)idcode) {
|
switch ((ID_Type)idcode) {
|
||||||
CASE_IDINDEX(AC);
|
CASE_IDINDEX(AC);
|
||||||
|
CASE_IDINDEX(AN);
|
||||||
CASE_IDINDEX(AR);
|
CASE_IDINDEX(AR);
|
||||||
CASE_IDINDEX(BR);
|
CASE_IDINDEX(BR);
|
||||||
CASE_IDINDEX(CA);
|
CASE_IDINDEX(CA);
|
||||||
|
@ -284,6 +286,7 @@ int BKE_idtype_idfilter_to_index(const uint64_t id_filter)
|
||||||
|
|
||||||
switch (id_filter) {
|
switch (id_filter) {
|
||||||
CASE_IDINDEX(AC);
|
CASE_IDINDEX(AC);
|
||||||
|
CASE_IDINDEX(AN);
|
||||||
CASE_IDINDEX(AR);
|
CASE_IDINDEX(AR);
|
||||||
CASE_IDINDEX(BR);
|
CASE_IDINDEX(BR);
|
||||||
CASE_IDINDEX(CA);
|
CASE_IDINDEX(CA);
|
||||||
|
|
|
@ -65,7 +65,8 @@ IDRemapperApplyResult IDRemapper::apply(ID **r_id_ptr,
|
||||||
return ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE;
|
return ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mappings_.contains(*r_id_ptr)) {
|
ID *const *new_id = mappings_.lookup_ptr(*r_id_ptr);
|
||||||
|
if (new_id == nullptr) {
|
||||||
return ID_REMAP_RESULT_SOURCE_UNAVAILABLE;
|
return ID_REMAP_RESULT_SOURCE_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ IDRemapperApplyResult IDRemapper::apply(ID **r_id_ptr,
|
||||||
id_us_min(*r_id_ptr);
|
id_us_min(*r_id_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
*r_id_ptr = mappings_.lookup(*r_id_ptr);
|
*r_id_ptr = *new_id;
|
||||||
if (options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF && *r_id_ptr == id_self) {
|
if (options & ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF && *r_id_ptr == id_self) {
|
||||||
*r_id_ptr = nullptr;
|
*r_id_ptr = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +93,7 @@ IDRemapperApplyResult IDRemapper::apply(ID **r_id_ptr,
|
||||||
return ID_REMAP_RESULT_SOURCE_REMAPPED;
|
return ID_REMAP_RESULT_SOURCE_REMAPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
const blender::StringRefNull IDRemapper::result_to_string(const IDRemapperApplyResult result)
|
const StringRefNull IDRemapper::result_to_string(const IDRemapperApplyResult result)
|
||||||
{
|
{
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE:
|
case ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE:
|
||||||
|
@ -108,17 +109,16 @@ const blender::StringRefNull IDRemapper::result_to_string(const IDRemapperApplyR
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void IDRemapper::print(void) const
|
void IDRemapper::print() const
|
||||||
{
|
{
|
||||||
auto print_cb = [](ID *old_id, ID *new_id, void * /*user_data*/) {
|
this->iter([](ID *old_id, ID *new_id) {
|
||||||
if (old_id != nullptr && new_id != nullptr) {
|
if (old_id != nullptr && new_id != nullptr) {
|
||||||
printf("Remap %s(%p) to %s(%p)\n", old_id->name, old_id, new_id->name, new_id);
|
printf("Remap %s(%p) to %s(%p)\n", old_id->name, old_id, new_id->name, new_id);
|
||||||
}
|
}
|
||||||
if (old_id != nullptr && new_id == nullptr) {
|
if (old_id != nullptr && new_id == nullptr) {
|
||||||
printf("Unassign %s(%p)\n", old_id->name, old_id);
|
printf("Unassign %s(%p)\n", old_id->name, old_id);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
this->iter(print_cb, nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace blender::bke::id
|
} // namespace blender::bke::id
|
||||||
|
|
|
@ -616,7 +616,7 @@ struct UnusedIDsData {
|
||||||
std::array<int, INDEX_ID_MAX> *num_local;
|
std::array<int, INDEX_ID_MAX> *num_local;
|
||||||
std::array<int, INDEX_ID_MAX> *num_linked;
|
std::array<int, INDEX_ID_MAX> *num_linked;
|
||||||
|
|
||||||
blender::Set<ID *> unused_ids{};
|
blender::Set<ID *> unused_ids;
|
||||||
|
|
||||||
UnusedIDsData(Main *bmain, const int id_tag, LibQueryUnusedIDsData ¶meters)
|
UnusedIDsData(Main *bmain, const int id_tag, LibQueryUnusedIDsData ¶meters)
|
||||||
: bmain(bmain),
|
: bmain(bmain),
|
||||||
|
|
|
@ -216,7 +216,7 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data)
|
||||||
|
|
||||||
const IDRemapperApplyResult expected_mapping_result = id_remapper.get_mapping_result(
|
const IDRemapperApplyResult expected_mapping_result = id_remapper.get_mapping_result(
|
||||||
*id_p, id_remapper_options, id_self);
|
*id_p, id_remapper_options, id_self);
|
||||||
/* Exit, when no modifications will be done; ensuring id->runtime counters won't changed. */
|
/* Exit when no modifications will be done, ensuring id->runtime counters won't changed. */
|
||||||
if (ELEM(expected_mapping_result,
|
if (ELEM(expected_mapping_result,
|
||||||
ID_REMAP_RESULT_SOURCE_UNAVAILABLE,
|
ID_REMAP_RESULT_SOURCE_UNAVAILABLE,
|
||||||
ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE))
|
ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE))
|
||||||
|
@ -429,9 +429,8 @@ static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new
|
||||||
ntreeUpdateAllUsers(bmain, new_id);
|
ntreeUpdateAllUsers(bmain, new_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, void *user_data)
|
static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, IDRemap *id_remap_data)
|
||||||
{
|
{
|
||||||
IDRemap *id_remap_data = static_cast<IDRemap *>(user_data);
|
|
||||||
const int remap_flags = id_remap_data->flag;
|
const int remap_flags = id_remap_data->flag;
|
||||||
if ((remap_flags & ID_REMAP_SKIP_USER_CLEAR) == 0) {
|
if ((remap_flags & ID_REMAP_SKIP_USER_CLEAR) == 0) {
|
||||||
/* XXX We may not want to always 'transfer' fake-user from old to new id...
|
/* XXX We may not want to always 'transfer' fake-user from old to new id...
|
||||||
|
@ -454,9 +453,7 @@ static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, void *user_d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void libblock_remap_reset_remapping_status_callback(ID *old_id,
|
static void libblock_remap_reset_remapping_status_fn(ID *old_id, ID *new_id)
|
||||||
ID *new_id,
|
|
||||||
void * /*user_data*/)
|
|
||||||
{
|
{
|
||||||
BKE_libblock_runtime_reset_remapping_status(old_id);
|
BKE_libblock_runtime_reset_remapping_status(old_id);
|
||||||
if (new_id != nullptr) {
|
if (new_id != nullptr) {
|
||||||
|
@ -511,7 +508,7 @@ static void libblock_remap_data(
|
||||||
IDWALK_DO_LIBRARY_POINTER :
|
IDWALK_DO_LIBRARY_POINTER :
|
||||||
IDWALK_NOP));
|
IDWALK_NOP));
|
||||||
|
|
||||||
id_remapper.iter(libblock_remap_reset_remapping_status_callback, nullptr);
|
id_remapper.iter(libblock_remap_reset_remapping_status_fn);
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
#ifdef DEBUG_PRINT
|
#ifdef DEBUG_PRINT
|
||||||
|
@ -550,24 +547,17 @@ static void libblock_remap_data(
|
||||||
FOREACH_MAIN_ID_END;
|
FOREACH_MAIN_ID_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
id_remapper.iter(libblock_remap_data_update_tags, &id_remap_data);
|
id_remapper.iter([&](ID *old_id, ID *new_id) {
|
||||||
|
libblock_remap_data_update_tags(old_id, new_id, &id_remap_data);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LibBlockRemapMultipleUserData {
|
static void libblock_remap_foreach_idpair(ID *old_id, ID *new_id, Main *bmain, int remap_flags)
|
||||||
Main *bmain;
|
|
||||||
int remap_flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void libblock_remap_foreach_idpair_cb(ID *old_id, ID *new_id, void *user_data)
|
|
||||||
{
|
{
|
||||||
if (old_id == new_id) {
|
if (old_id == new_id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LibBlockRemapMultipleUserData *data = static_cast<LibBlockRemapMultipleUserData *>(user_data);
|
|
||||||
Main *bmain = data->bmain;
|
|
||||||
const int remap_flags = data->remap_flags;
|
|
||||||
|
|
||||||
BLI_assert(old_id != nullptr);
|
BLI_assert(old_id != nullptr);
|
||||||
BLI_assert((new_id == nullptr) || remap_flags & ID_REMAP_ALLOW_IDTYPE_MISMATCH ||
|
BLI_assert((new_id == nullptr) || remap_flags & ID_REMAP_ALLOW_IDTYPE_MISMATCH ||
|
||||||
GS(old_id->name) == GS(new_id->name));
|
GS(old_id->name) == GS(new_id->name));
|
||||||
|
@ -661,11 +651,9 @@ void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper &mappings, const
|
||||||
|
|
||||||
libblock_remap_data(bmain, nullptr, ID_REMAP_TYPE_REMAP, mappings, remap_flags);
|
libblock_remap_data(bmain, nullptr, ID_REMAP_TYPE_REMAP, mappings, remap_flags);
|
||||||
|
|
||||||
LibBlockRemapMultipleUserData user_data = {nullptr};
|
mappings.iter([&](ID *old_id, ID *new_id) {
|
||||||
user_data.bmain = bmain;
|
libblock_remap_foreach_idpair(old_id, new_id, bmain, remap_flags);
|
||||||
user_data.remap_flags = remap_flags;
|
});
|
||||||
|
|
||||||
mappings.iter(libblock_remap_foreach_idpair_cb, &user_data);
|
|
||||||
|
|
||||||
/* We assume editors do not hold references to their IDs... This is false in some cases
|
/* We assume editors do not hold references to their IDs... This is false in some cases
|
||||||
* (Image is especially tricky here),
|
* (Image is especially tricky here),
|
||||||
|
@ -738,17 +726,11 @@ void BKE_libblock_unlink(Main *bmain, void *idv, const bool do_skip_indirect)
|
||||||
* ... sigh
|
* ... sigh
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct LibBlockRelinkMultipleUserData {
|
static void libblock_relink_foreach_idpair(ID *old_id,
|
||||||
Main *bmain;
|
ID *new_id,
|
||||||
blender::Span<ID *> ids;
|
Main *bmain,
|
||||||
};
|
const blender::Span<ID *> ids)
|
||||||
|
|
||||||
static void libblock_relink_foreach_idpair_cb(ID *old_id, ID *new_id, void *user_data)
|
|
||||||
{
|
{
|
||||||
LibBlockRelinkMultipleUserData *data = static_cast<LibBlockRelinkMultipleUserData *>(user_data);
|
|
||||||
Main *bmain = data->bmain;
|
|
||||||
const blender::Span<ID *> ids = data->ids;
|
|
||||||
|
|
||||||
BLI_assert(old_id != nullptr);
|
BLI_assert(old_id != nullptr);
|
||||||
BLI_assert((new_id == nullptr) || GS(old_id->name) == GS(new_id->name));
|
BLI_assert((new_id == nullptr) || GS(old_id->name) == GS(new_id->name));
|
||||||
BLI_assert(old_id != new_id);
|
BLI_assert(old_id != new_id);
|
||||||
|
@ -815,9 +797,9 @@ void BKE_libblock_relink_multiple(Main *bmain,
|
||||||
|
|
||||||
switch (remap_type) {
|
switch (remap_type) {
|
||||||
case ID_REMAP_TYPE_REMAP: {
|
case ID_REMAP_TYPE_REMAP: {
|
||||||
LibBlockRelinkMultipleUserData user_data = {bmain, ids};
|
id_remapper.iter([&](ID *old_id, ID *new_id) {
|
||||||
|
libblock_relink_foreach_idpair(old_id, new_id, bmain, ids);
|
||||||
id_remapper.iter(libblock_relink_foreach_idpair_cb, &user_data);
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_REMAP_TYPE_CLEANUP: {
|
case ID_REMAP_TYPE_CLEANUP: {
|
||||||
|
|
|
@ -860,6 +860,8 @@ ListBase *which_libbase(Main *bmain, short type)
|
||||||
return &(bmain->armatures);
|
return &(bmain->armatures);
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
return &(bmain->actions);
|
return &(bmain->actions);
|
||||||
|
case ID_AN:
|
||||||
|
return &(bmain->animations);
|
||||||
case ID_NT:
|
case ID_NT:
|
||||||
return &(bmain->nodetrees);
|
return &(bmain->nodetrees);
|
||||||
case ID_BR:
|
case ID_BR:
|
||||||
|
@ -905,6 +907,7 @@ int set_listbasepointers(Main *bmain, ListBase *lb[/*INDEX_ID_MAX*/])
|
||||||
|
|
||||||
/* Moved here to avoid problems when freeing with animato (aligorith). */
|
/* Moved here to avoid problems when freeing with animato (aligorith). */
|
||||||
lb[INDEX_ID_AC] = &(bmain->actions);
|
lb[INDEX_ID_AC] = &(bmain->actions);
|
||||||
|
lb[INDEX_ID_AN] = &(bmain->animations);
|
||||||
|
|
||||||
lb[INDEX_ID_KE] = &(bmain->shapekeys);
|
lb[INDEX_ID_KE] = &(bmain->shapekeys);
|
||||||
|
|
||||||
|
|
|
@ -1256,7 +1256,7 @@ void BKE_object_material_array_assign(
|
||||||
|
|
||||||
/* now we have the right number of slots */
|
/* now we have the right number of slots */
|
||||||
for (int i = 0; i < totcol; i++) {
|
for (int i = 0; i < totcol; i++) {
|
||||||
if (to_object_only && ob->matbits[i] == 0) {
|
if (to_object_only && ob->matbits && ob->matbits[i] == 0) {
|
||||||
/* If we only assign to object, and that slot uses obdata material, do nothing. */
|
/* If we only assign to object, and that slot uses obdata material, do nothing. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -521,8 +521,8 @@ if(WITH_GTESTS)
|
||||||
tests/BLI_kdopbvh_test.cc
|
tests/BLI_kdopbvh_test.cc
|
||||||
tests/BLI_kdtree_test.cc
|
tests/BLI_kdtree_test.cc
|
||||||
tests/BLI_length_parameterize_test.cc
|
tests/BLI_length_parameterize_test.cc
|
||||||
tests/BLI_linear_allocator_test.cc
|
|
||||||
tests/BLI_linear_allocator_chunked_list_test.cc
|
tests/BLI_linear_allocator_chunked_list_test.cc
|
||||||
|
tests/BLI_linear_allocator_test.cc
|
||||||
tests/BLI_linklist_lockfree_test.cc
|
tests/BLI_linklist_lockfree_test.cc
|
||||||
tests/BLI_listbase_test.cc
|
tests/BLI_listbase_test.cc
|
||||||
tests/BLI_map_test.cc
|
tests/BLI_map_test.cc
|
||||||
|
|
|
@ -298,7 +298,7 @@ BLI_INLINE void bilinear_fl_impl(const float *buffer,
|
||||||
x2 = 0;
|
x2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (x2 < 0 || x1 >= width) {
|
else if (border && (x2 < 0 || x1 >= width)) {
|
||||||
copy_vn_fl(output, components, 0.0f);
|
copy_vn_fl(output, components, 0.0f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ BLI_INLINE void bilinear_fl_impl(const float *buffer,
|
||||||
y2 = 0;
|
y2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (y2 < 0 || y1 >= height) {
|
else if (border && (y2 < 0 || y1 >= height)) {
|
||||||
copy_vn_fl(output, components, 0.0f);
|
copy_vn_fl(output, components, 0.0f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ const char *BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid
|
||||||
/* ID-types contexts. */
|
/* ID-types contexts. */
|
||||||
/* WARNING! Keep it in sync with ID-types in `blenkernel/intern/idtype.cc`. */
|
/* WARNING! Keep it in sync with ID-types in `blenkernel/intern/idtype.cc`. */
|
||||||
#define BLT_I18NCONTEXT_ID_ACTION "Action"
|
#define BLT_I18NCONTEXT_ID_ACTION "Action"
|
||||||
|
#define BLT_I18NCONTEXT_ID_ANIMATION "Animation"
|
||||||
#define BLT_I18NCONTEXT_ID_ARMATURE "Armature"
|
#define BLT_I18NCONTEXT_ID_ARMATURE "Armature"
|
||||||
#define BLT_I18NCONTEXT_ID_BRUSH "Brush"
|
#define BLT_I18NCONTEXT_ID_BRUSH "Brush"
|
||||||
#define BLT_I18NCONTEXT_ID_CACHEFILE "CacheFile"
|
#define BLT_I18NCONTEXT_ID_CACHEFILE "CacheFile"
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "BLI_math_base.hh"
|
#include "BLI_math_base.hh"
|
||||||
#include "BLI_math_interp.hh"
|
#include "BLI_math_interp.hh"
|
||||||
#include "BLI_math_vector.h"
|
#include "BLI_math_vector.h"
|
||||||
|
#include "BLI_math_vector_types.hh"
|
||||||
#include "BLI_rect.h"
|
#include "BLI_rect.h"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
@ -201,6 +202,20 @@ class MemoryBuffer {
|
||||||
read_elem_checked(floor_x(x), floor_y(y), out);
|
read_elem_checked(floor_x(x), floor_y(y), out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Equivalent to the GLSL texture() function with bilinear interpolation and extended boundary
|
||||||
|
* conditions. The coordinates are thus expected to have half-pixels offsets. For float buffers,
|
||||||
|
* the green and green channels will be zero and the alpha will be one. */
|
||||||
|
float4 texture_bilinear_extend(float2 coordinates) const
|
||||||
|
{
|
||||||
|
const int2 size = int2(get_width(), get_height());
|
||||||
|
const float2 texel_coordinates = (coordinates * float2(size)) - 0.5f;
|
||||||
|
|
||||||
|
float4 result = float4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
math::interpolate_bilinear_fl(
|
||||||
|
buffer_, result, size.x, size.y, num_channels_, texel_coordinates.x, texel_coordinates.y);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void read_elem_bilinear(float x, float y, float *out) const
|
void read_elem_bilinear(float x, float y, float *out) const
|
||||||
{
|
{
|
||||||
/* Only clear past +/-1 borders to be able to smooth edges. */
|
/* Only clear past +/-1 borders to be able to smooth edges. */
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "GPU_capabilities.h"
|
#include "GPU_capabilities.h"
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "gpu_shader_create_info.hh"
|
#include "gpu_shader_create_info.hh"
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "GPU_material.hh"
|
#include "GPU_material.hh"
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "gpu_shader_create_info.hh"
|
#include "gpu_shader_create_info.hh"
|
||||||
|
|
||||||
|
|
|
@ -557,6 +557,10 @@ void DepsgraphNodeBuilder::build_id(ID *id, const bool force_be_visible)
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
build_action((bAction *)id);
|
build_action((bAction *)id);
|
||||||
break;
|
break;
|
||||||
|
case ID_AN:
|
||||||
|
/* TODO: actually handle this ID type properly, will be done in a followup commit. */
|
||||||
|
build_generic_id(id);
|
||||||
|
break;
|
||||||
case ID_AR:
|
case ID_AR:
|
||||||
build_armature((bArmature *)id);
|
build_armature((bArmature *)id);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -525,6 +525,10 @@ void DepsgraphRelationBuilder::build_id(ID *id)
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
build_action((bAction *)id);
|
build_action((bAction *)id);
|
||||||
break;
|
break;
|
||||||
|
case ID_AN:
|
||||||
|
/* TODO: actually handle this ID type properly, will be done in a followup commit. */
|
||||||
|
build_generic_id(id);
|
||||||
|
break;
|
||||||
case ID_AR:
|
case ID_AR:
|
||||||
build_armature((bArmature *)id);
|
build_armature((bArmature *)id);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include "GPU_capabilities.h"
|
#include "GPU_capabilities.h"
|
||||||
#include "GPU_material.hh"
|
#include "GPU_material.hh"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "DEG_depsgraph_query.hh"
|
#include "DEG_depsgraph_query.hh"
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include "GPU_platform.h"
|
#include "GPU_platform.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "eevee_camera.hh"
|
#include "eevee_camera.hh"
|
||||||
#include "eevee_instance.hh"
|
#include "eevee_instance.hh"
|
||||||
|
|
|
@ -395,8 +395,10 @@ class ShadowPunctual : public NonCopyable, NonMovable {
|
||||||
int tilemaps_needed_;
|
int tilemaps_needed_;
|
||||||
/** Scaling factor to the light shape for shadow ray casting. */
|
/** Scaling factor to the light shape for shadow ray casting. */
|
||||||
float softness_factor_;
|
float softness_factor_;
|
||||||
/** radius * softness_factor (Bypasses LightModule radius modifications to avoid unnecesary
|
/**
|
||||||
* padding in the shadow projection). */
|
* `radius * softness_factor` (Bypasses LightModule radius modifications
|
||||||
|
* to avoid unnecessary padding in the shadow projection).
|
||||||
|
*/
|
||||||
float shadow_radius_;
|
float shadow_radius_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -69,7 +69,7 @@ ShadowSampleParams debug_shadow_sample_get(vec3 P, LightData light)
|
||||||
return shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P);
|
return shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return shadow_punctual_sample_params_get(shadow_tilemaps_tx, light, P);
|
return shadow_punctual_sample_params_get(light, P);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,9 +152,7 @@ vec3 shadow_punctual_reconstruct_position(ShadowSampleParams params,
|
||||||
return mat3(light.object_mat) * lP + light._position;
|
return mat3(light.object_mat) * lP + light._position;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShadowSampleParams shadow_punctual_sample_params_get(usampler2D tilemaps_tx,
|
ShadowSampleParams shadow_punctual_sample_params_get(LightData light, vec3 P)
|
||||||
LightData light,
|
|
||||||
vec3 P)
|
|
||||||
{
|
{
|
||||||
vec3 lP = (P - light._position) * mat3(light.object_mat);
|
vec3 lP = (P - light._position) * mat3(light.object_mat);
|
||||||
|
|
||||||
|
@ -179,7 +177,7 @@ ShadowEvalResult shadow_punctual_sample_get(SHADOW_ATLAS_TYPE atlas_tx,
|
||||||
LightData light,
|
LightData light,
|
||||||
vec3 P)
|
vec3 P)
|
||||||
{
|
{
|
||||||
ShadowSampleParams params = shadow_punctual_sample_params_get(tilemaps_tx, light, P);
|
ShadowSampleParams params = shadow_punctual_sample_params_get(light, P);
|
||||||
|
|
||||||
float depth = shadow_read_depth(atlas_tx, tilemaps_tx, params);
|
float depth = shadow_read_depth(atlas_tx, tilemaps_tx, params);
|
||||||
|
|
||||||
|
|
|
@ -429,7 +429,7 @@ vec3 shadow_pcf_offset(LightData light, const bool is_directional, vec3 P, vec3
|
||||||
params = shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P);
|
params = shadow_directional_sample_params_get(shadow_tilemaps_tx, light, P);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
params = shadow_punctual_sample_params_get(shadow_tilemaps_tx, light, P);
|
params = shadow_punctual_sample_params_get(light, P);
|
||||||
}
|
}
|
||||||
ShadowTileData tile = shadow_tile_data_get(shadow_tilemaps_tx, params);
|
ShadowTileData tile = shadow_tile_data_get(shadow_tilemaps_tx, params);
|
||||||
if (!tile.is_allocated) {
|
if (!tile.is_allocated) {
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "BLI_math_color.h"
|
#include "BLI_math_color.h"
|
||||||
#include "BLI_memblock.h"
|
#include "BLI_memblock.h"
|
||||||
|
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "IMB_imbuf_types.hh"
|
#include "IMB_imbuf_types.hh"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "DNA_view3d_types.h"
|
#include "DNA_view3d_types.h"
|
||||||
|
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "gpencil_engine.h"
|
#include "gpencil_engine.h"
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ struct SceneState {
|
||||||
bool xray_mode = false;
|
bool xray_mode = false;
|
||||||
|
|
||||||
DRWState cull_state = DRW_STATE_NO_DRAW;
|
DRWState cull_state = DRW_STATE_NO_DRAW;
|
||||||
Vector<float4> clip_planes = {};
|
Vector<float4> clip_planes;
|
||||||
|
|
||||||
float4 background_color = float4(0);
|
float4 background_color = float4(0);
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ class MeshPass : public PassMain {
|
||||||
private:
|
private:
|
||||||
using TextureSubPassKey = std::pair<GPUTexture *, eGeometryType>;
|
using TextureSubPassKey = std::pair<GPUTexture *, eGeometryType>;
|
||||||
|
|
||||||
Map<TextureSubPassKey, PassMain::Sub *> texture_subpass_map_ = {};
|
Map<TextureSubPassKey, PassMain::Sub *> texture_subpass_map_;
|
||||||
|
|
||||||
PassMain::Sub *passes_[geometry_type_len][shader_type_len] = {{nullptr}};
|
PassMain::Sub *passes_[geometry_type_len][shader_type_len] = {{nullptr}};
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ static bool get_matcap_tx(Texture &matcap_tx, StudioLight &studio_light)
|
||||||
if (matcap_diffuse && matcap_diffuse->float_buffer.data) {
|
if (matcap_diffuse && matcap_diffuse->float_buffer.data) {
|
||||||
int layers = 1;
|
int layers = 1;
|
||||||
float *buffer = matcap_diffuse->float_buffer.data;
|
float *buffer = matcap_diffuse->float_buffer.data;
|
||||||
Vector<float> combined_buffer = {};
|
Vector<float> combined_buffer;
|
||||||
|
|
||||||
if (matcap_specular && matcap_specular->float_buffer.data) {
|
if (matcap_specular && matcap_specular->float_buffer.data) {
|
||||||
int size = matcap_diffuse->x * matcap_diffuse->y * 4;
|
int size = matcap_diffuse->x * matcap_diffuse->y * 4;
|
||||||
|
|
|
@ -96,8 +96,8 @@ void ShadowPass::ShadowView::setup(View &view, float3 light_direction, bool forc
|
||||||
float4 frustum_planes[6];
|
float4 frustum_planes[6];
|
||||||
DRW_culling_frustum_planes_get(nullptr, (float(*)[4])frustum_planes);
|
DRW_culling_frustum_planes_get(nullptr, (float(*)[4])frustum_planes);
|
||||||
|
|
||||||
Vector<float4> faces_result = {};
|
Vector<float4> faces_result;
|
||||||
Vector<float3> corners_result = {};
|
Vector<float3> corners_result;
|
||||||
|
|
||||||
/* "Unlit" frustum faces are left "as-is" */
|
/* "Unlit" frustum faces are left "as-is" */
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
#include "GPU_framebuffer.h"
|
#include "GPU_framebuffer.h"
|
||||||
#include "GPU_storage_buffer.h"
|
#include "GPU_storage_buffer.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
namespace blender::draw {
|
namespace blender::draw {
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_storage_buffer.h"
|
#include "GPU_storage_buffer.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "draw_cache.hh"
|
#include "draw_cache.hh"
|
||||||
#include "draw_common.h"
|
#include "draw_common.h"
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "GPU_drawlist.h"
|
#include "GPU_drawlist.h"
|
||||||
#include "GPU_framebuffer.h"
|
#include "GPU_framebuffer.h"
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
#include "GPU_viewport.h"
|
#include "GPU_viewport.h"
|
||||||
|
|
||||||
#include "draw_instance_data.h"
|
#include "draw_instance_data.h"
|
||||||
|
|
|
@ -62,7 +62,7 @@
|
||||||
#include "GPU_platform.h"
|
#include "GPU_platform.h"
|
||||||
#include "GPU_shader_shared.h"
|
#include "GPU_shader_shared.h"
|
||||||
#include "GPU_state.h"
|
#include "GPU_state.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
#include "GPU_viewport.h"
|
#include "GPU_viewport.h"
|
||||||
|
|
||||||
#include "RE_engine.h"
|
#include "RE_engine.h"
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
#include "GPU_capabilities.h"
|
#include "GPU_capabilities.h"
|
||||||
#include "GPU_material.hh"
|
#include "GPU_material.hh"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "intern/gpu_codegen.h"
|
#include "intern/gpu_codegen.h"
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@ set(SRC
|
||||||
intern/asset_handle.cc
|
intern/asset_handle.cc
|
||||||
intern/asset_import.cc
|
intern/asset_import.cc
|
||||||
intern/asset_indexer.cc
|
intern/asset_indexer.cc
|
||||||
intern/asset_library_reference.cc
|
|
||||||
intern/asset_library_reference_enum.cc
|
intern/asset_library_reference_enum.cc
|
||||||
intern/asset_list.cc
|
intern/asset_list.cc
|
||||||
intern/asset_mark_clear.cc
|
intern/asset_mark_clear.cc
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \ingroup edasset
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "BLI_hash.hh"
|
|
||||||
|
|
||||||
#include "asset_library_reference.hh"
|
|
||||||
|
|
||||||
namespace blender::ed::asset {
|
|
||||||
|
|
||||||
AssetLibraryReferenceWrapper::AssetLibraryReferenceWrapper(const AssetLibraryReference &reference)
|
|
||||||
: AssetLibraryReference(reference)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const AssetLibraryReferenceWrapper &a, const AssetLibraryReferenceWrapper &b)
|
|
||||||
{
|
|
||||||
return (a.type == b.type) &&
|
|
||||||
((a.type == ASSET_LIBRARY_CUSTOM) ? (a.custom_library_index == b.custom_library_index) :
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t AssetLibraryReferenceWrapper::hash() const
|
|
||||||
{
|
|
||||||
uint64_t hash1 = DefaultHash<decltype(type)>{}(type);
|
|
||||||
if (type != ASSET_LIBRARY_CUSTOM) {
|
|
||||||
return hash1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t hash2 = DefaultHash<decltype(custom_library_index)>{}(custom_library_index);
|
|
||||||
return hash1 ^ (hash2 * 33); /* Copied from DefaultHash for std::pair. */
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace blender::ed::asset
|
|
|
@ -10,25 +10,24 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include "BLI_hash.hh"
|
||||||
|
|
||||||
#include "DNA_asset_types.h"
|
#include "DNA_asset_types.h"
|
||||||
|
|
||||||
namespace blender::ed::asset {
|
inline bool operator==(const AssetLibraryReference &a, const AssetLibraryReference &b)
|
||||||
|
{
|
||||||
|
return (a.type == b.type) &&
|
||||||
|
((a.type == ASSET_LIBRARY_CUSTOM) ? (a.custom_library_index == b.custom_library_index) :
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
namespace blender {
|
||||||
* Wrapper to add logic to the AssetLibraryReference DNA struct.
|
|
||||||
*/
|
|
||||||
class AssetLibraryReferenceWrapper : public AssetLibraryReference {
|
|
||||||
public:
|
|
||||||
/* Intentionally not `explicit`, allow implicit conversion for convenience. Might have to be
|
|
||||||
* NOLINT */
|
|
||||||
AssetLibraryReferenceWrapper(const AssetLibraryReference &reference);
|
|
||||||
~AssetLibraryReferenceWrapper() = default;
|
|
||||||
|
|
||||||
friend bool operator==(const AssetLibraryReferenceWrapper &a,
|
template<> struct DefaultHash<AssetLibraryReference> {
|
||||||
const AssetLibraryReferenceWrapper &b);
|
uint64_t operator()(const AssetLibraryReference &value) const
|
||||||
uint64_t hash() const;
|
{
|
||||||
|
return get_default_hash(value.type, value.custom_library_index);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace blender::ed::asset
|
} // namespace blender
|
||||||
|
|
|
@ -81,7 +81,7 @@ class PreviewTimer {
|
||||||
wmTimer *timer_ = nullptr;
|
wmTimer *timer_ = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void ensureRunning(const bContext *C)
|
void ensure_running(const bContext *C)
|
||||||
{
|
{
|
||||||
if (!timer_) {
|
if (!timer_) {
|
||||||
timer_ = WM_event_timer_add_notifier(
|
timer_ = WM_event_timer_add_notifier(
|
||||||
|
@ -113,20 +113,20 @@ class AssetList : NonCopyable {
|
||||||
|
|
||||||
void setup();
|
void setup();
|
||||||
void fetch(const bContext &C);
|
void fetch(const bContext &C);
|
||||||
void ensurePreviewsJob(const bContext *C);
|
void ensure_previews_job(const bContext *C);
|
||||||
void clear(const bContext *C);
|
void clear(const bContext *C);
|
||||||
|
|
||||||
AssetHandle asset_get_by_index(int index) const;
|
AssetHandle asset_get_by_index(int index) const;
|
||||||
|
|
||||||
bool needsRefetch() const;
|
bool needs_refetch() const;
|
||||||
bool isLoaded() const;
|
bool is_loaded() const;
|
||||||
bool isAssetPreviewLoading(const AssetHandle &asset) const;
|
bool is_asset_preview_loading(const AssetHandle &asset) const;
|
||||||
asset_system::AssetLibrary *asset_library() const;
|
asset_system::AssetLibrary *asset_library() const;
|
||||||
void iterate(AssetListHandleIterFn fn) const;
|
void iterate(AssetListHandleIterFn fn) const;
|
||||||
void iterate(AssetListIterFn fn) const;
|
void iterate(AssetListIterFn fn) const;
|
||||||
int size() const;
|
int size() const;
|
||||||
void tagMainDataDirty() const;
|
void tag_main_data_dirty() const;
|
||||||
void remapID(ID *id_old, ID *id_new) const;
|
void remap_id(ID *id_old, ID *id_new) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
AssetList::AssetList(eFileSelectType filesel_type, const AssetLibraryReference &asset_library_ref)
|
AssetList::AssetList(eFileSelectType filesel_type, const AssetLibraryReference &asset_library_ref)
|
||||||
|
@ -183,17 +183,17 @@ void AssetList::fetch(const bContext &C)
|
||||||
filelist_filter(files);
|
filelist_filter(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssetList::needsRefetch() const
|
bool AssetList::needs_refetch() const
|
||||||
{
|
{
|
||||||
return filelist_needs_force_reset(filelist_) || filelist_needs_reading(filelist_);
|
return filelist_needs_force_reset(filelist_) || filelist_needs_reading(filelist_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssetList::isLoaded() const
|
bool AssetList::is_loaded() const
|
||||||
{
|
{
|
||||||
return filelist_is_ready(filelist_);
|
return filelist_is_ready(filelist_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssetList::isAssetPreviewLoading(const AssetHandle &asset) const
|
bool AssetList::is_asset_preview_loading(const AssetHandle &asset) const
|
||||||
{
|
{
|
||||||
return filelist_file_is_preview_pending(filelist_, asset.file_data);
|
return filelist_file_is_preview_pending(filelist_, asset.file_data);
|
||||||
}
|
}
|
||||||
|
@ -224,13 +224,13 @@ void AssetList::iterate(AssetListHandleIterFn fn) const
|
||||||
|
|
||||||
void AssetList::iterate(AssetListIterFn fn) const
|
void AssetList::iterate(AssetListIterFn fn) const
|
||||||
{
|
{
|
||||||
iterate([&fn](AssetHandle handle) {
|
this->iterate([&fn](AssetHandle handle) {
|
||||||
auto &asset = reinterpret_cast<asset_system::AssetRepresentation &>(*handle.file_data->asset);
|
auto &asset = reinterpret_cast<asset_system::AssetRepresentation &>(*handle.file_data->asset);
|
||||||
return fn(asset);
|
return fn(asset);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetList::ensurePreviewsJob(const bContext *C)
|
void AssetList::ensure_previews_job(const bContext *C)
|
||||||
{
|
{
|
||||||
FileList *files = filelist_;
|
FileList *files = filelist_;
|
||||||
int numfiles = filelist_files_ensure(files);
|
int numfiles = filelist_files_ensure(files);
|
||||||
|
@ -246,7 +246,7 @@ void AssetList::ensurePreviewsJob(const bContext *C)
|
||||||
const bool previews_running = filelist_cache_previews_running(files) &&
|
const bool previews_running = filelist_cache_previews_running(files) &&
|
||||||
!filelist_cache_previews_done(files);
|
!filelist_cache_previews_done(files);
|
||||||
if (previews_running) {
|
if (previews_running) {
|
||||||
previews_timer_.ensureRunning(C);
|
previews_timer_.ensure_running(C);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Preview is not running, no need to keep generating update events! */
|
/* Preview is not running, no need to keep generating update events! */
|
||||||
|
@ -306,19 +306,19 @@ int AssetList::size() const
|
||||||
return filelist_files_ensure(filelist_);
|
return filelist_files_ensure(filelist_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetList::tagMainDataDirty() const
|
void AssetList::tag_main_data_dirty() const
|
||||||
{
|
{
|
||||||
if (filelist_needs_reset_on_main_changes(filelist_)) {
|
if (filelist_needs_reset_on_main_changes(filelist_)) {
|
||||||
filelist_tag_force_reset_mainfiles(filelist_);
|
filelist_tag_force_reset_mainfiles(filelist_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetList::remapID(ID * /*id_old*/, ID * /*id_new*/) const
|
void AssetList::remap_id(ID * /*id_old*/, ID * /*id_new*/) const
|
||||||
{
|
{
|
||||||
/* Trigger full re-fetch of the file list if main data was changed, don't even attempt remap
|
/* Trigger full re-fetch of the file list if main data was changed, don't even attempt remap
|
||||||
* pointers. We could give file list types a id-remap callback, but it's probably not worth it.
|
* pointers. We could give file list types a id-remap callback, but it's probably not worth it.
|
||||||
* Refreshing local file lists is relatively cheap. */
|
* Refreshing local file lists is relatively cheap. */
|
||||||
tagMainDataDirty();
|
this->tag_main_data_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -331,7 +331,7 @@ void AssetList::remapID(ID * /*id_old*/, ID * /*id_new*/) const
|
||||||
* Class managing a global asset list map, each entry being a list for a specific asset library.
|
* Class managing a global asset list map, each entry being a list for a specific asset library.
|
||||||
*/
|
*/
|
||||||
class AssetListStorage {
|
class AssetListStorage {
|
||||||
using AssetListMap = Map<AssetLibraryReferenceWrapper, AssetList>;
|
using AssetListMap = Map<AssetLibraryReference, AssetList>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* Purely static class, can't instantiate this. */
|
/* Purely static class, can't instantiate this. */
|
||||||
|
@ -340,8 +340,8 @@ class AssetListStorage {
|
||||||
static void fetch_library(const AssetLibraryReference &library_reference, const bContext &C);
|
static void fetch_library(const AssetLibraryReference &library_reference, const bContext &C);
|
||||||
static void destruct();
|
static void destruct();
|
||||||
static AssetList *lookup_list(const AssetLibraryReference &library_ref);
|
static AssetList *lookup_list(const AssetLibraryReference &library_ref);
|
||||||
static void tagMainDataDirty();
|
static void tag_main_data_dirty();
|
||||||
static void remapID(ID *id_new, ID *id_old);
|
static void remap_id(ID *id_new, ID *id_old);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::optional<eFileSelectType> asset_library_reference_to_fileselect_type(
|
static std::optional<eFileSelectType> asset_library_reference_to_fileselect_type(
|
||||||
|
@ -363,7 +363,7 @@ void AssetListStorage::fetch_library(const AssetLibraryReference &library_refere
|
||||||
}
|
}
|
||||||
|
|
||||||
auto [list, is_new] = ensure_list_storage(library_reference, *filesel_type);
|
auto [list, is_new] = ensure_list_storage(library_reference, *filesel_type);
|
||||||
if (is_new || list.needsRefetch()) {
|
if (is_new || list.needs_refetch()) {
|
||||||
list.setup();
|
list.setup();
|
||||||
list.fetch(C);
|
list.fetch(C);
|
||||||
}
|
}
|
||||||
|
@ -379,17 +379,17 @@ AssetList *AssetListStorage::lookup_list(const AssetLibraryReference &library_re
|
||||||
return global_storage().lookup_ptr(library_ref);
|
return global_storage().lookup_ptr(library_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetListStorage::tagMainDataDirty()
|
void AssetListStorage::tag_main_data_dirty()
|
||||||
{
|
{
|
||||||
for (AssetList &list : global_storage().values()) {
|
for (AssetList &list : global_storage().values()) {
|
||||||
list.tagMainDataDirty();
|
list.tag_main_data_dirty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetListStorage::remapID(ID *id_new, ID *id_old)
|
void AssetListStorage::remap_id(ID *id_new, ID *id_old)
|
||||||
{
|
{
|
||||||
for (AssetList &list : global_storage().values()) {
|
for (AssetList &list : global_storage().values()) {
|
||||||
list.remapID(id_new, id_old);
|
list.remap_id(id_new, id_old);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,10 +461,10 @@ bool is_loaded(const AssetLibraryReference *library_reference)
|
||||||
if (!list) {
|
if (!list) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (list->needsRefetch()) {
|
if (list->needs_refetch()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return list->isLoaded();
|
return list->is_loaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ensure_previews_job(const AssetLibraryReference *library_reference, const bContext *C)
|
void ensure_previews_job(const AssetLibraryReference *library_reference, const bContext *C)
|
||||||
|
@ -472,7 +472,7 @@ void ensure_previews_job(const AssetLibraryReference *library_reference, const b
|
||||||
|
|
||||||
AssetList *list = AssetListStorage::lookup_list(*library_reference);
|
AssetList *list = AssetListStorage::lookup_list(*library_reference);
|
||||||
if (list) {
|
if (list) {
|
||||||
list->ensurePreviewsJob(C);
|
list->ensure_previews_job(C);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -533,7 +533,7 @@ bool asset_image_is_loading(const AssetLibraryReference *library_reference,
|
||||||
const AssetHandle *asset_handle)
|
const AssetHandle *asset_handle)
|
||||||
{
|
{
|
||||||
const AssetList *list = AssetListStorage::lookup_list(*library_reference);
|
const AssetList *list = AssetListStorage::lookup_list(*library_reference);
|
||||||
return list->isAssetPreviewLoading(*asset_handle);
|
return list->is_asset_preview_loading(*asset_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImBuf *asset_image_get(const AssetHandle *asset_handle)
|
ImBuf *asset_image_get(const AssetHandle *asset_handle)
|
||||||
|
@ -562,12 +562,12 @@ int size(const AssetLibraryReference *library_reference)
|
||||||
|
|
||||||
void storage_tag_main_data_dirty()
|
void storage_tag_main_data_dirty()
|
||||||
{
|
{
|
||||||
AssetListStorage::tagMainDataDirty();
|
AssetListStorage::tag_main_data_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void storage_id_remap(ID *id_old, ID *id_new)
|
void storage_id_remap(ID *id_old, ID *id_new)
|
||||||
{
|
{
|
||||||
AssetListStorage::remapID(id_old, id_new);
|
AssetListStorage::remap_id(id_old, id_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
void storage_exit()
|
void storage_exit()
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include "GPU_matrix.h"
|
#include "GPU_matrix.h"
|
||||||
#include "GPU_shader_shared.h"
|
#include "GPU_shader_shared.h"
|
||||||
#include "GPU_state.h"
|
#include "GPU_state.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "ED_gpencil_legacy.hh"
|
#include "ED_gpencil_legacy.hh"
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,8 @@ enum eV3DDepthOverrideMode {
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Redraw the viewport depth buffer.
|
* Redraw the viewport depth buffer.
|
||||||
|
* Call #view3d_has_depth_buffer_being_used if you want to check if the viewport already has depth
|
||||||
|
* buffer updated.
|
||||||
*/
|
*/
|
||||||
void ED_view3d_depth_override(Depsgraph *depsgraph,
|
void ED_view3d_depth_override(Depsgraph *depsgraph,
|
||||||
ARegion *region,
|
ARegion *region,
|
||||||
|
@ -209,6 +211,8 @@ bool ED_view3d_depth_unproject_v3(const ARegion *region,
|
||||||
double depth,
|
double depth,
|
||||||
float r_location_world[3]);
|
float r_location_world[3]);
|
||||||
|
|
||||||
|
bool ED_view3d_has_depth_buffer_being_used(const Depsgraph *depsgraph, const View3D *v3d);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities to perform navigation.
|
* Utilities to perform navigation.
|
||||||
* Call `ED_view3d_navigation_init` to create a context and `ED_view3d_navigation_do` to perform
|
* Call `ED_view3d_navigation_init` to create a context and `ED_view3d_navigation_do` to perform
|
||||||
|
@ -850,18 +854,16 @@ void ED_view3d_autodist_last_clear(wmWindow *win);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the world-space 3d location from a screen-space 2d point.
|
* Get the world-space 3d location from a screen-space 2d point.
|
||||||
* TODO: Implement #alphaoverride. We don't want to zoom into billboards.
|
* It may be useful to call #ED_view3d_depth_override before.
|
||||||
*
|
*
|
||||||
* \param mval: Input screen-space pixel location.
|
* \param mval: Input screen-space pixel location.
|
||||||
* \param mouse_worldloc: Output world-space location.
|
* \param mouse_worldloc: Output world-space location.
|
||||||
* \param fallback_depth_pt: Use this points depth when no depth can be found.
|
* \param fallback_depth_pt: Use this points depth when no depth can be found.
|
||||||
*/
|
*/
|
||||||
bool ED_view3d_autodist(Depsgraph *depsgraph,
|
bool ED_view3d_autodist(ARegion *region,
|
||||||
ARegion *region,
|
|
||||||
View3D *v3d,
|
View3D *v3d,
|
||||||
const int mval[2],
|
const int mval[2],
|
||||||
float mouse_worldloc[3],
|
float mouse_worldloc[3],
|
||||||
bool alphaoverride,
|
|
||||||
const float fallback_depth_pt[3]);
|
const float fallback_depth_pt[3]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -179,7 +179,10 @@ static void depthdropper_depth_sample_pt(bContext *C,
|
||||||
|
|
||||||
view3d_operator_needs_opengl(C);
|
view3d_operator_needs_opengl(C);
|
||||||
|
|
||||||
if (ED_view3d_autodist(depsgraph, region, v3d, mval, co, true, nullptr)) {
|
/* Ensure the depth buffer is updated for #ED_view3d_autodist. */
|
||||||
|
ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr);
|
||||||
|
|
||||||
|
if (ED_view3d_autodist(region, v3d, mval, co, nullptr)) {
|
||||||
const float mval_center_fl[2] = {float(region->winx) / 2, float(region->winy) / 2};
|
const float mval_center_fl[2] = {float(region->winx) / 2, float(region->winy) / 2};
|
||||||
float co_align[3];
|
float co_align[3];
|
||||||
|
|
||||||
|
|
|
@ -2392,6 +2392,8 @@ int UI_icon_from_idcode(const int idcode)
|
||||||
switch ((ID_Type)idcode) {
|
switch ((ID_Type)idcode) {
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
return ICON_ACTION;
|
return ICON_ACTION;
|
||||||
|
case ID_AN:
|
||||||
|
return ICON_ACTION; /* TODO: give Animation its own icon. */
|
||||||
case ID_AR:
|
case ID_AR:
|
||||||
return ICON_ARMATURE_DATA;
|
return ICON_ARMATURE_DATA;
|
||||||
case ID_BR:
|
case ID_BR:
|
||||||
|
|
|
@ -1119,6 +1119,8 @@ static const char *template_id_browse_tip(const StructRNA *type)
|
||||||
return N_("Browse Armature data to be linked");
|
return N_("Browse Armature data to be linked");
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
return N_("Browse Action to be linked");
|
return N_("Browse Action to be linked");
|
||||||
|
case ID_AN:
|
||||||
|
return N_("Browse Animation to be linked");
|
||||||
case ID_NT:
|
case ID_NT:
|
||||||
return N_("Browse Node Tree to be linked");
|
return N_("Browse Node Tree to be linked");
|
||||||
case ID_BR:
|
case ID_BR:
|
||||||
|
|
|
@ -317,8 +317,7 @@ void OBJECT_OT_hide_view_clear(wmOperatorType *ot)
|
||||||
/* flags */
|
/* flags */
|
||||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
|
||||||
PropertyRNA *prop = RNA_def_boolean(ot->srna, "select", true, "Select", "");
|
RNA_def_boolean(ot->srna, "select", true, "Select", "");
|
||||||
RNA_def_property_flag(prop, PropertyFlag(PROP_SKIP_SAVE | PROP_HIDDEN));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int object_hide_view_set_exec(bContext *C, wmOperator *op)
|
static int object_hide_view_set_exec(bContext *C, wmOperator *op)
|
||||||
|
|
|
@ -616,6 +616,7 @@ static int gather_frames_to_render_for_id(LibraryIDLinkCallbackData *cb_data)
|
||||||
case ID_SCR: /* Screen */
|
case ID_SCR: /* Screen */
|
||||||
case ID_GR: /* Group */
|
case ID_GR: /* Group */
|
||||||
case ID_AC: /* bAction */
|
case ID_AC: /* bAction */
|
||||||
|
case ID_AN: /* Animation */
|
||||||
case ID_BR: /* Brush */
|
case ID_BR: /* Brush */
|
||||||
case ID_WM: /* WindowManager */
|
case ID_WM: /* WindowManager */
|
||||||
case ID_LS: /* FreestyleLineStyle */
|
case ID_LS: /* FreestyleLineStyle */
|
||||||
|
|
|
@ -382,6 +382,17 @@ struct EraseOperationExecutor {
|
||||||
float factor;
|
float factor;
|
||||||
bool is_src_point;
|
bool is_src_point;
|
||||||
bool is_cut;
|
bool is_cut;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Source point is the last of the curve.
|
||||||
|
*/
|
||||||
|
bool is_src_end_point() const
|
||||||
|
{
|
||||||
|
/* The src_next_point index increments for all points except the last, where it is set to the
|
||||||
|
* first point index. This can be used to detect the curve end from the source index alone.
|
||||||
|
*/
|
||||||
|
return is_src_point && src_point >= src_next_point;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -547,18 +558,16 @@ struct EraseOperationExecutor {
|
||||||
threading::parallel_for(dst.curves_range(), 4096, [&](const IndexRange dst_curves) {
|
threading::parallel_for(dst.curves_range(), 4096, [&](const IndexRange dst_curves) {
|
||||||
for (const int dst_curve : dst_curves) {
|
for (const int dst_curve : dst_curves) {
|
||||||
const IndexRange dst_curve_points = dst_points_by_curve[dst_curve];
|
const IndexRange dst_curve_points = dst_points_by_curve[dst_curve];
|
||||||
if (dst_transfer_data[dst_curve_points.first()].is_cut) {
|
const PointTransferData &start_point_transfer =
|
||||||
|
dst_transfer_data[dst_curve_points.first()];
|
||||||
|
const PointTransferData &end_point_transfer = dst_transfer_data[dst_curve_points.last()];
|
||||||
|
|
||||||
|
if (start_point_transfer.is_cut) {
|
||||||
dst_start_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
|
dst_start_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
|
||||||
}
|
}
|
||||||
|
/* The is_cut flag does not work for end points, but any end point that isn't the source
|
||||||
if (dst_curve == dst_curves.last()) {
|
* point must also be a cut. */
|
||||||
continue;
|
if (!end_point_transfer.is_src_end_point()) {
|
||||||
}
|
|
||||||
|
|
||||||
const PointTransferData &next_point_transfer =
|
|
||||||
dst_transfer_data[dst_points_by_curve[dst_curve + 1].first()];
|
|
||||||
|
|
||||||
if (next_point_transfer.is_cut) {
|
|
||||||
dst_end_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
|
dst_end_caps.span[dst_curve] = GP_STROKE_CAP_TYPE_FLAT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -537,7 +537,11 @@ static void hide_show_begin(bContext *C, gesture::GestureData * /*gesture_data*/
|
||||||
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
|
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
|
||||||
|
|
||||||
PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob);
|
PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob);
|
||||||
|
#ifndef NDEBUG
|
||||||
BLI_assert(BKE_object_sculpt_pbvh_get(ob) == pbvh);
|
BLI_assert(BKE_object_sculpt_pbvh_get(ob) == pbvh);
|
||||||
|
#else
|
||||||
|
(void)pbvh;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hide_show_apply_for_symmetry_pass(bContext *C, gesture::GestureData *gesture_data)
|
static void hide_show_apply_for_symmetry_pass(bContext *C, gesture::GestureData *gesture_data)
|
||||||
|
|
|
@ -5800,7 +5800,10 @@ void paint_proj_stroke(const bContext *C,
|
||||||
|
|
||||||
view3d_operator_needs_opengl(C);
|
view3d_operator_needs_opengl(C);
|
||||||
|
|
||||||
if (!ED_view3d_autodist(depsgraph, region, v3d, mval_i, cursor, false, nullptr)) {
|
/* Ensure the depth buffer is updated for #ED_view3d_autodist. */
|
||||||
|
ED_view3d_depth_override(depsgraph, region, v3d, nullptr, V3D_DEPTH_NO_GPENCIL, nullptr);
|
||||||
|
|
||||||
|
if (!ED_view3d_autodist(region, v3d, mval_i, cursor, nullptr)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -808,8 +808,8 @@ static void action_id_remap(ScrArea * /*area*/,
|
||||||
{
|
{
|
||||||
SpaceAction *sact = (SpaceAction *)slink;
|
SpaceAction *sact = (SpaceAction *)slink;
|
||||||
|
|
||||||
mappings.apply((ID **)&sact->action, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&sact->action), ID_REMAP_APPLY_DEFAULT);
|
||||||
mappings.apply((ID **)&sact->ads.filter_grp, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&sact->ads.filter_grp), ID_REMAP_APPLY_DEFAULT);
|
||||||
mappings.apply(&sact->ads.source, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(&sact->ads.source, ID_REMAP_APPLY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -901,7 +901,7 @@ static void buttons_id_remap(ScrArea * /*area*/,
|
||||||
|
|
||||||
if (sbuts->texuser) {
|
if (sbuts->texuser) {
|
||||||
ButsContextTexture *ct = static_cast<ButsContextTexture *>(sbuts->texuser);
|
ButsContextTexture *ct = static_cast<ButsContextTexture *>(sbuts->texuser);
|
||||||
mappings.apply((ID **)&ct->texture, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&ct->texture), ID_REMAP_APPLY_DEFAULT);
|
||||||
BLI_freelistN(&ct->users);
|
BLI_freelistN(&ct->users);
|
||||||
ct->user = nullptr;
|
ct->user = nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1161,8 +1161,8 @@ static void clip_id_remap(ScrArea * /*area*/,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mappings.apply((ID **)&sclip->clip, ID_REMAP_APPLY_ENSURE_REAL);
|
mappings.apply(reinterpret_cast<ID **>(&sclip->clip), ID_REMAP_APPLY_ENSURE_REAL);
|
||||||
mappings.apply((ID **)&sclip->mask_info.mask, ID_REMAP_APPLY_ENSURE_REAL);
|
mappings.apply(reinterpret_cast<ID **>(&sclip->mask_info.mask), ID_REMAP_APPLY_ENSURE_REAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clip_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void clip_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
|
@ -821,8 +821,8 @@ static void graph_id_remap(ScrArea * /*area*/,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mappings.apply((ID **)&sgraph->ads->filter_grp, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&sgraph->ads->filter_grp), ID_REMAP_APPLY_DEFAULT);
|
||||||
mappings.apply((ID **)&sgraph->ads->source, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&sgraph->ads->source), ID_REMAP_APPLY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void graph_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void graph_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
|
@ -1017,9 +1017,9 @@ static void image_id_remap(ScrArea * /*area*/,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mappings.apply((ID **)&simg->image, ID_REMAP_APPLY_ENSURE_REAL);
|
mappings.apply(reinterpret_cast<ID **>(&simg->image), ID_REMAP_APPLY_ENSURE_REAL);
|
||||||
mappings.apply((ID **)&simg->gpd, ID_REMAP_APPLY_UPDATE_REFCOUNT);
|
mappings.apply(reinterpret_cast<ID **>(&simg->gpd), ID_REMAP_APPLY_UPDATE_REFCOUNT);
|
||||||
mappings.apply((ID **)&simg->mask_info.mask, ID_REMAP_APPLY_ENSURE_REAL);
|
mappings.apply(reinterpret_cast<ID **>(&simg->mask_info.mask), ID_REMAP_APPLY_ENSURE_REAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void image_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void image_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
#include "GPU_platform.h"
|
#include "GPU_platform.h"
|
||||||
#include "GPU_shader_shared.h"
|
#include "GPU_shader_shared.h"
|
||||||
#include "GPU_state.h"
|
#include "GPU_state.h"
|
||||||
#include "GPU_uniform_buffer.h"
|
#include "GPU_uniform_buffer.hh"
|
||||||
|
|
||||||
#include "DRW_engine.hh"
|
#include "DRW_engine.hh"
|
||||||
|
|
||||||
|
|
|
@ -1150,10 +1150,8 @@ static void node_widgets()
|
||||||
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_corner_pin);
|
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_corner_pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_id_remap_cb(ID *old_id, ID *new_id, void *user_data)
|
static void node_id_remap(ID *old_id, ID *new_id, SpaceNode *snode)
|
||||||
{
|
{
|
||||||
SpaceNode *snode = static_cast<SpaceNode *>(user_data);
|
|
||||||
|
|
||||||
if (snode->id == old_id) {
|
if (snode->id == old_id) {
|
||||||
/* nasty DNA logic for SpaceNode:
|
/* nasty DNA logic for SpaceNode:
|
||||||
* ideally should be handled by editor code, but would be bad level call
|
* ideally should be handled by editor code, but would be bad level call
|
||||||
|
@ -1240,7 +1238,9 @@ static void node_id_remap(ScrArea * /*area*/,
|
||||||
* We could also move a remap address at a time to use the IDRemapper as that should get closer
|
* We could also move a remap address at a time to use the IDRemapper as that should get closer
|
||||||
* to cleaner code. See {D13615} for more information about this topic.
|
* to cleaner code. See {D13615} for more information about this topic.
|
||||||
*/
|
*/
|
||||||
mappings.iter(node_id_remap_cb, slink);
|
mappings.iter([&](ID *old_id, ID *new_id) {
|
||||||
|
node_id_remap(old_id, new_id, reinterpret_cast<SpaceNode *>(slink));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void node_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
|
@ -2433,6 +2433,8 @@ static BIFIconID tree_element_get_icon_from_id(const ID *id)
|
||||||
return ICON_WORLD_DATA;
|
return ICON_WORLD_DATA;
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
return ICON_ACTION;
|
return ICON_ACTION;
|
||||||
|
case ID_AN:
|
||||||
|
return ICON_ACTION; /* TODO: give Animation its own icon. */
|
||||||
case ID_NLA:
|
case ID_NLA:
|
||||||
return ICON_NLA;
|
return ICON_NLA;
|
||||||
case ID_TXT: {
|
case ID_TXT: {
|
||||||
|
|
|
@ -139,6 +139,7 @@ struct TreeElementIcon {
|
||||||
ID_GR, \
|
ID_GR, \
|
||||||
ID_AR, \
|
ID_AR, \
|
||||||
ID_AC, \
|
ID_AC, \
|
||||||
|
ID_AN, \
|
||||||
ID_BR, \
|
ID_BR, \
|
||||||
ID_PA, \
|
ID_PA, \
|
||||||
ID_GD_LEGACY, \
|
ID_GD_LEGACY, \
|
||||||
|
|
|
@ -147,6 +147,7 @@ static void get_element_operation_type(
|
||||||
case ID_KE:
|
case ID_KE:
|
||||||
case ID_WO:
|
case ID_WO:
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
|
case ID_AN:
|
||||||
case ID_TXT:
|
case ID_TXT:
|
||||||
case ID_GR:
|
case ID_GR:
|
||||||
case ID_LS:
|
case ID_LS:
|
||||||
|
|
|
@ -100,10 +100,10 @@ class OverrideIDHierarchyBuilder {
|
||||||
const ID &override_root_id_;
|
const ID &override_root_id_;
|
||||||
/* The ancestor IDs leading to the current ID, to avoid IDs recursing into themselves. Changes
|
/* The ancestor IDs leading to the current ID, to avoid IDs recursing into themselves. Changes
|
||||||
* with every level of recursion. */
|
* with every level of recursion. */
|
||||||
Set<const ID *> parent_ids{};
|
Set<const ID *> parent_ids;
|
||||||
/* The IDs that were already added to #parent_te, to avoid duplicates. Entirely new set with
|
/* The IDs that were already added to #parent_te, to avoid duplicates. Entirely new set with
|
||||||
* every level of recursion. */
|
* every level of recursion. */
|
||||||
Set<const ID *> sibling_ids{};
|
Set<const ID *> sibling_ids;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -88,6 +88,7 @@ std::unique_ptr<TreeElementID> TreeElementID::create_from_id(TreeElement &legacy
|
||||||
case ID_TXT:
|
case ID_TXT:
|
||||||
case ID_SO:
|
case ID_SO:
|
||||||
case ID_AC:
|
case ID_AC:
|
||||||
|
case ID_AN:
|
||||||
case ID_PAL:
|
case ID_PAL:
|
||||||
case ID_PC:
|
case ID_PC:
|
||||||
case ID_CF:
|
case ID_CF:
|
||||||
|
|
|
@ -915,7 +915,7 @@ static void sequencer_id_remap(ScrArea * /*area*/,
|
||||||
const blender::bke::id::IDRemapper &mappings)
|
const blender::bke::id::IDRemapper &mappings)
|
||||||
{
|
{
|
||||||
SpaceSeq *sseq = (SpaceSeq *)slink;
|
SpaceSeq *sseq = (SpaceSeq *)slink;
|
||||||
mappings.apply((ID **)&sseq->gpd, ID_REMAP_APPLY_DEFAULT);
|
mappings.apply(reinterpret_cast<ID **>(&sseq->gpd), ID_REMAP_APPLY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sequencer_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void sequencer_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
|
@ -394,7 +394,7 @@ static void text_id_remap(ScrArea * /*area*/,
|
||||||
const blender::bke::id::IDRemapper &mappings)
|
const blender::bke::id::IDRemapper &mappings)
|
||||||
{
|
{
|
||||||
SpaceText *stext = (SpaceText *)slink;
|
SpaceText *stext = (SpaceText *)slink;
|
||||||
mappings.apply((ID **)&stext->text, ID_REMAP_APPLY_ENSURE_REAL);
|
mappings.apply(reinterpret_cast<ID **>(&stext->text), ID_REMAP_APPLY_ENSURE_REAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void text_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
static void text_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue