RNA: support compiling rna files as C++ code #108290

Merged
Jacques Lucke merged 29 commits from JacquesLucke/blender:rna-cpp into main 2023-06-09 11:45:46 +02:00
37 changed files with 194 additions and 161 deletions
Showing only changes of commit 741cba8392 - Show all commits

View File

@ -374,7 +374,7 @@ def external_script_add_origin_if_needed(args: argparse.Namespace,
# - Rename remote "upstream" to "origin", which takes care of changing the names of # - Rename remote "upstream" to "origin", which takes care of changing the names of
# remotes the local branches are tracking. # remotes the local branches are tracking.
# #
# - Change the URL to the "origin", which so was was still pointing to upstream. # - Change the URL to the "origin", which was still pointing to upstream.
# #
# - Re-introduce the "upstream" remote, with the same URL as it had prior to rename. # - Re-introduce the "upstream" remote, with the same URL as it had prior to rename.

View File

@ -24,3 +24,4 @@ Several people provided fixes:
- Aaron Carlisle - Aaron Carlisle
- Sebastian Parborg - Sebastian Parborg
- Leon Zandman - Leon Zandman
- Richard Antalik

View File

@ -124,7 +124,7 @@ Device_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
} }
PyDoc_STRVAR(M_aud_Device_lock_doc, PyDoc_STRVAR(M_aud_Device_lock_doc,
".. classmethod:: lock()\n\n" ".. method:: lock()\n\n"
" Locks the device so that it's guaranteed, that no samples are\n" " Locks the device so that it's guaranteed, that no samples are\n"
" read from the streams until :meth:`unlock` is called.\n" " read from the streams until :meth:`unlock` is called.\n"
" This is useful if you want to do start/stop/pause/resume some\n" " This is useful if you want to do start/stop/pause/resume some\n"
@ -152,7 +152,7 @@ Device_lock(Device* self)
} }
PyDoc_STRVAR(M_aud_Device_play_doc, PyDoc_STRVAR(M_aud_Device_play_doc,
".. classmethod:: play(sound, keep=False)\n\n" ".. method:: play(sound, keep=False)\n\n"
" Plays a sound.\n\n" " Plays a sound.\n\n"
" :arg sound: The sound to play.\n" " :arg sound: The sound to play.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -212,7 +212,7 @@ Device_play(Device* self, PyObject* args, PyObject* kwds)
} }
PyDoc_STRVAR(M_aud_Device_stopAll_doc, PyDoc_STRVAR(M_aud_Device_stopAll_doc,
".. classmethod:: stopAll()\n\n" ".. method:: stopAll()\n\n"
" Stops all playing and paused sounds."); " Stops all playing and paused sounds.");
static PyObject * static PyObject *
@ -231,7 +231,7 @@ Device_stopAll(Device* self)
} }
PyDoc_STRVAR(M_aud_Device_unlock_doc, PyDoc_STRVAR(M_aud_Device_unlock_doc,
".. classmethod:: unlock()\n\n" ".. method:: unlock()\n\n"
" Unlocks the device after a lock call, see :meth:`lock` for\n" " Unlocks the device after a lock call, see :meth:`lock` for\n"
" details."); " details.");

View File

@ -60,7 +60,7 @@ DynamicMusic_dealloc(DynamicMusicP* self)
} }
PyDoc_STRVAR(M_aud_DynamicMusic_addScene_doc, PyDoc_STRVAR(M_aud_DynamicMusic_addScene_doc,
".. classmethod:: addScene(scene)\n\n" ".. method:: addScene(scene)\n\n"
" Adds a new scene.\n\n" " Adds a new scene.\n\n"
" :arg scene: The scene sound.\n" " :arg scene: The scene sound.\n"
" :type scene: :class:`Sound`\n" " :type scene: :class:`Sound`\n"
@ -90,7 +90,7 @@ DynamicMusic_addScene(DynamicMusicP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_DynamicMusic_addTransition_doc, PyDoc_STRVAR(M_aud_DynamicMusic_addTransition_doc,
".. classmethod:: addTransition(ini, end, transition)\n\n" ".. method:: addTransition(ini, end, transition)\n\n"
" Adds a new scene.\n\n" " Adds a new scene.\n\n"
" :arg ini: the initial scene foor the transition.\n" " :arg ini: the initial scene foor the transition.\n"
" :type ini: int\n" " :type ini: int\n"
@ -125,7 +125,7 @@ DynamicMusic_addTransition(DynamicMusicP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_DynamicMusic_resume_doc, PyDoc_STRVAR(M_aud_DynamicMusic_resume_doc,
".. classmethod:: resume()\n\n" ".. method:: resume()\n\n"
" Resumes playback of the scene.\n\n" " Resumes playback of the scene.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool"); " :rtype: bool");
@ -145,7 +145,7 @@ DynamicMusic_resume(DynamicMusicP* self)
} }
PyDoc_STRVAR(M_aud_DynamicMusic_pause_doc, PyDoc_STRVAR(M_aud_DynamicMusic_pause_doc,
".. classmethod:: pause()\n\n" ".. method:: pause()\n\n"
" Pauses playback of the scene.\n\n" " Pauses playback of the scene.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool"); " :rtype: bool");
@ -165,7 +165,7 @@ DynamicMusic_pause(DynamicMusicP* self)
} }
PyDoc_STRVAR(M_aud_DynamicMusic_stop_doc, PyDoc_STRVAR(M_aud_DynamicMusic_stop_doc,
".. classmethod:: stop()\n\n" ".. method:: stop()\n\n"
" Stops playback of the scene.\n\n" " Stops playback of the scene.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool\n\n"); " :rtype: bool\n\n");

View File

@ -54,7 +54,7 @@ HRTF_dealloc(HRTFP* self)
} }
PyDoc_STRVAR(M_aud_HRTF_addImpulseResponse_doc, PyDoc_STRVAR(M_aud_HRTF_addImpulseResponse_doc,
".. classmethod:: addImpulseResponseFromSound(sound, azimuth, elevation)\n\n" ".. method:: addImpulseResponseFromSound(sound, azimuth, elevation)\n\n"
" Adds a new hrtf to the HRTF object\n\n" " Adds a new hrtf to the HRTF object\n\n"
" :arg sound: The sound that contains the hrtf.\n" " :arg sound: The sound that contains the hrtf.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -90,7 +90,7 @@ HRTF_addImpulseResponseFromSound(HRTFP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_HRTF_loadLeftHrtfSet_doc, PyDoc_STRVAR(M_aud_HRTF_loadLeftHrtfSet_doc,
".. classmethod:: loadLeftHrtfSet(extension, directory)\n\n" ".. method:: loadLeftHrtfSet(extension, directory)\n\n"
" Loads all HRTFs from a directory.\n\n" " Loads all HRTFs from a directory.\n\n"
" :arg extension: The file extension of the hrtfs.\n" " :arg extension: The file extension of the hrtfs.\n"
" :type extension: string\n" " :type extension: string\n"
@ -125,7 +125,7 @@ HRTF_loadLeftHrtfSet(PyTypeObject* type, PyObject* args)
} }
PyDoc_STRVAR(M_aud_HRTF_loadRightHrtfSet_doc, PyDoc_STRVAR(M_aud_HRTF_loadRightHrtfSet_doc,
".. classmethod:: loadLeftHrtfSet(extension, directory)\n\n" ".. method:: loadLeftHrtfSet(extension, directory)\n\n"
" Loads all HRTFs from a directory.\n\n" " Loads all HRTFs from a directory.\n\n"
" :arg extension: The file extension of the hrtfs.\n" " :arg extension: The file extension of the hrtfs.\n"
" :type extension: string\n" " :type extension: string\n"

View File

@ -38,7 +38,7 @@ Handle_dealloc(Handle* self)
} }
PyDoc_STRVAR(M_aud_Handle_pause_doc, PyDoc_STRVAR(M_aud_Handle_pause_doc,
".. classmethod:: pause()\n\n" ".. method:: pause()\n\n"
" Pauses playback.\n\n" " Pauses playback.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool"); " :rtype: bool");
@ -58,7 +58,7 @@ Handle_pause(Handle* self)
} }
PyDoc_STRVAR(M_aud_Handle_resume_doc, PyDoc_STRVAR(M_aud_Handle_resume_doc,
".. classmethod:: resume()\n\n" ".. method:: resume()\n\n"
" Resumes playback.\n\n" " Resumes playback.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool"); " :rtype: bool");
@ -78,7 +78,7 @@ Handle_resume(Handle* self)
} }
PyDoc_STRVAR(M_aud_Handle_stop_doc, PyDoc_STRVAR(M_aud_Handle_stop_doc,
".. classmethod:: stop()\n\n" ".. method:: stop()\n\n"
" Stops playback.\n\n" " Stops playback.\n\n"
" :return: Whether the action succeeded.\n" " :return: Whether the action succeeded.\n"
" :rtype: bool\n\n" " :rtype: bool\n\n"

View File

@ -60,7 +60,7 @@ PlaybackManager_dealloc(PlaybackManagerP* self)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_play_doc, PyDoc_STRVAR(M_aud_PlaybackManager_play_doc,
".. classmethod:: play(sound, catKey)\n\n" ".. method:: play(sound, catKey)\n\n"
" Plays a sound through the playback manager and assigns it to a category.\n\n" " Plays a sound through the playback manager and assigns it to a category.\n\n"
" :arg sound: The sound to play.\n" " :arg sound: The sound to play.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -104,7 +104,7 @@ PlaybackManager_play(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_resume_doc, PyDoc_STRVAR(M_aud_PlaybackManager_resume_doc,
".. classmethod:: resume(catKey)\n\n" ".. method:: resume(catKey)\n\n"
" Resumes playback of the catgory.\n\n" " Resumes playback of the catgory.\n\n"
" :arg catKey: the key of the category.\n" " :arg catKey: the key of the category.\n"
" :type catKey: int\n" " :type catKey: int\n"
@ -131,7 +131,7 @@ PlaybackManager_resume(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_pause_doc, PyDoc_STRVAR(M_aud_PlaybackManager_pause_doc,
".. classmethod:: pause(catKey)\n\n" ".. method:: pause(catKey)\n\n"
" Pauses playback of the category.\n\n" " Pauses playback of the category.\n\n"
" :arg catKey: the key of the category.\n" " :arg catKey: the key of the category.\n"
" :type catKey: int\n" " :type catKey: int\n"
@ -158,7 +158,7 @@ PlaybackManager_pause(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_add_category_doc, PyDoc_STRVAR(M_aud_PlaybackManager_add_category_doc,
".. classmethod:: addCategory(volume)\n\n" ".. method:: addCategory(volume)\n\n"
" Adds a category with a custom volume.\n\n" " Adds a category with a custom volume.\n\n"
" :arg volume: The volume for ther new category.\n" " :arg volume: The volume for ther new category.\n"
" :type volume: float\n" " :type volume: float\n"
@ -185,7 +185,7 @@ PlaybackManager_add_category(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_get_volume_doc, PyDoc_STRVAR(M_aud_PlaybackManager_get_volume_doc,
".. classmethod:: getVolume(catKey)\n\n" ".. method:: getVolume(catKey)\n\n"
" Retrieves the volume of a category.\n\n" " Retrieves the volume of a category.\n\n"
" :arg catKey: the key of the category.\n" " :arg catKey: the key of the category.\n"
" :type catKey: int\n" " :type catKey: int\n"
@ -212,7 +212,7 @@ PlaybackManager_get_volume(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_set_volume_doc, PyDoc_STRVAR(M_aud_PlaybackManager_set_volume_doc,
".. classmethod:: setVolume(volume, catKey)\n\n" ".. method:: setVolume(volume, catKey)\n\n"
" Changes the volume of a category.\n\n" " Changes the volume of a category.\n\n"
" :arg volume: the new volume value.\n" " :arg volume: the new volume value.\n"
" :type volume: float\n" " :type volume: float\n"
@ -242,7 +242,7 @@ PlaybackManager_set_volume(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_stop_doc, PyDoc_STRVAR(M_aud_PlaybackManager_stop_doc,
".. classmethod:: stop(catKey)\n\n" ".. method:: stop(catKey)\n\n"
" Stops playback of the category.\n\n" " Stops playback of the category.\n\n"
" :arg catKey: the key of the category.\n" " :arg catKey: the key of the category.\n"
" :type catKey: int\n" " :type catKey: int\n"
@ -269,7 +269,7 @@ PlaybackManager_stop(PlaybackManagerP* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_PlaybackManager_clean_doc, PyDoc_STRVAR(M_aud_PlaybackManager_clean_doc,
".. classmethod:: clean()\n\n" ".. method:: clean()\n\n"
" Cleans all the invalid and finished sound from the playback manager.\n\n"); " Cleans all the invalid and finished sound from the playback manager.\n\n");
static PyObject * static PyObject *

View File

@ -99,7 +99,7 @@ Sequence_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
} }
PyDoc_STRVAR(M_aud_Sequence_add_doc, PyDoc_STRVAR(M_aud_Sequence_add_doc,
".. classmethod:: add()\n\n" ".. method:: add()\n\n"
" Adds a new entry to the sequence.\n\n" " Adds a new entry to the sequence.\n\n"
" :arg sound: The sound this entry should play.\n" " :arg sound: The sound this entry should play.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -151,7 +151,7 @@ Sequence_add(Sequence* self, PyObject* args, PyObject* kwds)
} }
PyDoc_STRVAR(M_aud_Sequence_remove_doc, PyDoc_STRVAR(M_aud_Sequence_remove_doc,
".. classmethod:: remove()\n\n" ".. method:: remove()\n\n"
" Removes an entry from the sequence.\n\n" " Removes an entry from the sequence.\n\n"
" :arg entry: The entry to remove.\n" " :arg entry: The entry to remove.\n"
" :type entry: :class:`SequenceEntry`\n"); " :type entry: :class:`SequenceEntry`\n");
@ -183,7 +183,7 @@ Sequence_remove(Sequence* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sequence_setAnimationData_doc, PyDoc_STRVAR(M_aud_Sequence_setAnimationData_doc,
".. classmethod:: setAnimationData()\n\n" ".. method:: setAnimationData()\n\n"
" Writes animation data to a sequence.\n\n" " Writes animation data to a sequence.\n\n"
" :arg type: The type of animation data.\n" " :arg type: The type of animation data.\n"
" :type type: int\n" " :type type: int\n"

View File

@ -43,7 +43,7 @@ SequenceEntry_dealloc(SequenceEntry* self)
} }
PyDoc_STRVAR(M_aud_SequenceEntry_move_doc, PyDoc_STRVAR(M_aud_SequenceEntry_move_doc,
".. classmethod:: move()\n\n" ".. method:: move()\n\n"
" Moves the entry.\n\n" " Moves the entry.\n\n"
" :arg begin: The new start time.\n" " :arg begin: The new start time.\n"
" :type begin: double\n" " :type begin: double\n"
@ -73,7 +73,7 @@ SequenceEntry_move(SequenceEntry* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_SequenceEntry_setAnimationData_doc, PyDoc_STRVAR(M_aud_SequenceEntry_setAnimationData_doc,
".. classmethod:: setAnimationData()\n\n" ".. method:: setAnimationData()\n\n"
" Writes animation data to a sequenced entry.\n\n" " Writes animation data to a sequenced entry.\n\n"
" :arg type: The type of animation data.\n" " :arg type: The type of animation data.\n"
" :type type: int\n" " :type type: int\n"

View File

@ -115,7 +115,7 @@ Sound_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
} }
PyDoc_STRVAR(M_aud_Sound_data_doc, PyDoc_STRVAR(M_aud_Sound_data_doc,
".. classmethod:: data()\n\n" ".. method:: data()\n\n"
" Retrieves the data of the sound as numpy array.\n\n" " Retrieves the data of the sound as numpy array.\n\n"
" :return: A two dimensional numpy float array.\n" " :return: A two dimensional numpy float array.\n"
" :rtype: :class:`numpy.ndarray`\n\n" " :rtype: :class:`numpy.ndarray`\n\n"
@ -146,7 +146,7 @@ Sound_data(Sound* self)
} }
PyDoc_STRVAR(M_aud_Sound_write_doc, PyDoc_STRVAR(M_aud_Sound_write_doc,
".. classmethod:: write(filename, rate, channels, format, container, codec, bitrate, buffersize)\n\n" ".. method:: write(filename, rate, channels, format, container, codec, bitrate, buffersize)\n\n"
" Writes the sound to a file.\n\n" " Writes the sound to a file.\n\n"
" :arg filename: The path to write to.\n" " :arg filename: The path to write to.\n"
" :type filename: string\n" " :type filename: string\n"
@ -357,7 +357,7 @@ Sound_buffer(PyTypeObject* type, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_cache_doc, PyDoc_STRVAR(M_aud_Sound_cache_doc,
".. classmethod:: cache()\n\n" ".. method:: cache()\n\n"
" Caches a sound into RAM.\n\n" " Caches a sound into RAM.\n\n"
" This saves CPU usage needed for decoding and file access if the\n" " This saves CPU usage needed for decoding and file access if the\n"
" underlying sound reads from a file on the harddisk,\n" " underlying sound reads from a file on the harddisk,\n"
@ -631,7 +631,7 @@ Sound_triangle(PyTypeObject* type, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_accumulate_doc, PyDoc_STRVAR(M_aud_Sound_accumulate_doc,
".. classmethod:: accumulate(additive=False)\n\n" ".. method:: accumulate(additive=False)\n\n"
" Accumulates a sound by summing over positive input\n" " Accumulates a sound by summing over positive input\n"
" differences thus generating a monotonic sigal.\n" " differences thus generating a monotonic sigal.\n"
" If additivity is set to true negative input differences get added too,\n" " If additivity is set to true negative input differences get added too,\n"
@ -683,7 +683,7 @@ Sound_accumulate(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_ADSR_doc, PyDoc_STRVAR(M_aud_Sound_ADSR_doc,
".. classmethod:: ADSR(attack, decay, sustain, release)\n\n" ".. method:: ADSR(attack, decay, sustain, release)\n\n"
" Attack-Decay-Sustain-Release envelopes the volume of a sound.\n" " Attack-Decay-Sustain-Release envelopes the volume of a sound.\n"
" Note: there is currently no way to trigger the release with this API.\n\n" " Note: there is currently no way to trigger the release with this API.\n\n"
" :arg attack: The attack time in seconds.\n" " :arg attack: The attack time in seconds.\n"
@ -726,7 +726,7 @@ Sound_ADSR(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_delay_doc, PyDoc_STRVAR(M_aud_Sound_delay_doc,
".. classmethod:: delay(time)\n\n" ".. method:: delay(time)\n\n"
" Delays by playing adding silence in front of the other sound's data.\n\n" " Delays by playing adding silence in front of the other sound's data.\n\n"
" :arg time: How many seconds of silence should be added before the sound.\n" " :arg time: How many seconds of silence should be added before the sound.\n"
" :type time: float\n" " :type time: float\n"
@ -762,7 +762,7 @@ Sound_delay(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_envelope_doc, PyDoc_STRVAR(M_aud_Sound_envelope_doc,
".. classmethod:: envelope(attack, release, threshold, arthreshold)\n\n" ".. method:: envelope(attack, release, threshold, arthreshold)\n\n"
" Delays by playing adding silence in front of the other sound's data.\n\n" " Delays by playing adding silence in front of the other sound's data.\n\n"
" :arg attack: The attack factor.\n" " :arg attack: The attack factor.\n"
" :type attack: float\n" " :type attack: float\n"
@ -804,7 +804,7 @@ Sound_envelope(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_fadein_doc, PyDoc_STRVAR(M_aud_Sound_fadein_doc,
".. classmethod:: fadein(start, length)\n\n" ".. method:: fadein(start, length)\n\n"
" Fades a sound in by raising the volume linearly in the given\n" " Fades a sound in by raising the volume linearly in the given\n"
" time interval.\n\n" " time interval.\n\n"
" :arg start: Time in seconds when the fading should start.\n" " :arg start: Time in seconds when the fading should start.\n"
@ -844,7 +844,7 @@ Sound_fadein(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_fadeout_doc, PyDoc_STRVAR(M_aud_Sound_fadeout_doc,
".. classmethod:: fadeout(start, length)\n\n" ".. method:: fadeout(start, length)\n\n"
" Fades a sound in by lowering the volume linearly in the given\n" " Fades a sound in by lowering the volume linearly in the given\n"
" time interval.\n\n" " time interval.\n\n"
" :arg start: Time in seconds when the fading should start.\n" " :arg start: Time in seconds when the fading should start.\n"
@ -886,7 +886,7 @@ Sound_fadeout(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_filter_doc, PyDoc_STRVAR(M_aud_Sound_filter_doc,
".. classmethod:: filter(b, a = (1))\n\n" ".. method:: filter(b, a = (1))\n\n"
" Filters a sound with the supplied IIR filter coefficients.\n" " Filters a sound with the supplied IIR filter coefficients.\n"
" Without the second parameter you'll get a FIR filter.\n\n" " Without the second parameter you'll get a FIR filter.\n\n"
" If the first value of the a sequence is 0,\n" " If the first value of the a sequence is 0,\n"
@ -986,7 +986,7 @@ Sound_filter(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_highpass_doc, PyDoc_STRVAR(M_aud_Sound_highpass_doc,
".. classmethod:: highpass(frequency, Q=0.5)\n\n" ".. method:: highpass(frequency, Q=0.5)\n\n"
" Creates a second order highpass filter based on the transfer\n" " Creates a second order highpass filter based on the transfer\n"
" function :math:`H(s) = s^2 / (s^2 + s/Q + 1)`\n\n" " function :math:`H(s) = s^2 / (s^2 + s/Q + 1)`\n\n"
" :arg frequency: The cut off trequency of the highpass.\n" " :arg frequency: The cut off trequency of the highpass.\n"
@ -1026,7 +1026,7 @@ Sound_highpass(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_limit_doc, PyDoc_STRVAR(M_aud_Sound_limit_doc,
".. classmethod:: limit(start, end)\n\n" ".. method:: limit(start, end)\n\n"
" Limits a sound within a specific start and end time.\n\n" " Limits a sound within a specific start and end time.\n\n"
" :arg start: Start time in seconds.\n" " :arg start: Start time in seconds.\n"
" :type start: float\n" " :type start: float\n"
@ -1064,7 +1064,7 @@ Sound_limit(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_loop_doc, PyDoc_STRVAR(M_aud_Sound_loop_doc,
".. classmethod:: loop(count)\n\n" ".. method:: loop(count)\n\n"
" Loops a sound.\n\n" " Loops a sound.\n\n"
" :arg count: How often the sound should be looped.\n" " :arg count: How often the sound should be looped.\n"
" Negative values mean endlessly.\n" " Negative values mean endlessly.\n"
@ -1104,7 +1104,7 @@ Sound_loop(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_lowpass_doc, PyDoc_STRVAR(M_aud_Sound_lowpass_doc,
".. classmethod:: lowpass(frequency, Q=0.5)\n\n" ".. method:: lowpass(frequency, Q=0.5)\n\n"
" Creates a second order lowpass filter based on the transfer " " Creates a second order lowpass filter based on the transfer "
" function :math:`H(s) = 1 / (s^2 + s/Q + 1)`\n\n" " function :math:`H(s) = 1 / (s^2 + s/Q + 1)`\n\n"
" :arg frequency: The cut off trequency of the lowpass.\n" " :arg frequency: The cut off trequency of the lowpass.\n"
@ -1144,7 +1144,7 @@ Sound_lowpass(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_modulate_doc, PyDoc_STRVAR(M_aud_Sound_modulate_doc,
".. classmethod:: modulate(sound)\n\n" ".. method:: modulate(sound)\n\n"
" Modulates two factories.\n\n" " Modulates two factories.\n\n"
" :arg sound: The sound to modulate over the other.\n" " :arg sound: The sound to modulate over the other.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -1186,7 +1186,7 @@ Sound_modulate(Sound* self, PyObject* object)
} }
PyDoc_STRVAR(M_aud_Sound_pitch_doc, PyDoc_STRVAR(M_aud_Sound_pitch_doc,
".. classmethod:: pitch(factor)\n\n" ".. method:: pitch(factor)\n\n"
" Changes the pitch of a sound with a specific factor.\n\n" " Changes the pitch of a sound with a specific factor.\n\n"
" :arg factor: The factor to change the pitch with.\n" " :arg factor: The factor to change the pitch with.\n"
" :type factor: float\n" " :type factor: float\n"
@ -1229,7 +1229,7 @@ Sound_pitch(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_rechannel_doc, PyDoc_STRVAR(M_aud_Sound_rechannel_doc,
".. classmethod:: rechannel(channels)\n\n" ".. method:: rechannel(channels)\n\n"
" Rechannels the sound.\n\n" " Rechannels the sound.\n\n"
" :arg channels: The new channel configuration.\n" " :arg channels: The new channel configuration.\n"
" :type channels: int\n" " :type channels: int\n"
@ -1269,7 +1269,7 @@ Sound_rechannel(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_resample_doc, PyDoc_STRVAR(M_aud_Sound_resample_doc,
".. classmethod:: resample(rate, high_quality)\n\n" ".. method:: resample(rate, high_quality)\n\n"
" Resamples the sound.\n\n" " Resamples the sound.\n\n"
" :arg rate: The new sample rate.\n" " :arg rate: The new sample rate.\n"
" :type rate: double\n" " :type rate: double\n"
@ -1324,7 +1324,7 @@ Sound_resample(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_reverse_doc, PyDoc_STRVAR(M_aud_Sound_reverse_doc,
".. classmethod:: reverse()\n\n" ".. method:: reverse()\n\n"
" Plays a sound reversed.\n\n" " Plays a sound reversed.\n\n"
" :return: The created :class:`Sound` object.\n" " :return: The created :class:`Sound` object.\n"
" :rtype: :class:`Sound`\n\n" " :rtype: :class:`Sound`\n\n"
@ -1362,7 +1362,7 @@ Sound_reverse(Sound* self)
} }
PyDoc_STRVAR(M_aud_Sound_sum_doc, PyDoc_STRVAR(M_aud_Sound_sum_doc,
".. classmethod:: sum()\n\n" ".. method:: sum()\n\n"
" Sums the samples of a sound.\n\n" " Sums the samples of a sound.\n\n"
" :return: The created :class:`Sound` object.\n" " :return: The created :class:`Sound` object.\n"
" :rtype: :class:`Sound`"); " :rtype: :class:`Sound`");
@ -1391,7 +1391,7 @@ Sound_sum(Sound* self)
} }
PyDoc_STRVAR(M_aud_Sound_threshold_doc, PyDoc_STRVAR(M_aud_Sound_threshold_doc,
".. classmethod:: threshold(threshold = 0)\n\n" ".. method:: threshold(threshold = 0)\n\n"
" Makes a threshold wave out of an audio wave by setting all samples\n" " Makes a threshold wave out of an audio wave by setting all samples\n"
" with a amplitude >= threshold to 1, all <= -threshold to -1 and\n" " with a amplitude >= threshold to 1, all <= -threshold to -1 and\n"
" all between to 0.\n\n" " all between to 0.\n\n"
@ -1430,7 +1430,7 @@ Sound_threshold(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_volume_doc, PyDoc_STRVAR(M_aud_Sound_volume_doc,
".. classmethod:: volume(volume)\n\n" ".. method:: volume(volume)\n\n"
" Changes the volume of a sound.\n\n" " Changes the volume of a sound.\n\n"
" :arg volume: The new volume..\n" " :arg volume: The new volume..\n"
" :type volume: float\n" " :type volume: float\n"
@ -1471,7 +1471,7 @@ Sound_volume(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_join_doc, PyDoc_STRVAR(M_aud_Sound_join_doc,
".. classmethod:: join(sound)\n\n" ".. method:: join(sound)\n\n"
" Plays two factories in sequence.\n\n" " Plays two factories in sequence.\n\n"
" :arg sound: The sound to play second.\n" " :arg sound: The sound to play second.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -1514,7 +1514,7 @@ Sound_join(Sound* self, PyObject* object)
} }
PyDoc_STRVAR(M_aud_Sound_mix_doc, PyDoc_STRVAR(M_aud_Sound_mix_doc,
".. classmethod:: mix(sound)\n\n" ".. method:: mix(sound)\n\n"
" Mixes two factories.\n\n" " Mixes two factories.\n\n"
" :arg sound: The sound to mix over the other.\n" " :arg sound: The sound to mix over the other.\n"
" :type sound: :class:`Sound`\n" " :type sound: :class:`Sound`\n"
@ -1556,7 +1556,7 @@ Sound_mix(Sound* self, PyObject* object)
} }
PyDoc_STRVAR(M_aud_Sound_pingpong_doc, PyDoc_STRVAR(M_aud_Sound_pingpong_doc,
".. classmethod:: pingpong()\n\n" ".. method:: pingpong()\n\n"
" Plays a sound forward and then backward.\n" " Plays a sound forward and then backward.\n"
" This is like joining a sound with its reverse.\n\n" " This is like joining a sound with its reverse.\n\n"
" :return: The created :class:`Sound` object.\n" " :return: The created :class:`Sound` object.\n"
@ -1622,7 +1622,7 @@ Sound_list(PyTypeObject* type, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_mutable_doc, PyDoc_STRVAR(M_aud_Sound_mutable_doc,
".. classmethod:: mutable()\n\n" ".. method:: mutable()\n\n"
" Creates a sound that will be restarted when sought backwards.\n" " Creates a sound that will be restarted when sought backwards.\n"
" If the original sound is a sound list, the playing sound can change.\n\n" " If the original sound is a sound list, the playing sound can change.\n\n"
" :return: The created :class:`Sound` object.\n" " :return: The created :class:`Sound` object.\n"
@ -1652,7 +1652,7 @@ Sound_mutable(Sound* self)
} }
PyDoc_STRVAR(M_aud_Sound_list_addSound_doc, PyDoc_STRVAR(M_aud_Sound_list_addSound_doc,
".. classmethod:: addSound(sound)\n\n" ".. method:: addSound(sound)\n\n"
" Adds a new sound to a sound list.\n\n" " Adds a new sound to a sound list.\n\n"
" :arg sound: The sound that will be added to the list.\n" " :arg sound: The sound that will be added to the list.\n"
" :type sound: :class:`Sound`\n\n" " :type sound: :class:`Sound`\n\n"
@ -1685,7 +1685,7 @@ Sound_list_addSound(Sound* self, PyObject* object)
#ifdef WITH_CONVOLUTION #ifdef WITH_CONVOLUTION
PyDoc_STRVAR(M_aud_Sound_convolver_doc, PyDoc_STRVAR(M_aud_Sound_convolver_doc,
".. classmethod:: convolver()\n\n" ".. method:: convolver()\n\n"
" Creates a sound that will apply convolution to another sound.\n\n" " Creates a sound that will apply convolution to another sound.\n\n"
" :arg impulseResponse: The filter with which convolve the sound.\n" " :arg impulseResponse: The filter with which convolve the sound.\n"
" :type impulseResponse: :class:`ImpulseResponse`\n" " :type impulseResponse: :class:`ImpulseResponse`\n"
@ -1734,7 +1734,7 @@ Sound_convolver(Sound* self, PyObject* args)
} }
PyDoc_STRVAR(M_aud_Sound_binaural_doc, PyDoc_STRVAR(M_aud_Sound_binaural_doc,
".. classmethod:: convolver()\n\n" ".. method:: binaural()\n\n"
" Creates a binaural sound using another sound as source. The original sound must be mono\n\n" " Creates a binaural sound using another sound as source. The original sound must be mono\n\n"
" :arg hrtfs: An HRTF set.\n" " :arg hrtfs: An HRTF set.\n"
" :type hrtf: :class:`HRTF`\n" " :type hrtf: :class:`HRTF`\n"

View File

@ -95,9 +95,9 @@ ccl_device_inline void surface_shader_prepare_guiding(KernelGlobals kg,
bssrdf_sampling_fraction /= bsdf_bssrdf_sampling_sum; bssrdf_sampling_fraction /= bsdf_bssrdf_sampling_sum;
} }
/* Init guiding */ /* Initial guiding */
/* The the roughness because the function returns alpha.x * alpha.y. In addition alpha is squared /* The roughness because the function returns `alpha.x * alpha.y`.
* again */ * In addition alpha is squared again. */
float avg_roughness = surface_shader_average_sample_weight_squared_roughness(sd); float avg_roughness = surface_shader_average_sample_weight_squared_roughness(sd);
avg_roughness = safe_sqrtf(avg_roughness); avg_roughness = safe_sqrtf(avg_roughness);
if (!fully_opaque || avg_roughness < guiding_roughness_threshold || if (!fully_opaque || avg_roughness < guiding_roughness_threshold ||

View File

@ -54,8 +54,7 @@ ccl_device float3 background_map_sample(KernelGlobals kg, float2 rand, ccl_priva
int middle = first + step; int middle = first + step;
if (kernel_data_fetch(light_background_conditional_cdf, index_v * cdf_width + middle).y < if (kernel_data_fetch(light_background_conditional_cdf, index_v * cdf_width + middle).y <
rand.x) rand.x) {
{
first = middle + 1; first = middle + 1;
count -= step + 1; count -= step + 1;
} }

View File

@ -4581,7 +4581,6 @@ def km_pose(params):
("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True}, None), ("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True}, None),
("pose.blend_to_neighbor", {"type": 'E', "value": 'PRESS', "shift": True, "alt": True}, None), ("pose.blend_to_neighbor", {"type": 'E', "value": 'PRESS', "shift": True, "alt": True}, None),
op_menu("VIEW3D_MT_pose_propagate", {"type": 'P', "value": 'PRESS', "alt": True}), op_menu("VIEW3D_MT_pose_propagate", {"type": 'P', "value": 'PRESS', "alt": True}),
*_template_object_hide_collection_from_number_keys(),
*_template_items_context_menu("VIEW3D_MT_pose_context_menu", params.context_menu_event), *_template_items_context_menu("VIEW3D_MT_pose_context_menu", params.context_menu_event),
]) ])

View File

@ -23,6 +23,7 @@
#include "BLI_fileops.h" #include "BLI_fileops.h"
#include "BLI_math.h" #include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_string.h" #include "BLI_string.h"
#include "BLI_threads.h" #include "BLI_threads.h"
@ -113,7 +114,7 @@ static int blf_search_by_filepath(const char *filepath)
{ {
for (int i = 0; i < BLF_MAX_FONT; i++) { for (int i = 0; i < BLF_MAX_FONT; i++) {
const FontBLF *font = global_font[i]; const FontBLF *font = global_font[i];
if (font && STREQ(font->filepath, filepath)) { if (font && (BLI_path_cmp(font->filepath, filepath) == 0)) {
return i; return i;
} }
} }
@ -249,7 +250,7 @@ void BLF_unload(const char *filepath)
continue; continue;
} }
if (STREQ(font->filepath, filepath)) { if (BLI_path_cmp(font->filepath, filepath) == 0) {
BLI_assert(font->reference_count > 0); BLI_assert(font->reference_count > 0);
font->reference_count--; font->reference_count--;

View File

@ -1436,7 +1436,9 @@ bool blf_ensure_face(FontBLF *font)
* from our font in 3.1. In 3.4 we disable kerning here in the new version to keep spacing the * from our font in 3.1. In 3.4 we disable kerning here in the new version to keep spacing the
* same * same
* (#101506). Enable again later with change of font, placement, or rendering - Harley. */ * (#101506). Enable again later with change of font, placement, or rendering - Harley. */
if (font && font->filepath && BLI_str_endswith(font->filepath, BLF_DEFAULT_PROPORTIONAL_FONT)) { if (font && font->filepath &&
(BLI_path_cmp(BLI_path_basename(font->filepath), BLF_DEFAULT_PROPORTIONAL_FONT) == 0))
{
font->face_flags &= ~FT_FACE_FLAG_KERNING; font->face_flags &= ~FT_FACE_FLAG_KERNING;
} }
@ -1547,7 +1549,7 @@ static FontBLF *blf_font_new_impl(const char *filepath,
if (font->filepath) { if (font->filepath) {
const char *filename = BLI_path_basename(font->filepath); const char *filename = BLI_path_basename(font->filepath);
for (int i = 0; i < (int)ARRAY_SIZE(static_face_details); i++) { for (int i = 0; i < (int)ARRAY_SIZE(static_face_details); i++) {
if (STREQ(static_face_details[i].filename, filename)) { if (BLI_path_cmp(static_face_details[i].filename, filename) == 0) {
const struct FaceDetails *static_details = &static_face_details[i]; const struct FaceDetails *static_details = &static_face_details[i];
font->unicode_ranges[0] = static_details->coverage1; font->unicode_ranges[0] = static_details->coverage1;
font->unicode_ranges[1] = static_details->coverage2; font->unicode_ranges[1] = static_details->coverage2;

View File

@ -2495,7 +2495,7 @@ static void lib_override_resync_tagging_finalize_recurse(Main *bmain,
} }
else if (!is_in_partial_resync_hierarchy) { else if (!is_in_partial_resync_hierarchy) {
/* This ID is not tagged for resync, and is part of a loop where none of the other IDs are /* This ID is not tagged for resync, and is part of a loop where none of the other IDs are
* tagged for resync, nothing else to to. */ * tagged for resync, nothing else to do. */
return; return;
} }
/* This ID is not yet tagged for resync, but is part of a loop which is (partially) tagged /* This ID is not yet tagged for resync, but is part of a loop which is (partially) tagged

View File

@ -1418,7 +1418,7 @@ static void pbvh_faces_update_normals(PBVH *pbvh, Span<PBVHNode *> nodes)
}); });
}, },
[&]() { [&]() {
/* Update all normals connected to affected faces faces, even if not explicitly tagged. */ /* Update all normals connected to affected faces, even if not explicitly tagged. */
verts_to_update.reserve(polys_to_update.size()); verts_to_update.reserve(polys_to_update.size());
for (const int poly : polys_to_update) { for (const int poly : polys_to_update) {
verts_to_update.add_multiple(corner_verts.slice(polys[poly])); verts_to_update.add_multiple(corner_verts.slice(polys[poly]));

View File

@ -5,7 +5,8 @@
namespace blender::offset_indices { namespace blender::offset_indices {
OffsetIndices<int> accumulate_counts_to_offsets(MutableSpan<int> counts_to_offsets, const int start_offset) OffsetIndices<int> accumulate_counts_to_offsets(MutableSpan<int> counts_to_offsets,
const int start_offset)
{ {
int offset = start_offset; int offset = start_offset;
for (const int i : counts_to_offsets.index_range().drop_back(1)) { for (const int i : counts_to_offsets.index_range().drop_back(1)) {

View File

@ -655,7 +655,7 @@ void BLI_path_normalize_unc_16(wchar_t *path_16)
void BLI_path_rel(char path[FILE_MAX], const char *basepath) void BLI_path_rel(char path[FILE_MAX], const char *basepath)
{ {
BLI_string_debug_size_after_nil(path, FILE_MAX); BLI_string_debug_size_after_nil(path, FILE_MAX);
/* A `basepath` starting with `//` will be be made relative multiple times. */ /* A `basepath` starting with `//` will be made relative multiple times. */
BLI_assert_msg(!BLI_path_is_rel(basepath), "The 'basepath' cannot start with '//'!"); BLI_assert_msg(!BLI_path_is_rel(basepath), "The 'basepath' cannot start with '//'!");
const char *lslash; const char *lslash;
@ -1095,7 +1095,7 @@ void BLI_path_to_display_name(char *display_name, int display_name_maxncpy, cons
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) bool BLI_path_abs(char path[FILE_MAX], const char *basepath)
{ {
BLI_string_debug_size_after_nil(path, FILE_MAX); BLI_string_debug_size_after_nil(path, FILE_MAX);
/* A `basepath` starting with `//` will be be made absolute multiple times. */ /* A `basepath` starting with `//` will be made absolute multiple times. */
BLI_assert_msg(!BLI_path_is_rel(basepath), "The 'basepath' cannot start with '//'!"); BLI_assert_msg(!BLI_path_is_rel(basepath), "The 'basepath' cannot start with '//'!");
const bool wasrelative = BLI_path_is_rel(path); const bool wasrelative = BLI_path_is_rel(path);

View File

@ -44,7 +44,8 @@ int BLI_windows_get_executable_dir(char *str)
return 1; return 1;
} }
bool BLI_windows_is_store_install(void) { bool BLI_windows_is_store_install(void)
{
char install_dir[FILE_MAXDIR]; char install_dir[FILE_MAXDIR];
BLI_windows_get_executable_dir(install_dir); BLI_windows_get_executable_dir(install_dir);
return (BLI_strcasestr(install_dir, "\\WindowsApps\\") != NULL); return (BLI_strcasestr(install_dir, "\\WindowsApps\\") != NULL);

View File

@ -90,7 +90,7 @@ TEST(string, StrCopyUTF8_TruncateEncoding)
TEST(string, StrCopyUTF8_TerminateEncodingEarly) TEST(string, StrCopyUTF8_TerminateEncodingEarly)
{ {
/* A UTF8 sequence that has a null byte before the sequence ends. /* A UTF8 sequence that has a null byte before the sequence ends.
* Ensure the the UTF8 sequence does not step over the null byte. */ * Ensure the UTF8 sequence does not step over the null byte. */
#define STRNCPY_UTF8_TERMINATE_EARLY(byte_size, ...) \ #define STRNCPY_UTF8_TERMINATE_EARLY(byte_size, ...) \
{ \ { \
char src[] = {__VA_ARGS__, 0}; \ char src[] = {__VA_ARGS__, 0}; \

View File

@ -1213,7 +1213,7 @@ void EEVEE_material_transparent_output_init(EEVEE_Data *vedata)
{GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->transparent_accum)}); {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->transparent_accum)});
{ {
/* This pass Accumulate 1 sample of the transparent pass into the the transparent /* This pass Accumulate 1 sample of the transparent pass into the transparent
* accumulation buffer. */ * accumulation buffer. */
DRW_PASS_CREATE(psl->transparent_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); DRW_PASS_CREATE(psl->transparent_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_renderpasses_accumulate_sh_get(), DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_renderpasses_accumulate_sh_get(),

View File

@ -1,4 +1,3 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */ /* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file /** \file

View File

@ -410,40 +410,41 @@ static void gpencil_primitive_status_indicators(bContext *C, tGPDprimitive *tgpi
const int cur_subdiv = tgpi->type == GP_STROKE_BOX ? tgpi->tot_edges - 1 : tgpi->tot_edges - 2; const int cur_subdiv = tgpi->type == GP_STROKE_BOX ? tgpi->tot_edges - 1 : tgpi->tot_edges - 2;
if (tgpi->type == GP_STROKE_LINE) { if (tgpi->type == GP_STROKE_LINE) {
BLI_strncpy(msg_str, BLI_strncpy(
TIP_("Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to " msg_str,
"adjust subdivision number, Shift to align, Alt to center, E: extrude"), TIP_("Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to "
UI_MAX_DRAW_STR); "adjust subdivision number, Shift to align, Alt to center, E: extrude, G: grab"),
UI_MAX_DRAW_STR);
} }
else if (tgpi->type == GP_STROKE_POLYLINE) { else if (tgpi->type == GP_STROKE_POLYLINE) {
BLI_strncpy(msg_str, BLI_strncpy(msg_str,
TIP_("Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to " TIP_("Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to "
"adjust subdivision number, Shift to align"), "adjust subdivision number, Shift to align, G: grab"),
UI_MAX_DRAW_STR); UI_MAX_DRAW_STR);
} }
else if (tgpi->type == GP_STROKE_BOX) { else if (tgpi->type == GP_STROKE_BOX) {
BLI_strncpy(msg_str, BLI_strncpy(msg_str,
TIP_("Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- " TIP_("Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- "
"to adjust subdivision number, Shift to square, Alt to center"), "to adjust subdivision number, Shift to square, Alt to center, G: grab"),
UI_MAX_DRAW_STR); UI_MAX_DRAW_STR);
} }
else if (tgpi->type == GP_STROKE_CIRCLE) { else if (tgpi->type == GP_STROKE_CIRCLE) {
BLI_strncpy(msg_str, BLI_strncpy(msg_str,
TIP_("Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision " TIP_("Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision "
"number, Shift to square, Alt to center"), "number, Shift to square, Alt to center, G: grab"),
UI_MAX_DRAW_STR); UI_MAX_DRAW_STR);
} }
else if (tgpi->type == GP_STROKE_ARC) { else if (tgpi->type == GP_STROKE_ARC) {
BLI_strncpy( BLI_strncpy(
msg_str, msg_str,
TIP_("Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, " TIP_("Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, "
"Shift to square, Alt to center, M: Flip, E: extrude"), "Shift to square, Alt to center, M: Flip, E: extrude, G: grab"),
UI_MAX_DRAW_STR); UI_MAX_DRAW_STR);
} }
else if (tgpi->type == GP_STROKE_CURVE) { else if (tgpi->type == GP_STROKE_CURVE) {
BLI_strncpy(msg_str, BLI_strncpy(msg_str,
TIP_("Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision " TIP_("Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision "
"number, Shift to square, Alt to center, E: extrude"), "number, Shift to square, Alt to center, E: extrude, G: grab"),
UI_MAX_DRAW_STR); UI_MAX_DRAW_STR);
} }
@ -1618,7 +1619,7 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
copy_v2fl_v2i(tgpi->mval, event->mval); copy_v2fl_v2i(tgpi->mval, event->mval);
if (tgpi->flag == IN_MOVE) { if (tgpi->flag == IN_MOVE) {
bool is_mouse_event = true;
switch (event->type) { switch (event->type) {
case MOUSEMOVE: { case MOUSEMOVE: {
gpencil_primitive_move(tgpi, false); gpencil_primitive_move(tgpi, false);
@ -1639,8 +1640,14 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
} }
break; break;
} }
default: {
is_mouse_event = false; /* Prevent overwriting `tgpi->mvalo`. */
break;
}
}
if (is_mouse_event) {
copy_v2_v2(tgpi->mvalo, tgpi->mval);
} }
copy_v2_v2(tgpi->mvalo, tgpi->mval);
return OPERATOR_RUNNING_MODAL; return OPERATOR_RUNNING_MODAL;
} }

View File

@ -373,9 +373,7 @@ ScrArea *ED_screen_temp_space_open(struct bContext *C,
bool dialog); bool dialog);
void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
void ED_screens_footer_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); void ED_screens_footer_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
void ED_screens_navigation_bar_tools_menu_create(struct bContext *C, void ED_screens_region_flip_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
struct uiLayout *layout,
void *arg);
/** /**
* \return true if any active area requires to see in 3D. * \return true if any active area requires to see in 3D.
*/ */

View File

@ -1245,7 +1245,7 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev
uiItemMenuF(layout, uiItemMenuF(layout,
IFACE_("Navigation Bar"), IFACE_("Navigation Bar"),
ICON_NONE, ICON_NONE,
ED_screens_navigation_bar_tools_menu_create, ED_screens_region_flip_menu_create,
nullptr); nullptr);
} }
else if (region->regiontype == RGN_TYPE_FOOTER) { else if (region->regiontype == RGN_TYPE_FOOTER) {

View File

@ -3631,6 +3631,26 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
} }
} }
/**
* Return the jump type used for cursor motion & back-space/delete actions.
*/
static eStrCursorJumpType ui_textedit_jump_type_from_event(const wmEvent *event)
{
#ifdef __APPLE__
if (event->modifier & KM_OSKEY) {
return STRCUR_JUMP_ALL;
}
if (event->modifier & KM_ALT) {
return STRCUR_JUMP_DELIM;
}
#else
if (event->modifier & KM_CTRL) {
return STRCUR_JUMP_DELIM;
}
#endif
return STRCUR_JUMP_NONE;
}
static void ui_do_but_textedit( static void ui_do_but_textedit(
bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
{ {
@ -3777,17 +3797,10 @@ static void ui_do_but_textedit(
break; break;
case EVT_RIGHTARROWKEY: case EVT_RIGHTARROWKEY:
case EVT_LEFTARROWKEY: { case EVT_LEFTARROWKEY: {
eStrCursorJumpDirection direction = (event->type == EVT_RIGHTARROWKEY) ? STRCUR_DIR_NEXT : const eStrCursorJumpDirection direction = (event->type == EVT_RIGHTARROWKEY) ?
STRCUR_DIR_PREV; STRCUR_DIR_NEXT :
#ifdef __APPLE__ STRCUR_DIR_PREV;
eStrCursorJumpType jump = (event->modifier & KM_OSKEY) ? const eStrCursorJumpType jump = ui_textedit_jump_type_from_event(event);
STRCUR_JUMP_ALL :
((event->modifier & KM_ALT) ? STRCUR_JUMP_DELIM :
STRCUR_JUMP_NONE);
#else
eStrCursorJumpType jump = (event->modifier & KM_CTRL) ? STRCUR_JUMP_DELIM :
STRCUR_JUMP_NONE;
#endif
ui_textedit_move(but, data, direction, event->modifier & KM_SHIFT, jump); ui_textedit_move(but, data, direction, event->modifier & KM_SHIFT, jump);
retval = WM_UI_HANDLER_BREAK; retval = WM_UI_HANDLER_BREAK;
break; break;
@ -3833,17 +3846,9 @@ static void ui_do_but_textedit(
break; break;
case EVT_DELKEY: case EVT_DELKEY:
case EVT_BACKSPACEKEY: { case EVT_BACKSPACEKEY: {
eStrCursorJumpDirection direction = (event->type == EVT_DELKEY) ? STRCUR_DIR_NEXT : const eStrCursorJumpDirection direction = (event->type == EVT_DELKEY) ? STRCUR_DIR_NEXT :
STRCUR_DIR_PREV; STRCUR_DIR_PREV;
#ifdef __APPLE__ const eStrCursorJumpType jump = ui_textedit_jump_type_from_event(event);
eStrCursorJumpType jump = (event->modifier & KM_OSKEY) ?
STRCUR_JUMP_ALL :
((event->modifier & KM_ALT) ? STRCUR_JUMP_DELIM :
STRCUR_JUMP_NONE);
#else
eStrCursorJumpType jump = (event->modifier & KM_CTRL) ? STRCUR_JUMP_DELIM :
STRCUR_JUMP_NONE;
#endif
changed = ui_textedit_delete(but, data, direction, jump); changed = ui_textedit_delete(but, data, direction, jump);
retval = WM_UI_HANDLER_BREAK; retval = WM_UI_HANDLER_BREAK;
break; break;

View File

@ -4297,10 +4297,6 @@ static void screen_area_menu_items(ScrArea *area, uiLayout *layout)
void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg)) void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{ {
ScrArea *area = CTX_wm_area(C); ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
const char *but_flip_str = (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_TOP) ?
IFACE_("Flip to Bottom") :
IFACE_("Flip to Top");
{ {
PointerRNA ptr; PointerRNA ptr;
RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Space, area->spacedata.first, &ptr); RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Space, area->spacedata.first, &ptr);
@ -4322,12 +4318,9 @@ void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UN
"SCREEN_OT_header_toggle_menus"); "SCREEN_OT_header_toggle_menus");
} }
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
if (!ELEM(area->spacetype, SPACE_TOPBAR)) { if (!ELEM(area->spacetype, SPACE_TOPBAR)) {
uiItemS(layout); uiItemS(layout);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip"); ED_screens_region_flip_menu_create(C, layout, NULL);
uiItemS(layout); uiItemS(layout);
screen_area_menu_items(area, layout); screen_area_menu_items(area, layout);
} }
@ -4336,31 +4329,26 @@ void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UN
void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg)) void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{ {
ScrArea *area = CTX_wm_area(C); ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
const char *but_flip_str = (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_TOP) ?
IFACE_("Flip to Bottom") :
IFACE_("Flip to Top");
{ {
PointerRNA ptr; PointerRNA ptr;
RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Space, area->spacedata.first, &ptr); RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Space, area->spacedata.first, &ptr);
uiItemR(layout, &ptr, "show_region_footer", 0, IFACE_("Show Footer"), ICON_NONE); uiItemR(layout, &ptr, "show_region_footer", 0, IFACE_("Show Footer"), ICON_NONE);
} }
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */ ED_screens_region_flip_menu_create(C, layout, NULL);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
uiItemS(layout); uiItemS(layout);
screen_area_menu_items(area, layout); screen_area_menu_items(area, layout);
} }
void ED_screens_navigation_bar_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg)) void ED_screens_region_flip_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{ {
const ARegion *region = CTX_wm_region(C); const ARegion *region = CTX_wm_region(C);
const char *but_flip_str = (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_LEFT) ? const short region_alignment = RGN_ALIGN_ENUM_FROM_MASK(region->alignment);
IFACE_("Flip to Right") : const char *but_flip_str = region_alignment == RGN_ALIGN_LEFT ? IFACE_("Flip to Right") :
IFACE_("Flip to Left"); region_alignment == RGN_ALIGN_RIGHT ? IFACE_("Flip to Left") :
region_alignment == RGN_ALIGN_BOTTOM ? IFACE_("Flip to Top") :
IFACE_("Flip to Bottom");
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */ /* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT); uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
@ -4411,7 +4399,7 @@ static int screen_context_menu_invoke(bContext *C,
else if (region->regiontype == RGN_TYPE_NAV_BAR) { else if (region->regiontype == RGN_TYPE_NAV_BAR) {
uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Navigation Bar"), ICON_NONE); uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Navigation Bar"), ICON_NONE);
uiLayout *layout = UI_popup_menu_layout(pup); uiLayout *layout = UI_popup_menu_layout(pup);
ED_screens_navigation_bar_tools_menu_create(C, layout, NULL); ED_screens_region_flip_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup); UI_popup_menu_end(C, pup);
} }
} }

View File

@ -237,8 +237,7 @@ static void PREFERENCES_OT_asset_library_remove(wmOperatorType *ot)
static bool associate_blend_poll(bContext *C) static bool associate_blend_poll(bContext *C)
{ {
#ifdef WIN32 #ifdef WIN32
if (BLI_windows_is_store_install()) if (BLI_windows_is_store_install()) {
{
CTX_wm_operator_poll_msg_set(C, "Not available for Microsoft Store installations"); CTX_wm_operator_poll_msg_set(C, "Not available for Microsoft Store installations");
return false; return false;
} }
@ -253,7 +252,8 @@ static int associate_blend_exec(bContext *UNUSED(C), wmOperator *op)
{ {
#ifdef WIN32 #ifdef WIN32
if (BLI_windows_is_store_install()) { if (BLI_windows_is_store_install()) {
BKE_report(op->reports, RPT_ERROR, "Registration not possible from Microsoft Store installations"); BKE_report(
op->reports, RPT_ERROR, "Registration not possible from Microsoft Store installations");
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }

View File

@ -483,16 +483,26 @@ void GPUCodegen::generate_library()
GPUCodegenCreateInfo &info = *create_info; GPUCodegenCreateInfo &info = *create_info;
void *value; void *value;
/* Iterate over libraries. We need to keep this struct intact in case blender::Vector<std::string> source_files;
* it is required for the optimization pass. */
/* Iterate over libraries. We need to keep this struct intact in case it is required for the
* optimization pass. The first pass just collects the keys from the GSET, given items in a GSET
* are unordered this can cause order differences between invocations, so we collect the keys
* first, and sort them before doing actual work, to guarantee stable behavior while still
* having cheap insertions into the GSET */
GHashIterator *ihash = BLI_ghashIterator_new((GHash *)graph.used_libraries); GHashIterator *ihash = BLI_ghashIterator_new((GHash *)graph.used_libraries);
while (!BLI_ghashIterator_done(ihash)) { while (!BLI_ghashIterator_done(ihash)) {
value = BLI_ghashIterator_getKey(ihash); value = BLI_ghashIterator_getKey(ihash);
auto deps = gpu_shader_dependency_get_resolved_source((const char *)value); source_files.append((const char *)value);
info.dependencies_generated.extend_non_duplicates(deps);
BLI_ghashIterator_step(ihash); BLI_ghashIterator_step(ihash);
} }
BLI_ghashIterator_free(ihash); BLI_ghashIterator_free(ihash);
std::sort(source_files.begin(), source_files.end());
for (auto &key : source_files) {
auto deps = gpu_shader_dependency_get_resolved_source(key.c_str());
info.dependencies_generated.extend_non_duplicates(deps);
}
} }
void GPUCodegen::node_serialize(std::stringstream &eval_ss, const GPUNode *node) void GPUCodegen::node_serialize(std::stringstream &eval_ss, const GPUNode *node)

View File

@ -1,3 +1,5 @@
/* SPDX-License-Identifier: Apache-2.0 */
#include "testing/testing.h" #include "testing/testing.h"
#include "GPU_framebuffer.h" #include "GPU_framebuffer.h"

View File

@ -149,10 +149,12 @@ struct ImBuf *IMB_allocFromBuffer(const uint8_t *byte_buffer,
unsigned int h, unsigned int h,
unsigned int channels); unsigned int channels);
/* Assign the content of the corresponding buffer using an implicitly shareable data pointer. /**
* Assign the content of the corresponding buffer using an implicitly shareable data pointer.
* *
* NOTE: Does not modify the the topology (width, height, number of channels) or the mipmaps in any * \note Does not modify the topology (width, height, number of channels)
* way. */ * or the mipmaps in any way.
*/
void IMB_assign_shared_byte_buffer(struct ImBuf *ibuf, void IMB_assign_shared_byte_buffer(struct ImBuf *ibuf,
uint8_t *buffer_data, uint8_t *buffer_data,
const ImplicitSharingInfoHandle *implicit_sharing); const ImplicitSharingInfoHandle *implicit_sharing);
@ -163,24 +165,30 @@ void IMB_assign_shared_float_z_buffer(struct ImBuf *ibuf,
float *buffer_data, float *buffer_data,
const ImplicitSharingInfoHandle *implicit_sharing); const ImplicitSharingInfoHandle *implicit_sharing);
/* Assign the content of the corresponding buffer with the given data and ownership. /**
* Assign the content of the corresponding buffer with the given data and ownership.
* The current content of the buffer is released corresponding to its ownership configuration. * The current content of the buffer is released corresponding to its ownership configuration.
* *
* NOTE: Does not modify the the topology (width, height, number of channels) or the mipmaps in any * \note Does not modify the topology (width, height, number of channels)
* way. */ * or the mipmaps in any way.
*/
void IMB_assign_byte_buffer(struct ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership); void IMB_assign_byte_buffer(struct ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership);
void IMB_assign_float_buffer(struct ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership); void IMB_assign_float_buffer(struct ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership);
void IMB_assign_z_buffer(struct ImBuf *ibuf, int *buffer_data, ImBufOwnership ownership); void IMB_assign_z_buffer(struct ImBuf *ibuf, int *buffer_data, ImBufOwnership ownership);
void IMB_assign_float_z_buffer(struct ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership); void IMB_assign_float_z_buffer(struct ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership);
/* Make corresponding buffers available for modification. /**
* Is achieved by ensuring that the given ImBuf is the only owner of the underlying buffer data. */ * Make corresponding buffers available for modification.
* Is achieved by ensuring that the given ImBuf is the only owner of the underlying buffer data.
*/
void IMB_make_writable_byte_buffer(struct ImBuf *ibuf); void IMB_make_writable_byte_buffer(struct ImBuf *ibuf);
void IMB_make_writable_float_buffer(struct ImBuf *ibuf); void IMB_make_writable_float_buffer(struct ImBuf *ibuf);
/* Steal the buffer data pointer: the ImBuf is no longer an owner of this data. /**
* NOTE: If the ImBuf does not own the data the behavior is undefined. * Steal the buffer data pointer: the ImBuf is no longer an owner of this data.
* NOTE: Stealing encoded buffer resets the encoded size. */ * \note If the ImBuf does not own the data the behavior is undefined.
* \note Stealing encoded buffer resets the encoded size.
*/
uint8_t *IMB_steal_byte_buffer(struct ImBuf *ibuf); uint8_t *IMB_steal_byte_buffer(struct ImBuf *ibuf);
float *IMB_steal_float_buffer(struct ImBuf *ibuf); float *IMB_steal_float_buffer(struct ImBuf *ibuf);
uint8_t *IMB_steal_encoded_buffer(struct ImBuf *ibuf); uint8_t *IMB_steal_encoded_buffer(struct ImBuf *ibuf);

View File

@ -279,8 +279,8 @@ typedef struct LightLinkingRuntime {
/* For blocker objects: the index of the light set from which this object casts shadow from. /* For blocker objects: the index of the light set from which this object casts shadow from.
* *
*If there is no shadow shadow in the scene or the blocker is not linked to any emitter this is * If there is no shadow in the scene or the blocker is not linked to any emitter this is
*assigned zero. */ * assigned zero. */
uint8_t blocker_shadow_set; uint8_t blocker_shadow_set;
uint8_t _pad[6]; uint8_t _pad[6];

View File

@ -449,7 +449,7 @@ static void rna_CollectionLightLinking_update(Main *bmain, Scene *UNUSED(scene),
{ {
/* The light linking collection comes from the collection. It does not have shading component, /* The light linking collection comes from the collection. It does not have shading component,
* but is collected to objects via hierarchy component. Tagging its hierarchy for update will * but is collected to objects via hierarchy component. Tagging its hierarchy for update will
* lead the the objects which use the collection to update its shading. */ * lead the objects which use the collection to update its shading. */
DEG_id_tag_update(ptr->owner_id, ID_RECALC_HIERARCHY); DEG_id_tag_update(ptr->owner_id, ID_RECALC_HIERARCHY);
/* Tag relations for update so that an updated state of light sets is calculated. */ /* Tag relations for update so that an updated state of light sets is calculated. */

View File

@ -7037,6 +7037,11 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_NodesModifier_node_group_update"); RNA_def_property_update(prop, 0, "rna_NodesModifier_node_group_update");
prop = RNA_def_property(srna, "simulation_bake_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_ui_text(
prop, "Simulation Bake Directory", "Location on disk where the bake data is stored");
RNA_def_property_update(prop, 0, NULL);
RNA_define_lib_overridable(false); RNA_define_lib_overridable(false);
} }

View File

@ -653,12 +653,17 @@ static void correctivesmooth_modifier_do(ModifierData *md,
} }
else { else {
int me_numVerts; int me_numVerts;
rest_coords = em ? BKE_editmesh_vert_coords_alloc_orco(em, &me_numVerts) : if (em) {
BKE_mesh_vert_coords_alloc(static_cast<const Mesh *>(ob->data), rest_coords = BKE_editmesh_vert_coords_alloc_orco(em, &me_numVerts);
&me_numVerts); is_rest_coords_alloc = true;
}
else {
const Mesh *me = static_cast<const Mesh *>(ob->data);
rest_coords = BKE_mesh_vert_positions(me);
me_numVerts = me->totvert;
}
BLI_assert((uint)me_numVerts == verts_num); BLI_assert((uint)me_numVerts == verts_num);
is_rest_coords_alloc = true;
} }
#ifdef DEBUG_TIME #ifdef DEBUG_TIME

View File

@ -1922,6 +1922,8 @@ static void internal_dependencies_panel_draw(const bContext * /*C*/, Panel *pane
PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr); PointerRNA *ptr = modifier_panel_get_property_pointers(panel, nullptr);
NodesModifierData *nmd = static_cast<NodesModifierData *>(ptr->data); NodesModifierData *nmd = static_cast<NodesModifierData *>(ptr->data);
uiItemR(layout, ptr, "simulation_bake_directory", 0, "Bake", ICON_NONE);
geo_log::GeoTreeLog *tree_log = get_root_tree_log(*nmd); geo_log::GeoTreeLog *tree_log = get_root_tree_log(*nmd);
if (tree_log == nullptr) { if (tree_log == nullptr) {
return; return;