2025-12-01
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# Code for managing a blend-file-local script that registers the minimal types
|
||||
# and properties needed for Camera Shakify shakes to animate even without Camera
|
||||
# Shakify installed. Useful mainly for submitting files to render farms.
|
||||
|
||||
import bpy
|
||||
|
||||
FARM_SCRIPT_NAME = "camera_shakify_init.py"
|
||||
|
||||
FARM_SCRIPT_CONTENTS = """\
|
||||
import bpy
|
||||
|
||||
class CameraShakeInstance(bpy.types.PropertyGroup):
|
||||
# Don't include the shake type in this stand-in version of the class, as it's not necessary
|
||||
# for the shakes to animate (only for managing the shakes), and it would require including
|
||||
# a bunch more cruft in this script.
|
||||
#
|
||||
# shake_type: bpy.props.EnumProperty(
|
||||
# name = "Shake Type",
|
||||
# items = [(id, SHAKE_LIST[id][0], "") for id in SHAKE_LIST.keys()],
|
||||
# options = set(), # Not animatable.
|
||||
# override = set(), # Not library overridable.
|
||||
# update = on_shake_type_update,
|
||||
# )
|
||||
|
||||
influence: bpy.props.FloatProperty(
|
||||
name="Influence",
|
||||
description="How much the camera shake affects the camera",
|
||||
default=1.0,
|
||||
min=0.0, max={influence_max},
|
||||
soft_min=0.0, soft_max=1.0,
|
||||
)
|
||||
scale: bpy.props.FloatProperty(
|
||||
name="Scale",
|
||||
description="The scale of the shake's location component",
|
||||
default=1.0,
|
||||
min=0.0, max={scale_max},
|
||||
soft_min=0.0, soft_max=2.0,
|
||||
)
|
||||
use_manual_timing: bpy.props.BoolProperty(
|
||||
name="Manual Timing",
|
||||
description="Manually animate the progression of time through the camera shake animation",
|
||||
default=False,
|
||||
)
|
||||
time: bpy.props.FloatProperty(
|
||||
name="Time",
|
||||
description="Current time (in frame number) of the shake animation",
|
||||
default=0.0,
|
||||
precision=1,
|
||||
step=100.0,
|
||||
)
|
||||
speed: bpy.props.FloatProperty(
|
||||
name="Speed",
|
||||
description="Multiplier for how fast the shake animation plays",
|
||||
default=1.0,
|
||||
soft_min=0.0, soft_max=4.0,
|
||||
options = set(), # Not animatable.
|
||||
)
|
||||
offset: bpy.props.FloatProperty(
|
||||
name="Frame Offset",
|
||||
description="How many frames to offset the shake animation",
|
||||
default=0.0,
|
||||
precision=1,
|
||||
step=100.0,
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Only register the property if it doesn't already exist. This is to guard against replacing
|
||||
# the property with the stand-in class when the real one from the addon already exists.
|
||||
if not hasattr(bpy.types.Object, "camera_shakes"):
|
||||
bpy.utils.register_class(CameraShakeInstance)
|
||||
bpy.types.Object.camera_shakes = bpy.props.CollectionProperty(type=CameraShakeInstance)
|
||||
"""
|
||||
|
||||
|
||||
def ensure_farm_script(influence_max, scale_max):
|
||||
# Get existing script if it exists, or create it otherwise.
|
||||
if FARM_SCRIPT_NAME in bpy.data.texts:
|
||||
script = bpy.data.texts[FARM_SCRIPT_NAME]
|
||||
else:
|
||||
script = bpy.data.texts.new(FARM_SCRIPT_NAME)
|
||||
|
||||
script.clear()
|
||||
script.write(FARM_SCRIPT_CONTENTS.format(influence_max = influence_max, scale_max = scale_max))
|
||||
|
||||
# Make sure it doesn't get garbage collected.
|
||||
script.use_fake_user = True
|
||||
|
||||
# Mark for auto-execute on file load.
|
||||
script.use_module = True
|
||||
Reference in New Issue
Block a user