Allow overriding simple properties of cloth simulations, colliders and force fields. Vertex group and shape key selectors in cloth are still not overridable since they are tied to mesh data. Force fields have a number of physical fields shared between multiple RNA fields. Until they are decoupled, they will produce redundant overrides, and cannot have different hard range limits. Differential Revision: https://developer.blender.org/D13710
1603 lines
64 KiB
C
1603 lines
64 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup RNA
|
|
* \brief RNA property definitions for Rigid Body datatypes
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "RNA_define.h"
|
|
#include "RNA_enum_types.h"
|
|
|
|
#include "rna_internal.h"
|
|
|
|
#include "DNA_collection_types.h"
|
|
#include "DNA_object_types.h"
|
|
#include "DNA_rigidbody_types.h"
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "BLI_math.h"
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "DEG_depsgraph_build.h"
|
|
|
|
#include "WM_types.h"
|
|
|
|
/* roles of objects in RigidBody Sims */
|
|
const EnumPropertyItem rna_enum_rigidbody_object_type_items[] = {
|
|
{RBO_TYPE_ACTIVE,
|
|
"ACTIVE",
|
|
0,
|
|
"Active",
|
|
"Object is directly controlled by simulation results"},
|
|
{RBO_TYPE_PASSIVE,
|
|
"PASSIVE",
|
|
0,
|
|
"Passive",
|
|
"Object is directly controlled by animation system"},
|
|
{0, NULL, 0, NULL, NULL},
|
|
};
|
|
|
|
/* collision shapes of objects in rigid body sim */
|
|
const EnumPropertyItem rna_enum_rigidbody_object_shape_items[] = {
|
|
{RB_SHAPE_BOX,
|
|
"BOX",
|
|
ICON_MESH_CUBE,
|
|
"Box",
|
|
"Box-like shapes (i.e. cubes), including planes (i.e. ground planes)"},
|
|
{RB_SHAPE_SPHERE, "SPHERE", ICON_MESH_UVSPHERE, "Sphere", ""},
|
|
{RB_SHAPE_CAPSULE, "CAPSULE", ICON_MESH_CAPSULE, "Capsule", ""},
|
|
{RB_SHAPE_CYLINDER, "CYLINDER", ICON_MESH_CYLINDER, "Cylinder", ""},
|
|
{RB_SHAPE_CONE, "CONE", ICON_MESH_CONE, "Cone", ""},
|
|
{RB_SHAPE_CONVEXH,
|
|
"CONVEX_HULL",
|
|
ICON_MESH_ICOSPHERE,
|
|
"Convex Hull",
|
|
"A mesh-like surface encompassing (i.e. shrinkwrap over) all vertices (best results with "
|
|
"fewer vertices)"},
|
|
{RB_SHAPE_TRIMESH,
|
|
"MESH",
|
|
ICON_MESH_MONKEY,
|
|
"Mesh",
|
|
"Mesh consisting of triangles only, allowing for more detailed interactions than convex "
|
|
"hulls"},
|
|
{RB_SHAPE_COMPOUND,
|
|
"COMPOUND",
|
|
ICON_MESH_DATA,
|
|
"Compound Parent",
|
|
"Combines all of its direct rigid body children into one rigid object"},
|
|
{0, NULL, 0, NULL, NULL},
|
|
};
|
|
|
|
/* collision shapes of constraints in rigid body sim */
|
|
const EnumPropertyItem rna_enum_rigidbody_constraint_type_items[] = {
|
|
{RBC_TYPE_FIXED, "FIXED", ICON_NONE, "Fixed", "Glue rigid bodies together"},
|
|
{RBC_TYPE_POINT,
|
|
"POINT",
|
|
ICON_NONE,
|
|
"Point",
|
|
"Constrain rigid bodies to move around common pivot point"},
|
|
{RBC_TYPE_HINGE, "HINGE", ICON_NONE, "Hinge", "Restrict rigid body rotation to one axis"},
|
|
{RBC_TYPE_SLIDER,
|
|
"SLIDER",
|
|
ICON_NONE,
|
|
"Slider",
|
|
"Restrict rigid body translation to one axis"},
|
|
{RBC_TYPE_PISTON,
|
|
"PISTON",
|
|
ICON_NONE,
|
|
"Piston",
|
|
"Restrict rigid body translation and rotation to one axis"},
|
|
{RBC_TYPE_6DOF,
|
|
"GENERIC",
|
|
ICON_NONE,
|
|
"Generic",
|
|
"Restrict translation and rotation to specified axes"},
|
|
{RBC_TYPE_6DOF_SPRING,
|
|
"GENERIC_SPRING",
|
|
ICON_NONE,
|
|
"Generic Spring",
|
|
"Restrict translation and rotation to specified axes with springs"},
|
|
{RBC_TYPE_MOTOR, "MOTOR", ICON_NONE, "Motor", "Drive rigid body around or along an axis"},
|
|
{0, NULL, 0, NULL, NULL},
|
|
};
|
|
|
|
/* bullet spring type */
|
|
static const EnumPropertyItem rna_enum_rigidbody_constraint_spring_type_items[] = {
|
|
{RBC_SPRING_TYPE1,
|
|
"SPRING1",
|
|
ICON_NONE,
|
|
"Blender 2.7",
|
|
"Spring implementation used in blender 2.7. Damping is capped at 1.0"},
|
|
{RBC_SPRING_TYPE2,
|
|
"SPRING2",
|
|
ICON_NONE,
|
|
"Blender 2.8",
|
|
"New implementation available since 2.8"},
|
|
{0, NULL, 0, NULL, NULL},
|
|
};
|
|
|
|
#ifndef RNA_RUNTIME
|
|
/* mesh source for collision shape creation */
|
|
static const EnumPropertyItem rigidbody_mesh_source_items[] = {
|
|
{RBO_MESH_BASE, "BASE", 0, "Base", "Base mesh"},
|
|
{RBO_MESH_DEFORM, "DEFORM", 0, "Deform", "Deformations (shape keys, deform modifiers)"},
|
|
{RBO_MESH_FINAL, "FINAL", 0, "Final", "All modifiers"},
|
|
{0, NULL, 0, NULL, NULL},
|
|
};
|
|
#endif
|
|
|
|
#ifdef RNA_RUNTIME
|
|
|
|
# ifdef WITH_BULLET
|
|
# include "RBI_api.h"
|
|
# endif
|
|
|
|
# include "BKE_rigidbody.h"
|
|
|
|
# include "WM_api.h"
|
|
|
|
/* ******************************** */
|
|
|
|
static void rna_RigidBodyWorld_reset(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
|
{
|
|
RigidBodyWorld *rbw = (RigidBodyWorld *)ptr->data;
|
|
|
|
BKE_rigidbody_cache_reset(rbw);
|
|
}
|
|
|
|
static char *rna_RigidBodyWorld_path(PointerRNA *UNUSED(ptr))
|
|
{
|
|
return BLI_strdup("rigidbody_world");
|
|
}
|
|
|
|
static void rna_RigidBodyWorld_num_solver_iterations_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyWorld *rbw = (RigidBodyWorld *)ptr->data;
|
|
|
|
rbw->num_solver_iterations = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbw->shared->physics_world) {
|
|
RB_dworld_set_solver_iterations(rbw->shared->physics_world, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyWorld_split_impulse_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyWorld *rbw = (RigidBodyWorld *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbw->flag, value, RBW_FLAG_USE_SPLIT_IMPULSE);
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbw->shared->physics_world) {
|
|
RB_dworld_set_split_impulse(rbw->shared->physics_world, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyWorld_objects_collection_update(Main *bmain,
|
|
Scene *scene,
|
|
PointerRNA *ptr)
|
|
{
|
|
RigidBodyWorld *rbw = (RigidBodyWorld *)ptr->data;
|
|
BKE_rigidbody_objects_collection_validate(scene, rbw);
|
|
rna_RigidBodyWorld_reset(bmain, scene, ptr);
|
|
}
|
|
|
|
static void rna_RigidBodyWorld_constraints_collection_update(Main *bmain,
|
|
Scene *scene,
|
|
PointerRNA *ptr)
|
|
{
|
|
RigidBodyWorld *rbw = (RigidBodyWorld *)ptr->data;
|
|
BKE_rigidbody_constraints_collection_validate(scene, rbw);
|
|
rna_RigidBodyWorld_reset(bmain, scene, ptr);
|
|
}
|
|
|
|
/* ******************************** */
|
|
|
|
static void rna_RigidBodyOb_reset(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
|
|
{
|
|
if (scene != NULL) {
|
|
RigidBodyWorld *rbw = scene->rigidbody_world;
|
|
BKE_rigidbody_cache_reset(rbw);
|
|
}
|
|
}
|
|
|
|
static void rna_RigidBodyOb_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
|
|
{
|
|
Object *ob = (Object *)ptr->owner_id;
|
|
|
|
rna_RigidBodyOb_reset(bmain, scene, ptr);
|
|
DEG_relations_tag_update(bmain);
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob);
|
|
}
|
|
|
|
static void rna_RigidBodyOb_shape_reset(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
|
|
{
|
|
if (scene != NULL) {
|
|
RigidBodyWorld *rbw = scene->rigidbody_world;
|
|
BKE_rigidbody_cache_reset(rbw);
|
|
}
|
|
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
if (rbo->shared->physics_shape) {
|
|
rbo->flag |= RBO_FLAG_NEEDS_RESHAPE;
|
|
}
|
|
}
|
|
|
|
static void rna_RigidBodyOb_mesh_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
|
|
{
|
|
Object *ob = (Object *)ptr->owner_id;
|
|
|
|
rna_RigidBodyOb_reset(bmain, scene, ptr);
|
|
DEG_relations_tag_update(bmain);
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob);
|
|
}
|
|
|
|
static char *rna_RigidBodyOb_path(PointerRNA *UNUSED(ptr))
|
|
{
|
|
/* NOTE: this hardcoded path should work as long as only Objects have this */
|
|
return BLI_strdup("rigid_body");
|
|
}
|
|
|
|
static void rna_RigidBodyOb_type_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->type = value;
|
|
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyOb_shape_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->shape = value;
|
|
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyOb_disabled_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbo->flag, !value, RBO_FLAG_DISABLED);
|
|
|
|
# ifdef WITH_BULLET
|
|
/* update kinematic state if necessary - only needed for active bodies */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_mass(rbo->shared->physics_object, RBO_GET_MASS(rbo));
|
|
RB_body_set_kinematic_state(rbo->shared->physics_object, !value);
|
|
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_mass_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->mass = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
/* only active bodies need mass update */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_mass(rbo->shared->physics_object, RBO_GET_MASS(rbo));
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_friction_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->friction = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbo->shared->physics_object) {
|
|
RB_body_set_friction(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_restitution_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->restitution = value;
|
|
# ifdef WITH_BULLET
|
|
if (rbo->shared->physics_object) {
|
|
RB_body_set_restitution(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_collision_margin_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->margin = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbo->shared->physics_shape) {
|
|
RB_shape_set_margin(rbo->shared->physics_shape, RBO_GET_MARGIN(rbo));
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_collision_collections_set(PointerRNA *ptr, const bool *values)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
int i;
|
|
|
|
for (i = 0; i < 20; i++) {
|
|
if (values[i]) {
|
|
rbo->col_groups |= (1 << i);
|
|
}
|
|
else {
|
|
rbo->col_groups &= ~(1 << i);
|
|
}
|
|
}
|
|
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyOb_kinematic_state_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbo->flag, value, RBO_FLAG_KINEMATIC);
|
|
|
|
# ifdef WITH_BULLET
|
|
/* update kinematic state if necessary */
|
|
if (rbo->shared->physics_object) {
|
|
RB_body_set_mass(rbo->shared->physics_object, RBO_GET_MASS(rbo));
|
|
RB_body_set_kinematic_state(rbo->shared->physics_object, value);
|
|
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_activation_state_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbo->flag, value, RBO_FLAG_USE_DEACTIVATION);
|
|
|
|
# ifdef WITH_BULLET
|
|
/* update activation state if necessary - only active bodies can be deactivated */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_activation_state(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_linear_sleepThresh_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->lin_sleep_thresh = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
/* only active bodies need sleep threshold update */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_linear_sleep_thresh(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_angular_sleepThresh_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->ang_sleep_thresh = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
/* only active bodies need sleep threshold update */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_angular_sleep_thresh(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_linear_damping_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->lin_damping = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
/* only active bodies need damping update */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_linear_damping(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyOb_angular_damping_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
|
|
|
|
rbo->ang_damping = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
/* only active bodies need damping update */
|
|
if ((rbo->shared->physics_object) && (rbo->type == RBO_TYPE_ACTIVE)) {
|
|
RB_body_set_angular_damping(rbo->shared->physics_object, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static char *rna_RigidBodyCon_path(PointerRNA *UNUSED(ptr))
|
|
{
|
|
/* NOTE: this hardcoded path should work as long as only Objects have this */
|
|
return BLI_strdup("rigid_body_constraint");
|
|
}
|
|
|
|
static void rna_RigidBodyCon_type_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->type = value;
|
|
rbc->flag |= RBC_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_type_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_type = value;
|
|
rbc->flag |= RBC_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyCon_enabled_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbc->flag, value, RBC_FLAG_ENABLED);
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_enabled(rbc->physics_constraint, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_disable_collisions_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbc->flag, value, RBC_FLAG_DISABLE_COLLISIONS);
|
|
|
|
rbc->flag |= RBC_FLAG_NEEDS_VALIDATE;
|
|
}
|
|
|
|
static void rna_RigidBodyCon_use_breaking_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
if (value) {
|
|
rbc->flag |= RBC_FLAG_USE_BREAKING;
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_breaking_threshold(rbc->physics_constraint, rbc->breaking_threshold);
|
|
}
|
|
# endif
|
|
}
|
|
else {
|
|
rbc->flag &= ~RBC_FLAG_USE_BREAKING;
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_breaking_threshold(rbc->physics_constraint, FLT_MAX);
|
|
}
|
|
# endif
|
|
}
|
|
}
|
|
|
|
static void rna_RigidBodyCon_breaking_threshold_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->breaking_threshold = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && (rbc->flag & RBC_FLAG_USE_BREAKING)) {
|
|
RB_constraint_set_breaking_threshold(rbc->physics_constraint, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_override_solver_iterations_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
if (value) {
|
|
rbc->flag |= RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS;
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_solver_iterations(rbc->physics_constraint, rbc->num_solver_iterations);
|
|
}
|
|
# endif
|
|
}
|
|
else {
|
|
rbc->flag &= ~RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS;
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_solver_iterations(rbc->physics_constraint, -1);
|
|
}
|
|
# endif
|
|
}
|
|
}
|
|
|
|
static void rna_RigidBodyCon_num_solver_iterations_set(PointerRNA *ptr, int value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->num_solver_iterations = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && (rbc->flag & RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS)) {
|
|
RB_constraint_set_solver_iterations(rbc->physics_constraint, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
# ifdef WITH_BULLET
|
|
static void rna_RigidBodyCon_do_set_spring_stiffness(RigidBodyCon *rbc,
|
|
float value,
|
|
int flag,
|
|
int axis)
|
|
{
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_6DOF_SPRING && (rbc->flag & flag)) {
|
|
switch (rbc->spring_type) {
|
|
case RBC_SPRING_TYPE1:
|
|
RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, axis, value);
|
|
break;
|
|
case RBC_SPRING_TYPE2:
|
|
RB_constraint_set_stiffness_6dof_spring2(rbc->physics_constraint, axis, value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
# endif
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_x_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_x = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_X, RB_LIMIT_LIN_X);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_y_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_y = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_Y, RB_LIMIT_LIN_Y);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_z_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_z = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_Z, RB_LIMIT_LIN_Z);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_ang_x_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_ang_x = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_ANG_X, RB_LIMIT_ANG_X);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_ang_y_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_ang_y = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_ANG_Y, RB_LIMIT_ANG_Y);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_stiffness_ang_z_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_stiffness_ang_z = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_stiffness(rbc, value, RBC_FLAG_USE_SPRING_ANG_Z, RB_LIMIT_ANG_Z);
|
|
# endif
|
|
}
|
|
|
|
# ifdef WITH_BULLET
|
|
static void rna_RigidBodyCon_do_set_spring_damping(RigidBodyCon *rbc,
|
|
float value,
|
|
int flag,
|
|
int axis)
|
|
{
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_6DOF_SPRING && (rbc->flag & flag)) {
|
|
switch (rbc->spring_type) {
|
|
case RBC_SPRING_TYPE1:
|
|
RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, axis, value);
|
|
break;
|
|
case RBC_SPRING_TYPE2:
|
|
RB_constraint_set_damping_6dof_spring2(rbc->physics_constraint, axis, value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
# endif
|
|
|
|
static void rna_RigidBodyCon_spring_damping_x_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_x = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_X, RB_LIMIT_LIN_X);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_damping_y_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_y = value;
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_Y, RB_LIMIT_LIN_Y);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_damping_z_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_z = value;
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_Z, RB_LIMIT_LIN_Z);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_damping_ang_x_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_ang_x = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_ANG_X, RB_LIMIT_ANG_X);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_damping_ang_y_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_ang_y = value;
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_ANG_Y, RB_LIMIT_ANG_Y);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_spring_damping_ang_z_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->spring_damping_ang_z = value;
|
|
# ifdef WITH_BULLET
|
|
rna_RigidBodyCon_do_set_spring_damping(rbc, value, RBC_FLAG_USE_SPRING_ANG_Z, RB_LIMIT_ANG_Z);
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_motor_lin_max_impulse_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->motor_lin_max_impulse = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_MOTOR) {
|
|
RB_constraint_set_max_impulse_motor(
|
|
rbc->physics_constraint, value, rbc->motor_ang_max_impulse);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_use_motor_lin_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbc->flag, value, RBC_FLAG_USE_MOTOR_LIN);
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_enable_motor(rbc->physics_constraint,
|
|
rbc->flag & RBC_FLAG_USE_MOTOR_LIN,
|
|
rbc->flag & RBC_FLAG_USE_MOTOR_ANG);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_use_motor_ang_set(PointerRNA *ptr, bool value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
SET_FLAG_FROM_TEST(rbc->flag, value, RBC_FLAG_USE_MOTOR_ANG);
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint) {
|
|
RB_constraint_set_enable_motor(rbc->physics_constraint,
|
|
rbc->flag & RBC_FLAG_USE_MOTOR_LIN,
|
|
rbc->flag & RBC_FLAG_USE_MOTOR_ANG);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_motor_lin_target_velocity_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->motor_lin_target_velocity = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_MOTOR) {
|
|
RB_constraint_set_target_velocity_motor(
|
|
rbc->physics_constraint, value, rbc->motor_ang_target_velocity);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_motor_ang_max_impulse_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->motor_ang_max_impulse = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_MOTOR) {
|
|
RB_constraint_set_max_impulse_motor(
|
|
rbc->physics_constraint, rbc->motor_lin_max_impulse, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
static void rna_RigidBodyCon_motor_ang_target_velocity_set(PointerRNA *ptr, float value)
|
|
{
|
|
RigidBodyCon *rbc = (RigidBodyCon *)ptr->data;
|
|
|
|
rbc->motor_ang_target_velocity = value;
|
|
|
|
# ifdef WITH_BULLET
|
|
if (rbc->physics_constraint && rbc->type == RBC_TYPE_MOTOR) {
|
|
RB_constraint_set_target_velocity_motor(
|
|
rbc->physics_constraint, rbc->motor_lin_target_velocity, value);
|
|
}
|
|
# endif
|
|
}
|
|
|
|
/* Sweep test */
|
|
static void rna_RigidBodyWorld_convex_sweep_test(RigidBodyWorld *rbw,
|
|
ReportList *reports,
|
|
Object *object,
|
|
float ray_start[3],
|
|
float ray_end[3],
|
|
float r_location[3],
|
|
float r_hitpoint[3],
|
|
float r_normal[3],
|
|
int *r_hit)
|
|
{
|
|
# ifdef WITH_BULLET
|
|
RigidBodyOb *rob = object->rigidbody_object;
|
|
|
|
if (rbw->shared->physics_world != NULL && rob->shared->physics_object != NULL) {
|
|
RB_world_convex_sweep_test(rbw->shared->physics_world,
|
|
rob->shared->physics_object,
|
|
ray_start,
|
|
ray_end,
|
|
r_location,
|
|
r_hitpoint,
|
|
r_normal,
|
|
r_hit);
|
|
if (*r_hit == -2) {
|
|
BKE_report(reports,
|
|
RPT_ERROR,
|
|
"A non convex collision shape was passed to the function, use only convex "
|
|
"collision shapes");
|
|
}
|
|
}
|
|
else {
|
|
*r_hit = -1;
|
|
BKE_report(reports,
|
|
RPT_ERROR,
|
|
"Rigidbody world was not properly initialized, need to step the simulation first");
|
|
}
|
|
# else
|
|
UNUSED_VARS(rbw, reports, object, ray_start, ray_end, r_location, r_hitpoint, r_normal, r_hit);
|
|
# endif
|
|
}
|
|
|
|
static PointerRNA rna_RigidBodyWorld_PointCache_get(PointerRNA *ptr)
|
|
{
|
|
RigidBodyWorld *rbw = ptr->data;
|
|
return rna_pointer_inherit_refine(ptr, &RNA_PointCache, rbw->shared->pointcache);
|
|
}
|
|
|
|
#else
|
|
|
|
static void rna_def_rigidbody_world(BlenderRNA *brna)
|
|
{
|
|
StructRNA *srna;
|
|
PropertyRNA *prop;
|
|
|
|
FunctionRNA *func;
|
|
PropertyRNA *parm;
|
|
|
|
srna = RNA_def_struct(brna, "RigidBodyWorld", NULL);
|
|
RNA_def_struct_sdna(srna, "RigidBodyWorld");
|
|
RNA_def_struct_ui_text(
|
|
srna, "Rigid Body World", "Self-contained rigid body simulation environment and settings");
|
|
RNA_def_struct_path_func(srna, "rna_RigidBodyWorld_path");
|
|
|
|
/* groups */
|
|
prop = RNA_def_property(srna, "collection", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_struct_type(prop, "Collection");
|
|
RNA_def_property_pointer_sdna(prop, NULL, "group");
|
|
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
|
RNA_def_property_ui_text(
|
|
prop, "Collection", "Collection containing objects participating in this simulation");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_objects_collection_update");
|
|
|
|
prop = RNA_def_property(srna, "constraints", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_struct_type(prop, "Collection");
|
|
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
|
RNA_def_property_ui_text(
|
|
prop, "Constraints", "Collection containing rigid body constraint objects");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_constraints_collection_update");
|
|
|
|
/* booleans */
|
|
prop = RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", RBW_FLAG_MUTED);
|
|
RNA_def_property_ui_text(prop, "Enabled", "Simulation will be evaluated");
|
|
RNA_def_property_update(prop, NC_SCENE, NULL);
|
|
|
|
/* time scale */
|
|
prop = RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "time_scale");
|
|
RNA_def_property_range(prop, 0.0f, 100.0f);
|
|
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_ui_text(prop, "Time Scale", "Change the speed of the simulation");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
|
|
|
|
/* timestep */
|
|
prop = RNA_def_property(srna, "substeps_per_frame", PROP_INT, PROP_NONE);
|
|
RNA_def_property_int_sdna(prop, NULL, "substeps_per_frame");
|
|
RNA_def_property_range(prop, 1, SHRT_MAX);
|
|
RNA_def_property_ui_range(prop, 1, 1000, 1, -1);
|
|
RNA_def_property_int_default(prop, 10);
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Substeps Per Frame",
|
|
"Number of simulation steps taken per frame (higher values are more accurate "
|
|
"but slower)");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
|
|
|
|
/* constraint solver iterations */
|
|
prop = RNA_def_property(srna, "solver_iterations", PROP_INT, PROP_NONE);
|
|
RNA_def_property_int_sdna(prop, NULL, "num_solver_iterations");
|
|
RNA_def_property_range(prop, 1, 1000);
|
|
RNA_def_property_ui_range(prop, 10, 100, 1, -1);
|
|
RNA_def_property_int_default(prop, 10);
|
|
RNA_def_property_int_funcs(prop, NULL, "rna_RigidBodyWorld_num_solver_iterations_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Solver Iterations",
|
|
"Number of constraint solver iterations made per simulation step (higher values are more "
|
|
"accurate but slower)");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
|
|
|
|
/* split impulse */
|
|
prop = RNA_def_property(srna, "use_split_impulse", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBW_FLAG_USE_SPLIT_IMPULSE);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyWorld_split_impulse_set");
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Split Impulse",
|
|
"Reduce extra velocity that can build up when objects collide (lowers simulation "
|
|
"stability a little so use only when necessary)");
|
|
RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
|
|
|
|
/* cache */
|
|
prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_flag(prop, PROP_NEVER_NULL);
|
|
RNA_def_property_pointer_funcs(prop, "rna_RigidBodyWorld_PointCache_get", NULL, NULL, NULL);
|
|
RNA_def_property_struct_type(prop, "PointCache");
|
|
RNA_def_property_ui_text(prop, "Point Cache", "");
|
|
|
|
/* effector weights */
|
|
prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_struct_type(prop, "EffectorWeights");
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
|
RNA_def_property_ui_text(prop, "Effector Weights", "");
|
|
|
|
/* Sweep test */
|
|
func = RNA_def_function(srna, "convex_sweep_test", "rna_RigidBodyWorld_convex_sweep_test");
|
|
RNA_def_function_ui_description(
|
|
func, "Sweep test convex rigidbody against the current rigidbody world");
|
|
RNA_def_function_flag(func, FUNC_USE_REPORTS);
|
|
parm = RNA_def_pointer(
|
|
func, "object", "Object", "", "Rigidbody object with a convex collision shape");
|
|
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
|
|
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
|
|
/* ray start and end */
|
|
parm = RNA_def_float_vector(func, "start", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
|
|
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
|
parm = RNA_def_float_vector(func, "end", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
|
|
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
|
parm = RNA_def_float_vector(func,
|
|
"object_location",
|
|
3,
|
|
NULL,
|
|
-FLT_MAX,
|
|
FLT_MAX,
|
|
"Location",
|
|
"The hit location of this sweep test",
|
|
-1e4,
|
|
1e4);
|
|
RNA_def_parameter_flags(parm, PROP_THICK_WRAP, 0);
|
|
RNA_def_function_output(func, parm);
|
|
parm = RNA_def_float_vector(func,
|
|
"hitpoint",
|
|
3,
|
|
NULL,
|
|
-FLT_MAX,
|
|
FLT_MAX,
|
|
"Hitpoint",
|
|
"The hit location of this sweep test",
|
|
-1e4,
|
|
1e4);
|
|
RNA_def_parameter_flags(parm, PROP_THICK_WRAP, 0);
|
|
RNA_def_function_output(func, parm);
|
|
parm = RNA_def_float_vector(func,
|
|
"normal",
|
|
3,
|
|
NULL,
|
|
-FLT_MAX,
|
|
FLT_MAX,
|
|
"Normal",
|
|
"The face normal at the sweep test hit location",
|
|
-1e4,
|
|
1e4);
|
|
RNA_def_parameter_flags(parm, PROP_THICK_WRAP, 0);
|
|
RNA_def_function_output(func, parm);
|
|
parm = RNA_def_int(func,
|
|
"has_hit",
|
|
0,
|
|
0,
|
|
0,
|
|
"",
|
|
"If the function has found collision point, value is 1, otherwise 0",
|
|
0,
|
|
0);
|
|
RNA_def_function_output(func, parm);
|
|
}
|
|
|
|
static void rna_def_rigidbody_object(BlenderRNA *brna)
|
|
{
|
|
StructRNA *srna;
|
|
PropertyRNA *prop;
|
|
|
|
srna = RNA_def_struct(brna, "RigidBodyObject", NULL);
|
|
RNA_def_struct_sdna(srna, "RigidBodyOb");
|
|
RNA_def_struct_ui_text(
|
|
srna, "Rigid Body Object", "Settings for object participating in Rigid Body Simulation");
|
|
RNA_def_struct_path_func(srna, "rna_RigidBodyOb_path");
|
|
|
|
/* Enums */
|
|
prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
|
|
RNA_def_property_enum_sdna(prop, NULL, "type");
|
|
RNA_def_property_enum_items(prop, rna_enum_rigidbody_object_type_items);
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_RigidBodyOb_type_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Type", "Role of object in Rigid Body Simulations");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "mesh_source", PROP_ENUM, PROP_NONE);
|
|
RNA_def_property_enum_sdna(prop, NULL, "mesh_source");
|
|
RNA_def_property_enum_items(prop, rigidbody_mesh_source_items);
|
|
RNA_def_property_ui_text(
|
|
prop, "Mesh Source", "Source of the mesh used to create collision shape");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_mesh_source_update");
|
|
|
|
/* booleans */
|
|
prop = RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", RBO_FLAG_DISABLED);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyOb_disabled_set");
|
|
RNA_def_property_ui_text(prop, "Enabled", "Rigid Body actively participates to the simulation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "collision_shape", PROP_ENUM, PROP_NONE);
|
|
RNA_def_property_enum_sdna(prop, NULL, "shape");
|
|
RNA_def_property_enum_items(prop, rna_enum_rigidbody_object_shape_items);
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_RigidBodyOb_shape_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop, "Collision Shape", "Collision Shape of object in Rigid Body Simulations");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_shape_update");
|
|
|
|
prop = RNA_def_property(srna, "kinematic", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_KINEMATIC);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyOb_kinematic_state_set");
|
|
RNA_def_property_ui_text(
|
|
prop, "Kinematic", "Allow rigid body to be controlled by the animation system");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_deform", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_USE_DEFORM);
|
|
RNA_def_property_ui_text(prop, "Deforming", "Rigid body deforms during simulation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Physics Parameters */
|
|
prop = RNA_def_property(srna, "mass", PROP_FLOAT, PROP_UNIT_MASS);
|
|
RNA_def_property_float_sdna(prop, NULL, "mass");
|
|
RNA_def_property_range(prop, 0.001f, FLT_MAX); /* range must always be positive (and non-zero) */
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_mass_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Mass", "How much the object 'weighs' irrespective of gravity");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Dynamics Parameters - Activation */
|
|
/* TODO: define and figure out how to implement these. */
|
|
|
|
/* Dynamics Parameters - Deactivation */
|
|
prop = RNA_def_property(srna, "use_deactivation", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_USE_DEACTIVATION);
|
|
RNA_def_property_boolean_default(prop, true);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyOb_activation_state_set");
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Enable Deactivation",
|
|
"Enable deactivation of resting rigid bodies (increases performance and stability "
|
|
"but can cause glitches)");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_start_deactivated", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_START_DEACTIVATED);
|
|
RNA_def_property_ui_text(
|
|
prop, "Start Deactivated", "Deactivate rigid body at the start of the simulation");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "deactivate_linear_velocity", PROP_FLOAT, PROP_UNIT_VELOCITY);
|
|
RNA_def_property_float_sdna(prop, NULL, "lin_sleep_thresh");
|
|
RNA_def_property_range(
|
|
prop, FLT_MIN, FLT_MAX); /* range must always be positive (and non-zero) */
|
|
RNA_def_property_float_default(prop, 0.4f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_linear_sleepThresh_set", NULL);
|
|
RNA_def_property_ui_text(prop,
|
|
"Linear Velocity Deactivation Threshold",
|
|
"Linear Velocity below which simulation stops simulating object");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "deactivate_angular_velocity", PROP_FLOAT, PROP_UNIT_VELOCITY);
|
|
RNA_def_property_float_sdna(prop, NULL, "ang_sleep_thresh");
|
|
RNA_def_property_range(
|
|
prop, FLT_MIN, FLT_MAX); /* range must always be positive (and non-zero) */
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_angular_sleepThresh_set", NULL);
|
|
RNA_def_property_ui_text(prop,
|
|
"Angular Velocity Deactivation Threshold",
|
|
"Angular Velocity below which simulation stops simulating object");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Dynamics Parameters - Damping Parameters */
|
|
prop = RNA_def_property(srna, "linear_damping", PROP_FLOAT, PROP_FACTOR);
|
|
RNA_def_property_float_sdna(prop, NULL, "lin_damping");
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
|
RNA_def_property_float_default(prop, 0.04f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_linear_damping_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop, "Linear Damping", "Amount of linear velocity that is lost over time");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "angular_damping", PROP_FLOAT, PROP_FACTOR);
|
|
RNA_def_property_float_sdna(prop, NULL, "ang_damping");
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
|
RNA_def_property_float_default(prop, 0.1f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_angular_damping_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop, "Angular Damping", "Amount of angular velocity that is lost over time");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Collision Parameters - Surface Parameters */
|
|
prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_FACTOR);
|
|
RNA_def_property_float_sdna(prop, NULL, "friction");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_friction_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Friction", "Resistance of object to movement");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "restitution", PROP_FLOAT, PROP_FACTOR);
|
|
RNA_def_property_float_sdna(prop, NULL, "restitution");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 0.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_restitution_set", NULL);
|
|
RNA_def_property_ui_text(prop,
|
|
"Restitution",
|
|
"Tendency of object to bounce after colliding with another "
|
|
"(0 = stays still, 1 = perfectly elastic)");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Collision Parameters - Sensitivity */
|
|
prop = RNA_def_property(srna, "use_margin", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBO_FLAG_USE_MARGIN);
|
|
RNA_def_property_boolean_default(prop, false);
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Collision Margin",
|
|
"Use custom collision margin (some shapes will have a visible gap around them)");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_shape_reset");
|
|
|
|
prop = RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "margin");
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
|
RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01, 3);
|
|
RNA_def_property_float_default(prop, 0.04f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_collision_margin_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Collision Margin",
|
|
"Threshold of distance near surface where collisions are still considered "
|
|
"(best results when non-zero)");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_shape_reset");
|
|
|
|
prop = RNA_def_property(srna, "collision_collections", PROP_BOOLEAN, PROP_LAYER_MEMBER);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "col_groups", 1);
|
|
RNA_def_property_array(prop, 20);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyOb_collision_collections_set");
|
|
RNA_def_property_ui_text(
|
|
prop, "Collision Collections", "Collision collections rigid body belongs to");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
|
|
}
|
|
|
|
static void rna_def_rigidbody_constraint(BlenderRNA *brna)
|
|
{
|
|
StructRNA *srna;
|
|
PropertyRNA *prop;
|
|
|
|
srna = RNA_def_struct(brna, "RigidBodyConstraint", NULL);
|
|
RNA_def_struct_sdna(srna, "RigidBodyCon");
|
|
RNA_def_struct_ui_text(srna,
|
|
"Rigid Body Constraint",
|
|
"Constraint influencing Objects inside Rigid Body Simulation");
|
|
RNA_def_struct_path_func(srna, "rna_RigidBodyCon_path");
|
|
|
|
/* Enums */
|
|
prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
|
|
RNA_def_property_enum_sdna(prop, NULL, "type");
|
|
RNA_def_property_enum_items(prop, rna_enum_rigidbody_constraint_type_items);
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_RigidBodyCon_type_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Type", "Type of Rigid Body Constraint");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_type", PROP_ENUM, PROP_NONE);
|
|
RNA_def_property_enum_sdna(prop, NULL, "spring_type");
|
|
RNA_def_property_enum_items(prop, rna_enum_rigidbody_constraint_spring_type_items);
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_RigidBodyCon_spring_type_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Spring Type", "Which implementation of spring to use");
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_ENABLED);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_enabled_set");
|
|
RNA_def_property_ui_text(prop, "Enabled", "Enable this constraint");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "disable_collisions", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_DISABLE_COLLISIONS);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_disable_collisions_set");
|
|
RNA_def_property_ui_text(
|
|
prop, "Disable Collisions", "Disable collisions between constrained rigid bodies");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "object1", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_pointer_sdna(prop, NULL, "ob1");
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
|
RNA_def_property_ui_text(prop, "Object 1", "First Rigid Body Object to be constrained");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "object2", PROP_POINTER, PROP_NONE);
|
|
RNA_def_property_pointer_sdna(prop, NULL, "ob2");
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
|
RNA_def_property_ui_text(prop, "Object 2", "Second Rigid Body Object to be constrained");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Breaking Threshold */
|
|
prop = RNA_def_property(srna, "use_breaking", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_BREAKING);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_use_breaking_set");
|
|
RNA_def_property_ui_text(
|
|
prop, "Breakable", "Constraint can be broken if it receives an impulse above the threshold");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "breaking_threshold", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "breaking_threshold");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 1000.0f, 100.0, 2);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_breaking_threshold_set", NULL);
|
|
RNA_def_property_ui_text(prop,
|
|
"Breaking Threshold",
|
|
"Impulse threshold that must be reached for the constraint to break");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
/* Solver Iterations */
|
|
prop = RNA_def_property(srna, "use_override_solver_iterations", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_override_solver_iterations_set");
|
|
RNA_def_property_ui_text(prop,
|
|
"Override Solver Iterations",
|
|
"Override the number of solver iterations for this constraint");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "solver_iterations", PROP_INT, PROP_NONE);
|
|
RNA_def_property_int_sdna(prop, NULL, "num_solver_iterations");
|
|
RNA_def_property_range(prop, 1, 1000);
|
|
RNA_def_property_ui_range(prop, 1, 100, 1, -1);
|
|
RNA_def_property_int_default(prop, 10);
|
|
RNA_def_property_int_funcs(prop, NULL, "rna_RigidBodyCon_num_solver_iterations_set", NULL);
|
|
RNA_def_property_ui_text(
|
|
prop,
|
|
"Solver Iterations",
|
|
"Number of constraint solver iterations made per simulation step (higher values are more "
|
|
"accurate but slower)");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
/* Limits */
|
|
prop = RNA_def_property(srna, "use_limit_lin_x", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_LIN_X);
|
|
RNA_def_property_ui_text(prop, "X Axis", "Limit translation on X axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_limit_lin_y", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_LIN_Y);
|
|
RNA_def_property_ui_text(prop, "Y Axis", "Limit translation on Y axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_limit_lin_z", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_LIN_Z);
|
|
RNA_def_property_ui_text(prop, "Z Axis", "Limit translation on Z axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_limit_ang_x", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_ANG_X);
|
|
RNA_def_property_ui_text(prop, "X Angle", "Limit rotation around X axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_limit_ang_y", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_ANG_Y);
|
|
RNA_def_property_ui_text(prop, "Y Angle", "Limit rotation around Y axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_limit_ang_z", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_LIMIT_ANG_Z);
|
|
RNA_def_property_ui_text(prop, "Z Angle", "Limit rotation around Z axis");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_x", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_X);
|
|
RNA_def_property_ui_text(prop, "X Spring", "Enable spring on X axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_y", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_Y);
|
|
RNA_def_property_ui_text(prop, "Y Spring", "Enable spring on Y axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_z", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_Z);
|
|
RNA_def_property_ui_text(prop, "Z Spring", "Enable spring on Z axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_ang_x", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_ANG_X);
|
|
RNA_def_property_ui_text(prop, "X Angle Spring", "Enable spring on X rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_ang_y", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_ANG_Y);
|
|
RNA_def_property_ui_text(prop, "Y Angle Spring", "Enable spring on Y rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_spring_ang_z", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_SPRING_ANG_Z);
|
|
RNA_def_property_ui_text(prop, "Z Angle Spring", "Enable spring on Z rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_motor_lin", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_MOTOR_LIN);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_use_motor_lin_set");
|
|
RNA_def_property_ui_text(prop, "Linear Motor", "Enable linear motor");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "use_motor_ang", PROP_BOOLEAN, PROP_NONE);
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", RBC_FLAG_USE_MOTOR_ANG);
|
|
RNA_def_property_boolean_funcs(prop, NULL, "rna_RigidBodyCon_use_motor_ang_set");
|
|
RNA_def_property_ui_text(prop, "Angular Motor", "Enable angular motor");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_x_lower", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_x_lower");
|
|
RNA_def_property_float_default(prop, -1.0f);
|
|
RNA_def_property_ui_text(prop, "Lower X Limit", "Lower limit of X axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_x_upper", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_x_upper");
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_ui_text(prop, "Upper X Limit", "Upper limit of X axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_y_lower", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_y_lower");
|
|
RNA_def_property_float_default(prop, -1.0f);
|
|
RNA_def_property_ui_text(prop, "Lower Y Limit", "Lower limit of Y axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_y_upper", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_y_upper");
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_ui_text(prop, "Upper Y Limit", "Upper limit of Y axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_z_lower", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_z_lower");
|
|
RNA_def_property_float_default(prop, -1.0f);
|
|
RNA_def_property_ui_text(prop, "Lower Z Limit", "Lower limit of Z axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_lin_z_upper", PROP_FLOAT, PROP_UNIT_LENGTH);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_lin_z_upper");
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_ui_text(prop, "Upper Z Limit", "Upper limit of Z axis translation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_x_lower", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_x_lower");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, -M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Lower X Angle Limit", "Lower limit of X axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_x_upper", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_x_upper");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Upper X Angle Limit", "Upper limit of X axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_y_lower", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_y_lower");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, -M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Lower Y Angle Limit", "Lower limit of Y axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_y_upper", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_y_upper");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Upper Y Angle Limit", "Upper limit of Y axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_z_lower", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_z_lower");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, -M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Lower Z Angle Limit", "Lower limit of Z axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "limit_ang_z_upper", PROP_FLOAT, PROP_ANGLE);
|
|
RNA_def_property_float_sdna(prop, NULL, "limit_ang_z_upper");
|
|
RNA_def_property_range(prop, -M_PI * 2, M_PI * 2);
|
|
RNA_def_property_float_default(prop, M_PI_4);
|
|
RNA_def_property_ui_text(prop, "Upper Z Angle Limit", "Upper limit of Z axis rotation");
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_x", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_x");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_x_set", NULL);
|
|
RNA_def_property_ui_text(prop, "X Axis Stiffness", "Stiffness on the X axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_y", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_y");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_y_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Y Axis Stiffness", "Stiffness on the Y axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_z", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_z");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_z_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Z Axis Stiffness", "Stiffness on the Z axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_ang_x", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_ang_x");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_ang_x_set", NULL);
|
|
RNA_def_property_ui_text(prop, "X Angle Stiffness", "Stiffness on the X rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_ang_y", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_ang_y");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_ang_y_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Y Angle Stiffness", "Stiffness on the Y rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_stiffness_ang_z", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_stiffness_ang_z");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 10.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_stiffness_ang_z_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Z Angle Stiffness", "Stiffness on the Z rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_x", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_x");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_x_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping X", "Damping on the X axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_y", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_y");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_y_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping Y", "Damping on the Y axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_z", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_z");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_z_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping Z", "Damping on the Z axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_ang_x", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_ang_x");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_ang_x_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping X Angle", "Damping on the X rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_ang_y", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_ang_y");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_ang_y_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping Y Angle", "Damping on the Y rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "spring_damping_ang_z", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "spring_damping_ang_z");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_float_default(prop, 0.5f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_spring_damping_ang_z_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Damping Z Angle", "Damping on the Z rotational axis");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "motor_lin_target_velocity", PROP_FLOAT, PROP_UNIT_VELOCITY);
|
|
RNA_def_property_float_sdna(prop, NULL, "motor_lin_target_velocity");
|
|
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, -100.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_motor_lin_target_velocity_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Target Velocity", "Target linear motor velocity");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "motor_lin_max_impulse", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "motor_lin_max_impulse");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_motor_lin_max_impulse_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Max Impulse", "Maximum linear motor impulse");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "motor_ang_target_velocity", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "motor_ang_target_velocity");
|
|
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, -100.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_motor_ang_target_velocity_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Target Velocity", "Target angular motor velocity");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
|
|
prop = RNA_def_property(srna, "motor_ang_max_impulse", PROP_FLOAT, PROP_NONE);
|
|
RNA_def_property_float_sdna(prop, NULL, "motor_ang_max_impulse");
|
|
RNA_def_property_range(prop, 0.0f, FLT_MAX);
|
|
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
|
|
RNA_def_property_float_default(prop, 1.0f);
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyCon_motor_ang_max_impulse_set", NULL);
|
|
RNA_def_property_ui_text(prop, "Max Impulse", "Maximum angular motor impulse");
|
|
RNA_def_property_update(prop, NC_OBJECT, "rna_RigidBodyOb_reset");
|
|
}
|
|
|
|
void RNA_def_rigidbody(BlenderRNA *brna)
|
|
{
|
|
rna_def_rigidbody_world(brna);
|
|
rna_def_rigidbody_object(brna);
|
|
rna_def_rigidbody_constraint(brna);
|
|
}
|
|
|
|
#endif
|