2023-08-16 00:20:26 +10:00
|
|
|
# SPDX-FileCopyrightText: 2010-2023 Blender Authors
|
2023-06-15 13:09:04 +10:00
|
|
|
#
|
2022-02-11 09:07:11 +11:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
from bpy.types import Operator
|
2011-12-08 15:55:49 +00:00
|
|
|
from mathutils import Vector
|
2010-01-19 09:36:40 +00:00
|
|
|
|
2011-12-09 10:19:11 +00:00
|
|
|
|
2024-03-15 10:04:03 +11:00
|
|
|
def randomize_selected(context, seed, delta, loc, rot, scale, scale_even, _scale_min):
|
2010-01-19 00:59:36 +00:00
|
|
|
|
|
|
|
|
import random
|
|
|
|
|
from random import uniform
|
|
|
|
|
|
|
|
|
|
random.seed(seed)
|
|
|
|
|
|
|
|
|
|
def rand_vec(vec_range):
|
2010-09-19 07:07:14 +00:00
|
|
|
return Vector(uniform(-val, val) for val in vec_range)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2013-01-23 07:52:31 +00:00
|
|
|
for obj in context.selected_objects:
|
2010-01-19 09:36:40 +00:00
|
|
|
|
2010-01-19 00:59:36 +00:00
|
|
|
if loc:
|
2010-12-15 08:21:58 +00:00
|
|
|
if delta:
|
|
|
|
|
obj.delta_location += rand_vec(loc)
|
|
|
|
|
else:
|
|
|
|
|
obj.location += rand_vec(loc)
|
2023-04-13 13:14:05 +10:00
|
|
|
else:
|
|
|
|
|
# Otherwise the values change under us.
|
|
|
|
|
uniform(0.0, 0.0)
|
|
|
|
|
uniform(0.0, 0.0)
|
|
|
|
|
uniform(0.0, 0.0)
|
2010-01-19 09:36:40 +00:00
|
|
|
|
2011-12-09 06:21:26 +00:00
|
|
|
if rot:
|
2010-01-19 00:59:36 +00:00
|
|
|
vec = rand_vec(rot)
|
2011-12-09 10:19:11 +00:00
|
|
|
|
2011-12-09 06:21:26 +00:00
|
|
|
rotation_mode = obj.rotation_mode
|
2011-12-09 10:19:11 +00:00
|
|
|
if rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}:
|
2011-12-09 06:21:26 +00:00
|
|
|
obj.rotation_mode = 'XYZ'
|
2012-01-01 08:52:54 +00:00
|
|
|
|
2010-12-15 08:21:58 +00:00
|
|
|
if delta:
|
|
|
|
|
obj.delta_rotation_euler[0] += vec[0]
|
|
|
|
|
obj.delta_rotation_euler[1] += vec[1]
|
|
|
|
|
obj.delta_rotation_euler[2] += vec[2]
|
|
|
|
|
else:
|
|
|
|
|
obj.rotation_euler[0] += vec[0]
|
|
|
|
|
obj.rotation_euler[1] += vec[1]
|
|
|
|
|
obj.rotation_euler[2] += vec[2]
|
2011-12-09 06:21:26 +00:00
|
|
|
obj.rotation_mode = rotation_mode
|
2010-01-19 09:24:39 +00:00
|
|
|
else:
|
|
|
|
|
uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
|
|
|
|
if scale:
|
2010-12-15 08:21:58 +00:00
|
|
|
if delta:
|
|
|
|
|
org_sca_x, org_sca_y, org_sca_z = obj.delta_scale
|
|
|
|
|
else:
|
|
|
|
|
org_sca_x, org_sca_y, org_sca_z = obj.scale
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2025-10-12 03:31:31 +00:00
|
|
|
sca_x, sca_y, sca_z = (
|
|
|
|
|
uniform(-scale[0] + 2.0, scale[0]),
|
|
|
|
|
uniform(-scale[1] + 2.0, scale[1]),
|
|
|
|
|
uniform(-scale[2] + 2.0, scale[2]),
|
|
|
|
|
)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2010-12-15 10:59:45 +00:00
|
|
|
if scale_even:
|
2011-12-04 22:48:23 +00:00
|
|
|
aX = sca_x * org_sca_x
|
|
|
|
|
aY = sca_x * org_sca_y
|
|
|
|
|
aZ = sca_x * org_sca_z
|
2010-12-15 10:59:45 +00:00
|
|
|
else:
|
2011-12-04 22:48:23 +00:00
|
|
|
aX = sca_x * org_sca_x
|
|
|
|
|
aY = sca_y * org_sca_y
|
|
|
|
|
aZ = sca_z * org_sca_z
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2010-12-15 08:21:58 +00:00
|
|
|
if delta:
|
|
|
|
|
obj.delta_scale = aX, aY, aZ
|
|
|
|
|
else:
|
|
|
|
|
obj.scale = aX, aY, aZ
|
2010-01-19 09:24:39 +00:00
|
|
|
else:
|
2023-04-13 13:14:05 +10:00
|
|
|
uniform(0.0, 0.0)
|
|
|
|
|
uniform(0.0, 0.0)
|
|
|
|
|
uniform(0.0, 0.0)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
|
|
|
|
|
2017-11-29 18:00:41 +11:00
|
|
|
from bpy.props import (
|
|
|
|
|
BoolProperty,
|
|
|
|
|
FloatVectorProperty,
|
|
|
|
|
IntProperty,
|
|
|
|
|
)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2011-01-01 07:20:34 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class RandomizeLocRotSize(Operator):
|
2020-11-04 14:25:00 +01:00
|
|
|
"""Randomize objects location, rotation, and scale"""
|
2010-02-11 23:13:47 +00:00
|
|
|
bl_idname = "object.randomize_transform"
|
|
|
|
|
bl_label = "Randomize Transform"
|
2010-03-01 00:03:51 +00:00
|
|
|
bl_options = {'REGISTER', 'UNDO'}
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2018-07-11 22:18:09 +02:00
|
|
|
random_seed: IntProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Random Seed",
|
|
|
|
|
description="Seed value for the random generator",
|
|
|
|
|
min=0,
|
|
|
|
|
max=10000,
|
|
|
|
|
default=0,
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
use_delta: BoolProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Transform Delta",
|
2024-03-15 10:04:03 +11:00
|
|
|
description="Randomize delta transform values instead of regular transform",
|
2018-06-26 19:41:37 +02:00
|
|
|
default=False,
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
use_loc: BoolProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Randomize Location",
|
|
|
|
|
description="Randomize the location values",
|
|
|
|
|
default=True,
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
loc: FloatVectorProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Location",
|
2024-03-15 10:04:03 +11:00
|
|
|
description="Maximum distance the objects can spread over each axis",
|
2018-06-26 19:41:37 +02:00
|
|
|
min=-100.0,
|
|
|
|
|
max=100.0,
|
|
|
|
|
default=(0.0, 0.0, 0.0),
|
|
|
|
|
subtype='TRANSLATION',
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
use_rot: BoolProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Randomize Rotation",
|
|
|
|
|
description="Randomize the rotation values",
|
|
|
|
|
default=True,
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
rot: FloatVectorProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Rotation",
|
|
|
|
|
description="Maximum rotation over each axis",
|
|
|
|
|
min=-3.141592, # math.pi
|
|
|
|
|
max=+3.141592,
|
|
|
|
|
default=(0.0, 0.0, 0.0),
|
|
|
|
|
subtype='EULER',
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
use_scale: BoolProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Randomize Scale",
|
|
|
|
|
description="Randomize the scale values",
|
|
|
|
|
default=True,
|
|
|
|
|
)
|
2018-07-11 22:18:09 +02:00
|
|
|
scale_even: BoolProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Scale Even",
|
|
|
|
|
description="Use the same scale value for all axis",
|
|
|
|
|
default=False,
|
|
|
|
|
)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2018-07-11 22:18:09 +02:00
|
|
|
'''scale_min: FloatProperty(
|
2018-09-19 17:48:11 +02:00
|
|
|
name="Minimum Scale Factor",
|
2011-08-19 19:25:20 +00:00
|
|
|
description="Lowest scale percentage possible",
|
|
|
|
|
min=-1.0, max=1.0, precision=3,
|
|
|
|
|
default=0.15,
|
|
|
|
|
)'''
|
2010-01-19 09:36:40 +00:00
|
|
|
|
2018-07-11 22:18:09 +02:00
|
|
|
scale: FloatVectorProperty(
|
2018-06-26 19:41:37 +02:00
|
|
|
name="Scale",
|
|
|
|
|
description="Maximum scale randomization over each axis",
|
|
|
|
|
min=-100.0,
|
|
|
|
|
max=100.0,
|
|
|
|
|
default=(1.0, 1.0, 1.0),
|
|
|
|
|
)
|
2010-01-19 09:36:40 +00:00
|
|
|
|
2019-03-07 15:54:08 +01:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
return context.mode == 'OBJECT'
|
|
|
|
|
|
2010-01-19 00:59:36 +00:00
|
|
|
def execute(self, context):
|
2010-09-09 18:03:57 +00:00
|
|
|
seed = self.random_seed
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2010-12-15 08:21:58 +00:00
|
|
|
delta = self.use_delta
|
|
|
|
|
|
2010-09-09 18:03:57 +00:00
|
|
|
loc = None if not self.use_loc else self.loc
|
2011-12-08 15:55:49 +00:00
|
|
|
rot = None if not self.use_rot else Vector(self.rot)
|
2010-09-09 18:03:57 +00:00
|
|
|
scale = None if not self.use_scale else self.scale
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2010-09-09 18:03:57 +00:00
|
|
|
scale_even = self.scale_even
|
2023-03-01 22:12:18 +11:00
|
|
|
# scale_min = self.scale_min
|
2011-12-04 22:48:23 +00:00
|
|
|
scale_min = 0
|
2010-01-19 00:59:36 +00:00
|
|
|
|
2024-03-15 10:04:03 +11:00
|
|
|
randomize_selected(context, seed, delta, loc, rot, scale, scale_even, scale_min)
|
2010-01-19 00:59:36 +00:00
|
|
|
|
|
|
|
|
return {'FINISHED'}
|
2017-03-18 20:03:24 +11:00
|
|
|
|
|
|
|
|
|
|
|
|
|
classes = (
|
|
|
|
|
RandomizeLocRotSize,
|
2017-11-29 18:00:41 +11:00
|
|
|
)
|