Files
test2/source/blender/modifiers/intern/MOD_shapekey.c

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

144 lines
3.8 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2005 Blender Foundation. All rights reserved. */
/** \file
* \ingroup modifiers
*/
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLT_translation.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "BKE_key.h"
#include "BKE_particle.h"
#include "RNA_access.h"
#include "RNA_prototypes.h"
#include "MOD_modifiertypes.h"
#include "UI_resources.h"
2018-05-12 08:21:07 +02:00
static void deformVerts(ModifierData *UNUSED(md),
const ModifierEvalContext *ctx,
Mesh *UNUSED(mesh),
2018-05-12 08:04:56 +02:00
float (*vertexCos)[3],
int verts_num)
{
Key *key = BKE_key_from_object(ctx->object);
if (key && key->block.first) {
int deformedVerts_tot;
BKE_key_evaluate_object_ex(
ctx->object, &deformedVerts_tot, (float *)vertexCos, sizeof(*vertexCos) * verts_num, NULL);
}
}
2018-05-12 08:04:56 +02:00
static void deformMatrices(ModifierData *md,
const ModifierEvalContext *ctx,
Mesh *mesh,
2018-05-12 08:04:56 +02:00
float (*vertexCos)[3],
float (*defMats)[3][3],
int verts_num)
{
Key *key = BKE_key_from_object(ctx->object);
KeyBlock *kb = BKE_keyblock_from_object(ctx->object);
(void)vertexCos; /* unused */
if (kb && kb->totelem == verts_num && kb != key->refkey) {
2022-08-26 12:51:46 +10:00
float scale[3][3];
int a;
if (ctx->object->shapeflag & OB_SHAPE_LOCK) {
scale_m3_fl(scale, 1);
}
else {
scale_m3_fl(scale, kb->curval);
}
for (a = 0; a < verts_num; a++) {
copy_m3_m3(defMats[a], scale);
}
}
deformVerts(md, ctx, mesh, vertexCos, verts_num);
}
2018-05-12 08:04:56 +02:00
static void deformVertsEM(ModifierData *md,
2018-05-12 08:21:07 +02:00
const ModifierEvalContext *ctx,
2018-05-12 08:04:56 +02:00
struct BMEditMesh *UNUSED(editData),
Mesh *mesh,
2018-05-12 08:04:56 +02:00
float (*vertexCos)[3],
int verts_num)
{
Key *key = BKE_key_from_object(ctx->object);
if (key && key->type == KEY_RELATIVE) {
deformVerts(md, ctx, mesh, vertexCos, verts_num);
}
}
2018-05-12 08:04:56 +02:00
static void deformMatricesEM(ModifierData *UNUSED(md),
2018-05-12 08:21:07 +02:00
const ModifierEvalContext *ctx,
2018-05-12 08:04:56 +02:00
struct BMEditMesh *UNUSED(editData),
Mesh *UNUSED(mesh),
2018-05-12 08:04:56 +02:00
float (*vertexCos)[3],
float (*defMats)[3][3],
int verts_num)
{
Key *key = BKE_key_from_object(ctx->object);
KeyBlock *kb = BKE_keyblock_from_object(ctx->object);
(void)vertexCos; /* unused */
if (kb && kb->totelem == verts_num && kb != key->refkey) {
2022-08-26 12:51:46 +10:00
float scale[3][3];
scale_m3_fl(scale, kb->curval);
2022-08-26 12:51:46 +10:00
for (int a = 0; a < verts_num; a++) {
copy_m3_m3(defMats[a], scale);
}
}
}
ModifierTypeInfo modifierType_ShapeKey = {
/*name*/ N_("ShapeKey"),
/*structName*/ "ShapeKeyModifierData",
/*structSize*/ sizeof(ShapeKeyModifierData),
/*srna*/ &RNA_Modifier,
/*type*/ eModifierTypeType_OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_AcceptsVertexCosOnly |
2012-05-06 13:38:33 +00:00
eModifierTypeFlag_SupportsEditmode,
/*icon*/ ICON_DOT,
/*copyData*/ NULL,
/*deformVerts*/ deformVerts,
/*deformMatrices*/ deformMatrices,
/*deformVertsEM*/ deformVertsEM,
/*deformMatricesEM*/ deformMatricesEM,
/*modifyMesh*/ NULL,
/*modifyGeometrySet*/ NULL,
/*initData*/ NULL,
/*requiredDataMask*/ NULL,
/*freeData*/ NULL,
/*isDisabled*/ NULL,
/*updateDepsgraph*/ NULL,
/*dependsOnTime*/ NULL,
/*dependsOnNormals*/ NULL,
/*foreachIDLink*/ NULL,
/*foreachTexLink*/ NULL,
/*freeRuntimeData*/ NULL,
/*panelRegister*/ NULL,
/*blendWrite*/ NULL,
/*blendRead*/ NULL,
};